]> granicus.if.org Git - llvm/commitdiff
Emit S_COMPILE3 CodeView record
authorAdrian McCarthy <amccarth@google.com>
Tue, 20 Sep 2016 17:20:51 +0000 (17:20 +0000)
committerAdrian McCarthy <amccarth@google.com>
Tue, 20 Sep 2016 17:20:51 +0000 (17:20 +0000)
CodeView has an S_COMPILE3 record to identify the compiler and source language of the compiland.  This record comes first in the debug$S section for the compiland. The debuggers rely on this record to know the source language of the code.

There was a little test fallout from introducing a new record into the symbols subsection.

Differential Revision: https://reviews.llvm.org/D24317

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

lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
lib/CodeGen/AsmPrinter/CodeViewDebug.h
test/DebugInfo/COFF/asm.ll
test/DebugInfo/COFF/globals.ll
test/DebugInfo/COFF/multifile.ll
test/DebugInfo/COFF/multifunction.ll
test/DebugInfo/COFF/simple.ll
test/DebugInfo/COFF/typedef.ll
test/DebugInfo/COFF/types-array.ll
test/MC/ARM/coff-debugging-secrel.ll
test/MC/COFF/cv-compiler-info.ll [new file with mode: 0644]

index 532c9f07b994874862de95db1c663aea94db850e..f5f7b1363168c1f64a6ceec4db4f3d75ff6bb516 100644 (file)
@@ -504,6 +504,131 @@ void CodeViewDebug::emitTypeInformation() {
       });
 }
 
+namespace {
+
+static SourceLanguage MapDWLangToCVLang(unsigned DWLang) {
+  switch (DWLang) {
+  case dwarf::DW_LANG_C:
+  case dwarf::DW_LANG_C89:
+  case dwarf::DW_LANG_C99:
+  case dwarf::DW_LANG_C11:
+  case dwarf::DW_LANG_ObjC:
+    return SourceLanguage::C;
+  case dwarf::DW_LANG_C_plus_plus:
+  case dwarf::DW_LANG_C_plus_plus_03:
+  case dwarf::DW_LANG_C_plus_plus_11:
+  case dwarf::DW_LANG_C_plus_plus_14:
+    return SourceLanguage::Cpp;
+  case dwarf::DW_LANG_Fortran77:
+  case dwarf::DW_LANG_Fortran90:
+  case dwarf::DW_LANG_Fortran03:
+  case dwarf::DW_LANG_Fortran08:
+    return SourceLanguage::Fortran;
+  case dwarf::DW_LANG_Pascal83:
+    return SourceLanguage::Pascal;
+  case dwarf::DW_LANG_Cobol74:
+  case dwarf::DW_LANG_Cobol85:
+    return SourceLanguage::Cobol;
+  case dwarf::DW_LANG_Java:
+    return SourceLanguage::Java;
+  default:
+    // There's no CodeView representation for this language, and CV doesn't
+    // have an "unknown" option for the language field, so we'll use MASM,
+    // as it's very low level.
+    return SourceLanguage::Masm;
+  }
+}
+
+struct Version {
+  int Part[4];
+};
+
+// Takes a StringRef like "clang 4.0.0.0 (other nonsense 123)" and parses out
+// the version number.
+static Version parseVersion(StringRef Name) {
+  Version V = {0};
+  int N = 0;
+  for (const char C : Name) {
+    if (isdigit(C)) {
+      V.Part[N] *= 10;
+      V.Part[N] += C - '0';
+    } else if (C == '.') {
+      ++N;
+      if (N >= 4)
+        return V;
+    } else if (N > 0)
+      return V;
+  }
+  return V;
+}
+
+static CPUType mapArchToCVCPUType(Triple::ArchType Type) {
+  switch (Type) {
+    case Triple::ArchType::x86:
+      return CPUType::Pentium3;
+    case Triple::ArchType::x86_64:
+      return CPUType::X64;
+    case Triple::ArchType::thumb:
+      return CPUType::Thumb;
+    default:
+      report_fatal_error("target architecture doesn't map to a CodeView "
+                         "CPUType");
+  }
+}
+
+}  // anonymous namespace
+
+void CodeViewDebug::emitCompilerInformation() {
+  MCContext &Context = MMI->getContext();
+  MCSymbol *CompilerBegin = Context.createTempSymbol(),
+           *CompilerEnd = Context.createTempSymbol();
+  OS.AddComment("Record length");
+  OS.emitAbsoluteSymbolDiff(CompilerEnd, CompilerBegin, 2);
+  OS.EmitLabel(CompilerBegin);
+  OS.AddComment("Record kind: S_COMPILE3");
+  OS.EmitIntValue(SymbolKind::S_COMPILE3, 2);
+  uint32_t Flags = 0;
+
+  NamedMDNode *CUs = MMI->getModule()->getNamedMetadata("llvm.dbg.cu");
+  const MDNode *Node = *CUs->operands().begin();
+  const auto *CU = cast<DICompileUnit>(Node);
+
+  // The low byte of the flags indicates the source language.
+  Flags = MapDWLangToCVLang(CU->getSourceLanguage());
+  // TODO:  Figure out which other flags need to be set.
+
+  OS.AddComment("Flags and language");
+  OS.EmitIntValue(Flags, 4);
+
+  OS.AddComment("CPUType");
+  CPUType CPU =
+      mapArchToCVCPUType(Triple(MMI->getModule()->getTargetTriple()).getArch());
+  OS.EmitIntValue(static_cast<uint64_t>(CPU), 2);
+
+  StringRef CompilerVersion = CU->getProducer();
+  Version FrontVer = parseVersion(CompilerVersion);
+  OS.AddComment("Frontend version");
+  for (int N = 0; N < 4; ++N)
+    OS.EmitIntValue(FrontVer.Part[N], 2);
+
+  // Some Microsoft tools, like Binscope, expect a backend version number of at
+  // least 8.something, so we'll coerce the LLVM version into a form that
+  // guarantees it'll be big enough without really lying about the version.
+  Version BackVer = {
+      1000 * LLVM_VERSION_MAJOR +
+      10 * LLVM_VERSION_MINOR +
+      LLVM_VERSION_PATCH,
+      0, 0, 0 };
+  OS.AddComment("Backend version");
+  for (int N = 0; N < 4; ++N)
+    OS.EmitIntValue(BackVer.Part[N], 2);
+
+  OS.AddComment("Null-terminated compiler version string");
+  emitNullTerminatedSymbolName(OS, CompilerVersion);
+
+  OS.EmitLabel(CompilerEnd);
+}
+
 void CodeViewDebug::emitInlineeLinesSubsection() {
   if (InlinedSubprograms.empty())
     return;
@@ -1971,6 +2096,8 @@ MCSymbol *CodeViewDebug::beginCVSubsection(ModuleSubstreamKind Kind) {
   OS.AddComment("Subsection size");
   OS.emitAbsoluteSymbolDiff(EndLabel, BeginLabel, 4);
   OS.EmitLabel(BeginLabel);
+  if (Kind == ModuleSubstreamKind::Symbols)
+    emitCompilerInformation();
   return EndLabel;
 }
 
index 0149af5e84f9406429c80936609193d6e37805fd..25b3f2c3a9525c985ca67881ab83dd1973b51edc 100644 (file)
@@ -191,6 +191,8 @@ class LLVM_LIBRARY_VISIBILITY CodeViewDebug : public DebugHandlerBase {
 
   void emitTypeInformation();
 
+  void emitCompilerInformation();
+
   void emitInlineeLinesSubsection();
 
   void emitDebugInfoForFunction(const Function *GV, FunctionInfo &FI);
index d737a659b0c86e1ba601eb94c37901b14555b66e..25a012e04ca5dcd103081c46e86c4701ee8f4f7e 100644 (file)
 ; Symbol subsection
 ; X86-NEXT: .long   241
 ; X86-NEXT: .long [[F1_END:.*]]-[[F1_START:.*]] #
+; Compiler information record
 ; X86-NEXT: [[F1_START]]:
+; X86-NEXT: .short [[C1_END:.*]]-[[C1_START:.*]] #
+; X86:      [[C1_END]]:
 ; X86-NEXT: .short [[PROC_SEGMENT_END:.*]]-[[PROC_SEGMENT_START:.*]] #
 ; X86-NEXT: [[PROC_SEGMENT_START]]:
 ; X86-NEXT: .short  4423
 ; OBJ32:      Characteristics [ (0x42300040)
 ; OBJ32:      ]
 ; OBJ32:      Relocations [
-; OBJ32-NEXT:   0x2C IMAGE_REL_I386_SECREL _f
-; OBJ32-NEXT:   0x30 IMAGE_REL_I386_SECTION _f
-; OBJ32-NEXT:   0x44 IMAGE_REL_I386_SECREL _f
-; OBJ32-NEXT:   0x48 IMAGE_REL_I386_SECTION _f
+; OBJ32-NEXT:   0x59 IMAGE_REL_I386_SECREL _f
+; OBJ32-NEXT:   0x5D IMAGE_REL_I386_SECTION _f
+; OBJ32-NEXT:   0x70 IMAGE_REL_I386_SECREL _f
+; OBJ32-NEXT:   0x74 IMAGE_REL_I386_SECTION _f
 ; OBJ32-NEXT: ]
 ; OBJ32:    CodeViewDebugInfo [
 ; OBJ32:      Subsection [
 ; OBJ32-NEXT:   SubSectionType: Symbols (0xF1)
-; OBJ32-NOT:    ]
 ; OBJ32:        ProcStart {
 ; OBJ32:          CodeSize: 0x6
 ; OBJ32:          DisplayName: f
 ; Symbol subsection
 ; X64-NEXT: .long   241
 ; X64-NEXT: .long [[F1_END:.*]]-[[F1_START:.*]] #
+; Compiler information record
 ; X64-NEXT: [[F1_START]]:
+; X64-NEXT: .short [[C1_END:.*]]-[[C1_START:.*]] #
+; X64:      [[C1_END]]:
 ; X64-NEXT: .short [[PROC_SEGMENT_END:.*]]-[[PROC_SEGMENT_START:.*]] #
 ; X64-NEXT: [[PROC_SEGMENT_START]]:
 ; X64-NEXT: .short  4423
 ; OBJ64:      Characteristics [ (0x42300040)
 ; OBJ64:      ]
 ; OBJ64:      Relocations [
-; OBJ64-NEXT:   0x2C IMAGE_REL_AMD64_SECREL f
-; OBJ64-NEXT:   0x30 IMAGE_REL_AMD64_SECTION f
-; OBJ64-NEXT:   0x44 IMAGE_REL_AMD64_SECREL f
-; OBJ64-NEXT:   0x48 IMAGE_REL_AMD64_SECTION f
+; OBJ64-NEXT:   0x59 IMAGE_REL_AMD64_SECREL f
+; OBJ64-NEXT:   0x5D IMAGE_REL_AMD64_SECTION f
+; OBJ64-NEXT:   0x70 IMAGE_REL_AMD64_SECREL f
+; OBJ64-NEXT:   0x74 IMAGE_REL_AMD64_SECTION f
 ; OBJ64-NEXT: ]
 ; OBJ64:      Subsection [
 ; OBJ64-NEXT:   SubSectionType: Symbols (0xF1)
-; OBJ64-NOT:    ]
 ; OBJ64:        ProcStart {
 ; OBJ64:          CodeSize: 0xE
 ; OBJ64:          DisplayName: f
index 2f520ba6454a45eb44cce84166394bce94290cc7..92952306439481c8c945ad162817f4cddcba5bb6 100644 (file)
 ; OBJ:   Magic: 0x4
 ; OBJ:   Subsection [
 ; OBJ:     SubSectionType: Symbols (0xF1)
-; OBJ:     SubSectionSize: 0x15
 ; OBJ:     DataSym {
 ; OBJ:       DataOffset: ?comdat@?$A@X@@2HB+0x0
 ; OBJ:       Type: const int (0x1000)
index d39413adf163721b06ea59d0feb90331568c6b05..cb6dba62d5f5fe2ce2771df491ae7655f09affee 100644 (file)
 ; Symbol subsection
 ; X86-NEXT: .long   241
 ; X86-NEXT: .long [[F1_END:.*]]-[[F1_START:.*]] #
+; Compiler information record
 ; X86-NEXT: [[F1_START]]:
+; X86-NEXT: .short [[C1_END:.*]]-[[C1_START:.*]] #
+; X86:      [[C1_END]]:
 ; X86-NEXT: .short [[PROC_SEGMENT_END:.*]]-[[PROC_SEGMENT_START:.*]] #
 ; X86-NEXT: [[PROC_SEGMENT_START]]:
 ; X86-NEXT: .short  4423
 ; OBJ32:      Characteristics [ (0x42300040)
 ; OBJ32:      ]
 ; OBJ32:      Relocations [
-; OBJ32-NEXT:   0x2C IMAGE_REL_I386_SECREL _f
-; OBJ32-NEXT:   0x30 IMAGE_REL_I386_SECTION _f
-; OBJ32-NEXT:   0x44 IMAGE_REL_I386_SECREL _f
-; OBJ32-NEXT:   0x48 IMAGE_REL_I386_SECTION _f
+; OBJ32-NEXT:   0x59 IMAGE_REL_I386_SECREL _f
+; OBJ32-NEXT:   0x5D IMAGE_REL_I386_SECTION _f
+; OBJ32-NEXT:   0x70 IMAGE_REL_I386_SECREL _f
+; OBJ32-NEXT:   0x74 IMAGE_REL_I386_SECTION _f
 ; OBJ32-NEXT: ]
 ; OBJ32:      Subsection [
 ; OBJ32-NEXT:   SubSectionType: Symbols (0xF1)
-; OBJ32-NOT:    ]
 ; OBJ32:        ProcStart {
 ; OBJ32:          CodeSize: 0x10
 ; OBJ32:          DisplayName: f
 ; Symbol subsection
 ; X64-NEXT: .long   241
 ; X64-NEXT: .long [[F1_END:.*]]-[[F1_START:.*]] #
+; Compiler information record
 ; X64-NEXT: [[F1_START]]:
+; X64-NEXT: .short [[C1_END:.*]]-[[C1_START:.*]] #
+; X64:      [[C1_END]]:
 ; X64-NEXT: .short [[PROC_SEGMENT_END:.*]]-[[PROC_SEGMENT_START:.*]] #
 ; X64-NEXT: [[PROC_SEGMENT_START]]:
 ; X64-NEXT: .short  4423
 ; OBJ64:      Characteristics [ (0x42300040)
 ; OBJ64:      ]
 ; OBJ64:      Relocations [
-; OBJ64-NEXT:   0x2C IMAGE_REL_AMD64_SECREL f
-; OBJ64-NEXT:   0x30 IMAGE_REL_AMD64_SECTION f
-; OBJ64-NEXT:   0x44 IMAGE_REL_AMD64_SECREL f
-; OBJ64-NEXT:   0x48 IMAGE_REL_AMD64_SECTION f
+; OBJ64-NEXT:   0x59 IMAGE_REL_AMD64_SECREL f
+; OBJ64-NEXT:   0x5D IMAGE_REL_AMD64_SECTION f
+; OBJ64-NEXT:   0x70 IMAGE_REL_AMD64_SECREL f
+; OBJ64-NEXT:   0x74 IMAGE_REL_AMD64_SECTION f
 ; OBJ64-NEXT: ]
 ; OBJ64:      Subsection [
 ; OBJ64-NEXT:   SubSectionType: Symbols (0xF1)
-; OBJ64-NOT:    ]
 ; OBJ64:        ProcStart {
 ; OBJ64:          CodeSize: 0x18
 ; OBJ64:          DisplayName: f
index 4e61e417ebc8ed5f2fb670f1894dbf0d6aa61b25..348dd39e39a5cadb77c3bd83848ddf2ab5380a45 100644 (file)
 ; Symbol subsection for x
 ; X86-NEXT: .long   241
 ; X86-NEXT: .long [[F1_END:.*]]-[[F1_START:.*]] #
+; Compiler information record
 ; X86-NEXT: [[F1_START]]:
+; X86-NEXT: .short [[C1_END:.*]]-[[C1_START:.*]] #
+; X86:      [[C1_END]]:
 ; X86-NEXT: .short [[PROC_SEGMENT_END:.*]]-[[PROC_SEGMENT_START:.*]] #
 ; X86-NEXT: [[PROC_SEGMENT_START]]:
 ; X86-NEXT: .short  4422
 ; Symbol subsection for y
 ; X86-NEXT: .long   241
 ; X86-NEXT: .long [[F1_END:.*]]-[[F1_START:.*]] #
+; Compiler information record
 ; X86-NEXT: [[F1_START]]:
+; X86-NEXT: .short [[C1_END:.*]]-[[C1_START:.*]] #
+; X86:      [[C1_END]]:
 ; X86-NEXT: .short [[PROC_SEGMENT_END:.*]]-[[PROC_SEGMENT_START:.*]] #
 ; X86-NEXT: [[PROC_SEGMENT_START]]:
 ; X86-NEXT: .short  4423
 ; Symbol subsection for f
 ; X86-NEXT: .long   241
 ; X86-NEXT: .long [[F1_END:.*]]-[[F1_START:.*]] #
+; Compiler information record
 ; X86-NEXT: [[F1_START]]:
+; X86-NEXT: .short [[C1_END:.*]]-[[C1_START:.*]] #
+; X86:      [[C1_END]]:
 ; X86-NEXT: .short [[PROC_SEGMENT_END:.*]]-[[PROC_SEGMENT_START:.*]] #
 ; X86-NEXT: [[PROC_SEGMENT_START]]:
 ; X86-NEXT: .short  4423
 ; OBJ32:      Characteristics [ (0x42300040)
 ; OBJ32:      ]
 ; OBJ32:      Relocations [
-; OBJ32-NEXT:   0x2C IMAGE_REL_I386_SECREL _x
-; OBJ32-NEXT:   0x30 IMAGE_REL_I386_SECTION _x
-; OBJ32-NEXT:   0x44 IMAGE_REL_I386_SECREL _x
-; OBJ32-NEXT:   0x48 IMAGE_REL_I386_SECTION _x
-; OBJ32-NEXT:   0x9C IMAGE_REL_I386_SECREL _y
-; OBJ32-NEXT:   0xA0 IMAGE_REL_I386_SECTION _y
-; OBJ32-NEXT:   0xB4 IMAGE_REL_I386_SECREL _y
-; OBJ32-NEXT:   0xB8 IMAGE_REL_I386_SECTION _y
-; OBJ32-NEXT:   0x10C IMAGE_REL_I386_SECREL _f
-; OBJ32-NEXT:   0x110 IMAGE_REL_I386_SECTION _f
-; OBJ32-NEXT:   0x124 IMAGE_REL_I386_SECREL _f
-; OBJ32-NEXT:   0x128 IMAGE_REL_I386_SECTION _f
+; OBJ32-NEXT:   0x59 IMAGE_REL_I386_SECREL _x
+; OBJ32-NEXT:   0x5D IMAGE_REL_I386_SECTION _x
+; OBJ32-NEXT:   0x70 IMAGE_REL_I386_SECREL _x
+; OBJ32-NEXT:   0x74 IMAGE_REL_I386_SECTION _x
+; OBJ32-NEXT:   0xF5 IMAGE_REL_I386_SECREL _y
+; OBJ32-NEXT:   0xF9 IMAGE_REL_I386_SECTION _y
+; OBJ32-NEXT:   0x10C IMAGE_REL_I386_SECREL _y
+; OBJ32-NEXT:   0x110 IMAGE_REL_I386_SECTION _y
+; OBJ32-NEXT:   0x191 IMAGE_REL_I386_SECREL _f
+; OBJ32-NEXT:   0x195 IMAGE_REL_I386_SECTION _f
+; OBJ32-NEXT:   0x1A8 IMAGE_REL_I386_SECREL _f
+; OBJ32-NEXT:   0x1AC IMAGE_REL_I386_SECTION _f
 ; OBJ32-NEXT: ]
 ; OBJ32:      Subsection [
 ; OBJ32-NEXT:   SubSectionType: Symbols (0xF1)
-; OBJ32-NOT:    ]
 ; OBJ32:        ProcStart {
 ; OBJ32:          Kind: S_LPROC32_ID (0x1146)
 ; OBJ32:          CodeSize: 0x6
 ; OBJ32:      ]
 ; OBJ32:      Subsection [
 ; OBJ32-NEXT:   SubSectionType: Symbols (0xF1)
-; OBJ32-NOT:    ]
 ; OBJ32:        ProcStart {
 ; OBJ32:          Kind: S_GPROC32_ID (0x1147)
 ; OBJ32:          CodeSize: 0x6
 ; OBJ32:      ]
 ; OBJ32:      Subsection [
 ; OBJ32-NEXT:   SubSectionType: Symbols (0xF1)
-; OBJ32-NOT:    ]
 ; OBJ32:        ProcStart {
 ; OBJ32:          Kind: S_GPROC32_ID (0x1147)
 ; OBJ32:          CodeSize: 0x10
 ; Symbol subsection for x
 ; X64-NEXT: .long   241
 ; X64-NEXT: .long [[F1_END:.*]]-[[F1_START:.*]] #
+; Compiler information record
 ; X64-NEXT: [[F1_START]]:
+; X64-NEXT: .short [[C1_END:.*]]-[[C1_START:.*]] #
+; X64:      [[C1_END]]:
 ; X64-NEXT: .short [[PROC_SEGMENT_END:.*]]-[[PROC_SEGMENT_START:.*]] #
 ; X64-NEXT: [[PROC_SEGMENT_START]]:
 ; X64-NEXT: .short  4422
 ; Symbol subsection for y
 ; X64-NEXT: .long   241
 ; X64-NEXT: .long [[F1_END:.*]]-[[F1_START:.*]] #
+; Compiler information record
 ; X64-NEXT: [[F1_START]]:
+; X64-NEXT: .short [[C1_END:.*]]-[[C1_START:.*]] #
+; X64:      [[C1_END]]:
 ; X64-NEXT: .short [[PROC_SEGMENT_END:.*]]-[[PROC_SEGMENT_START:.*]] #
 ; X64-NEXT: [[PROC_SEGMENT_START]]:
 ; X64-NEXT: .short  4423
 ; Symbol subsection for f
 ; X64-NEXT: .long   241
 ; X64-NEXT: .long [[F1_END:.*]]-[[F1_START:.*]] #
+; Compiler information record
 ; X64-NEXT: [[F1_START]]:
+; X64-NEXT: .short [[C1_END:.*]]-[[C1_START:.*]] #
+; X64:      [[C1_END]]:
 ; X64-NEXT: .short [[PROC_SEGMENT_END:.*]]-[[PROC_SEGMENT_START:.*]] #
 ; X64-NEXT: [[PROC_SEGMENT_START]]:
 ; X64-NEXT: .short  4423
 ; OBJ64:      Characteristics [ (0x42300040)
 ; OBJ64:      ]
 ; OBJ64:      Relocations [
-; OBJ64-NEXT:   0x2C IMAGE_REL_AMD64_SECREL x
-; OBJ64-NEXT:   0x30 IMAGE_REL_AMD64_SECTION x
-; OBJ64-NEXT:   0x44 IMAGE_REL_AMD64_SECREL x
-; OBJ64-NEXT:   0x48 IMAGE_REL_AMD64_SECTION x
-; OBJ64-NEXT:   0xA8 IMAGE_REL_AMD64_SECREL y
-; OBJ64-NEXT:   0xAC IMAGE_REL_AMD64_SECTION y
-; OBJ64-NEXT:   0xC0 IMAGE_REL_AMD64_SECREL y
-; OBJ64-NEXT:   0xC4 IMAGE_REL_AMD64_SECTION y
-; OBJ64-NEXT:   0x124 IMAGE_REL_AMD64_SECREL f
-; OBJ64-NEXT:   0x128 IMAGE_REL_AMD64_SECTION f
-; OBJ64-NEXT:   0x13C IMAGE_REL_AMD64_SECREL f
-; OBJ64-NEXT:   0x140 IMAGE_REL_AMD64_SECTION f
+; OBJ64-NEXT:   0x59 IMAGE_REL_AMD64_SECREL x
+; OBJ64-NEXT:   0x5D IMAGE_REL_AMD64_SECTION x
+; OBJ64-NEXT:   0x70 IMAGE_REL_AMD64_SECREL x
+; OBJ64-NEXT:   0x74 IMAGE_REL_AMD64_SECTION x
+; OBJ64-NEXT:   0x101 IMAGE_REL_AMD64_SECREL y
+; OBJ64-NEXT:   0x105 IMAGE_REL_AMD64_SECTION y
+; OBJ64-NEXT:   0x118 IMAGE_REL_AMD64_SECREL y
+; OBJ64-NEXT:   0x11C IMAGE_REL_AMD64_SECTION y
+; OBJ64-NEXT:   0x1A9 IMAGE_REL_AMD64_SECREL f
+; OBJ64-NEXT:   0x1AD IMAGE_REL_AMD64_SECTION f
+; OBJ64-NEXT:   0x1C0 IMAGE_REL_AMD64_SECREL f
+; OBJ64-NEXT:   0x1C4 IMAGE_REL_AMD64_SECTION f
 ; OBJ64-NEXT: ]
 ; OBJ64:      Subsection [
 ; OBJ64-NEXT:   SubSectionType: Symbols (0xF1)
-; OBJ64-NOT:    ]
 ; OBJ64:        ProcStart {
 ; OBJ64:          Kind: S_LPROC32_ID (0x1146)
 ; OBJ64:          CodeSize: 0xE
 ; OBJ64:      ]
 ; OBJ64:      Subsection [
 ; OBJ64-NEXT:   SubSectionType: Symbols (0xF1)
-; OBJ64-NOT:    ]
 ; OBJ64:        ProcStart {
 ; OBJ64:          Kind: S_GPROC32_ID (0x1147)
 ; OBJ64:          CodeSize: 0xE
 ; OBJ64:      ]
 ; OBJ64:      Subsection [
 ; OBJ64-NEXT:   SubSectionType: Symbols (0xF1)
-; OBJ64-NOT:    ]
 ; OBJ64:        ProcStart {
 ; OBJ64:          Kind: S_GPROC32_ID (0x1147)
 ; OBJ64:          CodeSize: 0x18
index 217ae442e93c2d2d8d0994ceeb35b6a817879023..292aedd7b367d2ab8ca8eed6e275b60d16089dc8 100644 (file)
 ; Symbol subsection
 ; X86-NEXT: .long   241
 ; X86-NEXT: .long [[F1_END:.*]]-[[F1_START:.*]] #
+; Compiler information record
 ; X86-NEXT: [[F1_START]]:
+; X86-NEXT: .short [[C1_END:.*]]-[[C1_START:.*]] #
+; X86:      [[C1_END]]:
 ; X86-NEXT: .short [[PROC_SEGMENT_END:.*]]-[[PROC_SEGMENT_START:.*]] #
 ; X86-NEXT: [[PROC_SEGMENT_START]]:
 ; X86-NEXT: .short  4423
 ; OBJ32:      Characteristics [ (0x42300040)
 ; OBJ32:      ]
 ; OBJ32:      Relocations [
-; OBJ32-NEXT:   0x2C IMAGE_REL_I386_SECREL _f
-; OBJ32-NEXT:   0x30 IMAGE_REL_I386_SECTION _f
-; OBJ32-NEXT:   0x44 IMAGE_REL_I386_SECREL _f
-; OBJ32-NEXT:   0x48 IMAGE_REL_I386_SECTION _f
+; OBJ32-NEXT:   0x59 IMAGE_REL_I386_SECREL _f
+; OBJ32-NEXT:   0x5D IMAGE_REL_I386_SECTION _f
+; OBJ32-NEXT:   0x70 IMAGE_REL_I386_SECREL _f
+; OBJ32-NEXT:   0x74 IMAGE_REL_I386_SECTION _f
 ; OBJ32-NEXT: ]
 ; OBJ32:      Subsection [
 ; OBJ32-NEXT:   SubSectionType: Symbols (0xF1)
-; OBJ32-NOT:    ]
 ; OBJ32:        ProcStart {
 ; OBJ32:          CodeSize: 0x6
 ; OBJ32:          DisplayName: f
 ; Symbol subsection
 ; X64-NEXT: .long   241
 ; X64-NEXT: .long [[F1_END:.*]]-[[F1_START:.*]] #
+; Compiler information record
 ; X64-NEXT: [[F1_START]]:
+; X64-NEXT: .short [[C1_END:.*]]-[[C1_START:.*]] #
+; X64:      [[C1_END]]:
 ; X64-NEXT: .short [[PROC_SEGMENT_END:.*]]-[[PROC_SEGMENT_START:.*]] #
 ; X64-NEXT: [[PROC_SEGMENT_START]]:
 ; X64-NEXT: .short  4423
 ; OBJ64:      Characteristics [ (0x42300040)
 ; OBJ64:      ]
 ; OBJ64:      Relocations [
-; OBJ64-NEXT:   0x2C IMAGE_REL_AMD64_SECREL f
-; OBJ64-NEXT:   0x30 IMAGE_REL_AMD64_SECTION f
-; OBJ64-NEXT:   0x44 IMAGE_REL_AMD64_SECREL f
-; OBJ64-NEXT:   0x48 IMAGE_REL_AMD64_SECTION f
+; OBJ64-NEXT:   0x59 IMAGE_REL_AMD64_SECREL f
+; OBJ64-NEXT:   0x5D IMAGE_REL_AMD64_SECTION f
+; OBJ64-NEXT:   0x70 IMAGE_REL_AMD64_SECREL f
+; OBJ64-NEXT:   0x74 IMAGE_REL_AMD64_SECTION f
 ; OBJ64-NEXT: ]
 ; OBJ64:      Subsection [
 ; OBJ64-NEXT:   SubSectionType: Symbols (0xF1)
-; OBJ64-NOT:    ]
 ; OBJ64:        ProcStart {
 ; OBJ64:          CodeSize: 0xE
 ; OBJ64:          DisplayName: f
index 5d364a12cc8e530667922aece8c43f318fb70300..1c4fe7ac7610f3b923c9340dfda97ce41ece0082 100644 (file)
@@ -10,7 +10,6 @@
 ; CHECK:     }
 ; CHECK:   Subsection [
 ; CHECK:     SubSectionType: Symbols (0xF1)
-; CHECK:     SubSectionSize: 0xC
 ; CHECK:     UDT {
 ; CHECK:       Type: wchar_t (0x71)
 ; CHECK:       UDTName: XYZ
index 127b1b85d04484984580d4e612cf2fe3216f1c01..dca3884b1d09945946eb5174cf0e137e775d03fe 100644 (file)
@@ -46,7 +46,6 @@
 ; CHECK:   Magic: 0x4
 ; CHECK:   Subsection [
 ; CHECK:     SubSectionType: Symbols (0xF1)
-; CHECK:     SubSectionSize: 0x4D
 ; CHECK:     ProcStart {
 ; CHECK:       PtrParent: 0x0
 ; CHECK:       PtrEnd: 0x0
index 1d234919f1206b63583a4f4e3531281baafd1829..031aa76af48b54427d6c7faaf3f86acd05c7af6c 100644 (file)
@@ -42,10 +42,10 @@ entry:
 
 ; CHECK-MSVC: Relocations [
 ; CHECK-MSVC:   Section {{.*}} .debug$S {
-; CHECK-MSVC:     0x2C IMAGE_REL_ARM_SECREL function
-; CHECK-MSVC:     0x30 IMAGE_REL_ARM_SECTION function
-; CHECK-MSVC:     0x48 IMAGE_REL_ARM_SECREL function
-; CHECK-MSVC:     0x4C IMAGE_REL_ARM_SECTION function
+; CHECK-MSVC:     0x5A IMAGE_REL_ARM_SECREL function
+; CHECK-MSVC:     0x5E IMAGE_REL_ARM_SECTION function
+; CHECK-MSVC:     0x78 IMAGE_REL_ARM_SECREL function
+; CHECK-MSVC:     0x7C IMAGE_REL_ARM_SECTION function
 ; CHECK-MSVC:   }
 ; CHECK-MSVC: ]
 
diff --git a/test/MC/COFF/cv-compiler-info.ll b/test/MC/COFF/cv-compiler-info.ll
new file mode 100644 (file)
index 0000000..36e6ccf
--- /dev/null
@@ -0,0 +1,56 @@
+; RUN: llc -mtriple i686-pc-windows-msvc < %s | FileCheck %s
+; ModuleID = 'D:\src\scopes\foo.cpp'
+source_filename = "D:\5Csrc\5Cscopes\5Cfoo.cpp"
+target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
+target triple = "i686-pc-windows-msvc19.0.23918"
+
+; Function Attrs: nounwind sspstrong
+define i32 @"\01?foo@@YAHXZ"() #0 !dbg !10 {
+entry:
+  ret i32 42, !dbg !14
+}
+
+attributes #0 = { nounwind sspstrong "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="pentium4" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!3, !7, !8}
+!llvm.ident = !{!9}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 4.0.0 ", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
+; The debug$S section should begin with an S_COMPILE3 record that identifies the
+; source language and the version of the compiler based on the DICompileUnit.
+; CHECK:       .section        .debug$S,"dr"
+; CHECK:               .p2align        2
+; CHECK:               .long   4                       # Debug section magic
+; CHECK:               .long   241                     # Symbol subsection for foo
+; CHECK:               .long   Ltmp3-Ltmp2             # Subsection size
+; CHECK:       Ltmp2:
+; CHECK:               .short  Ltmp5-Ltmp4           # Record length
+; CHECK:       Ltmp4:
+; CHECK:               .short  4412                  # Record kind: S_COMPILE3
+; CHECK:               .long   1                       # Flags and language
+; CHECK:               .short  7                     # CPUType
+; CHECK:               .short  4                     # Frontend version
+; CHECK:               .short  0
+; CHECK:               .short  0
+; CHECK:               .short  0
+; CHECK:               .short  [[BACKEND_VERSION:[0-9]+]]  # Backend version
+; CHECK:               .short  0
+; CHECK:               .short  0
+; CHECK:               .short  0
+; CHECK:               .asciz  "clang version 4.0.0 "  # Null-terminated compiler version string
+; CHECK:  Ltmp5:
+!1 = !DIFile(filename: "D:\5Csrc\5Cscopes\5Cfoo.cpp", directory: "D:\5Csrc\5Cscopes\5Cclang")
+!2 = !{}
+!3 = !{i32 6, !"Linker Options", !4}
+!4 = !{!5, !6}
+!5 = !{!"/DEFAULTLIB:libcmtd.lib"}
+!6 = !{!"/DEFAULTLIB:oldnames.lib"}
+!7 = !{i32 2, !"CodeView", i32 1}
+!8 = !{i32 2, !"Debug Info Version", i32 3}
+!9 = !{!"clang version 4.0.0 "}
+!10 = distinct !DISubprogram(name: "foo", linkageName: "\01?foo@@YAHXZ", scope: !1, file: !1, line: 1, type: !11, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2)
+!11 = !DISubroutineType(types: !12)
+!12 = !{!13}
+!13 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
+!14 = !DILocation(line: 2, scope: !10)