<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Hey Nick,<div><br></div><div>This is great stuff. Thanks for doing this.</div><div><br></div><div>I'm seeing a few test failures in the GCC test suite (<a href="https://llvm.org/svn/llvm-project/clang-tests/trunk/gcc-4_2-testsuite">https://llvm.org/svn/llvm-project/clang-tests/trunk/gcc-4_2-testsuite</a>), though. It's fairly likely that they're just tests that need to be updated. Can you have a look?</div><div><br></div><div>gcc.apple/block-debug-1.c scan-assembler __block_descriptor.*DW_AT_name<br>gcc.apple/block-debug-1.c scan-assembler __block_literal_generic.*DW_AT_name<br>gcc.apple/block-debug-2.c scan-assembler __block_descriptor.*DW_AT_name<br>gcc.apple/block-debug-2.c scan-assembler __block_literal_generic.*DW_AT_name<br>gcc.dg/debug/dwarf2/var1.c scan-assembler xyzzy[^\\n\\r]+DW_AT_name</div><div><br></div><div>-Jim</div><div><br><div><div>On Oct 26, 2011, at 11:44 PM, Nick Lewycky wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div>Author: nicholas<br>Date: Thu Oct 27 01:44:11 2011<br>New Revision: 143097<br><br>URL: <a href="http://llvm.org/viewvc/llvm-project?rev=143097&view=rev">http://llvm.org/viewvc/llvm-project?rev=143097&view=rev</a><br>Log:<br>Teach our Dwarf emission to use the string pool.<br><br>Added:<br>    llvm/trunk/test/DebugInfo/stringpool.ll<br>Modified:<br>    llvm/trunk/include/llvm/CodeGen/AsmPrinter.h<br>    llvm/trunk/include/llvm/MC/MCAsmInfo.h<br>    llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp<br>    llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp<br>    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp<br>    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h<br>    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp<br>    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h<br>    llvm/trunk/lib/MC/MCAsmInfo.cpp<br>    llvm/trunk/lib/MC/MCAsmInfoDarwin.cpp<br>    llvm/trunk/test/CodeGen/ARM/debug-info-sreg2.ll<br>    llvm/trunk/test/CodeGen/X86/2010-06-28-DbgEntryPC.ll<br>    llvm/trunk/test/DebugInfo/2011-09-26-GlobalVarContext.ll<br><br>Modified: llvm/trunk/include/llvm/CodeGen/AsmPrinter.h<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/AsmPrinter.h?rev=143097&r1=143096&r2=143097&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/AsmPrinter.h?rev=143097&r1=143096&r2=143097&view=diff</a><br>==============================================================================<br>--- llvm/trunk/include/llvm/CodeGen/AsmPrinter.h (original)<br>+++ llvm/trunk/include/llvm/CodeGen/AsmPrinter.h Thu Oct 27 01:44:11 2011<br>@@ -194,6 +194,11 @@<br><br>     bool needsSEHMoves();<br><br>+    /// needsRelocationsForDwarfStringPool - Specifies whether the object format<br>+    /// expects to use relocations to refer to debug entries. Alternatively we<br>+    /// emit section offsets in bytes from the start of the string pool.<br>+    bool needsRelocationsForDwarfStringPool() const;<br>+<br>     /// EmitConstantPool - Print to the current output stream assembly<br>     /// representations of the constants in the constant pool MCP. This is<br>     /// used to print out constants which have been "spilled to memory" by<br><br>Modified: llvm/trunk/include/llvm/MC/MCAsmInfo.h<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCAsmInfo.h?rev=143097&r1=143096&r2=143097&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCAsmInfo.h?rev=143097&r1=143096&r2=143097&view=diff</a><br>==============================================================================<br>--- llvm/trunk/include/llvm/MC/MCAsmInfo.h (original)<br>+++ llvm/trunk/include/llvm/MC/MCAsmInfo.h Thu Oct 27 01:44:11 2011<br>@@ -330,6 +330,10 @@<br>     /// use EmitLabelOffsetDifference.<br>     bool DwarfUsesLabelOffsetForRanges;<br><br>+    /// DwarfUsesRelocationsForStringPool - True if this Dwarf output must use<br>+    /// relocations to refer to entries in the string pool.<br>+    bool DwarfUsesRelocationsForStringPool;<br>+<br>     /// DwarfRegNumForCFI - True if dwarf register numbers are printed<br>     /// instead of symbolic register names in .cfi_* directives.<br>     bool DwarfRegNumForCFI;  // Defaults to false;<br>@@ -566,6 +570,9 @@<br>     bool doesDwarfUsesLabelOffsetForRanges() const {<br>       return DwarfUsesLabelOffsetForRanges;<br>     }<br>+    bool doesDwarfUseRelocationsForStringPool() const {<br>+      return DwarfUsesRelocationsForStringPool;<br>+    }<br>     bool useDwarfRegNumForCFI() const {<br>       return DwarfRegNumForCFI;<br>     }<br><br>Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp?rev=143097&r1=143096&r2=143097&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp?rev=143097&r1=143096&r2=143097&view=diff</a><br>==============================================================================<br>--- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp (original)<br>+++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp Thu Oct 27 01:44:11 2011<br>@@ -613,6 +613,10 @@<br>     MF->getFunction()->needsUnwindTableEntry();<br> }<br><br>+bool AsmPrinter::needsRelocationsForDwarfStringPool() const {<br>+  return MAI->doesDwarfUseRelocationsForStringPool();<br>+}<br>+<br> void AsmPrinter::emitPrologLabel(const MachineInstr &MI) {<br>   MCSymbol *Label = MI.getOperand(0).getMCSymbol();<br><br>@@ -2092,4 +2096,3 @@<br>   report_fatal_error("no GCMetadataPrinter registered for GC: " + Twine(Name));<br>   return 0;<br> }<br>-<br><br>Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp?rev=143097&r1=143096&r2=143097&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp?rev=143097&r1=143096&r2=143097&view=diff</a><br>==============================================================================<br>--- llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp (original)<br>+++ llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp Thu Oct 27 01:44:11 2011<br>@@ -267,6 +267,7 @@<br> ///<br> unsigned DIELabel::SizeOf(AsmPrinter *AP, unsigned Form) const {<br>   if (Form == dwarf::DW_FORM_data4) return 4;<br>+  if (Form == dwarf::DW_FORM_strp) return 4;<br>   return AP->getTargetData().getPointerSize();<br> }<br><br>@@ -290,6 +291,7 @@<br> ///<br> unsigned DIEDelta::SizeOf(AsmPrinter *AP, unsigned Form) const {<br>   if (Form == dwarf::DW_FORM_data4) return 4;<br>+  if (Form == dwarf::DW_FORM_strp) return 4;<br>   return AP->getTargetData().getPointerSize();<br> }<br><br><br>Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp?rev=143097&r1=143096&r2=143097&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp?rev=143097&r1=143096&r2=143097&view=diff</a><br>==============================================================================<br>--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp (original)<br>+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp Thu Oct 27 01:44:11 2011<br>@@ -69,10 +69,21 @@<br><br> /// addString - Add a string attribute data and value. DIEString only<br> /// keeps string reference.<br>-void CompileUnit::addString(DIE *Die, unsigned Attribute, unsigned Form,<br>-                            StringRef String) {<br>-  DIEValue *Value = new (DIEValueAllocator) DIEString(String);<br>-  Die->addValue(Attribute, Form, Value);<br>+void CompileUnit::addString(DIE *Die, unsigned Attribute, StringRef String) {<br>+  if (String.size() > 3) {<br>+    MCSymbol *Symb = DD->getStringPoolEntry(String);<br>+    DIEValue *Value;<br>+    if (Asm->needsRelocationsForDwarfStringPool())<br>+      Value = new (DIEValueAllocator) DIELabel(Symb);<br>+    else {<br>+      MCSymbol *StringPool = DD->getStringPool();<br>+      Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);<br>+    }<br>+    Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);<br>+  } else {<br>+    DIEValue *Value = new (DIEValueAllocator) DIEString(String);<br>+    Die->addValue(Attribute, dwarf::DW_FORM_string, Value);<br>+  }<br> }<br><br> /// addLabel - Add a Dwarf label attribute data and value.<br>@@ -479,7 +490,7 @@<br><br> /// addConstantFPValue - Add constant value entry in variable DIE.<br> bool CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) {<br>-  assert(MO.isFPImm() && "Invalid machine operand!");<br>+  assert (MO.isFPImm() && "Invalid machine operand!");<br>   DIEBlock *Block = new (DIEValueAllocator) DIEBlock();<br>   APFloat FPImm = MO.getFPImm()->getValueAPF();<br><br>@@ -660,7 +671,7 @@<br>   StringRef Name = BTy.getName();<br>   // Add name if not anonymous or intermediate type.<br>   if (!Name.empty())<br>-    addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);<br>+    addString(&Buffer, dwarf::DW_AT_name, Name);<br><br>   if (BTy.getTag() == dwarf::DW_TAG_unspecified_type) {<br>     Buffer.setTag(dwarf::DW_TAG_unspecified_type);<br>@@ -694,7 +705,7 @@<br><br>   // Add name if not anonymous or intermediate type.<br>   if (!Name.empty())<br>-    addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);<br>+    addString(&Buffer, dwarf::DW_AT_name, Name);<br><br>   // Add size if non-zero (derived types might be zero-sized.)<br>   if (Size)<br>@@ -791,8 +802,7 @@<br>       else if (Element.isVariable()) {<br>         DIVariable DV(Element);<br>         ElemDie = new DIE(dwarf::DW_TAG_variable);<br>-        addString(ElemDie, dwarf::DW_AT_name, dwarf::DW_FORM_string,<br>-                  DV.getName());<br>+        addString(ElemDie, dwarf::DW_AT_name, DV.getName());<br>         addType(ElemDie, DV.getType());<br>         addUInt(ElemDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);<br>         addUInt(ElemDie, dwarf::DW_AT_external, dwarf::DW_FORM_flag, 1);<br>@@ -836,7 +846,7 @@<br><br>   // Add name if not anonymous or intermediate type.<br>   if (!Name.empty())<br>-    addString(&Buffer, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);<br>+    addString(&Buffer, dwarf::DW_AT_name, Name);<br><br>   if (Tag == dwarf::DW_TAG_enumeration_type || Tag == dwarf::DW_TAG_class_type<br>       || Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type)<br>@@ -868,7 +878,7 @@<br><br>   ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter);<br>   addType(ParamDIE, TP.getType());<br>-  addString(ParamDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string, TP.getName());<br>+  addString(ParamDIE, dwarf::DW_AT_name, TP.getName());<br>   return ParamDIE;<br> }<br><br>@@ -883,7 +893,7 @@<br>   ParamDIE = new DIE(dwarf::DW_TAG_template_value_parameter);<br>   addType(ParamDIE, TPV.getType());<br>   if (!TPV.getName().empty())<br>-    addString(ParamDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string, TPV.getName());<br>+    addString(ParamDIE, dwarf::DW_AT_name, TPV.getName());<br>   addUInt(ParamDIE, dwarf::DW_AT_const_value, dwarf::DW_FORM_udata, <br>           TPV.getValue());<br>   return ParamDIE;<br>@@ -897,7 +907,7 @@<br>   NDie = new DIE(dwarf::DW_TAG_namespace);<br>   insertDIE(NS, NDie);<br>   if (!NS.getName().empty())<br>-    addString(NDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, NS.getName());<br>+    addString(NDie, dwarf::DW_AT_name, NS.getName());<br>   addSourceLine(NDie, NS);<br>   addToContextOwner(NDie, NS.getContext());<br>   return NDie;<br>@@ -932,7 +942,7 @@<br><br>   StringRef LinkageName = SP.getLinkageName();<br>   if (!LinkageName.empty())<br>-    addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, dwarf::DW_FORM_string,<br>+    addString(SPDie, dwarf::DW_AT_MIPS_linkage_name,<br>               getRealLinkageName(LinkageName));<br><br>   // If this DIE is going to refer declaration info using AT_specification<br>@@ -942,7 +952,7 @@<br><br>   // Constructors and operators for anonymous aggregates do not have names.<br>   if (!SP.getName().empty())<br>-    addString(SPDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, SP.getName());<br>+    addString(SPDie, dwarf::DW_AT_name, SP.getName());<br><br>   addSourceLine(SPDie, SP);<br><br>@@ -1048,13 +1058,12 @@<br>   insertDIE(N, VariableDIE);<br><br>   // Add name.<br>-  addString(VariableDIE, dwarf::DW_AT_name, dwarf::DW_FORM_string,<br>-            GV.getDisplayName());<br>+  addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());<br>   StringRef LinkageName = GV.getLinkageName();<br>   bool isGlobalVariable = GV.getGlobal() != NULL;<br>   if (!LinkageName.empty() && isGlobalVariable)<br>     addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name,<br>-              dwarf::DW_FORM_string, getRealLinkageName(LinkageName));<br>+              getRealLinkageName(LinkageName));<br>   // Add type.<br>   DIType GTy = GV.getType();<br>   addType(VariableDIE, GTy);<br>@@ -1170,7 +1179,7 @@<br> DIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy) {<br>   DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator);<br>   StringRef Name = ETy.getName();<br>-  addString(Enumerator, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);<br>+  addString(Enumerator, dwarf::DW_AT_name, Name);<br>   int64_t Value = ETy.getEnumValue();<br>   addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value);<br>   return Enumerator;<br>@@ -1207,8 +1216,7 @@<br>     addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin,<br>                             dwarf::DW_FORM_ref4, AbsDIE);<br>   else {<br>-    addString(VariableDie, dwarf::DW_AT_name, <br>-                          dwarf::DW_FORM_string, Name);<br>+    addString(VariableDie, dwarf::DW_AT_name, Name);<br>     addSourceLine(VariableDie, DV->getVariable());<br>     addType(VariableDie, DV->getType());<br>   }<br>@@ -1303,7 +1311,7 @@<br>   DIE *MemberDie = new DIE(DT.getTag());<br>   StringRef Name = DT.getName();<br>   if (!Name.empty())<br>-    addString(MemberDie, dwarf::DW_AT_name, dwarf::DW_FORM_string, Name);<br>+    addString(MemberDie, dwarf::DW_AT_name, Name);<br><br>   addType(MemberDie, DT.getTypeDerivedFrom());<br><br>@@ -1377,16 +1385,13 @@<br>   // Objective-C properties.<br>   StringRef PropertyName = DT.getObjCPropertyName();<br>   if (!PropertyName.empty()) {<br>-    addString(MemberDie, dwarf::DW_AT_APPLE_property_name, dwarf::DW_FORM_string,<br>-              PropertyName);<br>+    addString(MemberDie, dwarf::DW_AT_APPLE_property_name, PropertyName);<br>     StringRef GetterName = DT.getObjCPropertyGetterName();<br>     if (!GetterName.empty())<br>-      addString(MemberDie, dwarf::DW_AT_APPLE_property_getter,<br>-                dwarf::DW_FORM_string, GetterName);<br>+      addString(MemberDie, dwarf::DW_AT_APPLE_property_getter, GetterName);<br>     StringRef SetterName = DT.getObjCPropertySetterName();<br>     if (!SetterName.empty())<br>-      addString(MemberDie, dwarf::DW_AT_APPLE_property_setter,<br>-                dwarf::DW_FORM_string, SetterName);<br>+      addString(MemberDie, dwarf::DW_AT_APPLE_property_setter, SetterName);<br>     unsigned PropertyAttributes = 0;<br>     if (DT.isReadOnlyObjCProperty())<br>       PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly;<br><br>Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h?rev=143097&r1=143096&r2=143097&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h?rev=143097&r1=143096&r2=143097&view=diff</a><br>==============================================================================<br>--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h (original)<br>+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h Thu Oct 27 01:44:11 2011<br>@@ -150,8 +150,7 @@<br><br>   /// addString - Add a string attribute data and value.<br>   ///<br>-  void addString(DIE *Die, unsigned Attribute, unsigned Form,<br>-                 const StringRef Str);<br>+  void addString(DIE *Die, unsigned Attribute, const StringRef Str);<br><br>   /// addLabel - Add a Dwarf label attribute data and value.<br>   ///<br><br>Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=143097&r1=143096&r2=143097&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=143097&r1=143096&r2=143097&view=diff</a><br>==============================================================================<br>--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)<br>+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Thu Oct 27 01:44:11 2011<br>@@ -136,6 +136,10 @@<br> DwarfDebug::~DwarfDebug() {<br> }<br><br>+MCSymbol *DwarfDebug::getStringPool() {<br>+  return Asm->GetTempSymbol("section_str");<br>+}<br>+<br> MCSymbol *DwarfDebug::getStringPoolEntry(StringRef Str) {<br>   std::pair<MCSymbol*, unsigned> &Entry = StringPool[Str];<br>   if (Entry.first) return Entry.first;<br>@@ -467,11 +471,10 @@<br><br>   DIE *Die = new DIE(dwarf::DW_TAG_compile_unit);<br>   CompileUnit *NewCU = new CompileUnit(ID, Die, Asm, this);<br>-  NewCU->addString(Die, dwarf::DW_AT_producer, dwarf::DW_FORM_string,<br>-                   DIUnit.getProducer());<br>+  NewCU->addString(Die, dwarf::DW_AT_producer, DIUnit.getProducer());<br>   NewCU->addUInt(Die, dwarf::DW_AT_language, dwarf::DW_FORM_data2,<br>                  DIUnit.getLanguage());<br>-  NewCU->addString(Die, dwarf::DW_AT_name, dwarf::DW_FORM_string, FN);<br>+  NewCU->addString(Die, dwarf::DW_AT_name, FN);<br>   // Use DW_AT_entry_pc instead of DW_AT_low_pc/DW_AT_high_pc pair. This<br>   // simplifies debug range entries.<br>   NewCU->addUInt(Die, dwarf::DW_AT_entry_pc, dwarf::DW_FORM_addr, 0);<br>@@ -484,14 +487,13 @@<br>     NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);<br><br>   if (!Dir.empty())<br>-    NewCU->addString(Die, dwarf::DW_AT_comp_dir, dwarf::DW_FORM_string, Dir);<br>+    NewCU->addString(Die, dwarf::DW_AT_comp_dir, Dir);<br>   if (DIUnit.isOptimized())<br>     NewCU->addUInt(Die, dwarf::DW_AT_APPLE_optimized, dwarf::DW_FORM_flag, 1);<br><br>   StringRef Flags = DIUnit.getFlags();<br>   if (!Flags.empty())<br>-    NewCU->addString(Die, dwarf::DW_AT_APPLE_flags, dwarf::DW_FORM_string, <br>-                     Flags);<br>+    NewCU->addString(Die, dwarf::DW_AT_APPLE_flags, Flags);<br><br>   if (unsigned RVer = DIUnit.getRunTimeVersion())<br>     NewCU->addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,<br>@@ -1796,6 +1798,7 @@<br><br>     // Emit the string itself.<br>     Asm->OutStreamer.EmitBytes(Entries[i].second->getKey(), 0/*addrspace*/);<br>+    Asm->OutStreamer.EmitZeros(1, 0);<br>   }<br> }<br><br><br>Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h?rev=143097&r1=143096&r2=143097&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h?rev=143097&r1=143096&r2=143097&view=diff</a><br>==============================================================================<br>--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h (original)<br>+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h Thu Oct 27 01:44:11 2011<br>@@ -216,8 +216,6 @@<br>   StringMap<std::pair<MCSymbol*, unsigned> > StringPool;<br>   unsigned NextStringPoolNumber;<br><br>-  MCSymbol *getStringPoolEntry(StringRef Str);<br>-<br>   /// SectionMap - Provides a unique id per text section.<br>   ///<br>   UniqueVector<const MCSection*> SectionMap;<br>@@ -504,6 +502,13 @@<br><br>   /// createSubprogramDIE - Create new DIE using SP.<br>   DIE *createSubprogramDIE(DISubprogram SP);<br>+<br>+  /// getStringPool - returns the entry into the start of the pool.<br>+  MCSymbol *getStringPool();<br>+<br>+  /// getStringPoolEntry - returns an entry into the string pool with the given<br>+  /// string text.<br>+  MCSymbol *getStringPoolEntry(StringRef Str);<br> };<br> } // End of namespace llvm<br><br><br>Modified: llvm/trunk/lib/MC/MCAsmInfo.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAsmInfo.cpp?rev=143097&r1=143096&r2=143097&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAsmInfo.cpp?rev=143097&r1=143096&r2=143097&view=diff</a><br>==============================================================================<br>--- llvm/trunk/lib/MC/MCAsmInfo.cpp (original)<br>+++ llvm/trunk/lib/MC/MCAsmInfo.cpp Thu Oct 27 01:44:11 2011<br>@@ -91,6 +91,7 @@<br>   DwarfRequiresRelocationForSectionOffset = true;<br>   DwarfSectionOffsetDirective = 0;<br>   DwarfUsesLabelOffsetForRanges = true;<br>+  DwarfUsesRelocationsForStringPool = true;<br>   DwarfRegNumForCFI = false;<br>   HasMicrosoftFastStdCallMangling = false;<br><br><br>Modified: llvm/trunk/lib/MC/MCAsmInfoDarwin.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAsmInfoDarwin.cpp?rev=143097&r1=143096&r2=143097&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAsmInfoDarwin.cpp?rev=143097&r1=143096&r2=143097&view=diff</a><br>==============================================================================<br>--- llvm/trunk/lib/MC/MCAsmInfoDarwin.cpp (original)<br>+++ llvm/trunk/lib/MC/MCAsmInfoDarwin.cpp Thu Oct 27 01:44:11 2011<br>@@ -66,4 +66,5 @@<br><br>   DwarfRequiresRelocationForSectionOffset = false;<br>   DwarfUsesLabelOffsetForRanges = false;<br>+  DwarfUsesRelocationsForStringPool = false;<br> }<br><br>Modified: llvm/trunk/test/CodeGen/ARM/debug-info-sreg2.ll<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/debug-info-sreg2.ll?rev=143097&r1=143096&r2=143097&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/debug-info-sreg2.ll?rev=143097&r1=143096&r2=143097&view=diff</a><br>==============================================================================<br>--- llvm/trunk/test/CodeGen/ARM/debug-info-sreg2.ll (original)<br>+++ llvm/trunk/test/CodeGen/ARM/debug-info-sreg2.ll Thu Oct 27 01:44:11 2011<br>@@ -6,8 +6,8 @@<br> ;CHECK: Ldebug_loc0:<br> ;CHECK-NEXT:        .long   Ltmp1<br> ;CHECK-NEXT:        .long   Ltmp2<br>-;CHECK-NEXT: Lset8 = Ltmp10-Ltmp9                    @ Loc expr size<br>-;CHECK-NEXT:        .short  Lset8<br>+;CHECK-NEXT: Lset[[N:[0-9]+]] = Ltmp10-Ltmp9        @ Loc expr size<br>+;CHECK-NEXT:        .short  Lset[[N]]<br> ;CHECK-NEXT: Ltmp9:<br> ;CHECK-NEXT:        .byte   144                     @ DW_OP_regx for S register<br><br><br>Modified: llvm/trunk/test/CodeGen/X86/2010-06-28-DbgEntryPC.ll<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/2010-06-28-DbgEntryPC.ll?rev=143097&r1=143096&r2=143097&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/2010-06-28-DbgEntryPC.ll?rev=143097&r1=143096&r2=143097&view=diff</a><br>==============================================================================<br>--- llvm/trunk/test/CodeGen/X86/2010-06-28-DbgEntryPC.ll (original)<br>+++ llvm/trunk/test/CodeGen/X86/2010-06-28-DbgEntryPC.ll Thu Oct 27 01:44:11 2011<br>@@ -5,17 +5,17 @@<br> ; CHECK:<span class="Apple-tab-span" style="white-space:pre"> </span>.byte<span class="Apple-tab-span" style="white-space:pre">       </span>17                      ## DW_TAG_compile_unit<br> ; CHECK-NEXT:<span class="Apple-tab-span" style="white-space:pre">     </span>.byte<span class="Apple-tab-span" style="white-space:pre">       </span>1                       ## DW_CHILDREN_yes<br> ; CHECK-NEXT:<span class="Apple-tab-span" style="white-space:pre">    </span>.byte<span class="Apple-tab-span" style="white-space:pre">       </span>37                      ## DW_AT_producer<br>-; CHECK-NEXT:<span class="Apple-tab-span" style="white-space:pre">  </span>.byte<span class="Apple-tab-span" style="white-space:pre">       </span>8                       ## DW_FORM_string<br>+; CHECK-NEXT:<span class="Apple-tab-span" style="white-space:pre">     </span>.byte<span class="Apple-tab-span" style="white-space:pre">       </span>14                      ## DW_FORM_strp<br> ; CHECK-NEXT:<span class="Apple-tab-span" style="white-space:pre">    </span>.byte<span class="Apple-tab-span" style="white-space:pre">       </span>19                      ## DW_AT_language<br> ; CHECK-NEXT:<span class="Apple-tab-span" style="white-space:pre">  </span>.byte<span class="Apple-tab-span" style="white-space:pre">       </span>5                       ## DW_FORM_data2<br> ; CHECK-NEXT:<span class="Apple-tab-span" style="white-space:pre">      </span>.byte<span class="Apple-tab-span" style="white-space:pre">       </span>3                       ## DW_AT_name<br>-; CHECK-NEXT:<span class="Apple-tab-span" style="white-space:pre"> </span>.byte<span class="Apple-tab-span" style="white-space:pre">       </span>8                       ## DW_FORM_string<br>+; CHECK-NEXT:<span class="Apple-tab-span" style="white-space:pre">     </span>.byte<span class="Apple-tab-span" style="white-space:pre">       </span>14                      ## DW_FORM_strp<br> ; CHECK-NEXT:<span class="Apple-tab-span" style="white-space:pre">    </span>.byte<span class="Apple-tab-span" style="white-space:pre">       </span>82                      ## DW_AT_entry_pc<br> ; CHECK-NEXT:<span class="Apple-tab-span" style="white-space:pre">  </span>.byte<span class="Apple-tab-span" style="white-space:pre">       </span>1                       ## DW_FORM_addr<br> ; CHECK-NEXT:<span class="Apple-tab-span" style="white-space:pre">       </span>.byte<span class="Apple-tab-span" style="white-space:pre">       </span>16                      ## DW_AT_stmt_list<br> ; CHECK-NEXT:<span class="Apple-tab-span" style="white-space:pre"> </span>.byte<span class="Apple-tab-span" style="white-space:pre">       </span>6                       ## DW_FORM_data4<br> ; CHECK-NEXT:<span class="Apple-tab-span" style="white-space:pre">      </span>.byte<span class="Apple-tab-span" style="white-space:pre">       </span>27                      ## DW_AT_comp_dir<br>-; CHECK-NEXT:<span class="Apple-tab-span" style="white-space:pre">  </span>.byte<span class="Apple-tab-span" style="white-space:pre">       </span>8                       ## DW_FORM_string<br>+; CHECK-NEXT:<span class="Apple-tab-span" style="white-space:pre">     </span>.byte<span class="Apple-tab-span" style="white-space:pre">       </span>14                      ## DW_FORM_strp<br> ; CHECK-NEXT:<span class="Apple-tab-span" style="white-space:pre">    </span>.byte<span class="Apple-tab-span" style="white-space:pre">       </span>225                     ## DW_AT_APPLE_optimized<br><br> %struct.a = type { i32, %struct.a* }<br><br>Modified: llvm/trunk/test/DebugInfo/2011-09-26-GlobalVarContext.ll<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/2011-09-26-GlobalVarContext.ll?rev=143097&r1=143096&r2=143097&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/2011-09-26-GlobalVarContext.ll?rev=143097&r1=143096&r2=143097&view=diff</a><br>==============================================================================<br>--- llvm/trunk/test/DebugInfo/2011-09-26-GlobalVarContext.ll (original)<br>+++ llvm/trunk/test/DebugInfo/2011-09-26-GlobalVarContext.ll Thu Oct 27 01:44:11 2011<br>@@ -2,14 +2,14 @@<br><br> ; ModuleID = 'test.c'<br><br>-@GLOBAL = common global i32 0, align 4<br>+@GLB = common global i32 0, align 4<br><br> define i32 @f() nounwind {<br>-  %LOCAL = alloca i32, align 4<br>-  call void @llvm.dbg.declare(metadata !{i32* %LOCAL}, metadata !15), !dbg !17<br>-  %1 = load i32* @GLOBAL, align 4, !dbg !18<br>-  store i32 %1, i32* %LOCAL, align 4, !dbg !18<br>-  %2 = load i32* @GLOBAL, align 4, !dbg !19<br>+  %LOC = alloca i32, align 4<br>+  call void @llvm.dbg.declare(metadata !{i32* %LOC}, metadata !15), !dbg !17<br>+  %1 = load i32* @GLB, align 4, !dbg !18<br>+  store i32 %1, i32* %LOC, align 4, !dbg !18<br>+  %2 = load i32* @GLB, align 4, !dbg !19<br>   ret i32 %2, !dbg !19<br> }<br><br>@@ -31,17 +31,17 @@<br> !11 = metadata !{i32 720932}                      ; [ DW_TAG_base_type ]<br> !12 = metadata !{metadata !13}<br> !13 = metadata !{metadata !14}<br>-!14 = metadata !{i32 720948, i32 0, null, metadata !"GLOBAL", metadata !"GLOBAL", metadata !"", metadata !6, i32 1, metadata !9, i32 0, i32 1, i32* @GLOBAL} ; [ DW_TAG_variable ]<br>-!15 = metadata !{i32 721152, metadata !16, metadata !"LOCAL", metadata !6, i32 4, metadata !9, i32 0, i32 0} ; [ DW_TAG_auto_variable ]<br>+!14 = metadata !{i32 720948, i32 0, null, metadata !"GLB", metadata !"GLB", metadata !"", metadata !6, i32 1, metadata !9, i32 0, i32 1, i32* @GLB} ; [ DW_TAG_variable ]<br>+!15 = metadata !{i32 721152, metadata !16, metadata !"LOC", metadata !6, i32 4, metadata !9, i32 0, i32 0} ; [ DW_TAG_auto_variable ]<br> !16 = metadata !{i32 720907, metadata !5, i32 3, i32 9, metadata !6, i32 0} ; [ DW_TAG_lexical_block ]<br> !17 = metadata !{i32 4, i32 9, metadata !16, null}<br> !18 = metadata !{i32 4, i32 23, metadata !16, null}<br> !19 = metadata !{i32 5, i32 5, metadata !16, null}<br><br>-; CHECK: .ascii<span class="Apple-tab-span" style="white-space:pre">      </span> "GLOBAL"<br>+; CHECK: .ascii<span class="Apple-tab-span" style="white-space:pre">       </span> "GLB"<br> ; CHECK: .byte<span class="Apple-tab-span" style="white-space:pre">   </span>1<br> ; CHECK: .byte<span class="Apple-tab-span" style="white-space:pre">  </span>1<br><br>-; CHECK: .ascii<span class="Apple-tab-span" style="white-space:pre">       </span> "LOCAL"<br>+; CHECK: .ascii<span class="Apple-tab-span" style="white-space:pre">        </span> "LOC"<br> ; CHECK: .byte<span class="Apple-tab-span" style="white-space:pre">   </span>1<br> ; CHECK: .byte<span class="Apple-tab-span" style="white-space:pre">  </span>4<br><br>Added: llvm/trunk/test/DebugInfo/stringpool.ll<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/stringpool.ll?rev=143097&view=auto">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/stringpool.ll?rev=143097&view=auto</a><br>==============================================================================<br>--- llvm/trunk/test/DebugInfo/stringpool.ll (added)<br>+++ llvm/trunk/test/DebugInfo/stringpool.ll Thu Oct 27 01:44:11 2011<br>@@ -0,0 +1,54 @@<br>+; RUN: llc -O0 -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s --check-prefix=LINUX<br>+; RUN: llc -O0 -mtriple=x86_64-darwin < %s | FileCheck %s --check-prefix=DARWIN<br>+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"<br>+target triple = "x86_64-unknown-linux-gnu"<br>+<br>+@x = common global i32 0, align 4<br>+@yyyyyyyy = common global i32 0, align 4<br>+<br>+!llvm.dbg.cu = !{!0}<br>+<br>+!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 ]<br>+!1 = metadata !{metadata !2}<br>+!2 = metadata !{i32 0}<br>+!3 = metadata !{metadata !4}<br>+!4 = metadata !{metadata !5, metadata !8}<br>+!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 ]<br>+!6 = metadata !{i32 720937, metadata !"hello.c", metadata !"/home/nlewycky", null} ; [ DW_TAG_file_type ]<br>+!7 = metadata !{i32 720932, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ]<br>+!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 ]<br>+<br>+; 120 is ASCII 'x'. Verify that we use it directly as its name and don't emit<br>+; a reference to the string pool.<br>+; LINUX:        .byte   120                     # DW_AT_name<br>+; DARWIN:       .byte   120                     ## DW_AT_name<br>+<br>+; Verify that we refer to 'yyyyyyyy' with a relocation.<br>+; LINUX:      .long   .Lstring{{[0-9]+}}      # DW_AT_name<br>+; LINUX-NEXT: .long   39                      # DW_AT_type<br>+; LINUX-NEXT: .byte   1                       # DW_AT_external<br>+; LINUX-NEXT: .byte   1                       # DW_AT_decl_file<br>+; LINUX-NEXT: .byte   2                       # DW_AT_decl_line<br>+; LINUX-NEXT: .byte   9                       # DW_AT_location<br>+; LINUX-NEXT: .byte   3<br>+; LINUX-NEXT: .quad   yyyyyyyy<br>+<br>+; Verify that we refer to 'yyyyyyyy' without a relocation.<br>+; DARWIN: Lset[[N:[0-9]+]] = Lstring{{[0-9]+}}-Lsection_str   ## DW_AT_name<br>+; DARWIN-NEXT:        .long   Lset[[N]]<br>+; DARWIN-NEXT:        .long   39                      ## DW_AT_type<br>+; DARWIN-NEXT:        .byte   1                       ## DW_AT_external<br>+; DARWIN-NEXT:        .byte   1                       ## DW_AT_decl_file<br>+; DARWIN-NEXT:        .byte   2                       ## DW_AT_decl_line<br>+; DARWIN-NEXT:        .byte   9                       ## DW_AT_location<br>+; DARWIN-NEXT:        .byte   3<br>+; DARWIN-NEXT:        .quad   _yyyyyyyy<br>+<br>+<br>+; Verify that "yyyyyyyy" ended up in the stringpool.<br>+; LINUX: .section .debug_str,"MS",@progbits,1<br>+; LINUX-NOT: .section<br>+; LINUX: yyyyyyyy<br>+; DARWIN: .section __DWARF,__debug_str,regular,debug<br>+; DARWIN-NOT: .section<br>+; DARWIN: yyyyyyyy<br><br><br>_______________________________________________<br>llvm-commits mailing list<br><a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits<br></div></blockquote></div><br></div></body></html>