1 //===--------- SectCreate.cpp - Emulate ld64's -sectcreate option ---------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "llvm/ExecutionEngine/Orc/SectCreate.h"
11 #define DEBUG_TYPE "orc"
13 using namespace llvm::jitlink
;
17 void SectCreateMaterializationUnit::materialize(
18 std::unique_ptr
<MaterializationResponsibility
> R
) {
19 auto G
= std::make_unique
<LinkGraph
>(
20 "orc_sectcreate_" + SectName
,
21 ObjLinkingLayer
.getExecutionSession().getTargetTriple(),
22 getGenericEdgeKindName
);
24 auto &Sect
= G
->createSection(SectName
, MP
);
25 auto Content
= G
->allocateContent(
26 ArrayRef
<char>(Data
->getBuffer().data(), Data
->getBuffer().size()));
27 auto &B
= G
->createContentBlock(Sect
, Content
, ExecutorAddr(), Alignment
, 0);
29 for (auto &[Name
, Info
] : ExtraSymbols
) {
30 auto L
= Info
.Flags
.isStrong() ? Linkage::Strong
: Linkage::Weak
;
31 auto S
= Info
.Flags
.isExported() ? Scope::Default
: Scope::Hidden
;
32 G
->addDefinedSymbol(B
, Info
.Offset
, *Name
, 0, L
, S
, Info
.Flags
.isCallable(),
36 ObjLinkingLayer
.emit(std::move(R
), std::move(G
));
39 void SectCreateMaterializationUnit::discard(const JITDylib
&JD
,
40 const SymbolStringPtr
&Name
) {
41 ExtraSymbols
.erase(Name
);
44 MaterializationUnit::Interface
SectCreateMaterializationUnit::getInterface(
45 const ExtraSymbolsMap
&ExtraSymbols
) {
46 SymbolFlagsMap SymbolFlags
;
47 for (auto &[Name
, Info
] : ExtraSymbols
)
48 SymbolFlags
[Name
] = Info
.Flags
;
49 return {std::move(SymbolFlags
), nullptr};
52 } // End namespace llvm::orc.