@@ -11,7 +11,7 @@ use self::utils::{create_DIArray, is_node_local_to_unit, span_start, DIB};
11
11
12
12
use crate :: llvm;
13
13
use crate :: llvm:: debuginfo:: {
14
- DIArray , DIBuilder , DIFile , DIFlags , DILexicalBlock , DISPFlags , DIScope , DIType ,
14
+ DIArray , DIBuilder , DIFile , DIFlags , DILexicalBlock , DISPFlags , DIScope , DIType , DIVariable ,
15
15
} ;
16
16
use rustc:: middle:: codegen_fn_attrs:: CodegenFnAttrFlags ;
17
17
use rustc:: ty:: subst:: { GenericArgKind , SubstsRef } ;
@@ -143,33 +143,23 @@ pub fn finalize(cx: &CodegenCx<'_, '_>) {
143
143
} ;
144
144
}
145
145
146
- impl DebugInfoBuilderMethods < ' tcx > for Builder < ' a , ' ll , ' tcx > {
147
- fn declare_local (
146
+ impl DebugInfoBuilderMethods for Builder < ' a , ' ll , ' tcx > {
147
+ // FIXME(eddyb) find a common convention for all of the debuginfo-related
148
+ // names (choose between `dbg`, `debug`, `debuginfo`, `debug_info` etc.).
149
+ fn dbg_var_addr (
148
150
& mut self ,
149
151
dbg_context : & FunctionDebugContext < & ' ll DIScope > ,
150
- variable_name : ast:: Name ,
151
- variable_type : Ty < ' tcx > ,
152
+ dbg_var : & ' ll DIVariable ,
152
153
scope_metadata : & ' ll DIScope ,
153
154
variable_alloca : Self :: Value ,
154
155
direct_offset : Size ,
155
156
indirect_offsets : & [ Size ] ,
156
- variable_kind : VariableKind ,
157
157
span : Span ,
158
158
) {
159
159
assert ! ( !dbg_context. source_locations_enabled) ;
160
160
let cx = self . cx ( ) ;
161
161
162
- let file = span_start ( cx, span) . file ;
163
- let file_metadata = file_metadata ( cx, & file. name , dbg_context. defining_crate ) ;
164
-
165
162
let loc = span_start ( cx, span) ;
166
- let type_metadata = type_metadata ( cx, variable_type, span) ;
167
-
168
- let ( argument_index, dwarf_tag) = match variable_kind {
169
- ArgumentVariable ( index) => ( index as c_uint , DW_TAG_arg_variable ) ,
170
- LocalVariable => ( 0 , DW_TAG_auto_variable ) ,
171
- } ;
172
- let align = cx. align_of ( variable_type) ;
173
163
174
164
// Convert the direct and indirect offsets to address ops.
175
165
let op_deref = || unsafe { llvm:: LLVMRustDIBuilderCreateOpDeref ( ) } ;
@@ -188,32 +178,19 @@ impl DebugInfoBuilderMethods<'tcx> for Builder<'a, 'll, 'tcx> {
188
178
}
189
179
}
190
180
191
- let name = SmallCStr :: new ( & variable_name. as_str ( ) ) ;
192
- let metadata = unsafe {
193
- llvm:: LLVMRustDIBuilderCreateVariable (
194
- DIB ( cx) ,
195
- dwarf_tag,
196
- scope_metadata,
197
- name. as_ptr ( ) ,
198
- file_metadata,
199
- loc. line as c_uint ,
200
- type_metadata,
201
- cx. sess ( ) . opts . optimize != config:: OptLevel :: No ,
202
- DIFlags :: FlagZero ,
203
- argument_index,
204
- align. bytes ( ) as u32 ,
205
- )
206
- } ;
181
+ // FIXME(eddyb) maybe this information could be extracted from `var`,
182
+ // to avoid having to pass it down in both places?
207
183
source_loc:: set_debug_location (
208
184
self ,
209
185
InternalDebugLocation :: new ( scope_metadata, loc. line , loc. col . to_usize ( ) ) ,
210
186
) ;
211
187
unsafe {
212
188
let debug_loc = llvm:: LLVMGetCurrentDebugLocation ( self . llbuilder ) ;
189
+ // FIXME(eddyb) replace `llvm.dbg.declare` with `llvm.dbg.addr`.
213
190
let instr = llvm:: LLVMRustDIBuilderInsertDeclareAtEnd (
214
191
DIB ( cx) ,
215
192
variable_alloca,
216
- metadata ,
193
+ dbg_var ,
217
194
addr_ops. as_ptr ( ) ,
218
195
addr_ops. len ( ) as c_uint ,
219
196
debug_loc,
@@ -558,4 +535,45 @@ impl DebugInfoMethods<'tcx> for CodegenCx<'ll, 'tcx> {
558
535
fn debuginfo_finalize ( & self ) {
559
536
finalize ( self )
560
537
}
538
+
539
+ // FIXME(eddyb) find a common convention for all of the debuginfo-related
540
+ // names (choose between `dbg`, `debug`, `debuginfo`, `debug_info` etc.).
541
+ fn create_dbg_var (
542
+ & self ,
543
+ dbg_context : & FunctionDebugContext < & ' ll DIScope > ,
544
+ variable_name : ast:: Name ,
545
+ variable_type : Ty < ' tcx > ,
546
+ scope_metadata : & ' ll DIScope ,
547
+ variable_kind : VariableKind ,
548
+ span : Span ,
549
+ ) -> & ' ll DIVariable {
550
+ let file = span_start ( self , span) . file ;
551
+ let file_metadata = file_metadata ( self , & file. name , dbg_context. defining_crate ) ;
552
+
553
+ let loc = span_start ( self , span) ;
554
+ let type_metadata = type_metadata ( self , variable_type, span) ;
555
+
556
+ let ( argument_index, dwarf_tag) = match variable_kind {
557
+ ArgumentVariable ( index) => ( index as c_uint , DW_TAG_arg_variable ) ,
558
+ LocalVariable => ( 0 , DW_TAG_auto_variable ) ,
559
+ } ;
560
+ let align = self . align_of ( variable_type) ;
561
+
562
+ let name = SmallCStr :: new ( & variable_name. as_str ( ) ) ;
563
+ unsafe {
564
+ llvm:: LLVMRustDIBuilderCreateVariable (
565
+ DIB ( self ) ,
566
+ dwarf_tag,
567
+ scope_metadata,
568
+ name. as_ptr ( ) ,
569
+ file_metadata,
570
+ loc. line as c_uint ,
571
+ type_metadata,
572
+ self . sess ( ) . opts . optimize != config:: OptLevel :: No ,
573
+ DIFlags :: FlagZero ,
574
+ argument_index,
575
+ align. bytes ( ) as u32 ,
576
+ )
577
+ }
578
+ }
561
579
}
0 commit comments