Skip to content

Commit e08e19b

Browse files
committed
WIP
1 parent 515a339 commit e08e19b

File tree

1 file changed

+111
-77
lines changed

1 file changed

+111
-77
lines changed

src/coreclr/scripts/genUserEvents.py

+111-77
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ def generateMethodSignatureWrite(eventName, template, extern, runtimeFlavor):
7070
sig_pieces.append("%s RelatedActivityId" % (getEventPipeDataTypeMapping(runtimeFlavor)["LPCGUID"]))
7171
sig_pieces.append(")")
7272
return ''.join(sig_pieces)
73+
7374
def formatGuid(providerGuid):
7475
providerGuid = providerGuid[1:-1]
7576
guidParts = providerGuid.split('-')
@@ -84,6 +85,30 @@ def formatGuid(providerGuid):
8485
guidParts[0] = "0x" + guidParts[0]
8586
return ", 0x".join(guidParts)
8687

88+
def generateClrUserEventWriteEventsHeader(providerNode, providerPrettyName, providerName, eventNodes, allTemplates, extern, target_cpp, runtimeFlavor, inclusionList, exclusionList):
89+
WriteEventHeader = []
90+
for eventNode in eventNodes:
91+
eventName = eventNode.getAttribute('symbol')
92+
templateName = eventNode.getAttribute('template')
93+
eventLevel = eventNode.getAttribute('level')
94+
eventKeywords = eventNode.getAttribute('keywords')
95+
eventKeywordsMask = generateEventKeywords(eventKeywords)
96+
97+
98+
if not includeEvent(inclusionList, providerName, eventName):
99+
continue
100+
101+
eventIsEnabledFunc = "TraceLoggingProviderEnabled"
102+
103+
# generate UserEventEnabled function
104+
eventEnabledSig = generateMethodSignatureEnabled(eventName, runtimeFlavor, providerName, eventLevel, eventKeywords) + ";\n\n"
105+
WriteEventHeader.append(eventEnabledSig)
106+
107+
eventWriteSig = eventWritegenerateMethodSignatureWrite(eventName, template, extern, runtimeFlavor) + ";\n\n"
108+
WriteEventHeader.append(eventWriteSig)
109+
110+
return ''.join(WriteEventHeader)
111+
87112
def generateClrUserEventWriteEventsImpl(providerNode, providerPrettyName, providerName, eventNodes, allTemplates, extern, target_cpp, runtimeFlavor, inclusionList, exclusionList):
88113
WriteEventImpl = []
89114
# User Event Provider Declaration
@@ -211,56 +236,52 @@ def getAotUserEventHelperFileImplPrefix():
211236
def getAotUserEventHelperFileImplSuffix():
212237
return ""
213238

214-
def generateUserEventHelperFile(etwmanifest, userevent_directory, target_cpp, runtimeFlavor, extern, dryRun):
239+
def generateUserEventHelperFile(etwmanifest, userevent_directory, target_cpp, runtimeFlavor, extern):
215240
usereventhelpersPath = os.path.join(userevent_directory, "usereventhelpers" + (".cpp" if target_cpp else ".c"))
216-
if dryRun:
217-
print(usereventhelpersPath)
218-
else:
219-
with open_for_update(usereventhelpersPath) as helper:
220-
helper.write(stdprolog_cpp)
221-
if runtimeFlavor.coreclr:
222-
helper.write(getCoreCLRUserEventHelperFileImplPrefix())
223-
elif runtimeFlavor.mono:
224-
helper.write(getMonoUserEventHelperFileImplPrefix())
225-
elif runtimeFlavor.nativeaot:
226-
helper.write(getAotUserEventHelperFileImplPrefix())
227-
228-
tree = DOM.parse(etwmanifest)
229-
230-
for providerNode in tree.getElementsByTagName('provider'):
231-
providerName = providerNode.getAttribute('name')
232-
if includeProvider(providerName, runtimeFlavor):
233-
providerPrettyName = providerName.replace("Windows-", '')
234-
providerPrettyName = providerPrettyName.replace("Microsoft-", '')
235-
providerPrettyName = providerPrettyName.replace('-', '_')
236-
if extern: helper.write(
237-
'extern "C" '
238-
)
239-
helper.write(
240-
"void Init" +
241-
providerPrettyName +
242-
"(void);\n\n")
243-
244-
if extern: helper.write(
245-
'extern "C" '
246-
)
247-
helper.write("void InitProvidersAndEvents(void);\n\n")
248-
helper.write("void InitProvidersAndEvents(void)\n{\n")
249-
for providerNode in tree.getElementsByTagName('provider'):
250-
providerName = providerNode.getAttribute('name')
251-
if includeProvider(providerName, runtimeFlavor):
252-
providerPrettyName = providerName.replace("Windows-", '')
253-
providerPrettyName = providerPrettyName.replace("Microsoft-", '')
254-
providerPrettyName = providerPrettyName.replace('-', '_')
255-
helper.write(" Init" + providerPrettyName + "();\n")
256-
helper.write("}\n")
257-
258-
if (runtimeFlavor.coreclr or runtimeFlavor.nativeaot):
259-
helper.write(getCoreCLRUserEventHelperFileImplSuffix())
260-
elif runtimeFlavor.mono:
261-
helper.write(getMonoUserEventHelperFileImplSuffix())
262-
263-
helper.close()
241+
with open_for_update(usereventhelpersPath) as helper:
242+
helper.write(stdprolog_cpp)
243+
if runtimeFlavor.coreclr:
244+
helper.write(getCoreCLRUserEventHelperFileImplPrefix())
245+
elif runtimeFlavor.mono:
246+
helper.write(getMonoUserEventHelperFileImplPrefix())
247+
elif runtimeFlavor.nativeaot:
248+
helper.write(getAotUserEventHelperFileImplPrefix())
249+
250+
tree = DOM.parse(etwmanifest)
251+
252+
for providerNode in tree.getElementsByTagName('provider'):
253+
providerName = providerNode.getAttribute('name')
254+
if includeProvider(providerName, runtimeFlavor):
255+
providerPrettyName = providerName.replace("Windows-", '')
256+
providerPrettyName = providerPrettyName.replace("Microsoft-", '')
257+
providerPrettyName = providerPrettyName.replace('-', '_')
258+
if extern: helper.write(
259+
'extern "C" '
260+
)
261+
helper.write(
262+
"void Init" +
263+
providerPrettyName +
264+
"(void);\n\n")
265+
266+
if extern: helper.write(
267+
'extern "C" '
268+
)
269+
helper.write("void InitProvidersAndEvents(void);\n\n")
270+
helper.write("void InitProvidersAndEvents(void)\n{\n")
271+
for providerNode in tree.getElementsByTagName('provider'):
272+
providerName = providerNode.getAttribute('name')
273+
if includeProvider(providerName, runtimeFlavor):
274+
providerPrettyName = providerName.replace("Windows-", '')
275+
providerPrettyName = providerPrettyName.replace("Microsoft-", '')
276+
providerPrettyName = providerPrettyName.replace('-', '_')
277+
helper.write(" Init" + providerPrettyName + "();\n")
278+
helper.write("}\n")
279+
280+
if (runtimeFlavor.coreclr or runtimeFlavor.nativeaot):
281+
helper.write(getCoreCLRUserEventHelperFileImplSuffix())
282+
elif runtimeFlavor.mono:
283+
helper.write(getMonoUserEventHelperFileImplSuffix())
284+
264285
def getCoreCLRUserEventImplFilePrefix():
265286
return """#include "common.h" //FIXME<>
266287
#include <stdint.h>
@@ -283,7 +304,7 @@ def getAotUserEventImplFileSuffix():
283304
return ""
284305

285306
def generateUserEventImplFiles(
286-
etwmanifest, userevent_directory, extern, target_cpp, runtimeFlavor, inclusionList, exclusionList, dryRun):
307+
etwmanifest, userevent_directory, extern, target_cpp, runtimeFlavor, inclusionList, exclusionList):
287308
tree = DOM.parse(etwmanifest)
288309

289310
# Find the src directory starting with the assumption that
@@ -296,29 +317,32 @@ def generateUserEventImplFiles(
296317
if os.path.basename(src_dirname) == "":
297318
raise IOError("Could not find the Core CLR 'src' directory")
298319

299-
for providerNode in tree.getElementsByTagName('provider'):
300-
providerName = providerNode.getAttribute('name')
301-
if not includeProvider(providerName, runtimeFlavor):
302-
continue
320+
commonHeaderFile = os.path.join(userevent_directory, "user_events_providers.h")
321+
with open_for_update(commonHeaderFile) as commonheader:
322+
for providerNode in tree.getElementsByTagName('provider'):
323+
providerName = providerNode.getAttribute('name')
324+
if not includeProvider(providerName, runtimeFlavor):
325+
continue
303326

304-
providerPrettyName = providerName.replace("Windows-", '')
305-
providerPrettyName = providerPrettyName.replace("Microsoft-", '')
327+
providerPrettyName = providerName.replace("Windows-", '')
328+
providerPrettyName = providerPrettyName.replace("Microsoft-", '')
306329

307-
providerName_File = providerPrettyName.replace('-', '')
308-
if target_cpp:
309-
providerName_File = providerName_File + ".cpp"
310-
else:
311-
providerName_File = providerName_File + ".c"
330+
providerName_File = providerPrettyName.replace('-', '')
331+
providerName_Header = providerName_File + ".h"
332+
commonheader.write("#include \"%s\"" % (providerName_Header))
312333

313-
providerName_File = providerName_File.lower()
334+
if target_cpp:
335+
providerName_File = providerName_File + ".cpp"
336+
else:
337+
providerName_File = providerName_File + ".c"
314338

315-
usereventfile = os.path.join(userevent_directory, providerName_File)
339+
providerName_File = providerName_File.lower()
340+
providerName_Header = providerName_Header.lower()
316341

317-
providerPrettyName = providerPrettyName.replace('-', '_')
342+
usereventfile = os.path.join(userevent_directory, providerName_File)
343+
344+
providerPrettyName = providerPrettyName.replace('-', '_')
318345

319-
if dryRun:
320-
print(usereventfile)
321-
else:
322346
with open_for_update(usereventfile) as usereventImpl:
323347
usereventImpl.write(stdprolog_cpp)
324348
header = ""
@@ -354,8 +378,23 @@ def generateUserEventImplFiles(
354378
elif runtimeFlavor.nativeaot and providerName=="Microsoft-Windows-DotNETRuntime":
355379
usereventImpl.write(getAotUserEventImplFileSuffix())
356380

381+
usereventHeaderFile = os.path.join(userevent_directory, providerName_Header)
382+
with open_for_update(usereventHeaderFile) as usereventheader:
383+
usereventheader.write(
384+
generateClrUserEventWriteEventsHeader(
385+
providerNode,
386+
providerPrettyName,
387+
providerName,
388+
eventNodes,
389+
allTemplates,
390+
extern,
391+
target_cpp,
392+
runtimeFlavor,
393+
inclusionList,
394+
exclusionList) + "\n")
395+
357396
def generateUserEventFiles(
358-
etwmanifest, intermediate, extern, target_cpp, runtimeFlavor, inclusionList, exclusionList, dryRun):
397+
etwmanifest, intermediate, extern, target_cpp, runtimeFlavor, inclusionList, exclusionList):
359398
if runtimeFlavor.nativeaot or runtimeFlavor.mono:
360399
raise Exception("genUserEvents.py only supports coreclr currently.")
361400

@@ -366,7 +405,7 @@ def generateUserEventFiles(
366405
os.makedirs(userevent_directory)
367406

368407
# generate helper file
369-
generateUserEventHelperFile(etwmanifest, userevent_directory, target_cpp, runtimeFlavor, extern, dryRun)
408+
generateUserEventHelperFile(etwmanifest, userevent_directory, target_cpp, runtimeFlavor, extern)
370409

371410
# generate all keywords
372411
for keywordNode in tree.getElementsByTagName('keyword'):
@@ -382,15 +421,13 @@ def generateUserEventFiles(
382421
target_cpp,
383422
runtimeFlavor,
384423
inclusionList,
385-
exclusionList,
386-
dryRun
424+
exclusionList
387425
)
388426

389427
import argparse
390428
import sys
391429

392430
def main(argv):
393-
394431
# parse the command line
395432
parser = argparse.ArgumentParser(
396433
description="Generates the Code required to instrument userevent logging mechanism")
@@ -408,8 +445,6 @@ def main(argv):
408445
help='runtime flavor')
409446
required.add_argument('--nonextern', action='store_true',
410447
help='if specified, will generate files to be compiled into the CLR rather than extern' )
411-
required.add_argument('--dry-run', action='store_true',
412-
help='if specified, will output the names of the generated files instead of generating the files' )
413448
args, unknown = parser.parse_known_args(argv)
414449
if unknown:
415450
print('Unknown argument(s): ', ', '.join(unknown))
@@ -421,8 +456,7 @@ def main(argv):
421456
intermediate = args.intermediate
422457
runtimeFlavor = RuntimeFlavor(args.runtimeflavor)
423458
extern = not args.nonextern
424-
dryRun = args.dry_run
425-
459+
426460
target_cpp = True
427461
if runtimeFlavor.mono:
428462
extern = False
@@ -431,7 +465,7 @@ def main(argv):
431465
inclusion_list = parseInclusionList(inclusion_filename)
432466
exclusion_list = parseExclusionList(exclusion_filename)
433467

434-
generateUserEventFiles(sClrEtwAllMan, intermediate, extern, target_cpp, runtimeFlavor, inclusion_list, exclusion_list, dryRun)
468+
generateUserEventFiles(sClrEtwAllMan, intermediate, extern, target_cpp, runtimeFlavor, inclusion_list, exclusion_list)
435469

436470
if __name__ == '__main__':
437471
return_code = main(sys.argv[1:])

0 commit comments

Comments
 (0)