@@ -36,9 +36,16 @@ def memoized(self, *args):
36
36
class DebugInfoEmitter :
37
37
def __init__ (self , llmodule ):
38
38
self .llmodule = llmodule
39
- self .llsubprograms = []
39
+ self .llcompileunit = None
40
40
self .cache = {}
41
41
42
+ llident = self .llmodule .add_named_metadata ('llvm.ident' )
43
+ llident .add (self .emit_metadata (["ARTIQ" ]))
44
+
45
+ llflags = self .llmodule .add_named_metadata ('llvm.module.flags' )
46
+ llflags .add (self .emit_metadata ([2 , "Debug Info Version" , 3 ]))
47
+ llflags .add (self .emit_metadata ([2 , "Dwarf Version" , 4 ]))
48
+
42
49
def emit_metadata (self , operands ):
43
50
def map_operand (operand ):
44
51
if operand is None :
@@ -66,14 +73,13 @@ def emit_file(self, source_buffer):
66
73
})
67
74
68
75
@memoize
69
- def emit_compile_unit (self , source_buffer , llsubprograms ):
76
+ def emit_compile_unit (self , source_buffer ):
70
77
return self .emit_debug_info ("DICompileUnit" , {
71
78
"language" : ll .DIToken ("DW_LANG_Python" ),
72
79
"file" : self .emit_file (source_buffer ),
73
80
"producer" : "ARTIQ" ,
74
81
"runtimeVersion" : 0 ,
75
82
"emissionKind" : 2 , # full=1, lines only=2
76
- "subprograms" : self .emit_metadata (llsubprograms )
77
83
}, is_distinct = True )
78
84
79
85
@memoize
@@ -85,21 +91,26 @@ def emit_subroutine_type(self, typ):
85
91
@memoize
86
92
def emit_subprogram (self , func , llfunc ):
87
93
source_buffer = func .loc .source_buffer
94
+
95
+ if self .llcompileunit is None :
96
+ self .llcompileunit = self .emit_compile_unit (source_buffer )
97
+ llcompileunits = self .llmodule .add_named_metadata ('llvm.dbg.cu' )
98
+ llcompileunits .add (self .llcompileunit )
99
+
88
100
display_name = "{}{}" .format (func .name , types .TypePrinter ().name (func .type ))
89
- llsubprogram = self .emit_debug_info ("DISubprogram" , {
101
+ return self .emit_debug_info ("DISubprogram" , {
90
102
"name" : func .name ,
91
103
"linkageName" : llfunc .name ,
92
104
"type" : self .emit_subroutine_type (func .type ),
93
105
"file" : self .emit_file (source_buffer ),
94
106
"line" : func .loc .line (),
107
+ "unit" : self .llcompileunit ,
95
108
"scope" : self .emit_file (source_buffer ),
96
109
"scopeLine" : func .loc .line (),
97
110
"isLocal" : func .is_internal ,
98
111
"isDefinition" : True ,
99
112
"variables" : self .emit_metadata ([])
100
113
}, is_distinct = True )
101
- self .llsubprograms .append (llsubprogram )
102
- return llsubprogram
103
114
104
115
@memoize
105
116
def emit_loc (self , loc , scope ):
@@ -109,18 +120,6 @@ def emit_loc(self, loc, scope):
109
120
"scope" : scope
110
121
})
111
122
112
- def finalize (self , source_buffer ):
113
- llident = self .llmodule .add_named_metadata ('llvm.ident' )
114
- llident .add (self .emit_metadata (["ARTIQ" ]))
115
-
116
- llflags = self .llmodule .add_named_metadata ('llvm.module.flags' )
117
- llflags .add (self .emit_metadata ([2 , "Debug Info Version" , 3 ]))
118
- llflags .add (self .emit_metadata ([2 , "Dwarf Version" , 4 ]))
119
-
120
- llcompile_units = self .llmodule .add_named_metadata ('llvm.dbg.cu' )
121
- llcompile_units .add (self .emit_compile_unit (source_buffer , tuple (self .llsubprograms )))
122
-
123
-
124
123
class LLVMIRGenerator :
125
124
def __init__ (self , engine , module_name , target , embedding_map ):
126
125
self .engine = engine
@@ -407,9 +406,6 @@ def process(self, functions, attribute_writeback):
407
406
for func in functions :
408
407
self .process_function (func )
409
408
410
- if any (functions ):
411
- self .debug_info_emitter .finalize (functions [0 ].loc .source_buffer )
412
-
413
409
if attribute_writeback and self .embedding_map is not None :
414
410
self .emit_attribute_writeback ()
415
411
0 commit comments