forked from OSchip/llvm-project
Add support for ThinLTO plugin option thinlto-object-suffix-replace
Differential Revision: https://reviews.llvm.org/D46608 llvm-svn: 332527
This commit is contained in:
parent
f18009dbc6
commit
d2eb089a0e
|
@ -96,6 +96,7 @@ struct Configuration {
|
|||
llvm::StringRef Sysroot;
|
||||
llvm::StringRef ThinLTOCacheDir;
|
||||
llvm::StringRef ThinLTOIndexOnlyArg;
|
||||
std::pair<llvm::StringRef, llvm::StringRef> ThinLTOObjectSuffixReplace;
|
||||
std::pair<llvm::StringRef, llvm::StringRef> ThinLTOPrefixReplace;
|
||||
std::string Rpath;
|
||||
std::vector<VersionDefinition> VersionDefinitions;
|
||||
|
|
|
@ -813,6 +813,14 @@ void LinkerDriver::readConfigs(opt::InputArgList &Args) {
|
|||
if (Config->ThinLTOPrefixReplace.second.empty())
|
||||
error("thinlto-prefix-replace expects 'old;new' format, but got " +
|
||||
S.substr(23));
|
||||
} else if (S.startswith("thinlto-object-suffix-replace=")) {
|
||||
std::tie(Config->ThinLTOObjectSuffixReplace.first,
|
||||
Config->ThinLTOObjectSuffixReplace.second) =
|
||||
S.substr(30).split(';');
|
||||
if (Config->ThinLTOObjectSuffixReplace.second.empty())
|
||||
error(
|
||||
"thinlto-object-suffix-replace expects 'old;new' format, but got " +
|
||||
S.substr(30));
|
||||
} else if (!S.startswith("/") && !S.startswith("-fresolution=") &&
|
||||
!S.startswith("-pass-through=") && !S.startswith("thinlto")) {
|
||||
parseClangOption(S, Arg->getSpelling());
|
||||
|
|
|
@ -1032,9 +1032,13 @@ BitcodeFile::BitcodeFile(MemoryBufferRef MB, StringRef ArchiveName,
|
|||
// this causes a collision which result in only one of the objects being
|
||||
// taken into consideration at LTO time (which very likely causes undefined
|
||||
// symbols later in the link stage).
|
||||
std::string Path = MB.getBufferIdentifier().str();
|
||||
if (Config->ThinLTOIndexOnly)
|
||||
Path = updateSuffixInPath(MB.getBufferIdentifier());
|
||||
|
||||
MemoryBufferRef MBRef(
|
||||
MB.getBuffer(),
|
||||
Saver.save(ArchiveName + MB.getBufferIdentifier() +
|
||||
Saver.save(ArchiveName + Path +
|
||||
(ArchiveName.empty() ? "" : utostr(OffsetInArchive))));
|
||||
Obj = CHECK(lto::InputFile::create(MBRef), this);
|
||||
|
||||
|
|
|
@ -355,6 +355,20 @@ inline bool isBitcode(MemoryBufferRef MB) {
|
|||
return identify_magic(MB.getBuffer()) == llvm::file_magic::bitcode;
|
||||
}
|
||||
|
||||
inline std::string updateSuffixInPath(llvm::StringRef Path) {
|
||||
if (Path.endswith(Config->ThinLTOObjectSuffixReplace.first)) {
|
||||
size_t pos = Path.rfind(Config->ThinLTOObjectSuffixReplace.first);
|
||||
std::string SuffixedPath =
|
||||
(Path.str().substr(0, pos) +
|
||||
Config->ThinLTOObjectSuffixReplace.second.str());
|
||||
return SuffixedPath;
|
||||
} else {
|
||||
error("cannot find suffix " +
|
||||
Config->ThinLTOObjectSuffixReplace.first.str());
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
extern std::vector<BinaryFile *> BinaryFiles;
|
||||
extern std::vector<BitcodeFile *> BitcodeFiles;
|
||||
extern std::vector<LazyObjFile *> LazyObjFiles;
|
||||
|
|
|
@ -266,7 +266,8 @@ std::vector<InputFile *> BitcodeCompiler::compile() {
|
|||
if (F->AddedToLink || !isBitcode(F->MB))
|
||||
continue;
|
||||
|
||||
std::string Path = getThinLTOOutputFile(F->getName());
|
||||
std::string Path = updateSuffixInPath(getThinLTOOutputFile(F->getName()));
|
||||
|
||||
std::unique_ptr<raw_fd_ostream> OS = openFile(Path + ".thinlto.bc");
|
||||
if (!OS)
|
||||
continue;
|
||||
|
|
|
@ -0,0 +1,51 @@
|
|||
; REQUIRES: x86
|
||||
|
||||
; Test to make sure the thinlto-object-suffix-replace option is handled
|
||||
; correctly.
|
||||
|
||||
; Generate bitcode file with summary, as well as a minimized bitcode without
|
||||
; the debug metadata for the thin link.
|
||||
; RUN: opt -thinlto-bc %s -thin-link-bitcode-file=%t1.thinlink.bc -o %t1.o
|
||||
|
||||
; First perform the thin link on the normal bitcode file, and save the
|
||||
; resulting index.
|
||||
; RUN: ld.lld -m elf_x86_64 --plugin-opt=thinlto-index-only -shared %t1.o -o %t3
|
||||
; RUN: cp %t1.o.thinlto.bc %t1.o.thinlto.bc.orig
|
||||
|
||||
; Next perform the thin link on the minimized bitcode file, and compare dump
|
||||
; of the resulting index to the above dump to ensure they are identical.
|
||||
; RUN: rm -f %t1.o.thinlto.bc
|
||||
; Make sure it isn't inadvertently using the regular bitcode file.
|
||||
; RUN: rm -f %t1.o
|
||||
; RUN: ld.lld -m elf_x86_64 --plugin-opt=thinlto-index-only \
|
||||
; RUN: --plugin-opt=thinlto-object-suffix-replace=".thinlink.bc;.o" \
|
||||
; RUN: -shared %t1.thinlink.bc -o %t3
|
||||
; RUN: diff %t1.o.thinlto.bc.orig %t1.o.thinlto.bc
|
||||
|
||||
; Ensure lld generates error if object suffix replace option does not have 'old;new' format
|
||||
; RUN: rm -f %t1.o.thinlto.bc
|
||||
; RUN: not ld.lld -m elf_x86_64 --plugin-opt=thinlto-index-only \
|
||||
; RUN: --plugin-opt=thinlto-object-suffix-replace="abc:def" -shared %t1.thinlink.bc \
|
||||
; RUN: -o %t3 2>&1 | FileCheck %s --check-prefix=ERR1
|
||||
; ERR1: thinlto-object-suffix-replace expects 'old;new' format, but got abc:def
|
||||
|
||||
; Ensure lld generates error if old suffix doesn't exist in file name
|
||||
; RUN: rm -f %t1.o
|
||||
; RUN: not ld.lld -m elf_x86_64 --plugin-opt=thinlto-index-only \
|
||||
; RUN: --plugin-opt=thinlto-object-suffix-replace=".abc;.o" -shared %t1.thinlink.bc \
|
||||
; RUN: -o %t3 2>&1 | FileCheck %s --check-prefix=ERR2
|
||||
; ERR2: cannot find suffix .abc
|
||||
|
||||
|
||||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
||||
define void @f() {
|
||||
entry:
|
||||
ret void
|
||||
}
|
||||
|
||||
!llvm.dbg.cu = !{}
|
||||
|
||||
!1 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
!llvm.module.flags = !{!1}
|
Loading…
Reference in New Issue