Skip to content

Commit ab244b6

Browse files
lhamesbenlangmuir
authored andcommitted
[ORC] Specialize MachOBuilder support for the LC_ID_DYLIB command.
Provides a natural API for adding LC_ID_DYLIB commands, including the arbitrary install name.
1 parent b06bc7c commit ab244b6

File tree

1 file changed

+38
-4
lines changed

1 file changed

+38
-4
lines changed

llvm/include/llvm/ExecutionEngine/Orc/MachOBuilder.h

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,20 +43,20 @@ struct MachOBuilderLoadCommandBase {
4343
};
4444

4545
/// MachOBuilder load command wrapper type.
46-
template <MachO::LoadCommandType LCType> struct MachOBuilderLoadCommand;
46+
template <MachO::LoadCommandType LCType> struct MachOBuilderLoadCommandImplBase;
4747

4848
#define HANDLE_LOAD_COMMAND(Name, Value, LCStruct) \
4949
template <> \
50-
struct MachOBuilderLoadCommand<MachO::Name> \
50+
struct MachOBuilderLoadCommandImplBase<MachO::Name> \
5151
: public MachO::LCStruct, public MachOBuilderLoadCommandBase { \
5252
using CmdStruct = LCStruct; \
53-
MachOBuilderLoadCommand() { \
53+
MachOBuilderLoadCommandImplBase() { \
5454
memset(&rawStruct(), 0, sizeof(CmdStruct)); \
5555
cmd = Value; \
5656
cmdsize = sizeof(CmdStruct); \
5757
} \
5858
template <typename... ArgTs> \
59-
MachOBuilderLoadCommand(ArgTs &&...Args) \
59+
MachOBuilderLoadCommandImplBase(ArgTs &&...Args) \
6060
: CmdStruct{Value, sizeof(CmdStruct), std::forward<ArgTs>(Args)...} {} \
6161
CmdStruct &rawStruct() { return static_cast<CmdStruct &>(*this); } \
6262
size_t size() const override { return cmdsize; } \
@@ -70,6 +70,40 @@ template <MachO::LoadCommandType LCType> struct MachOBuilderLoadCommand;
7070

7171
#undef HANDLE_LOAD_COMMAND
7272

73+
template <MachO::LoadCommandType LCType>
74+
struct MachOBuilderLoadCommand
75+
: public MachOBuilderLoadCommandImplBase<LCType> {
76+
public:
77+
MachOBuilderLoadCommand() = default;
78+
79+
template <typename... ArgTs>
80+
MachOBuilderLoadCommand(ArgTs &&...Args)
81+
: MachOBuilderLoadCommand(std::forward<ArgTs>(Args)...) {}
82+
};
83+
84+
template <>
85+
struct MachOBuilderLoadCommand<MachO::LC_ID_DYLIB>
86+
: public MachOBuilderLoadCommandImplBase<MachO::LC_ID_DYLIB> {
87+
88+
MachOBuilderLoadCommand(std::string Name, uint32_t Timestamp,
89+
uint32_t CurrentVersion,
90+
uint32_t CompatibilityVersion)
91+
: MachOBuilderLoadCommandImplBase(
92+
MachO::dylib{24, Timestamp, CurrentVersion, CompatibilityVersion}),
93+
Name(std::move(Name)) {
94+
cmdsize += (this->Name.size() + 1 + 3) & ~0x3;
95+
}
96+
97+
size_t write(MutableArrayRef<char> Buf, size_t Offset,
98+
bool SwapStruct) override {
99+
Offset = writeMachOStruct(Buf, Offset, rawStruct(), SwapStruct);
100+
strcpy(Buf.data() + Offset, Name.data());
101+
return Offset + ((Name.size() + 1 + 3) & ~0x3);
102+
}
103+
104+
std::string Name;
105+
};
106+
73107
// Builds MachO objects.
74108
template <typename MachOTraits> class MachOBuilder {
75109
private:

0 commit comments

Comments
 (0)