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