@@ -11,7 +11,7 @@ use self::utils::{create_DIArray, is_node_local_to_unit, span_start, DIB};
1111
1212use crate :: llvm;
1313use crate :: llvm:: debuginfo:: {
14- DIArray , DIBuilder , DIFile , DIFlags , DILexicalBlock , DISPFlags , DIScope , DIType ,
14+ DIArray , DIBuilder , DIFile , DIFlags , DILexicalBlock , DISPFlags , DIScope , DIType , DIVariable ,
1515} ;
1616use rustc:: middle:: codegen_fn_attrs:: CodegenFnAttrFlags ;
1717use rustc:: ty:: subst:: { GenericArgKind , SubstsRef } ;
@@ -143,33 +143,23 @@ pub fn finalize(cx: &CodegenCx<'_, '_>) {
143143 } ;
144144}
145145
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 (
148150 & mut self ,
149151 dbg_context : & FunctionDebugContext < & ' ll DIScope > ,
150- variable_name : ast:: Name ,
151- variable_type : Ty < ' tcx > ,
152+ dbg_var : & ' ll DIVariable ,
152153 scope_metadata : & ' ll DIScope ,
153154 variable_alloca : Self :: Value ,
154155 direct_offset : Size ,
155156 indirect_offsets : & [ Size ] ,
156- variable_kind : VariableKind ,
157157 span : Span ,
158158 ) {
159159 assert ! ( !dbg_context. source_locations_enabled) ;
160160 let cx = self . cx ( ) ;
161161
162- let file = span_start ( cx, span) . file ;
163- let file_metadata = file_metadata ( cx, & file. name , dbg_context. defining_crate ) ;
164-
165162 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) ;
173163
174164 // Convert the direct and indirect offsets to address ops.
175165 let op_deref = || unsafe { llvm:: LLVMRustDIBuilderCreateOpDeref ( ) } ;
@@ -188,32 +178,19 @@ impl DebugInfoBuilderMethods<'tcx> for Builder<'a, 'll, 'tcx> {
188178 }
189179 }
190180
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?
207183 source_loc:: set_debug_location (
208184 self ,
209185 InternalDebugLocation :: new ( scope_metadata, loc. line , loc. col . to_usize ( ) ) ,
210186 ) ;
211187 unsafe {
212188 let debug_loc = llvm:: LLVMGetCurrentDebugLocation ( self . llbuilder ) ;
189+ // FIXME(eddyb) replace `llvm.dbg.declare` with `llvm.dbg.addr`.
213190 let instr = llvm:: LLVMRustDIBuilderInsertDeclareAtEnd (
214191 DIB ( cx) ,
215192 variable_alloca,
216- metadata ,
193+ dbg_var ,
217194 addr_ops. as_ptr ( ) ,
218195 addr_ops. len ( ) as c_uint ,
219196 debug_loc,
@@ -558,4 +535,45 @@ impl DebugInfoMethods<'tcx> for CodegenCx<'ll, 'tcx> {
558535 fn debuginfo_finalize ( & self ) {
559536 finalize ( self )
560537 }
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+ }
561579}
0 commit comments