From 7d4900416af3813aa9473e6ec2f0497ad5d208dd Mon Sep 17 00:00:00 2001 From: "Michael J. Spencer" Date: Sat, 9 Oct 2010 11:01:07 +0000 Subject: [PATCH] MC-COFF: Add COFFAsmParser. Completes PR8343. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@116150 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/MCParser/AsmParser.cpp | 6 +- lib/MC/MCParser/CMakeLists.txt | 1 + lib/MC/MCParser/COFFAsmParser.cpp | 144 +++++++++++++++++++ test/MC/COFF/align-nops.s | 10 +- test/MC/COFF/basic-coff.ll | 123 ---------------- test/MC/COFF/basic-coff.s | 133 ++++++++++++++++++ test/MC/COFF/simple-fixups.ll | 29 ---- test/MC/COFF/simple-fixups.s | 50 +++++++ test/MC/COFF/switch-relocations.ll | 3 + test/MC/COFF/symbol-alias.ll | 48 ------- test/MC/COFF/symbol-alias.s | 62 ++++++++ test/MC/COFF/symbol-fragment-offset.ll | 172 ----------------------- test/MC/COFF/symbol-fragment-offset.s | 187 +++++++++++++++++++++++++ 13 files changed, 593 insertions(+), 375 deletions(-) create mode 100644 lib/MC/MCParser/COFFAsmParser.cpp delete mode 100644 test/MC/COFF/basic-coff.ll create mode 100644 test/MC/COFF/basic-coff.s delete mode 100644 test/MC/COFF/simple-fixups.ll create mode 100644 test/MC/COFF/simple-fixups.s delete mode 100644 test/MC/COFF/symbol-alias.ll create mode 100644 test/MC/COFF/symbol-alias.s delete mode 100644 test/MC/COFF/symbol-fragment-offset.ll create mode 100644 test/MC/COFF/symbol-fragment-offset.s diff --git a/lib/MC/MCParser/AsmParser.cpp b/lib/MC/MCParser/AsmParser.cpp index 9554985b68f..23ae5f2e22c 100644 --- a/lib/MC/MCParser/AsmParser.cpp +++ b/lib/MC/MCParser/AsmParser.cpp @@ -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 { diff --git a/lib/MC/MCParser/CMakeLists.txt b/lib/MC/MCParser/CMakeLists.txt index 25a7bf48421..eaea9f6cd3c 100644 --- a/lib/MC/MCParser/CMakeLists.txt +++ b/lib/MC/MCParser/CMakeLists.txt @@ -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 index 00000000000..5ecab03b00f --- /dev/null +++ b/lib/MC/MCParser/COFFAsmParser.cpp @@ -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 + void AddDirectiveHandler(StringRef Directive) { + getParser().AddDirectiveHandler(this, Directive, + HandleDirective); + } + + 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; +} + +} diff --git a/test/MC/COFF/align-nops.s b/test/MC/COFF/align-nops.s index 0824e2378a0..2971ec67798 100644 --- a/test/MC/COFF/align-nops.s +++ b/test/MC/COFF/align-nops.s @@ -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 index bbf0d3ea5b0..00000000000 --- a/test/MC/COFF/basic-coff.ll +++ /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 ; [#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 index 00000000000..a94273bfc8d --- /dev/null +++ b/test/MC/COFF/basic-coff.s @@ -0,0 +1,133 @@ +// This test checks that the COFF object emitter works for the most basic +// programs. + +// RUN: llvm-mc -filetype=obj -triple i686-pc-win32 %s | coff-dump.py | FileCheck %s +// I WOULD RUN, BUT THIS FAILS: llvm-mc -filetype=obj -triple x86_64-pc-win32 %s + +.def _main; + .scl 2; + .type 32; + .endef + .text + .globl _main + .align 16, 0x90 +_main: # @main +# BB#0: # %entry + subl $4, %esp + movl $L_.str, (%esp) + calll _printf + xorl %eax, %eax + addl $4, %esp + ret + + .data +L_.str: # @.str + .asciz "Hello World" + +// 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/simple-fixups.ll b/test/MC/COFF/simple-fixups.ll deleted file mode 100644 index c2fb42ebf93..00000000000 --- a/test/MC/COFF/simple-fixups.ll +++ /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 index 00000000000..f86f4a9ff9e --- /dev/null +++ b/test/MC/COFF/simple-fixups.s @@ -0,0 +1,50 @@ +// 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: llvm-mc -filetype=obj -triple i686-pc-win32 %s | coff-dump.py | FileCheck %s +// I WOULD RUN, BUT THIS FAILS: llvm-mc -filetype=obj -triple x86_64-pc-win32 %s | coff-dump.py | FileCheck %s + + .def _foo; + .scl 2; + .type 32; + .endef + .text + .globl _foo + .align 16, 0x90 +_foo: # @foo +# BB#0: # %e + .align 16, 0x90 +LBB0_1: # %i + # =>This Inner Loop Header: Depth=1 + jmp LBB0_1 + + .def _bar; + .scl 2; + .type 32; + .endef + .globl _bar + .align 16, 0x90 +_bar: # @bar +# BB#0: # %e + .align 16, 0x90 +LBB1_1: # %i + # =>This Inner Loop Header: Depth=1 + jmp LBB1_1 + + .def _baz; + .scl 2; + .type 32; + .endef + .globl _baz + .align 16, 0x90 +_baz: # @baz +# BB#0: # %e + subl $4, %esp +Ltmp0: + calll _baz + addl $4, %esp + ret + +// CHECK: Sections = [ +// CHECK-NOT: NumberOfRelocations = {{[^0]}} +// CHECK: Symbols = [ diff --git a/test/MC/COFF/switch-relocations.ll b/test/MC/COFF/switch-relocations.ll index 300c10732ec..faf185fb729 100644 --- a/test/MC/COFF/switch-relocations.ll +++ b/test/MC/COFF/switch-relocations.ll @@ -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 index 3c00117f161..00000000000 --- a/test/MC/COFF/symbol-alias.ll +++ /dev/null @@ -1,48 +0,0 @@ -; The purpose of this test is to verify that symbol aliases -; (@foo = alias @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 index 00000000000..ede6b53c451 --- /dev/null +++ b/test/MC/COFF/symbol-alias.s @@ -0,0 +1,62 @@ +// The purpose of this test is to verify that symbol aliases +// (@foo = alias @bar) generate the correct entries in the symbol table. +// They should be identical except for the name. + +// RUN: llvm-mc -filetype=obj -triple i686-pc-win32 %s | coff-dump.py | FileCheck %s +// RUN: llvm-mc -filetype=obj -triple x86_64-pc-win32 %s | coff-dump.py | FileCheck %s + + .def _foo; + .scl 2; + .type 32; + .endef + .text + .globl _foo + .align 16, 0x90 +_foo: # @foo +# BB#0: # %entry + ret + + .data + .globl _bar # @bar + .align 4 +_bar: + .long 0 # 0x0 + + + .globl _foo_alias +_foo_alias = _foo + .globl _bar_alias +_bar_alias = _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-fragment-offset.ll b/test/MC/COFF/symbol-fragment-offset.ll deleted file mode 100644 index fec19250b29..00000000000 --- a/test/MC/COFF/symbol-fragment-offset.ll +++ /dev/null @@ -1,172 +0,0 @@ -; The purpose of this test is to see if the COFF object writer is emitting the -; proper relocations for multiple pieces of data in a single data fragment. - -; 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 - -@.str0 = private constant [7 x i8] c"Hello \00" ; <[7 x i8]*> [#uses=1] -@.str1 = private constant [7 x i8] c"World!\00" ; <[7 x i8]*> [#uses=1] -@.str2 = private constant [19 x i8] c"I'm The Last Line.\00" - -define i32 @main() nounwind { -entry: - %call = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([7 x i8]* @.str0, i32 0, i32 0)) nounwind ; [#uses=0] - %puts0 = tail call i32 @puts(i8* getelementptr inbounds ([7 x i8]* @.str1, i32 0, i32 0)) ; [#uses=0] - %puts1 = tail call i32 @puts(i8* getelementptr inbounds ([19 x i8]* @.str2, i32 0, i32 0)) ; [#uses=0] - ret i32 0 -} - -declare i32 @printf(i8* nocapture, ...) nounwind - -declare i32 @puts(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 = 7 -; 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 = 6 -; 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: 83 EC 04 C7 04 24 00 00 - 00 00 E8 00 00 00 00 C7 |.....$..........| -; CHECK: 04 24 07 00 00 00 E8 00 - 00 00 00 C7 04 24 10 00 |.$...........$..| -; CHECK: 00 00 E8 00 00 00 00 31 - C0 83 C4 04 C3 00 00 00 |.......1........| -; CHECK: Relocations = [ -; CHECK: 0 = { -; CHECK: VirtualAddress = 0x6 -; CHECK: SymbolTableIndex = 2 -; CHECK: Type = IMAGE_REL_I386_DIR32 (6) -; CHECK: SymbolName = .data -; CHECK: } -; CHECK: 1 = { -; CHECK: VirtualAddress = 0xB -; CHECK: SymbolTableIndex = 5 -; CHECK: Type = IMAGE_REL_I386_REL32 (20) -; CHECK: SymbolName = _printf -; CHECK: } -; CHECK: 2 = { -; CHECK: VirtualAddress = 0x12 -; CHECK: SymbolTableIndex = 2 -; CHECK: Type = IMAGE_REL_I386_DIR32 (6) -; CHECK: SymbolName = .data -; CHECK: } -; CHECK: 3 = { -; CHECK: VirtualAddress = 0x17 -; CHECK: SymbolTableIndex = 6 -; CHECK: Type = IMAGE_REL_I386_REL32 (20) -; CHECK: SymbolName = _puts -; CHECK: } -; CHECK: 4 = { -; CHECK: VirtualAddress = 0x1E -; CHECK: SymbolTableIndex = 2 -; CHECK: Type = IMAGE_REL_I386_DIR32 (6) -; CHECK: SymbolName = .data -; CHECK: } -; CHECK: 5 = { -; CHECK: VirtualAddress = 0x23 -; CHECK: SymbolTableIndex = 6 -; CHECK: Type = IMAGE_REL_I386_REL32 (20) -; CHECK: SymbolName = _puts -; 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 = 0xC0500040 -; CHECK: IMAGE_SCN_CNT_INITIALIZED_DATA -; CHECK: IMAGE_SCN_ALIGN_16BYTES -; CHECK: IMAGE_SCN_MEM_READ -; CHECK: IMAGE_SCN_MEM_WRITE -; CHECK: SectionData = -; CHECK: 48 65 6C 6C 6F 20 00 57 - 6F 72 6C 64 21 00 00 00 |Hello .World!...| -; CHECK: 49 27 6D 20 54 68 65 20 - 4C 61 73 74 20 4C 69 6E |I'm The Last Lin| -; CHECK: 65 2E 00 |e..| -; 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: 30 00 00 00 06 00 00 00 - 00 00 00 00 01 00 00 00 |0...............| -; 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: 23 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: 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: 6 = { -; CHECK: Name = _puts -; 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/symbol-fragment-offset.s b/test/MC/COFF/symbol-fragment-offset.s new file mode 100644 index 00000000000..577b6c59fad --- /dev/null +++ b/test/MC/COFF/symbol-fragment-offset.s @@ -0,0 +1,187 @@ +// The purpose of this test is to see if the COFF object writer is emitting the +// proper relocations for multiple pieces of data in a single data fragment. + +// RUN: llvm-mc -filetype=obj -triple i686-pc-win32 %s | coff-dump.py | FileCheck %s +// I WOULD RUN, BUT THIS FAILS: llvm-mc -filetype=obj -triple x86_64-pc-win32 %s + +.def _main; + .scl 2; + .type 32; + .endef + .text + .globl _main + .align 16, 0x90 +_main: # @main +# BB#0: # %entry + subl $4, %esp + movl $L_.str0, (%esp) + calll _printf + movl $L_.str1, (%esp) + calll _puts + movl $L_.str2, (%esp) + calll _puts + xorl %eax, %eax + addl $4, %esp + ret + + .data +L_.str0: # @.str0 + .asciz "Hello " + +L_.str1: # @.str1 + .asciz "World!" + + .align 16 # @.str2 +L_.str2: + .asciz "I'm The Last Line." + +// CHECK: { +// CHECK: MachineType = IMAGE_FILE_MACHINE_I386 (0x14C) +// CHECK: NumberOfSections = 2 +// CHECK: TimeDateStamp = {{[0-9]+}} +// CHECK: PointerToSymbolTable = 0x{{[0-9A-F]+}} +// CHECK: NumberOfSymbols = 7 +// 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 = 6 +// 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: 83 EC 04 C7 04 24 00 00 - 00 00 E8 00 00 00 00 C7 |.....$..........| +// CHECK: 04 24 07 00 00 00 E8 00 - 00 00 00 C7 04 24 10 00 |.$...........$..| +// CHECK: 00 00 E8 00 00 00 00 31 - C0 83 C4 04 C3 00 00 00 |.......1........| +// CHECK: Relocations = [ +// CHECK: 0 = { +// CHECK: VirtualAddress = 0x6 +// CHECK: SymbolTableIndex = 2 +// CHECK: Type = IMAGE_REL_I386_DIR32 (6) +// CHECK: SymbolName = .data +// CHECK: } +// CHECK: 1 = { +// CHECK: VirtualAddress = 0xB +// CHECK: SymbolTableIndex = 5 +// CHECK: Type = IMAGE_REL_I386_REL32 (20) +// CHECK: SymbolName = _printf +// CHECK: } +// CHECK: 2 = { +// CHECK: VirtualAddress = 0x12 +// CHECK: SymbolTableIndex = 2 +// CHECK: Type = IMAGE_REL_I386_DIR32 (6) +// CHECK: SymbolName = .data +// CHECK: } +// CHECK: 3 = { +// CHECK: VirtualAddress = 0x17 +// CHECK: SymbolTableIndex = 6 +// CHECK: Type = IMAGE_REL_I386_REL32 (20) +// CHECK: SymbolName = _puts +// CHECK: } +// CHECK: 4 = { +// CHECK: VirtualAddress = 0x1E +// CHECK: SymbolTableIndex = 2 +// CHECK: Type = IMAGE_REL_I386_DIR32 (6) +// CHECK: SymbolName = .data +// CHECK: } +// CHECK: 5 = { +// CHECK: VirtualAddress = 0x23 +// CHECK: SymbolTableIndex = 6 +// CHECK: Type = IMAGE_REL_I386_REL32 (20) +// CHECK: SymbolName = _puts +// 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 = 0xC0500040 +// CHECK: IMAGE_SCN_CNT_INITIALIZED_DATA +// CHECK: IMAGE_SCN_ALIGN_16BYTES +// CHECK: IMAGE_SCN_MEM_READ +// CHECK: IMAGE_SCN_MEM_WRITE +// CHECK: SectionData = +// CHECK: 48 65 6C 6C 6F 20 00 57 - 6F 72 6C 64 21 00 00 00 |Hello .World!...| +// CHECK: 49 27 6D 20 54 68 65 20 - 4C 61 73 74 20 4C 69 6E |I'm The Last Lin| +// CHECK: 65 2E 00 |e..| +// 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: 30 00 00 00 06 00 00 00 - 00 00 00 00 01 00 00 00 |0...............| +// 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: 23 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: 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: 6 = { +// CHECK: Name = _puts +// 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: }