[llvm-commits] CVS: llvm/lib/VMCore/AutoUpgrade.cpp

Reid Spencer reid at x10sys.com
Mon Jan 16 13:06:14 PST 2006



Changes in directory llvm/lib/VMCore:

AutoUpgrade.cpp added (r1.1)
---
Log message:

For PR411: http://llvm.cs.uiuc.edu/PR411 :
This file makes the helper functions for auto-upgrade of llvm assembly and
bytecode more accessible. This is part of de-overloading of intrinsic
functions to support the flat symbol table (no type planes).


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

 AutoUpgrade.cpp |  105 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 105 insertions(+)


Index: llvm/lib/VMCore/AutoUpgrade.cpp
diff -c /dev/null llvm/lib/VMCore/AutoUpgrade.cpp:1.1
*** /dev/null	Mon Jan 16 15:06:11 2006
--- llvm/lib/VMCore/AutoUpgrade.cpp	Mon Jan 16 15:06:01 2006
***************
*** 0 ****
--- 1,105 ----
+ //===-- AutoUpgrade.cpp - Implement auto-upgrade helper functions ---------===//
+ //
+ //                     The LLVM Compiler Infrastructure
+ //
+ // This file was developed by Reid Spencer and is distributed under the 
+ // University of Illinois Open Source License. See LICENSE.TXT for details.
+ //
+ //===----------------------------------------------------------------------===//
+ //
+ // This file implements the auto-upgrade helper functions 
+ //
+ //===----------------------------------------------------------------------===//
+ 
+ #include "llvm/Assembly/AutoUpgrade.h"
+ #include "llvm/Function.h"
+ #include "llvm/Type.h"
+ #include <iostream>
+ 
+ using namespace llvm;
+ 
+ // UpgradeIntrinsicFunction - Convert overloaded intrinsic function names to
+ // their non-overloaded variants by appending the appropriate suffix based on
+ // the argument types.
+ bool llvm::UpgradeIntrinsicFunction(Function* F) {
+ 
+   // Get the Function's name.
+   const std::string& Name = F->getName();
+ 
+   // Quickly eliminate it, if it's not a candidate.
+   if (Name.length() <= 5 || Name[0] != 'l' || Name[1] != 'l' || Name[2] !=
+     'v' || Name[3] != 'm' || Name[4] != '.')
+     return false;
+ 
+   // See if its one of the name's we're interested in.
+   switch (Name[5]) {
+     case 'b':
+       if (Name == "llvm.bswap") {
+         const Type* Ty = F->getReturnType();
+         std::string new_name = Name;
+         if (Ty == Type::UShortTy || Ty == Type::ShortTy)
+           new_name += ".i16";
+         else if (Ty == Type::UIntTy || Ty == Type::IntTy)
+           new_name += ".i32";
+         else if (Ty == Type::ULongTy || Ty == Type::LongTy)
+           new_name += ".i64";
+         std::cerr << "WARNING: change " << Name << " to " 
+           << new_name << "\n";
+         F->setName(new_name);
+         return true;
+       }
+       break;
+     case 'c':
+       if (Name == "llvm.ctpop" || Name == "llvm.ctlz" || 
+           Name == "llvm.cttz") {
+         const Type* Ty = F->getReturnType();
+         std::string new_name = Name;
+         if (Ty == Type::UByteTy || Ty == Type::SByteTy)
+           new_name += ".i8";
+         else if (Ty == Type::UShortTy || Ty == Type::ShortTy)
+           new_name += ".i16";
+         else if (Ty == Type::UIntTy || Ty == Type::IntTy)
+           new_name += ".i32";
+         else if (Ty == Type::ULongTy || Ty == Type::LongTy)
+           new_name += ".i64";
+         std::cerr << "WARNING: change " << Name << " to " 
+           << new_name << "\n";
+         F->setName(new_name);
+         return true;
+       }
+       break;
+     case 'i':
+       if (Name == "llvm.isunordered") {
+         Function::const_arg_iterator ArgIt = F->arg_begin();
+         const Type* Ty = ArgIt->getType();
+         std::string new_name = Name;
+         if (Ty == Type::FloatTy)
+           new_name += ".f32";
+         else if (Ty == Type::DoubleTy)
+           new_name += ".f64";
+         std::cerr << "WARNING: change " << Name << " to " 
+           << new_name << "\n";
+         F->setName(new_name);
+         return true;
+       }
+       break;
+     case 's':
+       if (Name == "llvm.sqrt") {
+         const Type* Ty = F->getReturnType();
+         std::string new_name = Name;
+         if (Ty == Type::FloatTy)
+           new_name += ".f32";
+         else if (Ty == Type::DoubleTy) {
+           new_name += ".f64";
+         }
+         std::cerr << "WARNING: change " << Name << " to " 
+           << new_name << "\n";
+         F->setName(new_name);
+         return true;
+       }
+       break;
+     default:
+       break;
+   }
+   return false;
+ }






More information about the llvm-commits mailing list