summaryrefslogtreecommitdiff
path: root/cuobjdump_to_ptxplus/cuobjdump.l
diff options
context:
space:
mode:
Diffstat (limited to 'cuobjdump_to_ptxplus/cuobjdump.l')
-rw-r--r--cuobjdump_to_ptxplus/cuobjdump.l96
1 files changed, 96 insertions, 0 deletions
diff --git a/cuobjdump_to_ptxplus/cuobjdump.l b/cuobjdump_to_ptxplus/cuobjdump.l
new file mode 100644
index 0000000..fcd43f8
--- /dev/null
+++ b/cuobjdump_to_ptxplus/cuobjdump.l
@@ -0,0 +1,96 @@
+ /*Lex file for output of cuobjdump*/
+%{
+#include <stdio.h>
+#include <string.h>
+#include "cuobjdump_parser.h"
+
+#define YY_NEVER_INTERACTIVE 1
+
+#define YYDEBUG 1
+
+#define yylval cuobjdump_lval
+
+void cuobjdump_error(const char*);
+%}
+
+%option stack
+%option noyywrap
+%option yylineno
+
+%s ptxcode
+%s sasscode
+%s elfcode
+%s header
+%s endheader
+
+alpha [a-zA-Z]
+numeric [0-9]
+whitespace [ \t]
+newline [\n]
+notnewline [^\n]
+newlines {newline}+
+%%
+
+
+"ptxasOptions"{notnewline}*{newline}
+[1-9]{numeric}* yylval.string_value = strdup(yytext); return DECIMAL;
+
+
+"Fatbin ptx code:"{newline} {
+ yy_push_state(ptxcode);
+ yy_push_state(header);
+ yylval.string_value = strdup(yytext);
+ return PTXHEADER;
+}
+"Fatbin elf code:"{newline} {
+ yy_push_state(elfcode);
+ yy_push_state(header);
+ yylval.string_value = strdup(yytext);
+ return ELFHEADER;
+}
+ /*PTX code tokens*/
+<ptxcode>{notnewline}*{newline} yylval.string_value = strdup(yytext); return PTXLINE;
+
+ /*ELF code tokens*/
+<elfcode>{whitespace}*"code for sm_"{numeric}+{newline} {
+ BEGIN(sasscode);
+ yylval.string_value = strdup(yytext);
+ return SASSLINE;
+}
+<elfcode>{notnewline}*{newline} yylval.string_value = strdup(yytext); return ELFLINE;
+
+ /*SASS code tokens*/
+<sasscode>{notnewline}*{newline} yylval.string_value = strdup(yytext); return SASSLINE;
+
+ /*Header tokens*/
+<header>[[:alnum:]_]+ yylval.string_value = strdup(yytext); return IDENTIFIER;
+<header>"================" return H_SEPARATOR;
+<header>"arch = " return H_ARCH;
+<header>"code version = " return H_CODEVERSION;
+<header>\[{numeric},{numeric}\] return CODEVERSION;
+<header>"producer = " return H_PRODUCER;
+<header>"host = " return H_HOST;
+<header>"compile_size = " return H_COMPILESIZE;
+<header>"identifier = " BEGIN(endheader); return H_IDENTIFIER;
+<header>"has debug info"{newline}
+
+ /* Looking for the identifier (filename) then the header is done */
+<endheader>[[:alnum:]_\.]+{newline} yylval.string_value = strdup(yytext); yy_pop_state(); return FILENAME;
+
+
+{newline} return NEWLINE;
+
+ /*Reached end of file*/
+<<EOF>> return 0;
+
+ /*No other rule matched. Throw an error*/
+. cuobjdump_error("Invalid token");
+
+%%
+void cuobjdump_error(const char* message)
+{
+ printf(" "); printf(message); printf(" near \""); printf(yytext); printf("\"");
+ printf(" on line ");
+ char line[5]; sprintf(line, "%i", yylineno); printf(line);
+ printf("\n");
+}