[PATCH] Debug Info on Windows

Carlo Kok ck at remobjects.com
Fri Jul 26 10:44:17 PDT 2013


Op 26-7-2013 19:26, David Blaikie schreef:
>>>
>>> Can you provide test coverage for this?

> If possible, we're trying to make a habit of including the original
> (C, in your case I assume) source & Clang command line (ideally
> produced from Clang since it's generally accessible to LLVM developers
> - if it's something that can only be produced by some other frontend,
> I'd be curious to hear about that too) in the LLVM debug info test
> cases if possible. (& keep the IR an exact copy of what Clang
> produced, rather than anything hand-reduced unless there's a good
> reason to do so)

Oke. I presumed that shorter was better, but sure. Fixed testcase attached.

>
> (oh, and your patch uses naming inconsistent with LLVM's naming
> convention (value should be Value))

Also updated to use V as it uses in the case before it. The only thing 
I'm worried about is DIEValue::isLabel, last time I checked in some code 
with an enum defined as part of a class I did it wrong (VC is a lot more 
relaxed in the enum rules).

--
Carlo Kok
-------------- next part --------------
 lib/CodeGen/AsmPrinter/DwarfDebug.cpp     | 15 ++++++++----
 test/DebugInfo/X86/coff_relative_names.ll | 40 +++++++++++++++++++++++++++++++
 2 files changed, 51 insertions(+), 4 deletions(-)

diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
index 8dc44b7..765d930 100644
--- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
+++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
@@ -1956,10 +1956,17 @@ void DwarfDebug::emitDIE(DIE *Die, std::vector<DIEAbbrev *> *Abbrevs) {
       Values[i]->EmitValue(Asm, Form);
       break;
     }
-    default:
-      // Emit an attribute using the defined form.
-      Values[i]->EmitValue(Asm, Form);
-      break;
+    default: {
+        const DIEValue *V = Values[i];
+
+        if (V->getType() == DIEValue::isLabel && Asm->MAI->needsDwarfSectionOffsetDirective()) {
+          Asm->OutStreamer.EmitCOFFSecRel32(((DIELabel*)V)->getValue());
+          break;
+        }
+        // Emit an attribute using the defined form.
+        V->EmitValue(Asm, Form);
+        break;
+      }
     }
   }
 
diff --git a/test/DebugInfo/X86/coff_relative_names.ll b/test/DebugInfo/X86/coff_relative_names.ll
new file mode 100644
index 0000000..5dab619
--- /dev/null
+++ b/test/DebugInfo/X86/coff_relative_names.ll
@@ -0,0 +1,40 @@
+; RUN: llc -mtriple=i686-w64-mingw32 -filetype=asm -O0 < %s | FileCheck %s
+
+; CHECK:  	.secrel32 Linfo_string0
+; CHECK:  	.secrel32 Linfo_string1
+;
+; generated from:
+; clang -g -S -emit-llvm test.c -o test.ll
+; int main()
+; {
+; 	return 0;
+; }
+
+; ModuleID = 'test.c'
+target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32"
+target triple = "i686-pc-win32"
+
+; Function Attrs: nounwind
+define i32 @main() #0 {
+entry:
+  %retval = alloca i32, align 4
+  store i32 0, i32* %retval
+  ret i32 0, !dbg !10
+}
+
+attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!9}
+
+!0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.4 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [C:\Projects/test.c] [DW_LANG_C99]
+!1 = metadata !{metadata !"test.c", metadata !"C:\5CProjects"}
+!2 = metadata !{i32 0}
+!3 = metadata !{metadata !4}
+!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"main", metadata !"main", metadata !"", i32 1, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 0, i1 false, i32 ()* @main, null, null, metadata !2, i32 2} ; [ DW_TAG_subprogram ] [line 1] [def] [scope 2] [main]
+!5 = metadata !{i32 786473, metadata !1}          ; [ DW_TAG_file_type ] [C:\Projects/test.c]
+!6 = metadata !{i32 786453, i32 0, i32 0, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
+!7 = metadata !{metadata !8}
+!8 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed]
+!9 = metadata !{i32 2, metadata !"Dwarf Version", i32 3}
+!10 = metadata !{i32 3, i32 0, metadata !4, null}


More information about the llvm-commits mailing list