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; + } _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits