@@ -70,6 +70,7 @@ def generateMethodSignatureWrite(eventName, template, extern, runtimeFlavor):
70
70
sig_pieces .append ("%s RelatedActivityId" % (getEventPipeDataTypeMapping (runtimeFlavor )["LPCGUID" ]))
71
71
sig_pieces .append (")" )
72
72
return '' .join (sig_pieces )
73
+
73
74
def formatGuid (providerGuid ):
74
75
providerGuid = providerGuid [1 :- 1 ]
75
76
guidParts = providerGuid .split ('-' )
@@ -84,6 +85,30 @@ def formatGuid(providerGuid):
84
85
guidParts [0 ] = "0x" + guidParts [0 ]
85
86
return ", 0x" .join (guidParts )
86
87
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
+
87
112
def generateClrUserEventWriteEventsImpl (providerNode , providerPrettyName , providerName , eventNodes , allTemplates , extern , target_cpp , runtimeFlavor , inclusionList , exclusionList ):
88
113
WriteEventImpl = []
89
114
# User Event Provider Declaration
@@ -211,56 +236,52 @@ def getAotUserEventHelperFileImplPrefix():
211
236
def getAotUserEventHelperFileImplSuffix ():
212
237
return ""
213
238
214
- def generateUserEventHelperFile (etwmanifest , userevent_directory , target_cpp , runtimeFlavor , extern , dryRun ):
239
+ def generateUserEventHelperFile (etwmanifest , userevent_directory , target_cpp , runtimeFlavor , extern ):
215
240
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
+
264
285
def getCoreCLRUserEventImplFilePrefix ():
265
286
return """#include "common.h" //FIXME<>
266
287
#include <stdint.h>
@@ -283,7 +304,7 @@ def getAotUserEventImplFileSuffix():
283
304
return ""
284
305
285
306
def generateUserEventImplFiles (
286
- etwmanifest , userevent_directory , extern , target_cpp , runtimeFlavor , inclusionList , exclusionList , dryRun ):
307
+ etwmanifest , userevent_directory , extern , target_cpp , runtimeFlavor , inclusionList , exclusionList ):
287
308
tree = DOM .parse (etwmanifest )
288
309
289
310
# Find the src directory starting with the assumption that
@@ -296,29 +317,32 @@ def generateUserEventImplFiles(
296
317
if os .path .basename (src_dirname ) == "" :
297
318
raise IOError ("Could not find the Core CLR 'src' directory" )
298
319
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
303
326
304
- providerPrettyName = providerName .replace ("Windows-" , '' )
305
- providerPrettyName = providerPrettyName .replace ("Microsoft-" , '' )
327
+ providerPrettyName = providerName .replace ("Windows-" , '' )
328
+ providerPrettyName = providerPrettyName .replace ("Microsoft-" , '' )
306
329
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 ))
312
333
313
- providerName_File = providerName_File .lower ()
334
+ if target_cpp :
335
+ providerName_File = providerName_File + ".cpp"
336
+ else :
337
+ providerName_File = providerName_File + ".c"
314
338
315
- usereventfile = os .path .join (userevent_directory , providerName_File )
339
+ providerName_File = providerName_File .lower ()
340
+ providerName_Header = providerName_Header .lower ()
316
341
317
- providerPrettyName = providerPrettyName .replace ('-' , '_' )
342
+ usereventfile = os .path .join (userevent_directory , providerName_File )
343
+
344
+ providerPrettyName = providerPrettyName .replace ('-' , '_' )
318
345
319
- if dryRun :
320
- print (usereventfile )
321
- else :
322
346
with open_for_update (usereventfile ) as usereventImpl :
323
347
usereventImpl .write (stdprolog_cpp )
324
348
header = ""
@@ -354,8 +378,23 @@ def generateUserEventImplFiles(
354
378
elif runtimeFlavor .nativeaot and providerName == "Microsoft-Windows-DotNETRuntime" :
355
379
usereventImpl .write (getAotUserEventImplFileSuffix ())
356
380
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
+
357
396
def generateUserEventFiles (
358
- etwmanifest , intermediate , extern , target_cpp , runtimeFlavor , inclusionList , exclusionList , dryRun ):
397
+ etwmanifest , intermediate , extern , target_cpp , runtimeFlavor , inclusionList , exclusionList ):
359
398
if runtimeFlavor .nativeaot or runtimeFlavor .mono :
360
399
raise Exception ("genUserEvents.py only supports coreclr currently." )
361
400
@@ -366,7 +405,7 @@ def generateUserEventFiles(
366
405
os .makedirs (userevent_directory )
367
406
368
407
# generate helper file
369
- generateUserEventHelperFile (etwmanifest , userevent_directory , target_cpp , runtimeFlavor , extern , dryRun )
408
+ generateUserEventHelperFile (etwmanifest , userevent_directory , target_cpp , runtimeFlavor , extern )
370
409
371
410
# generate all keywords
372
411
for keywordNode in tree .getElementsByTagName ('keyword' ):
@@ -382,15 +421,13 @@ def generateUserEventFiles(
382
421
target_cpp ,
383
422
runtimeFlavor ,
384
423
inclusionList ,
385
- exclusionList ,
386
- dryRun
424
+ exclusionList
387
425
)
388
426
389
427
import argparse
390
428
import sys
391
429
392
430
def main (argv ):
393
-
394
431
# parse the command line
395
432
parser = argparse .ArgumentParser (
396
433
description = "Generates the Code required to instrument userevent logging mechanism" )
@@ -408,8 +445,6 @@ def main(argv):
408
445
help = 'runtime flavor' )
409
446
required .add_argument ('--nonextern' , action = 'store_true' ,
410
447
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' )
413
448
args , unknown = parser .parse_known_args (argv )
414
449
if unknown :
415
450
print ('Unknown argument(s): ' , ', ' .join (unknown ))
@@ -421,8 +456,7 @@ def main(argv):
421
456
intermediate = args .intermediate
422
457
runtimeFlavor = RuntimeFlavor (args .runtimeflavor )
423
458
extern = not args .nonextern
424
- dryRun = args .dry_run
425
-
459
+
426
460
target_cpp = True
427
461
if runtimeFlavor .mono :
428
462
extern = False
@@ -431,7 +465,7 @@ def main(argv):
431
465
inclusion_list = parseInclusionList (inclusion_filename )
432
466
exclusion_list = parseExclusionList (exclusion_filename )
433
467
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 )
435
469
436
470
if __name__ == '__main__' :
437
471
return_code = main (sys .argv [1 :])
0 commit comments