2 ## Licensed to the .NET Foundation under one or more agreements.
3 ## The .NET Foundation licenses this file to you under the MIT license.
4 ## See the LICENSE file in the project root for more information.
8 #Add Events: modify <root>src/vm/ClrEtwAll.man
9 #Look at the Code in <root>/src/scripts/genLttngProvider.py for using subroutines in this file
12 # Python 2 compatibility
13 from __future__ import print_function
16 import xml.dom.minidom as DOM
17 from utilities import open_for_update
20 // Licensed to the .NET Foundation under one or more agreements.
21 // The .NET Foundation licenses this file to you under the MIT license.
22 // See the LICENSE file in the project root for more information.
24 /******************************************************************
26 DO NOT MODIFY. AUTOGENERATED FILE.
27 This file is generated using the logic from <root>/src/scripts/genEventing.py
29 ******************************************************************/
36 "win:Int64" :"const __int64",
37 "win:ULong" :"const ULONG",
39 "win:Struct" :"const void",
41 "win:GUID" :"const GUID",
42 "win:AnsiString" :"LPCSTR",
43 "win:UnicodeString" :"PCWSTR",
44 "win:Double" :"const double",
45 "win:Int32" :"const signed int",
46 "win:Boolean" :"const BOOL",
47 "win:UInt64" :"const unsigned __int64",
48 "win:UInt32" :"const unsigned int",
49 "win:UInt16" :"const unsigned short",
50 "win:UInt8" :"const unsigned char",
51 "win:Pointer" :"const void*",
52 "win:Binary" :"const BYTE"
54 # A Template represents an ETW template can contain 1 or more AbstractTemplates
55 # The AbstractTemplate contains FunctionSignature
56 # FunctionSignature consist of FunctionParameter representing each parameter in it's signature
58 def getParamSequenceSize(paramSequence, estimate):
61 for param in paramSequence:
62 if param == "win:Int64":
64 elif param == "win:ULong":
68 elif param == "win:Double":
70 elif param == "win:Int32":
72 elif param == "win:Boolean":
74 elif param == "win:UInt64":
76 elif param == "win:UInt32":
78 elif param == "win:UInt16":
80 elif param == "win:UInt8":
82 elif param == "win:Pointer":
87 elif param == "win:Binary":
90 if param == "win:AnsiString":
92 elif param == "win:UnicodeString":
94 elif param == "win:Struct":
97 raise Exception("Don't know size for " + param)
102 return total, pointers
107 return "<Template " + self.name + ">"
109 def __init__(self, templateName, fnPrototypes, dependencies, structSizes, arrays):
110 self.name = templateName
111 self.signature = FunctionSignature()
112 self.structs = structSizes
115 for variable in fnPrototypes.paramlist:
116 for dependency in dependencies[variable]:
117 if not self.signature.getParam(dependency):
118 self.signature.append(dependency, fnPrototypes.getParam(dependency))
120 def getFnParam(self, name):
121 return self.signature.getParam(name)
124 def num_params(self):
125 return len(self.signature.paramlist)
128 def estimated_size(self):
129 total = getParamSequenceSize((self.getFnParam(paramName).winType for paramName in self.signature.paramlist), True)
140 class FunctionSignature:
142 return ", ".join(self.paramlist)
145 self.LUT = {} # dictionary of FunctionParameter
146 self.paramlist = [] # list of parameters to maintain their order in signature
148 def append(self,variable,fnparam):
149 self.LUT[variable] = fnparam
150 self.paramlist.append(variable)
152 def getParam(self,variable):
153 return self.LUT.get(variable)
156 return len(self.paramlist)
158 class FunctionParameter:
162 def __init__(self,winType,name,count,prop):
163 self.winType = winType #ETW type as given in the manifest
164 self.name = name #parameter name as given in the manifest
165 self.prop = prop #any special property as determined by the manifest and developer
166 #self.count #indicates if the parameter is a pointer
167 if count == "win:null":
168 self.count = "win:null"
169 elif count or winType == "win:GUID" or count == "win:count":
170 #special case for GUIDS, consider them as structs
171 self.count = "win:count"
173 self.count = "win:null"
176 def getTopLevelElementsByTagName(node,tag):
178 for element in node.getElementsByTagName(tag):
179 if element.parentNode == node:
180 dataNodes.append(element)
184 ignoredXmlTemplateAttribes = frozenset(["map","outType"])
185 usedXmlTemplateAttribes = frozenset(["name","inType","count", "length"])
187 def parseTemplateNodes(templateNodes):
192 for templateNode in templateNodes:
195 templateName = templateNode.getAttribute('tid')
197 fnPrototypes = FunctionSignature()
198 dataNodes = getTopLevelElementsByTagName(templateNode,'data')
200 # Validate that no new attributes has been added to manifest
201 for dataNode in dataNodes:
202 nodeMap = dataNode.attributes
203 for attrib in nodeMap.values():
204 attrib_name = attrib.name
205 if attrib_name not in ignoredXmlTemplateAttribes and attrib_name not in usedXmlTemplateAttribes:
206 raise ValueError('unknown attribute: '+ attrib_name + ' in template:'+ templateName)
208 for dataNode in dataNodes:
209 variable = dataNode.getAttribute('name')
210 wintype = dataNode.getAttribute('inType')
212 #count and length are the same
213 wincount = dataNode.getAttribute('count')
214 winlength = dataNode.getAttribute('length');
217 var_dependency = [variable]
220 raise Exception("both count and length property found on: " + variable + "in template: " + templateName)
223 if (wincount.isdigit() and int(wincount) ==1):
227 if (wincount.isdigit()):
229 elif fnPrototypes.getParam(wincount):
231 var_dependency.insert(0, wincount)
232 arrays[variable] = wincount
234 #construct the function signature
236 if wintype == "win:GUID":
237 var_Props = "sizeof(GUID)/sizeof(int)"
239 var_Dependecies[variable] = var_dependency
240 fnparam = FunctionParameter(wintype,variable,wincount,var_Props)
241 fnPrototypes.append(variable,fnparam)
243 structNodes = getTopLevelElementsByTagName(templateNode,'struct')
245 for structToBeMarshalled in structNodes:
246 structName = structToBeMarshalled.getAttribute('name')
247 countVarName = structToBeMarshalled.getAttribute('count')
249 assert(countVarName == "Count")
250 assert(countVarName in fnPrototypes.paramlist)
252 raise ValueError("Struct '%s' in template '%s' does not have an attribute count." % (structName, templateName))
254 names = [x.attributes['name'].value for x in structToBeMarshalled.getElementsByTagName("data")]
255 types = [x.attributes['inType'].value for x in structToBeMarshalled.getElementsByTagName("data")]
257 structCounts[structName] = countVarName
258 var_Dependecies[structName] = [countVarName, structName]
259 fnparam_pointer = FunctionParameter("win:Struct", structName, "win:count", countVarName)
260 fnPrototypes.append(structName, fnparam_pointer)
262 allTemplates[templateName] = Template(templateName, fnPrototypes, var_Dependecies, structCounts, arrays)
266 def generateClrallEvents(eventNodes,allTemplates):
268 for eventNode in eventNodes:
269 eventName = eventNode.getAttribute('symbol')
270 templateName = eventNode.getAttribute('template')
272 #generate EventEnabled
273 clrallEvents.append("inline BOOL EventEnabled")
274 clrallEvents.append(eventName)
275 clrallEvents.append("() {return ")
276 clrallEvents.append("EventPipeEventEnabled" + eventName + "()")
278 if os.name == 'posix':
279 clrallEvents.append("|| (XplatEventLogger::IsEventLoggingEnabled() && EventXplatEnabled" + eventName + "());}\n\n")
281 clrallEvents.append(";}\n\n")
282 #generate FireEtw functions
285 fnptype.append("inline ULONG FireEtw")
286 fnptype.append(eventName)
287 fnptype.append("(\n")
293 template = allTemplates[templateName]
294 fnSig = template.signature
296 for params in fnSig.paramlist:
297 fnparam = fnSig.getParam(params)
298 wintypeName = fnparam.winType
299 typewName = palDataTypeMapping[wintypeName]
300 winCount = fnparam.count
301 countw = palDataTypeMapping[winCount]
304 if params in template.structs:
305 fnptypeline.append("%sint %s_ElementSize,\n" % (lindent, params))
307 fnptypeline.append(lindent)
308 fnptypeline.append(typewName)
309 fnptypeline.append(countw)
310 fnptypeline.append(" ")
311 fnptypeline.append(fnparam.name)
312 fnptypeline.append(",\n")
315 for params in fnSig.paramlist:
316 fnparam = fnSig.getParam(params)
318 if params in template.structs:
319 line.append(fnparam.name + "_ElementSize")
322 line.append(fnparam.name)
325 #remove trailing commas
328 if len(fnptypeline) > 0:
331 fnptype.extend(fnptypeline)
332 fnptype.append("\n)\n{\n")
333 fnbody.append(lindent)
334 fnbody.append("ULONG status = EventPipeWriteEvent" + eventName + "(" + ''.join(line) + ");\n")
335 fnbody.append(lindent)
336 fnbody.append("status &= FireEtXplat" + eventName + "(" + ''.join(line) + ");\n")
337 fnbody.append(lindent)
338 fnbody.append("return status;\n")
339 fnbody.append("}\n\n")
341 clrallEvents.extend(fnptype)
342 clrallEvents.extend(fnbody)
344 return ''.join(clrallEvents)
346 def generateClrXplatEvents(eventNodes, allTemplates, extern):
348 for eventNode in eventNodes:
349 eventName = eventNode.getAttribute('symbol')
350 templateName = eventNode.getAttribute('template')
352 #generate EventEnabled
353 if extern: clrallEvents.append('extern "C" ')
354 clrallEvents.append("BOOL EventXplatEnabled")
355 clrallEvents.append(eventName)
356 clrallEvents.append("();\n")
358 #generate FireEtw functions
361 if extern: fnptype.append('extern "C" ')
362 fnptype.append("ULONG FireEtXplat")
363 fnptype.append(eventName)
364 fnptype.append("(\n")
367 template = allTemplates[templateName]
368 fnSig = template.signature
370 for params in fnSig.paramlist:
371 fnparam = fnSig.getParam(params)
372 wintypeName = fnparam.winType
373 typewName = palDataTypeMapping[wintypeName]
374 winCount = fnparam.count
375 countw = palDataTypeMapping[winCount]
378 if params in template.structs:
379 fnptypeline.append("%sint %s_ElementSize,\n" % (lindent, params))
381 fnptypeline.append(lindent)
382 fnptypeline.append(typewName)
383 fnptypeline.append(countw)
384 fnptypeline.append(" ")
385 fnptypeline.append(fnparam.name)
386 fnptypeline.append(",\n")
388 #remove trailing commas
389 if len(fnptypeline) > 0:
392 fnptype.extend(fnptypeline)
393 fnptype.append("\n);\n")
394 clrallEvents.extend(fnptype)
396 return ''.join(clrallEvents)
398 def generateClrEventPipeWriteEvents(eventNodes, allTemplates, extern):
400 for eventNode in eventNodes:
401 eventName = eventNode.getAttribute('symbol')
402 templateName = eventNode.getAttribute('template')
404 #generate EventPipeEventEnabled and EventPipeWriteEvent functions
409 if extern:eventenabled.append('extern "C" ')
410 eventenabled.append("BOOL EventPipeEventEnabled")
411 eventenabled.append(eventName)
412 eventenabled.append("();\n")
414 if extern: writeevent.append('extern "C" ')
415 writeevent.append("ULONG EventPipeWriteEvent")
416 writeevent.append(eventName)
417 writeevent.append("(\n")
420 template = allTemplates[templateName]
421 fnSig = template.signature
423 for params in fnSig.paramlist:
424 fnparam = fnSig.getParam(params)
425 wintypeName = fnparam.winType
426 typewName = palDataTypeMapping[wintypeName]
427 winCount = fnparam.count
428 countw = palDataTypeMapping[winCount]
430 if params in template.structs:
431 fnptypeline.append("%sint %s_ElementSize,\n" % (lindent, params))
433 fnptypeline.append(lindent)
434 fnptypeline.append(typewName)
435 fnptypeline.append(countw)
436 fnptypeline.append(" ")
437 fnptypeline.append(fnparam.name)
438 fnptypeline.append(",\n")
440 #remove trailing commas
441 if len(fnptypeline) > 0:
444 writeevent.extend(fnptypeline)
445 writeevent.append("\n);\n")
446 clrallEvents.extend(eventenabled)
447 clrallEvents.extend(writeevent)
449 return ''.join(clrallEvents)
451 #generates the dummy header file which is used by the VM as entry point to the logging Functions
452 def generateclrEtwDummy(eventNodes,allTemplates):
454 for eventNode in eventNodes:
455 eventName = eventNode.getAttribute('symbol')
456 templateName = eventNode.getAttribute('template')
459 #generate FireEtw functions
460 fnptype.append("#define FireEtw")
461 fnptype.append(eventName)
465 template = allTemplates[templateName]
466 fnSig = template.signature
468 for params in fnSig.paramlist:
469 fnparam = fnSig.getParam(params)
471 if params in template.structs:
472 line.append(fnparam.name + "_ElementSize")
475 line.append(fnparam.name)
478 #remove trailing commas
483 fnptype.append(") 0\n")
484 clretmEvents.extend(fnptype)
486 return ''.join(clretmEvents)
488 def generateEtmDummyHeader(sClrEtwAllMan,clretwdummy):
493 tree = DOM.parse(sClrEtwAllMan)
495 incDir = os.path.dirname(os.path.realpath(clretwdummy))
496 if not os.path.exists(incDir):
499 with open_for_update(clretwdummy) as Clretwdummy:
500 Clretwdummy.write(stdprolog + "\n")
502 for providerNode in tree.getElementsByTagName('provider'):
503 templateNodes = providerNode.getElementsByTagName('template')
504 allTemplates = parseTemplateNodes(templateNodes)
505 eventNodes = providerNode.getElementsByTagName('event')
506 #pal: create etmdummy.h
507 Clretwdummy.write(generateclrEtwDummy(eventNodes, allTemplates) + "\n")
509 def convertToLevelId(level):
510 if level == "win:LogAlways":
512 if level == "win:Critical":
514 if level == "win:Error":
516 if level == "win:Warning":
518 if level == "win:Informational":
520 if level == "win:Verbose":
522 raise Exception("unknown level " + level)
524 def getKeywordsMaskCombined(keywords, keywordsToMask):
526 for keyword in keywords.split(" "):
529 mask |= keywordsToMask[keyword]
533 def generatePlatformIndependentFiles(sClrEtwAllMan, incDir, etmDummyFile, extern, write_xplatheader):
535 generateEtmDummyHeader(sClrEtwAllMan,etmDummyFile)
536 tree = DOM.parse(sClrEtwAllMan)
541 if not os.path.exists(incDir):
544 eventpipe_trace_context_typedef = """
545 #if !defined(EVENTPIPE_TRACE_CONTEXT_DEF)
546 #define EVENTPIPE_TRACE_CONTEXT_DEF
547 typedef struct _EVENTPIPE_TRACE_CONTEXT
552 ULONGLONG EnabledKeywordsBitmask;
553 } EVENTPIPE_TRACE_CONTEXT, *PEVENTPIPE_TRACE_CONTEXT;
554 #endif // EVENTPIPE_TRACE_CONTEXT_DEF
557 lttng_trace_context_typedef = """
558 #if !defined(LTTNG_TRACE_CONTEXT_DEF)
559 #define LTTNG_TRACE_CONTEXT_DEF
560 typedef struct _LTTNG_TRACE_CONTEXT
565 ULONGLONG EnabledKeywordsBitmask;
566 } LTTNG_TRACE_CONTEXT, *PLTTNG_TRACE_CONTEXT;
567 #endif // LTTNG_TRACE_CONTEXT_DEF
570 dotnet_trace_context_typedef_windows = """
571 #if !defined(DOTNET_TRACE_CONTEXT_DEF)
572 #define DOTNET_TRACE_CONTEXT_DEF
573 typedef struct _DOTNET_TRACE_CONTEXT
575 PMCGEN_TRACE_CONTEXT EtwProvider;
576 EVENTPIPE_TRACE_CONTEXT EventPipeProvider;
577 } DOTNET_TRACE_CONTEXT, *PDOTNET_TRACE_CONTEXT;
578 #endif // DOTNET_TRACE_CONTEXT_DEF
581 dotnet_trace_context_typedef_unix = """
582 #if !defined(DOTNET_TRACE_CONTEXT_DEF)
583 #define DOTNET_TRACE_CONTEXT_DEF
584 typedef struct _DOTNET_TRACE_CONTEXT
586 EVENTPIPE_TRACE_CONTEXT EventPipeProvider;
587 PLTTNG_TRACE_CONTEXT LttngProvider;
588 } DOTNET_TRACE_CONTEXT, *PDOTNET_TRACE_CONTEXT;
589 #endif // DOTNET_TRACE_CONTEXT_DEF
592 trace_context_instdef_windows = """
593 EXTERN_C __declspec(selectany) DOTNET_TRACE_CONTEXT MICROSOFT_WINDOWS_DOTNETRUNTIME_PROVIDER_DOTNET_Context = { &MICROSOFT_WINDOWS_DOTNETRUNTIME_PROVIDER_Context, MICROSOFT_WINDOWS_DOTNETRUNTIME_PROVIDER_EVENTPIPE_Context };
595 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 };
597 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 };
599 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 };
602 trace_context_instdef_unix = """
603 EXTERN_C __declspec(selectany) DOTNET_TRACE_CONTEXT MICROSOFT_WINDOWS_DOTNETRUNTIME_PROVIDER_DOTNET_Context = { MICROSOFT_WINDOWS_DOTNETRUNTIME_PROVIDER_EVENTPIPE_Context, &MICROSOFT_WINDOWS_DOTNETRUNTIME_PROVIDER_LTTNG_Context };
605 EXTERN_C __declspec(selectany) DOTNET_TRACE_CONTEXT MICROSOFT_WINDOWS_DOTNETRUNTIME_PRIVATE_PROVIDER_DOTNET_Context = { MICROSOFT_WINDOWS_DOTNETRUNTIME_PRIVATE_PROVIDER_EVENTPIPE_Context, &MICROSOFT_WINDOWS_DOTNETRUNTIME_PRIVATE_PROVIDER_LTTNG_Context };
607 EXTERN_C __declspec(selectany) DOTNET_TRACE_CONTEXT MICROSOFT_WINDOWS_DOTNETRUNTIME_RUNDOWN_PROVIDER_DOTNET_Context = { MICROSOFT_WINDOWS_DOTNETRUNTIME_RUNDOWN_PROVIDER_EVENTPIPE_Context, &MICROSOFT_WINDOWS_DOTNETRUNTIME_RUNDOWN_PROVIDER_LTTNG_Context };
609 EXTERN_C __declspec(selectany) DOTNET_TRACE_CONTEXT MICROSOFT_WINDOWS_DOTNETRUNTIME_STRESS_PROVIDER_DOTNET_Context = { MICROSOFT_WINDOWS_DOTNETRUNTIME_STRESS_PROVIDER_EVENTPIPE_Context, &MICROSOFT_WINDOWS_DOTNETRUNTIME_STRESS_PROVIDER_LTTNG_Context };
612 # Write the main header for FireETW* functions
613 clrallevents = os.path.join(incDir, "clretwallmain.h")
614 is_windows = os.name == 'nt'
615 with open_for_update(clrallevents) as Clrallevents:
616 Clrallevents.write(stdprolog)
617 Clrallevents.write("""
618 #include "clrxplatevents.h"
619 #include "clreventpipewriteevents.h"
623 # define DOTNET_TRACE_CONTEXT depending on the platform
625 Clrallevents.write(eventpipe_trace_context_typedef) # define EVENTPIPE_TRACE_CONTEXT
626 Clrallevents.write(dotnet_trace_context_typedef_windows)
628 for providerNode in tree.getElementsByTagName('provider'):
629 templateNodes = providerNode.getElementsByTagName('template')
630 allTemplates = parseTemplateNodes(templateNodes)
631 eventNodes = providerNode.getElementsByTagName('event')
634 Clrallevents.write(generateClrallEvents(eventNodes, allTemplates) + "\n")
636 providerName = providerNode.getAttribute('name')
637 providerSymbol = providerNode.getAttribute('symbol')
640 eventpipeProviderCtxName = providerSymbol + "_EVENTPIPE_Context"
641 Clrallevents.write('EXTERN_C __declspec(selectany) EVENTPIPE_TRACE_CONTEXT ' + eventpipeProviderCtxName + ' = { W("' + providerName + '"), 0, false, 0 };\n')
643 # define and initialize runtime providers' DOTNET_TRACE_CONTEXT depending on the platform
645 Clrallevents.write(trace_context_instdef_windows)
647 if write_xplatheader:
648 clrproviders = os.path.join(incDir, "clrproviders.h")
649 with open_for_update(clrproviders) as Clrproviders:
650 Clrproviders.write("""
651 typedef struct _EVENT_DESCRIPTOR
654 ULONGLONG const Keyword;
659 Clrproviders.write(eventpipe_trace_context_typedef) # define EVENTPIPE_TRACE_CONTEXT
660 Clrproviders.write(lttng_trace_context_typedef) # define LTTNG_TRACE_CONTEXT
661 Clrproviders.write(dotnet_trace_context_typedef_unix)
665 for providerNode in tree.getElementsByTagName('provider'):
668 providerName = str(providerNode.getAttribute('name'))
669 providerSymbol = str(providerNode.getAttribute('symbol'))
673 eventpipeProviderCtxName = providerSymbol + "_EVENTPIPE_Context"
674 Clrproviders.write('EXTERN_C __declspec(selectany) EVENTPIPE_TRACE_CONTEXT ' + eventpipeProviderCtxName + ' = { W("' + providerName + '"), 0, false, 0 };\n')
675 lttngProviderCtxName = providerSymbol + "_LTTNG_Context"
676 Clrproviders.write('EXTERN_C __declspec(selectany) LTTNG_TRACE_CONTEXT ' + lttngProviderCtxName + ' = { W("' + providerName + '"), 0, false, 0 };\n')
678 Clrproviders.write("// Keywords\n");
679 for keywordNode in providerNode.getElementsByTagName('keyword'):
680 keywordName = keywordNode.getAttribute('name')
681 keywordMask = keywordNode.getAttribute('mask')
682 keywordSymbol = keywordNode.getAttribute('symbol')
683 Clrproviders.write("#define " + keywordSymbol + " " + keywordMask + "\n")
685 keywords.append("{ \"" + keywordName + "\", " + keywordMask + " }")
686 keywordsToMask[keywordName] = int(keywordMask, 16)
689 for eventNode in providerNode.getElementsByTagName('event'):
690 levelName = eventNode.getAttribute('level')
691 symbolName = eventNode.getAttribute('symbol')
692 keywords = eventNode.getAttribute('keywords')
693 level = convertToLevelId(levelName)
694 Clrproviders.write("EXTERN_C __declspec(selectany) EVENT_DESCRIPTOR const " + symbolName + " = { " + str(level) + ", " + hex(getKeywordsMaskCombined(keywords, keywordsToMask)) + " };\n")
696 allProviders.append("&" + providerSymbol + "_LTTNG_Context")
698 # define and initialize runtime providers' DOTNET_TRACE_CONTEXT depending on the platform
700 Clrproviders.write('#define NB_PROVIDERS ' + str(nbProviders) + '\n')
701 Clrproviders.write('EXTERN_C __declspec(selectany) LTTNG_TRACE_CONTEXT * const ALL_LTTNG_PROVIDERS_CONTEXT[NB_PROVIDERS] = { ')
702 Clrproviders.write(', '.join(allProviders))
703 Clrproviders.write(' };\n')
704 Clrproviders.write(trace_context_instdef_unix)
707 clreventpipewriteevents = os.path.join(incDir, "clreventpipewriteevents.h")
708 with open_for_update(clreventpipewriteevents) as Clreventpipewriteevents:
709 Clreventpipewriteevents.write(stdprolog + "\n")
711 for providerNode in tree.getElementsByTagName('provider'):
712 templateNodes = providerNode.getElementsByTagName('template')
713 allTemplates = parseTemplateNodes(templateNodes)
714 eventNodes = providerNode.getElementsByTagName('event')
716 #eventpipe: create clreventpipewriteevents.h
717 Clreventpipewriteevents.write(generateClrEventPipeWriteEvents(eventNodes, allTemplates, extern) + "\n")
719 # Write secondary headers for FireEtXplat* and EventPipe* functions
720 if write_xplatheader:
721 clrxplatevents = os.path.join(incDir, "clrxplatevents.h")
722 with open_for_update(clrxplatevents) as Clrxplatevents:
723 Clrxplatevents.write(stdprolog + "\n")
725 for providerNode in tree.getElementsByTagName('provider'):
726 templateNodes = providerNode.getElementsByTagName('template')
727 allTemplates = parseTemplateNodes(templateNodes)
728 eventNodes = providerNode.getElementsByTagName('event')
730 #pal: create clrallevents.h
731 Clrxplatevents.write(generateClrXplatEvents(eventNodes, allTemplates, extern) + "\n")
738 #parse the command line
739 parser = argparse.ArgumentParser(description="Generates the Code required to instrument LTTtng logging mechanism")
741 required = parser.add_argument_group('required arguments')
742 required.add_argument('--man', type=str, required=True,
743 help='full path to manifest containig the description of events')
744 required.add_argument('--inc', type=str, default=None,
745 help='full path to directory where the header files will be generated')
746 required.add_argument('--dummy', type=str,default=None,
747 help='full path to file that will have dummy definitions of FireEtw functions')
748 required.add_argument('--nonextern', action='store_true',
749 help='if specified, will not generated extern function stub headers' )
750 required.add_argument('--noxplatheader', action='store_true',
751 help='if specified, will not write a generated cross-platform header' )
752 args, unknown = parser.parse_known_args(argv)
754 print('Unknown argument(s): ', ', '.join(unknown))
757 sClrEtwAllMan = args.man
759 etmDummyFile = args.dummy
760 extern = not args.nonextern
761 write_xplatheader = not args.noxplatheader
763 generatePlatformIndependentFiles(sClrEtwAllMan, incdir, etmDummyFile, extern, write_xplatheader)
765 if __name__ == '__main__':
766 return_code = main(sys.argv[1:])
767 sys.exit(return_code)