Add facility to create a target.
authorDevang Patel <dpatel@apple.com>
Wed, 27 Aug 2008 20:00:27 +0000 (20:00 +0000)
committerDevang Patel <dpatel@apple.com>
Wed, 27 Aug 2008 20:00:27 +0000 (20:00 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@55429 91177308-0d34-0410-b5e6-96231b3b80d8

tools/opt/opt.cpp

index 1d8ce576d6a894473f576e64db206478f3e3a875..fcf98ae1bb146870e23eec2ccf9ce4a464be160a 100644 (file)
@@ -22,6 +22,8 @@
 #include "llvm/Analysis/CallGraph.h"
 #include "llvm/Target/TargetData.h"
 #include "llvm/Target/TargetMachine.h"
+#include "llvm/Target/TargetMachineRegistry.h"
+#include "llvm/Target/SubtargetFeature.h"
 #include "llvm/Support/PassNameParser.h"
 #include "llvm/System/Signals.h"
 #include "llvm/Support/ManagedStatic.h"
@@ -93,6 +95,22 @@ QuietA("quiet", cl::desc("Alias for -q"), cl::aliasopt(Quiet));
 static cl::opt<bool>
 AnalyzeOnly("analyze", cl::desc("Only perform analysis, no optimization"));
 
+static cl::opt<const TargetMachineRegistry::entry*, false,
+               TargetMachineRegistry::Parser>
+MArch("march", cl::desc("Architecture to generate code for:"));
+
+static cl::opt<std::string>
+MCPU("mcpu", 
+  cl::desc("Target a specific cpu type (-mcpu=help for details)"),
+  cl::value_desc("cpu-name"),
+  cl::init(""));
+
+static cl::list<std::string>
+MAttrs("mattr", 
+  cl::CommaSeparated,
+  cl::desc("Target specific attributes (-mattr=help for details)"),
+  cl::value_desc("a1,+a2,-a3,..."));
+
 // ---------- Define Printers for module and function passes ------------
 namespace {
 
@@ -308,6 +326,36 @@ void AddStandardCompilePasses(PassManager &PM) {
 //===----------------------------------------------------------------------===//
 // main for opt
 //
+
+TargetMachine *getTargetMachine(Module &Mod) {
+
+  if (MArch == 0) {
+    std::string Err;
+    MArch = 
+      TargetMachineRegistry::getClosestStaticTargetForModule(Mod, Err);
+    if (MArch == 0) {
+      std::cerr << "Error auto-selecting target for module '"
+                << Err << "'.  Please use the -march option to explicitly "
+                << "pick a target.\n";
+      return NULL;
+    }
+  }
+  
+  // Package up features to be passed to target/subtarget
+  std::string FeaturesStr;
+  if (MCPU.size() || MAttrs.size()) {
+    SubtargetFeatures Features;
+    Features.setCPU(MCPU);
+    for (unsigned i = 0; i != MAttrs.size(); ++i)
+      Features.AddFeature(MAttrs[i]);
+    FeaturesStr = Features.getString();
+  }
+  
+  TargetMachine *Target = MArch->CtorFn(Mod, FeaturesStr);
+  assert(Target && "Could not allocate target machine!");
+  return Target;
+}
+
 int main(int argc, char **argv) {
   llvm_shutdown_obj X;  // Call llvm_shutdown() on exit.
   try {
@@ -315,10 +363,6 @@ int main(int argc, char **argv) {
       "llvm .bc -> .bc modular optimizer and analysis printer\n");
     sys::PrintStackTraceOnErrorSignal();
 
-    // Allocate a full target machine description only if necessary.
-    // FIXME: The choice of target should be controllable on the command line.
-    std::auto_ptr<TargetMachine> target;
-
     std::string ErrorMessage;
 
     // Load the input module...