Add restrict specifier support for C

This commit is contained in:
Edward R. Gonzalez 2024-12-16 20:53:49 -05:00
parent 28aa2c4dec
commit 46e816d7ce
7 changed files with 38 additions and 11 deletions

View File

@ -23,6 +23,7 @@ enum Specifier : u32
Spec_Ptr,
Spec_Ref,
Spec_Register,
Spec_Restrict,
Spec_RValue,
Spec_Static,
Spec_Thread_Local,
@ -56,6 +57,7 @@ inline Str spec_to_str( Specifier type )
{ "*", sizeof( "*" ) - 1 },
{ "&", sizeof( "&" ) - 1 },
{ "register", sizeof( "register" ) - 1 },
{ "restrict", sizeof( "restrict" ) - 1 },
{ "&&", sizeof( "&&" ) - 1 },
{ "static", sizeof( "static" ) - 1 },
{ "thread_local", sizeof( "thread_local" ) - 1 },

View File

@ -83,6 +83,7 @@ enum TokType : u32
Tok_Spec_Mutable,
Tok_Spec_NeverInline,
Tok_Spec_Override,
Tok_Spec_Restrict,
Tok_Spec_Static,
Tok_Spec_ThreadLocal,
Tok_Spec_Volatile,
@ -188,6 +189,7 @@ inline Str toktype_to_str( TokType type )
{ "mutable", sizeof( "mutable" ) - 1 },
{ "neverinline", sizeof( "neverinline" ) - 1 },
{ "override", sizeof( "override" ) - 1 },
{ "restrict", sizeof( "restrict" ) - 1 },
{ "static", sizeof( "static" ) - 1 },
{ "thread_local", sizeof( "thread_local" ) - 1 },
{ "volatile", sizeof( "volatile" ) - 1 },

View File

@ -1217,9 +1217,9 @@ Code parse_complicated_definition( TokType which )
Token name = parse_identifier(nullptr);
_ctx->parser.Scope->Name = name.Text;
Code result = parse_variable_after_name(ModuleFlag_None, NullCode, NullCode, type, name.Text);
CodeVar result = parse_variable_after_name(ModuleFlag_None, NullCode, NullCode, type, name.Text);
parser_pop(& _ctx->parser);
return result;
return (Code) result;
}
else if ( tok.Type == Tok_Identifier && tokens.Arr[ idx - 3 ].Type == which )
{
@ -4719,13 +4719,16 @@ else if ( currtok.Type == Tok_DeclType )
{
Specifier spec = str_to_specifier( currtok.Text );
if ( spec != Spec_Const && spec != Spec_Ptr && spec != Spec_Ref && spec != Spec_RValue )
{
log_failure( "Error, invalid specifier used in type definition: %S\n%SB", currtok.Text, parser_to_strbuilder(_ctx->parser) );
parser_pop(& _ctx->parser);
return InvalidCode;
}
switch (spec ) {
GEN_PARSER_TYPENAME_ALLOWED_SUFFIX_SPECIFIER_CASES:
break;
default: {
log_failure( "Error, invalid specifier used in type definition: %S\n%SB", currtok.Text, parser_to_strbuilder(_ctx->parser) );
parser_pop(& _ctx->parser);
return InvalidCode;
}
}
specs_found[ NumSpecifiers ] = spec;
NumSpecifiers++;
eat( currtok.Type );

View File

@ -97,9 +97,16 @@ case Spec_Global: \
case Spec_Inline: \
case Spec_Local_Persist: \
case Spec_Mutable: \
case Spec_Restrict: \
case Spec_Static: \
case Spec_Thread_Local: \
case Spec_Volatile
#define GEN_PARSER_TYPENAME_ALLOWED_SUFFIX_SPECIFIER_CASES \
case Spec_Const: \
case Spec_Ptr: \
case Spec_Restrict: \
case Spec_Ref: \
case Spec_RValue

View File

@ -14,6 +14,7 @@ NeverInline, neverinline
Ptr, *
Ref, &
Register, register
Restrict, restrict
RValue, &&
Static, static
Thread_Local, thread_local

1 Invalid INVALID
14 Ptr *
15 Ref &
16 Register register
17 Restrict restrict
18 RValue &&
19 Static static
20 Thread_Local thread_local

View File

@ -72,6 +72,7 @@ Spec_LocalPersist, "local_persist"
Spec_Mutable, "mutable"
Spec_NeverInline, "neverinline"
Spec_Override, "override"
Spec_Restrict, "restrict"
Spec_Static, "static"
Spec_ThreadLocal, "thread_local"
Spec_Volatile, "volatile"

1 Invalid __invalid__
72 Spec_Mutable mutable
73 Spec_NeverInline neverinline
74 Spec_Override override
75 Spec_Restrict restrict
76 Spec_Static static
77 Spec_ThreadLocal thread_local
78 Spec_Volatile volatile

View File

@ -20,13 +20,24 @@ int main()
((gen_Macro){ txt("FOR_SUCC"), MT_Statement, MF_Functional })
));
gen_CodeBody h_passes = gen_parse_file("Cuik/tb/opt/passes.h");
gen_CodeBody h_passes = gen_parse_file("Cuik/tb/opt/passes.h\n");
for (gen_Code code = gen_iterator(CodeBody, h_passes, code)) switch (code->Type) {
case CT_Struct:
case CT_Function:
gen_log_fmt("%S:\t%S params: %S return type: %S\n"
, gen_codetype_to_str(code->Type)
, code->Name
, gen_strbuilder_to_str( gen_params_to_strbuilder( (gen_CodeParams) code->Params))
, gen_strbuilder_to_str( gen_typename_to_strbuilder((gen_CodeTypename) code->ReturnType))
);
break;
case CT_Variable:
gen_log_fmt("%S:\t%S Type: %S\n", gen_codetype_to_str(code->Type), code->Name, code->ValueType);
break;
case CT_Struct:
case CT_Typedef:
gen_log_fmt("%S: %S", gen_codetype_to_str(code->Type), code->Name);
gen_log_fmt("%S:\t%S\n", gen_codetype_to_str(code->Type), code->Name);
break;
}