mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-30 15:10:33 +00:00
[ThinLTO] Do not assert when adding a module with a different but
compatible target triple Currently, an assertion fails in ThinLTOCodeGenerator::addModule when the target triple of the module being added doesn't match that of the one stored in TMBuilder. This patch relaxes the constraint and makes changes to allow target triples that only differ in their version numbers on Apple platforms, similarly to what r228999 did. rdar://problem/30133904 Differential Revision: https://reviews.llvm.org/D33291 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@303326 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
695aa32d5a
commit
343e535d9c
@ -252,6 +252,10 @@ public:
|
|||||||
ObjectFormat == Other.ObjectFormat;
|
ObjectFormat == Other.ObjectFormat;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool operator!=(const Triple &Other) const {
|
||||||
|
return !(*this == Other);
|
||||||
|
}
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
/// @name Normalization
|
/// @name Normalization
|
||||||
/// @{
|
/// @{
|
||||||
@ -722,6 +726,12 @@ public:
|
|||||||
/// \returns true if the triple is little endian, false otherwise.
|
/// \returns true if the triple is little endian, false otherwise.
|
||||||
bool isLittleEndian() const;
|
bool isLittleEndian() const;
|
||||||
|
|
||||||
|
/// Test whether target triples are compatible.
|
||||||
|
bool isCompatibleWith(const Triple &Other) const;
|
||||||
|
|
||||||
|
/// Merge target triples.
|
||||||
|
std::string merge(const Triple &Other) const;
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
/// @name Static helpers for IDs.
|
/// @name Static helpers for IDs.
|
||||||
/// @{
|
/// @{
|
||||||
|
@ -505,29 +505,25 @@ static void initTMBuilder(TargetMachineBuilder &TMBuilder,
|
|||||||
|
|
||||||
void ThinLTOCodeGenerator::addModule(StringRef Identifier, StringRef Data) {
|
void ThinLTOCodeGenerator::addModule(StringRef Identifier, StringRef Data) {
|
||||||
ThinLTOBuffer Buffer(Data, Identifier);
|
ThinLTOBuffer Buffer(Data, Identifier);
|
||||||
if (Modules.empty()) {
|
LLVMContext Context;
|
||||||
// First module added, so initialize the triple and some options
|
StringRef TripleStr;
|
||||||
LLVMContext Context;
|
ErrorOr<std::string> TripleOrErr = expectedToErrorOrAndEmitErrors(
|
||||||
StringRef TripleStr;
|
Context, getBitcodeTargetTriple(Buffer.getMemBuffer()));
|
||||||
ErrorOr<std::string> TripleOrErr = expectedToErrorOrAndEmitErrors(
|
|
||||||
Context, getBitcodeTargetTriple(Buffer.getMemBuffer()));
|
if (TripleOrErr)
|
||||||
if (TripleOrErr)
|
TripleStr = *TripleOrErr;
|
||||||
TripleStr = *TripleOrErr;
|
|
||||||
Triple TheTriple(TripleStr);
|
Triple TheTriple(TripleStr);
|
||||||
|
|
||||||
|
if (Modules.empty())
|
||||||
initTMBuilder(TMBuilder, Triple(TheTriple));
|
initTMBuilder(TMBuilder, Triple(TheTriple));
|
||||||
|
else if (TMBuilder.TheTriple != TheTriple) {
|
||||||
|
if (!TMBuilder.TheTriple.isCompatibleWith(TheTriple))
|
||||||
|
report_fatal_error("ThinLTO modules with incompatible triples not "
|
||||||
|
"supported");
|
||||||
|
initTMBuilder(TMBuilder, Triple(TMBuilder.TheTriple.merge(TheTriple)));
|
||||||
}
|
}
|
||||||
#ifndef NDEBUG
|
|
||||||
else {
|
|
||||||
LLVMContext Context;
|
|
||||||
StringRef TripleStr;
|
|
||||||
ErrorOr<std::string> TripleOrErr = expectedToErrorOrAndEmitErrors(
|
|
||||||
Context, getBitcodeTargetTriple(Buffer.getMemBuffer()));
|
|
||||||
if (TripleOrErr)
|
|
||||||
TripleStr = *TripleOrErr;
|
|
||||||
assert(TMBuilder.TheTriple.str() == TripleStr &&
|
|
||||||
"ThinLTO modules with different triple not supported");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
Modules.push_back(Buffer);
|
Modules.push_back(Buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1243,27 +1243,6 @@ Error IRLinker::linkModuleFlagsMetadata() {
|
|||||||
return Error::success();
|
return Error::success();
|
||||||
}
|
}
|
||||||
|
|
||||||
// This function returns true if the triples match.
|
|
||||||
static bool triplesMatch(const Triple &T0, const Triple &T1) {
|
|
||||||
// If vendor is apple, ignore the version number.
|
|
||||||
if (T0.getVendor() == Triple::Apple)
|
|
||||||
return T0.getArch() == T1.getArch() && T0.getSubArch() == T1.getSubArch() &&
|
|
||||||
T0.getVendor() == T1.getVendor() && T0.getOS() == T1.getOS();
|
|
||||||
|
|
||||||
return T0 == T1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// This function returns the merged triple.
|
|
||||||
static std::string mergeTriples(const Triple &SrcTriple,
|
|
||||||
const Triple &DstTriple) {
|
|
||||||
// If vendor is apple, pick the triple with the larger version number.
|
|
||||||
if (SrcTriple.getVendor() == Triple::Apple)
|
|
||||||
if (DstTriple.isOSVersionLT(SrcTriple))
|
|
||||||
return SrcTriple.str();
|
|
||||||
|
|
||||||
return DstTriple.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
Error IRLinker::run() {
|
Error IRLinker::run() {
|
||||||
// Ensure metadata materialized before value mapping.
|
// Ensure metadata materialized before value mapping.
|
||||||
if (SrcM->getMaterializer())
|
if (SrcM->getMaterializer())
|
||||||
@ -1289,14 +1268,15 @@ Error IRLinker::run() {
|
|||||||
|
|
||||||
Triple SrcTriple(SrcM->getTargetTriple()), DstTriple(DstM.getTargetTriple());
|
Triple SrcTriple(SrcM->getTargetTriple()), DstTriple(DstM.getTargetTriple());
|
||||||
|
|
||||||
if (!SrcM->getTargetTriple().empty() && !triplesMatch(SrcTriple, DstTriple))
|
if (!SrcM->getTargetTriple().empty()&&
|
||||||
|
!SrcTriple.isCompatibleWith(DstTriple))
|
||||||
emitWarning("Linking two modules of different target triples: " +
|
emitWarning("Linking two modules of different target triples: " +
|
||||||
SrcM->getModuleIdentifier() + "' is '" +
|
SrcM->getModuleIdentifier() + "' is '" +
|
||||||
SrcM->getTargetTriple() + "' whereas '" +
|
SrcM->getTargetTriple() + "' whereas '" +
|
||||||
DstM.getModuleIdentifier() + "' is '" + DstM.getTargetTriple() +
|
DstM.getModuleIdentifier() + "' is '" + DstM.getTargetTriple() +
|
||||||
"'\n");
|
"'\n");
|
||||||
|
|
||||||
DstM.setTargetTriple(mergeTriples(SrcTriple, DstTriple));
|
DstM.setTargetTriple(SrcTriple.merge(DstTriple));
|
||||||
|
|
||||||
// Append the module inline asm string.
|
// Append the module inline asm string.
|
||||||
if (!IsPerformingImport && !SrcM->getModuleInlineAsm().empty()) {
|
if (!IsPerformingImport && !SrcM->getModuleInlineAsm().empty()) {
|
||||||
|
@ -1472,6 +1472,24 @@ bool Triple::isLittleEndian() const {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Triple::isCompatibleWith(const Triple &Other) const {
|
||||||
|
// If vendor is apple, ignore the version number.
|
||||||
|
if (getVendor() == Triple::Apple)
|
||||||
|
return getArch() == Other.getArch() && getSubArch() == Other.getSubArch() &&
|
||||||
|
getVendor() == Other.getVendor() && getOS() == Other.getOS();
|
||||||
|
|
||||||
|
return *this == Other;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string Triple::merge(const Triple &Other) const {
|
||||||
|
// If vendor is apple, pick the triple with the larger version number.
|
||||||
|
if (getVendor() == Triple::Apple)
|
||||||
|
if (Other.isOSVersionLT(*this))
|
||||||
|
return str();
|
||||||
|
|
||||||
|
return Other.str();
|
||||||
|
}
|
||||||
|
|
||||||
StringRef Triple::getARMCPUForArch(StringRef MArch) const {
|
StringRef Triple::getARMCPUForArch(StringRef MArch) const {
|
||||||
if (MArch.empty())
|
if (MArch.empty())
|
||||||
MArch = getArchName();
|
MArch = getArchName();
|
||||||
|
1
test/ThinLTO/X86/Inputs/merge-triple.ll
Normal file
1
test/ThinLTO/X86/Inputs/merge-triple.ll
Normal file
@ -0,0 +1 @@
|
|||||||
|
target triple = "x86_64-apple-macosx10.11.0"
|
10
test/ThinLTO/X86/merge-triple.ll
Normal file
10
test/ThinLTO/X86/merge-triple.ll
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
; RUN: opt -module-summary %s -o %t1.bc
|
||||||
|
; RUN: opt -module-summary %p/Inputs/merge-triple.ll -o %t2.bc
|
||||||
|
; RUN: llvm-lto -thinlto-action=optimize %t1.bc %t2.bc
|
||||||
|
; RUN: llvm-dis < %t1.bc.thinlto.imported.bc | FileCheck %s --check-prefix=CHECK1
|
||||||
|
; RUN: llvm-dis < %t2.bc.thinlto.imported.bc | FileCheck %s --check-prefix=CHECK2
|
||||||
|
|
||||||
|
target triple = "x86_64-apple-macosx10.12.0"
|
||||||
|
|
||||||
|
; CHECK1: target triple = "x86_64-apple-macosx10.12.0"
|
||||||
|
; CHECK2: target triple = "x86_64-apple-macosx10.11.0"
|
Loading…
Reference in New Issue
Block a user