summaryrefslogtreecommitdiffstats
path: root/gnu/llvm/tools/llvm-rtdyld/llvm-rtdyld.cpp
diff options
context:
space:
mode:
authorpatrick <patrick@openbsd.org>2018-04-06 14:26:03 +0000
committerpatrick <patrick@openbsd.org>2018-04-06 14:26:03 +0000
commitbdabc2f19ffb9e20600dad6e8a300842a7bda50e (patch)
treec50e7b2e5449b074651bb82a58517a8ebc4a8cf7 /gnu/llvm/tools/llvm-rtdyld/llvm-rtdyld.cpp
parentPrint a 'p' flag for file descriptors that were opened after pledge(2). (diff)
downloadwireguard-openbsd-bdabc2f19ffb9e20600dad6e8a300842a7bda50e.tar.xz
wireguard-openbsd-bdabc2f19ffb9e20600dad6e8a300842a7bda50e.zip
Import LLVM 6.0.1 release including clang, lld and lldb.
"where is the kaboom?" deraadt@
Diffstat (limited to 'gnu/llvm/tools/llvm-rtdyld/llvm-rtdyld.cpp')
-rw-r--r--gnu/llvm/tools/llvm-rtdyld/llvm-rtdyld.cpp44
1 files changed, 28 insertions, 16 deletions
diff --git a/gnu/llvm/tools/llvm-rtdyld/llvm-rtdyld.cpp b/gnu/llvm/tools/llvm-rtdyld/llvm-rtdyld.cpp
index ba130ce80be..b09594622ca 100644
--- a/gnu/llvm/tools/llvm-rtdyld/llvm-rtdyld.cpp
+++ b/gnu/llvm/tools/llvm-rtdyld/llvm-rtdyld.cpp
@@ -24,7 +24,6 @@
#include "llvm/MC/MCInstrInfo.h"
#include "llvm/MC/MCRegisterInfo.h"
#include "llvm/MC/MCSubtargetInfo.h"
-#include "llvm/Object/MachO.h"
#include "llvm/Object/SymbolSize.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/DynamicLibrary.h"
@@ -37,7 +36,6 @@
#include "llvm/Support/TargetSelect.h"
#include "llvm/Support/raw_ostream.h"
#include <list>
-#include <system_error>
using namespace llvm;
using namespace llvm::object;
@@ -178,10 +176,14 @@ public:
void deregisterEHFrames() override {}
void preallocateSlab(uint64_t Size) {
- std::string Err;
- sys::MemoryBlock MB = sys::Memory::AllocateRWX(Size, nullptr, &Err);
+ std::error_code EC;
+ sys::MemoryBlock MB =
+ sys::Memory::allocateMappedMemory(Size, nullptr,
+ sys::Memory::MF_READ |
+ sys::Memory::MF_WRITE,
+ EC);
if (!MB.base())
- report_fatal_error("Can't allocate enough memory: " + Err);
+ report_fatal_error("Can't allocate enough memory: " + EC.message());
PreallocSlab = MB;
UsePreallocation = true;
@@ -222,10 +224,14 @@ uint8_t *TrivialMemoryManager::allocateCodeSection(uintptr_t Size,
if (UsePreallocation)
return allocateFromSlab(Size, Alignment, true /* isCode */);
- std::string Err;
- sys::MemoryBlock MB = sys::Memory::AllocateRWX(Size, nullptr, &Err);
+ std::error_code EC;
+ sys::MemoryBlock MB =
+ sys::Memory::allocateMappedMemory(Size, nullptr,
+ sys::Memory::MF_READ |
+ sys::Memory::MF_WRITE,
+ EC);
if (!MB.base())
- report_fatal_error("MemoryManager allocation failed: " + Err);
+ report_fatal_error("MemoryManager allocation failed: " + EC.message());
FunctionMemory.push_back(MB);
return (uint8_t*)MB.base();
}
@@ -242,10 +248,14 @@ uint8_t *TrivialMemoryManager::allocateDataSection(uintptr_t Size,
if (UsePreallocation)
return allocateFromSlab(Size, Alignment, false /* isCode */);
- std::string Err;
- sys::MemoryBlock MB = sys::Memory::AllocateRWX(Size, nullptr, &Err);
+ std::error_code EC;
+ sys::MemoryBlock MB =
+ sys::Memory::allocateMappedMemory(Size, nullptr,
+ sys::Memory::MF_READ |
+ sys::Memory::MF_WRITE,
+ EC);
if (!MB.base())
- report_fatal_error("MemoryManager allocation failed: " + Err);
+ report_fatal_error("MemoryManager allocation failed: " + EC.message());
DataMemory.push_back(MB);
return (uint8_t*)MB.base();
}
@@ -324,8 +334,8 @@ static int printLineInfoForInput(bool LoadObjects, bool UseDebugObj) {
}
}
- std::unique_ptr<DIContext> Context(
- new DWARFContextInMemory(*SymbolObj,LoadedObjInfo.get()));
+ std::unique_ptr<DIContext> Context =
+ DWARFContext::create(*SymbolObj, LoadedObjInfo.get());
std::vector<std::pair<SymbolRef, uint64_t>> SymAddr =
object::computeSymbolSizes(*SymbolObj);
@@ -453,9 +463,11 @@ static int executeInput() {
// Make sure the memory is executable.
// setExecutable will call InvalidateInstructionCache.
- std::string ErrorStr;
- if (!sys::Memory::setExecutable(FM, &ErrorStr))
- ErrorAndExit("unable to mark function executable: '" + ErrorStr + "'");
+ if (auto EC = sys::Memory::protectMappedMemory(FM,
+ sys::Memory::MF_READ |
+ sys::Memory::MF_EXEC))
+ ErrorAndExit("unable to mark function executable: '" + EC.message() +
+ "'");
}
// Dispatch to _main().