Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(95)

Unified Diff: tools/llc/llc.cpp

Issue 8393017: Bitcode streaming (Closed)
Patch Set: rebase against upstream LLVM Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: tools/llc/llc.cpp
diff --git a/tools/llc/llc.cpp b/tools/llc/llc.cpp
index 1694e01cdfc41a3cf53d4614a2a2a5fab7758a39..d30bfe3b821768933d74a0abf7e14e88b1a9a03c 100644
--- a/tools/llc/llc.cpp
+++ b/tools/llc/llc.cpp
@@ -18,6 +18,7 @@
#include "llvm/PassManager.h"
#include "llvm/Pass.h"
#include "llvm/ADT/Triple.h"
+#include "llvm/Bitcode/BitcodeStream.h"
#include "llvm/Support/IRReader.h"
#include "llvm/CodeGen/LinkAllAsmWriterComponents.h"
#include "llvm/CodeGen/LinkAllCodegenComponents.h"
@@ -141,6 +142,10 @@ DisableRedZone("disable-red-zone",
cl::desc("Do not emit code that uses the red zone."),
cl::init(false));
+static cl::opt<bool>
+LazyBitcode("streaming-bitcode",
+ cl::desc("Use lazy bitcode streaming"), cl::init(true));
+
// GetFileNameRoot - Helper function to get the basename of a filename.
static inline std::string
GetFileNameRoot(const std::string &InputFilename) {
@@ -248,7 +253,19 @@ int main(int argc, char **argv) {
SMDiagnostic Err;
std::auto_ptr<Module> M;
- M.reset(ParseIRFile(InputFilename, Err, Context));
+ if (LazyBitcode) {
+ std::string StrError;
+ BitcodeStreamer* streamer = getBitcodeFileStreamer(InputFilename,&StrError);
+ if (streamer) {
+ M.reset(getStreamedBitcodeModule(InputFilename, streamer, Context,
+ &StrError));
+ }
+ if (!StrError.empty()) {
+ Err = SMDiagnostic(InputFilename, SourceMgr::DK_Error, StrError);
+ }
+ } else {
+ M.reset(ParseIRFile(InputFilename, Err, Context));
+ }
if (M.get() == 0) {
Err.print(argv[0], errs());
return 1;
@@ -345,13 +362,18 @@ int main(int argc, char **argv) {
}
// Build up all of the passes that we want to do to the module.
- PassManager PM;
+ PassManagerBase *PM;
jvoung - send to chromium... 2011/11/07 19:01:55 Is there a scoped-pointer class that you can use?
(google.com) Derek Schuff 2011/11/07 22:33:50 Done.
+ if (LazyBitcode)
+ PM = new FunctionPassManager(&mod);
+ else
+ PM = new PassManager();
+
// Add the target data from the target machine, if it exists, or the module.
if (const TargetData *TD = Target.getTargetData())
- PM.add(new TargetData(*TD));
+ PM->add(new TargetData(*TD));
else
- PM.add(new TargetData(&mod));
+ PM->add(new TargetData(&mod));
// Override default to generate verbose assembly.
Target.setAsmVerbosityDefault(true);
@@ -368,7 +390,7 @@ int main(int argc, char **argv) {
formatted_raw_ostream FOS(Out->os());
// Ask the target to add backend passes as necessary.
- if (Target.addPassesToEmitFile(PM, FOS, FileType, OLvl, NoVerify)) {
+ if (Target.addPassesToEmitFile(*PM, FOS, FileType, OLvl, NoVerify)) {
errs() << argv[0] << ": target does not support generation of this"
<< " file type!\n";
return 1;
@@ -377,7 +399,16 @@ int main(int argc, char **argv) {
// Before executing passes, print the final values of the LLVM options.
cl::PrintOptionValues();
- PM.run(mod);
+ if (LazyBitcode) {
+ FunctionPassManager* P = static_cast<FunctionPassManager*>(PM);
+ P->doInitialization();
+ for (Module::iterator I = mod.begin(), E = mod.end(); I != E; ++I) {
+ P->run(*I);
+ }
+ P->doFinalization();
+ } else {
+ static_cast<PassManager*>(PM)->run(mod);
+ }
}
// Declare success.

Powered by Google App Engine
This is Rietveld 408576698