aboutsummaryrefslogtreecommitdiffhomepage
path: root/lib/Module
diff options
context:
space:
mode:
authorRichard Trembecký <richardt@centrum.sk>2016-05-01 16:38:21 +0200
committerDan Liew <delcypher@gmail.com>2017-05-24 14:24:47 +0100
commitd3a467d8999e6e52892b13c2bc93ac829ee1b7c9 (patch)
tree99493da4b33f50eb0c27a237213c615520efbd95 /lib/Module
parent92367dec2ee00cb708454e4c33ff34d80eddb878 (diff)
downloadklee-d3a467d8999e6e52892b13c2bc93ac829ee1b7c9.tar.gz
llvm: make KLEE compile against LLVM 3.5 and 3.6
Based on work by @ccadeptic23 and @delcypher. Formatting fixed by @snf. Fix compiler warning by @martijnthe. Further fixes by @mchalupa. Refactored, so that changes can be reviewed -- no massive changes in whitespace and in the surrounding code. Signed-off-by: Jiri Slaby <jirislaby@gmail.com>
Diffstat (limited to 'lib/Module')
-rw-r--r--lib/Module/KModule.cpp13
-rw-r--r--lib/Module/ModuleUtil.cpp117
-rw-r--r--lib/Module/Optimize.cpp14
-rw-r--r--lib/Module/RaiseAsm.cpp13
4 files changed, 135 insertions, 22 deletions
diff --git a/lib/Module/KModule.cpp b/lib/Module/KModule.cpp
index 08ec28ef..45dc34bf 100644
--- a/lib/Module/KModule.cpp
+++ b/lib/Module/KModule.cpp
@@ -158,8 +158,14 @@ static Function *getStubFunctionForCtorList(Module *m,
if (arr) {
for (unsigned i=0; i<arr->getNumOperands(); i++) {
ConstantStruct *cs = cast<ConstantStruct>(arr->getOperand(i));
+#if LLVM_VERSION_CODE >= LLVM_VERSION(3, 5)
+ // There is a third *optional* element in global_ctor elements (``i8
+ // @data``).
+ assert((cs->getNumOperands() == 2 || cs->getNumOperands() == 3) &&
+ "unexpected element in ctor initializer list");
+#else
assert(cs->getNumOperands()==2 && "unexpected element in ctor initializer list");
-
+#endif
Constant *fp = cs->getOperand(1);
if (!fp->isNullValue()) {
if (llvm::ConstantExpr *ce = dyn_cast<llvm::ConstantExpr>(fp))
@@ -513,8 +519,13 @@ static int getOperandNum(Value *v,
return registerMap[inst];
} else if (Argument *a = dyn_cast<Argument>(v)) {
return a->getArgNo();
+#if LLVM_VERSION_CODE >= LLVM_VERSION(3, 6)
+ // Metadata is no longer a Value
+ } else if (isa<BasicBlock>(v) || isa<InlineAsm>(v)) {
+#else
} else if (isa<BasicBlock>(v) || isa<InlineAsm>(v) ||
isa<MDNode>(v)) {
+#endif
return -1;
} else {
assert(isa<Constant>(v));
diff --git a/lib/Module/ModuleUtil.cpp b/lib/Module/ModuleUtil.cpp
index 83dc5045..c7f1c6d9 100644
--- a/lib/Module/ModuleUtil.cpp
+++ b/lib/Module/ModuleUtil.cpp
@@ -212,15 +212,27 @@ static bool linkBCA(object::Archive* archive, Module* composite, std::string& er
KLEE_DEBUG_WITH_TYPE("klee_linker", dbgs() << "Loading modules\n");
// Load all bitcode files in to memory so we can examine their symbols
+#if LLVM_VERSION_CODE >= LLVM_VERSION(3, 5)
+ for (object::Archive::child_iterator AI = archive->child_begin(),
+ AE = archive->child_end(); AI != AE; ++AI)
+#else
for (object::Archive::child_iterator AI = archive->begin_children(),
AE = archive->end_children(); AI != AE; ++AI)
+#endif
{
StringRef memberName;
+#if LLVM_VERSION_CODE >= LLVM_VERSION(3, 5)
+ ErrorOr<StringRef> memberNameErr = AI->getName();
+ std::error_code ec = memberNameErr.getError();
+ if (!ec) {
+ memberName = memberNameErr.get();
+#else
error_code ec = AI->getName(memberName);
if ( ec == errc::success )
{
+#endif
KLEE_DEBUG_WITH_TYPE("klee_linker", dbgs() << "Loading archive member " << memberName << "\n");
}
else
@@ -229,17 +241,29 @@ static bool linkBCA(object::Archive* archive, Module* composite, std::string& er
return false;
}
+#if LLVM_VERSION_CODE >= LLVM_VERSION(3, 5)
+ ErrorOr<std::unique_ptr<llvm::object::Binary> > child = AI->getAsBinary();
+ ec = child.getError();
+#else
OwningPtr<object::Binary> child;
ec = AI->getAsBinary(child);
- if (ec != object::object_error::success)
- {
+#endif
+ if (ec) {
// If we can't open as a binary object file its hopefully a bitcode file
-
+#if LLVM_VERSION_CODE >= LLVM_VERSION(3, 6)
+ ErrorOr<MemoryBufferRef> buff = AI->getMemoryBufferRef();
+ ec = buff.getError();
+#elif LLVM_VERSION_CODE >= LLVM_VERSION(3, 5)
+ ErrorOr<std::unique_ptr<MemoryBuffer> > buffErr = AI->getMemoryBuffer();
+ std::unique_ptr<MemoryBuffer> buff = nullptr;
+ ec = buffErr.getError();
+ if (!ec)
+ buff = std::move(buffErr.get());
+#else
OwningPtr<MemoryBuffer> buff; // Once this is destroyed will Module still be valid??
- Module *Result = 0;
-
- if (error_code ec = AI->getMemoryBuffer(buff))
- {
+ ec = AI->getMemoryBuffer(buff);
+#endif
+ if (ec) {
SS << "Failed to get MemoryBuffer: " <<ec.message();
SS.flush();
return false;
@@ -247,10 +271,20 @@ static bool linkBCA(object::Archive* archive, Module* composite, std::string& er
if (buff)
{
+ Module *Result = 0;
// FIXME: Maybe load bitcode file lazily? Then if we need to link, materialise the module
+#if LLVM_VERSION_CODE >= LLVM_VERSION(3, 5)
+ ErrorOr<Module *> resultErr = parseBitcodeFile(buff.get(),
+ composite->getContext());
+ ec = resultErr.getError();
+ if (ec)
+ errorMessage = ec.message();
+ else
+ Result = resultErr.get();
+#else
Result = ParseBitcodeFile(buff.get(), composite->getContext(),
&errorMessage);
-
+#endif
if(!Result)
{
SS << "Loading module failed : " << errorMessage << "\n";
@@ -317,8 +351,11 @@ static bool linkBCA(object::Archive* archive, Module* composite, std::string& er
KLEE_DEBUG_WITH_TYPE("klee_linker", dbgs() << "Found " << GV->getName() <<
" in " << M->getModuleIdentifier() << "\n");
-
+#if LLVM_VERSION_CODE >= LLVM_VERSION(3, 6)
+ if (Linker::LinkModules(composite, M))
+#else
if (Linker::LinkModules(composite, M, Linker::DestroySource, &errorMessage))
+#endif
{
// Linking failed
SS << "Linking archive module with composite failed:" << errorMessage;
@@ -371,36 +408,86 @@ Module *klee::linkWithLibrary(Module *module,
libraryName.c_str());
}
+#if LLVM_VERSION_CODE >= LLVM_VERSION(3, 5)
+ ErrorOr<std::unique_ptr<MemoryBuffer> > bufferErr =
+ MemoryBuffer::getFile(libraryName);
+ std::error_code ec = bufferErr.getError();
+#else
OwningPtr<MemoryBuffer> Buffer;
- if (error_code ec = MemoryBuffer::getFile(libraryName,Buffer)) {
+ error_code ec = MemoryBuffer::getFile(libraryName,Buffer);
+#endif
+ if (ec) {
klee_error("Link with library %s failed: %s", libraryName.c_str(),
ec.message().c_str());
}
+#if LLVM_VERSION_CODE >= LLVM_VERSION(3, 6)
+ MemoryBufferRef Buffer = bufferErr.get()->getMemBufferRef();
+#elif LLVM_VERSION_CODE >= LLVM_VERSION(3, 5)
+ MemoryBuffer *Buffer = bufferErr->get();
+#endif
+
+#if LLVM_VERSION_CODE >= LLVM_VERSION(3, 6)
+ sys::fs::file_magic magic = sys::fs::identify_magic(Buffer.getBuffer());
+#else
sys::fs::file_magic magic = sys::fs::identify_magic(Buffer->getBuffer());
+#endif
LLVMContext &Context = module->getContext();
std::string ErrorMessage;
if (magic == sys::fs::file_magic::bitcode) {
Module *Result = 0;
+#if LLVM_VERSION_CODE >= LLVM_VERSION(3, 5)
+ ErrorOr<Module *> ResultErr = parseBitcodeFile(Buffer, Context);
+ if ((ec = ResultErr.getError())) {
+ ErrorMessage = ec.message();
+#else
Result = ParseBitcodeFile(Buffer.get(), Context, &ErrorMessage);
+ if (!Result) {
+#endif
+ klee_error("Link with library %s failed: %s", libraryName.c_str(),
+ ErrorMessage.c_str());
+ }
+#if LLVM_VERSION_CODE >= LLVM_VERSION(3, 5)
+ Result = ResultErr.get();
+#endif
- if (!Result || Linker::LinkModules(module, Result, Linker::DestroySource,
- &ErrorMessage))
+#if LLVM_VERSION_CODE >= LLVM_VERSION(3, 6)
+ if (Linker::LinkModules(module, Result)) {
+ ErrorMessage = "linking error";
+#else
+ if (Linker::LinkModules(module, Result, Linker::DestroySource, &ErrorMessage)) {
+#endif
klee_error("Link with library %s failed: %s", libraryName.c_str(),
ErrorMessage.c_str());
+ }
delete Result;
} else if (magic == sys::fs::file_magic::archive) {
+#if LLVM_VERSION_CODE >= LLVM_VERSION(3, 6)
+ ErrorOr<std::unique_ptr<object::Binary> > arch =
+ object::createBinary(Buffer, &Context);
+ ec = arch.getError();
+#elif LLVM_VERSION_CODE >= LLVM_VERSION(3, 5)
+ ErrorOr<object::Binary *> arch =
+ object::createBinary(std::move(bufferErr.get()), &Context);
+ ec = arch.getError();
+#else
OwningPtr<object::Binary> arch;
- if (error_code ec = object::createBinary(Buffer.take(), arch))
+ ec = object::createBinary(Buffer.take(), arch);
+#endif
+ if (ec)
klee_error("Link with library %s failed: %s", libraryName.c_str(),
ec.message().c_str());
+#if LLVM_VERSION_CODE >= LLVM_VERSION(3, 6)
+ if (object::Archive *a = dyn_cast<object::Archive>(arch->get())) {
+#else
if (object::Archive *a = dyn_cast<object::Archive>(arch.get())) {
+#endif
// Handle in helper
if (!linkBCA(a, module, ErrorMessage))
klee_error("Link with library %s failed: %s", libraryName.c_str(),
@@ -411,7 +498,11 @@ Module *klee::linkWithLibrary(Module *module,
}
} else if (magic.is_object()) {
+#if LLVM_VERSION_CODE >= LLVM_VERSION(3, 5)
+ std::unique_ptr<object::Binary> obj;
+#else
OwningPtr<object::Binary> obj;
+#endif
if (obj.get()->isObject()) {
klee_warning("Link with library: Object file %s in archive %s found. "
"Currently not supported.",
diff --git a/lib/Module/Optimize.cpp b/lib/Module/Optimize.cpp
index 3d9c8cc1..c0f3f34c 100644
--- a/lib/Module/Optimize.cpp
+++ b/lib/Module/Optimize.cpp
@@ -172,15 +172,17 @@ void Optimize(Module *M, const std::string &EntryPoint) {
if (VerifyEach)
Passes.add(createVerifierPass());
-#if LLVM_VERSION_CODE <= LLVM_VERSION(3, 1)
- // Add an appropriate TargetData instance for this module...
- addPass(Passes, new TargetData(M));
-#elif LLVM_VERSION_CODE < LLVM_VERSION(3, 5)
// Add an appropriate DataLayout instance for this module...
+#if LLVM_VERSION_CODE >= LLVM_VERSION(3, 6)
+ DataLayoutPass *dlpass = new DataLayoutPass();
+ dlpass->doInitialization(*M);
+ addPass(Passes, dlpass);
+#elif LLVM_VERSION_CODE >= LLVM_VERSION(3, 5)
+ addPass(Passes, new DataLayoutPass(M));
+#elif LLVM_VERSION_CODE >= LLVM_VERSION(3, 2)
addPass(Passes, new DataLayout(M));
#else
- // Add an appropriate DataLayout instance for this module...
- addPass(Passes, new DataLayoutPass(M));
+ addPass(Passes, new TargetData(M));
#endif
// DWD - Run the opt standard pass list as well.
diff --git a/lib/Module/RaiseAsm.cpp b/lib/Module/RaiseAsm.cpp
index af92b74b..5fc54ef1 100644
--- a/lib/Module/RaiseAsm.cpp
+++ b/lib/Module/RaiseAsm.cpp
@@ -24,6 +24,10 @@
#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/Host.h"
#include "llvm/Target/TargetLowering.h"
+#if LLVM_VERSION_CODE >= LLVM_VERSION(3, 6)
+#include "llvm/Target/TargetMachine.h"
+#include "llvm/Target/TargetSubtargetInfo.h"
+#endif
#if LLVM_VERSION_CODE < LLVM_VERSION(3, 0)
#include "llvm/Target/TargetRegistry.h"
#else
@@ -99,15 +103,20 @@ bool RaiseAsmPass::runOnModule(Module &M) {
klee_warning("Warning: unable to select native target: %s", Err.c_str());
TLI = 0;
} else {
-#if LLVM_VERSION_CODE >= LLVM_VERSION(3, 1)
+#if LLVM_VERSION_CODE >= LLVM_VERSION(3, 6)
+ TM = NativeTarget->createTargetMachine(HostTriple, "", "", TargetOptions());
+ TLI = TM->getSubtargetImpl()->getTargetLowering();
+#elif LLVM_VERSION_CODE >= LLVM_VERSION(3, 1)
TM = NativeTarget->createTargetMachine(HostTriple, "", "",
TargetOptions());
+ TLI = TM->getTargetLowering();
#elif LLVM_VERSION_CODE >= LLVM_VERSION(3, 0)
TM = NativeTarget->createTargetMachine(HostTriple, "", "");
+ TLI = TM->getTargetLowering();
#else
TM = NativeTarget->createTargetMachine(HostTriple, "");
-#endif
TLI = TM->getTargetLowering();
+#endif
triple = llvm::Triple(HostTriple);
}