From 4dd9b091cceaa62f72ed8370f8a946fbe474d8a2 Mon Sep 17 00:00:00 2001 From: Bill Wendling Date: Thu, 29 Sep 2011 23:48:44 +0000 Subject: Support creating a constant pool value for a machine basic block. This is used when we want to take the address of a machine basic block, but it's not associated with a BB in LLVM IR. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@140823 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/ARM/ARMConstantPoolValue.cpp | 18 ++++++++++++++++++ lib/Target/ARM/ARMConstantPoolValue.h | 14 ++++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/lib/Target/ARM/ARMConstantPoolValue.cpp b/lib/Target/ARM/ARMConstantPoolValue.cpp index 476d59f..dccdefb 100644 --- a/lib/Target/ARM/ARMConstantPoolValue.cpp +++ b/lib/Target/ARM/ARMConstantPoolValue.cpp @@ -17,6 +17,7 @@ #include "llvm/Constants.h" #include "llvm/GlobalValue.h" #include "llvm/Type.h" +#include "llvm/CodeGen/MachineBasicBlock.h" #include "llvm/Support/raw_ostream.h" #include using namespace llvm; @@ -31,6 +32,17 @@ ARMConstantPoolValue::ARMConstantPoolValue(const Constant *cval, unsigned id, Modifier(Modif), AddCurrentAddress(AddCA) {} ARMConstantPoolValue::ARMConstantPoolValue(LLVMContext &C, + const MachineBasicBlock *mbb, + unsigned id, + ARMCP::ARMCPKind K, + unsigned char PCAdj, + ARMCP::ARMCPModifier Modif, + bool AddCA) + : MachineConstantPoolValue((Type*)Type::getInt8PtrTy(C)), + CVal(NULL), MBB(mbb), S(NULL), LabelId(id), Kind(K), PCAdjust(PCAdj), + Modifier(Modif), AddCurrentAddress(AddCA) {} + +ARMConstantPoolValue::ARMConstantPoolValue(LLVMContext &C, const char *s, unsigned id, unsigned char PCAdj, ARMCP::ARMCPModifier Modif, @@ -53,6 +65,10 @@ const BlockAddress *ARMConstantPoolValue::getBlockAddress() const { return dyn_cast_or_null(CVal); } +const MachineBasicBlock *ARMConstantPoolValue::getMBB() const { + return MBB; +} + static bool CPV_streq(const char *S1, const char *S2) { if (S1 == S2) return true; @@ -119,6 +135,8 @@ void ARMConstantPoolValue::dump() const { void ARMConstantPoolValue::print(raw_ostream &O) const { if (CVal) O << CVal->getName(); + else if (MBB) + O << ""; else O << S; if (Modifier) O << "(" << getModifierText() << ")"; diff --git a/lib/Target/ARM/ARMConstantPoolValue.h b/lib/Target/ARM/ARMConstantPoolValue.h index 5749f1e..1a3df3c 100644 --- a/lib/Target/ARM/ARMConstantPoolValue.h +++ b/lib/Target/ARM/ARMConstantPoolValue.h @@ -20,17 +20,19 @@ namespace llvm { -class Constant; class BlockAddress; +class Constant; class GlobalValue; class LLVMContext; +class MachineBasicBlock; namespace ARMCP { enum ARMCPKind { CPValue, CPExtSymbol, CPBlockAddress, - CPLSDA + CPLSDA, + CPMachineBasicBlock }; enum ARMCPModifier { @@ -48,6 +50,7 @@ namespace ARMCP { /// instruction and the constant being loaded, i.e. (&GV-(LPIC+8)). class ARMConstantPoolValue : public MachineConstantPoolValue { const Constant *CVal; // Constant being loaded. + const MachineBasicBlock *MBB; // MachineBasicBlock being loaded. const char *S; // ExtSymbol being loaded. unsigned LabelId; // Label id of the load. ARMCP::ARMCPKind Kind; // Kind of constant. @@ -62,6 +65,11 @@ public: unsigned char PCAdj = 0, ARMCP::ARMCPModifier Modifier = ARMCP::no_modifier, bool AddCurrentAddress = false); + ARMConstantPoolValue(LLVMContext &C, const MachineBasicBlock *mbb,unsigned id, + ARMCP::ARMCPKind Kind = ARMCP::CPValue, + unsigned char PCAdj = 0, + ARMCP::ARMCPModifier Modifier = ARMCP::no_modifier, + bool AddCurrentAddress = false); ARMConstantPoolValue(LLVMContext &C, const char *s, unsigned id, unsigned char PCAdj = 0, ARMCP::ARMCPModifier Modifier = ARMCP::no_modifier, @@ -73,6 +81,7 @@ public: const GlobalValue *getGV() const; const char *getSymbol() const { return S; } const BlockAddress *getBlockAddress() const; + const MachineBasicBlock *getMBB() const; ARMCP::ARMCPModifier getModifier() const { return Modifier; } const char *getModifierText() const { switch (Modifier) { @@ -95,6 +104,7 @@ public: bool isExtSymbol() const { return Kind == ARMCP::CPExtSymbol; } bool isBlockAddress() { return Kind == ARMCP::CPBlockAddress; } bool isLSDA() { return Kind == ARMCP::CPLSDA; } + bool isMachineBasicBlock() { return Kind == ARMCP::CPMachineBasicBlock; } virtual unsigned getRelocationInfo() const { return 2; } -- cgit v1.1