3 genevent.c: Generate helper declarations and functions to trace events
4 from an event description file.
6 Copyright (C) 2002, Xianxiu Yang
7 Copyright (C) 2002, Michel Dagenais
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; version 2 of the License.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 /* This program reads the ".event" event definitions input files
24 specified as command line arguments and generates corresponding
25 ".c" and ".h" files required to trace such events in the kernel.
27 The program uses a very simple tokenizer, called from a hand written
28 recursive descent parser to fill a data structure describing the events.
29 The result is a sequence of events definitions which refer to type
32 A table of named types is maintained to allow refering to types by name
33 when the same type is used at several places. Finally a sequence of
34 all types is maintained to facilitate the freeing of all type
35 information when the processing of an ".event" file is finished. */
42 #include <linux/errno.h>
48 /* Named types may be referenced from anywhere */
52 int main(int argc
, char** argv
)
56 char buffer
[BUFFER_SIZE
];
60 printf("At least one event definition file is needed\n");
65 in
.error
= error_callback
;
67 for(i
= 1 ; i
< argc
; i
++) {
69 in
.name
= allocAndCopy(argv
[i
]);
71 in
.fp
= fopen(in
.name
, "r");
73 in
.error(&in
,"cannot open facility input file");
77 token
= getToken(&in
);
78 if(in
.type
== ENDFILE
) break;
80 if(strcmp(token
, "<")) in
.error(&in
,"not a facility file");
83 if(strcmp("facility",token
) == 0) {
84 fac
= memAlloc(sizeof(facility
));
86 fac
->description
= NULL
;
87 sequence_init(&(fac
->events
));
88 table_init(&(fac
->named_types
));
89 sequence_init(&(fac
->unnamed_types
));
91 parseFacility(&in
, fac
);
93 //check if any namedType is not defined
94 checkNamedTypesImplemented(&fac
->named_types
);
96 else in
.error(&in
,"facility token was expected");
98 generateFile(argv
[i
]);
101 free(fac
->description
);
102 freeEvents(&fac
->events
);
103 sequence_dispose(&fac
->events
);
104 freeNamedType(&fac
->named_types
);
105 table_dispose(&fac
->named_types
);
106 freeTypes(&fac
->unnamed_types
);
107 sequence_dispose(&fac
->unnamed_types
);
119 /*****************************************************************************
121 * generateFile : generate .c and .h file
123 * name : name of event definition file
124 ****************************************************************************/
125 void generateFile(char *name
){
126 char *loadName
, *hName
, *hIdName
, *cName
, *tmp
, *tmp2
;
127 FILE * lFp
, *hFp
, *iFp
, *cFp
;
129 unsigned long checksum
=0;
131 //remove .xml if it exists
132 tmp
= &name
[strlen(name
)-4];
133 if(strcmp(tmp
, ".xml") == 0){
137 tmp
= strrchr(name
,'/');
144 loadName
= appendString("ltt-facility-loader-", tmp
);
145 tmp2
= appendString(loadName
,".h");
148 hName
= appendString("ltt-facility-", tmp
);
149 tmp2
= appendString(hName
,".h");
152 hIdName
= appendString("ltt-facility-id-", tmp
);
153 tmp2
= appendString(hIdName
,".h");
156 cName
= appendString("ltt-facility-loader-", tmp
);
157 tmp2
= appendString(cName
,".c");
160 lFp
= fopen(loadName
,"w");
162 printf("Cannot open the file : %s\n",loadName
);
166 hFp
= fopen(hName
,"w");
168 printf("Cannot open the file : %s\n",hName
);
172 iFp
= fopen(hIdName
,"w");
174 printf("Cannot open the file : %s\n",hIdName
);
178 cFp
= fopen(cName
,"w");
180 printf("Cannot open the file : %s\n",cName
);
189 generateChecksum(fac
->name
, &checksum
, &(fac
->events
));
191 /* generate .h file, event enumeration then structures and functions */
192 fprintf(iFp
, "#ifndef _LTT_FACILITY_ID_%s_H_\n",fac
->capname
);
193 fprintf(iFp
, "#define _LTT_FACILITY_ID_%s_H_\n\n",fac
->capname
);
194 generateEnumEvent(iFp
, fac
->name
, &nbEvent
, checksum
);
195 fprintf(iFp
, "#endif //_LTT_FACILITY_ID_%s_H_\n",fac
->capname
);
198 fprintf(hFp
, "#ifndef _LTT_FACILITY_%s_H_\n",fac
->capname
);
199 fprintf(hFp
, "#define _LTT_FACILITY_%s_H_\n\n",fac
->capname
);
200 generateTypeDefs(hFp
, fac
->name
);
201 generateStructFunc(hFp
, fac
->name
,checksum
);
202 fprintf(hFp
, "#endif //_LTT_FACILITY_%s_H_\n",fac
->capname
);
204 /* generate .h file, calls to register the facility at init time */
205 generateLoaderfile(lFp
,fac
->name
,nbEvent
,checksum
,fac
->capname
);
207 // create ltt-facility-loader-facname.c
208 generateCfile(cFp
, tmp
);
218 /*****************************************************************************
220 * generateEnumEvent : output event enum to .h file
222 * fp : file to be written to
223 * facName : name of facility
225 * nbEvent : number of events in the facility
226 ****************************************************************************/
227 void generateEnumEvent(FILE *fp
, char *facName
, int * nbEvent
, unsigned long checksum
) {
230 fprintf(fp
,"#include <linux/ltt-facilities.h>\n\n");
232 fprintf(fp
,"/**** facility handle ****/\n\n");
233 fprintf(fp
,"extern ltt_facility_t ltt_facility_%s_%X;\n",facName
, checksum
);
234 fprintf(fp
,"extern ltt_facility_t ltt_facility_%s;\n\n\n",facName
, checksum
);
236 fprintf(fp
,"/**** event type ****/\n\n");
237 fprintf(fp
,"enum %s_event {\n",facName
);
239 for(pos
= 0; pos
< fac
->events
.position
;pos
++) {
240 fprintf(fp
,"\tevent_%s", ((event
*)(fac
->events
.array
[pos
]))->name
);
241 if(pos
!= fac
->events
.position
-1) fprintf(fp
,",\n");
243 fprintf(fp
,"\n};\n\n\n");
245 // fprintf(fp,"/**** number of events in the facility ****/\n\n");
246 // fprintf(fp,"int nbEvents_%s = %d;\n\n\n",facName, fac->events.position);
247 *nbEvent
= fac
->events
.position
;
251 /*****************************************************************************
253 * printStruct : Generic struct printing function
255 * fp : file to be written to
256 * len : number of fields
257 * array : array of field info
258 * name : basic struct name
259 * facName : name of facility
260 * whichTypeFirst : struct or array/sequence first
261 * hasStrSeq : string or sequence present?
262 * structCount : struct postfix
263 ****************************************************************************/
266 printStruct(FILE * fp
, int len
, void ** array
, char * name
, char * facName
,
267 int * whichTypeFirst
, int * hasStrSeq
, int * structCount
)
272 type_descriptor
* td
;
274 for (pos
= 0; pos
< len
; pos
++) {
275 fld
= (field
*)array
[pos
];
277 if( td
->type
== STRING
|| td
->type
== SEQUENCE
||
281 // if (*whichTypeFirst == 0) {
282 // *whichTypeFirst = 1; //struct first
287 fprintf(fp
,"struct %s_%s",name
, facName
);
289 fprintf(fp
, "_%d {\n",++*structCount
);
294 fprintf(fp
, "\t%s %s; /* %s */\n",
295 getTypeStr(td
),fld
->name
,fld
->description
);
298 if (*whichTypeFirst
== 0) {
299 //string or sequence or array first
304 fprintf(fp
,"} __attribute__ ((packed));\n\n");
312 fprintf(fp
,"} __attribute__ ((packed));\n\n");
317 /*****************************************************************************
319 * generateHfile : Create the typedefs
321 * fp : file to be written to
322 ****************************************************************************/
324 generateTypeDefs(FILE * fp
, char *facName
)
328 fprintf(fp
,"#include <linux/types.h>\n");
329 fprintf(fp
,"#include <linux/spinlock.h>\n");
330 fprintf(fp
,"#include <linux/ltt/ltt-facility-id-%s.h>\n\n", facName
);
331 fprintf(fp
,"#include <linux/ltt-core.h>\n");
332 fprintf(fp
,"#ifdef CONFIG_UML\n");
333 fprintf(fp
,"#include \"irq_user.h\"\n");
334 fprintf(fp
,"#endif //CONFIG_UML\n");
336 fprintf(fp
, "/**** Basic Type Definitions ****/\n\n");
338 for (pos
= 0; pos
< fac
->named_types
.values
.position
; pos
++) {
339 type_descriptor
* type
=
340 (type_descriptor
*)fac
->named_types
.values
.array
[pos
];
341 printStruct(fp
, type
->fields
.position
, type
->fields
.array
,
342 "", type
->type_name
, &tmp
, &tmp
, NULL
);
343 fprintf(fp
, "typedef struct _%s %s;\n\n",
344 type
->type_name
, type
->type_name
);
349 /*****************************************************************************
351 * generateEnumDefinition: generate enum definition if it exists
353 * fp : file to be written to
355 ****************************************************************************/
356 void generateEnumDefinition(FILE * fp
, type_descriptor
* type
){
359 if(type
->already_printed
) return;
361 fprintf(fp
,"enum {\n");
362 for(pos
= 0; pos
< type
->labels
.position
; pos
++){
363 fprintf(fp
,"\tLTT_ENUM_%s", type
->labels
.array
[pos
]);
364 if (pos
!= type
->labels
.position
- 1) fprintf(fp
,",");
365 if(type
->labels_description
.array
[pos
] != NULL
)
366 fprintf(fp
,"\t/* %s */\n",type
->labels_description
.array
[pos
]);
370 fprintf(fp
,"};\n\n\n");
372 type
->already_printed
= 1;
375 /*****************************************************************************
377 * generateStrucTFunc: output structure and function to .h file
379 * fp : file to be written to
380 * facName : name of facility
381 ****************************************************************************/
382 void generateStructFunc(FILE * fp
, char * facName
, unsigned long checksum
){
385 type_descriptor
* td
;
387 int hasStrSeq
, flag
, structCount
, seqCount
,strCount
, whichTypeFirst
=0;
389 for(pos
= 0; pos
< fac
->events
.position
; pos
++){
390 ev
= (event
*) fac
->events
.array
[pos
];
391 //yxx if(ev->nested)continue;
392 fprintf(fp
,"/**** structure and trace function for event: %s ****/\n\n",
394 //if(ev->type == 0){ // event without type
395 // fprintf(fp,"static inline void trace_%s_%s(void){\n",facName,ev->name);
396 // fprintf(fp,"\tltt_log_event(ltt_facility_%s_%X, event_%s, 0, NULL);\n",
397 // facName,checksum,ev->name);
398 // fprintf(fp,"};\n\n\n");
402 //if fields contain enum, print out enum definition
403 //MD : fixed in generateEnumDefinition to do not print the same enum
406 for(pos1
= 0; pos1
< ev
->type
->fields
.position
; pos1
++){
407 fld
= (field
*)ev
->type
->fields
.array
[pos1
];
408 if(fld
->type
->type
== ENUM
) generateEnumDefinition(fp
, fld
->type
);
411 //default: no string, array or sequence in the event
416 //structure for kernel
418 printStruct(fp
, ev
->type
->fields
.position
, ev
->type
->fields
.array
,
419 ev
->name
, facName
, &whichTypeFirst
, &hasStrSeq
, &structCount
);
421 //trace function : function name and parameters
424 fprintf(fp
,"static inline void trace_%s_%s(",facName
,ev
->name
);
428 for(pos1
= 0; pos1
< ev
->type
->fields
.position
; pos1
++){
429 fld
= (field
*)ev
->type
->fields
.array
[pos1
];
431 if(td
->type
== ARRAY
){
432 fprintf(fp
,"%s * %s",getTypeStr(td
), fld
->name
);
433 }else if(td
->type
== STRING
){
434 fprintf(fp
,"short int strlength_%d, %s * %s",
435 ++strCount
, getTypeStr(td
), fld
->name
);
436 }else if(td
->type
== SEQUENCE
){
437 fprintf(fp
,"%s seqlength_%d, %s * %s",
438 uintOutputTypes
[td
->size
], ++seqCount
,getTypeStr(td
), fld
->name
);
439 }else fprintf(fp
,"%s %s",getTypeStr(td
), fld
->name
);
440 if(pos1
!= ev
->type
->fields
.position
- 1) fprintf(fp
,", ");
442 fprintf(fp
,")\n{\n");
444 //length of buffer : length of all structures
445 fprintf(fp
,"\tint length = ");
446 if(ev
->type
== 0) fprintf(fp
, "0");
448 for(pos1
=0;pos1
<structCount
;pos1
++){
449 fprintf(fp
,"sizeof(struct %s_%s_%d)",ev
->name
, facName
,pos1
+1);
450 if(pos1
!= structCount
-1) fprintf(fp
," + ");
453 //length of buffer : length of all arrays, sequences and strings
458 for(pos1
= 0; pos1
< ev
->type
->fields
.position
; pos1
++){
459 fld
= (field
*)ev
->type
->fields
.array
[pos1
];
461 if(td
->type
== SEQUENCE
|| td
->type
==STRING
|| td
->type
==ARRAY
){
462 if(structCount
|| flag
> 0) fprintf(fp
," + ");
463 if(td
->type
== SEQUENCE
)
464 fprintf(fp
,"sizeof(%s) + sizeof(%s) * seqlength_%d",
465 uintOutputTypes
[td
->size
], getTypeStr(td
), ++seqCount
);
466 else if(td
->type
==STRING
) fprintf(fp
,"strlength_%d + 1", ++strCount
);
467 else if(td
->type
==ARRAY
)
468 fprintf(fp
,"sizeof(%s) * %d", getTypeStr(td
),td
->size
);
469 if(structCount
== 0) flag
= 1;
475 // MD no more need. fprintf(fp,"\tchar buff[buflength];\n");
476 // write directly to the channel
477 fprintf(fp
, "\tunsigned int index;\n");
478 fprintf(fp
, "\tstruct ltt_channel_struct *channel;\n");
479 fprintf(fp
, "\tstruct ltt_trace_struct *trace;\n");
480 fprintf(fp
, "\tunsigned long _flags;\n");
481 fprintf(fp
, "\tvoid *buff;\n");
482 fprintf(fp
, "\tunsigned int header_length;\n");
483 fprintf(fp
, "\tunsigned int event_length;\n");
484 fprintf(fp
, "\tint resret;\n");
487 fprintf(fp
, "\tstruct %s_%s_1* __1;\n\n", ev
->name
, facName
);
489 fprintf(fp
, "\t/* Disable interrupts. */\n");
490 fprintf(fp
, "\tlocal_irq_save(_flags);\n");
491 fprintf(fp
, "\tpreempt_disable();\n\n");
493 fprintf(fp
, "\tltt_nesting[smp_processor_id()]++;\n");
494 fprintf(fp
, "\tif(ltt_nesting[smp_processor_id] > 1) goto unlock;\n");
495 fprintf(fp
, "\tspin_lock(<t_traces.locks[smp_processor_id()]);\n\n");
498 "\tif(ltt_traces.num_active_traces == 0) goto unlock_traces;\n\n");
501 "\tindex = ltt_get_index_from_facility(ltt_facility_%s_%X,\n"\
502 "\t\t\t\tevent_%s);\n",
503 facName
, checksum
, ev
->name
);
507 fprintf(fp
, "\tlist_for_each_entry(trace, <t_traces.head, list) {\n");
508 fprintf(fp
, "\t\tif(!trace->active) continue;\n\n");
510 fprintf(fp
, "\t\theader_length = "
511 "ltt_get_event_header_size(trace);\n");
512 fprintf(fp
, "\t\tevent_length = header_length + length;\n");
514 /* Reserve the channel */
515 fprintf(fp
, "\t\tchannel = ltt_get_channel_from_index(trace, index);\n");
516 fprintf(fp
, "\t\tbuff = relay_reserve(channel->rchan, event_length, &resret);\n");
517 fprintf(fp
, "\t\tif(buff == NULL) {\n");
518 fprintf(fp
, "\t\t\t/* Buffer is full*/\n");
519 fprintf(fp
, "\t\t\t/* for debug BUG(); */\n"); // DEBUG!
520 fprintf(fp
, "\t\t\tchannel->events_lost[smp_processor_id()]++;\n");
521 fprintf(fp
, "\t\t\tbreak;\n"); /* don't commit a NULL reservation! */
522 fprintf(fp
, "\t\t}\n");
525 fprintf(fp
, "\t\tif(resret == 1) {\n");
526 fprintf(fp
, "printk(\"f%%lu e\%%u \", ltt_facility_%s_%X, event_%s);",
527 facName
, checksum
, ev
->name
);
528 fprintf(fp
, "\t\t}\n");
530 /* Write the header */
532 fprintf(fp
, "\t\tltt_write_event_header(trace, channel, buff, \n"
533 "\t\t\t\tltt_facility_%s_%X, event_%s, length);\n",
534 facName
, checksum
, ev
->name
);
537 //declare a char pointer if needed : starts at the end of the structs.
538 if(structCount
+ hasStrSeq
> 1) {
539 fprintf(fp
,"\t\tchar * ptr = (char*)buff + header_length");
540 for(pos1
=0;pos1
<structCount
;pos1
++){
541 fprintf(fp
," + sizeof(struct %s_%s_%d)",ev
->name
, facName
,pos1
+1);
543 if(structCount
+ hasStrSeq
> 1) fprintf(fp
,";\n");
546 // Declare an alias pointer of the struct type to the beginning
547 // of the reserved area, just after the event header.
549 fprintf(fp
, "\t\t__1 = (struct %s_%s_1 *)(buff + header_length);\n",
551 //allocate memory for new struct and initialize it
552 //if(whichTypeFirst == 1){ //struct first
553 //for(pos1=0;pos1<structCount;pos1++){
554 // if(pos1==0) fprintf(fp,
555 // "\tstruct %s_%s_1 * __1 = (struct %s_%s_1 *)buff;\n",
556 // ev->name, facName,ev->name, facName);
557 //MD disabled else fprintf(fp,
558 // "\tstruct %s_%s_%d __%d;\n",
559 // ev->name, facName,pos1+1,pos1+1);
561 //}else if(whichTypeFirst == 2){
562 // for(pos1=0;pos1<structCount;pos1++)
563 // fprintf(fp,"\tstruct %s_%s_%d __%d;\n",
564 // ev->name, facName,pos1+1,pos1+1);
568 if(structCount
) fprintf(fp
,"\t\t//initialize structs\n");
572 for(pos1
= 0; pos1
< ev
->type
->fields
.position
; pos1
++){
573 fld
= (field
*)ev
->type
->fields
.array
[pos1
];
575 if(td
->type
!= ARRAY
&& td
->type
!= SEQUENCE
&& td
->type
!= STRING
){
579 // if(structCount > 1) fprintf(fp,"\n");
581 fprintf(fp
, "\t\t__1->%s = %s;\n", fld
->name
, fld
->name
);
583 //if(structCount == 1 && whichTypeFirst == 1)
584 // fprintf(fp, "\t__1->%s = %s;\n",fld->name,fld->name );
586 // fprintf(fp, "\t__%d.%s = %s;\n",structCount ,fld->name,fld->name);
590 if(structCount
) fprintf(fp
,"\n");
591 //set ptr to the end of first struct if needed;
592 if(structCount
+ hasStrSeq
> 1){
593 fprintf(fp
,"\n\t\t//set ptr to the end of the first struct\n");
594 fprintf(fp
,"\t\tptr += sizeof(struct %s_%s_1);\n\n",ev
->name
, facName
);
597 //copy struct, sequence and string to buffer
603 for(pos1
= 0; pos1
< ev
->type
->fields
.position
; pos1
++){
604 fld
= (field
*)ev
->type
->fields
.array
[pos1
];
606 // if(td->type != STRING && td->type != SEQUENCE && td->type != ARRAY){
607 // if(flag == 0) structCount++;
609 // if((structCount > 1 || whichTypeFirst == 2) && flag == 1){
610 // assert(0); // MD : disabled !
611 // fprintf(fp,"\t//copy struct to buffer\n");
612 // fprintf(fp,"\tmemcpy(ptr, &__%d, sizeof(struct %s_%s_%d));\n",
613 // structCount, ev->name, facName,structCount);
614 // fprintf(fp,"\tptr += sizeof(struct %s_%s_%d);\n\n",
615 // ev->name, facName,structCount);
618 //else if(td->type == SEQUENCE){
619 if(td
->type
== SEQUENCE
){
621 fprintf(fp
,"\t\t//copy sequence length and sequence to buffer\n");
622 fprintf(fp
,"\t\t*ptr = seqlength_%d;\n",++seqCount
);
623 fprintf(fp
,"\t\tptr += sizeof(%s);\n",uintOutputTypes
[td
->size
]);
624 fprintf(fp
,"\t\tmemcpy(ptr, %s, sizeof(%s) * seqlength_%d);\n",
625 fld
->name
, getTypeStr(td
), seqCount
);
626 fprintf(fp
,"\t\tptr += sizeof(%s) * seqlength_%d;\n\n",
627 getTypeStr(td
), seqCount
);
629 else if(td
->type
==STRING
){
631 fprintf(fp
,"\t\t//copy string to buffer\n");
632 fprintf(fp
,"\t\tif(strlength_%d > 0){\n",++strCount
);
633 fprintf(fp
,"\t\t\tmemcpy(ptr, %s, strlength_%d + 1);\n",
634 fld
->name
, strCount
);
635 fprintf(fp
,"\t\t\tptr += strlength_%d + 1;\n",strCount
);
636 fprintf(fp
,"\t\t}else{\n");
637 fprintf(fp
,"\t\t\t*ptr = '\\0';\n");
638 fprintf(fp
,"\t\t\tptr += 1;\n");
639 fprintf(fp
,"\t\t}\n\n");
640 }else if(td
->type
==ARRAY
){
642 fprintf(fp
,"\t//copy array to buffer\n");
643 fprintf(fp
,"\tmemcpy(ptr, %s, sizeof(%s) * %d);\n",
644 fld
->name
, getTypeStr(td
), td
->size
);
645 fprintf(fp
,"\tptr += sizeof(%s) * %d;\n\n", getTypeStr(td
), td
->size
);
648 if(structCount
+ seqCount
> 1) fprintf(fp
,"\n");
651 fprintf(fp
, "\t\t/* Commit the work */\n");
652 fprintf(fp
, "\t\trelay_commit(channel->rchan->buf[smp_processor_id()],\n"
653 "\t\t\t\tbuff, event_length);\n");
655 /* End of traces iteration */
656 fprintf(fp
, "\t}\n\n");
659 fprintf(fp
, "unlock_traces:\n");
660 fprintf(fp
, "\tread_unlock(<t_traces.traces_rwlock);\n");
662 fprintf(fp
, "unlock:\n");
663 fprintf(fp
, "\tltt_nesting[smp_processor_id()]--;\n");
664 fprintf(fp
, "\t/* Re-enable interrupts */\n");
665 fprintf(fp
, "\tlocal_irq_restore(_flags);\n");
666 fprintf(fp
, "\tpreempt_enable();\n");
667 //fprintf(fp, "\tpreempt_check_resched();\n");
669 //call trace function
670 //fprintf(fp,"\n\t//call trace function\n");
671 //fprintf(fp,"\tltt_log_event(ltt_facility_%s_%X, %s, bufLength, buff);\n",facName,checksum,ev->name);
672 fprintf(fp
,"}\n\n\n");
677 /*****************************************************************************
679 * getTypeStr : generate type string
681 * td : a type descriptor
683 * char * : type string
684 ****************************************************************************/
685 char * getTypeStr(type_descriptor
* td
){
686 type_descriptor
* t
;
690 return intOutputTypes
[td
->size
];
692 return uintOutputTypes
[td
->size
];
698 return "unsigned long";
706 return floatOutputTypes
[td
->size
];
710 return uintOutputTypes
[td
->size
];
716 return intOutputTypes
[t
->size
];
718 return uintOutputTypes
[t
->size
];
724 return "unsigned long";
732 return floatOutputTypes
[t
->size
];
736 return uintOutputTypes
[t
->size
];
738 error_callback(NULL
,"Nested struct is not supportted");
742 case STRUCT
: //for now we do not support nested struct
743 error_callback(NULL
,"Nested struct is not supportted");
746 error_callback(NULL
,"No type information");
752 /*****************************************************************************
754 * generateLoaderfile: generate a facility loaded .h file
756 * fp : file to be written to
757 * facName : name of facility
758 * nbEvent : number of events in the facility
759 * checksum : checksum for the facility
760 ****************************************************************************/
761 void generateLoaderfile(FILE * fp
, char * facName
, int nbEvent
, unsigned long checksum
, char *capname
){
762 fprintf(fp
, "#ifndef _LTT_FACILITY_LOADER_%s_H_\n",capname
);
763 fprintf(fp
, "#define _LTT_FACILITY_LOADER_%s_H_\n\n",capname
);
764 fprintf(fp
,"#include <linux/ltt-facilities.h>\n", facName
, checksum
);
765 fprintf(fp
,"ltt_facility_t\tltt_facility_%s;\n", facName
, checksum
);
766 fprintf(fp
,"ltt_facility_t\tltt_facility_%s_%X;\n\n", facName
, checksum
);
768 fprintf(fp
,"#define LTT_FACILITY_SYMBOL\t\t\t\t\t\t\tltt_facility_%s\n",
770 fprintf(fp
,"#define LTT_FACILITY_CHECKSUM_SYMBOL\t\tltt_facility_%s_%X\n",
772 fprintf(fp
,"#define LTT_FACILITY_CHECKSUM\t\t\t\t\t\t0x%X\n", checksum
);
773 fprintf(fp
,"#define LTT_FACILITY_NAME\t\t\t\t\t\t\t\t\"%s\"\n", facName
);
774 fprintf(fp
,"#define LTT_FACILITY_NUM_EVENTS\t\t\t\t\t%d\n\n", nbEvent
);
775 fprintf(fp
, "#endif //_LTT_FACILITY_LOADER_%s_H_\n",capname
);
778 void generateCfile(FILE * fp
, char * filefacname
){
781 fprintf(fp
, " * ltt-facility-loader-%s.c\n", filefacname
);
783 fprintf(fp
, " * (C) Copyright 2005 - \n");
784 fprintf(fp
, " * Mathieu Desnoyers (mathieu.desnoyers@polymtl.ca)\n");
786 fprintf(fp
, " * Contains the LTT facility loader.\n");
788 fprintf(fp
, " */\n");
791 fprintf(fp
, "#include <linux/ltt-facilities.h>\n");
792 fprintf(fp
, "#include <linux/module.h>\n");
793 fprintf(fp
, "#include <linux/init.h>\n");
794 fprintf(fp
, "#include <linux/config.h>\n");
795 fprintf(fp
, "#include \"ltt-facility-loader-%s.h\"\n", filefacname
);
798 fprintf(fp
, "#ifdef CONFIG_LTT\n");
800 fprintf(fp
, "EXPORT_SYMBOL(LTT_FACILITY_SYMBOL);\n");
801 fprintf(fp
, "EXPORT_SYMBOL(LTT_FACILITY_CHECKSUM_SYMBOL);\n");
803 fprintf(fp
, "static const char ltt_facility_name[] = LTT_FACILITY_NAME;\n");
805 fprintf(fp
, "#define SYMBOL_STRING(sym) #sym\n");
807 fprintf(fp
, "static struct ltt_facility facility = {\n");
808 fprintf(fp
, "\t.name = ltt_facility_name,\n");
809 fprintf(fp
, "\t.num_events = LTT_FACILITY_NUM_EVENTS,\n");
810 fprintf(fp
, "\t.checksum = LTT_FACILITY_CHECKSUM,\n");
811 fprintf(fp
, "\t.symbol = SYMBOL_STRING(LTT_FACILITY_SYMBOL)\n");
814 fprintf(fp
, "#ifndef MODULE\n");
816 fprintf(fp
, "/* Built-in facility. */\n");
818 fprintf(fp
, "static int __init facility_init(void)\n");
820 fprintf(fp
, "\tprintk(KERN_INFO \"LTT : ltt-facility-%s init in kernel\\n\");\n", filefacname
);
822 fprintf(fp
, "\tLTT_FACILITY_SYMBOL = ltt_facility_builtin_register(&facility);\n");
823 fprintf(fp
, "\tLTT_FACILITY_CHECKSUM_SYMBOL = LTT_FACILITY_SYMBOL;\n");
825 fprintf(fp
, "\treturn LTT_FACILITY_SYMBOL;\n");
827 fprintf(fp
, "__initcall(facility_init);\n");
831 fprintf(fp
, "#else \n");
833 fprintf(fp
, "/* Dynamic facility. */\n");
835 fprintf(fp
, "static int __init facility_init(void)\n");
837 fprintf(fp
, "\tprintk(KERN_INFO \"LTT : ltt-facility-%s init dynamic\\n\");\n", filefacname
);
839 fprintf(fp
, "\tLTT_FACILITY_SYMBOL = ltt_facility_dynamic_register(&facility);\n");
840 fprintf(fp
, "\tLTT_FACILITY_SYMBOL_CHECKSUM = LTT_FACILITY_SYMBOL;\n");
842 fprintf(fp
, "\treturn LTT_FACILITY_SYMBOL;\n");
845 fprintf(fp
, "static void __exit facility_exit(void)\n");
847 fprintf(fp
, "\tint err;\n");
849 fprintf(fp
, "\terr = ltt_facility_dynamic_unregister(LTT_FACILITY_SYMBOL);\n");
850 fprintf(fp
, "\tif(err != 0)\n");
851 fprintf(fp
, "\t\tprintk(KERN_ERR \"LTT : Error in unregistering facility.\\n\");\n");
855 fprintf(fp
, "module_init(facility_init)\n");
856 fprintf(fp
, "module_exit(facility_exit)\n");
859 fprintf(fp
, "MODULE_LICENSE(\"GPL\");\n");
860 fprintf(fp
, "MODULE_AUTHOR(\"Mathieu Desnoyers\");\n");
861 fprintf(fp
, "MODULE_DESCRIPTION(\"Linux Trace Toolkit Facility\");\n");
863 fprintf(fp
, "#endif //MODULE\n");
865 fprintf(fp
, "#endif //CONFIG_LTT\n");
This page took 0.060856 seconds and 4 git commands to generate.