mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-06 04:31:08 +00:00
e86bf519e1
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
106 lines
3.4 KiB
C++
106 lines
3.4 KiB
C++
//===-- 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;
|
|
}
|