- Timestamp:
- Jun 30, 2023, 1:48:33 PM (16 months ago)
- Branches:
- master
- Children:
- 4bae7b4
- Parents:
- c9019ce (diff), 48ee593 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- src/AST
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
src/AST/LinkageSpec.cpp
rc9019ce r599dc6a 27 27 namespace Linkage { 28 28 29 Spec update( CodeLocation loc, Spec spec, const std::string * cmd ) { 30 assert( cmd ); 31 std::unique_ptr<const std::string> guard( cmd ); // allocated by lexer 32 if ( *cmd == "\"Cforall\"" ) { 33 spec.is_mangled = true; 34 return spec; 35 } else if ( *cmd == "\"C\"" ) { 36 spec.is_mangled = false; 37 return spec; 38 } else { 39 SemanticError( loc, "Invalid linkage specifier " + *cmd ); 40 } 29 Spec update( CodeLocation loc, Spec spec, const std::string * cmd ) { 30 assert( cmd ); 31 std::unique_ptr<const std::string> guard( cmd ); // allocated by lexer 32 if ( *cmd == "\"Cforall\"" ) { 33 spec.is_mangled = true; 34 return spec; 35 } else if ( *cmd == "\"C\"" ) { 36 spec.is_mangled = false; 37 return spec; 38 } else { 39 SemanticError( loc, "Invalid linkage specifier " + *cmd ); 41 40 } 41 } 42 42 43 44 std::string name( Spec spec ) { 45 switch ( spec.val ) { 46 case Intrinsic.val: return "intrinsic"; 47 case C.val: return "C"; 48 case Cforall.val: return "Cforall"; 49 case AutoGen.val: return "autogenerated cfa"; 50 case Compiler.val: return "compiler built-in"; 51 case BuiltinCFA.val: return "cfa built-in"; 52 case BuiltinC.val: return "c built-in"; 53 default: return "<unnamed linkage spec>"; 54 } 43 std::string name( Spec spec ) { 44 switch ( spec.val ) { 45 case Intrinsic.val: return "intrinsic"; 46 case C.val: return "C"; 47 case Cforall.val: return "Cforall"; 48 case AutoGen.val: return "autogenerated cfa"; 49 case Compiler.val: return "compiler built-in"; 50 case BuiltinCFA.val: return "cfa built-in"; 51 case BuiltinC.val: return "c built-in"; 52 default: return "<unnamed linkage spec>"; 55 53 } 54 } 56 55 57 56 } -
src/AST/LinkageSpec.hpp
rc9019ce r599dc6a 25 25 namespace Linkage { 26 26 27 /// Bitflags for linkage specifiers 28 enum { 29 Mangle = 1 << 0, 30 Generate = 1 << 1, 31 Overrideable = 1 << 2, 32 Builtin = 1 << 3, 33 GccBuiltin = 1 << 4 27 /// Bitflags for linkage specifiers 28 enum { 29 Mangle = 1 << 0, 30 Generate = 1 << 1, 31 Overrideable = 1 << 2, 32 Builtin = 1 << 3, 33 GccBuiltin = 1 << 4 34 }; 35 36 /// Bitflag type for storage classes 37 struct spec_flags { 38 union { 39 unsigned int val; 40 struct { 41 bool is_mangled : 1; 42 bool is_generatable : 1; 43 bool is_overrideable : 1; 44 bool is_builtin : 1; 45 bool is_gcc_builtin : 1; 46 }; 34 47 }; 35 48 36 /// Bitflag type for storage classes 37 struct spec_flags { 38 union { 39 unsigned int val; 40 struct { 41 bool is_mangled : 1; 42 bool is_generatable : 1; 43 bool is_overrideable : 1; 44 bool is_builtin : 1; 45 bool is_gcc_builtin : 1; 46 }; 47 }; 49 constexpr spec_flags( unsigned int val ) : val(val) {} 50 }; 48 51 49 constexpr spec_flags( unsigned int val ) : val(val) {} 50 }; 52 using Spec = bitfield<spec_flags>; 51 53 52 using Spec = bitfield<spec_flags>; 54 /// If `cmd` = "C" returns `spec` with `is_mangled = false`. 55 /// If `cmd` = "Cforall" returns `spec` with `is_mangled = true`. 56 Spec update( CodeLocation loc, Spec spec, const std::string * cmd ); 53 57 54 /// If `cmd` = "C" returns `spec` with `is_mangled = false`. 55 /// If `cmd` = "Cforall" returns `spec` with `is_mangled = true`. 56 Spec update( CodeLocation loc, Spec spec, const std::string * cmd ); 58 /// A human-readable name for this spec 59 std::string name( Spec spec ); 57 60 58 /// A human-readable name for this spec 59 std::string name( Spec spec ); 61 // Pre-defined flag combinations 60 62 61 // Pre-defined flag combinations 63 /// C built-in defined in prelude 64 constexpr Spec Intrinsic = { Mangle | Generate | Overrideable | Builtin }; 65 /// Ordinary Cforall 66 constexpr Spec Cforall = { Mangle | Generate }; 67 /// C code: not overloadable, not mangled 68 constexpr Spec C = { Generate }; 69 /// Built by translator (e.g. struct assignment) 70 constexpr Spec AutoGen = { Mangle | Generate | Overrideable }; 71 /// GCC internal 72 constexpr Spec Compiler = { Mangle | Builtin | GccBuiltin }; 73 /// Mangled builtins 74 constexpr Spec BuiltinCFA = { Mangle | Generate | Builtin }; 75 /// Non-mangled builtins 76 constexpr Spec BuiltinC = { Generate | Builtin }; 62 77 63 /// C built-in defined in prelude64 constexpr Spec Intrinsic = { Mangle | Generate | Overrideable | Builtin };65 /// Ordinary Cforall66 constexpr Spec Cforall = { Mangle | Generate };67 /// C code: not overloadable, not mangled68 constexpr Spec C = { Generate };69 /// Built by translator (e.g. struct assignment)70 constexpr Spec AutoGen = { Mangle | Generate | Overrideable };71 /// GCC internal72 constexpr Spec Compiler = { Mangle | Builtin | GccBuiltin };73 /// Mangled builtins74 constexpr Spec BuiltinCFA = { Mangle | Generate | Builtin };75 /// Non-mangled builtins76 constexpr Spec BuiltinC = { Generate | Builtin };77 78 } 78 79
Note: See TracChangeset
for help on using the changeset viewer.