1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 02:52:53 +02:00

MC-COFF: Add COFFAsmParser. Completes PR8343.

llvm-svn: 116150
This commit is contained in:
Michael J. Spencer 2010-10-09 11:01:07 +00:00
parent 1c60bd155b
commit 9e8793d7d6
13 changed files with 593 additions and 375 deletions

View 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 {

View File

@ -1,6 +1,7 @@
add_llvm_library(LLVMMCParser
AsmLexer.cpp
AsmParser.cpp
COFFAsmParser.cpp
DarwinAsmParser.cpp
ELFAsmParser.cpp
MCAsmLexer.cpp

View File

@ -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;
}
}

View 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

View File

@ -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: }

133
test/MC/COFF/basic-coff.s Normal file
View File

@ -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: }

View File

@ -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 = [

View File

@ -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 = [

View 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

View File

@ -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]]

View File

@ -0,0 +1,62 @@
// 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: 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]]

View File

@ -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 ; <i32> [#uses=0]
%puts0 = tail call i32 @puts(i8* getelementptr inbounds ([7 x i8]* @.str1, i32 0, i32 0)) ; <i32> [#uses=0]
%puts1 = tail call i32 @puts(i8* getelementptr inbounds ([19 x i8]* @.str2, i32 0, i32 0)) ; <i32> [#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: }

View File

@ -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: }