diff options
| author | Mehdi Amini <mehdi.amini@apple.com> | 2016-08-17 06:23:09 +0000 |
|---|---|---|
| committer | Mehdi Amini <mehdi.amini@apple.com> | 2016-08-17 06:23:09 +0000 |
| commit | 970800e0c8c7cadcb36be28f6ea300108b9fc551 (patch) | |
| tree | b6123cbebf9891a70690b7c374c74066f09dd310 /llvm/tools | |
| parent | 406aa22c6f9663c969e1951fdfac3b745ac63ceb (diff) | |
| download | bcm5719-llvm-970800e0c8c7cadcb36be28f6ea300108b9fc551.tar.gz bcm5719-llvm-970800e0c8c7cadcb36be28f6ea300108b9fc551.zip | |
[LTO] Introduce an Output class to wrap the output stream creation (NFC)
Summary:
While NFC for now, this will allow more flexibility on the client side
to hold state necessary to back up the stream.
Also when adding caching, this class will grow in complexity.
Note I blindly modified the gold-plugin as I can't compile it.
Reviewers: tejohnson
Subscribers: mehdi_amini, llvm-commits
Differential Revision: https://reviews.llvm.org/D23542
llvm-svn: 278907
Diffstat (limited to 'llvm/tools')
| -rw-r--r-- | llvm/tools/gold/gold-plugin.cpp | 51 | ||||
| -rw-r--r-- | llvm/tools/llvm-lto2/llvm-lto2.cpp | 25 |
2 files changed, 50 insertions, 26 deletions
diff --git a/llvm/tools/gold/gold-plugin.cpp b/llvm/tools/gold/gold-plugin.cpp index 7f38a021a0a..fd4107eeb18 100644 --- a/llvm/tools/gold/gold-plugin.cpp +++ b/llvm/tools/gold/gold-plugin.cpp @@ -647,16 +647,14 @@ static void recordFile(std::string Filename, bool TempOutFile) { Cleanup.push_back(Filename.c_str()); } -/// Open a file and return the new file descriptor given a base input -/// file name, a flag indicating whether a temp file should be generated, -/// and an optional task id. The new filename generated is -/// returned in \p NewFilename. -static int openOutputFile(SmallString<128> InFilename, bool TempOutFile, - SmallString<128> &NewFilename, int TaskID = -1) { - int FD; +/// Return the desired output filename given a base input name, a flag +/// indicating whether a temp file should be generated, and an optional task id. +/// The new filename generated is returned in \p NewFilename. +static void getOutputFileName(SmallString<128> InFilename, bool TempOutFile, + SmallString<128> &NewFilename, int TaskID = -1) { if (TempOutFile) { std::error_code EC = - sys::fs::createTemporaryFile("lto-llvm", "o", FD, NewFilename); + sys::fs::createTemporaryFile("lto-llvm", "o", NewFilename); if (EC) message(LDPL_FATAL, "Could not create temporary file: %s", EC.message().c_str()); @@ -664,12 +662,7 @@ static int openOutputFile(SmallString<128> InFilename, bool TempOutFile, NewFilename = InFilename; if (TaskID >= 0) NewFilename += utostr(TaskID); - std::error_code EC = - sys::fs::openFileForWrite(NewFilename, FD, sys::fs::F_None); - if (EC) - message(LDPL_FATAL, "Could not open file: %s", EC.message().c_str()); } - return FD; } /// Add all required common symbols to M, which is expected to be the first @@ -723,6 +716,24 @@ static void getThinLTOOldAndNewPrefix(std::string &OldPrefix, NewPrefix = Split.second.str(); } +namespace { +// Define the LTOOutput handling +class LTOOutput : public lto::NativeObjectOutput { + StringRef Path; + +public: + LTOOutput(StringRef Path) : Path(Path) {} + // Open the filename \p Path and allocate a stream. + std::unique_ptr<raw_pwrite_stream> getStream() override { + int FD; + std::error_code EC = sys::fs::openFileForWrite(Path, FD, sys::fs::F_None); + if (EC) + message(LDPL_FATAL, "Could not open file: %s", EC.message().c_str()); + return llvm::make_unique<llvm::raw_fd_ostream>(FD, true); + } +}; +} + static std::unique_ptr<LTO> createLTO() { Config Conf; ThinBackend Backend; @@ -814,7 +825,7 @@ static ld_plugin_status allSymbolsReadHook() { } SmallString<128> Filename; - // Note that openOutputFile will append a unique ID for each task + // Note that getOutputFileName will append a unique ID for each task if (!options::obj_path.empty()) Filename = options::obj_path; else if (options::TheOutputType == options::OT_SAVE_TEMPS) @@ -825,15 +836,15 @@ static ld_plugin_status allSymbolsReadHook() { std::vector<uintptr_t> IsTemporary(MaxTasks); std::vector<SmallString<128>> Filenames(MaxTasks); - auto AddStream = [&](size_t Task) { - int FD = openOutputFile(Filename, /*TempOutFile=*/!SaveTemps, - Filenames[Task], MaxTasks > 1 ? Task : -1); + auto AddOutput = [&](size_t Task) { + auto &OutputName = Filenames[Task]; + getOutputFileName(Filename, /*TempOutFile=*/!SaveTemps, OutputName, + MaxTasks > 1 ? Task : -1); IsTemporary[Task] = !SaveTemps; - - return llvm::make_unique<llvm::raw_fd_ostream>(FD, true); + return llvm::make_unique<LTOOutput>(OutputName); }; - check(Lto->run(AddStream)); + check(Lto->run(AddOutput)); if (options::TheOutputType == options::OT_DISABLE || options::TheOutputType == options::OT_BC_ONLY) diff --git a/llvm/tools/llvm-lto2/llvm-lto2.cpp b/llvm/tools/llvm-lto2/llvm-lto2.cpp index b9300b93990..370c7086af7 100644 --- a/llvm/tools/llvm-lto2/llvm-lto2.cpp +++ b/llvm/tools/llvm-lto2/llvm-lto2.cpp @@ -74,6 +74,22 @@ template <typename T> static T check(ErrorOr<T> E, std::string Msg) { return T(); } +namespace { +// Define the LTOOutput handling +class LTOOutput : public lto::NativeObjectOutput { + StringRef Path; + +public: + LTOOutput(StringRef Path) : Path(Path) {} + std::unique_ptr<raw_pwrite_stream> getStream() override { + std::error_code EC; + auto S = llvm::make_unique<raw_fd_ostream>(Path, EC, sys::fs::F_None); + check(EC, Path); + return std::move(S); + } +}; +} + int main(int argc, char **argv) { InitializeAllTargets(); InitializeAllTargetMCs(); @@ -156,13 +172,10 @@ int main(int argc, char **argv) { if (HasErrors) return 1; - auto AddStream = [&](size_t Task) { + auto AddOutput = [&](size_t Task) { std::string Path = OutputFilename + "." + utostr(Task); - std::error_code EC; - auto S = llvm::make_unique<raw_fd_ostream>(Path, EC, sys::fs::F_None); - check(EC, Path); - return S; + return llvm::make_unique<LTOOutput>(Path); }; - check(Lto.run(AddStream), "LTO::run failed"); + check(Lto.run(AddOutput), "LTO::run failed"); } |

