Skip to content

Commit fe8e91f

Browse files
trbauergfxbot
authored andcommitted
* replaces various constructs that use shadey (extremely complex)
lexical patterns with a robust string literals supporting most C/C++ ASCII escape sequences (n.b. 0 will pre-terminate the string, so don't use this to store binary data) * string literals are limited to 4095 characters (we raise a lexical error if this is exceeded) * replaces bison immediate literals with explicit lexical tokens so all tokens trace the same (and for consistency) * some other lexical and syntax simplification * updates formatter to emit consistent syntax * replaces "AsmName" kernel attribute with clearer "OutputAsmPath" (indicating it can be a full path Change-Id: I2ed771f43055c12fe17bbefd79843969a914c170
1 parent fa41656 commit fe8e91f

File tree

10 files changed

+276
-229
lines changed

10 files changed

+276
-229
lines changed

IGC/Compiler/CISACodeGen/CISABuilder.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4037,12 +4037,12 @@ void CEncoder::InitEncoder( bool canAbortOnSpill, bool hasStackCall )
40374037
}
40384038

40394039
std::string asmName = GetDumpFileName("asm");
4040-
V(vKernel->AddKernelAttribute("AsmName", asmName.length(), asmName.c_str()));
4040+
V(vKernel->AddKernelAttribute("OutputAsmPath", asmName.length(), asmName.c_str()));
40414041
}
40424042
else
40434043
{
40444044
V(vbuilder->AddKernel(vKernel, "kernel"));
4045-
V(vKernel->AddKernelAttribute("AsmName", std::strlen("0.asm") , "0.asm"));
4045+
V(vKernel->AddKernelAttribute("OutputAsmPath", std::strlen("0.asm") , "0.asm"));
40464046
}
40474047

40484048
vMainKernel = vKernel;

visa/BuildCISAIR.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,8 +183,8 @@ class CISA_IR_Builder : public VISABuilder
183183
bool CISA_implicit_input_directive(char * argName, char * varName, short offset, unsigned short size, int line_no);
184184

185185
//bool CISA_attr_directive(char* input_name, attribute_info_t* attr);
186-
bool CISA_attr_directive(char* input_name, char* input_var, int line_no);
187-
bool CISA_attr_directiveNum(char* input_name, uint32_t input_var, int line_no);
186+
bool CISA_attr_directive(const char* input_name, const char* input_var, int line_no);
187+
bool CISA_attr_directiveNum(const char* input_name, uint32_t input_var, int line_no);
188188

189189
bool CISA_create_label(char * label_name, int line_no);
190190
bool CISA_function_directive(char* func_name);

visa/BuildCISAIRImpl.cpp

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1226,11 +1226,15 @@ bool CISA_IR_Builder::CISA_input_directive(char* var_name, short offset, unsigne
12261226
return true;
12271227
}
12281228

1229-
bool CISA_IR_Builder::CISA_attr_directive(char* input_name, char* input_var, int line_no)
1229+
bool CISA_IR_Builder::CISA_attr_directive(
1230+
const char* input_name, const char* input_var, int line_no)
12301231
{
12311232

1232-
if(strcmp(input_name, "AsmName" ) == 0)
1233+
if(strcmp(input_name, "AsmName") == 0 ||
1234+
strcmp(input_name, "OutputAsmPath") == 0)
12331235
{
1236+
input_name = "OutputAsmPath"; // normalize to new name
1237+
12341238
char asmFileName[MAX_OPTION_STR_LENGTH];
12351239

12361240
strncpy_s(asmFileName, MAX_OPTION_STR_LENGTH, input_var, MAX_OPTION_STR_LENGTH-1);
@@ -1242,46 +1246,38 @@ bool CISA_IR_Builder::CISA_attr_directive(char* input_name, char* input_var, int
12421246
m_options.setOptionInternally(VISA_AsmFileName, asmFileName);
12431247
}
12441248

1245-
if(strcmp(input_name, "Target" ) == 0){
1249+
if(strcmp(input_name, "Target") == 0){
12461250
unsigned char visa_target;
1247-
if(strcmp(input_var, "cm" ) == 0)
1251+
if(strcmp(input_var, "cm") == 0)
12481252
{
12491253
visa_target = VISA_CM;
12501254
}
1251-
else if(strcmp(input_var, "3d" ) == 0)
1255+
else if(strcmp(input_var, "3d") == 0)
12521256
{
12531257
visa_target = VISA_3D;
12541258
}
1255-
else if(strcmp(input_var, "cs" ) == 0)
1259+
else if(strcmp(input_var, "cs") == 0)
12561260
{
12571261
visa_target = VISA_CS;
12581262
}
12591263
else
12601264
{
1261-
MUST_BE_TRUE1(false, line_no, "Invalid kernel target attribute.");
1265+
MUST_BE_TRUE1(false, line_no, "invalid kernel target attribute");
12621266
}
12631267
m_kernel->AddKernelAttribute(input_name, 1, &visa_target);
12641268
}
12651269
else
12661270
{
1267-
m_kernel->AddKernelAttribute(input_name, input_var == nullptr ? 0 : (int)strlen(input_var), input_var);
1271+
m_kernel->AddKernelAttribute(input_name,
1272+
input_var == nullptr ? 0 : (int)strlen(input_var), input_var);
12681273
}
12691274

12701275
return true;
12711276
}
12721277

1273-
bool CISA_IR_Builder::CISA_attr_directiveNum(char* input_name, uint32_t input_var, int line_no)
1278+
bool CISA_IR_Builder::CISA_attr_directiveNum(
1279+
const char* input_name, uint32_t input_var, int line_no)
12741280
{
1275-
/*
1276-
attribute_info_t* attr = (attribute_info_t*)m_mem.alloc(sizeof(attribute_info_t));
1277-
1278-
attr->value.stringVal = (char *)m_mem.alloc(sizeof(char));
1279-
*attr->value.stringVal = input_var;
1280-
attr->size = sizeof(unsigned char);
1281-
1282-
m_kernel->addAttribute(input_name, attr);
1283-
*/
1284-
12851281
m_kernel->AddKernelAttribute(input_name, sizeof(uint32_t), &input_var);
12861282
return true;
12871283
}

visa/CISA.l

Lines changed: 89 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ AVSExecMode avsExecMode(const char* str);
6464
unsigned char FENCEOptions(const char *str);
6565
COMMON_ISA_VME_OP_MODE VMEType(const char *str);
6666
Common_VISA_EMask_Ctrl Get_CISA_Emask(const char* str);
67-
char *get_kernel_name(const char *str, int str_len);
6867
CHANNEL_OUTPUT_FORMAT Get_Channel_Output(const char* str);
68+
static void appendStringLiteralChar(char c, char *buf, size_t *len);
6969

7070
static int pendingBracket;
7171

@@ -78,6 +78,7 @@ static int pendingBracket;
7878
%option yylineno
7979

8080
%x eat_comment
81+
%x string_literal
8182

8283
%%
8384

@@ -95,19 +96,91 @@ static int pendingBracket;
9596
return COMMENT_LINE;
9697
}
9798

98-
"/*" BEGIN(eat_comment);
99+
"/*" BEGIN(eat_comment);
99100
<eat_comment>[^*]* /* eat anything that is not a * */
100101
<eat_comment>"*"+[^*/]* /* eat up '*'s not followed by '/'s */
101102
<eat_comment>"*"+"/" BEGIN(INITIAL);
102103

104+
105+
\" {CISAlval.strlit.len = 0; CISAlval.strlit.decoded[0] = 0; BEGIN(string_literal);}
106+
<string_literal>{
107+
\n YY_FATAL_ERROR("lexical error: newline in string literal");
108+
<<EOF>> YY_FATAL_ERROR("lexical error: unterminated string (reached EOF)");
109+
\\a {appendStringLiteralChar('\a',CISAlval.strlit.decoded,&CISAlval.strlit.len);}
110+
\\b {appendStringLiteralChar('\b',CISAlval.strlit.decoded,&CISAlval.strlit.len);}
111+
\\e {appendStringLiteralChar(0x1B,CISAlval.strlit.decoded,&CISAlval.strlit.len);}
112+
\\f {appendStringLiteralChar('\f',CISAlval.strlit.decoded,&CISAlval.strlit.len);}
113+
\\n {appendStringLiteralChar('\n',CISAlval.strlit.decoded,&CISAlval.strlit.len);}
114+
\\r {appendStringLiteralChar('\r',CISAlval.strlit.decoded,&CISAlval.strlit.len);}
115+
\\t {appendStringLiteralChar('\t',CISAlval.strlit.decoded,&CISAlval.strlit.len);}
116+
\\v {appendStringLiteralChar('\v',CISAlval.strlit.decoded,&CISAlval.strlit.len);}
117+
\\"'" {appendStringLiteralChar('\'',CISAlval.strlit.decoded,&CISAlval.strlit.len);}
118+
\\"\"" {appendStringLiteralChar('\"',CISAlval.strlit.decoded,&CISAlval.strlit.len);}
119+
\\"?" {appendStringLiteralChar('?',CISAlval.strlit.decoded,&CISAlval.strlit.len);}
120+
\\\\ {appendStringLiteralChar('\\',CISAlval.strlit.decoded,&CISAlval.strlit.len);}
121+
\\[0-9]{1,3} {
122+
int val = 0;
123+
for (int i = 1; i < yyleng; i++)
124+
val = 8*val + yytext[i] - '0';
125+
appendStringLiteralChar(val,CISAlval.strlit.decoded,&CISAlval.strlit.len);
126+
}
127+
\\x[0-9A-Fa-f]{1,2} {
128+
int val = 0;
129+
for (int i = 2; i < yyleng; i++) {
130+
int dig =
131+
yytext[i] >= '0' && yytext[i] <= '9' ? yytext[i] - '0' :
132+
yytext[i] >= 'a' && yytext[i] <= 'f' ? yytext[i] - 'a' + 10 :
133+
yytext[i] - 'A' + 10;
134+
val = 16*val + dig;
135+
}
136+
appendStringLiteralChar(val,CISAlval.strlit.decoded,&CISAlval.strlit.len);
137+
}
138+
\\. YY_FATAL_ERROR("lexical error: illegal escape sequence");
139+
\" {CISAlval.string = strdup(CISAlval.strlit.decoded); BEGIN(INITIAL); return STRING_LITERAL;}
140+
. {
141+
/* important: this must succeed the exit rule above (\"); lex prefers the first match */
142+
appendStringLiteralChar(yytext[0],CISAlval.strlit.decoded,&CISAlval.strlit.len);
143+
}
144+
}
145+
146+
103147
"*" {TRACE("\n** TIMES "); return TIMES;}
104148
"+" {TRACE("\n** PLUS "); return PLUS;}
105149
"-" {TRACE("\n** MINUS "); return MINUS;}
150+
"=" {TRACE("\n** EQUALS "); return EQUALS;}
151+
"&" {TRACE("\n** AMP "); return AMP;}
152+
"~" {TRACE("\n** TILDE "); return TILDE;}
153+
"!" {TRACE("\n** BANG "); return BANG;}
154+
155+
"." {TRACE("\n** COLON "); return DOT;}
156+
"," {TRACE("\n** COMMA "); return COMMA;}
157+
";" {TRACE("\n** SEMI "); return SEMI;}
158+
":" {TRACE("\n** COLON "); return COLON;}
159+
"/" {TRACE("\n** SLASH"); return SLASH;}
160+
106161
"(" {TRACE("\n** LPAREN "); return LPAREN;}
107162
")" {TRACE("\n** RPAREN "); return RPAREN;}
108163
"{" {TRACE("\n** LBRACE "); return LBRACE;}
109164
"}" {TRACE("\n** RBRACE "); return RBRACE;}
110-
"," {TRACE("\n** COMMA "); return COMMA;}
165+
"<" {TRACE("\n** LANGLE "); return LANGLE;}
166+
">" {TRACE("\n** RANGLE "); return RANGLE;}
167+
"r[" {
168+
TRACE("\n** Register Indirect LEFT bracket");
169+
CISAlval.string = strdup(yytext);
170+
return IND_LBRACK;
171+
}
172+
"[" {
173+
TRACE("\n** LEFT bracket");
174+
CISAlval.string = strdup(yytext);
175+
return LBRACK;
176+
}
177+
178+
"]" {
179+
TRACE("\n** RIGHT bracket");
180+
CISAlval.string = strdup(yytext);
181+
return RBRACK;
182+
}
183+
111184

112185
".version" {TRACE("\n** VERSION "); return DIRECTIVE_VERSION;}
113186
".entry" {TRACE("\n** ENTRY "); return DIRECTIVE_ENTRY;}
@@ -122,6 +195,8 @@ static int pendingBracket;
122195
".function" {TRACE("\n** FUNCTION "); return DIRECTIVE_FUNC;}
123196
".global_function" {TRACE("\n** GLOBAL FUNCTION "); return DIRECTIVE_GLOBAL_FUNC;}
124197
".resolvedIndex" {TRACE("\n** RESOLVED INDEX "); return DIRECTIVE_RESOLVED_INDEX;}
198+
".kernel" {TRACE("\n** KERNEL NAME DIRECTIVE "); return DOT_KERNEL;}
199+
".function" {TRACE("\n** FUNCTION NAME DIRECTIVE ");return DOT_FUNCTION;}
125200

126201
"."implicit[a-zA-Z0-9_\-$@?]* {
127202
TRACE("\n** IMPLICIT_INPUT ");
@@ -600,7 +675,6 @@ CM_AVS_(4|8|16)x(4|8) {
600675
return DOUBLEFLOAT;
601676
}
602677

603-
qAsmName[ ]*=[ ]* {TRACE("\n** File name of assembly "); CISAlval.string = "AsmName"; return ASM_NAME;}
604678
qSLMSize[ ]*=[ ]* {TRACE("\n** File name of assembly "); CISAlval.string = "SLMSize"; return SLM_SIZE;}
605679

606680
qFlagRegNum[ ]*=[ ]* {TRACE("\n** Flag regisetr number "); CISAlval.string = "FlagRegNum"; return FLAG_REG_NAME;}
@@ -622,42 +696,6 @@ size[ ]*=[ ]* {TRACE("\n** Size "); return SIZE;}
622696
alias[ ]*=[ ]* {TRACE("\n** ALIAS "); return ALIAS;}
623697

624698

625-
[a-zA-Z_.][a-zA-Z0-9_\-$\\:/.]*"."cpp {
626-
TRACE("\n** CPP File Name ");
627-
CISAlval.string = strdup(yytext);
628-
return CPP_FILE_NAME;
629-
}
630-
631-
[a-zA-Z_.][a-zA-Z0-9_\-$\\:/.]*"."h {
632-
TRACE("\n** H File Name ");
633-
CISAlval.string = strdup(yytext);
634-
return H_FILE_NAME;
635-
}
636-
637-
[a-zA-Z_][a-zA-Z0-9_\-$\\:/.]*"."asm {
638-
TRACE("\n** Assemble File Name ");
639-
CISAlval.asm_name = strdup(yytext);
640-
return ASM_FILE_NAME;
641-
}
642-
643-
"cm" {
644-
TRACE("\n** cm attribute ");
645-
CISAlval.asm_name = strdup(yytext);
646-
return ATTR_CM;
647-
}
648-
649-
"3d" {
650-
TRACE("\n** 3d attribute ");
651-
CISAlval.asm_name = strdup(yytext);
652-
return ATTR_3D;
653-
}
654-
655-
"cs" {
656-
TRACE("\n** cs attribute ");
657-
CISAlval.asm_name = strdup(yytext);
658-
return ATTR_CS;
659-
}
660-
661699
v_type[ ]*=[ ]*F {
662700
TRACE("\n** General variable type");
663701
CISAlval.string = strdup(yytext);
@@ -792,22 +830,6 @@ M1|M2|M3|M4|M5|M6|M7|M8|M1_NM|M2_NM|M3_NM|M4_NM|M5_NM|M6_NM|M7_NM|M8_NM|NoMask {
792830
}
793831

794832

795-
"r[" {
796-
TRACE("\n** Register Indirect LEFT bracket");
797-
CISAlval.string = strdup(yytext);
798-
return IND_LEFT_BRACKET;
799-
}
800-
"[" {
801-
TRACE("\n** LEFT bracket");
802-
CISAlval.string = strdup(yytext);
803-
return LEFT_BRACKET;
804-
}
805-
806-
"]" {
807-
TRACE("\n** RIGHT bracket");
808-
CISAlval.string = strdup(yytext);
809-
return RIGHT_BRACKET;
810-
}
811833

812834

813835
"."((R|r)((G|g)?(B|b)?(A|a)?)|(G|g)((B|b)?(A|a)?)|(B|b)((A|a)?)|(A|a)) {
@@ -846,30 +868,21 @@ M1|M2|M3|M4|M5|M6|M7|M8|M1_NM|M2_NM|M3_NM|M4_NM|M5_NM|M6_NM|M7_NM|M8_NM|NoMask {
846868
return PRED_CNTL;
847869
}
848870

849-
^"."kernel[ \t]+[a-zA-Z][a-zA-Z0-9_\,\- <>]*[ \t]* {
850-
TRACE("\n** KERNEL NAME ");
851-
CISAlval.string = get_kernel_name(yytext, yyleng);
852-
return K_NAME;
853-
}
854871

855872
V0 {
856873
TRACE("\n** NULL VAR ");
857874
CISAlval.string = strdup(yytext);
858875
return NULL_VAR;
859876
}
860877

861-
[a-zA-Z][a-zA-Z0-9_\-]* {
878+
[a-zA-Z][a-zA-Z0-9_]* {
862879
TRACE("\n** VAR ");
863880
CISAlval.string = strdup(yytext);
864881
return VAR;
865882
}
866883

867884

868-
[a-zA-Z_$@\?][a-zA-Z0-9_\-$@\?]* {
869-
TRACE("\n** FUNCTION NAME ");
870-
CISAlval.string = strdup(yytext);
871-
return F_NAME;
872-
}
885+
873886

874887

875888
[^ \t\n] {TRACE("\n** SPACE END"); return *yytext;}
@@ -1150,3 +1163,12 @@ CHANNEL_OUTPUT_FORMAT Get_Channel_Output(const char* str)
11501163
YY_FATAL_ERROR(str);
11511164
return CHANNEL_16_BIT_FULL;
11521165
}
1166+
1167+
static void appendStringLiteralChar(char c, char *buf, size_t *len)
1168+
{
1169+
if (*len == sizeof(CISAlval.strlit)) {
1170+
YY_FATAL_ERROR("string literal too long");
1171+
}
1172+
buf[(*len)++] = c;
1173+
buf[*len] = 0;
1174+
}

0 commit comments

Comments
 (0)