2013-02-27 12:20:14 +08:00
|
|
|
//===-- MipsConstantIslandPass.cpp - Emit Pc Relative loads----------------===//
|
2013-02-27 11:33:58 +08:00
|
|
|
//
|
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
|
|
|
// This file is distributed under the University of Illinois Open Source
|
|
|
|
// License. See LICENSE.TXT for details.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// This pass is used to make Pc relative loads of constants.
|
|
|
|
// For now, only Mips16 will use this. While it has the same name and
|
|
|
|
// uses many ideas from the LLVM ARM Constant Island Pass, it's not intended
|
|
|
|
// to reuse any of the code from the ARM version.
|
|
|
|
//
|
|
|
|
// Loading constants inline is expensive on Mips16 and it's in general better
|
|
|
|
// to place the constant nearby in code space and then it can be loaded with a
|
|
|
|
// simple 16 bit load instruction.
|
|
|
|
//
|
|
|
|
// The constants can be not just numbers but addresses of functions and labels.
|
|
|
|
// This can be particularly helpful in static relocation mode for embedded
|
|
|
|
// non linux targets.
|
|
|
|
//
|
|
|
|
//
|
|
|
|
|
|
|
|
#define DEBUG_TYPE "mips-constant-islands"
|
|
|
|
|
|
|
|
#include "Mips.h"
|
|
|
|
#include "MCTargetDesc/MipsBaseInfo.h"
|
|
|
|
#include "MipsTargetMachine.h"
|
|
|
|
#include "llvm/ADT/Statistic.h"
|
|
|
|
#include "llvm/CodeGen/MachineFunctionPass.h"
|
|
|
|
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
|
|
|
#include "llvm/IR/Function.h"
|
|
|
|
#include "llvm/Support/CommandLine.h"
|
|
|
|
#include "llvm/Support/MathExtras.h"
|
|
|
|
#include "llvm/Target/TargetInstrInfo.h"
|
|
|
|
#include "llvm/Target/TargetMachine.h"
|
|
|
|
#include "llvm/Target/TargetRegisterInfo.h"
|
|
|
|
|
|
|
|
using namespace llvm;
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
typedef MachineBasicBlock::iterator Iter;
|
|
|
|
typedef MachineBasicBlock::reverse_iterator ReverseIter;
|
|
|
|
|
|
|
|
class MipsConstantIslands : public MachineFunctionPass {
|
|
|
|
|
|
|
|
public:
|
|
|
|
static char ID;
|
|
|
|
MipsConstantIslands(TargetMachine &tm)
|
|
|
|
: MachineFunctionPass(ID), TM(tm),
|
|
|
|
TII(static_cast<const MipsInstrInfo*>(tm.getInstrInfo())),
|
|
|
|
IsPIC(TM.getRelocationModel() == Reloc::PIC_),
|
|
|
|
ABI(TM.getSubtarget<MipsSubtarget>().getTargetABI()) {}
|
|
|
|
|
|
|
|
virtual const char *getPassName() const {
|
|
|
|
return "Mips Constant Islands";
|
|
|
|
}
|
|
|
|
|
|
|
|
bool runOnMachineFunction(MachineFunction &F);
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
|
|
|
|
|
|
const TargetMachine &TM;
|
|
|
|
const MipsInstrInfo *TII;
|
|
|
|
bool IsPIC;
|
|
|
|
unsigned ABI;
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
char MipsConstantIslands::ID = 0;
|
|
|
|
} // end of anonymous namespace
|
|
|
|
|
|
|
|
/// createMipsLongBranchPass - Returns a pass that converts branches to long
|
|
|
|
/// branches.
|
|
|
|
FunctionPass *llvm::createMipsConstantIslandPass(MipsTargetMachine &tm) {
|
|
|
|
return new MipsConstantIslands(tm);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool MipsConstantIslands::runOnMachineFunction(MachineFunction &F) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|