// FIXME: Re-enable the excluded target triples.
const clang::CompilerInstance *CI = Interp->getCompilerInstance();
const llvm::Triple &Triple = CI->getASTContext().getTargetInfo().getTriple();
- // FIXME: PPC fails due to `Symbols not found: [DW.ref.__gxx_personality_v0]`
- // The current understanding is that the JIT should emit this symbol if it was
- // not (eg. the way passing clang -fPIC does it).
- if (Triple.isPPC())
- return;
// FIXME: ARM fails due to `Not implemented relocation type!`
if (Triple.isARM())
Layer->setAutoClaimResponsibilityForObjectSymbols(true);
}
+ if (S.JTMB->getTargetTriple().isOSBinFormatELF() &&
+ (S.JTMB->getTargetTriple().getArch() == Triple::ArchType::ppc64 ||
+ S.JTMB->getTargetTriple().getArch() == Triple::ArchType::ppc64le))
+ Layer->setAutoClaimResponsibilityForObjectSymbols(true);
+
// FIXME: Explicit conversion to std::unique_ptr<ObjectLayer> added to silence
// errors from some GCC / libstdc++ bots. Remove this conversion (i.e.
// just return ObjLinkingLayer) once those bots are upgraded.
// filter these later.
auto InternalSymbols = std::make_shared<std::set<StringRef>>();
{
+ SymbolFlagsMap ExtraSymbolsToClaim;
for (auto &Sym : (*Obj)->symbols()) {
// Skip file symbols.
return;
}
+ // Try to claim responsibility of weak symbols
+ // if AutoClaimObjectSymbols flag is set.
+ if (AutoClaimObjectSymbols &&
+ (*SymFlagsOrErr & object::BasicSymbolRef::SF_Weak)) {
+ auto SymName = Sym.getName();
+ if (!SymName) {
+ ES.reportError(SymName.takeError());
+ R->failMaterialization();
+ return;
+ }
+
+ // Already included in responsibility set, skip it
+ SymbolStringPtr SymbolName = ES.intern(*SymName);
+ if (R->getSymbols().count(SymbolName))
+ continue;
+
+ auto SymFlags = JITSymbolFlags::fromObjectSymbol(Sym);
+ if (!SymFlags) {
+ ES.reportError(SymFlags.takeError());
+ R->failMaterialization();
+ return;
+ }
+
+ ExtraSymbolsToClaim[SymbolName] = *SymFlags;
+ continue;
+ }
+
// Don't include symbols that aren't global.
if (!(*SymFlagsOrErr & object::BasicSymbolRef::SF_Global)) {
if (auto SymName = Sym.getName())
}
}
}
+
+ if (!ExtraSymbolsToClaim.empty()) {
+ if (auto Err = R->defineMaterializing(ExtraSymbolsToClaim)) {
+ ES.reportError(std::move(Err));
+ R->failMaterialization();
+ }
+ }
}
auto MemMgr = GetMemoryManager();