Allow TargetMachine to refuse static code gen
authorChris Lattner <sabre@nondot.org>
Tue, 29 Oct 2002 21:12:46 +0000 (21:12 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 29 Oct 2002 21:12:46 +0000 (21:12 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4415 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Target/TargetMachine.h
lib/Target/SparcV9/SparcV9Internals.h
lib/Target/SparcV9/SparcV9TargetMachine.cpp
tools/llc/llc.cpp

index 16bb97f00080255def3ea38bcd03766e91ea3449..860d67eeae66149f4f2109ff96fbcabba655264a 100644 (file)
@@ -51,7 +51,7 @@ protected:
                                         ShortAl, ByteAl) { }
 public:
   virtual ~TargetMachine() {}
-  
+
   // 
   // Interfaces to the major aspects of target machine information:
   // -- Instruction opcode and operand information
@@ -74,9 +74,12 @@ public:
   
   /// addPassesToEmitAssembly - Add passes to the specified pass manager to get
   /// assembly langage code emited.  Typically this will involve several steps
-  /// of code generation.
+  /// of code generation.  This method should return true if code generation is
+  /// not supported.
   ///
-  virtual void addPassesToEmitAssembly(PassManager &PM, std::ostream &Out) = 0;
+  virtual bool addPassesToEmitAssembly(PassManager &PM, std::ostream &Out) {
+    return true;
+  }
 
   /// addPassesToJITCompile - Add passes to the specified pass manager to
   /// implement a fast dynamic compiler for this target.  Return true if this is
index 9be6b7fe582dac27663e4653032da94536a4df07..e31f375dc6a450498d0873617ef6aed23ba24dba 100644 (file)
@@ -718,7 +718,7 @@ public:
   virtual const MachineCacheInfo &getCacheInfo() const { return cacheInfo; }
   virtual const MachineOptInfo   &getOptInfo()   const { return optInfo; }
 
-  virtual void addPassesToEmitAssembly(PassManager &PM, std::ostream &Out);
+  virtual bool addPassesToEmitAssembly(PassManager &PM, std::ostream &Out);
 
   // getPrologEpilogCodeInserter - Inserts prolog/epilog code.
   virtual Pass* getPrologEpilogInsertionPass();
index 80724694d272057c6f4fb8d7daa30a1bcba3e21f..e8f9c9ee728c6a0794827e794222c17e8f669e1e 100644 (file)
@@ -141,7 +141,7 @@ UltraSparc::UltraSparc()
 // addPassesToEmitAssembly - This method controls the entire code generation
 // process for the ultra sparc.
 //
-void UltraSparc::addPassesToEmitAssembly(PassManager &PM, std::ostream &Out)
+bool UltraSparc::addPassesToEmitAssembly(PassManager &PM, std::ostream &Out)
 {
   // Construct and initialize the MachineFunction object for this fn.
   PM.add(createMachineCodeConstructionPass(*this));
@@ -189,4 +189,5 @@ void UltraSparc::addPassesToEmitAssembly(PassManager &PM, std::ostream &Out)
   // Emit bytecode to the assembly file into its special section next
   PM.add(getEmitBytecodeToAsmPass(Out));
   PM.add(getFunctionInfo(Out)); 
+  return false;
 }
index 8fb31241a279ca421021b5e0da659924233f8555..9a30854a6a67078dd270ff197dfa3aed187606ff 100644 (file)
@@ -281,10 +281,14 @@ main(int argc, char **argv)
         }
     }
 
-  Target.addPassesToEmitAssembly(Passes, *Out);
-
-  // Run our queue of passes all at once now, efficiently.
-  Passes.run(*M.get());
+  // Ask the target to add backend passes as neccesary
+  if (Target.addPassesToEmitAssembly(Passes, *Out)) {
+    cerr << argv[0] << ": target '" << Target.TargetName
+         << " does not support static compilation!\n";
+  } 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;