summaryrefslogtreecommitdiff
path: root/libcuda/cuobjdump.y
blob: 0b20a83ab570e0ffc5a0f04c5b5f103ca0fcfd26 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
	/*Yacc file for output of cuobjdump*/
%{
#include <stdio.h>

int yylex(void);
void yyerror(const char*);
extern void addCuobjdumpSection(int sectiontype);
void setCuobjdumparch(const char* arch);
void setCuobjdumpidentifier(const char* identifier);
void setCuobjdumpptxfilename(const char* filename);
void setCuobjdumpelffilename(const char* filename);
void setCuobjdumpsassfilename(const char* filename);
int elfserial = 1;
int ptxserial = 1;
FILE *ptxfile;
FILE *elffile;
FILE *sassfile;
char filename [1024];
%}
%union {
	char* string_value;
}
%token <string_value> H_SEPARATOR H_ARCH H_CODEVERSION H_PRODUCER H_HOST H_COMPILESIZE H_IDENTIFIER
%token <string_value> CODEVERSION
%token <string_value> STRING
%token <string_value> FILENAME
%token <string_value> DECIMAL
%token <string_value> PTXHEADER ELFHEADER
%token <string_value> PTXLINE
%token <string_value> ELFLINE
%token <string_value> SASSLINE
%token <string_value> IDENTIFIER
%token <string_value> NEWLINE

%%

program :	emptylines section
		|	program section;

emptylines	:	emptylines NEWLINE
			|	;

section :	PTXHEADER {
				addCuobjdumpSection(0);
				snprintf(filename, 1024, "_cuobjdump_%d.ptx", ptxserial++);
				ptxfile = fopen(filename, "w");
				setCuobjdumpptxfilename(filename);
			} headerinfo ptxcode {
				fclose(ptxfile);
			}
		|	ELFHEADER {
				addCuobjdumpSection(1);
				snprintf(filename, 1024, "_cuobjdump_%d.elf", elfserial);
				elffile = fopen(filename, "w");
				setCuobjdumpelffilename(filename);
			} headerinfo elfcode { 
				fclose(elffile);
				snprintf(filename, 1024, "_cuobjdump_%d.sass", elfserial++);
				sassfile = fopen(filename, "w");
				setCuobjdumpsassfilename(filename);
			} sasscode { 
				fclose(sassfile);
			};

headerinfo :	H_SEPARATOR NEWLINE
				H_ARCH IDENTIFIER NEWLINE
				H_CODEVERSION CODEVERSION NEWLINE
				H_PRODUCER IDENTIFIER NEWLINE
				H_HOST IDENTIFIER NEWLINE
				H_COMPILESIZE IDENTIFIER NEWLINE
				H_IDENTIFIER FILENAME {setCuobjdumparch($4); setCuobjdumpidentifier($19);};

ptxcode :	ptxcode PTXLINE {fprintf(ptxfile, "%s", $2);}
		|	;

elfcode :	elfcode ELFLINE {fprintf(elffile, "%s", $2);}
		|	;

sasscode :	sasscode SASSLINE {fprintf(sassfile, "%s", $2)}
		 |	;


%%