Skip to content

Commit 4a12722

Browse files
committed
[ORC] Expose a non-destructive check-macho-buffer overload.
This allows clients to check buffers that they don't own. rdar://133536831
1 parent 7b4b85b commit 4a12722

File tree

2 files changed

+29
-15
lines changed

2 files changed

+29
-15
lines changed

llvm/include/llvm/ExecutionEngine/Orc/MachO.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,13 @@ namespace orc {
3131
/// given triple.
3232
/// ObjIsSlice should be set to true if Obj is a slice of a universal binary
3333
/// (that fact will then be reported in the error messages).
34+
Error checkMachORelocatableObject(MemoryBufferRef Obj, const Triple &TT,
35+
bool ObjIsSlice);
36+
37+
/// Check that the given buffer contains a MachO object file compatible with the
38+
/// given triple.
39+
/// This convenience overload returns the buffer if it passes all checks,
40+
/// otherwise it returns an error.
3441
Expected<std::unique_ptr<MemoryBuffer>>
3542
checkMachORelocatableObject(std::unique_ptr<MemoryBuffer> Obj, const Triple &TT,
3643
bool ObjIsSlice);

llvm/lib/ExecutionEngine/Orc/MachO.cpp

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
namespace llvm {
1818
namespace orc {
1919

20-
static std::string objDesc(MemoryBuffer &Obj, const Triple &TT,
20+
static std::string objDesc(const MemoryBufferRef &Obj, const Triple &TT,
2121
bool ObjIsSlice) {
2222
std::string Desc;
2323
if (ObjIsSlice)
@@ -27,11 +27,10 @@ static std::string objDesc(MemoryBuffer &Obj, const Triple &TT,
2727
}
2828

2929
template <typename HeaderType>
30-
static Expected<std::unique_ptr<MemoryBuffer>>
31-
checkMachORelocatableObject(std::unique_ptr<MemoryBuffer> Obj,
32-
bool SwapEndianness, const Triple &TT,
33-
bool ObjIsSlice) {
34-
StringRef Data = Obj->getBuffer();
30+
static Error checkMachORelocatableObject(MemoryBufferRef Obj,
31+
bool SwapEndianness, const Triple &TT,
32+
bool ObjIsSlice) {
33+
StringRef Data = Obj.getBuffer();
3534

3635
HeaderType Hdr;
3736
memcpy(&Hdr, Data.data(), sizeof(HeaderType));
@@ -40,28 +39,27 @@ checkMachORelocatableObject(std::unique_ptr<MemoryBuffer> Obj,
4039
swapStruct(Hdr);
4140

4241
if (Hdr.filetype != MachO::MH_OBJECT)
43-
return make_error<StringError>(objDesc(*Obj, TT, ObjIsSlice) +
42+
return make_error<StringError>(objDesc(Obj, TT, ObjIsSlice) +
4443
" is not a MachO relocatable object",
4544
inconvertibleErrorCode());
4645

4746
auto ObjArch = object::MachOObjectFile::getArch(Hdr.cputype, Hdr.cpusubtype);
4847
if (ObjArch != TT.getArch())
4948
return make_error<StringError>(
50-
objDesc(*Obj, TT, ObjIsSlice) + Triple::getArchTypeName(ObjArch) +
49+
objDesc(Obj, TT, ObjIsSlice) + Triple::getArchTypeName(ObjArch) +
5150
", cannot be loaded into " + TT.str() + " process",
5251
inconvertibleErrorCode());
5352

54-
return std::move(Obj);
53+
return Error::success();
5554
}
5655

57-
Expected<std::unique_ptr<MemoryBuffer>>
58-
checkMachORelocatableObject(std::unique_ptr<MemoryBuffer> Obj, const Triple &TT,
59-
bool ObjIsSlice) {
60-
StringRef Data = Obj->getBuffer();
56+
Error checkMachORelocatableObject(MemoryBufferRef Obj, const Triple &TT,
57+
bool ObjIsSlice) {
58+
StringRef Data = Obj.getBuffer();
6159

6260
if (Data.size() < 4)
6361
return make_error<StringError>(
64-
objDesc(*Obj, TT, ObjIsSlice) +
62+
objDesc(Obj, TT, ObjIsSlice) +
6563
" is not a valid MachO relocatable object file (truncated header)",
6664
inconvertibleErrorCode());
6765

@@ -79,12 +77,21 @@ checkMachORelocatableObject(std::unique_ptr<MemoryBuffer> Obj, const Triple &TT,
7977
std::move(Obj), Magic == MachO::MH_CIGAM_64, TT, ObjIsSlice);
8078
default:
8179
return make_error<StringError>(
82-
objDesc(*Obj, TT, ObjIsSlice) +
80+
objDesc(Obj, TT, ObjIsSlice) +
8381
" is not a valid MachO relocatable object (bad magic value)",
8482
inconvertibleErrorCode());
8583
}
8684
}
8785

86+
Expected<std::unique_ptr<MemoryBuffer>>
87+
checkMachORelocatableObject(std::unique_ptr<MemoryBuffer> Obj, const Triple &TT,
88+
bool ObjIsSlice) {
89+
if (auto Err =
90+
checkMachORelocatableObject(Obj->getMemBufferRef(), TT, ObjIsSlice))
91+
return std::move(Err);
92+
return std::move(Obj);
93+
}
94+
8895
Expected<std::unique_ptr<MemoryBuffer>>
8996
loadMachORelocatableObject(StringRef Path, const Triple &TT,
9097
std::optional<StringRef> IdentifierOverride) {

0 commit comments

Comments
 (0)