1 //===-- MipsConstantIslandPass.cpp - Emit Pc Relative loads----------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // 11 // This pass is used to make Pc relative loads of constants. 12 // For now, only Mips16 will use this. While it has the same name and 13 // uses many ideas from the LLVM ARM Constant Island Pass, it's not intended 14 // to reuse any of the code from the ARM version. 15 // 16 // Loading constants inline is expensive on Mips16 and it's in general better 17 // to place the constant nearby in code space and then it can be loaded with a 18 // simple 16 bit load instruction. 19 // 20 // The constants can be not just numbers but addresses of functions and labels. 21 // This can be particularly helpful in static relocation mode for embedded 22 // non linux targets. 23 // 24 // 25 26 #define DEBUG_TYPE "mips-constant-islands" 27 28 #include "Mips.h" 29 #include "MCTargetDesc/MipsBaseInfo.h" 30 #include "MipsTargetMachine.h" 31 #include "llvm/ADT/Statistic.h" 32 #include "llvm/CodeGen/MachineFunctionPass.h" 33 #include "llvm/CodeGen/MachineInstrBuilder.h" 34 #include "llvm/IR/Function.h" 35 #include "llvm/Support/CommandLine.h" 36 #include "llvm/Support/MathExtras.h" 37 #include "llvm/Target/TargetInstrInfo.h" 38 #include "llvm/Target/TargetMachine.h" 39 #include "llvm/Target/TargetRegisterInfo.h" 40 41 using namespace llvm; 42 43 namespace { 44 typedef MachineBasicBlock::iterator Iter; 45 typedef MachineBasicBlock::reverse_iterator ReverseIter; 46 47 class MipsConstantIslands : public MachineFunctionPass { 48 49 public: 50 static char ID; 51 MipsConstantIslands(TargetMachine &tm) 52 : MachineFunctionPass(ID), TM(tm), 53 IsPIC(TM.getRelocationModel() == Reloc::PIC_), 54 ABI(TM.getSubtarget<MipsSubtarget>().getTargetABI()) {} 55 56 virtual const char *getPassName() const { 57 return "Mips Constant Islands"; 58 } 59 60 bool runOnMachineFunction(MachineFunction &F); 61 62 private: 63 const TargetMachine &TM; 64 bool IsPIC; 65 unsigned ABI; 66 }; 67 68 char MipsConstantIslands::ID = 0; 69 } // end of anonymous namespace 70 71 /// createMipsLongBranchPass - Returns a pass that converts branches to long 72 /// branches. 73 FunctionPass *llvm::createMipsConstantIslandPass(MipsTargetMachine &tm) { 74 return new MipsConstantIslands(tm); 75 } 76 77 bool MipsConstantIslands::runOnMachineFunction(MachineFunction &F) { 78 // The intention is for this to be a mips16 only pass for now 79 // FIXME: 80 // if (!TM.getSubtarget<MipsSubtarget>().inMips16Mode()) 81 // return false; 82 return false; 83 } 84 85