[PATCH] Emit DWARF info for all code section in an assembly file

Oliver Stannard oliver.stannard at arm.com
Tue Feb 11 05:45:19 PST 2014


  Added -gdwarf-N options to llvm-mc.

  Added error if trying to compile an asm file with multiple sections using -gdwarf-2.

  Se also D2737, for clang part adding -gdwarf-N options to cc1as.

Hi echristo,

http://llvm-reviews.chandlerc.com/D2697

CHANGE SINCE LAST DIFF
  http://llvm-reviews.chandlerc.com/D2697?vs=6881&id=6982#toc

Files:
  include/llvm/MC/MCContext.h
  lib/MC/MCDwarf.cpp
  lib/MC/MCParser/ELFAsmParser.cpp
  test/MC/ARM/dwarf-asm-multiple-sections.s
  tools/llvm-mc/llvm-mc.cpp

Index: include/llvm/MC/MCContext.h
===================================================================
--- include/llvm/MC/MCContext.h
+++ include/llvm/MC/MCContext.h
@@ -144,6 +144,9 @@
     /// non-empty.
     StringRef DwarfDebugProducer;
 
+    /// The maximum version of dwarf that we should emit.
+    unsigned DwarfVersion;
+
     /// Honor temporary labels, this is useful for debugging semantic
     /// differences between temporary and non-temporary labels (primarily on
     /// Darwin).
@@ -408,6 +411,9 @@
     void setDwarfDebugProducer(StringRef S) { DwarfDebugProducer = S; }
     StringRef getDwarfDebugProducer() { return DwarfDebugProducer; }
 
+    void setDwarfVersion(unsigned v) { DwarfVersion = v; }
+    unsigned getDwarfVersion() const { return DwarfVersion; }
+
     /// @}
 
     char *getSecureLogFile() { return SecureLogFile; }
Index: lib/MC/MCDwarf.cpp
===================================================================
--- lib/MC/MCDwarf.cpp
+++ lib/MC/MCDwarf.cpp
@@ -611,8 +611,8 @@
   const MCExpr *Length = MakeStartMinusEndExpr(*MCOS, *InfoStart, *InfoEnd, 4);
   MCOS->EmitAbsValue(Length, 4);
 
-  // The 2 byte DWARF version, which is 3.
-  MCOS->EmitIntValue(3, 2);
+  // The 2 byte DWARF version.
+  MCOS->EmitIntValue(context.getDwarfVersion(), 2);
 
   // The 4 byte offset to the debug abbrevs from the start of the .debug_abbrev,
   // it is at the start of that section so this is zero.
Index: lib/MC/MCParser/ELFAsmParser.cpp
===================================================================
--- lib/MC/MCParser/ELFAsmParser.cpp
+++ lib/MC/MCParser/ELFAsmParser.cpp
@@ -150,7 +150,7 @@
 
 private:
   bool ParseSectionName(StringRef &SectionName);
-  bool ParseSectionArguments(bool IsPush);
+  bool ParseSectionArguments(bool IsPush, SMLoc loc);
 };
 
 }
@@ -325,7 +325,7 @@
 bool ELFAsmParser::ParseDirectivePushSection(StringRef s, SMLoc loc) {
   getStreamer().PushSection();
 
-  if (ParseSectionArguments(/*IsPush=*/true)) {
+  if (ParseSectionArguments(/*IsPush=*/true, loc)) {
     getStreamer().PopSection();
     return true;
   }
@@ -340,11 +340,11 @@
 }
 
 // FIXME: This is a work in progress.
-bool ELFAsmParser::ParseDirectiveSection(StringRef, SMLoc) {
-  return ParseSectionArguments(/*IsPush=*/false);
+bool ELFAsmParser::ParseDirectiveSection(StringRef, SMLoc loc) {
+  return ParseSectionArguments(/*IsPush=*/false, loc);
 }
 
-bool ELFAsmParser::ParseSectionArguments(bool IsPush) {
+bool ELFAsmParser::ParseSectionArguments(bool IsPush, SMLoc loc) {
   StringRef SectionName;
 
   if (ParseSectionName(SectionName))
@@ -488,6 +488,9 @@
 
   if (!getContext().getGenDwarfSections().count(ELFSection)) {
     getContext().addGenDwarfSection(ELFSection);
+    if (   getContext().getDwarfVersion() <= 2
+        && getContext().getGenDwarfSections().size() > 1)
+      Error(loc, "DWARF2 only supports one section per compilation unit");
   }
 
   if (!getContext().getGenDwarfSectionStartSym(ELFSection)) {
Index: test/MC/ARM/dwarf-asm-multiple-sections.s
===================================================================
--- test/MC/ARM/dwarf-asm-multiple-sections.s
+++ test/MC/ARM/dwarf-asm-multiple-sections.s
@@ -1,7 +1,7 @@
 // RUN: llvm-mc < %s -triple=armv7-linux-gnueabi -filetype=obj -o %t -g
 // RUN: llvm-dwarfdump %t | FileCheck -check-prefix DWARF %s
 // RUN: llvm-objdump -r %t | FileCheck -check-prefix RELOC %s
-
+// RUN: not llvm-mc < %s -triple=armv7-linux-gnueabi -filetype=obj -o %t -g -gdwarf-2 2>&1 | FileCheck -check-prefix VERSION %s
   .section .text, "ax"
 a:
   mov r0, r0
@@ -62,3 +62,6 @@
 // RELOC-NEXT: 6 R_ARM_ABS32 .debug_info
 // RELOC-NEXT: 16 R_ARM_ABS32 .text
 // RELOC-NEXT: 24 R_ARM_ABS32 foo
+
+
+// VERSION: {{.*}} error: DWARF2 only supports one section per compilation unit
Index: tools/llvm-mc/llvm-mc.cpp
===================================================================
--- tools/llvm-mc/llvm-mc.cpp
+++ tools/llvm-mc/llvm-mc.cpp
@@ -153,6 +153,13 @@
 GenDwarfForAssembly("g", cl::desc("Generate dwarf debugging info for assembly "
                                   "source files"));
 
+static cl::opt<bool>
+DwarfVersion2("gdwarf-2", cl::desc("Limit debugging info to dwarf version 2"));
+static cl::opt<bool>
+DwarfVersion3("gdwarf-3", cl::desc("Limit debugging info to dwarf version 3"));
+static cl::opt<bool>
+DwarfVersion4("gdwarf-4", cl::desc("Limit debugging info to dwarf version 4"));
+
 static cl::opt<std::string>
 DebugCompilationDir("fdebug-compilation-dir",
                     cl::desc("Specifies the debug info's compilation dir"));
@@ -395,6 +402,14 @@
     Ctx.setAllowTemporaryLabels(false);
 
   Ctx.setGenDwarfForAssembly(GenDwarfForAssembly);
+  // Use the highest requested dwarf version, defaulting to 3
+  Ctx.setDwarfVersion(3);
+  if (DwarfVersion2)
+    Ctx.setDwarfVersion(2);
+  if (DwarfVersion3)
+    Ctx.setDwarfVersion(3);
+  if (DwarfVersion4)
+    Ctx.setDwarfVersion(4);
   if (!DwarfDebugFlags.empty())
     Ctx.setDwarfDebugFlags(StringRef(DwarfDebugFlags));
   if (!DwarfDebugProducer.empty())
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D2697.2.patch
Type: text/x-patch
Size: 5061 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140211/06d21df4/attachment.bin>


More information about the llvm-commits mailing list