LLVM: lib/ExecutionEngine/Orc/ObjectFileInterface.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

17#include

18

19#define DEBUG_TYPE "orc"

20

21namespace llvm {

22namespace orc {

23

26 assert(I.InitSymbol && "I already has an init symbol");

27 size_t Counter = 0;

28

29 do {

30 std::string InitSymString;

32 << "$." << ObjFileName << ".__inits." << Counter++;

33 I.InitSymbol = ES.intern(InitSymString);

34 } while (I.SymbolFlags.count(I.InitSymbol));

35

37}

38

43

44 for (auto &Sym : Obj.symbols()) {

46 if (!SymFlagsOrErr)

47

49

50

52 continue;

53

54

56 continue;

57

58

59 if (auto SymType = Sym.getType()) {

61 continue;

62 } else

63 return SymType.takeError();

64

65 auto Name = Sym.getName();

66 if (!Name)

67 return Name.takeError();

69 if (!SymFlags)

70 return SymFlags.takeError();

71

72

73 if (Name->starts_with("l"))

75

76 I.SymbolFlags[ES.intern(*Name)] = std::move(*SymFlags);

77 }

78

79 for (auto &Sec : Obj.sections()) {

80 auto SecType = Obj.getSectionType(Sec);

83 break;

84 }

85 auto SegName = Obj.getSectionFinalSegmentName(Sec.getRawDataRefImpl());

86 auto SecName = cantFail(Obj.getSectionName(Sec.getRawDataRefImpl()));

89 break;

90 }

91 }

92

93 return I;

94}

95

100

101 for (auto &Sym : Obj.symbols()) {

103 if (!SymFlagsOrErr)

104

105 return SymFlagsOrErr.takeError();

106

107

109 continue;

110

111

113 continue;

114

115

116 if (auto SymType = Sym.getType()) {

118 continue;

119 } else

120 return SymType.takeError();

121

122 auto Name = Sym.getName();

123 if (!Name)

124 return Name.takeError();

125

127 if (!SymFlags)

128 return SymFlags.takeError();

129

130

133

134 I.SymbolFlags[ES.intern(std::move(*Name))] = std::move(*SymFlags);

135 }

136

138 for (auto &Sec : Obj.sections()) {

139 if (auto SecName = Sec.getName()) {

142 break;

143 }

144 }

145 }

146

147 return I;

148}

149

154 std::vector<std::optionalobject::coff\_aux\_section\_definition> ComdatDefs(

155 Obj.getNumberOfSections() + 1);

156 for (auto &Sym : Obj.symbols()) {

158 if (!SymFlagsOrErr)

159

160 return SymFlagsOrErr.takeError();

161

162

163 auto COFFSym = Obj.getCOFFSymbol(Sym);

164 bool IsWeak = false;

165 if (auto *Def = COFFSym.getSectionDefinition()) {

166 auto Sec = Obj.getSection(COFFSym.getSectionNumber());

167 if (!Sec)

168 return Sec.takeError();

171 ComdatDefs[COFFSym.getSectionNumber()] = *Def;

172 continue;

173 }

174 }

176 ComdatDefs[COFFSym.getSectionNumber()]) {

177 auto Def = ComdatDefs[COFFSym.getSectionNumber()];

179 IsWeak = true;

180 }

181 ComdatDefs[COFFSym.getSectionNumber()] = std::nullopt;

182 } else {

183

185 continue;

186 }

187

188

190 continue;

191

192

193 if (auto SymType = Sym.getType()) {

195 continue;

196 } else

197 return SymType.takeError();

198

199 auto Name = Sym.getName();

200 if (!Name)

201 return Name.takeError();

202

204 if (!SymFlags)

205 return SymFlags.takeError();

207

208

209 if (COFFSym.isWeakExternal())

211

212 if (IsWeak)

214

215 I.SymbolFlags[ES.intern(*Name)] = std::move(*SymFlags);

216 }

217

219 for (auto &Sec : Obj.sections()) {

220 if (auto SecName = Sec.getName()) {

223 break;

224 }

225 } else

226 return SecName.takeError();

227 }

228

229 return I;

230}

231

235

237

238 for (auto &Sym : Obj.symbols()) {

240 if (!SymFlagsOrErr)

241 return SymFlagsOrErr.takeError();

242 uint32_t Flags = *SymFlagsOrErr;

243

244

246 continue;

248 continue;

249

253

255 continue;

256

257 auto Name = Sym.getName();

258 if (!Name)

259 return Name.takeError();

261 if (!SymFlags)

262 return SymFlags.takeError();

263

264

265

266

267

268

269

271

272 I.SymbolFlags[ES.intern(std::move(*Name))] = std::move(*SymFlags);

273 }

274

275 return I;

276}

277

282

283 for (auto &Sym : Obj.symbols()) {

285 if (!SymFlagsOrErr)

286

287 return SymFlagsOrErr.takeError();

288

289

291 continue;

292

293

295 continue;

296

297

298 if (auto SymType = Sym.getType()) {

300 continue;

301 } else

302 return SymType.takeError();

303

304 auto Name = Sym.getName();

305 if (!Name)

306 return Name.takeError();

307

309 if (!SymFlags)

310 return SymFlags.takeError();

311

312 I.SymbolFlags[ES.intern(*Name)] = std::move(*SymFlags);

313 }

314

315 return I;

316}

317

321

322 if (!Obj)

323 return Obj.takeError();

324

333

335}

336

337}

338}

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

StringRef - 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.

Pointer to a pooled string representing a symbol name.

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.

Definition ObjectFileInterface.cpp:24

static Expected< MaterializationUnit::Interface > getMachOObjectFileSymbolInfo(ExecutionSession &ES, const object::MachOObjectFile &Obj)

Definition ObjectFileInterface.cpp:40

Expected< MaterializationUnit::Interface > getGenericObjectFileSymbolInfo(ExecutionSession &ES, const object::ObjectFile &Obj)

Definition ObjectFileInterface.cpp:279

static Expected< MaterializationUnit::Interface > getELFObjectFileSymbolInfo(ExecutionSession &ES, const object::ELFObjectFileBase &Obj)

Definition ObjectFileInterface.cpp:97

Expected< MaterializationUnit::Interface > getXCOFFObjectFileSymbolInfo(ExecutionSession &ES, const object::ObjectFile &Obj)

Definition ObjectFileInterface.cpp:233

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,...

Definition ObjectFileInterface.cpp:319

LLVM_ABI bool isCOFFInitializerSection(StringRef Name)

static Expected< MaterializationUnit::Interface > getCOFFObjectFileSymbolInfo(ExecutionSession &ES, const object::COFFObjectFile &Obj)

Definition ObjectFileInterface.cpp:151

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 - 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.