Skip to content

Commit

Permalink
Add restrict specifier support for C
Browse files Browse the repository at this point in the history
  • Loading branch information
Ed94 committed Dec 17, 2024
1 parent 28aa2c4 commit 46e816d
Show file tree
Hide file tree
Showing 7 changed files with 38 additions and 11 deletions.
2 changes: 2 additions & 0 deletions base/components/gen/especifier.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ enum Specifier : u32
Spec_Ptr,
Spec_Ref,
Spec_Register,
Spec_Restrict,
Spec_RValue,
Spec_Static,
Spec_Thread_Local,
Expand Down Expand Up @@ -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 },
Expand Down
2 changes: 2 additions & 0 deletions base/components/gen/etoktype.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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 },
Expand Down
19 changes: 11 additions & 8 deletions base/components/parser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 )
{
Expand Down Expand Up @@ -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 );
Expand Down
7 changes: 7 additions & 0 deletions base/components/parser_case_macros.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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


1 change: 1 addition & 0 deletions base/enums/ESpecifier.csv
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ NeverInline, neverinline
Ptr, *
Ref, &
Register, register
Restrict, restrict
RValue, &&
Static, static
Thread_Local, thread_local
Expand Down
1 change: 1 addition & 0 deletions base/enums/ETokType.csv
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
17 changes: 14 additions & 3 deletions test/c_library/test_cuik.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down

0 comments on commit 46e816d

Please sign in to comment.