diff options
author | Sung Yoon Whang <suwhang@microsoft.com> | 2019-06-20 16:33:51 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-06-20 16:33:51 -0700 |
commit | 9bd2787a9dd2aa4d2b7d4f72afebc3dbe896e896 (patch) | |
tree | 712b8829d3aa9d9d9ac936c8f4b914503bdcdae7 /src/scripts | |
parent | 05a557349f6c60f014f708282762168a8ba093e0 (diff) | |
download | coreclr-9bd2787a9dd2aa4d2b7d4f72afebc3dbe896e896.tar.gz coreclr-9bd2787a9dd2aa4d2b7d4f72afebc3dbe896e896.tar.bz2 coreclr-9bd2787a9dd2aa4d2b7d4f72afebc3dbe896e896.zip |
Fix eventpipe filtering (#25221)
* Add DOTNET_TRACE_CONTEXT and change macros to use DOTNET_TRACE_CONTEXT instead of MCGEN_TRACE_CONTEXT
* Fixing macro definitions
* eventing codegen scripts now generates EventPipe trace contexts
* Fix macros to use the EVENTPIPE_TRACE_Context
* Fix linux build
* Fix windows build
* Update Eventpipe provider context at EtwCallbackComon
* break in switch
* Update rundown provider context manually
* PR feedback
* Eventpipe->EventPipe
* cleanup in codegen script
Diffstat (limited to 'src/scripts')
-rw-r--r-- | src/scripts/genEventing.py | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/src/scripts/genEventing.py b/src/scripts/genEventing.py index f3c9ad1ce9..83109a5341 100644 --- a/src/scripts/genEventing.py +++ b/src/scripts/genEventing.py @@ -502,6 +502,30 @@ def generateEtmDummyHeader(sClrEtwAllMan,clretwdummy): #pal: create etmdummy.h Clretwdummy.write(generateclrEtwDummy(eventNodes, allTemplates) + "\n") +def convertToLevelId(level): + if level == "win:LogAlways": + return 0 + if level == "win:Critical": + return 1 + if level == "win:Error": + return 2 + if level == "win:Warning": + return 3 + if level == "win:Informational": + return 4 + if level == "win:Verbose": + return 5 + raise Exception("unknown level " + level) + +def getKeywordsMaskCombined(keywords, keywordsToMask): + mask = 0 + for keyword in keywords.split(" "): + if keyword == "": + continue + mask |= keywordsToMask[keyword] + + return mask + def generatePlatformIndependentFiles(sClrEtwAllMan, incDir, etmDummyFile, extern, write_xplatheader): generateEtmDummyHeader(sClrEtwAllMan,etmDummyFile) @@ -513,8 +537,63 @@ def generatePlatformIndependentFiles(sClrEtwAllMan, incDir, etmDummyFile, extern if not os.path.exists(incDir): os.makedirs(incDir) + eventpipe_trace_context_typedef = """ +#if !defined(EVENTPIPE_TRACE_CONTEXT_DEF) +#define EVENTPIPE_TRACE_CONTEXT_DEF +typedef struct _EVENTPIPE_TRACE_CONTEXT +{ + WCHAR const * Name; + UCHAR Level; + bool IsEnabled; + ULONGLONG EnabledKeywordsBitmask; +} EVENTPIPE_TRACE_CONTEXT, *PEVENTPIPE_TRACE_CONTEXT; +#endif // EVENTPIPE_TRACE_CONTEXT_DEF +""" + + dotnet_trace_context_typedef_windows = """ +#if !defined(DOTNET_TRACE_CONTEXT_DEF) +#define DOTNET_TRACE_CONTEXT_DEF +typedef struct _DOTNET_TRACE_CONTEXT +{ + MCGEN_TRACE_CONTEXT EtwProvider; + EVENTPIPE_TRACE_CONTEXT EventPipeProvider; +} DOTNET_TRACE_CONTEXT, *PDOTNET_TRACE_CONTEXT; +#endif // DOTNET_TRACE_CONTEXT_DEF +""" + + dotnet_trace_context_typedef_unix = """ +#if !defined(DOTNET_TRACE_CONTEXT_DEF) +#define DOTNET_TRACE_CONTEXT_DEF +typedef struct _DOTNET_TRACE_CONTEXT +{ + EVENTPIPE_TRACE_CONTEXT EventPipeProvider; +} DOTNET_TRACE_CONTEXT, *PDOTNET_TRACE_CONTEXT; +#endif // DOTNET_TRACE_CONTEXT_DEF +""" + + trace_context_instdef_windows = """ +EXTERN_C __declspec(selectany) DOTNET_TRACE_CONTEXT MICROSOFT_WINDOWS_DOTNETRUNTIME_PROVIDER_DOTNET_Context = { MICROSOFT_WINDOWS_DOTNETRUNTIME_PROVIDER_Context, MICROSOFT_WINDOWS_DOTNETRUNTIME_PROVIDER_EVENTPIPE_Context }; + +EXTERN_C __declspec(selectany) DOTNET_TRACE_CONTEXT MICROSOFT_WINDOWS_DOTNETRUNTIME_PRIVATE_PROVIDER_DOTNET_Context = { MICROSOFT_WINDOWS_DOTNETRUNTIME_PRIVATE_PROVIDER_Context, MICROSOFT_WINDOWS_DOTNETRUNTIME_PRIVATE_PROVIDER_EVENTPIPE_Context }; + +EXTERN_C __declspec(selectany) DOTNET_TRACE_CONTEXT MICROSOFT_WINDOWS_DOTNETRUNTIME_RUNDOWN_PROVIDER_DOTNET_Context = { MICROSOFT_WINDOWS_DOTNETRUNTIME_RUNDOWN_PROVIDER_Context, MICROSOFT_WINDOWS_DOTNETRUNTIME_RUNDOWN_PROVIDER_EVENTPIPE_Context }; + +EXTERN_C __declspec(selectany) DOTNET_TRACE_CONTEXT MICROSOFT_WINDOWS_DOTNETRUNTIME_STRESS_PROVIDER_DOTNET_Context = { MICROSOFT_WINDOWS_DOTNETRUNTIME_STRESS_PROVIDER_Context, MICROSOFT_WINDOWS_DOTNETRUNTIME_STRESS_PROVIDER_EVENTPIPE_Context }; +""" + + trace_context_instdef_unix = """ +EXTERN_C __declspec(selectany) DOTNET_TRACE_CONTEXT MICROSOFT_WINDOWS_DOTNETRUNTIME_PROVIDER_DOTNET_Context = { MICROSOFT_WINDOWS_DOTNETRUNTIME_PROVIDER_EVENTPIPE_Context }; + +EXTERN_C __declspec(selectany) DOTNET_TRACE_CONTEXT MICROSOFT_WINDOWS_DOTNETRUNTIME_PRIVATE_PROVIDER_DOTNET_Context = { MICROSOFT_WINDOWS_DOTNETRUNTIME_PRIVATE_PROVIDER_EVENTPIPE_Context }; + +EXTERN_C __declspec(selectany) DOTNET_TRACE_CONTEXT MICROSOFT_WINDOWS_DOTNETRUNTIME_RUNDOWN_PROVIDER_DOTNET_Context = { MICROSOFT_WINDOWS_DOTNETRUNTIME_RUNDOWN_PROVIDER_EVENTPIPE_Context }; + +EXTERN_C __declspec(selectany) DOTNET_TRACE_CONTEXT MICROSOFT_WINDOWS_DOTNETRUNTIME_STRESS_PROVIDER_DOTNET_Context = { MICROSOFT_WINDOWS_DOTNETRUNTIME_STRESS_PROVIDER_EVENTPIPE_Context }; +""" + # Write the main header for FireETW* functions clrallevents = os.path.join(incDir, "clretwallmain.h") + is_windows = os.name == 'nt' with open_for_update(clrallevents) as Clrallevents: Clrallevents.write(stdprolog) Clrallevents.write(""" @@ -522,6 +601,14 @@ def generatePlatformIndependentFiles(sClrEtwAllMan, incDir, etmDummyFile, extern #include "clreventpipewriteevents.h" """) + Clrallevents.write(eventpipe_trace_context_typedef) # define EVENTPIPE_TRACE_CONTEXT + + # define DOTNET_TRACE_CONTEXT depending on the platform + if is_windows: + Clrallevents.write(dotnet_trace_context_typedef_windows) + else: + Clrallevents.write(dotnet_trace_context_typedef_unix) + for providerNode in tree.getElementsByTagName('provider'): templateNodes = providerNode.getElementsByTagName('template') allTemplates = parseTemplateNodes(templateNodes) @@ -530,6 +617,56 @@ def generatePlatformIndependentFiles(sClrEtwAllMan, incDir, etmDummyFile, extern #vm header: Clrallevents.write(generateClrallEvents(eventNodes, allTemplates) + "\n") + providerName = providerNode.getAttribute('name') + providerSymbol = providerNode.getAttribute('symbol') + + eventpipeProviderCtxName = providerSymbol + "_EVENTPIPE_Context" + Clrallevents.write('EXTERN_C __declspec(selectany) EVENTPIPE_TRACE_CONTEXT ' + eventpipeProviderCtxName + ' = { W("' + providerName + '"), 0, false, 0 };\n') + + # define and initialize runtime providers' DOTNET_TRACE_CONTEXT depending on the platform + if is_windows: + Clrallevents.write(trace_context_instdef_windows) + else: + Clrallevents.write(trace_context_instdef_unix) + + if write_xplatheader: + clrproviders = os.path.join(incDir, "clrproviders.h") + with open_for_update(clrproviders) as Clrproviders: + Clrproviders.write(""" + typedef struct _EVENT_DESCRIPTOR + { + int const Level; + ULONGLONG const Keyword; + } EVENT_DESCRIPTOR; + """) + allProviders = [] + for providerNode in tree.getElementsByTagName('provider'): + keywords = [] + keywordsToMask = {} + providerName = str(providerNode.getAttribute('name')) + providerSymbol = str(providerNode.getAttribute('symbol')) + nbKeywords = 0 + + Clrproviders.write("// Keywords\n"); + for keywordNode in providerNode.getElementsByTagName('keyword'): + keywordName = keywordNode.getAttribute('name') + keywordMask = keywordNode.getAttribute('mask') + keywordSymbol = keywordNode.getAttribute('symbol') + Clrproviders.write("#define " + keywordSymbol + " " + keywordMask + "\n") + + keywords.append("{ \"" + keywordName + "\", " + keywordMask + " }") + keywordsToMask[keywordName] = int(keywordMask, 16) + nbKeywords += 1 + + for eventNode in providerNode.getElementsByTagName('event'): + levelName = eventNode.getAttribute('level') + symbolName = eventNode.getAttribute('symbol') + keywords = eventNode.getAttribute('keywords') + level = convertToLevelId(levelName) + Clrproviders.write("EXTERN_C __declspec(selectany) EVENT_DESCRIPTOR const " + symbolName + " = { " + str(level) + ", " + hex(getKeywordsMaskCombined(keywords, keywordsToMask)) + " };\n") + + allProviders.append("&" + providerSymbol + "_Context") + clreventpipewriteevents = os.path.join(incDir, "clreventpipewriteevents.h") with open_for_update(clreventpipewriteevents) as Clreventpipewriteevents: |