[llvm] b77c6db - [JITLink] Fix alloc action call signature in InProcessMemoryManager.
Lang Hames via llvm-commits
llvm-commits at lists.llvm.org
Sun Oct 31 10:36:51 PDT 2021
Author: Lang Hames
Date: 2021-10-31T10:27:40-07:00
New Revision: b77c6db9597b16076505ebfaa288ed4e26823232
URL: https://github.com/llvm/llvm-project/commit/b77c6db9597b16076505ebfaa288ed4e26823232
DIFF: https://github.com/llvm/llvm-project/commit/b77c6db9597b16076505ebfaa288ed4e26823232.diff
LOG: [JITLink] Fix alloc action call signature in InProcessMemoryManager.
Alloc actions should return a CWrapperFunctionResult. JITLink does not have
access to this type yet, due to library layering issues, so add a cut-down
version with a fixme.
Added:
Modified:
llvm/lib/ExecutionEngine/JITLink/JITLinkMemoryManager.cpp
Removed:
################################################################################
diff --git a/llvm/lib/ExecutionEngine/JITLink/JITLinkMemoryManager.cpp b/llvm/lib/ExecutionEngine/JITLink/JITLinkMemoryManager.cpp
index fd971eeae41e8..0e5ed8e3d1ce3 100644
--- a/llvm/lib/ExecutionEngine/JITLink/JITLinkMemoryManager.cpp
+++ b/llvm/lib/ExecutionEngine/JITLink/JITLinkMemoryManager.cpp
@@ -13,6 +13,50 @@
#define DEBUG_TYPE "jitlink"
+using namespace llvm;
+
+namespace {
+
+// FIXME: Remove this copy of CWrapperFunctionResult as soon as JITLink can
+// depend on shared utils from Orc.
+
+// Must be kept in-sync with compiler-rt/lib/orc/c-api.h.
+union CWrapperFunctionResultDataUnion {
+ char *ValuePtr;
+ char Value[sizeof(ValuePtr)];
+};
+
+// Must be kept in-sync with compiler-rt/lib/orc/c-api.h.
+typedef struct {
+ CWrapperFunctionResultDataUnion Data;
+ size_t Size;
+} CWrapperFunctionResult;
+
+Error toError(CWrapperFunctionResult R) {
+ bool HasError = false;
+ std::string ErrMsg;
+ if (R.Size) {
+ bool Large = R.Size > sizeof(CWrapperFunctionResultDataUnion);
+ char *Content = Large ? R.Data.ValuePtr : R.Data.Value;
+ if (Content[0]) {
+ HasError = true;
+ ErrMsg.resize(R.Size - 1);
+ memcpy(&ErrMsg[0], Content + 1, R.Size - 1);
+ }
+ if (Large)
+ free(R.Data.ValuePtr);
+ } else if (R.Data.ValuePtr) {
+ HasError = true;
+ ErrMsg = R.Data.ValuePtr;
+ free(R.Data.ValuePtr);
+ }
+
+ if (HasError)
+ return make_error<StringError>(std::move(ErrMsg), inconvertibleErrorCode());
+ return Error::success();
+}
+} // namespace
+
namespace llvm {
namespace jitlink {
@@ -20,17 +64,11 @@ JITLinkMemoryManager::~JITLinkMemoryManager() = default;
JITLinkMemoryManager::InFlightAlloc::~InFlightAlloc() = default;
static Error runAllocAction(JITLinkMemoryManager::AllocActionCall &C) {
- using DeallocFnTy = char *(*)(const void *, size_t);
- auto *Fn = jitTargetAddressToPointer<DeallocFnTy>(C.FnAddr);
-
- if (char *ErrMsg = Fn(jitTargetAddressToPointer<const void *>(C.CtxAddr),
- static_cast<size_t>(C.CtxSize))) {
- auto E = make_error<StringError>(ErrMsg, inconvertibleErrorCode());
- free(ErrMsg);
- return E;
- }
+ using WrapperFnTy = CWrapperFunctionResult (*)(const void *, size_t);
+ auto *Fn = jitTargetAddressToPointer<WrapperFnTy>(C.FnAddr);
- return Error::success();
+ return toError(Fn(jitTargetAddressToPointer<const void *>(C.CtxAddr),
+ static_cast<size_t>(C.CtxSize)));
}
// Align a JITTargetAddress to conform with block alignment requirements.
More information about the llvm-commits
mailing list