1263320SdimPull in r195391 from upstream llvm trunk (by Eric Christopher):
2263320Sdim
3263320Sdim  In Dwarf 3 (and Dwarf 2) attributes whose value are offsets into a
4263320Sdim  section use the form DW_FORM_data4 whilst in Dwarf 4 and later they
5263320Sdim  use the form DW_FORM_sec_offset.
6263320Sdim
7263320Sdim  This patch updates the places where such attributes are generated to
8263320Sdim  use the appropriate form depending on the Dwarf version. The DIE entries
9263320Sdim  affected have the following tags:
10263320Sdim  DW_AT_stmt_list, DW_AT_ranges, DW_AT_location, DW_AT_GNU_pubnames,
11263320Sdim  DW_AT_GNU_pubtypes, DW_AT_GNU_addr_base, DW_AT_GNU_ranges_base
12263320Sdim
13263320Sdim  It also adds a hidden command line option "--dwarf-version=<uint>"
14263320Sdim  to llc which allows the version of Dwarf to be generated to override
15263320Sdim  what is specified in the metadata; this makes it possible to update
16263320Sdim  existing tests to check the debugging information generated for both
17263320Sdim  Dwarf 4 (the default) and Dwarf 3 using the same metadata.
18263320Sdim
19263320Sdim  Patch (slightly modified) by Keith Walker!
20263320Sdim
21263320SdimIntroduced here: http://svn.freebsd.org/changeset/base/261991
22263320Sdim
23263320SdimIndex: lib/CodeGen/AsmPrinter/DIE.cpp
24263320Sdim===================================================================
25263320Sdim--- lib/CodeGen/AsmPrinter/DIE.cpp
26263320Sdim+++ lib/CodeGen/AsmPrinter/DIE.cpp
27263320Sdim@@ -338,6 +338,7 @@ void DIEDelta::EmitValue(AsmPrinter *AP, dwarf::Fo
28263320Sdim ///
29263320Sdim unsigned DIEDelta::SizeOf(AsmPrinter *AP, dwarf::Form Form) const {
30263320Sdim   if (Form == dwarf::DW_FORM_data4) return 4;
31263320Sdim+  if (Form == dwarf::DW_FORM_sec_offset) return 4;
32263320Sdim   if (Form == dwarf::DW_FORM_strp) return 4;
33263320Sdim   return AP->getDataLayout().getPointerSize();
34263320Sdim }
35263320SdimIndex: lib/CodeGen/AsmPrinter/DwarfDebug.cpp
36263320Sdim===================================================================
37263320Sdim--- lib/CodeGen/AsmPrinter/DwarfDebug.cpp
38263320Sdim+++ lib/CodeGen/AsmPrinter/DwarfDebug.cpp
39263320Sdim@@ -105,6 +105,11 @@ DwarfPubSections("generate-dwarf-pub-sections", cl
40263320Sdim                             clEnumVal(Disable, "Disabled"), clEnumValEnd),
41263320Sdim                  cl::init(Default));
42263320Sdim 
43263320Sdim+static cl::opt<unsigned>
44263320Sdim+DwarfVersionNumber("dwarf-version", cl::Hidden,
45263320Sdim+                   cl::desc("Generate DWARF for dwarf version."),
46263320Sdim+                   cl::init(0));
47263320Sdim+
48263320Sdim static const char *const DWARFGroupName = "DWARF Emission";
49263320Sdim static const char *const DbgTimerName = "DWARF Debug Writer";
50263320Sdim 
51263320Sdim@@ -215,7 +220,9 @@ DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
52263320Sdim   else
53263320Sdim     HasDwarfPubSections = DwarfPubSections == Enable;
54263320Sdim 
55263320Sdim-  DwarfVersion = getDwarfVersionFromModule(MMI->getModule());
56263320Sdim+  DwarfVersion = DwarfVersionNumber
57263320Sdim+                     ? DwarfVersionNumber
58263320Sdim+                     : getDwarfVersionFromModule(MMI->getModule());
59263320Sdim 
60263320Sdim   {
61263320Sdim     NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
62263320Sdim@@ -470,9 +477,9 @@ DIE *DwarfDebug::constructLexicalScopeDIE(CompileU
63263320Sdim     // .debug_range section has not been laid out yet. Emit offset in
64263320Sdim     // .debug_range as a uint, size 4, for now. emitDIE will handle
65263320Sdim     // DW_AT_ranges appropriately.
66263320Sdim-    TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
67263320Sdim-                   DebugRangeSymbols.size()
68263320Sdim-                   * Asm->getDataLayout().getPointerSize());
69263320Sdim+    TheCU->addSectionOffset(ScopeDIE, dwarf::DW_AT_ranges,
70263320Sdim+                            DebugRangeSymbols.size() *
71263320Sdim+                                Asm->getDataLayout().getPointerSize());
72263320Sdim     for (SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin(),
73263320Sdim          RE = Ranges.end(); RI != RE; ++RI) {
74263320Sdim       DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
75263320Sdim@@ -525,9 +532,9 @@ DIE *DwarfDebug::constructInlinedScopeDIE(CompileU
76263320Sdim     // .debug_range section has not been laid out yet. Emit offset in
77263320Sdim     // .debug_range as a uint, size 4, for now. emitDIE will handle
78263320Sdim     // DW_AT_ranges appropriately.
79263320Sdim-    TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
80263320Sdim-                   DebugRangeSymbols.size()
81263320Sdim-                   * Asm->getDataLayout().getPointerSize());
82263320Sdim+    TheCU->addSectionOffset(ScopeDIE, dwarf::DW_AT_ranges,
83263320Sdim+                            DebugRangeSymbols.size() *
84263320Sdim+                                Asm->getDataLayout().getPointerSize());
85263320Sdim     for (SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin(),
86263320Sdim          RE = Ranges.end(); RI != RE; ++RI) {
87263320Sdim       DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first));
88263320Sdim@@ -758,14 +765,15 @@ CompileUnit *DwarfDebug::constructCompileUnit(DICo
89263320Sdim     // The line table entries are not always emitted in assembly, so it
90263320Sdim     // is not okay to use line_table_start here.
91263320Sdim     if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
92263320Sdim-      NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset,
93263320Sdim-                      UseTheFirstCU ? Asm->GetTempSymbol("section_line")
94263320Sdim-                                    : LineTableStartSym);
95263320Sdim+      NewCU->addSectionLabel(
96263320Sdim+          Die, dwarf::DW_AT_stmt_list,
97263320Sdim+          UseTheFirstCU ? Asm->GetTempSymbol("section_line")
98263320Sdim+                        : LineTableStartSym);
99263320Sdim     else if (UseTheFirstCU)
100263320Sdim-      NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
101263320Sdim+      NewCU->addSectionOffset(Die, dwarf::DW_AT_stmt_list, 0);
102263320Sdim     else
103263320Sdim-      NewCU->addDelta(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
104263320Sdim-                      LineTableStartSym, DwarfLineSectionSym);
105263320Sdim+      NewCU->addSectionDelta(Die, dwarf::DW_AT_stmt_list,
106263320Sdim+                             LineTableStartSym, DwarfLineSectionSym);
107263320Sdim 
108263320Sdim     // If we're using split dwarf the compilation dir is going to be in the
109263320Sdim     // skeleton CU and so we don't need to duplicate it here.
110263320Sdim@@ -776,26 +784,24 @@ CompileUnit *DwarfDebug::constructCompileUnit(DICo
111263320Sdim     // emit it here if we don't have a skeleton CU for split dwarf.
112263320Sdim     if (GenerateGnuPubSections) {
113263320Sdim       if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
114263320Sdim-        NewCU->addLabel(Die, dwarf::DW_AT_GNU_pubnames,
115263320Sdim-                        dwarf::DW_FORM_sec_offset,
116263320Sdim-                        Asm->GetTempSymbol("gnu_pubnames",
117263320Sdim-                                           NewCU->getUniqueID()));
118263320Sdim+        NewCU->addSectionLabel(
119263320Sdim+            Die, dwarf::DW_AT_GNU_pubnames,
120263320Sdim+            Asm->GetTempSymbol("gnu_pubnames", NewCU->getUniqueID()));
121263320Sdim       else
122263320Sdim-        NewCU->addDelta(Die, dwarf::DW_AT_GNU_pubnames, dwarf::DW_FORM_data4,
123263320Sdim-                        Asm->GetTempSymbol("gnu_pubnames",
124263320Sdim-                                           NewCU->getUniqueID()),
125263320Sdim-                        DwarfGnuPubNamesSectionSym);
126263320Sdim+        NewCU->addSectionDelta(
127263320Sdim+            Die, dwarf::DW_AT_GNU_pubnames,
128263320Sdim+            Asm->GetTempSymbol("gnu_pubnames", NewCU->getUniqueID()),
129263320Sdim+            DwarfGnuPubNamesSectionSym);
130263320Sdim 
131263320Sdim       if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
132263320Sdim-        NewCU->addLabel(Die, dwarf::DW_AT_GNU_pubtypes,
133263320Sdim-                        dwarf::DW_FORM_sec_offset,
134263320Sdim-                        Asm->GetTempSymbol("gnu_pubtypes",
135263320Sdim-                                           NewCU->getUniqueID()));
136263320Sdim+        NewCU->addSectionLabel(
137263320Sdim+            Die, dwarf::DW_AT_GNU_pubtypes,
138263320Sdim+            Asm->GetTempSymbol("gnu_pubtypes", NewCU->getUniqueID()));
139263320Sdim       else
140263320Sdim-        NewCU->addDelta(Die, dwarf::DW_AT_GNU_pubtypes, dwarf::DW_FORM_data4,
141263320Sdim-                        Asm->GetTempSymbol("gnu_pubtypes",
142263320Sdim-                                           NewCU->getUniqueID()),
143263320Sdim-                        DwarfGnuPubTypesSectionSym);
144263320Sdim+        NewCU->addSectionDelta(
145263320Sdim+            Die, dwarf::DW_AT_GNU_pubtypes,
146263320Sdim+            Asm->GetTempSymbol("gnu_pubtypes", NewCU->getUniqueID()),
147263320Sdim+            DwarfGnuPubTypesSectionSym);
148263320Sdim     }
149263320Sdim   }
150263320Sdim 
151263320Sdim@@ -2956,11 +2962,10 @@ CompileUnit *DwarfDebug::constructSkeletonCU(const
152263320Sdim   // Relocate to the beginning of the addr_base section, else 0 for the
153263320Sdim   // beginning of the one for this compile unit.
154263320Sdim   if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
155263320Sdim-    NewCU->addLabel(Die, dwarf::DW_AT_GNU_addr_base, dwarf::DW_FORM_sec_offset,
156263320Sdim-                    DwarfAddrSectionSym);
157263320Sdim+    NewCU->addSectionLabel(Die, dwarf::DW_AT_GNU_addr_base,
158263320Sdim+                           DwarfAddrSectionSym);
159263320Sdim   else
160263320Sdim-    NewCU->addUInt(Die, dwarf::DW_AT_GNU_addr_base,
161263320Sdim-                   dwarf::DW_FORM_sec_offset, 0);
162263320Sdim+    NewCU->addSectionOffset(Die, dwarf::DW_AT_GNU_addr_base, 0);
163263320Sdim 
164263320Sdim   // 2.17.1 requires that we use DW_AT_low_pc for a single entry point
165263320Sdim   // into an entity. We're using 0, or a NULL label for this.
166263320Sdim@@ -2970,10 +2975,10 @@ CompileUnit *DwarfDebug::constructSkeletonCU(const
167263320Sdim   // compile unit in debug_line section.
168263320Sdim   // FIXME: Should handle multiple compile units.
169263320Sdim   if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
170263320Sdim-    NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset,
171263320Sdim-                    DwarfLineSectionSym);
172263320Sdim+    NewCU->addSectionLabel(Die, dwarf::DW_AT_stmt_list,
173263320Sdim+                           DwarfLineSectionSym);
174263320Sdim   else
175263320Sdim-    NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset, 0);
176263320Sdim+    NewCU->addSectionOffset(Die, dwarf::DW_AT_stmt_list, 0);
177263320Sdim 
178263320Sdim   if (!CompilationDir.empty())
179263320Sdim     NewCU->addLocalString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
180263320Sdim@@ -2981,27 +2986,31 @@ CompileUnit *DwarfDebug::constructSkeletonCU(const
181263320Sdim   // Flags to let the linker know we have emitted new style pubnames.
182263320Sdim   if (GenerateGnuPubSections) {
183263320Sdim     if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
184263320Sdim-      NewCU->addLabel(Die, dwarf::DW_AT_GNU_pubnames, dwarf::DW_FORM_sec_offset,
185263320Sdim-                      Asm->GetTempSymbol("gnu_pubnames", NewCU->getUniqueID()));
186263320Sdim+      NewCU->addSectionLabel(
187263320Sdim+          Die, dwarf::DW_AT_GNU_pubnames,
188263320Sdim+          Asm->GetTempSymbol("gnu_pubnames", NewCU->getUniqueID()));
189263320Sdim     else
190263320Sdim-      NewCU->addDelta(Die, dwarf::DW_AT_GNU_pubnames, dwarf::DW_FORM_data4,
191263320Sdim-                      Asm->GetTempSymbol("gnu_pubnames", NewCU->getUniqueID()),
192263320Sdim-                      DwarfGnuPubNamesSectionSym);
193263320Sdim+      NewCU->addSectionDelta(
194263320Sdim+          Die, dwarf::DW_AT_GNU_pubnames,
195263320Sdim+          Asm->GetTempSymbol("gnu_pubnames", NewCU->getUniqueID()),
196263320Sdim+          DwarfGnuPubNamesSectionSym);
197263320Sdim 
198263320Sdim     if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
199263320Sdim-      NewCU->addLabel(Die, dwarf::DW_AT_GNU_pubtypes, dwarf::DW_FORM_sec_offset,
200263320Sdim-                      Asm->GetTempSymbol("gnu_pubtypes", NewCU->getUniqueID()));
201263320Sdim+      NewCU->addSectionLabel(
202263320Sdim+          Die, dwarf::DW_AT_GNU_pubtypes,
203263320Sdim+          Asm->GetTempSymbol("gnu_pubtypes", NewCU->getUniqueID()));
204263320Sdim     else
205263320Sdim-      NewCU->addDelta(Die, dwarf::DW_AT_GNU_pubtypes, dwarf::DW_FORM_data4,
206263320Sdim-                      Asm->GetTempSymbol("gnu_pubtypes", NewCU->getUniqueID()),
207263320Sdim-                      DwarfGnuPubTypesSectionSym);
208263320Sdim+      NewCU->addSectionDelta(
209263320Sdim+          Die, dwarf::DW_AT_GNU_pubtypes,
210263320Sdim+          Asm->GetTempSymbol("gnu_pubtypes", NewCU->getUniqueID()),
211263320Sdim+          DwarfGnuPubTypesSectionSym);
212263320Sdim   }
213263320Sdim 
214263320Sdim   // Flag if we've emitted any ranges and their location for the compile unit.
215263320Sdim   if (DebugRangeSymbols.size()) {
216263320Sdim     if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
217263320Sdim-      NewCU->addLabel(Die, dwarf::DW_AT_GNU_ranges_base,
218263320Sdim-                      dwarf::DW_FORM_sec_offset, DwarfDebugRangeSectionSym);
219263320Sdim+      NewCU->addSectionLabel(Die, dwarf::DW_AT_GNU_ranges_base,
220263320Sdim+                             DwarfDebugRangeSectionSym);
221263320Sdim     else
222263320Sdim       NewCU->addUInt(Die, dwarf::DW_AT_GNU_ranges_base, dwarf::DW_FORM_data4,
223263320Sdim                      0);
224263320SdimIndex: lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
225263320Sdim===================================================================
226263320Sdim--- lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
227263320Sdim+++ lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
228263320Sdim@@ -227,6 +227,26 @@ void CompileUnit::addLabel(DIEBlock *Die, dwarf::F
229263320Sdim   addLabel(Die, (dwarf::Attribute)0, Form, Label);
230263320Sdim }
231263320Sdim 
232263320Sdim+/// addSectionLabel - Add a Dwarf section label attribute data and value.
233263320Sdim+///
234263320Sdim+void CompileUnit::addSectionLabel(DIE *Die, dwarf::Attribute Attribute,
235263320Sdim+                                  const MCSymbol *Label) {
236263320Sdim+  if (DD->getDwarfVersion() >= 4)
237263320Sdim+    addLabel(Die, Attribute, dwarf::DW_FORM_sec_offset, Label);
238263320Sdim+  else
239263320Sdim+    addLabel(Die, Attribute, dwarf::DW_FORM_data4, Label);
240263320Sdim+}
241263320Sdim+
242263320Sdim+/// addSectionOffset - Add an offset into a section attribute data and value.
243263320Sdim+///
244263320Sdim+void CompileUnit::addSectionOffset(DIE *Die, dwarf::Attribute Attribute,
245263320Sdim+                                   uint64_t Integer) {
246263320Sdim+  if (DD->getDwarfVersion() >= 4)
247263320Sdim+    addUInt(Die, Attribute, dwarf::DW_FORM_sec_offset, Integer);
248263320Sdim+  else
249263320Sdim+    addUInt(Die, Attribute, dwarf::DW_FORM_data4, Integer);
250263320Sdim+}
251263320Sdim+
252263320Sdim /// addLabelAddress - Add a dwarf label attribute data and value using
253263320Sdim /// DW_FORM_addr or DW_FORM_GNU_addr_index.
254263320Sdim ///
255263320Sdim@@ -264,13 +284,15 @@ void CompileUnit::addOpAddress(DIEBlock *Die, cons
256263320Sdim   }
257263320Sdim }
258263320Sdim 
259263320Sdim-/// addDelta - Add a label delta attribute data and value.
260263320Sdim+/// addSectionDelta - Add a section label delta attribute data and value.
261263320Sdim ///
262263320Sdim-void CompileUnit::addDelta(DIE *Die, dwarf::Attribute Attribute,
263263320Sdim-                           dwarf::Form Form, const MCSymbol *Hi,
264263320Sdim-                           const MCSymbol *Lo) {
265263320Sdim+void CompileUnit::addSectionDelta(DIE *Die, dwarf::Attribute Attribute,
266263320Sdim+                                  const MCSymbol *Hi, const MCSymbol *Lo) {
267263320Sdim   DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
268263320Sdim-  Die->addValue(Attribute, Form, Value);
269263320Sdim+  if (DD->getDwarfVersion() >= 4)
270263320Sdim+    Die->addValue(Attribute, dwarf::DW_FORM_sec_offset, Value);
271263320Sdim+  else
272263320Sdim+    Die->addValue(Attribute, dwarf::DW_FORM_data4, Value);
273263320Sdim }
274263320Sdim 
275263320Sdim /// addDIEEntry - Add a DIE attribute data and value.
276263320Sdim@@ -1768,10 +1790,8 @@ DIE *CompileUnit::constructVariableDIE(DbgVariable
277263320Sdim 
278263320Sdim   unsigned Offset = DV.getDotDebugLocOffset();
279263320Sdim   if (Offset != ~0U) {
280263320Sdim-    addLabel(VariableDie, dwarf::DW_AT_location,
281263320Sdim-             DD->getDwarfVersion() >= 4 ? dwarf::DW_FORM_sec_offset
282263320Sdim-                                        : dwarf::DW_FORM_data4,
283263320Sdim-             Asm->GetTempSymbol("debug_loc", Offset));
284263320Sdim+    addSectionLabel(VariableDie, dwarf::DW_AT_location,
285263320Sdim+                    Asm->GetTempSymbol("debug_loc", Offset));
286263320Sdim     DV.setDIE(VariableDie);
287263320Sdim     return VariableDie;
288263320Sdim   }
289263320SdimIndex: lib/CodeGen/AsmPrinter/DwarfCompileUnit.h
290263320Sdim===================================================================
291263320Sdim--- lib/CodeGen/AsmPrinter/DwarfCompileUnit.h
292263320Sdim+++ lib/CodeGen/AsmPrinter/DwarfCompileUnit.h
293263320Sdim@@ -209,6 +209,14 @@ class CompileUnit {
294263320Sdim 
295263320Sdim   void addLabel(DIEBlock *Die, dwarf::Form Form, const MCSymbol *Label);
296263320Sdim 
297263320Sdim+  /// addSectionLabel - Add a Dwarf section label attribute data and value.
298263320Sdim+  ///
299263320Sdim+  void addSectionLabel(DIE *Die, dwarf::Attribute Attribute, const MCSymbol *Label);
300263320Sdim+
301263320Sdim+  /// addSectionOffset - Add an offset into a section attribute data and value.
302263320Sdim+  ///
303263320Sdim+  void addSectionOffset(DIE *Die, dwarf::Attribute Attribute, uint64_t Integer);
304263320Sdim+
305263320Sdim   /// addLabelAddress - Add a dwarf label attribute data and value using
306263320Sdim   /// either DW_FORM_addr or DW_FORM_GNU_addr_index.
307263320Sdim   ///
308263320Sdim@@ -219,10 +227,9 @@ class CompileUnit {
309263320Sdim   ///
310263320Sdim   void addOpAddress(DIEBlock *Die, const MCSymbol *Label);
311263320Sdim 
312263320Sdim-  /// addDelta - Add a label delta attribute data and value.
313263320Sdim-  ///
314263320Sdim-  void addDelta(DIE *Die, dwarf::Attribute Attribute, dwarf::Form Form, const MCSymbol *Hi,
315263320Sdim-                const MCSymbol *Lo);
316263320Sdim+  /// addSectionDelta - Add a label delta attribute data and value.
317263320Sdim+  void addSectionDelta(DIE *Die, dwarf::Attribute Attribute, const MCSymbol *Hi,
318263320Sdim+                       const MCSymbol *Lo);
319263320Sdim 
320263320Sdim   /// addDIEEntry - Add a DIE attribute data and value.
321263320Sdim   ///
322263320SdimIndex: test/DebugInfo/X86/gnu-public-names.ll
323263320Sdim===================================================================
324263320Sdim--- test/DebugInfo/X86/gnu-public-names.ll
325263320Sdim+++ test/DebugInfo/X86/gnu-public-names.ll
326263320Sdim@@ -1,5 +1,6 @@
327263320Sdim ; RUN: llc -mtriple=x86_64-pc-linux-gnu -generate-gnu-dwarf-pub-sections < %s | FileCheck -check-prefix=ASM %s
328263320Sdim ; RUN: llc -mtriple=x86_64-pc-linux-gnu -generate-gnu-dwarf-pub-sections -filetype=obj < %s | llvm-dwarfdump - | FileCheck %s
329263320Sdim+; RUN: llc -mtriple=x86_64-pc-linux-gnu -generate-gnu-dwarf-pub-sections -filetype=obj -dwarf-version=3 < %s | llvm-dwarfdump - | FileCheck %s -check-prefix=DWARF3
330263320Sdim ; ModuleID = 'dwarf-public-names.cpp'
331263320Sdim ;
332263320Sdim ; Generated from:
333263320Sdim@@ -123,6 +124,85 @@
334263320Sdim ; CHECK-DAG:  [[D]] EXTERNAL TYPE     "ns::D"
335263320Sdim ; CHECK-DAG:  [[INT]] STATIC   TYPE     "int"
336263320Sdim 
337263320Sdim+; DWARF3: .debug_info contents:
338263320Sdim+; DWARF3: DW_AT_GNU_pubnames [DW_FORM_data4]   (0x00000000)
339263320Sdim+; DWARF3: DW_AT_GNU_pubtypes [DW_FORM_data4]   (0x00000000)
340263320Sdim+
341263320Sdim+; DWARF3: [[C:[0-9a-f]+]]: DW_TAG_structure_type
342263320Sdim+; DWARF3-NEXT: DW_AT_name {{.*}} "C"
343263320Sdim+
344263320Sdim+; DWARF3: [[STATIC_MEM_DECL:[0-9a-f]+]]: DW_TAG_member
345263320Sdim+; DWARF3-NEXT: DW_AT_name {{.*}} "static_member_variable"
346263320Sdim+
347263320Sdim+; DWARF3: [[MEM_FUNC_DECL:[0-9a-f]+]]: DW_TAG_subprogram
348263320Sdim+; DWARF3-NEXT: DW_AT_MIPS_linkage_name
349263320Sdim+; DWARF3-NEXT: DW_AT_name {{.*}} "member_function"
350263320Sdim+
351263320Sdim+; DWARF3: [[STATIC_MEM_FUNC_DECL:[0-9a-f]+]]: DW_TAG_subprogram
352263320Sdim+; DWARF3-NEXT: DW_AT_MIPS_linkage_name
353263320Sdim+; DWARF3-NEXT: DW_AT_name {{.*}} "static_member_function"
354263320Sdim+
355263320Sdim+; DWARF3: [[INT:[0-9a-f]+]]: DW_TAG_base_type
356263320Sdim+; DWARF3-NEXT: DW_AT_name {{.*}} "int"
357263320Sdim+
358263320Sdim+; DWARF3: [[STATIC_MEM_VAR:[0-9a-f]+]]: DW_TAG_variable
359263320Sdim+; DWARF3-NEXT: DW_AT_specification {{.*}}[[STATIC_MEM_DECL]]
360263320Sdim+
361263320Sdim+; DWARF3: [[GLOB_VAR:[0-9a-f]+]]: DW_TAG_variable
362263320Sdim+; DWARF3-NEXT: DW_AT_name {{.*}} "global_variable"
363263320Sdim+
364263320Sdim+; DWARF3: [[NS:[0-9a-f]+]]: DW_TAG_namespace
365263320Sdim+; DWARF3-NEXT: DW_AT_name {{.*}} "ns"
366263320Sdim+
367263320Sdim+; DWARF3: [[GLOB_NS_VAR_DECL:[0-9a-f]+]]: DW_TAG_variable
368263320Sdim+; DWARF3-NEXT: DW_AT_name {{.*}} "global_namespace_variable"
369263320Sdim+
370263320Sdim+; DWARF3: [[D_VAR_DECL:[0-9a-f]+]]: DW_TAG_variable
371263320Sdim+; DWARF3-NEXT: DW_AT_name {{.*}} "d"
372263320Sdim+
373263320Sdim+; DWARF3: [[D:[0-9a-f]+]]: DW_TAG_structure_type
374263320Sdim+; DWARF3-NEXT: DW_AT_name {{.*}} "D"
375263320Sdim+
376263320Sdim+; DWARF3: [[GLOB_NS_FUNC:[0-9a-f]+]]: DW_TAG_subprogram
377263320Sdim+; DWARF3-NEXT: DW_AT_MIPS_linkage_name
378263320Sdim+; DWARF3-NEXT: DW_AT_name {{.*}} "global_namespace_function"
379263320Sdim+
380263320Sdim+; DWARF3: [[GLOB_NS_VAR:[0-9a-f]+]]: DW_TAG_variable
381263320Sdim+; DWARF3-NEXT: DW_AT_specification {{.*}}[[GLOB_NS_VAR_DECL]]
382263320Sdim+
383263320Sdim+; DWARF3: [[D_VAR:[0-9a-f]+]]: DW_TAG_variable
384263320Sdim+; DWARF3-NEXT: DW_AT_specification {{.*}}[[D_VAR_DECL]]
385263320Sdim+
386263320Sdim+; DWARF3: [[MEM_FUNC:[0-9a-f]+]]: DW_TAG_subprogram
387263320Sdim+; DWARF3-NEXT: DW_AT_specification {{.*}}[[MEM_FUNC_DECL]]
388263320Sdim+
389263320Sdim+; DWARF3: [[STATIC_MEM_FUNC:[0-9a-f]+]]: DW_TAG_subprogram
390263320Sdim+; DWARF3-NEXT: DW_AT_specification {{.*}}[[STATIC_MEM_FUNC_DECL]]
391263320Sdim+
392263320Sdim+; DWARF3: [[GLOBAL_FUNC:[0-9a-f]+]]: DW_TAG_subprogram
393263320Sdim+; DWARF3-NEXT: DW_AT_MIPS_linkage_name
394263320Sdim+; DWARF3-NEXT: DW_AT_name {{.*}} "global_function"
395263320Sdim+
396263320Sdim+; DWARF3-LABEL: .debug_gnu_pubnames contents:
397263320Sdim+; DWARF3-NEXT: length = 0x000000e7 version = 0x0002 unit_offset = 0x00000000 unit_size = 0x0000018b
398263320Sdim+; DWARF3-NEXT: Offset     Linkage  Kind     Name
399263320Sdim+; DWARF3-DAG:  [[GLOBAL_FUNC]] EXTERNAL FUNCTION "global_function"
400263320Sdim+; DWARF3-DAG:  [[NS]] EXTERNAL TYPE     "ns"
401263320Sdim+; DWARF3-DAG:  [[MEM_FUNC]] EXTERNAL FUNCTION "C::member_function"
402263320Sdim+; DWARF3-DAG:  [[GLOB_VAR]] EXTERNAL VARIABLE "global_variable"
403263320Sdim+; DWARF3-DAG:  [[GLOB_NS_VAR]] EXTERNAL VARIABLE "ns::global_namespace_variable"
404263320Sdim+; DWARF3-DAG:  [[GLOB_NS_FUNC]] EXTERNAL FUNCTION "ns::global_namespace_function"
405263320Sdim+; DWARF3-DAG:  [[D_VAR]] EXTERNAL VARIABLE "ns::d"
406263320Sdim+; DWARF3-DAG:  [[STATIC_MEM_VAR]] EXTERNAL VARIABLE "C::static_member_variable"
407263320Sdim+; DWARF3-DAG:  [[STATIC_MEM_FUNC]] EXTERNAL FUNCTION "C::static_member_function"
408263320Sdim+
409263320Sdim+
410263320Sdim+; DWARF3-LABEL: debug_gnu_pubtypes contents:
411263320Sdim+; DWARF3: Offset     Linkage  Kind     Name
412263320Sdim+; DWARF3-DAG:  [[C]] EXTERNAL TYPE     "C"
413263320Sdim+; DWARF3-DAG:  [[D]] EXTERNAL TYPE     "ns::D"
414263320Sdim+; DWARF3-DAG:  [[INT]] STATIC   TYPE     "int"
415263320Sdim+
416263320Sdim %struct.C = type { i8 }
417263320Sdim %"struct.ns::D" = type { i32 }
418263320Sdim 
419263320SdimIndex: test/DebugInfo/X86/stmt-list-multiple-compile-units.ll
420263320Sdim===================================================================
421263320Sdim--- test/DebugInfo/X86/stmt-list-multiple-compile-units.ll
422263320Sdim+++ test/DebugInfo/X86/stmt-list-multiple-compile-units.ll
423263320Sdim@@ -1,5 +1,7 @@
424263320Sdim ; RUN: llc -O0 %s -mtriple=x86_64-apple-darwin -filetype=obj -o %t
425263320Sdim ; RUN: llvm-dwarfdump %t | FileCheck %s
426263320Sdim+; RUN: llc -O0 %s -mtriple=x86_64-apple-darwin -filetype=obj -o %t -dwarf-version=3
427263320Sdim+; RUN: llvm-dwarfdump %t | FileCheck %s -check-prefix=DWARF3
428263320Sdim ; RUN: llc < %s -O0 -mtriple=x86_64-apple-macosx10.7 | FileCheck %s -check-prefix=ASM
429263320Sdim 
430263320Sdim ; rdar://13067005
431263320Sdim@@ -6,11 +8,11 @@
432263320Sdim ; CHECK: .debug_info contents:
433263320Sdim ; CHECK: DW_TAG_compile_unit
434263320Sdim ; CHECK: DW_AT_low_pc [DW_FORM_addr]       (0x0000000000000000)
435263320Sdim-; CHECK: DW_AT_stmt_list [DW_FORM_data4]   (0x00000000)
436263320Sdim+; CHECK: DW_AT_stmt_list [DW_FORM_sec_offset]   (0x00000000)
437263320Sdim 
438263320Sdim ; CHECK: DW_TAG_compile_unit
439263320Sdim ; CHECK: DW_AT_low_pc [DW_FORM_addr]       (0x0000000000000000)
440263320Sdim-; CHECK: DW_AT_stmt_list [DW_FORM_data4]   (0x0000003c)
441263320Sdim+; CHECK: DW_AT_stmt_list [DW_FORM_sec_offset]   (0x0000003c)
442263320Sdim 
443263320Sdim ; CHECK: .debug_line contents:
444263320Sdim ; CHECK-NEXT: Line table prologue:
445263320Sdim@@ -21,6 +23,24 @@
446263320Sdim ; CHECK: file_names[  1]    0 0x00000000 0x00000000 simple2.c
447263320Sdim ; CHECK-NOT: file_names
448263320Sdim 
449263320Sdim+; DWARF3: .debug_info contents:
450263320Sdim+; DWARF3: DW_TAG_compile_unit
451263320Sdim+; DWARF3: DW_AT_low_pc [DW_FORM_addr]       (0x0000000000000000)
452263320Sdim+; DWARF3: DW_AT_stmt_list [DW_FORM_data4]   (0x00000000)
453263320Sdim+
454263320Sdim+; DWARF3: DW_TAG_compile_unit
455263320Sdim+; DWARF3: DW_AT_low_pc [DW_FORM_addr]       (0x0000000000000000)
456263320Sdim+; DWARF3: DW_AT_stmt_list [DW_FORM_data4]   (0x0000003c)
457263320Sdim+
458263320Sdim+; DWARF3: .debug_line contents:
459263320Sdim+; DWARF3-NEXT: Line table prologue:
460263320Sdim+; DWARF3-NEXT: total_length: 0x00000038
461263320Sdim+; DWARF3: file_names[  1]    0 0x00000000 0x00000000 simple.c
462263320Sdim+; DWARF3: Line table prologue:
463263320Sdim+; DWARF3-NEXT: total_length: 0x00000039
464263320Sdim+; DWARF3: file_names[  1]    0 0x00000000 0x00000000 simple2.c
465263320Sdim+; DWARF3-NOT: file_names
466263320Sdim+
467263320Sdim ; PR15408
468263320Sdim ; ASM: L__DWARF__debug_info_begin0:
469263320Sdim ; ASM: .long   0                       ## DW_AT_stmt_list
470263320SdimIndex: test/DebugInfo/X86/block-capture.ll
471263320Sdim===================================================================
472263320Sdim--- test/DebugInfo/X86/block-capture.ll
473263320Sdim+++ test/DebugInfo/X86/block-capture.ll
474263320Sdim@@ -1,5 +1,7 @@
475263320Sdim ; RUN: llc -mtriple=x86_64-apple-darwin %s -o %t -filetype=obj
476263320Sdim ; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s
477263320Sdim+; RUN: llc -mtriple=x86_64-apple-darwin %s -o %t -filetype=obj -dwarf-version=3
478263320Sdim+; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s -check-prefix=DWARF3
479263320Sdim 
480263320Sdim ; Checks that we emit debug info for the block variable declare.
481263320Sdim ; CHECK: DW_TAG_subprogram [3]
482263320Sdim@@ -7,6 +9,11 @@
483263320Sdim ; CHECK: DW_AT_name [DW_FORM_strp]     ( .debug_str[{{.*}}] = "block")
484263320Sdim ; CHECK: DW_AT_location [DW_FORM_sec_offset]        ({{.*}})
485263320Sdim 
486263320Sdim+; DWARF3: DW_TAG_subprogram [3]
487263320Sdim+; DWARF3: DW_TAG_variable [5]
488263320Sdim+; DWARF3: DW_AT_name [DW_FORM_strp]     ( .debug_str[{{.*}}] = "block")
489263320Sdim+; DWARF3: DW_AT_location [DW_FORM_data4]        ({{.*}})
490263320Sdim+
491263320Sdim %struct.__block_descriptor = type { i64, i64 }
492263320Sdim %struct.__block_literal_generic = type { i8*, i32, i32, i8*, %struct.__block_descriptor* }
493263320Sdim 
494263320SdimIndex: test/DebugInfo/X86/op_deref.ll
495263320Sdim===================================================================
496263320Sdim--- test/DebugInfo/X86/op_deref.ll
497263320Sdim+++ test/DebugInfo/X86/op_deref.ll
498263320Sdim@@ -1,5 +1,7 @@
499263320Sdim ; RUN: llc -O0 -mtriple=x86_64-apple-darwin %s -o %t -filetype=obj
500263320Sdim ; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s -check-prefix=DW-CHECK
501263320Sdim+; RUN: llc -O0 -mtriple=x86_64-apple-darwin %s -o %t -filetype=obj -dwarf-version=3
502263320Sdim+; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s -check-prefix=DWARF3
503263320Sdim 
504263320Sdim ; DW-CHECK: DW_AT_name [DW_FORM_strp]  ( .debug_str[0x00000067] = "vla")
505263320Sdim ; FIXME: The location here needs to be fixed, but llvm-dwarfdump doesn't handle
506263320Sdim@@ -6,6 +8,11 @@
507263320Sdim ; DW_AT_location lists yet.
508263320Sdim ; DW-CHECK: DW_AT_location [DW_FORM_sec_offset]                      (0x00000000)
509263320Sdim 
510263320Sdim+; DWARF3: DW_AT_name [DW_FORM_strp]  ( .debug_str[0x00000067] = "vla")
511263320Sdim+; FIXME: The location here needs to be fixed, but llvm-dwarfdump doesn't handle
512263320Sdim+; DW_AT_location lists yet.
513263320Sdim+; DWARF3: DW_AT_location [DW_FORM_data4]                      (0x00000000)
514263320Sdim+
515263320Sdim ; Unfortunately llvm-dwarfdump can't unparse a list of DW_AT_locations
516263320Sdim ; right now, so we check the asm output:
517263320Sdim ; RUN: llc -O0 -mtriple=x86_64-apple-darwin %s -o - -filetype=asm | FileCheck %s -check-prefix=ASM-CHECK
518263320SdimIndex: test/DebugInfo/X86/DW_AT_stmt_list_sec_offset.ll
519263320Sdim===================================================================
520263320Sdim--- test/DebugInfo/X86/DW_AT_stmt_list_sec_offset.ll
521263320Sdim+++ test/DebugInfo/X86/DW_AT_stmt_list_sec_offset.ll
522263320Sdim@@ -1,7 +1,10 @@
523263320Sdim ; RUN: llc -mtriple=i686-w64-mingw32 -o %t -filetype=obj %s
524263320Sdim ; RUN: llvm-dwarfdump -debug-dump=all %t | FileCheck %s
525263320Sdim+; RUN: llc -mtriple=i686-w64-mingw32 -o %t -filetype=obj -dwarf-version=3 %s
526263320Sdim+; RUN: llvm-dwarfdump -debug-dump=all %t | FileCheck %s -check-prefix=DWARF3
527263320Sdim 
528263320Sdim ; CHECK:  	 DW_AT_stmt_list [DW_FORM_sec_offset]
529263320Sdim+; DWARF3:        DW_AT_stmt_list [DW_FORM_data4]
530263320Sdim ;
531263320Sdim ; generated from:
532263320Sdim ; clang -g -S -emit-llvm test.c -o test.ll
533263320Sdim@@ -36,6 +39,6 @@ attributes #0 = { nounwind "less-precise-fpmad"="f
534263320Sdim !6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
535263320Sdim !7 = metadata !{metadata !8}
536263320Sdim !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]
537263320Sdim-!9 = metadata !{i32 2, metadata !"Dwarf Version", i32 3}
538263320Sdim+!9 = metadata !{i32 2, metadata !"Dwarf Version", i32 4}
539263320Sdim !10 = metadata !{i32 3, i32 0, metadata !4, null}
540263320Sdim !11 = metadata !{i32 1, metadata !"Debug Info Version", i32 1}
541