[llvm-commits] CVS: reopt/tools/reopt-llc/Makefile reopt-llc.cpp

Brian Gaeke gaeke at cs.uiuc.edu
Thu Sep 30 12:42:48 PDT 2004



Changes in directory reopt/tools/reopt-llc:

Makefile added (r1.1)
reopt-llc.cpp added (r1.1)
---
Log message:

This is going to be the new reoptimizer front end; right now it's mostly just a copy of llc.cpp


---
Diffs of the changes:  (+208 -0)

Index: reopt/tools/reopt-llc/Makefile
diff -c /dev/null reopt/tools/reopt-llc/Makefile:1.1
*** /dev/null	Thu Sep 30 14:42:47 2004
--- reopt/tools/reopt-llc/Makefile	Thu Sep 30 14:42:37 2004
***************
*** 0 ****
--- 1,25 ----
+ LEVEL = ../..
+ TOOLNAME = reopt-llc
+ LLVMLIBS = \
+ 	cwriter \
+ 	sparcv9 \
+ 	sparcv9regalloc \
+ 	sched \
+ 	codegen \
+ 	target.a \
+ 	sparcv9livevar \
+ 	ipa.a \
+ 	transforms.a \
+ 	scalaropts.a \
+ 	analysis.a \
+ 	transformutils.a \
+ 	bcreader \
+ 	bcwriter \
+ 	vmcore \
+ 	support.a \
+ 	LLVMsystem.a
+ 
+ TOOLLINKOPTS = $(PLATFORMLIBDL)
+ 
+ include $(LEVEL)/Makefile.common
+ 


Index: reopt/tools/reopt-llc/reopt-llc.cpp
diff -c /dev/null reopt/tools/reopt-llc/reopt-llc.cpp:1.1
*** /dev/null	Thu Sep 30 14:42:48 2004
--- reopt/tools/reopt-llc/reopt-llc.cpp	Thu Sep 30 14:42:37 2004
***************
*** 0 ****
--- 1,183 ----
+ //===- reopt-llc.cpp - Instrument program for reoptimizer -----------------===//
+ // 
+ //                     The LLVM Compiler Infrastructure
+ //
+ // This file was developed by the LLVM research group and is distributed under
+ // the University of Illinois Open Source License. See LICENSE.TXT for
+ // details.
+ // 
+ //===----------------------------------------------------------------------===//
+ //
+ // Instruments a program for the benefit of the Reoptimizer and outputs
+ // SparcV9 machine code, in a manner similar to that of the standard LLVM
+ // 'llc' tool.
+ //
+ //===----------------------------------------------------------------------===//
+ 
+ 
+ #include "llvm/Bytecode/Reader.h"
+ #include "llvm/Target/TargetMachine.h"
+ #include "llvm/Target/TargetMachineRegistry.h"
+ #include "llvm/Transforms/Scalar.h"
+ #include "llvm/Module.h"
+ #include "llvm/PassManager.h"
+ #include "llvm/Pass.h"
+ #include "llvm/Support/CommandLine.h"
+ #include "llvm/Support/PluginLoader.h"
+ #include "llvm/System/Signals.h"
+ #include <fstream>
+ #include <iostream>
+ #include <memory>
+ 
+ using namespace llvm;
+ 
+ // General options for llc.  Other pass-specific options are specified
+ // within the corresponding llc passes, and target-specific options
+ // and back-end code generation options are specified with the target machine.
+ // 
+ static cl::opt<std::string>
+ InputFilename(cl::Positional, cl::desc("<input bytecode>"), cl::init("-"));
+ 
+ static cl::opt<std::string>
+ OutputFilename("o", cl::desc("Output filename"), cl::value_desc("filename"));
+ 
+ static cl::opt<bool> Force("f", cl::desc("Overwrite output files"));
+ 
+ static cl::opt<const TargetMachineRegistry::Entry*, false, TargetNameParser>
+ MArch("march", cl::desc("Architecture to generate assembly for:"));
+                
+ // GetFileNameRoot - Helper function to get the basename of a filename...
+ static inline std::string
+ GetFileNameRoot(const std::string &InputFilename) {
+   std::string IFN = InputFilename;
+   std::string outputFilename;
+   int Len = IFN.length();
+   if ((Len > 2) &&
+       IFN[Len-3] == '.' && IFN[Len-2] == 'b' && IFN[Len-1] == 'c') {
+     outputFilename = std::string(IFN.begin(), IFN.end()-3); // s/.bc/.s/
+   } else {
+     outputFilename = IFN;
+   }
+   return outputFilename;
+ }
+ 
+ namespace llvm {
+   extern bool SaveRegAllocState; // from SparcV9/RegAlloc/PhyRegAlloc.cpp
+   extern bool EmitMappingInfo; // from SparcV9/SparcV9TargetMachine.cpp
+ }
+ 
+ // main - Entry point for the llc compiler.
+ //
+ int main(int argc, char **argv) {
+   cl::ParseCommandLineOptions(argc, argv, " llvm system compiler\n");
+   sys::PrintStackTraceOnErrorSignal();
+ 
+   // Load the module to be compiled...
+   std::auto_ptr<Module> M(ParseBytecodeFile(InputFilename));
+   if (M.get() == 0) {
+     std::cerr << argv[0] << ": bytecode didn't read correctly.\n";
+     return 1;
+   }
+   Module &mod = *M.get();
+ 
+   // Allocate target machine.  First, check whether the user has
+   // explicitly specified an architecture to compile for.
+   TargetMachine* (*TargetMachineAllocator)(const Module&,
+                                            IntrinsicLowering *) = 0;
+   if (MArch == 0) {
+     std::string Err;
+     MArch = TargetMachineRegistry::getClosestStaticTargetForModule(mod, Err);
+     if (MArch == 0) {
+       std::cerr << argv[0] << ": error auto-selecting target for module '"
+                 << Err << "'.  Please use the -march option to explicitly "
+                 << "pick a target.\n";
+       return 1;
+     }
+   }
+ 
+   std::auto_ptr<TargetMachine> target(MArch->CtorFn(mod, 0));
+   assert(target.get() && "Could not allocate target machine!");
+   TargetMachine &Target = *target.get();
+   const TargetData &TD = Target.getTargetData();
+ 
+   // Build up all of the passes that we want to do to the module...
+   PassManager Passes;
+   Passes.add(new TargetData("llc", TD.isLittleEndian(), TD.getPointerSize(),
+                             TD.getPointerAlignment(), TD.getDoubleAlignment()));
+ 
+   // Figure out where we are going to send the output...
+   std::ostream *Out = 0;
+   if (OutputFilename != "") {
+     if (OutputFilename != "-") {
+       // Specified an output filename?
+       if (!Force && std::ifstream(OutputFilename.c_str())) {
+         // If force is not specified, make sure not to overwrite a file!
+         std::cerr << argv[0] << ": error opening '" << OutputFilename
+                   << "': file exists!\n"
+                   << "Use -f command line argument to force output\n";
+         return 1;
+       }
+       Out = new std::ofstream(OutputFilename.c_str());
+ 
+       // Make sure that the Out file gets unlinked from the disk if we get a
+       // SIGINT
+       sys::RemoveFileOnSignal(OutputFilename);
+     } else {
+       Out = &std::cout;
+     }
+   } else {
+     if (InputFilename == "-") {
+       OutputFilename = "-";
+       Out = &std::cout;
+     } else {
+       OutputFilename = GetFileNameRoot(InputFilename); 
+ 
+       if (MArch->Name[0] != 'c' || MArch->Name[1] != 0)  // not CBE
+         OutputFilename += ".s";
+       else
+         OutputFilename += ".cbe.c";
+       
+       if (!Force && std::ifstream(OutputFilename.c_str())) {
+         // If force is not specified, make sure not to overwrite a file!
+         std::cerr << argv[0] << ": error opening '" << OutputFilename
+                   << "': file exists!\n"
+                   << "Use -f command line argument to force output\n";
+         return 1;
+       }
+       
+       Out = new std::ofstream(OutputFilename.c_str());
+       if (!Out->good()) {
+         std::cerr << argv[0] << ": error opening " << OutputFilename << "!\n";
+         delete Out;
+         return 1;
+       }
+       
+       // Make sure that the Out file gets unlinked from the disk if we get a
+       // SIGINT
+       sys::RemoveFileOnSignal(OutputFilename);
+     }
+   }
+ 
+   // Turn on special SparcV9 backend flags to save mapping info for
+   // the reoptimizer.
+   SaveRegAllocState = true;
+   EmitMappingInfo = true;
+ 
+   // Ask the target to add backend passes as necessary
+   if (Target.addPassesToEmitAssembly(Passes, *Out)) {
+     std::cerr << argv[0] << ": target '" << Target.getName()
+               << "' does not support static compilation!\n";
+     if (Out != &std::cout) delete Out;
+     // And the Out file is empty and useless, so remove it now.
+     std::remove(OutputFilename.c_str());
+     return 1;
+   } else {
+     // Run our queue of passes all at once now, efficiently.
+     Passes.run(*M.get());
+   }
+ 
+   // Delete the ostream if it's not a stdout stream
+   if (Out != &std::cout) delete Out;
+ 
+   return 0;
+ }






More information about the llvm-commits mailing list