mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-26 05:32:25 +00:00
Adding a workaround for __main linking with remote lli and Cygwin/MinGW
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@193570 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
72580780a9
commit
47b7fd5448
@ -1,8 +1,5 @@
|
|||||||
; RUN: %lli_mcjit -extra-module=%p/Inputs/cross-module-b.ll -disable-lazy-compilation=true -remote-mcjit -mcjit-remote-process=lli-child-target %s > /dev/null
|
; RUN: %lli_mcjit -extra-module=%p/Inputs/cross-module-b.ll -disable-lazy-compilation=true -remote-mcjit -mcjit-remote-process=lli-child-target %s > /dev/null
|
||||||
|
|
||||||
; This fails because __main is not resolved in remote mcjit.
|
|
||||||
; XFAIL: cygwin,mingw32
|
|
||||||
|
|
||||||
declare i32 @FB()
|
declare i32 @FB()
|
||||||
|
|
||||||
define i32 @FA() {
|
define i32 @FA() {
|
||||||
|
@ -1,8 +1,5 @@
|
|||||||
; RUN: %lli_mcjit -extra-module=%p/Inputs/multi-module-b.ll -extra-module=%p/Inputs/multi-module-c.ll -disable-lazy-compilation=true -remote-mcjit -mcjit-remote-process=lli-child-target %s > /dev/null
|
; RUN: %lli_mcjit -extra-module=%p/Inputs/multi-module-b.ll -extra-module=%p/Inputs/multi-module-c.ll -disable-lazy-compilation=true -remote-mcjit -mcjit-remote-process=lli-child-target %s > /dev/null
|
||||||
|
|
||||||
; This fails because __main is not resolved in remote mcjit.
|
|
||||||
; XFAIL: cygwin,mingw32
|
|
||||||
|
|
||||||
declare i32 @FB()
|
declare i32 @FB()
|
||||||
|
|
||||||
define i32 @main() {
|
define i32 @main() {
|
||||||
|
@ -1,8 +1,5 @@
|
|||||||
; RUN: %lli_mcjit -remote-mcjit -mcjit-remote-process=lli-child-target %s > /dev/null
|
; RUN: %lli_mcjit -remote-mcjit -mcjit-remote-process=lli-child-target %s > /dev/null
|
||||||
|
|
||||||
; This fails because __main is not resolved in remote mcjit on cygming.
|
|
||||||
; XFAIL: cygwin,mingw32,mips
|
|
||||||
|
|
||||||
define i32 @bar() {
|
define i32 @bar() {
|
||||||
ret i32 0
|
ret i32 0
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,5 @@
|
|||||||
; RUN: %lli_mcjit -remote-mcjit -O0 -disable-lazy-compilation=false -mcjit-remote-process=lli-child-target %s
|
; RUN: %lli_mcjit -remote-mcjit -O0 -disable-lazy-compilation=false -mcjit-remote-process=lli-child-target %s
|
||||||
|
|
||||||
; This fails because __main is not resolved in remote mcjit on cygming.
|
|
||||||
; XFAIL: cygwin,mingw32,mips
|
|
||||||
|
|
||||||
; The intention of this test is to verify that symbols mapped to COMMON in ELF
|
; The intention of this test is to verify that symbols mapped to COMMON in ELF
|
||||||
; work as expected.
|
; work as expected.
|
||||||
;
|
;
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
; RUN: %lli_mcjit -remote-mcjit -O0 -mcjit-remote-process=lli-child-target %s
|
; RUN: %lli_mcjit -remote-mcjit -O0 -mcjit-remote-process=lli-child-target %s
|
||||||
|
|
||||||
; This fails because __main is not resolved in remote mcjit on cygming.
|
; XFAIL: mips
|
||||||
; XFAIL: cygwin,mingw32,mips
|
|
||||||
|
|
||||||
; Check that a variable is always aligned as specified.
|
; Check that a variable is always aligned as specified.
|
||||||
|
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
; RUN: %lli_mcjit -remote-mcjit -mcjit-remote-process=lli-child-target %s > /dev/null
|
; RUN: %lli_mcjit -remote-mcjit -mcjit-remote-process=lli-child-target %s > /dev/null
|
||||||
|
|
||||||
; This fails because __main is not resolved in remote mcjit on cygming.
|
; XFAIL: mips
|
||||||
; XFAIL: cygwin,mingw32,mips
|
|
||||||
|
|
||||||
define double @test(double* %DP, double %Arg) {
|
define double @test(double* %DP, double %Arg) {
|
||||||
%D = load double* %DP ; <double> [#uses=1]
|
%D = load double* %DP ; <double> [#uses=1]
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
; RUN: %lli_mcjit -remote-mcjit -mcjit-remote-process=lli-child-target %s > /dev/null
|
; RUN: %lli_mcjit -remote-mcjit -mcjit-remote-process=lli-child-target %s > /dev/null
|
||||||
|
|
||||||
; This fails because __main is not resolved in remote mcjit on cygming.
|
; XFAIL: mips
|
||||||
; XFAIL: cygwin,mingw32,mips
|
|
||||||
|
|
||||||
@count = global i32 1, align 4
|
@count = global i32 1, align 4
|
||||||
|
|
||||||
|
@ -1,8 +1,5 @@
|
|||||||
; RUN: %lli_mcjit -remote-mcjit -O0 -mcjit-remote-process=lli-child-target %s
|
; RUN: %lli_mcjit -remote-mcjit -O0 -mcjit-remote-process=lli-child-target %s
|
||||||
|
|
||||||
; This fails because __main is not resolved in remote mcjit.
|
|
||||||
; XFAIL: cygwin,mingw32
|
|
||||||
|
|
||||||
@.str = private unnamed_addr constant [6 x i8] c"data1\00", align 1
|
@.str = private unnamed_addr constant [6 x i8] c"data1\00", align 1
|
||||||
@ptr = global i8* getelementptr inbounds ([6 x i8]* @.str, i32 0, i32 0), align 4
|
@ptr = global i8* getelementptr inbounds ([6 x i8]* @.str, i32 0, i32 0), align 4
|
||||||
@.str1 = private unnamed_addr constant [6 x i8] c"data2\00", align 1
|
@.str1 = private unnamed_addr constant [6 x i8] c"data2\00", align 1
|
||||||
|
@ -27,8 +27,10 @@
|
|||||||
#include "llvm/ExecutionEngine/JITMemoryManager.h"
|
#include "llvm/ExecutionEngine/JITMemoryManager.h"
|
||||||
#include "llvm/ExecutionEngine/MCJIT.h"
|
#include "llvm/ExecutionEngine/MCJIT.h"
|
||||||
#include "llvm/ExecutionEngine/SectionMemoryManager.h"
|
#include "llvm/ExecutionEngine/SectionMemoryManager.h"
|
||||||
|
#include "llvm/IR/IRBuilder.h"
|
||||||
#include "llvm/IR/Module.h"
|
#include "llvm/IR/Module.h"
|
||||||
#include "llvm/IR/Type.h"
|
#include "llvm/IR/Type.h"
|
||||||
|
#include "llvm/IR/TypeBuilder.h"
|
||||||
#include "llvm/IRReader/IRReader.h"
|
#include "llvm/IRReader/IRReader.h"
|
||||||
#include "llvm/Support/CommandLine.h"
|
#include "llvm/Support/CommandLine.h"
|
||||||
#include "llvm/Support/Debug.h"
|
#include "llvm/Support/Debug.h"
|
||||||
@ -227,6 +229,46 @@ static void do_shutdown() {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// On Mingw and Cygwin, an external symbol named '__main' is called from the
|
||||||
|
// generated 'main' function to allow static intialization. To avoid linking
|
||||||
|
// problems with remote targets (because lli's remote target support does not
|
||||||
|
// currently handle external linking) we add a secondary module which defines
|
||||||
|
// an empty '__main' function.
|
||||||
|
static void addCygMingExtraModule(ExecutionEngine *EE,
|
||||||
|
LLVMContext &Context,
|
||||||
|
StringRef TargetTripleStr) {
|
||||||
|
IRBuilder<> Builder(Context);
|
||||||
|
Triple TargetTriple(TargetTripleStr);
|
||||||
|
|
||||||
|
// Create a new module.
|
||||||
|
Module *M = new Module("CygMingHelper", Context);
|
||||||
|
M->setTargetTriple(TargetTripleStr);
|
||||||
|
|
||||||
|
// Create an empty function named "__main".
|
||||||
|
Function *Result;
|
||||||
|
if (TargetTriple.isArch64Bit()) {
|
||||||
|
Result = Function::Create(
|
||||||
|
TypeBuilder<int64_t(void), false>::get(Context),
|
||||||
|
GlobalValue::ExternalLinkage, "__main", M);
|
||||||
|
} else {
|
||||||
|
Result = Function::Create(
|
||||||
|
TypeBuilder<int32_t(void), false>::get(Context),
|
||||||
|
GlobalValue::ExternalLinkage, "__main", M);
|
||||||
|
}
|
||||||
|
BasicBlock *BB = BasicBlock::Create(Context, "__main", Result);
|
||||||
|
Builder.SetInsertPoint(BB);
|
||||||
|
Value *ReturnVal;
|
||||||
|
if (TargetTriple.isArch64Bit())
|
||||||
|
ReturnVal = ConstantInt::get(Context, APInt(64, 0));
|
||||||
|
else
|
||||||
|
ReturnVal = ConstantInt::get(Context, APInt(32, 0));
|
||||||
|
Builder.CreateRet(ReturnVal);
|
||||||
|
|
||||||
|
// Add this new module to the ExecutionEngine.
|
||||||
|
EE->addModule(M);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// main Driver function
|
// main Driver function
|
||||||
//
|
//
|
||||||
@ -359,6 +401,12 @@ int main(int argc, char **argv, char * const *envp) {
|
|||||||
EE->addModule(XMod);
|
EE->addModule(XMod);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If the target is Cygwin/MingW and we are generating remote code, we
|
||||||
|
// need an extra module to help out with linking.
|
||||||
|
if (RemoteMCJIT && Triple(Mod->getTargetTriple()).isOSCygMing()) {
|
||||||
|
addCygMingExtraModule(EE, Context, Mod->getTargetTriple());
|
||||||
|
}
|
||||||
|
|
||||||
// The following functions have no effect if their respective profiling
|
// The following functions have no effect if their respective profiling
|
||||||
// support wasn't enabled in the build configuration.
|
// support wasn't enabled in the build configuration.
|
||||||
EE->RegisterJITEventListener(
|
EE->RegisterJITEventListener(
|
||||||
|
Loading…
Reference in New Issue
Block a user