MC-COFF: Add COFFAsmParser. Completes PR8343.
authorMichael J. Spencer <bigcheesegs@gmail.com>
Sat, 9 Oct 2010 11:01:07 +0000 (11:01 +0000)
committerMichael J. Spencer <bigcheesegs@gmail.com>
Sat, 9 Oct 2010 11:01:07 +0000 (11:01 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@116150 91177308-0d34-0410-b5e6-96231b3b80d8

13 files changed:
lib/MC/MCParser/AsmParser.cpp
lib/MC/MCParser/CMakeLists.txt
lib/MC/MCParser/COFFAsmParser.cpp [new file with mode: 0644]
test/MC/COFF/align-nops.s
test/MC/COFF/basic-coff.ll [deleted file]
test/MC/COFF/basic-coff.s [new file with mode: 0644]
test/MC/COFF/simple-fixups.ll [deleted file]
test/MC/COFF/simple-fixups.s [new file with mode: 0644]
test/MC/COFF/switch-relocations.ll
test/MC/COFF/symbol-alias.ll [deleted file]
test/MC/COFF/symbol-alias.s [new file with mode: 0644]
test/MC/COFF/symbol-fragment-offset.ll [deleted file]
test/MC/COFF/symbol-fragment-offset.s [new file with mode: 0644]

index 9554985b68f016cafbfe384a11847ac55767736f..23ae5f2e22c2df26e3ef9ab2c2a30a44ff230630 100644 (file)
@@ -269,6 +269,7 @@ namespace llvm {
 
 extern MCAsmParserExtension *createDarwinAsmParser();
 extern MCAsmParserExtension *createELFAsmParser();
+extern MCAsmParserExtension *createCOFFAsmParser();
 
 }
 
@@ -288,7 +289,10 @@ AsmParser::AsmParser(const Target &T, SourceMgr &_SM, MCContext &_Ctx,
   //
   // FIXME: This is a hack, we need to (majorly) cleanup how these objects are
   // created.
-  if (_MAI.hasSubsectionsViaSymbols()) {
+  if (_MAI.hasMicrosoftFastStdCallMangling()) {
+    PlatformParser = createCOFFAsmParser();
+    PlatformParser->Initialize(*this);
+  } else if (_MAI.hasSubsectionsViaSymbols()) {
     PlatformParser = createDarwinAsmParser();
     PlatformParser->Initialize(*this);
   } else {
index 25a7bf4842124df6aa53e538cc9dd431156e968d..eaea9f6cd3c591707ef403676a489deb2b60e432 100644 (file)
@@ -1,6 +1,7 @@
 add_llvm_library(LLVMMCParser
   AsmLexer.cpp
   AsmParser.cpp
+  COFFAsmParser.cpp
   DarwinAsmParser.cpp
   ELFAsmParser.cpp
   MCAsmLexer.cpp
diff --git a/lib/MC/MCParser/COFFAsmParser.cpp b/lib/MC/MCParser/COFFAsmParser.cpp
new file mode 100644 (file)
index 0000000..5ecab03
--- /dev/null
@@ -0,0 +1,144 @@
+//===- COFFAsmParser.cpp - COFF Assembly Parser ---------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/MC/MCParser/MCAsmParserExtension.h"
+#include "llvm/ADT/Twine.h"
+#include "llvm/MC/MCAsmInfo.h"
+#include "llvm/MC/MCContext.h"
+#include "llvm/MC/MCParser/MCAsmLexer.h"
+#include "llvm/MC/MCSectionCOFF.h"
+#include "llvm/MC/MCStreamer.h"
+#include "llvm/Support/COFF.h"
+using namespace llvm;
+
+namespace {
+
+class COFFAsmParser : public MCAsmParserExtension {
+  template<bool (COFFAsmParser::*Handler)(StringRef, SMLoc)>
+  void AddDirectiveHandler(StringRef Directive) {
+    getParser().AddDirectiveHandler(this, Directive,
+                                    HandleDirective<COFFAsmParser, Handler>);
+  }
+
+  bool ParseSectionSwitch(StringRef Section,
+                          unsigned Characteristics,
+                          SectionKind Kind);
+
+  virtual void Initialize(MCAsmParser &Parser) {
+    // Call the base implementation.
+    MCAsmParserExtension::Initialize(Parser);
+
+    AddDirectiveHandler<&COFFAsmParser::ParseSectionDirectiveText>(".text");
+    AddDirectiveHandler<&COFFAsmParser::ParseSectionDirectiveData>(".data");
+    AddDirectiveHandler<&COFFAsmParser::ParseSectionDirectiveBSS>(".bss");
+    AddDirectiveHandler<&COFFAsmParser::ParseDirectiveDef>(".def");
+    AddDirectiveHandler<&COFFAsmParser::ParseDirectiveScl>(".scl");
+    AddDirectiveHandler<&COFFAsmParser::ParseDirectiveType>(".type");
+    AddDirectiveHandler<&COFFAsmParser::ParseDirectiveEndef>(".endef");
+  }
+
+  bool ParseSectionDirectiveText(StringRef, SMLoc) {
+    return ParseSectionSwitch(".text",
+                              COFF::IMAGE_SCN_CNT_CODE
+                            | COFF::IMAGE_SCN_MEM_EXECUTE
+                            | COFF::IMAGE_SCN_MEM_READ,
+                              SectionKind::getText());
+  }
+  bool ParseSectionDirectiveData(StringRef, SMLoc) {
+    return ParseSectionSwitch(".data",
+                              COFF::IMAGE_SCN_CNT_INITIALIZED_DATA
+                            | COFF::IMAGE_SCN_MEM_READ
+                            | COFF::IMAGE_SCN_MEM_WRITE,
+                              SectionKind::getDataRel());
+  }
+  bool ParseSectionDirectiveBSS(StringRef, SMLoc) {
+    return ParseSectionSwitch(".bss",
+                              COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA
+                            | COFF::IMAGE_SCN_MEM_READ
+                            | COFF::IMAGE_SCN_MEM_WRITE,
+                              SectionKind::getBSS());
+  }
+
+  bool ParseDirectiveDef(StringRef, SMLoc);
+  bool ParseDirectiveScl(StringRef, SMLoc);
+  bool ParseDirectiveType(StringRef, SMLoc);
+  bool ParseDirectiveEndef(StringRef, SMLoc);
+
+public:
+  COFFAsmParser() {}
+};
+
+} // end annonomous namespace.
+
+bool COFFAsmParser::ParseSectionSwitch(StringRef Section,
+                                       unsigned Characteristics,
+                                       SectionKind Kind) {
+  if (getLexer().isNot(AsmToken::EndOfStatement))
+    return TokError("unexpected token in section switching directive");
+  Lex();
+
+  getStreamer().SwitchSection(getContext().getCOFFSection(
+                                Section, Characteristics, Kind));
+
+  return false;
+}
+
+bool COFFAsmParser::ParseDirectiveDef(StringRef, SMLoc) {
+  StringRef SymbolName;
+
+  if (getParser().ParseIdentifier(SymbolName))
+    return TokError("expected identifier in directive");
+
+  MCSymbol *Sym = getContext().GetOrCreateSymbol(SymbolName);
+
+  getStreamer().BeginCOFFSymbolDef(Sym);
+
+  Lex();
+  return false;
+}
+
+bool COFFAsmParser::ParseDirectiveScl(StringRef, SMLoc) {
+  int64_t SymbolStorageClass;
+  if (getParser().ParseAbsoluteExpression(SymbolStorageClass))
+    return true;
+
+  if (getLexer().isNot(AsmToken::EndOfStatement))
+    return TokError("unexpected token in directive");
+
+  Lex();
+  getStreamer().EmitCOFFSymbolStorageClass(SymbolStorageClass);
+  return false;
+}
+
+bool COFFAsmParser::ParseDirectiveType(StringRef, SMLoc) {
+  int64_t Type;
+  if (getParser().ParseAbsoluteExpression(Type))
+    return true;
+
+  if (getLexer().isNot(AsmToken::EndOfStatement))
+    return TokError("unexpected token in directive");
+
+  Lex();
+  getStreamer().EmitCOFFSymbolType(Type);
+  return false;
+}
+
+bool COFFAsmParser::ParseDirectiveEndef(StringRef, SMLoc) {
+  Lex();
+  getStreamer().EndCOFFSymbolDef();
+  return false;
+}
+
+namespace llvm {
+
+MCAsmParserExtension *createCOFFAsmParser() {
+  return new COFFAsmParser;
+}
+
+}
index 0824e2378a0cfe84392397da2a0cd3e31e07e78e..2971ec67798e9ccc577499630c3791f7157aa27b 100644 (file)
@@ -24,8 +24,11 @@ f0:
 //CHECK-NEXT:    PointerToLineNumbers
 //CHECK-NEXT:    NumberOfRelocations
 //CHECK-NEXT:    NumberOfLineNumbers
-//CHECK-NEXT:    Charateristics           = 0x400001
+//CHECK-NEXT:    Charateristics           = 0x60400020
+//CHECK-NEXT:        IMAGE_SCN_CNT_CODE
 //CHECK-NEXT:        IMAGE_SCN_ALIGN_8BYTES
+//CHECK-NEXT:        IMAGE_SCN_MEM_EXECUTE
+//CHECK-NEXT:        IMAGE_SCN_MEM_READ
 //CHECK-NEXT:      SectionData              =
 //CHECK-NEXT:        00 00 00 00 0F 1F 40 00 - 00 00 00 00 0F 1F 40 00
 
@@ -38,7 +41,10 @@ f0:
 //CHECK-NEXT:      PointerToLineNumbers
 //CHECK-NEXT:      NumberOfRelocations
 //CHECK-NEXT:      NumberOfLineNumbers
-//CHECK-NEXT:      Charateristics           = 0x400001
+//CHECK-NEXT:      Charateristics           = 0xC0400040
+//CHECK-NEXT:        IMAGE_SCN_CNT_INITIALIZED_DATA
 //CHECK-NEXT:        IMAGE_SCN_ALIGN_8BYTES
+//CHECK-NEXT:        IMAGE_SCN_MEM_READ
+//CHECK-NEXT:        IMAGE_SCN_MEM_WRITE
 //CHECK-NEXT:      SectionData              =
 //CHECK-NEXT:        00 00 00 00 90 90 90 90 - 00 00 00 00 00 00 00 00
diff --git a/test/MC/COFF/basic-coff.ll b/test/MC/COFF/basic-coff.ll
deleted file mode 100644 (file)
index bbf0d3e..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-; This test checks that the COFF object emitter works for the most basic
-; programs.
-
-; RUN: llc -filetype=obj -mtriple i686-pc-win32 %s -o - | coff-dump.py | FileCheck %s
-; RUN: llc -filetype=obj -mtriple x86_64-pc-win32 %s -o %t
-
-@.str = private constant [12 x i8] c"Hello World\00" ; <[12 x i8]*> [#uses=1]
-
-define i32 @main() nounwind {
-entry:
-  %call = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([12 x i8]* @.str, i32 0, i32 0)) nounwind ; <i32> [#uses=0]
-  ret i32 0
-}
-
-declare i32 @printf(i8* nocapture, ...) nounwind
-
-; CHECK: {
-; CHECK:   MachineType              = IMAGE_FILE_MACHINE_I386 (0x14C)
-; CHECK:   NumberOfSections         = 2
-; CHECK:   TimeDateStamp            = {{[0-9]+}}
-; CHECK:   PointerToSymbolTable     = 0x{{[0-9A-F]+}}
-; CHECK:   NumberOfSymbols          = 6
-; CHECK:   SizeOfOptionalHeader     = 0
-; CHECK:   Characteristics          = 0x0
-; CHECK:   Sections                 = [
-; CHECK:     1 = {
-; CHECK:       Name                     = .text
-; CHECK:       VirtualSize              = 0
-; CHECK:       VirtualAddress           = 0
-; CHECK:       SizeOfRawData            = {{[0-9]+}}
-; CHECK:       PointerToRawData         = 0x{{[0-9A-F]+}}
-; CHECK:       PointerToRelocations     = 0x{{[0-9A-F]+}}
-; CHECK:       PointerToLineNumbers     = 0x0
-; CHECK:       NumberOfRelocations      = 2
-; CHECK:       NumberOfLineNumbers      = 0
-; CHECK:       Charateristics           = 0x60500020
-; CHECK:         IMAGE_SCN_CNT_CODE
-; CHECK:         IMAGE_SCN_ALIGN_16BYTES
-; CHECK:         IMAGE_SCN_MEM_EXECUTE
-; CHECK:         IMAGE_SCN_MEM_READ
-; CHECK:       SectionData              =
-; CHECK:       Relocations              = [
-; CHECK:         0 = {
-; CHECK:           VirtualAddress           = 0x{{[0-9A-F]+}}
-; CHECK:           SymbolTableIndex         = 2
-; CHECK:           Type                     = IMAGE_REL_I386_DIR32 (6)
-; CHECK:           SymbolName               = .data
-; CHECK:         }
-; CHECK:         1 = {
-; CHECK:           VirtualAddress           = 0x{{[0-9A-F]+}}
-; CHECK:           SymbolTableIndex         = 5
-; CHECK:           Type                     = IMAGE_REL_I386_REL32 (20)
-; CHECK:           SymbolName               = _printf
-; CHECK:         }
-; CHECK:       ]
-; CHECK:     }
-; CHECK:     2 = {
-; CHECK:       Name                     = .data
-; CHECK:       VirtualSize              = 0
-; CHECK:       VirtualAddress           = 0
-; CHECK:       SizeOfRawData            = {{[0-9]+}}
-; CHECK:       PointerToRawData         = 0x{{[0-9A-F]+}}
-; CHECK:       PointerToRelocations     = 0x0
-; CHECK:       PointerToLineNumbers     = 0x0
-; CHECK:       NumberOfRelocations      = 0
-; CHECK:       NumberOfLineNumbers      = 0
-; CHECK:       Charateristics           = 0xC0100040
-; CHECK:         IMAGE_SCN_CNT_INITIALIZED_DATA
-; CHECK:         IMAGE_SCN_ALIGN_1BYTES
-; CHECK:         IMAGE_SCN_MEM_READ
-; CHECK:         IMAGE_SCN_MEM_WRITE
-; CHECK:       SectionData              =
-; CHECK:         48 65 6C 6C 6F 20 57 6F - 72 6C 64 00             |Hello World.|
-; CHECK:       Relocations              = None
-; CHECK:     }
-; CHECK:   ]
-; CHECK:   Symbols                  = [
-; CHECK:     0 = {
-; CHECK:       Name                     = .text
-; CHECK:       Value                    = 0
-; CHECK:       SectionNumber            = 1
-; CHECK:       SimpleType               = IMAGE_SYM_TYPE_NULL (0)
-; CHECK:       ComplexType              = IMAGE_SYM_DTYPE_NULL (0)
-; CHECK:       StorageClass             = IMAGE_SYM_CLASS_STATIC (3)
-; CHECK:       NumberOfAuxSymbols       = 1
-; CHECK:       AuxillaryData            =
-; CHECK:         15 00 00 00 02 00 00 00 - 00 00 00 00 01 00 00 00 |................|
-; CHECK:         00 00                                             |..|
-; CHECK:     }
-; CHECK:     2 = {
-; CHECK:       Name                     = .data
-; CHECK:       Value                    = 0
-; CHECK:       SectionNumber            = 2
-; CHECK:       SimpleType               = IMAGE_SYM_TYPE_NULL (0)
-; CHECK:       ComplexType              = IMAGE_SYM_DTYPE_NULL (0)
-; CHECK:       StorageClass             = IMAGE_SYM_CLASS_STATIC (3)
-; CHECK:       NumberOfAuxSymbols       = 1
-; CHECK:       AuxillaryData            =
-; CHECK:         0C 00 00 00 00 00 00 00 - 00 00 00 00 02 00 00 00 |................|
-; CHECK:         00 00                                             |..|
-; CHECK:     }
-; CHECK:     4 = {
-; CHECK:       Name                     = _main
-; CHECK:       Value                    = 0
-; CHECK:       SectionNumber            = 1
-; CHECK:       SimpleType               = IMAGE_SYM_TYPE_NULL (0)
-; CHECK:       ComplexType              = IMAGE_SYM_DTYPE_FUNCTION (2)
-; CHECK:       StorageClass             = IMAGE_SYM_CLASS_EXTERNAL (2)
-; CHECK:       NumberOfAuxSymbols       = 0
-; CHECK:       AuxillaryData            =
-; CHECK:     }
-; CHECK:     5 = {
-; CHECK:       Name                     = _printf
-; CHECK:       Value                    = 0
-; CHECK:       SectionNumber            = 0
-; CHECK:       SimpleType               = IMAGE_SYM_TYPE_NULL (0)
-; CHECK:       ComplexType              = IMAGE_SYM_DTYPE_NULL (0)
-; CHECK:       StorageClass             = IMAGE_SYM_CLASS_EXTERNAL (2)
-; CHECK:       NumberOfAuxSymbols       = 0
-; CHECK:       AuxillaryData            =
-; CHECK:     }
-; CHECK:   ]
-; CHECK: }
diff --git a/test/MC/COFF/basic-coff.s b/test/MC/COFF/basic-coff.s
new file mode 100644 (file)
index 0000000..a94273b
--- /dev/null
@@ -0,0 +1,133 @@
+// This test checks that the COFF object emitter works for the most basic\r
+// programs.\r
+\r
+// RUN: llvm-mc -filetype=obj -triple i686-pc-win32 %s | coff-dump.py | FileCheck %s\r
+// I WOULD RUN, BUT THIS FAILS: llvm-mc -filetype=obj -triple x86_64-pc-win32 %s\r
+\r
+.def    _main;\r
+       .scl    2;\r
+       .type   32;\r
+       .endef\r
+       .text\r
+       .globl  _main\r
+       .align  16, 0x90\r
+_main:                                  # @main\r
+# BB#0:                                 # %entry\r
+       subl    $4, %esp\r
+       movl    $L_.str, (%esp)\r
+       calll   _printf\r
+       xorl    %eax, %eax\r
+       addl    $4, %esp\r
+       ret\r
+\r
+       .data\r
+L_.str:                                 # @.str\r
+       .asciz   "Hello World"\r
+\r
+// CHECK: {\r
+// CHECK:   MachineType              = IMAGE_FILE_MACHINE_I386 (0x14C)\r
+// CHECK:   NumberOfSections         = 2\r
+// CHECK:   TimeDateStamp            = {{[0-9]+}}\r
+// CHECK:   PointerToSymbolTable     = 0x{{[0-9A-F]+}}\r
+// CHECK:   NumberOfSymbols          = 6\r
+// CHECK:   SizeOfOptionalHeader     = 0\r
+// CHECK:   Characteristics          = 0x0\r
+// CHECK:   Sections                 = [\r
+// CHECK:     1 = {\r
+// CHECK:       Name                     = .text\r
+// CHECK:       VirtualSize              = 0\r
+// CHECK:       VirtualAddress           = 0\r
+// CHECK:       SizeOfRawData            = {{[0-9]+}}\r
+// CHECK:       PointerToRawData         = 0x{{[0-9A-F]+}}\r
+// CHECK:       PointerToRelocations     = 0x{{[0-9A-F]+}}\r
+// CHECK:       PointerToLineNumbers     = 0x0\r
+// CHECK:       NumberOfRelocations      = 2\r
+// CHECK:       NumberOfLineNumbers      = 0\r
+// CHECK:       Charateristics           = 0x60500020\r
+// CHECK:         IMAGE_SCN_CNT_CODE\r
+// CHECK:         IMAGE_SCN_ALIGN_16BYTES\r
+// CHECK:         IMAGE_SCN_MEM_EXECUTE\r
+// CHECK:         IMAGE_SCN_MEM_READ\r
+// CHECK:       SectionData              =\r
+// CHECK:       Relocations              = [\r
+// CHECK:         0 = {\r
+// CHECK:           VirtualAddress           = 0x{{[0-9A-F]+}}\r
+// CHECK:           SymbolTableIndex         = 2\r
+// CHECK:           Type                     = IMAGE_REL_I386_DIR32 (6)\r
+// CHECK:           SymbolName               = .data\r
+// CHECK:         }\r
+// CHECK:         1 = {\r
+// CHECK:           VirtualAddress           = 0x{{[0-9A-F]+}}\r
+// CHECK:           SymbolTableIndex         = 5\r
+// CHECK:           Type                     = IMAGE_REL_I386_REL32 (20)\r
+// CHECK:           SymbolName               = _printf\r
+// CHECK:         }\r
+// CHECK:       ]\r
+// CHECK:     }\r
+// CHECK:     2 = {\r
+// CHECK:       Name                     = .data\r
+// CHECK:       VirtualSize              = 0\r
+// CHECK:       VirtualAddress           = 0\r
+// CHECK:       SizeOfRawData            = {{[0-9]+}}\r
+// CHECK:       PointerToRawData         = 0x{{[0-9A-F]+}}\r
+// CHECK:       PointerToRelocations     = 0x0\r
+// CHECK:       PointerToLineNumbers     = 0x0\r
+// CHECK:       NumberOfRelocations      = 0\r
+// CHECK:       NumberOfLineNumbers      = 0\r
+// CHECK:       Charateristics           = 0xC0100040\r
+// CHECK:         IMAGE_SCN_CNT_INITIALIZED_DATA\r
+// CHECK:         IMAGE_SCN_ALIGN_1BYTES\r
+// CHECK:         IMAGE_SCN_MEM_READ\r
+// CHECK:         IMAGE_SCN_MEM_WRITE\r
+// CHECK:       SectionData              =\r
+// CHECK:         48 65 6C 6C 6F 20 57 6F - 72 6C 64 00             |Hello World.|\r
+// CHECK:       Relocations              = None\r
+// CHECK:     }\r
+// CHECK:   ]\r
+// CHECK:   Symbols                  = [\r
+// CHECK:     0 = {\r
+// CHECK:       Name                     = .text\r
+// CHECK:       Value                    = 0\r
+// CHECK:       SectionNumber            = 1\r
+// CHECK:       SimpleType               = IMAGE_SYM_TYPE_NULL (0)\r
+// CHECK:       ComplexType              = IMAGE_SYM_DTYPE_NULL (0)\r
+// CHECK:       StorageClass             = IMAGE_SYM_CLASS_STATIC (3)\r
+// CHECK:       NumberOfAuxSymbols       = 1\r
+// CHECK:       AuxillaryData            =\r
+// CHECK:         15 00 00 00 02 00 00 00 - 00 00 00 00 01 00 00 00 |................|\r
+// CHECK:         00 00                                             |..|\r
+// CHECK:     }\r
+// CHECK:     2 = {\r
+// CHECK:       Name                     = .data\r
+// CHECK:       Value                    = 0\r
+// CHECK:       SectionNumber            = 2\r
+// CHECK:       SimpleType               = IMAGE_SYM_TYPE_NULL (0)\r
+// CHECK:       ComplexType              = IMAGE_SYM_DTYPE_NULL (0)\r
+// CHECK:       StorageClass             = IMAGE_SYM_CLASS_STATIC (3)\r
+// CHECK:       NumberOfAuxSymbols       = 1\r
+// CHECK:       AuxillaryData            =\r
+// CHECK:         0C 00 00 00 00 00 00 00 - 00 00 00 00 02 00 00 00 |................|\r
+// CHECK:         00 00                                             |..|\r
+// CHECK:     }\r
+// CHECK:     4 = {\r
+// CHECK:       Name                     = _main\r
+// CHECK:       Value                    = 0\r
+// CHECK:       SectionNumber            = 1\r
+// CHECK:       SimpleType               = IMAGE_SYM_TYPE_NULL (0)\r
+// CHECK:       ComplexType              = IMAGE_SYM_DTYPE_FUNCTION (2)\r
+// CHECK:       StorageClass             = IMAGE_SYM_CLASS_EXTERNAL (2)\r
+// CHECK:       NumberOfAuxSymbols       = 0\r
+// CHECK:       AuxillaryData            =\r
+// CHECK:     }\r
+// CHECK:     5 = {\r
+// CHECK:       Name                     = _printf\r
+// CHECK:       Value                    = 0\r
+// CHECK:       SectionNumber            = 0\r
+// CHECK:       SimpleType               = IMAGE_SYM_TYPE_NULL (0)\r
+// CHECK:       ComplexType              = IMAGE_SYM_DTYPE_NULL (0)\r
+// CHECK:       StorageClass             = IMAGE_SYM_CLASS_EXTERNAL (2)\r
+// CHECK:       NumberOfAuxSymbols       = 0\r
+// CHECK:       AuxillaryData            =\r
+// CHECK:     }\r
+// CHECK:   ]\r
+// CHECK: }\r
diff --git a/test/MC/COFF/simple-fixups.ll b/test/MC/COFF/simple-fixups.ll
deleted file mode 100644 (file)
index c2fb42e..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-; The purpose of this test is to verify that we do not produce unneeded
-; relocations when symbols are in the same section and we know their offset.
-
-; RUN: llc -filetype=obj -mtriple i686-pc-win32 %s -o - | coff-dump.py | FileCheck %s
-; RUN: llc -filetype=obj -mtriple x86_64-pc-win32 %s -o - | coff-dump.py | FileCheck %s
-
-define void @foo() {
-e:
-  br label %i
-i:
-  br label %i
-}
-
-define void @bar() {
-e:
-  br label %i
-i:
-  br label %i
-}
-
-define void @baz() {
-e:
-  call void @baz()
-  ret void
-}
-
-; CHECK:     Sections = [
-; CHECK-NOT: NumberOfRelocations = {{[^0]}}
-; CHECK:     Symbols = [
diff --git a/test/MC/COFF/simple-fixups.s b/test/MC/COFF/simple-fixups.s
new file mode 100644 (file)
index 0000000..f86f4a9
--- /dev/null
@@ -0,0 +1,50 @@
+// The purpose of this test is to verify that we do not produce unneeded\r
+// relocations when symbols are in the same section and we know their offset.\r
+\r
+// RUN: llvm-mc -filetype=obj -triple i686-pc-win32 %s | coff-dump.py | FileCheck %s\r
+// I WOULD RUN, BUT THIS FAILS: llvm-mc -filetype=obj -triple x86_64-pc-win32 %s | coff-dump.py | FileCheck %s\r
+\r
+       .def     _foo;\r
+       .scl    2;\r
+       .type   32;\r
+       .endef\r
+       .text\r
+       .globl  _foo\r
+       .align  16, 0x90\r
+_foo:                                   # @foo\r
+# BB#0:                                 # %e\r
+       .align  16, 0x90\r
+LBB0_1:                                 # %i\r
+                                        # =>This Inner Loop Header: Depth=1\r
+       jmp     LBB0_1\r
+\r
+       .def     _bar;\r
+       .scl    2;\r
+       .type   32;\r
+       .endef\r
+       .globl  _bar\r
+       .align  16, 0x90\r
+_bar:                                   # @bar\r
+# BB#0:                                 # %e\r
+       .align  16, 0x90\r
+LBB1_1:                                 # %i\r
+                                        # =>This Inner Loop Header: Depth=1\r
+       jmp     LBB1_1\r
+\r
+       .def     _baz;\r
+       .scl    2;\r
+       .type   32;\r
+       .endef\r
+       .globl  _baz\r
+       .align  16, 0x90\r
+_baz:                                   # @baz\r
+# BB#0:                                 # %e\r
+       subl    $4, %esp\r
+Ltmp0:\r
+       calll   _baz\r
+       addl    $4, %esp\r
+       ret\r
+\r
+// CHECK:     Sections = [\r
+// CHECK-NOT: NumberOfRelocations = {{[^0]}}\r
+// CHECK:     Symbols = [\r
index 300c10732ec6dde80cd0e9057c4173d4d62bab0f..faf185fb72994ba73852864571ada19c228621a6 100644 (file)
@@ -3,6 +3,9 @@
 
 ; This test case was reduced from Lua/lapi.c.
 
+; This test has yet to be converted to assembly becase llvm-mc cannot read
+; x86-64 COFF code yet.
+
 ; RUN: llc -filetype=obj -mtriple i686-pc-win32 %s -o %t
 ; RUN: llc -filetype=obj -mtriple x86_64-pc-win32 %s -o %t
 
diff --git a/test/MC/COFF/symbol-alias.ll b/test/MC/COFF/symbol-alias.ll
deleted file mode 100644 (file)
index 3c00117..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-; The purpose of this test is to verify that symbol aliases
-; (@foo = alias <type> @bar) generate the correct entries in the symbol table.
-; They should be identical except for the name.
-
-; RUN: llc -filetype=obj -mtriple i686-pc-win32 %s -o - | coff-dump.py | FileCheck %s
-; RUN: llc -filetype=obj -mtriple x86_64-pc-win32 %s -o - | coff-dump.py | FileCheck %s
-
-define void @foo() {
-entry:
-  ret void
-}
-
-@bar = global i32 zeroinitializer
-
-@foo_alias = alias void ()* @foo
-@bar_alias = alias i32* @bar
-
-; CHECK:      Name               = {{_?}}foo
-; CHECK-NEXT: Value              = [[FOO_VALUE:.*$]]
-; CHECK-NEXT: SectionNumber      = [[FOO_SECTION_NUMBER:.*$]]
-; CHECK-NEXT: SimpleType         = [[FOO_SIMPLE_TYPE:.*$]]
-; CHECK-NEXT: ComplexType        = [[FOO_COMPLEX_TYPE:.*$]]
-; CHECK-NEXT: StorageClass       = [[FOO_STORAGE_CLASS:.*$]]
-; CHECK-NEXT: NumberOfAuxSymbols = [[FOO_NUMBER_OF_AUX_SYMBOLS:.*$]]
-
-; CHECK:      Name               = {{_?}}bar
-; CHECK-NEXT: Value              = [[BAR_VALUE:.*$]]
-; CHECK-NEXT: SectionNumber      = [[BAR_SECTION_NUMBER:.*$]]
-; CHECK-NEXT: SimpleType         = [[BAR_SIMPLE_TYPE:.*$]]
-; CHECK-NEXT: ComplexType        = [[BAR_COMPLEX_TYPE:.*$]]
-; CHECK-NEXT: StorageClass       = [[BAR_STORAGE_CLASS:.*$]]
-; CHECK-NEXT: NumberOfAuxSymbols = [[BAR_NUMBER_OF_AUX_SYMBOLS:.*$]]
-
-; CHECK:      Name               = {{_?}}foo_alias
-; CHECK-NEXT: Value              = [[FOO_VALUE]]
-; CHECK-NEXT: SectionNumber      = [[FOO_SECTION_NUMBER]]
-; CHECK-NEXT: SimpleType         = [[FOO_SIMPLE_TYPE]]
-; CHECK-NEXT: ComplexType        = [[FOO_COMPLEX_TYPE]]
-; CHECK-NEXT: StorageClass       = [[FOO_STORAGE_CLASS]]
-; CHECK-NEXT: NumberOfAuxSymbols = [[FOO_NUMBER_OF_AUX_SYMBOLS]]
-
-; CHECK:      Name               = {{_?}}bar_alias
-; CHECK-NEXT: Value              = [[BAR_VALUE]]
-; CHECK-NEXT: SectionNumber      = [[BAR_SECTION_NUMBER]]
-; CHECK-NEXT: SimpleType         = [[BAR_SIMPLE_TYPE]]
-; CHECK-NEXT: ComplexType        = [[BAR_COMPLEX_TYPE]]
-; CHECK-NEXT: StorageClass       = [[BAR_STORAGE_CLASS]]
-; CHECK-NEXT: NumberOfAuxSymbols = [[BAR_NUMBER_OF_AUX_SYMBOLS]]
diff --git a/test/MC/COFF/symbol-alias.s b/test/MC/COFF/symbol-alias.s
new file mode 100644 (file)
index 0000000..ede6b53
--- /dev/null
@@ -0,0 +1,62 @@
+// The purpose of this test is to verify that symbol aliases\r
+// (@foo = alias <type> @bar) generate the correct entries in the symbol table.\r
+// They should be identical except for the name.\r
+\r
+// RUN: llvm-mc -filetype=obj -triple i686-pc-win32 %s | coff-dump.py | FileCheck %s\r
+// RUN: llvm-mc -filetype=obj -triple x86_64-pc-win32 %s | coff-dump.py | FileCheck %s\r
+\r
+       .def     _foo;\r
+       .scl    2;\r
+       .type   32;\r
+       .endef\r
+       .text\r
+       .globl  _foo\r
+       .align  16, 0x90\r
+_foo:                                   # @foo\r
+# BB#0:                                 # %entry\r
+       ret\r
+\r
+       .data\r
+       .globl  _bar                    # @bar\r
+       .align  4\r
+_bar:\r
+       .long   0                       # 0x0\r
+\r
+\r
+       .globl  _foo_alias\r
+_foo_alias = _foo\r
+       .globl  _bar_alias\r
+_bar_alias = _bar\r
+\r
+// CHECK:      Name               = {{_?}}foo\r
+// CHECK-NEXT: Value              = [[FOO_VALUE:.*$]]\r
+// CHECK-NEXT: SectionNumber      = [[FOO_SECTION_NUMBER:.*$]]\r
+// CHECK-NEXT: SimpleType         = [[FOO_SIMPLE_TYPE:.*$]]\r
+// CHECK-NEXT: ComplexType        = [[FOO_COMPLEX_TYPE:.*$]]\r
+// CHECK-NEXT: StorageClass       = [[FOO_STORAGE_CLASS:.*$]]\r
+// CHECK-NEXT: NumberOfAuxSymbols = [[FOO_NUMBER_OF_AUX_SYMBOLS:.*$]]\r
+\r
+// CHECK:      Name               = {{_?}}bar\r
+// CHECK-NEXT: Value              = [[BAR_VALUE:.*$]]\r
+// CHECK-NEXT: SectionNumber      = [[BAR_SECTION_NUMBER:.*$]]\r
+// CHECK-NEXT: SimpleType         = [[BAR_SIMPLE_TYPE:.*$]]\r
+// CHECK-NEXT: ComplexType        = [[BAR_COMPLEX_TYPE:.*$]]\r
+// CHECK-NEXT: StorageClass       = [[BAR_STORAGE_CLASS:.*$]]\r
+// CHECK-NEXT: NumberOfAuxSymbols = [[BAR_NUMBER_OF_AUX_SYMBOLS:.*$]]\r
+\r
+// CHECK:      Name               = {{_?}}foo_alias\r
+// CHECK-NEXT: Value              = [[FOO_VALUE]]\r
+// CHECK-NEXT: SectionNumber      = [[FOO_SECTION_NUMBER]]\r
+// CHECK-NEXT: SimpleType         = [[FOO_SIMPLE_TYPE]]\r
+// CHECK-NEXT: ComplexType        = [[FOO_COMPLEX_TYPE]]\r
+// CHECK-NEXT: StorageClass       = [[FOO_STORAGE_CLASS]]\r
+// CHECK-NEXT: NumberOfAuxSymbols = [[FOO_NUMBER_OF_AUX_SYMBOLS]]\r
+\r
+// CHECK:      Name               = {{_?}}bar_alias\r
+// CHECK-NEXT: Value              = [[BAR_VALUE]]\r
+// CHECK-NEXT: SectionNumber      = [[BAR_SECTION_NUMBER]]\r
+// CHECK-NEXT: SimpleType         = [[BAR_SIMPLE_TYPE]]\r
+// CHECK-NEXT: ComplexType        = [[BAR_COMPLEX_TYPE]]\r
+// CHECK-NEXT: StorageClass       = [[BAR_STORAGE_CLASS]]\r
+// CHECK-NEXT: NumberOfAuxSymbols = [[BAR_NUMBER_OF_AUX_SYMBOLS]]\r
+\r
diff --git a/test/MC/COFF/symbol-fragment-offset.ll b/test/MC/COFF/symbol-fragment-offset.ll
deleted file mode 100644 (file)
index fec1925..0000000
+++ /dev/null
@@ -1,172 +0,0 @@
-; The purpose of this test is to see if the COFF object writer is emitting the\r
-; proper relocations for multiple pieces of data in a single data fragment.\r
-\r
-; RUN: llc -filetype=obj -mtriple i686-pc-win32 %s -o - | coff-dump.py | FileCheck %s\r
-; RUN: llc -filetype=obj -mtriple x86_64-pc-win32 %s -o %t\r
-\r
-@.str0 = private constant [7 x i8] c"Hello \00"    ; <[7 x i8]*> [#uses=1]\r
-@.str1 = private constant [7 x i8] c"World!\00"    ; <[7 x i8]*> [#uses=1]\r
-@.str2 = private constant [19 x i8] c"I'm The Last Line.\00"\r
-\r
-define i32 @main() nounwind {\r
-entry:\r
-  %call = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([7 x i8]* @.str0, i32 0, i32 0)) nounwind ; <i32> [#uses=0]\r
-  %puts0 = tail call i32 @puts(i8* getelementptr inbounds ([7 x i8]* @.str1, i32 0, i32 0)) ; <i32> [#uses=0]\r
-  %puts1 = tail call i32 @puts(i8* getelementptr inbounds ([19 x i8]* @.str2, i32 0, i32 0)) ; <i32> [#uses=0]\r
-  ret i32 0\r
-}\r
-\r
-declare i32 @printf(i8* nocapture, ...) nounwind\r
-\r
-declare i32 @puts(i8* nocapture) nounwind\r
-\r
-; CHECK: {\r
-; CHECK:   MachineType              = IMAGE_FILE_MACHINE_I386 (0x14C)\r
-; CHECK:   NumberOfSections         = 2\r
-; CHECK:   TimeDateStamp            = {{[0-9]+}}\r
-; CHECK:   PointerToSymbolTable     = 0x{{[0-9A-F]+}}\r
-; CHECK:   NumberOfSymbols          = 7\r
-; CHECK:   SizeOfOptionalHeader     = 0\r
-; CHECK:   Characteristics          = 0x0\r
-; CHECK:   Sections                 = [\r
-; CHECK:     1 = {\r
-; CHECK:       Name                     = .text\r
-; CHECK:       VirtualSize              = 0\r
-; CHECK:       VirtualAddress           = 0\r
-; CHECK:       SizeOfRawData            = {{[0-9]+}}\r
-; CHECK:       PointerToRawData         = 0x{{[0-9A-F]+}}\r
-; CHECK:       PointerToRelocations     = 0x{{[0-9A-F]+}}\r
-; CHECK:       PointerToLineNumbers     = 0x0\r
-; CHECK:       NumberOfRelocations      = 6\r
-; CHECK:       NumberOfLineNumbers      = 0\r
-; CHECK:       Charateristics           = 0x60500020\r
-; CHECK:         IMAGE_SCN_CNT_CODE\r
-; CHECK:         IMAGE_SCN_ALIGN_16BYTES\r
-; CHECK:         IMAGE_SCN_MEM_EXECUTE\r
-; CHECK:         IMAGE_SCN_MEM_READ\r
-; CHECK:       SectionData              =\r
-; CHECK:         83 EC 04 C7 04 24 00 00 - 00 00 E8 00 00 00 00 C7 |.....$..........|\r
-; CHECK:         04 24 07 00 00 00 E8 00 - 00 00 00 C7 04 24 10 00 |.$...........$..|\r
-; CHECK:         00 00 E8 00 00 00 00 31 - C0 83 C4 04 C3 00 00 00 |.......1........|\r
-; CHECK:       Relocations              = [\r
-; CHECK:         0 = {\r
-; CHECK:           VirtualAddress           = 0x6\r
-; CHECK:           SymbolTableIndex         = 2\r
-; CHECK:           Type                     = IMAGE_REL_I386_DIR32 (6)\r
-; CHECK:           SymbolName               = .data\r
-; CHECK:         }\r
-; CHECK:         1 = {\r
-; CHECK:           VirtualAddress           = 0xB\r
-; CHECK:           SymbolTableIndex         = 5\r
-; CHECK:           Type                     = IMAGE_REL_I386_REL32 (20)\r
-; CHECK:           SymbolName               = _printf\r
-; CHECK:         }\r
-; CHECK:         2 = {\r
-; CHECK:           VirtualAddress           = 0x12\r
-; CHECK:           SymbolTableIndex         = 2\r
-; CHECK:           Type                     = IMAGE_REL_I386_DIR32 (6)\r
-; CHECK:           SymbolName               = .data\r
-; CHECK:         }\r
-; CHECK:         3 = {\r
-; CHECK:           VirtualAddress           = 0x17\r
-; CHECK:           SymbolTableIndex         = 6\r
-; CHECK:           Type                     = IMAGE_REL_I386_REL32 (20)\r
-; CHECK:           SymbolName               = _puts\r
-; CHECK:         }\r
-; CHECK:         4 = {\r
-; CHECK:           VirtualAddress           = 0x1E\r
-; CHECK:           SymbolTableIndex         = 2\r
-; CHECK:           Type                     = IMAGE_REL_I386_DIR32 (6)\r
-; CHECK:           SymbolName               = .data\r
-; CHECK:         }\r
-; CHECK:         5 = {\r
-; CHECK:           VirtualAddress           = 0x23\r
-; CHECK:           SymbolTableIndex         = 6\r
-; CHECK:           Type                     = IMAGE_REL_I386_REL32 (20)\r
-; CHECK:           SymbolName               = _puts\r
-; CHECK:         }\r
-; CHECK:       ]\r
-; CHECK:     }\r
-; CHECK:     2 = {\r
-; CHECK:       Name                     = .data\r
-; CHECK:       VirtualSize              = 0\r
-; CHECK:       VirtualAddress           = 0\r
-; CHECK:       SizeOfRawData            = {{[0-9]+}}\r
-; CHECK:       PointerToRawData         = 0x{{[0-9A-F]+}}\r
-; CHECK:       PointerToRelocations     = 0x0\r
-; CHECK:       PointerToLineNumbers     = 0x0\r
-; CHECK:       NumberOfRelocations      = 0\r
-; CHECK:       NumberOfLineNumbers      = 0\r
-; CHECK:       Charateristics           = 0xC0500040\r
-; CHECK:         IMAGE_SCN_CNT_INITIALIZED_DATA\r
-; CHECK:         IMAGE_SCN_ALIGN_16BYTES\r
-; CHECK:         IMAGE_SCN_MEM_READ\r
-; CHECK:         IMAGE_SCN_MEM_WRITE\r
-; CHECK:       SectionData              =\r
-; CHECK:         48 65 6C 6C 6F 20 00 57 - 6F 72 6C 64 21 00 00 00 |Hello .World!...|\r
-; CHECK:         49 27 6D 20 54 68 65 20 - 4C 61 73 74 20 4C 69 6E |I'm The Last Lin|\r
-; CHECK:         65 2E 00                                          |e..|\r
-; CHECK:       Relocations              = None\r
-; CHECK:     }\r
-; CHECK:   ]\r
-; CHECK:   Symbols                  = [\r
-; CHECK:     0 = {\r
-; CHECK:       Name                     = .text\r
-; CHECK:       Value                    = 0\r
-; CHECK:       SectionNumber            = 1\r
-; CHECK:       SimpleType               = IMAGE_SYM_TYPE_NULL (0)\r
-; CHECK:       ComplexType              = IMAGE_SYM_DTYPE_NULL (0)\r
-; CHECK:       StorageClass             = IMAGE_SYM_CLASS_STATIC (3)\r
-; CHECK:       NumberOfAuxSymbols       = 1\r
-; CHECK:       AuxillaryData            =\r
-; CHECK:         30 00 00 00 06 00 00 00 - 00 00 00 00 01 00 00 00 |0...............|\r
-; CHECK:         00 00                                             |..|\r
-\r
-; CHECK:     }\r
-; CHECK:     2 = {\r
-; CHECK:       Name                     = .data\r
-; CHECK:       Value                    = 0\r
-; CHECK:       SectionNumber            = 2\r
-; CHECK:       SimpleType               = IMAGE_SYM_TYPE_NULL (0)\r
-; CHECK:       ComplexType              = IMAGE_SYM_DTYPE_NULL (0)\r
-; CHECK:       StorageClass             = IMAGE_SYM_CLASS_STATIC (3)\r
-; CHECK:       NumberOfAuxSymbols       = 1\r
-; CHECK:       AuxillaryData            =\r
-; CHECK:         23 00 00 00 00 00 00 00 - 00 00 00 00 02 00 00 00 |#...............|\r
-; CHECK:         00 00                                             |..|\r
-\r
-; CHECK:     }\r
-; CHECK:     4 = {\r
-; CHECK:       Name                     = _main\r
-; CHECK:       Value                    = 0\r
-; CHECK:       SectionNumber            = 1\r
-; CHECK:       SimpleType               = IMAGE_SYM_TYPE_NULL (0)\r
-; CHECK:       ComplexType              = IMAGE_SYM_DTYPE_FUNCTION (2)\r
-; CHECK:       StorageClass             = IMAGE_SYM_CLASS_EXTERNAL (2)\r
-; CHECK:       NumberOfAuxSymbols       = 0\r
-; CHECK:       AuxillaryData            =\r
-\r
-; CHECK:     5 = {\r
-; CHECK:       Name                     = _printf\r
-; CHECK:       Value                    = 0\r
-; CHECK:       SectionNumber            = 0\r
-; CHECK:       SimpleType               = IMAGE_SYM_TYPE_NULL (0)\r
-; CHECK:       ComplexType              = IMAGE_SYM_DTYPE_NULL (0)\r
-; CHECK:       StorageClass             = IMAGE_SYM_CLASS_EXTERNAL (2)\r
-; CHECK:       NumberOfAuxSymbols       = 0\r
-; CHECK:       AuxillaryData            =\r
-\r
-; CHECK:     }\r
-; CHECK:     6 = {\r
-; CHECK:       Name                     = _puts\r
-; CHECK:       Value                    = 0\r
-; CHECK:       SectionNumber            = 0\r
-; CHECK:       SimpleType               = IMAGE_SYM_TYPE_NULL (0)\r
-; CHECK:       ComplexType              = IMAGE_SYM_DTYPE_NULL (0)\r
-; CHECK:       StorageClass             = IMAGE_SYM_CLASS_EXTERNAL (2)\r
-; CHECK:       NumberOfAuxSymbols       = 0\r
-; CHECK:       AuxillaryData            =\r
-\r
-; CHECK:     }\r
-; CHECK:   ]\r
-; CHECK: }\r
diff --git a/test/MC/COFF/symbol-fragment-offset.s b/test/MC/COFF/symbol-fragment-offset.s
new file mode 100644 (file)
index 0000000..577b6c5
--- /dev/null
@@ -0,0 +1,187 @@
+// The purpose of this test is to see if the COFF object writer is emitting the\r
+// proper relocations for multiple pieces of data in a single data fragment.\r
+\r
+// RUN: llvm-mc -filetype=obj -triple i686-pc-win32 %s | coff-dump.py | FileCheck %s\r
+// I WOULD RUN, BUT THIS FAILS: llvm-mc -filetype=obj -triple x86_64-pc-win32 %s\r
+\r
+.def    _main;\r
+       .scl    2;\r
+       .type   32;\r
+       .endef\r
+       .text\r
+       .globl  _main\r
+       .align  16, 0x90\r
+_main:                                  # @main\r
+# BB#0:                                 # %entry\r
+       subl    $4, %esp\r
+       movl    $L_.str0, (%esp)\r
+       calll   _printf\r
+       movl    $L_.str1, (%esp)\r
+       calll   _puts\r
+       movl    $L_.str2, (%esp)\r
+       calll   _puts\r
+       xorl    %eax, %eax\r
+       addl    $4, %esp\r
+       ret\r
+\r
+       .data\r
+L_.str0:                                # @.str0\r
+       .asciz   "Hello "\r
+\r
+L_.str1:                                # @.str1\r
+       .asciz   "World!"\r
+\r
+       .align  16                      # @.str2\r
+L_.str2:\r
+       .asciz   "I'm The Last Line."\r
+\r
+// CHECK: {\r
+// CHECK:   MachineType              = IMAGE_FILE_MACHINE_I386 (0x14C)\r
+// CHECK:   NumberOfSections         = 2\r
+// CHECK:   TimeDateStamp            = {{[0-9]+}}\r
+// CHECK:   PointerToSymbolTable     = 0x{{[0-9A-F]+}}\r
+// CHECK:   NumberOfSymbols          = 7\r
+// CHECK:   SizeOfOptionalHeader     = 0\r
+// CHECK:   Characteristics          = 0x0\r
+// CHECK:   Sections                 = [\r
+// CHECK:     1 = {\r
+// CHECK:       Name                     = .text\r
+// CHECK:       VirtualSize              = 0\r
+// CHECK:       VirtualAddress           = 0\r
+// CHECK:       SizeOfRawData            = {{[0-9]+}}\r
+// CHECK:       PointerToRawData         = 0x{{[0-9A-F]+}}\r
+// CHECK:       PointerToRelocations     = 0x{{[0-9A-F]+}}\r
+// CHECK:       PointerToLineNumbers     = 0x0\r
+// CHECK:       NumberOfRelocations      = 6\r
+// CHECK:       NumberOfLineNumbers      = 0\r
+// CHECK:       Charateristics           = 0x60500020\r
+// CHECK:         IMAGE_SCN_CNT_CODE\r
+// CHECK:         IMAGE_SCN_ALIGN_16BYTES\r
+// CHECK:         IMAGE_SCN_MEM_EXECUTE\r
+// CHECK:         IMAGE_SCN_MEM_READ\r
+// CHECK:       SectionData              =\r
+// CHECK:         83 EC 04 C7 04 24 00 00 - 00 00 E8 00 00 00 00 C7 |.....$..........|\r
+// CHECK:         04 24 07 00 00 00 E8 00 - 00 00 00 C7 04 24 10 00 |.$...........$..|\r
+// CHECK:         00 00 E8 00 00 00 00 31 - C0 83 C4 04 C3 00 00 00 |.......1........|\r
+// CHECK:       Relocations              = [\r
+// CHECK:         0 = {\r
+// CHECK:           VirtualAddress           = 0x6\r
+// CHECK:           SymbolTableIndex         = 2\r
+// CHECK:           Type                     = IMAGE_REL_I386_DIR32 (6)\r
+// CHECK:           SymbolName               = .data\r
+// CHECK:         }\r
+// CHECK:         1 = {\r
+// CHECK:           VirtualAddress           = 0xB\r
+// CHECK:           SymbolTableIndex         = 5\r
+// CHECK:           Type                     = IMAGE_REL_I386_REL32 (20)\r
+// CHECK:           SymbolName               = _printf\r
+// CHECK:         }\r
+// CHECK:         2 = {\r
+// CHECK:           VirtualAddress           = 0x12\r
+// CHECK:           SymbolTableIndex         = 2\r
+// CHECK:           Type                     = IMAGE_REL_I386_DIR32 (6)\r
+// CHECK:           SymbolName               = .data\r
+// CHECK:         }\r
+// CHECK:         3 = {\r
+// CHECK:           VirtualAddress           = 0x17\r
+// CHECK:           SymbolTableIndex         = 6\r
+// CHECK:           Type                     = IMAGE_REL_I386_REL32 (20)\r
+// CHECK:           SymbolName               = _puts\r
+// CHECK:         }\r
+// CHECK:         4 = {\r
+// CHECK:           VirtualAddress           = 0x1E\r
+// CHECK:           SymbolTableIndex         = 2\r
+// CHECK:           Type                     = IMAGE_REL_I386_DIR32 (6)\r
+// CHECK:           SymbolName               = .data\r
+// CHECK:         }\r
+// CHECK:         5 = {\r
+// CHECK:           VirtualAddress           = 0x23\r
+// CHECK:           SymbolTableIndex         = 6\r
+// CHECK:           Type                     = IMAGE_REL_I386_REL32 (20)\r
+// CHECK:           SymbolName               = _puts\r
+// CHECK:         }\r
+// CHECK:       ]\r
+// CHECK:     }\r
+// CHECK:     2 = {\r
+// CHECK:       Name                     = .data\r
+// CHECK:       VirtualSize              = 0\r
+// CHECK:       VirtualAddress           = 0\r
+// CHECK:       SizeOfRawData            = {{[0-9]+}}\r
+// CHECK:       PointerToRawData         = 0x{{[0-9A-F]+}}\r
+// CHECK:       PointerToRelocations     = 0x0\r
+// CHECK:       PointerToLineNumbers     = 0x0\r
+// CHECK:       NumberOfRelocations      = 0\r
+// CHECK:       NumberOfLineNumbers      = 0\r
+// CHECK:       Charateristics           = 0xC0500040\r
+// CHECK:         IMAGE_SCN_CNT_INITIALIZED_DATA\r
+// CHECK:         IMAGE_SCN_ALIGN_16BYTES\r
+// CHECK:         IMAGE_SCN_MEM_READ\r
+// CHECK:         IMAGE_SCN_MEM_WRITE\r
+// CHECK:       SectionData              =\r
+// CHECK:         48 65 6C 6C 6F 20 00 57 - 6F 72 6C 64 21 00 00 00 |Hello .World!...|\r
+// CHECK:         49 27 6D 20 54 68 65 20 - 4C 61 73 74 20 4C 69 6E |I'm The Last Lin|\r
+// CHECK:         65 2E 00                                          |e..|\r
+// CHECK:       Relocations              = None\r
+// CHECK:     }\r
+// CHECK:   ]\r
+// CHECK:   Symbols                  = [\r
+// CHECK:     0 = {\r
+// CHECK:       Name                     = .text\r
+// CHECK:       Value                    = 0\r
+// CHECK:       SectionNumber            = 1\r
+// CHECK:       SimpleType               = IMAGE_SYM_TYPE_NULL (0)\r
+// CHECK:       ComplexType              = IMAGE_SYM_DTYPE_NULL (0)\r
+// CHECK:       StorageClass             = IMAGE_SYM_CLASS_STATIC (3)\r
+// CHECK:       NumberOfAuxSymbols       = 1\r
+// CHECK:       AuxillaryData            =\r
+// CHECK:         30 00 00 00 06 00 00 00 - 00 00 00 00 01 00 00 00 |0...............|\r
+// CHECK:         00 00                                             |..|\r
+\r
+// CHECK:     }\r
+// CHECK:     2 = {\r
+// CHECK:       Name                     = .data\r
+// CHECK:       Value                    = 0\r
+// CHECK:       SectionNumber            = 2\r
+// CHECK:       SimpleType               = IMAGE_SYM_TYPE_NULL (0)\r
+// CHECK:       ComplexType              = IMAGE_SYM_DTYPE_NULL (0)\r
+// CHECK:       StorageClass             = IMAGE_SYM_CLASS_STATIC (3)\r
+// CHECK:       NumberOfAuxSymbols       = 1\r
+// CHECK:       AuxillaryData            =\r
+// CHECK:         23 00 00 00 00 00 00 00 - 00 00 00 00 02 00 00 00 |#...............|\r
+// CHECK:         00 00                                             |..|\r
+\r
+// CHECK:     }\r
+// CHECK:     4 = {\r
+// CHECK:       Name                     = _main\r
+// CHECK:       Value                    = 0\r
+// CHECK:       SectionNumber            = 1\r
+// CHECK:       SimpleType               = IMAGE_SYM_TYPE_NULL (0)\r
+// CHECK:       ComplexType              = IMAGE_SYM_DTYPE_FUNCTION (2)\r
+// CHECK:       StorageClass             = IMAGE_SYM_CLASS_EXTERNAL (2)\r
+// CHECK:       NumberOfAuxSymbols       = 0\r
+// CHECK:       AuxillaryData            =\r
+\r
+// CHECK:     5 = {\r
+// CHECK:       Name                     = _printf\r
+// CHECK:       Value                    = 0\r
+// CHECK:       SectionNumber            = 0\r
+// CHECK:       SimpleType               = IMAGE_SYM_TYPE_NULL (0)\r
+// CHECK:       ComplexType              = IMAGE_SYM_DTYPE_NULL (0)\r
+// CHECK:       StorageClass             = IMAGE_SYM_CLASS_EXTERNAL (2)\r
+// CHECK:       NumberOfAuxSymbols       = 0\r
+// CHECK:       AuxillaryData            =\r
+\r
+// CHECK:     }\r
+// CHECK:     6 = {\r
+// CHECK:       Name                     = _puts\r
+// CHECK:       Value                    = 0\r
+// CHECK:       SectionNumber            = 0\r
+// CHECK:       SimpleType               = IMAGE_SYM_TYPE_NULL (0)\r
+// CHECK:       ComplexType              = IMAGE_SYM_DTYPE_NULL (0)\r
+// CHECK:       StorageClass             = IMAGE_SYM_CLASS_EXTERNAL (2)\r
+// CHECK:       NumberOfAuxSymbols       = 0\r
+// CHECK:       AuxillaryData            =\r
+\r
+// CHECK:     }\r
+// CHECK:   ]\r
+// CHECK: }\r