@@ -116,101 +116,6 @@ std::unique_ptr<jitlink::LinkGraph> createPlatformGraph(MachOPlatform &MOP,
116
116
jitlink::getGenericEdgeKindName);
117
117
}
118
118
119
- // Generates a MachO header.
120
- class MachOHeaderMaterializationUnit : public MaterializationUnit {
121
- public:
122
- MachOHeaderMaterializationUnit (MachOPlatform &MOP,
123
- SymbolStringPtr HeaderStartSymbol)
124
- : MaterializationUnit(
125
- createHeaderInterface (MOP, std::move(HeaderStartSymbol))),
126
- MOP(MOP) {}
127
-
128
- StringRef getName () const override { return " MachOHeaderMU" ; }
129
-
130
- void materialize (std::unique_ptr<MaterializationResponsibility> R) override {
131
- auto G = createPlatformGraph (MOP, " <MachOHeaderMU>" );
132
- addMachOHeader (*G, MOP, R->getInitializerSymbol ());
133
- MOP.getObjectLinkingLayer ().emit (std::move (R), std::move (G));
134
- }
135
-
136
- void discard (const JITDylib &JD, const SymbolStringPtr &Sym) override {}
137
-
138
- static void addMachOHeader (jitlink::LinkGraph &G, MachOPlatform &MOP,
139
- const SymbolStringPtr &InitializerSymbol) {
140
- auto &HeaderSection = G.createSection (" __header" , MemProt::Read);
141
- auto &HeaderBlock = createHeaderBlock (G, HeaderSection);
142
-
143
- // Init symbol is header-start symbol.
144
- G.addDefinedSymbol (HeaderBlock, 0 , *InitializerSymbol,
145
- HeaderBlock.getSize (), jitlink::Linkage::Strong,
146
- jitlink::Scope::Default, false , true );
147
- for (auto &HS : AdditionalHeaderSymbols)
148
- G.addDefinedSymbol (HeaderBlock, HS.Offset , HS.Name , HeaderBlock.getSize (),
149
- jitlink::Linkage::Strong, jitlink::Scope::Default,
150
- false , true );
151
- }
152
-
153
- private:
154
- struct HeaderSymbol {
155
- const char *Name;
156
- uint64_t Offset;
157
- };
158
-
159
- static constexpr HeaderSymbol AdditionalHeaderSymbols[] = {
160
- {" ___mh_executable_header" , 0 }};
161
-
162
- static jitlink::Block &createHeaderBlock (jitlink::LinkGraph &G,
163
- jitlink::Section &HeaderSection) {
164
- MachO::mach_header_64 Hdr;
165
- Hdr.magic = MachO::MH_MAGIC_64;
166
- switch (G.getTargetTriple ().getArch ()) {
167
- case Triple::aarch64:
168
- Hdr.cputype = MachO::CPU_TYPE_ARM64;
169
- Hdr.cpusubtype = MachO::CPU_SUBTYPE_ARM64_ALL;
170
- break ;
171
- case Triple::x86_64:
172
- Hdr.cputype = MachO::CPU_TYPE_X86_64;
173
- Hdr.cpusubtype = MachO::CPU_SUBTYPE_X86_64_ALL;
174
- break ;
175
- default :
176
- llvm_unreachable (" Unrecognized architecture" );
177
- }
178
- Hdr.filetype = MachO::MH_DYLIB; // Custom file type?
179
- Hdr.ncmds = 0 ;
180
- Hdr.sizeofcmds = 0 ;
181
- Hdr.flags = 0 ;
182
- Hdr.reserved = 0 ;
183
-
184
- if (G.getEndianness () != llvm::endianness::native)
185
- MachO::swapStruct (Hdr);
186
-
187
- auto HeaderContent = G.allocateContent (
188
- ArrayRef<char >(reinterpret_cast <const char *>(&Hdr), sizeof (Hdr)));
189
-
190
- return G.createContentBlock (HeaderSection, HeaderContent, ExecutorAddr (), 8 ,
191
- 0 );
192
- }
193
-
194
- static MaterializationUnit::Interface
195
- createHeaderInterface (MachOPlatform &MOP,
196
- const SymbolStringPtr &HeaderStartSymbol) {
197
- SymbolFlagsMap HeaderSymbolFlags;
198
-
199
- HeaderSymbolFlags[HeaderStartSymbol] = JITSymbolFlags::Exported;
200
- for (auto &HS : AdditionalHeaderSymbols)
201
- HeaderSymbolFlags[MOP.getExecutionSession ().intern (HS.Name )] =
202
- JITSymbolFlags::Exported;
203
-
204
- return MaterializationUnit::Interface (std::move (HeaderSymbolFlags),
205
- HeaderStartSymbol);
206
- }
207
-
208
- MachOPlatform &MOP;
209
- };
210
-
211
- constexpr MachOHeaderMaterializationUnit::HeaderSymbol
212
- MachOHeaderMaterializationUnit::AdditionalHeaderSymbols[];
213
-
214
119
// Creates a Bootstrap-Complete LinkGraph to run deferred actions.
215
120
class MachOPlatformCompleteBootstrapMaterializationUnit
216
121
: public MaterializationUnit {
@@ -350,12 +255,6 @@ struct ObjCImageInfoFlags {
350
255
namespace llvm {
351
256
namespace orc {
352
257
353
- std::unique_ptr<MaterializationUnit>
354
- MachOPlatform::defaultMachOHeaderBuilder (MachOPlatform &MOP) {
355
- return std::make_unique<MachOHeaderMaterializationUnit>(
356
- MOP, SymbolStringPtr (MOP.getMachOHeaderStartSymbol ()));
357
- }
358
-
359
258
Expected<std::unique_ptr<MachOPlatform>>
360
259
MachOPlatform::Create (ExecutionSession &ES, ObjectLinkingLayer &ObjLinkingLayer,
361
260
JITDylib &PlatformJD,
@@ -598,8 +497,7 @@ MachOPlatform::MachOPlatform(
598
497
// the support methods callable. The bootstrap is now complete.
599
498
600
499
// Step (1) Add header materialization unit and request.
601
- if ((Err = PlatformJD.define (std::make_unique<MachOHeaderMaterializationUnit>(
602
- *this , MachOHeaderStartSymbol))))
500
+ if ((Err = PlatformJD.define (this ->BuildMachOHeaderMU (*this ))))
603
501
return ;
604
502
if ((Err = ES.lookup (&PlatformJD, MachOHeaderStartSymbol).takeError ()))
605
503
return ;
@@ -1767,5 +1665,97 @@ Error MachOPlatform::MachOPlatformPlugin::addSymbolTableRegistration(
1767
1665
1768
1666
return Error::success ();
1769
1667
}
1668
+
1669
+ template <typename MachOTraits>
1670
+ jitlink::Block &createTrivialHeaderBlock (MachOPlatform &MOP,
1671
+ jitlink::LinkGraph &G,
1672
+ jitlink::Section &HeaderSection) {
1673
+ auto HdrInfo =
1674
+ getMachOHeaderInfoFromTriple (MOP.getExecutionSession ().getTargetTriple ());
1675
+ MachOBuilder<MachOTraits> B (HdrInfo.PageSize );
1676
+
1677
+ B.Header .filetype = MachO::MH_DYLIB;
1678
+ B.Header .cputype = HdrInfo.CPUType ;
1679
+ B.Header .cpusubtype = HdrInfo.CPUSubType ;
1680
+
1681
+ auto HeaderContent = G.allocateBuffer (B.layout ());
1682
+ B.write (HeaderContent);
1683
+
1684
+ return G.createContentBlock (HeaderSection, HeaderContent, ExecutorAddr (), 8 ,
1685
+ 0 );
1686
+ }
1687
+
1688
+ SimpleMachOHeaderMU::SimpleMachOHeaderMU (MachOPlatform &MOP,
1689
+ SymbolStringPtr HeaderStartSymbol)
1690
+ : MaterializationUnit(
1691
+ createHeaderInterface (MOP, std::move(HeaderStartSymbol))),
1692
+ MOP(MOP) {}
1693
+
1694
+ void SimpleMachOHeaderMU::materialize (
1695
+ std::unique_ptr<MaterializationResponsibility> R) {
1696
+ auto G = createPlatformGraph (MOP, " <MachOHeaderMU>" );
1697
+ addMachOHeader (R->getTargetJITDylib (), *G, R->getInitializerSymbol ());
1698
+ MOP.getObjectLinkingLayer ().emit (std::move (R), std::move (G));
1699
+ }
1700
+
1701
+ void SimpleMachOHeaderMU::discard (const JITDylib &JD,
1702
+ const SymbolStringPtr &Sym) {}
1703
+
1704
+ void SimpleMachOHeaderMU::addMachOHeader (
1705
+ JITDylib &JD, jitlink::LinkGraph &G,
1706
+ const SymbolStringPtr &InitializerSymbol) {
1707
+ auto &HeaderSection = G.createSection (" __header" , MemProt::Read);
1708
+ auto &HeaderBlock = createHeaderBlock (JD, G, HeaderSection);
1709
+
1710
+ // Init symbol is header-start symbol.
1711
+ G.addDefinedSymbol (HeaderBlock, 0 , *InitializerSymbol, HeaderBlock.getSize (),
1712
+ jitlink::Linkage::Strong, jitlink::Scope::Default, false ,
1713
+ true );
1714
+ for (auto &HS : AdditionalHeaderSymbols)
1715
+ G.addDefinedSymbol (HeaderBlock, HS.Offset , HS.Name , HeaderBlock.getSize (),
1716
+ jitlink::Linkage::Strong, jitlink::Scope::Default, false ,
1717
+ true );
1718
+ }
1719
+
1720
+ jitlink::Block &
1721
+ SimpleMachOHeaderMU::createHeaderBlock (JITDylib &JD, jitlink::LinkGraph &G,
1722
+ jitlink::Section &HeaderSection) {
1723
+ switch (MOP.getExecutionSession ().getTargetTriple ().getArch ()) {
1724
+ case Triple::aarch64:
1725
+ case Triple::x86_64:
1726
+ return createTrivialHeaderBlock<MachO64LE>(MOP, G, HeaderSection);
1727
+ default :
1728
+ llvm_unreachable (" Unsupported architecture" );
1729
+ }
1730
+ }
1731
+
1732
+ MaterializationUnit::Interface SimpleMachOHeaderMU::createHeaderInterface (
1733
+ MachOPlatform &MOP, const SymbolStringPtr &HeaderStartSymbol) {
1734
+ SymbolFlagsMap HeaderSymbolFlags;
1735
+
1736
+ HeaderSymbolFlags[HeaderStartSymbol] = JITSymbolFlags::Exported;
1737
+ for (auto &HS : AdditionalHeaderSymbols)
1738
+ HeaderSymbolFlags[MOP.getExecutionSession ().intern (HS.Name )] =
1739
+ JITSymbolFlags::Exported;
1740
+
1741
+ return MaterializationUnit::Interface (std::move (HeaderSymbolFlags),
1742
+ HeaderStartSymbol);
1743
+ }
1744
+
1745
+ MachOHeaderInfo getMachOHeaderInfoFromTriple (const Triple &TT) {
1746
+ switch (TT.getArch ()) {
1747
+ case Triple::aarch64:
1748
+ return {/* PageSize = */ 16 * 1024 ,
1749
+ /* CPUType = */ MachO::CPU_TYPE_ARM64,
1750
+ /* CPUSubType = */ MachO::CPU_SUBTYPE_ARM64_ALL};
1751
+ case Triple::x86_64:
1752
+ return {/* PageSize = */ 4 * 1024 ,
1753
+ /* CPUType = */ MachO::CPU_TYPE_X86_64,
1754
+ /* CPUSubType = */ MachO::CPU_SUBTYPE_X86_64_ALL};
1755
+ default :
1756
+ llvm_unreachable (" Unrecognized architecture" );
1757
+ }
1758
+ }
1759
+
1770
1760
} // End namespace orc.
1771
1761
} // End namespace llvm.
0 commit comments