diff options
author | Reid Spencer <rspencer@reidspencer.com> | 2006-01-16 21:06:01 +0000 |
---|---|---|
committer | Reid Spencer <rspencer@reidspencer.com> | 2006-01-16 21:06:01 +0000 |
commit | e86bf519e1ea57a84d37422ec364f89c322e3ef4 (patch) | |
tree | 297da20423cca7cd83e39f79aa03b80fcaf281bb /lib | |
parent | 84a0605feb92b085b5cf4758b5b14d632fdd8974 (diff) |
For 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).
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25365 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/VMCore/AutoUpgrade.cpp | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/lib/VMCore/AutoUpgrade.cpp b/lib/VMCore/AutoUpgrade.cpp new file mode 100644 index 0000000000..46794256c2 --- /dev/null +++ b/lib/VMCore/AutoUpgrade.cpp @@ -0,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; +} |