From f2dd54861c690c8f14e5ced538f04a6119b36f2f Mon Sep 17 00:00:00 2001 From: Paul Wankadia Date: Tue, 8 Mar 2016 00:00:00 +1100 Subject: [PATCH] Adjust to changes in the LLVM C++ API. --- redasm.cc | 2 +- regexp.cc | 22 ++++++++++++++-------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/redasm.cc b/redasm.cc index f51e0ae..a7c00fb 100644 --- a/redasm.cc +++ b/redasm.cc @@ -41,7 +41,7 @@ int main(int argc, char** argv) { int nbytes = redgrep::Compile(dfa, &fun); printf("; fun is %d bytes\n", nbytes); - std::string triple = fun.engine_->getTargetMachine()->getTargetTriple(); + std::string triple = fun.engine_->getTargetMachine()->getTargetTriple().str(); std::string cpu = fun.engine_->getTargetMachine()->getTargetCPU(); printf("; target is %s (%s)\n", triple.c_str(), cpu.c_str()); diff --git a/regexp.cc b/regexp.cc index fb48032..60d1bf9 100644 --- a/regexp.cc +++ b/regexp.cc @@ -45,7 +45,10 @@ #include "llvm/IR/TypeBuilder.h" #include "llvm/Object/Binary.h" #include "llvm/Object/ObjectFile.h" +#include "llvm/Object/SymbolSize.h" +#include "llvm/Object/SymbolicFile.h" #include "llvm/Support/Casting.h" +#include "llvm/Support/ErrorOr.h" #include "llvm/Support/Host.h" #include "llvm/Support/TargetSelect.h" #include "llvm/Transforms/IPO/PassManagerBuilder.h" @@ -1714,8 +1717,8 @@ static void GenerateFunction(const DFA& dfa, Fun* fun) { llvm::AllocaInst* size = bb.CreateAlloca( llvm::TypeBuilder::get(context), nullptr, "size"); llvm::Function::arg_iterator arg = fun->function_->arg_begin(); - bb.CreateStore(arg++, data); - bb.CreateStore(arg++, size); + bb.CreateStore(&*arg++, data); + bb.CreateStore(&*arg++, size); // Create a BasicBlock that returns true. llvm::BasicBlock* return_true = @@ -1821,14 +1824,17 @@ class DiscoverMachineCodeSize : public llvm::JITEventListener { void NotifyObjectEmitted( const llvm::object::ObjectFile& object, const llvm::RuntimeDyld::LoadedObjectInfo& info) override { + // We need this in order to obtain the addresses as well as the sizes. llvm::object::OwningBinary debug = info.getObjectForDebug(object); - for (const llvm::object::SymbolRef& symbol : debug.getBinary()->symbols()) { - llvm::StringRef name; - symbol.getName(name); - if (name == "F") { - symbol.getAddress(fun_->machine_code_addr_); - symbol.getSize(fun_->machine_code_size_); + vector> symbol_sizes = + llvm::object::computeSymbolSizes(*debug.getBinary()); + for (const auto& i : symbol_sizes) { + llvm::ErrorOr name = i.first.getName(); + llvm::ErrorOr addr = i.first.getAddress(); + if (name && addr && *name == "F") { + fun_->machine_code_addr_ = *addr; + fun_->machine_code_size_ = i.second; return; } }