Migrate llc and the JIT to using the TargetRegistry for lookups.
authorDaniel Dunbar <daniel@zuster.org>
Wed, 15 Jul 2009 11:36:15 +0000 (11:36 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Wed, 15 Jul 2009 11:36:15 +0000 (11:36 +0000)
 - They still use the TargetMachineRegistry to populate the contents of the
   -march option (via the listener interface). We can't just populate it in the
   option parser because we can't expect the TargetRegistry to be populated yet
   (we no longer rely on static constructors).

 - There are a couple ways to finish killing off TargetMachineRegistry, but I
   haven't figured out the cleanest one yet...

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@75773 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Target/TargetRegistry.h
lib/ExecutionEngine/JIT/TargetSelect.cpp
tools/llc/llc.cpp

index 7d934368e338b1f20cfedd3533754af253e19eb6..b3f9e8b897b3ae890e8bc77b5ccf0c0cb38e65d5 100644 (file)
@@ -89,6 +89,10 @@ namespace llvm {
     /// getShortDescription - Get a short description of the target.
     const char *getShortDescription() const { return ShortDesc; }
 
+    /// getJITMatchQuality - Get the quality of this targets match for use as a
+    /// JIT.
+    unsigned getJITMatchQuality() const { return JITMatchQualityFn(); }
+
     /// createTargetMachine - Create a target specific machine implementation.
     TargetMachine *createTargetMachine(const Module &M,
                                        const std::string &Features) const {
index 24dd013639846309bf38755afcf13d407ca3bc0a..a4157bcd7b27e124a51d75a6ed33d1e0ad480599 100644 (file)
@@ -45,16 +45,16 @@ ExecutionEngine *JIT::createJIT(ModuleProvider *MP, std::string *ErrorStr,
                                 JITMemoryManager *JMM,
                                 CodeGenOpt::Level OptLevel,
                                 bool AllocateGVsWithCode) {
-  const TargetMachineRegistry::entry *TheArch = MArch;
-  if (TheArch == 0) {
+  const Target *TheTarget;
+  if (MArch == 0) {
     std::string Error;
-    TheArch = TargetMachineRegistry::getClosestTargetForJIT(Error);
-    if (TheArch == 0) {
+    TheTarget = TargetRegistry::getClosestTargetForJIT(Error);
+    if (TheTarget == 0) {
       if (ErrorStr)
         *ErrorStr = Error;
       return 0;
     }
-  } else if (TheArch->JITMatchQualityFn() == 0) {
+  } else if (TheTarget->getJITMatchQuality() == 0) {
     cerr << "WARNING: This target JIT is not designed for the host you are"
          << " running.  If bad things happen, please choose a different "
          << "-march switch.\n";
@@ -71,7 +71,8 @@ ExecutionEngine *JIT::createJIT(ModuleProvider *MP, std::string *ErrorStr,
   }
 
   // Allocate a target...
-  TargetMachine *Target = TheArch->CtorFn(*MP->getModule(), FeaturesStr);
+  TargetMachine *Target = 
+    TheTarget->createTargetMachine(*MP->getModule(), FeaturesStr);
   assert(Target && "Could not allocate target machine!");
 
   // If the target supports JIT code generation, return a new JIT now.
index 8e7e17cbbfae17ef50933ea2c1425782bc8b922b..82dbaba176155e3bb7ec7250f615303f9c2105e1 100644 (file)
@@ -128,7 +128,8 @@ GetFileNameRoot(const std::string &InputFilename) {
   return outputFilename;
 }
 
-static formatted_raw_ostream *GetOutputStream(const char *ProgName) {
+static formatted_raw_ostream *GetOutputStream(const char *TargetName, 
+                                              const char *ProgName) {
   if (OutputFilename != "") {
     if (OutputFilename == "-")
       return &fouts();
@@ -169,10 +170,10 @@ static formatted_raw_ostream *GetOutputStream(const char *ProgName) {
   bool Binary = false;
   switch (FileType) {
   case TargetMachine::AssemblyFile:
-    if (MArch->Name[0] == 'c') {
-      if (MArch->Name[1] == 0)
+    if (TargetName[0] == 'c') {
+      if (TargetName[1] == 0)
         OutputFilename += ".cbe.c";
-      else if (MArch->Name[1] == 'p' && MArch->Name[2] == 'p')
+      else if (TargetName[1] == 'p' && TargetName[2] == 'p')
         OutputFilename += ".cpp";
       else
         OutputFilename += ".s";
@@ -248,10 +249,13 @@ int main(int argc, char **argv) {
 
   // Allocate target machine.  First, check whether the user has
   // explicitly specified an architecture to compile for.
-  if (MArch == 0) {
+  const Target *TheTarget;
+  if (MArch) {
+    TheTarget = &MArch->TheTarget;
+  } else {
     std::string Err;
-    MArch = TargetMachineRegistry::getClosestStaticTargetForModule(mod, Err);
-    if (MArch == 0) {
+    TheTarget = TargetRegistry::getClosestStaticTargetForModule(mod, Err);
+    if (TheTarget == 0) {
       std::cerr << argv[0] << ": error auto-selecting target for module '"
                 << Err << "'.  Please use the -march option to explicitly "
                 << "pick a target.\n";
@@ -269,12 +273,13 @@ int main(int argc, char **argv) {
     FeaturesStr = Features.getString();
   }
 
-  std::auto_ptr<TargetMachine> target(MArch->CtorFn(mod, FeaturesStr));
+  std::auto_ptr<TargetMachine> 
+    target(TheTarget->createTargetMachine(mod, FeaturesStr));
   assert(target.get() && "Could not allocate target machine!");
   TargetMachine &Target = *target.get();
 
   // Figure out where we are going to send the output...
-  formatted_raw_ostream *Out = GetOutputStream(argv[0]);
+  formatted_raw_ostream *Out = GetOutputStream(TheTarget->getName(), argv[0]);
   if (Out == 0) return 1;
 
   CodeGenOpt::Level OLvl = CodeGenOpt::Default;