std::error_code printSymbolName(raw_ostream &OS,
DataRefImpl Symb) const override;
uint32_t getSymbolFlags(DataRefImpl Symb) const override;
- const GlobalValue *getSymbolGV(DataRefImpl Symb) const;
+ GlobalValue *getSymbolGV(DataRefImpl Symb);
+ const GlobalValue *getSymbolGV(DataRefImpl Symb) const {
+ return const_cast<IRObjectFile *>(this)->getSymbolGV(Symb);
+ }
basic_symbol_iterator symbol_begin_impl() const override;
basic_symbol_iterator symbol_end_impl() const override;
Module &getModule() {
return *M;
}
+ std::unique_ptr<Module> takeModule() { return std::move(M); }
static inline bool classof(const Binary *v) {
return v->isIR();
return cast<GlobalObject>(&GV);
}
+static bool shouldSkip(uint32_t Symflags) {
+ if (!(Symflags & object::BasicSymbolRef::SF_Global))
+ return true;
+ if (Symflags & object::BasicSymbolRef::SF_FormatSpecific)
+ return true;
+ return false;
+}
+
/// Called by gold to see whether this file is one that our plugin can handle.
/// We'll try to open it and register all the symbols with add_symbol if
/// possible.
for (auto &Sym : Obj->symbols()) {
uint32_t Symflags = Sym.getFlags();
- if (!(Symflags & object::BasicSymbolRef::SF_Global))
- continue;
-
- if (Symflags & object::BasicSymbolRef::SF_FormatSpecific)
+ if (shouldSkip(Symflags))
continue;
cf.syms.push_back(ld_plugin_symbol());
if (get_view(F.handle, &View) != LDPS_OK)
message(LDPL_FATAL, "Failed to get a view of file");
- llvm::ErrorOr<MemoryBufferRef> MBOrErr =
- object::IRObjectFile::findBitcodeInMemBuffer(
- MemoryBufferRef(StringRef((const char *)View, File.filesize), ""));
- if (std::error_code EC = MBOrErr.getError())
+ MemoryBufferRef BufferRef(StringRef((const char *)View, File.filesize), "");
+ ErrorOr<std::unique_ptr<object::IRObjectFile>> ObjOrErr =
+ object::IRObjectFile::createIRObjectFile(BufferRef, Context);
+
+ if (std::error_code EC = ObjOrErr.getError())
message(LDPL_FATAL, "Could not read bitcode from file : %s",
EC.message().c_str());
- std::unique_ptr<MemoryBuffer> Buffer =
- MemoryBuffer::getMemBuffer(MBOrErr->getBuffer(), "", false);
-
if (release_input_file(F.handle) != LDPS_OK)
message(LDPL_FATAL, "Failed to release file information");
- ErrorOr<Module *> MOrErr = getLazyBitcodeModule(std::move(Buffer), Context);
-
- if (std::error_code EC = MOrErr.getError())
- message(LDPL_FATAL, "Could not read bitcode from file : %s",
- EC.message().c_str());
+ object::IRObjectFile &Obj = **ObjOrErr;
- std::unique_ptr<Module> M(MOrErr.get());
+ Module &M = Obj.getModule();
SmallPtrSet<GlobalValue *, 8> Used;
- collectUsedGlobalVariables(*M, Used, /*CompilerUsed*/ false);
+ collectUsedGlobalVariables(M, Used, /*CompilerUsed*/ false);
DenseSet<GlobalValue *> Drop;
std::vector<GlobalAlias *> KeptAliases;
- for (ld_plugin_symbol &Sym : F.syms) {
+
+ unsigned SymNum = 0;
+ for (auto &ObjSym : Obj.symbols()) {
+ if (shouldSkip(ObjSym.getFlags()))
+ continue;
+ ld_plugin_symbol &Sym = F.syms[SymNum];
+ ++SymNum;
+
ld_plugin_symbol_resolution Resolution =
(ld_plugin_symbol_resolution)Sym.resolution;
if (options::generate_api_file)
*ApiFile << Sym.name << ' ' << getResolutionName(Resolution) << '\n';
- GlobalValue *GV = M->getNamedValue(Sym.name);
+ GlobalValue *GV = Obj.getSymbolGV(ObjSym.getRawDataRefImpl());
if (!GV)
continue; // Asm symbol.
for (auto *GV : Drop)
drop(*GV);
- return M;
+ return Obj.takeModule();
}
static void runLTOPasses(Module &M, TargetMachine &TM) {