[LLVMdev] [BUG] getFunctionAddress crashes on multiple functions
Ramkumar Ramachandra
artagnon at gmail.com
Mon Dec 22 13:51:39 PST 2014
For the purposes of this demonstration, we will use
LLVMGetFunctionAddress, a thin C wrapper I got merged a few hours ago.
Observe how this works without "scramble" and crashes as is:
#include "llvm-c/Analysis.h"
#include "llvm-c/Core.h"
#include "llvm-c/ExecutionEngine.h"
#include "llvm-c/BitWriter.h"
#include "llvm-c/Target.h"
#include "llvm-c/Transforms/PassManagerBuilder.h"
#include "llvm-c/Transforms/Scalar.h"
#include "llvm/ExecutionEngine/SectionMemoryManager.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/Host.h"
#include <iostream>
using namespace llvm;
int main()
{
char *Error = nullptr;
std::string HostTriple(sys::getProcessTriple());
LLVMModuleRef Module = LLVMModuleCreateWithName("simple_module");
LLVMSetTarget(Module, HostTriple.c_str());
LLVMValueRef Function = LLVMAddFunction(Module, "scramble",
LLVMFunctionType(LLVMInt32Type(), nullptr,0, 0));
LLVMSetFunctionCallConv(Function, LLVMCCallConv);
LLVMBasicBlockRef entry = LLVMAppendBasicBlock(Function, "entry");
LLVMBuilderRef builder = LLVMCreateBuilder();
LLVMPositionBuilderAtEnd(builder, entry);
LLVMBuildRet(builder, LLVMConstInt(LLVMInt32Type(), 24, 0));
Function = LLVMAddFunction(Module, "ooo1",
LLVMFunctionType(LLVMInt32Type(), nullptr,0, 0));
LLVMSetFunctionCallConv(Function, LLVMCCallConv);
entry = LLVMAppendBasicBlock(Function, "entry");
builder = LLVMCreateBuilder();
LLVMPositionBuilderAtEnd(builder, entry);
LLVMBuildRet(builder, LLVMConstInt(LLVMInt32Type(), 42, 0));
LLVMDumpModule(Module);
LLVMWriteBitcodeToFile(Module, "/tmp/cooo1.bit");
LLVMVerifyModule(Module, LLVMAbortProcessAction, &Error);
LLVMDisposeMessage(Error);
LLVMDisposeBuilder(builder);
LLVMMCJITCompilerOptions Options;
LLVMInitializeMCJITCompilerOptions(&Options, sizeof(Options));
Options.OptLevel = 2;
Options.NoFramePointerElim = false;
LLVMExecutionEngineRef Engine;
LLVMCreateMCJITCompilerForModule(&Engine, Module, &Options,
sizeof(Options), &Error);
union {
uint64_t raw;
int (*usable)();
} functionPointer;
functionPointer.raw = LLVMGetFunctionAddress(Engine, "ooo1");
std::cout << functionPointer.usable() << std::endl;
return 0;
}
More information about the llvm-dev
mailing list