summaryrefslogtreecommitdiff
path: root/src/scripts
diff options
context:
space:
mode:
authorSung Yoon Whang <suwhang@microsoft.com>2019-06-20 16:33:51 -0700
committerGitHub <noreply@github.com>2019-06-20 16:33:51 -0700
commit9bd2787a9dd2aa4d2b7d4f72afebc3dbe896e896 (patch)
tree712b8829d3aa9d9d9ac936c8f4b914503bdcdae7 /src/scripts
parent05a557349f6c60f014f708282762168a8ba093e0 (diff)
downloadcoreclr-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.py137
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: