Always use the string pool, even when it makes the .o larger. This may help
authorNick Lewycky <nicholas@mxc.ca>
Fri, 28 Oct 2011 05:29:47 +0000 (05:29 +0000)
committerNick Lewycky <nicholas@mxc.ca>
Fri, 28 Oct 2011 05:29:47 +0000 (05:29 +0000)
tools that read the debug info in the .o files by making the DIE sizes more
consistent.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@143186 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/AsmPrinter/DIE.cpp
lib/CodeGen/AsmPrinter/DIE.h
lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
test/CodeGen/ARM/2011-01-19-MergedGlobalDbg.ll
test/CodeGen/ARM/2011-08-02-MergedGlobalDbg.ll
test/CodeGen/X86/2010-08-10-DbgConstant.ll
test/CodeGen/X86/2011-01-24-DbgValue-Before-Use.ll
test/CodeGen/X86/dbg-value-inlined-parameter.ll
test/CodeGen/X86/dbg-value-location.ll
test/DebugInfo/2011-09-26-GlobalVarContext.ll
test/DebugInfo/stringpool.ll

index fad3d0dc3d07bd0d90823efbacb04c5abf8f3779..a2dc873b69e804d2c62eb595cfdd13c6a6b4f9e3 100644 (file)
@@ -235,24 +235,6 @@ void DIEInteger::print(raw_ostream &O) {
 }
 #endif
 
-//===----------------------------------------------------------------------===//
-// DIEString Implementation
-//===----------------------------------------------------------------------===//
-
-/// EmitValue - Emit string value.
-///
-void DIEString::EmitValue(AsmPrinter *AP, unsigned Form) const {
-  AP->OutStreamer.EmitBytes(Str, /*addrspace*/0);
-  // Emit nul terminator.
-  AP->OutStreamer.EmitIntValue(0, 1, /*addrspace*/0);
-}
-
-#ifndef NDEBUG
-void DIEString::print(raw_ostream &O) {
-  O << "Str: \"" << Str << "\"";
-}
-#endif
-
 //===----------------------------------------------------------------------===//
 // DIELabel Implementation
 //===----------------------------------------------------------------------===//
index 12448af7fd834a8e1ff3bd50501757256529acb2..265446cf230b777954672e355d21308a192f75e1 100644 (file)
@@ -269,33 +269,6 @@ namespace llvm {
     static bool classof(const DIEInteger *) { return true; }
     static bool classof(const DIEValue *I) { return I->getType() == isInteger; }
 
-#ifndef NDEBUG
-    virtual void print(raw_ostream &O);
-#endif
-  };
-
-  //===--------------------------------------------------------------------===//
-  /// DIEString - A string value DIE. This DIE keeps string reference only.
-  ///
-  class DIEString : public DIEValue {
-    const StringRef Str;
-  public:
-    explicit DIEString(const StringRef S) : DIEValue(isString), Str(S) {}
-
-    /// EmitValue - Emit string value.
-    ///
-    virtual void EmitValue(AsmPrinter *AP, unsigned Form) const;
-
-    /// SizeOf - Determine size of string value in bytes.
-    ///
-    virtual unsigned SizeOf(AsmPrinter *AP, unsigned /*Form*/) const {
-      return Str.size() + sizeof(char); // sizeof('\0');
-    }
-
-    // Implement isa/cast/dyncast.
-    static bool classof(const DIEString *) { return true; }
-    static bool classof(const DIEValue *S) { return S->getType() == isString; }
-
 #ifndef NDEBUG
     virtual void print(raw_ostream &O);
 #endif
index a6a004d4d9e8454e0761afc2f1cacc671bb4b237..f9f1642b2ff00db3dcaeaddefea72924288d2dc8 100644 (file)
@@ -67,23 +67,19 @@ void CompileUnit::addSInt(DIE *Die, unsigned Attribute,
   Die->addValue(Attribute, Form, Value);
 }
 
-/// addString - Add a string attribute data and value. DIEString only
-/// keeps string reference.
+/// addString - Add a string attribute data and value. We always emit a
+/// reference to the string pool instead of immediate strings so that DIEs have
+/// more predictable sizes.
 void CompileUnit::addString(DIE *Die, unsigned Attribute, StringRef String) {
-  if (String.size() > 3) {
-    MCSymbol *Symb = DD->getStringPoolEntry(String);
-    DIEValue *Value;
-    if (Asm->needsRelocationsForDwarfStringPool())
-      Value = new (DIEValueAllocator) DIELabel(Symb);
-    else {
-      MCSymbol *StringPool = DD->getStringPool();
-      Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
-    }
-    Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
-  } else {
-    DIEValue *Value = new (DIEValueAllocator) DIEString(String);
-    Die->addValue(Attribute, dwarf::DW_FORM_string, Value);
+  MCSymbol *Symb = DD->getStringPoolEntry(String);
+  DIEValue *Value;
+  if (Asm->needsRelocationsForDwarfStringPool())
+    Value = new (DIEValueAllocator) DIELabel(Symb);
+  else {
+    MCSymbol *StringPool = DD->getStringPool();
+    Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
   }
+  Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
 }
 
 /// addLabel - Add a Dwarf label attribute data and value.
index 94842124fb0860d1746daac4dc3bc3c4b1cba303..8b29c153d727d4fc1a775a889cc1fbd3893a21c2 100644 (file)
@@ -17,8 +17,7 @@ target triple = "thumbv7-apple-darwin10"
 ; DW_OP_constu
 ; offset
 
-;CHECK:        .ascii   "x2"                   @ DW_AT_name
-;CHECK-NEXT:        .byte   0
+;CHECK: .long Lset6
 ;CHECK-NEXT:        @ DW_AT_type
 ;CHECK-NEXT:        @ DW_AT_decl_file
 ;CHECK-NEXT:        @ DW_AT_decl_line
index f681c34bdaa25dad9c27901fd3d6bbdca51f95e2..f2b0c5d7d090c1c34c8511f8fc50ad0da88acbac 100644 (file)
@@ -8,8 +8,7 @@
 ; DW_OP_constu
 ; offset
 
-;CHECK:        .ascii   "x2"                   @ DW_AT_name
-;CHECK-NEXT:        .byte   0
+;CHECK: .long Lset33
 ;CHECK-NEXT:        @ DW_AT_type
 ;CHECK-NEXT:        @ DW_AT_decl_file
 ;CHECK-NEXT:        @ DW_AT_decl_line
index d98ef14e108bb105205658c1235d0f04564dcda6..f0dc347ef48a742863abeeb69f06f6c0a3f2ad5f 100644 (file)
@@ -1,6 +1,6 @@
 ; RUN: llc  -march=x86 -O0 < %s | FileCheck %s
 ; CHECK: DW_TAG_constant
-; CHECK-NEXT: ascii     "ro"                   #{{#?}} DW_AT_name
+; CHECK-NEXT: .long .Lstring3 #{{#?}} DW_AT_name
 
 define void @foo() nounwind ssp {
 entry:
index 7f134113b2e3c4ded1ea45b8610d573adf99e280..166dcf259989863b0050c04efd40b624ff145a6b 100644 (file)
@@ -4,8 +4,7 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3
 target triple = "x86_64-apple-darwin10.0.0"
 
 ; Check debug info for variable z_s
-;CHECK:       .ascii   "z_s"                  ## DW_AT_name
-;CHECK-NEXT:  .byte   0
+;CHECK: .long Lset13
 ;CHECK-NEXT:  ## DW_AT_decl_file
 ;CHECK-NEXT:  ## DW_AT_decl_line
 ;CHECK-NEXT:  ## DW_AT_type
index 481c4ba4a49afd35952a8b36a548a991a97b97d1..d248a413035569fcbc59eb0547f4317e52a7aa2a 100644 (file)
@@ -8,7 +8,7 @@
 ;CHECK-NEXT: DW_AT_call_file
 ;CHECK-NEXT: DW_AT_call_line
 ;CHECK-NEXT: DW_TAG_formal_parameter
-;CHECK-NEXT: .ascii   "sp"                   ## DW_AT_name
+;CHECK-NEXT: Lstring11-Lsection_str ## DW_AT_name
 
 %struct.S1 = type { float*, i32 }
 
index a0e4d16246ffe85633421797a3135a1c89795938..05e29ecff03f46ddcf3576760ad78f1da5a4aac1 100644 (file)
@@ -4,8 +4,7 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3
 target triple = "x86_64-apple-darwin10.0.0"
 ;Radar 8950491
 
-;CHECK:        .ascii   "var"                  ## DW_AT_name
-;CHECK-NEXT:        .byte   0
+;CHECK: .long Lset5
 ;CHECK-NEXT:        ## DW_AT_decl_file
 ;CHECK-NEXT:        ## DW_AT_decl_line
 ;CHECK-NEXT:        ## DW_AT_type
index 1452ff988ba1e908fa8f094bf15262338d627e47..934fa81435adceb7ecc3400131c95f5ebdb37c9d 100644 (file)
@@ -1,4 +1,4 @@
-; RUN: llc -asm-verbose %s -o - | FileCheck %s
+; RUN: llc -mtriple=x86_64-pc-linux-gnu -asm-verbose %s -o - | FileCheck %s
 
 ; ModuleID = 'test.c'
 
@@ -38,10 +38,10 @@ declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone
 !18 = metadata !{i32 4, i32 23, metadata !16, null}
 !19 = metadata !{i32 5, i32 5, metadata !16, null}
 
-; CHECK: .ascii         "GLB"
+; CHECK: .long .Lstring3
 ; CHECK: .byte 1
 ; CHECK: .byte 1
 
-; CHECK: .ascii         "LOC"
+; CHECK: .long .Lstring6
 ; CHECK: .byte 1
 ; CHECK: .byte 4
index 0a7c979ba2a29fc8c62feea03d89ecdd66f2d34d..2cd100156aada13acf0aff9b7b49190f0e95c71b 100644 (file)
@@ -1,54 +1,44 @@
-; RUN: llc -O0 -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s --check-prefix=LINUX
-; RUN: llc -O0 -mtriple=x86_64-darwin < %s | FileCheck %s --check-prefix=DARWIN
-target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
-target triple = "x86_64-unknown-linux-gnu"
+; RUN: llc -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s --check-prefix=LINUX
+; RUN: llc -mtriple=x86_64-darwin < %s | FileCheck %s --check-prefix=DARWIN
 
-@x = common global i32 0, align 4
-@yyyyyyyy = common global i32 0, align 4
+@yyyy = common global i32 0, align 4
 
 !llvm.dbg.cu = !{!0}
 
-!0 = metadata !{i32 720913, i32 0, i32 12, metadata !"hello.c", metadata !"/home/nlewycky", metadata !"clang version 3.1 (trunk 143048)", i1 true, i1 true, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3} ; [ DW_TAG_compile_unit ]
+!0 = metadata !{i32 720913, i32 0, i32 12, metadata !"z.c", metadata !"/home/nicholas", metadata !"clang version 3.1 (trunk 143009)", i1 true, i1 true, metadata !"", i32 0, metadata !1, metadata !1, metadata !1, metadata !3} ; [ DW_TAG_compile_unit ]
 !1 = metadata !{metadata !2}
 !2 = metadata !{i32 0}
 !3 = metadata !{metadata !4}
-!4 = metadata !{metadata !5, metadata !8}
-!5 = metadata !{i32 720948, i32 0, null, metadata !"x", metadata !"x", metadata !"", metadata !6, i32 1, metadata !7, i32 0, i32 1, i32* @x} ; [ DW_TAG_variable ]
-!6 = metadata !{i32 720937, metadata !"hello.c", metadata !"/home/nlewycky", null} ; [ DW_TAG_file_type ]
+!4 = metadata !{metadata !5}
+!5 = metadata !{i32 720948, i32 0, null, metadata !"yyyy", metadata !"yyyy", metadata !"", metadata !6, i32 1, metadata !7, i32 0, i32 1, i32* @yyyy} ; [ DW_TAG_variable ]
+!6 = metadata !{i32 720937, metadata !"z.c", metadata !"/home/nicholas", null} ; [ DW_TAG_file_type ]
 !7 = metadata !{i32 720932, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ]
-!8 = metadata !{i32 720948, i32 0, null, metadata !"yyyyyyyy", metadata !"yyyyyyyy", metadata !"", metadata !6, i32 2, metadata !7, i32 0, i32 1, i32* @yyyyyyyy} ; [ DW_TAG_variable ]
 
-; 120 is ASCII 'x'. Verify that we use it directly as its name and don't emit
-; a reference to the string pool.
-; LINUX:        .byte   120                     # DW_AT_name
-; DARWIN:       .byte   120                     ## DW_AT_name
-
-; Verify that we refer to 'yyyyyyyy' with a relocation.
-; LINUX:      .long   .Lstring{{[0-9]+}}      # DW_AT_name
+; Verify that we refer to 'yyyy' with a relocation.
+; LINUX:      .long   .Lstring3               # DW_AT_name
 ; LINUX-NEXT: .long   39                      # DW_AT_type
 ; LINUX-NEXT: .byte   1                       # DW_AT_external
 ; LINUX-NEXT: .byte   1                       # DW_AT_decl_file
-; LINUX-NEXT: .byte   2                       # DW_AT_decl_line
+; LINUX-NEXT: .byte   1                       # DW_AT_decl_line
 ; LINUX-NEXT: .byte   9                       # DW_AT_location
 ; LINUX-NEXT: .byte   3
-; LINUX-NEXT: .quad   yyyyyyyy
+; LINUX-NEXT: .quad   yyyy
 
-; Verify that we refer to 'yyyyyyyy' without a relocation.
-; DARWIN: Lset[[N:[0-9]+]] = Lstring{{[0-9]+}}-Lsection_str   ## DW_AT_name
-; DARWIN-NEXT:        .long   Lset[[N]]
+; Verify that we refer to 'yyyy' without a relocation.
+; DARWIN: Lset5 = Lstring3-Lsection_str               ## DW_AT_name
+; DARWIN-NEXT:        .long   Lset5
 ; DARWIN-NEXT:        .long   39                      ## DW_AT_type
 ; DARWIN-NEXT:        .byte   1                       ## DW_AT_external
 ; DARWIN-NEXT:        .byte   1                       ## DW_AT_decl_file
-; DARWIN-NEXT:        .byte   2                       ## DW_AT_decl_line
+; DARWIN-NEXT:        .byte   1                       ## DW_AT_decl_line
 ; DARWIN-NEXT:        .byte   9                       ## DW_AT_location
 ; DARWIN-NEXT:        .byte   3
-; DARWIN-NEXT:        .quad   _yyyyyyyy
-
+; DARWIN-NEXT:        .quad   _yyyy
 
-; Verify that "yyyyyyyy" ended up in the stringpool.
+; Verify that "yyyy" ended up in the stringpool.
 ; LINUX: .section .debug_str,"MS",@progbits,1
 ; LINUX-NOT: .section
-; LINUX: yyyyyyyy
+; LINUX: yyyy
 ; DARWIN: .section __DWARF,__debug_str,regular,debug
 ; DARWIN-NOT: .section
-; DARWIN: yyyyyyyy
+; DARWIN: yyyy