Support for generating ELF objects on Windows.

This adds 'elf' as a recognized target triple environment value and overrides the default generated object format on Windows platforms if that value is present.  This patch also enables MCJIT tests on Windows using the new environment value.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@165030 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Andrew Kaylor 2012-10-02 18:38:34 +00:00
parent a346f46271
commit 7bbd6e366b
57 changed files with 84 additions and 59 deletions

View File

@ -111,7 +111,8 @@ public:
GNUEABIHF,
EABI,
MachO,
Android
Android,
ELF
};
private:

View File

@ -26,7 +26,14 @@
using namespace llvm;
TargetMachine *EngineBuilder::selectTarget() {
Triple TT(LLVM_HOSTTRIPLE);
Triple TT;
// MCJIT can generate code for remote targets, but the old JIT and Interpreter
// must use the host architecture.
if (UseMCJIT && WhichEngine != EngineKind::Interpreter && M)
TT.setTriple(M->getTargetTriple());
else
TT.setTriple(LLVM_HOSTTRIPLE);
return selectTarget(TT, MArch, MCPU, MAttrs);
}

View File

@ -565,6 +565,7 @@ void MCObjectFileInfo::InitMCObjectFileInfo(StringRef TT, Reloc::Model relocm,
Env = IsMachO;
InitMachOMCObjectFileInfo(T);
} else if ((Arch == Triple::x86 || Arch == Triple::x86_64) &&
(T.getEnvironment() != Triple::ELF) &&
(T.getOS() == Triple::MinGW32 || T.getOS() == Triple::Cygwin ||
T.getOS() == Triple::Win32)) {
Env = IsCOFF;

View File

@ -142,6 +142,7 @@ const char *Triple::getEnvironmentTypeName(EnvironmentType Kind) {
case EABI: return "eabi";
case MachO: return "macho";
case Android: return "android";
case ELF: return "elf";
}
llvm_unreachable("Invalid EnvironmentType!");
@ -314,6 +315,7 @@ static Triple::EnvironmentType parseEnvironment(StringRef EnvironmentName) {
.StartsWith("gnu", Triple::GNU)
.StartsWith("macho", Triple::MachO)
.StartsWith("android", Triple::Android)
.StartsWith("elf", Triple::ELF)
.Default(Triple::UnknownEnvironment);
}

View File

@ -453,7 +453,7 @@ MCAsmBackend *llvm::createX86_32AsmBackend(const Target &T, StringRef TT, String
if (TheTriple.isOSDarwin() || TheTriple.getEnvironment() == Triple::MachO)
return new DarwinX86_32AsmBackend(T, CPU);
if (TheTriple.isOSWindows())
if (TheTriple.isOSWindows() && TheTriple.getEnvironment() != Triple::ELF)
return new WindowsX86AsmBackend(T, false, CPU);
uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(TheTriple.getOS());
@ -466,7 +466,7 @@ MCAsmBackend *llvm::createX86_64AsmBackend(const Target &T, StringRef TT, String
if (TheTriple.isOSDarwin() || TheTriple.getEnvironment() == Triple::MachO)
return new DarwinX86_64AsmBackend(T, CPU);
if (TheTriple.isOSWindows())
if (TheTriple.isOSWindows() && TheTriple.getEnvironment() != Triple::ELF)
return new WindowsX86AsmBackend(T, true, CPU);
uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(TheTriple.getOS());

View File

@ -384,11 +384,15 @@ static MCAsmInfo *createX86MCAsmInfo(const Target &T, StringRef TT) {
MAI = new X86_64MCAsmInfoDarwin(TheTriple);
else
MAI = new X86MCAsmInfoDarwin(TheTriple);
} else if (TheTriple.getEnvironment() == Triple::ELF) {
// Force the use of an ELF container.
MAI = new X86ELFMCAsmInfo(TheTriple);
} else if (TheTriple.getOS() == Triple::Win32) {
MAI = new X86MCAsmInfoMicrosoft(TheTriple);
} else if (TheTriple.getOS() == Triple::MinGW32 || TheTriple.getOS() == Triple::Cygwin) {
MAI = new X86MCAsmInfoGNUCOFF(TheTriple);
} else {
// The default is ELF.
MAI = new X86ELFMCAsmInfo(TheTriple);
}
@ -470,7 +474,7 @@ static MCStreamer *createMCStreamer(const Target &T, StringRef TT,
if (TheTriple.isOSDarwin() || TheTriple.getEnvironment() == Triple::MachO)
return createMachOStreamer(Ctx, MAB, _OS, _Emitter, RelaxAll);
if (TheTriple.isOSWindows())
if (TheTriple.isOSWindows() && TheTriple.getEnvironment() != Triple::ELF)
return createWinCOFFStreamer(Ctx, MAB, *_Emitter, _OS, RelaxAll);
return createELFStreamer(Ctx, MAB, _OS, _Emitter, RelaxAll, NoExecStack);

View File

@ -237,10 +237,10 @@ public:
bool isTargetSolaris() const {
return TargetTriple.getOS() == Triple::Solaris;
}
// ELF is a reasonably sane default and the only other X86 targets we
// support are Darwin and Windows. Just use "not those".
bool isTargetELF() const { return TargetTriple.isOSBinFormatELF(); }
bool isTargetELF() const {
return (TargetTriple.getEnvironment() == Triple::ELF ||
TargetTriple.isOSBinFormatELF());
}
bool isTargetLinux() const { return TargetTriple.getOS() == Triple::Linux; }
bool isTargetNaCl() const {
return TargetTriple.getOS() == Triple::NativeClient;
@ -251,7 +251,10 @@ public:
bool isTargetMingw() const { return TargetTriple.getOS() == Triple::MinGW32; }
bool isTargetCygwin() const { return TargetTriple.getOS() == Triple::Cygwin; }
bool isTargetCygMing() const { return TargetTriple.isOSCygMing(); }
bool isTargetCOFF() const { return TargetTriple.isOSBinFormatCOFF(); }
bool isTargetCOFF() const {
return (TargetTriple.getEnvironment() != Triple::ELF &&
TargetTriple.isOSBinFormatCOFF());
}
bool isTargetEnvMacho() const { return TargetTriple.isEnvironmentMachO(); }
bool isTargetWin64() const {

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
@.LC0 = internal global [10 x i8] c"argc: %d\0A\00" ; <[10 x i8]*> [#uses=1]

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
define i32 @foo(i32 %X, i32 %Y, double %A) {
%cond212 = fcmp une double %A, 1.000000e+00 ; <i1> [#uses=1]

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
define i32 @main() {
call i32 @mylog( i32 4 ) ; <i32>:1 [#uses=0]

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
define i32 @main() {
; <label>:0

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
; We were accidentally inverting the signedness of right shifts. Whoops.

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
define i32 @main() {
%X = fadd double 0.000000e+00, 1.000000e+00 ; <double> [#uses=1]

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
define i32 @bar(i8* %X) {
; pointer should be 4 byte aligned!

View File

@ -1,6 +1,6 @@
; This testcase should return with an exit code of 1.
;
; RUN: not %lli -use-mcjit %s
; RUN: not %lli -mtriple=%mcjit_triple -use-mcjit %s
@test = global i64 0 ; <i64*> [#uses=1]

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s test
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s test
declare i32 @puts(i8*)

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
target datalayout = "e-p:32:32"

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
; Testcase distilled from 256.bzip2.

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
; Testcase distilled from 256.bzip2.

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
; This testcase failed to work because two variable sized allocas confused the
; local register allocator.

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
;
; Regression Test: EnvironmentTest.ll

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
; This testcase exposes a bug in the local register allocator where it runs out
; of registers (due to too many overlapping live ranges), but then attempts to

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
@A = global i32 0 ; <i32*> [#uses=1]

View File

@ -1,5 +1,5 @@
; PR672
; RUN: %lli -use-mcjit %s
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s
; XFAIL: mcjit-ia32
define i32 @main() {

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit -force-interpreter %s
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit -force-interpreter %s
; PR1836
define i32 @main() {

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit -force-interpreter=true %s | grep 1
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit -force-interpreter=true %s | grep 1
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32"
target triple = "i686-pc-linux-gnu"

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit -force-interpreter=true %s
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit -force-interpreter=true %s > /dev/null
define i32 @main() {
%a = add i32 0, undef

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit -force-interpreter=true %s | grep 40091eb8
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit -force-interpreter=true %s | grep 40091eb8
;
define i32 @test(double %x) {
entry:

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
@.LC0 = internal global [12 x i8] c"Hello World\00" ; <[12 x i8]*> [#uses=1]

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
@X = global i32 7 ; <i32*> [#uses=0]
@msg = internal global [13 x i8] c"Hello World\0A\00" ; <[13 x i8]*> [#uses=1]

View File

@ -16,5 +16,5 @@ else:
if root.host_arch not in ['x86', 'x86_64', 'ARM', 'Mips']:
config.unsupported = True
if root.host_os in ['Win32', 'Cygwin', 'MingW', 'Windows', 'Darwin']:
if root.host_os in ['Cygwin', 'MingW', 'Darwin']:
config.unsupported = True

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit -O0 -disable-lazy-compilation=false %s
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit -O0 -disable-lazy-compilation=false %s
; The intention of this test is to verify that symbols mapped to COMMON in ELF
; work as expected.

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
define i32 @main() {
ret i32 0

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
define i32 @bar() {
ret i32 0

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit -disable-lazy-compilation=false %s
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit -disable-lazy-compilation=false %s
define i32 @main() nounwind {
entry:

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
define i32 @main() {
%A = add i8 0, 12 ; <i8> [#uses=1]

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
; test unconditional branch
define i32 @main() {

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
define i32 @_Z14func_exit_codev() nounwind uwtable {
entry:

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
declare void @exit(i32)

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
define i32 @foo() {
ret i32 0

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit -O0 -disable-lazy-compilation=false %s
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit -O0 -disable-lazy-compilation=false %s
; The intention of this test is to verify that symbols mapped to COMMON in ELF
; work as expected.

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
; This tests to make sure that we can evaluate weird constant expressions

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
define double @test(double* %DP, double %Arg) {
%D = load double* %DP ; <double> [#uses=1]

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
define double @test(double* %DP, double %Arg) {
%D = load double* %DP ; <double> [#uses=1]

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
@count = global i32 1, align 4

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
@count = global i32 0, align 4

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
define void @test(i8* %P, i16* %P.upgrd.1, i32* %P.upgrd.2, i64* %P.upgrd.3) {
%V = load i8* %P ; <i8> [#uses=1]

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
define i32 @main() nounwind uwtable {
entry:

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
define i32 @main() {
%A = and i8 4, 8 ; <i8> [#uses=2]

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
define i32 @main() {
; <label>:0

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
; test phi node
@Y = global i32 6 ; <i32*> [#uses=1]

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
; test return instructions
define void @test1() {

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
define i32 @main() nounwind uwtable {
entry:

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
define i32 @main() {

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
define i32 @main() {
%int1 = add i32 0, 0 ; <i32> [#uses=6]

View File

@ -1,4 +1,4 @@
; RUN: %lli -use-mcjit %s > /dev/null
; RUN: %lli -mtriple=%mcjit_triple -use-mcjit %s > /dev/null
define i32 @main() {
%shamt = add i8 0, 1 ; <i8> [#uses=8]

View File

@ -139,6 +139,13 @@ if config.test_exec_root is None:
###
# Provide a target triple for mcjit tests
mcjit_triple = config.target_triple
# Force ELF format on Windows
if 'win32' in mcjit_triple.lower():
mcjit_triple += "-elf"
config.substitutions.append( ('%mcjit_triple', mcjit_triple) )
# When running under valgrind, we mangle '-vg' or '-vg_leak' onto the end of the
# triple so we can check it with XFAIL and XTARGET.
config.target_triple += lit.valgrindTriple