extern MCAsmParserExtension *createDarwinAsmParser();
extern MCAsmParserExtension *createELFAsmParser();
+extern MCAsmParserExtension *createCOFFAsmParser();
}
//
// 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 {
add_llvm_library(LLVMMCParser
AsmLexer.cpp
AsmParser.cpp
+ COFFAsmParser.cpp
DarwinAsmParser.cpp
ELFAsmParser.cpp
MCAsmLexer.cpp
--- /dev/null
+//===- 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;
+}
+
+}
//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
//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
+++ /dev/null
-; 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: }
--- /dev/null
+// 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
+++ /dev/null
-; 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 = [
--- /dev/null
+// 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
; 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
+++ /dev/null
-; 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]]
--- /dev/null
+// 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
+++ /dev/null
-; 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
--- /dev/null
+// 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