Mercurial > hg > CbC > CbC_llvm
diff lld/MachO/LTO.cpp @ 223:5f17cb93ff66 llvm-original
LLVM13 (2021/7/18)
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 18 Jul 2021 22:43:00 +0900 |
parents | 79ff65ed7e25 |
children | c4bab56944e8 |
line wrap: on
line diff
--- a/lld/MachO/LTO.cpp Sun Jul 18 22:10:01 2021 +0900 +++ b/lld/MachO/LTO.cpp Sun Jul 18 22:43:00 2021 +0900 @@ -13,9 +13,12 @@ #include "Symbols.h" #include "Target.h" +#include "lld/Common/Args.h" #include "lld/Common/ErrorHandler.h" #include "lld/Common/Strings.h" #include "lld/Common/TargetOptionsCommandFlags.h" +#include "llvm/LTO/Caching.h" +#include "llvm/LTO/Config.h" #include "llvm/LTO/LTO.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/Path.h" @@ -40,6 +43,8 @@ }; c.TimeTraceEnabled = config->timeTraceEnabled; c.TimeTraceGranularity = config->timeTraceGranularity; + c.OptLevel = config->ltoo; + c.CGOptLevel = args::getCGOptLevel(config->ltoo); if (config->saveTemps) checkError(c.addSaveTemps(config->outputFile.str() + ".", /*UseInputModulePath=*/true)); @@ -73,6 +78,7 @@ // FIXME: What about other output types? And we can probably be less // restrictive with -flat_namespace, but it's an infrequent use case. + // FIXME: Honor config->exportDynamic. r.VisibleToRegularObj = config->outputType != MH_EXECUTE || config->namespaceKind == NamespaceKind::flat || sym->isUsedInRegularObj; @@ -93,11 +99,28 @@ std::vector<ObjFile *> BitcodeCompiler::compile() { unsigned maxTasks = ltoObj->getMaxTasks(); buf.resize(maxTasks); + files.resize(maxTasks); - checkError(ltoObj->run([&](size_t task) { - return std::make_unique<lto::NativeObjectStream>( - std::make_unique<raw_svector_ostream>(buf[task])); - })); + // The -cache_path_lto option specifies the path to a directory in which + // to cache native object files for ThinLTO incremental builds. If a path was + // specified, configure LTO to use it as the cache directory. + lto::NativeObjectCache cache; + if (!config->thinLTOCacheDir.empty()) + cache = check( + lto::localCache(config->thinLTOCacheDir, + [&](size_t task, std::unique_ptr<MemoryBuffer> mb) { + files[task] = std::move(mb); + })); + + checkError(ltoObj->run( + [&](size_t task) { + return std::make_unique<lto::NativeObjectStream>( + std::make_unique<raw_svector_ostream>(buf[task])); + }, + cache)); + + if (!config->thinLTOCacheDir.empty()) + pruneCache(config->thinLTOCacheDir, config->thinLTOCachePolicy); if (config->saveTemps) { if (!buf[0].empty()) @@ -126,6 +149,8 @@ ret.push_back(make<ObjFile>( MemoryBufferRef(buf[i], saver.save(filePath.str())), modTime, "")); } - + for (std::unique_ptr<MemoryBuffer> &file : files) + if (file) + ret.push_back(make<ObjFile>(*file, 0, "")); return ret; }