19#define DEBUG_TYPE "orc"
26 assert(!
I.InitSymbol &&
"I already has an init symbol");
30 std::string InitSymString;
32 <<
"$." << ObjFileName <<
".__inits." << Counter++;
33 I.InitSymbol = ES.
intern(InitSymString);
34 }
while (
I.SymbolFlags.count(
I.InitSymbol));
44 for (
auto &Sym : Obj.symbols()) {
59 if (
auto SymType = Sym.getType()) {
63 return SymType.takeError();
65 auto Name = Sym.getName();
67 return Name.takeError();
70 return SymFlags.takeError();
73 if (Name->starts_with(
"l"))
76 I.SymbolFlags[ES.
intern(*Name)] = std::move(*SymFlags);
79 for (
auto &Sec : Obj.sections()) {
80 auto SecType = Obj.getSectionType(Sec);
85 auto SegName = Obj.getSectionFinalSegmentName(Sec.getRawDataRefImpl());
86 auto SecName =
cantFail(Obj.getSectionName(Sec.getRawDataRefImpl()));
101 for (
auto &Sym : Obj.symbols()) {
116 if (
auto SymType = Sym.getType()) {
120 return SymType.takeError();
122 auto Name = Sym.getName();
124 return Name.takeError();
128 return SymFlags.takeError();
134 I.SymbolFlags[ES.
intern(std::move(*Name))] = std::move(*SymFlags);
137 for (
auto &Sec : Obj.sections()) {
138 if (
auto SecName = Sec.getName()) {
153 std::vector<std::optional<object::coff_aux_section_definition>> ComdatDefs(
154 Obj.getNumberOfSections() + 1);
155 for (
auto &Sym : Obj.symbols()) {
162 auto COFFSym = Obj.getCOFFSymbol(Sym);
164 if (
auto *Def = COFFSym.getSectionDefinition()) {
165 auto Sec = Obj.getSection(COFFSym.getSectionNumber());
167 return Sec.takeError();
170 ComdatDefs[COFFSym.getSectionNumber()] = *Def;
175 ComdatDefs[COFFSym.getSectionNumber()]) {
176 auto Def = ComdatDefs[COFFSym.getSectionNumber()];
180 ComdatDefs[COFFSym.getSectionNumber()] = std::nullopt;
192 if (
auto SymType = Sym.getType()) {
196 return SymType.takeError();
198 auto Name = Sym.getName();
200 return Name.takeError();
204 return SymFlags.takeError();
208 if (COFFSym.isWeakExternal())
214 I.SymbolFlags[ES.
intern(*Name)] = std::move(*SymFlags);
217 for (
auto &Sec : Obj.sections()) {
218 if (
auto SecName = Sec.getName()) {
224 return SecName.takeError();
236 for (
auto &Sym : Obj.symbols()) {
255 auto Name = Sym.getName();
257 return Name.takeError();
260 return SymFlags.takeError();
270 I.SymbolFlags[ES.
intern(std::move(*Name))] = std::move(*SymFlags);
281 for (
auto &Sym : Obj.symbols()) {
296 if (
auto SymType = Sym.getType()) {
300 return SymType.takeError();
302 auto Name = Sym.getName();
304 return Name.takeError();
308 return SymFlags.takeError();
310 I.SymbolFlags[ES.
intern(*Name)] = std::move(*SymFlags);
321 return Obj.takeError();
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
Tagged union holding either a T or a Error.
Error takeError()
Take ownership of the stored error.
Flags for symbols in the JIT.
static LLVM_ABI Expected< JITSymbolFlags > fromObjectSymbol(const object::SymbolRef &Symbol)
Construct a JITSymbolFlags value based on the flags of the given libobject symbol.
@ MaterializationSideEffectsOnly
Represent a constant reference to a string, i.e.
This class is the base class for all object file types.
static Expected< OwningBinary< ObjectFile > > createObjectFile(StringRef ObjectPath)
An ExecutionSession represents a running JIT program.
SymbolStringPtr intern(StringRef SymName)
Add a symbol name to the SymbolStringPool and return a pointer to it.
A raw_ostream that writes to an std::string.
@ IMAGE_COMDAT_SELECT_NODUPLICATES
@ IMAGE_COMDAT_SELECT_ASSOCIATIVE
bool isReservedSectionNumber(int32_t SectionNumber)
@ S_MOD_INIT_FUNC_POINTERS
S_MOD_INIT_FUNC_POINTERS - Section with only function pointers for initialization.
LLVM_ABI void addInitSymbol(MaterializationUnit::Interface &I, ExecutionSession &ES, StringRef ObjFileName)
Adds an initializer symbol to the given MU interface.
static Expected< MaterializationUnit::Interface > getMachOObjectFileSymbolInfo(ExecutionSession &ES, const object::MachOObjectFile &Obj)
Expected< MaterializationUnit::Interface > getGenericObjectFileSymbolInfo(ExecutionSession &ES, const object::ObjectFile &Obj)
static Expected< MaterializationUnit::Interface > getELFObjectFileSymbolInfo(ExecutionSession &ES, const object::ELFObjectFileBase &Obj)
Expected< MaterializationUnit::Interface > getXCOFFObjectFileSymbolInfo(ExecutionSession &ES, const object::ObjectFile &Obj)
LLVM_ABI bool isMachOInitializerSection(StringRef SegName, StringRef SecName)
LLVM_ABI Expected< MaterializationUnit::Interface > getObjectFileInterface(ExecutionSession &ES, MemoryBufferRef ObjBuffer)
Returns a MaterializationUnit::Interface for the object file contained in the given buffer,...
LLVM_ABI bool isCOFFInitializerSection(StringRef Name)
static Expected< MaterializationUnit::Interface > getCOFFObjectFileSymbolInfo(ExecutionSession &ES, const object::COFFObjectFile &Obj)
LLVM_ABI bool isELFInitializerSection(StringRef SecName)
This is an optimization pass for GlobalISel generic memory operations.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
void cantFail(Error Err, const char *Msg=nullptr)
Report a fatal error if Err is a failure value.