mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
Change the ARMConstantPoolValue modifier string to an enumeration. This will
help in MC'izing the references that use them. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@118633 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
071d1c063f
commit
3a2429a86c
@ -647,7 +647,7 @@ EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) {
|
||||
// FIXME: Model the whole expression an an MCExpr and we can get rid
|
||||
// of this hasRawTextSupport() clause and just do an EmitValue().
|
||||
if (OutStreamer.hasRawTextSupport()) {
|
||||
if (ACPV->hasModifier()) OS << "(" << ACPV->getModifier() << ")";
|
||||
if (ACPV->hasModifier()) OS << "(" << ACPV->getModifierText() << ")";
|
||||
if (ACPV->getPCAdjustment() != 0) {
|
||||
OS << "-(" << MAI->getPrivateGlobalPrefix() << "PC"
|
||||
<< getFunctionNumber() << "_" << ACPV->getLabelId()
|
||||
|
@ -24,7 +24,7 @@ using namespace llvm;
|
||||
ARMConstantPoolValue::ARMConstantPoolValue(const Constant *cval, unsigned id,
|
||||
ARMCP::ARMCPKind K,
|
||||
unsigned char PCAdj,
|
||||
const char *Modif,
|
||||
ARMCP::ARMCPModifier Modif,
|
||||
bool AddCA)
|
||||
: MachineConstantPoolValue((const Type*)cval->getType()),
|
||||
CVal(cval), S(NULL), LabelId(id), Kind(K), PCAdjust(PCAdj),
|
||||
@ -33,14 +33,14 @@ ARMConstantPoolValue::ARMConstantPoolValue(const Constant *cval, unsigned id,
|
||||
ARMConstantPoolValue::ARMConstantPoolValue(LLVMContext &C,
|
||||
const char *s, unsigned id,
|
||||
unsigned char PCAdj,
|
||||
const char *Modif,
|
||||
ARMCP::ARMCPModifier Modif,
|
||||
bool AddCA)
|
||||
: MachineConstantPoolValue((const Type*)Type::getInt32Ty(C)),
|
||||
CVal(NULL), S(strdup(s)), LabelId(id), Kind(ARMCP::CPExtSymbol),
|
||||
PCAdjust(PCAdj), Modifier(Modif), AddCurrentAddress(AddCA) {}
|
||||
|
||||
ARMConstantPoolValue::ARMConstantPoolValue(const GlobalValue *gv,
|
||||
const char *Modif)
|
||||
ARMCP::ARMCPModifier Modif)
|
||||
: MachineConstantPoolValue((const Type*)Type::getInt32Ty(gv->getContext())),
|
||||
CVal(gv), S(NULL), LabelId(0), Kind(ARMCP::CPValue), PCAdjust(0),
|
||||
Modifier(Modif) {}
|
||||
@ -74,7 +74,7 @@ int ARMConstantPoolValue::getExistingMachineCPValue(MachineConstantPool *CP,
|
||||
CPV->LabelId == LabelId &&
|
||||
CPV->PCAdjust == PCAdjust &&
|
||||
CPV_streq(CPV->S, S) &&
|
||||
CPV_streq(CPV->Modifier, Modifier))
|
||||
CPV->Modifier == Modifier)
|
||||
return i;
|
||||
}
|
||||
}
|
||||
@ -100,7 +100,7 @@ ARMConstantPoolValue::hasSameValue(ARMConstantPoolValue *ACPV) {
|
||||
ACPV->CVal == CVal &&
|
||||
ACPV->PCAdjust == PCAdjust &&
|
||||
CPV_streq(ACPV->S, S) &&
|
||||
CPV_streq(ACPV->Modifier, Modifier)) {
|
||||
ACPV->Modifier == Modifier) {
|
||||
if (ACPV->LabelId == LabelId)
|
||||
return true;
|
||||
// Two PC relative constpool entries containing the same GV address or
|
||||
@ -121,7 +121,7 @@ void ARMConstantPoolValue::print(raw_ostream &O) const {
|
||||
O << CVal->getName();
|
||||
else
|
||||
O << S;
|
||||
if (Modifier) O << "(" << Modifier << ")";
|
||||
if (Modifier) O << "(" << getModifierText() << ")";
|
||||
if (PCAdjust != 0) {
|
||||
O << "-(LPC" << LabelId << "+" << (unsigned)PCAdjust;
|
||||
if (AddCurrentAddress) O << "-.";
|
||||
|
@ -15,6 +15,7 @@
|
||||
#define LLVM_TARGET_ARM_CONSTANTPOOLVALUE_H
|
||||
|
||||
#include "llvm/CodeGen/MachineConstantPool.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include <cstddef>
|
||||
|
||||
namespace llvm {
|
||||
@ -31,6 +32,15 @@ namespace ARMCP {
|
||||
CPBlockAddress,
|
||||
CPLSDA
|
||||
};
|
||||
|
||||
enum ARMCPModifier {
|
||||
no_modifier,
|
||||
TLSGD,
|
||||
GOT,
|
||||
GOTOFF,
|
||||
GOTTPOFF,
|
||||
TPOFF
|
||||
};
|
||||
}
|
||||
|
||||
/// ARMConstantPoolValue - ARM specific constantpool value. This is used to
|
||||
@ -43,26 +53,41 @@ class ARMConstantPoolValue : public MachineConstantPoolValue {
|
||||
ARMCP::ARMCPKind Kind; // Kind of constant.
|
||||
unsigned char PCAdjust; // Extra adjustment if constantpool is pc-relative.
|
||||
// 8 for ARM, 4 for Thumb.
|
||||
const char *Modifier; // GV modifier i.e. (&GV(modifier)-(LPIC+8))
|
||||
ARMCP::ARMCPModifier Modifier; // GV modifier i.e. (&GV(modifier)-(LPIC+8))
|
||||
bool AddCurrentAddress;
|
||||
|
||||
public:
|
||||
ARMConstantPoolValue(const Constant *cval, unsigned id,
|
||||
ARMCP::ARMCPKind Kind = ARMCP::CPValue,
|
||||
unsigned char PCAdj = 0, const char *Modifier = NULL,
|
||||
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, const char *Modifier = NULL,
|
||||
unsigned char PCAdj = 0,
|
||||
ARMCP::ARMCPModifier Modifier = ARMCP::no_modifier,
|
||||
bool AddCurrentAddress = false);
|
||||
ARMConstantPoolValue(const GlobalValue *GV, const char *Modifier);
|
||||
ARMConstantPoolValue(const GlobalValue *GV, ARMCP::ARMCPModifier Modifier);
|
||||
ARMConstantPoolValue();
|
||||
~ARMConstantPoolValue();
|
||||
|
||||
const GlobalValue *getGV() const;
|
||||
const char *getSymbol() const { return S; }
|
||||
const BlockAddress *getBlockAddress() const;
|
||||
const char *getModifier() const { return Modifier; }
|
||||
bool hasModifier() const { return Modifier != NULL; }
|
||||
ARMCP::ARMCPModifier getModifier() const { return Modifier; }
|
||||
const char *getModifierText() const {
|
||||
switch (Modifier) {
|
||||
default: llvm_unreachable("Unknown modifier!");
|
||||
// FIXME: Are these case sensitive? It'd be nice to lower-case all the
|
||||
// strings if that's legal.
|
||||
case ARMCP::no_modifier: return "none";
|
||||
case ARMCP::TLSGD: return "tlsgd";
|
||||
case ARMCP::GOT: return "GOT";
|
||||
case ARMCP::GOTOFF: return "GOTOFF";
|
||||
case ARMCP::GOTTPOFF: return "gottpoff";
|
||||
case ARMCP::TPOFF: return "tpoff";
|
||||
}
|
||||
}
|
||||
bool hasModifier() const { return Modifier != ARMCP::no_modifier; }
|
||||
bool mustAddCurrentAddress() const { return AddCurrentAddress; }
|
||||
unsigned getLabelId() const { return LabelId; }
|
||||
unsigned char getPCAdjustment() const { return PCAdjust; }
|
||||
|
@ -1781,7 +1781,7 @@ ARMTargetLowering::LowerToTLSGeneralDynamicModel(GlobalAddressSDNode *GA,
|
||||
unsigned ARMPCLabelIndex = AFI->createConstPoolEntryUId();
|
||||
ARMConstantPoolValue *CPV =
|
||||
new ARMConstantPoolValue(GA->getGlobal(), ARMPCLabelIndex,
|
||||
ARMCP::CPValue, PCAdj, "tlsgd", true);
|
||||
ARMCP::CPValue, PCAdj, ARMCP::TLSGD, true);
|
||||
SDValue Argument = DAG.getTargetConstantPool(CPV, PtrVT, 4);
|
||||
Argument = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, Argument);
|
||||
Argument = DAG.getLoad(PtrVT, dl, DAG.getEntryNode(), Argument,
|
||||
@ -1828,7 +1828,7 @@ ARMTargetLowering::LowerToTLSExecModels(GlobalAddressSDNode *GA,
|
||||
unsigned char PCAdj = Subtarget->isThumb() ? 4 : 8;
|
||||
ARMConstantPoolValue *CPV =
|
||||
new ARMConstantPoolValue(GA->getGlobal(), ARMPCLabelIndex,
|
||||
ARMCP::CPValue, PCAdj, "gottpoff", true);
|
||||
ARMCP::CPValue, PCAdj, ARMCP::GOTTPOFF, true);
|
||||
Offset = DAG.getTargetConstantPool(CPV, PtrVT, 4);
|
||||
Offset = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, Offset);
|
||||
Offset = DAG.getLoad(PtrVT, dl, Chain, Offset,
|
||||
@ -1844,7 +1844,7 @@ ARMTargetLowering::LowerToTLSExecModels(GlobalAddressSDNode *GA,
|
||||
false, false, 0);
|
||||
} else {
|
||||
// local exec model
|
||||
ARMConstantPoolValue *CPV = new ARMConstantPoolValue(GV, "tpoff");
|
||||
ARMConstantPoolValue *CPV = new ARMConstantPoolValue(GV, ARMCP::TPOFF);
|
||||
Offset = DAG.getTargetConstantPool(CPV, PtrVT, 4);
|
||||
Offset = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, Offset);
|
||||
Offset = DAG.getLoad(PtrVT, dl, Chain, Offset,
|
||||
@ -1880,7 +1880,7 @@ SDValue ARMTargetLowering::LowerGlobalAddressELF(SDValue Op,
|
||||
if (RelocM == Reloc::PIC_) {
|
||||
bool UseGOTOFF = GV->hasLocalLinkage() || GV->hasHiddenVisibility();
|
||||
ARMConstantPoolValue *CPV =
|
||||
new ARMConstantPoolValue(GV, UseGOTOFF ? "GOTOFF" : "GOT");
|
||||
new ARMConstantPoolValue(GV, UseGOTOFF ? ARMCP::GOTOFF : ARMCP::GOT);
|
||||
SDValue CPAddr = DAG.getTargetConstantPool(CPV, PtrVT, 4);
|
||||
CPAddr = DAG.getNode(ARMISD::Wrapper, dl, MVT::i32, CPAddr);
|
||||
SDValue Result = DAG.getLoad(PtrVT, dl, DAG.getEntryNode(),
|
||||
|
Loading…
Reference in New Issue
Block a user