mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-12 01:25:49 +00:00
unify the paths for external symbols and global variables:
2 files changed, 48 insertions(+), 83 deletions(-) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@95599 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -46,42 +46,40 @@ MCSymbol *X86MCInstLower::GetPICBaseSymbol() const {
|
|||||||
getPICBaseSymbol(AsmPrinter.MF, Ctx);
|
getPICBaseSymbol(AsmPrinter.MF, Ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// LowerGlobalAddressOperand - Lower an MO_GlobalAddress operand to an
|
/// GetSymbolFromOperand - Lower an MO_GlobalAddress or MO_ExternalSymbol
|
||||||
/// MCOperand.
|
/// operand to an MCSymbol.
|
||||||
MCSymbol *X86MCInstLower::
|
MCSymbol *X86MCInstLower::
|
||||||
GetGlobalAddressSymbol(const MachineOperand &MO) const {
|
GetSymbolFromOperand(const MachineOperand &MO) const {
|
||||||
const GlobalValue *GV = MO.getGlobal();
|
assert((MO.isGlobal() || MO.isSymbol()) && "Isn't a symbol reference");
|
||||||
|
|
||||||
bool isImplicitlyPrivate = false;
|
|
||||||
if (MO.getTargetFlags() == X86II::MO_DARWIN_STUB ||
|
|
||||||
MO.getTargetFlags() == X86II::MO_DARWIN_NONLAZY ||
|
|
||||||
MO.getTargetFlags() == X86II::MO_DARWIN_NONLAZY_PIC_BASE ||
|
|
||||||
MO.getTargetFlags() == X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE)
|
|
||||||
isImplicitlyPrivate = true;
|
|
||||||
|
|
||||||
SmallString<128> Name;
|
SmallString<128> Name;
|
||||||
Mang->getNameWithPrefix(Name, GV, isImplicitlyPrivate);
|
|
||||||
|
|
||||||
if (getSubtarget().isTargetCygMing()) {
|
if (MO.isGlobal()) {
|
||||||
X86COFFMachineModuleInfo &COFFMMI =
|
bool isImplicitlyPrivate = false;
|
||||||
AsmPrinter.MMI->getObjFileInfo<X86COFFMachineModuleInfo>();
|
if (MO.getTargetFlags() == X86II::MO_DARWIN_STUB ||
|
||||||
COFFMMI.DecorateCygMingName(Name, GV, *AsmPrinter.TM.getTargetData());
|
MO.getTargetFlags() == X86II::MO_DARWIN_NONLAZY ||
|
||||||
|
MO.getTargetFlags() == X86II::MO_DARWIN_NONLAZY_PIC_BASE ||
|
||||||
|
MO.getTargetFlags() == X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE)
|
||||||
|
isImplicitlyPrivate = true;
|
||||||
|
|
||||||
|
const GlobalValue *GV = MO.getGlobal();
|
||||||
|
Mang->getNameWithPrefix(Name, GV, isImplicitlyPrivate);
|
||||||
|
|
||||||
|
if (getSubtarget().isTargetCygMing()) {
|
||||||
|
X86COFFMachineModuleInfo &COFFMMI =
|
||||||
|
AsmPrinter.MMI->getObjFileInfo<X86COFFMachineModuleInfo>();
|
||||||
|
COFFMMI.DecorateCygMingName(Name, GV, *AsmPrinter.TM.getTargetData());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
assert(MO.isSymbol());
|
||||||
|
Name += AsmPrinter.MAI->getGlobalPrefix();
|
||||||
|
Name += MO.getSymbolName();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If the target flags on the operand changes the name of the symbol, do that
|
||||||
|
// before we return the symbol.
|
||||||
switch (MO.getTargetFlags()) {
|
switch (MO.getTargetFlags()) {
|
||||||
default: llvm_unreachable("Unknown target flag on GV operand");
|
default: break;
|
||||||
case X86II::MO_NO_FLAG: // These don't modify the symbol name.
|
|
||||||
case X86II::MO_PIC_BASE_OFFSET:
|
|
||||||
case X86II::MO_TLSGD:
|
|
||||||
case X86II::MO_GOTTPOFF:
|
|
||||||
case X86II::MO_INDNTPOFF:
|
|
||||||
case X86II::MO_TPOFF:
|
|
||||||
case X86II::MO_NTPOFF:
|
|
||||||
case X86II::MO_GOTPCREL:
|
|
||||||
case X86II::MO_GOT:
|
|
||||||
case X86II::MO_GOTOFF:
|
|
||||||
case X86II::MO_PLT:
|
|
||||||
break;
|
|
||||||
case X86II::MO_DLLIMPORT: {
|
case X86II::MO_DLLIMPORT: {
|
||||||
// Handle dllimport linkage.
|
// Handle dllimport linkage.
|
||||||
const char *Prefix = "__imp_";
|
const char *Prefix = "__imp_";
|
||||||
@@ -94,71 +92,39 @@ GetGlobalAddressSymbol(const MachineOperand &MO) const {
|
|||||||
MCSymbol *Sym = Ctx.GetOrCreateSymbol(Name.str());
|
MCSymbol *Sym = Ctx.GetOrCreateSymbol(Name.str());
|
||||||
|
|
||||||
MCSymbol *&StubSym = getMachOMMI().getGVStubEntry(Sym);
|
MCSymbol *&StubSym = getMachOMMI().getGVStubEntry(Sym);
|
||||||
if (StubSym == 0)
|
if (StubSym == 0) {
|
||||||
StubSym = AsmPrinter.GetGlobalValueSymbol(GV);
|
assert(MO.isGlobal() && "Extern symbol not handled yet");
|
||||||
|
StubSym = AsmPrinter.GetGlobalValueSymbol(MO.getGlobal());
|
||||||
|
}
|
||||||
return Sym;
|
return Sym;
|
||||||
}
|
}
|
||||||
case X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE: {
|
case X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE: {
|
||||||
Name += "$non_lazy_ptr";
|
Name += "$non_lazy_ptr";
|
||||||
MCSymbol *Sym = Ctx.GetOrCreateSymbol(Name.str());
|
MCSymbol *Sym = Ctx.GetOrCreateSymbol(Name.str());
|
||||||
MCSymbol *&StubSym = getMachOMMI().getHiddenGVStubEntry(Sym);
|
MCSymbol *&StubSym = getMachOMMI().getHiddenGVStubEntry(Sym);
|
||||||
if (StubSym == 0)
|
|
||||||
StubSym = AsmPrinter.GetGlobalValueSymbol(GV);
|
|
||||||
return Sym;
|
|
||||||
}
|
|
||||||
case X86II::MO_DARWIN_STUB: {
|
|
||||||
Name += "$stub";
|
|
||||||
MCSymbol *Sym = Ctx.GetOrCreateSymbol(Name.str());
|
|
||||||
MCSymbol *&StubSym = getMachOMMI().getFnStubEntry(Sym);
|
|
||||||
if (StubSym == 0)
|
|
||||||
StubSym = AsmPrinter.GetGlobalValueSymbol(GV);
|
|
||||||
return Sym;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return Ctx.GetOrCreateSymbol(Name.str());
|
|
||||||
}
|
|
||||||
|
|
||||||
MCSymbol *X86MCInstLower::
|
|
||||||
GetExternalSymbolSymbol(const MachineOperand &MO) const {
|
|
||||||
SmallString<128> Name;
|
|
||||||
Name += AsmPrinter.MAI->getGlobalPrefix();
|
|
||||||
Name += MO.getSymbolName();
|
|
||||||
|
|
||||||
switch (MO.getTargetFlags()) {
|
|
||||||
default: llvm_unreachable("Unknown target flag on GV operand");
|
|
||||||
case X86II::MO_NO_FLAG: // These don't modify the symbol name.
|
|
||||||
case X86II::MO_GOT_ABSOLUTE_ADDRESS: // Doesn't modify symbol name.
|
|
||||||
case X86II::MO_PIC_BASE_OFFSET:
|
|
||||||
case X86II::MO_TLSGD:
|
|
||||||
case X86II::MO_GOTTPOFF:
|
|
||||||
case X86II::MO_INDNTPOFF:
|
|
||||||
case X86II::MO_TPOFF:
|
|
||||||
case X86II::MO_NTPOFF:
|
|
||||||
case X86II::MO_GOTPCREL:
|
|
||||||
case X86II::MO_GOT:
|
|
||||||
case X86II::MO_GOTOFF:
|
|
||||||
case X86II::MO_PLT:
|
|
||||||
break;
|
|
||||||
case X86II::MO_DLLIMPORT: {
|
|
||||||
// Handle dllimport linkage.
|
|
||||||
const char *Prefix = "__imp_";
|
|
||||||
Name.insert(Name.begin(), Prefix, Prefix+strlen(Prefix));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case X86II::MO_DARWIN_STUB: {
|
|
||||||
Name += "$stub";
|
|
||||||
MCSymbol *Sym = Ctx.GetOrCreateSymbol(Name.str());
|
|
||||||
MCSymbol *&StubSym = getMachOMMI().getFnStubEntry(Sym);
|
|
||||||
|
|
||||||
if (StubSym == 0) {
|
if (StubSym == 0) {
|
||||||
|
assert(MO.isGlobal() && "Extern symbol not handled yet");
|
||||||
|
StubSym = AsmPrinter.GetGlobalValueSymbol(MO.getGlobal());
|
||||||
|
}
|
||||||
|
return Sym;
|
||||||
|
}
|
||||||
|
case X86II::MO_DARWIN_STUB: {
|
||||||
|
Name += "$stub";
|
||||||
|
MCSymbol *Sym = Ctx.GetOrCreateSymbol(Name.str());
|
||||||
|
MCSymbol *&StubSym = getMachOMMI().getFnStubEntry(Sym);
|
||||||
|
if (StubSym)
|
||||||
|
return Sym;
|
||||||
|
|
||||||
|
if (MO.isGlobal()) {
|
||||||
|
StubSym = AsmPrinter.GetGlobalValueSymbol(MO.getGlobal());
|
||||||
|
} else {
|
||||||
Name.erase(Name.end()-5, Name.end());
|
Name.erase(Name.end()-5, Name.end());
|
||||||
StubSym = Ctx.GetOrCreateSymbol(Name.str());
|
StubSym = Ctx.GetOrCreateSymbol(Name.str());
|
||||||
}
|
}
|
||||||
return Sym;
|
return Sym;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Ctx.GetOrCreateSymbol(Name.str());
|
return Ctx.GetOrCreateSymbol(Name.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -270,10 +236,10 @@ void X86MCInstLower::Lower(const MachineInstr *MI, MCInst &OutMI) const {
|
|||||||
MO.getMBB()->getSymbol(Ctx), Ctx));
|
MO.getMBB()->getSymbol(Ctx), Ctx));
|
||||||
break;
|
break;
|
||||||
case MachineOperand::MO_GlobalAddress:
|
case MachineOperand::MO_GlobalAddress:
|
||||||
MCOp = LowerSymbolOperand(MO, GetGlobalAddressSymbol(MO));
|
MCOp = LowerSymbolOperand(MO, GetSymbolFromOperand(MO));
|
||||||
break;
|
break;
|
||||||
case MachineOperand::MO_ExternalSymbol:
|
case MachineOperand::MO_ExternalSymbol:
|
||||||
MCOp = LowerSymbolOperand(MO, GetExternalSymbolSymbol(MO));
|
MCOp = LowerSymbolOperand(MO, GetSymbolFromOperand(MO));
|
||||||
break;
|
break;
|
||||||
case MachineOperand::MO_JumpTableIndex:
|
case MachineOperand::MO_JumpTableIndex:
|
||||||
MCOp = LowerSymbolOperand(MO, AsmPrinter.GetJTISymbol(MO.getIndex()));
|
MCOp = LowerSymbolOperand(MO, AsmPrinter.GetJTISymbol(MO.getIndex()));
|
||||||
@@ -432,7 +398,7 @@ void X86AsmPrinter::EmitInstruction(const MachineInstr *MI) {
|
|||||||
OutStreamer.EmitLabel(DotSym);
|
OutStreamer.EmitLabel(DotSym);
|
||||||
|
|
||||||
// Now that we have emitted the label, lower the complex operand expression.
|
// Now that we have emitted the label, lower the complex operand expression.
|
||||||
MCSymbol *OpSym = MCInstLowering.GetExternalSymbolSymbol(MI->getOperand(2));
|
MCSymbol *OpSym = MCInstLowering.GetSymbolFromOperand(MI->getOperand(2));
|
||||||
|
|
||||||
const MCExpr *DotExpr = MCSymbolRefExpr::Create(DotSym, OutContext);
|
const MCExpr *DotExpr = MCSymbolRefExpr::Create(DotSym, OutContext);
|
||||||
const MCExpr *PICBase =
|
const MCExpr *PICBase =
|
||||||
|
@@ -39,8 +39,7 @@ public:
|
|||||||
|
|
||||||
MCSymbol *GetPICBaseSymbol() const;
|
MCSymbol *GetPICBaseSymbol() const;
|
||||||
|
|
||||||
MCSymbol *GetGlobalAddressSymbol(const MachineOperand &MO) const;
|
MCSymbol *GetSymbolFromOperand(const MachineOperand &MO) const;
|
||||||
MCSymbol *GetExternalSymbolSymbol(const MachineOperand &MO) const;
|
|
||||||
MCOperand LowerSymbolOperand(const MachineOperand &MO, MCSymbol *Sym) const;
|
MCOperand LowerSymbolOperand(const MachineOperand &MO, MCSymbol *Sym) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
Reference in New Issue
Block a user