@@ -22,6 +22,13 @@ void add_annotation(Parser* p, const Node* n, ParsedAnnotation a) {
22
22
}
23
23
}
24
24
25
+ static const Node * assert_and_strip_fn_addr (const Node * fn ) {
26
+ assert (fn -> tag == FnAddr_TAG );
27
+ fn = fn -> payload .fn_addr .fn ;
28
+ assert (fn -> tag == Function_TAG );
29
+ return fn ;
30
+ }
31
+
25
32
void process_llvm_annotations (Parser * p , LLVMValueRef global ) {
26
33
IrArena * a = get_module_arena (p -> dst );
27
34
const Type * t = convert_type (p , LLVMGlobalGetValueType (global ));
@@ -51,40 +58,29 @@ void process_llvm_annotations(Parser* p, LLVMValueRef global) {
51
58
if (annotation_payload -> tag == GlobalVariable_TAG ) {
52
59
annotation_payload = annotation_payload -> payload .global_variable .init ;
53
60
}
54
- const char * ostr = get_string_literal (a , annotation_payload );
61
+
62
+ NodeResolveConfig resolve_config = default_node_resolve_config ();
63
+ // both of those assumptions are hacky but this front-end is a hacky deal anyways.
64
+ resolve_config .assume_globals_immutability = true;
65
+ resolve_config .allow_incompatible_types = true;
66
+ const char * ostr = get_string_literal (a , resolve_node_to_definition (annotation_payload , resolve_config ));
55
67
char * str = calloc (strlen (ostr ) + 1 , 1 );
56
68
memcpy (str , ostr , strlen (ostr ) + 1 );
57
69
if (strcmp (strtok (str , "::" ), "shady" ) == 0 ) {
58
70
const Node * target = entry -> payload .composite .contents .nodes [0 ];
59
- if (target -> tag == RefDecl_TAG ) {
60
- target = target -> payload .ref_decl .decl ;
61
- }
62
- while (target -> tag == Constant_TAG ) {
63
- const Node * instr = target -> payload .constant .instruction ;
64
- assert (instr -> tag == PrimOp_TAG );
65
- switch (instr -> payload .prim_op .op ) {
66
- case quote_op :
67
- case reinterpret_op :
68
- case convert_op :
69
- case lea_op : target = first (instr -> payload .prim_op .operands ); break ;
70
- default : assert (false);
71
- }
72
- }
73
- if (target -> tag == RefDecl_TAG ) {
74
- target = target -> payload .ref_decl .decl ;
75
- }
71
+ target = resolve_node_to_definition (target , resolve_config );
76
72
77
73
char * keyword = strtok (NULL , "::" );
78
74
if (strcmp (keyword , "entry_point" ) == 0 ) {
79
- assert ( target -> tag == Function_TAG );
75
+ target = assert_and_strip_fn_addr ( target );
80
76
add_annotation (p , target , (ParsedAnnotation ) {
81
77
.payload = annotation_value (a , (AnnotationValue ) {
82
78
.name = "EntryPoint" ,
83
79
.value = string_lit_helper (a , strtok (NULL , "::" ))
84
80
})
85
81
});
86
82
} else if (strcmp (keyword , "workgroup_size" ) == 0 ) {
87
- assert ( target -> tag == Function_TAG );
83
+ target = assert_and_strip_fn_addr ( target );
88
84
add_annotation (p , target , (ParsedAnnotation ) {
89
85
.payload = annotation_values (a , (AnnotationValues ) {
90
86
.name = "WorkgroupSize" ,
0 commit comments