mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 04:32:44 +01:00
Use MCSymbols for FastISel.
The summary is that it moves the mangling earlier and replaces a few calls to .addExternalSymbol with addSym. I originally wanted to replace all the uses of addExternalSymbol with addSym, but noticed it was a lot of work and doesn't need to be done all at once. llvm-svn: 240395
This commit is contained in:
parent
a174e575c4
commit
5613e38017
@ -69,7 +69,7 @@ public:
|
||||
unsigned NumFixedArgs;
|
||||
CallingConv::ID CallConv;
|
||||
const Value *Callee;
|
||||
const char *SymName;
|
||||
MCSymbol *Symbol;
|
||||
ArgListTy Args;
|
||||
ImmutableCallSite *CS;
|
||||
MachineInstr *Call;
|
||||
@ -88,7 +88,7 @@ public:
|
||||
: RetTy(nullptr), RetSExt(false), RetZExt(false), IsVarArg(false),
|
||||
IsInReg(false), DoesNotReturn(false), IsReturnValueUsed(true),
|
||||
IsTailCall(false), NumFixedArgs(-1), CallConv(CallingConv::C),
|
||||
Callee(nullptr), SymName(nullptr), CS(nullptr), Call(nullptr),
|
||||
Callee(nullptr), Symbol(nullptr), CS(nullptr), Call(nullptr),
|
||||
ResultReg(0), NumResultRegs(0), IsPatchPoint(false) {}
|
||||
|
||||
CallLoweringInfo &setCallee(Type *ResultTy, FunctionType *FuncTy,
|
||||
@ -114,12 +114,12 @@ public:
|
||||
}
|
||||
|
||||
CallLoweringInfo &setCallee(Type *ResultTy, FunctionType *FuncTy,
|
||||
const char *Target, ArgListTy &&ArgsList,
|
||||
MCSymbol *Target, ArgListTy &&ArgsList,
|
||||
ImmutableCallSite &Call,
|
||||
unsigned FixedArgs = ~0U) {
|
||||
RetTy = ResultTy;
|
||||
Callee = Call.getCalledValue();
|
||||
SymName = Target;
|
||||
Symbol = Target;
|
||||
|
||||
IsInReg = Call.paramHasAttr(0, Attribute::InReg);
|
||||
DoesNotReturn = Call.doesNotReturn();
|
||||
@ -148,11 +148,16 @@ public:
|
||||
return *this;
|
||||
}
|
||||
|
||||
CallLoweringInfo &setCallee(CallingConv::ID CC, Type *ResultTy,
|
||||
CallLoweringInfo &setCallee(const DataLayout &DL, MCContext &Ctx,
|
||||
CallingConv::ID CC, Type *ResultTy,
|
||||
const char *Target, ArgListTy &&ArgsList,
|
||||
unsigned FixedArgs = ~0U);
|
||||
|
||||
CallLoweringInfo &setCallee(CallingConv::ID CC, Type *ResultTy,
|
||||
MCSymbol *Target, ArgListTy &&ArgsList,
|
||||
unsigned FixedArgs = ~0U) {
|
||||
RetTy = ResultTy;
|
||||
SymName = Target;
|
||||
Symbol = Target;
|
||||
CallConv = CC;
|
||||
Args = std::move(ArgsList);
|
||||
NumFixedArgs = (FixedArgs == ~0U) ? Args.size() : FixedArgs;
|
||||
@ -504,7 +509,9 @@ protected:
|
||||
|
||||
CmpInst::Predicate optimizeCmpPredicate(const CmpInst *CI) const;
|
||||
|
||||
bool lowerCallTo(const CallInst *CI, const char *SymName, unsigned NumArgs);
|
||||
bool lowerCallTo(const CallInst *CI, MCSymbol *Symbol, unsigned NumArgs);
|
||||
bool lowerCallTo(const CallInst *CI, const char *SymbolName,
|
||||
unsigned NumArgs);
|
||||
bool lowerCallTo(CallLoweringInfo &CLI);
|
||||
|
||||
bool isCommutativeIntrinsic(IntrinsicInst const *II) {
|
||||
|
@ -185,8 +185,9 @@ public:
|
||||
return *this;
|
||||
}
|
||||
|
||||
const MachineInstrBuilder &addSym(MCSymbol *Sym) const {
|
||||
MI->addOperand(*MF, MachineOperand::CreateMCSymbol(Sym));
|
||||
const MachineInstrBuilder &addSym(MCSymbol *Sym,
|
||||
unsigned char TargetFlags = 0) const {
|
||||
MI->addOperand(*MF, MachineOperand::CreateMCSymbol(Sym, TargetFlags));
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
@ -705,10 +705,12 @@ public:
|
||||
return Op;
|
||||
}
|
||||
|
||||
static MachineOperand CreateMCSymbol(MCSymbol *Sym) {
|
||||
static MachineOperand CreateMCSymbol(MCSymbol *Sym,
|
||||
unsigned char TargetFlags = 0) {
|
||||
MachineOperand Op(MachineOperand::MO_MCSymbol);
|
||||
Op.Contents.Sym = Sym;
|
||||
Op.setOffset(0);
|
||||
Op.setTargetFlags(TargetFlags);
|
||||
return Op;
|
||||
}
|
||||
|
||||
|
@ -51,6 +51,10 @@ public:
|
||||
/// Print the appropriate prefix and the specified global variable's name.
|
||||
/// If the global variable doesn't have a name, this fills in a unique name
|
||||
/// for the global.
|
||||
|
||||
static void getNameWithPrefix(SmallVectorImpl<char> &OutName,
|
||||
const Twine &GVName, const DataLayout &DL);
|
||||
|
||||
void getNameWithPrefix(raw_ostream &OS, const GlobalValue *GV,
|
||||
bool CannotUsePrivateLabel) const;
|
||||
void getNameWithPrefix(SmallVectorImpl<char> &OutName, const GlobalValue *GV,
|
||||
|
@ -59,6 +59,7 @@
|
||||
#include "llvm/IR/GlobalVariable.h"
|
||||
#include "llvm/IR/Instructions.h"
|
||||
#include "llvm/IR/IntrinsicInst.h"
|
||||
#include "llvm/IR/Mangler.h"
|
||||
#include "llvm/IR/Operator.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
@ -701,6 +702,15 @@ bool FastISel::lowerCallOperands(const CallInst *CI, unsigned ArgIdx,
|
||||
return lowerCallTo(CLI);
|
||||
}
|
||||
|
||||
FastISel::CallLoweringInfo &FastISel::CallLoweringInfo::setCallee(
|
||||
const DataLayout &DL, MCContext &Ctx, CallingConv::ID CC, Type *ResultTy,
|
||||
const char *Target, ArgListTy &&ArgsList, unsigned FixedArgs) {
|
||||
SmallString<32> MangledName;
|
||||
Mangler::getNameWithPrefix(MangledName, Target, DL);
|
||||
MCSymbol *Sym = Ctx.getOrCreateSymbol(MangledName);
|
||||
return setCallee(CC, ResultTy, Sym, std::move(ArgsList), FixedArgs);
|
||||
}
|
||||
|
||||
bool FastISel::selectPatchpoint(const CallInst *I) {
|
||||
// void|i64 @llvm.experimental.patchpoint.void|i64(i64 <id>,
|
||||
// i32 <numBytes>,
|
||||
@ -856,6 +866,15 @@ static AttributeSet getReturnAttrs(FastISel::CallLoweringInfo &CLI) {
|
||||
|
||||
bool FastISel::lowerCallTo(const CallInst *CI, const char *SymName,
|
||||
unsigned NumArgs) {
|
||||
MCContext &Ctx = MF->getContext();
|
||||
SmallString<32> MangledName;
|
||||
Mangler::getNameWithPrefix(MangledName, SymName, DL);
|
||||
MCSymbol *Sym = Ctx.getOrCreateSymbol(MangledName);
|
||||
return lowerCallTo(CI, Sym, NumArgs);
|
||||
}
|
||||
|
||||
bool FastISel::lowerCallTo(const CallInst *CI, MCSymbol *Symbol,
|
||||
unsigned NumArgs) {
|
||||
ImmutableCallSite CS(CI);
|
||||
|
||||
PointerType *PT = cast<PointerType>(CS.getCalledValue()->getType());
|
||||
@ -880,7 +899,7 @@ bool FastISel::lowerCallTo(const CallInst *CI, const char *SymName,
|
||||
}
|
||||
|
||||
CallLoweringInfo CLI;
|
||||
CLI.setCallee(RetTy, FTy, SymName, std::move(Args), CS, NumArgs);
|
||||
CLI.setCallee(RetTy, FTy, Symbol, std::move(Args), CS, NumArgs);
|
||||
|
||||
return lowerCallTo(CLI);
|
||||
}
|
||||
|
@ -20,9 +20,9 @@
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
using namespace llvm;
|
||||
|
||||
static void getNameWithPrefixx(raw_ostream &OS, const Twine &GVName,
|
||||
Mangler::ManglerPrefixTy PrefixTy,
|
||||
const DataLayout &DL, char Prefix) {
|
||||
static void getNameWithPrefixImpl(raw_ostream &OS, const Twine &GVName,
|
||||
Mangler::ManglerPrefixTy PrefixTy,
|
||||
const DataLayout &DL, char Prefix) {
|
||||
SmallString<256> TmpData;
|
||||
StringRef Name = GVName.toStringRef(TmpData);
|
||||
assert(!Name.empty() && "getNameWithPrefix requires non-empty name");
|
||||
@ -49,14 +49,22 @@ static void getNameWithPrefixx(raw_ostream &OS, const Twine &GVName,
|
||||
void Mangler::getNameWithPrefix(raw_ostream &OS, const Twine &GVName,
|
||||
ManglerPrefixTy PrefixTy) const {
|
||||
char Prefix = DL->getGlobalPrefix();
|
||||
return getNameWithPrefixx(OS, GVName, PrefixTy, *DL, Prefix);
|
||||
return getNameWithPrefixImpl(OS, GVName, PrefixTy, *DL, Prefix);
|
||||
}
|
||||
|
||||
void Mangler::getNameWithPrefix(SmallVectorImpl<char> &OutName,
|
||||
const Twine &GVName, const DataLayout &DL) {
|
||||
raw_svector_ostream OS(OutName);
|
||||
char Prefix = DL.getGlobalPrefix();
|
||||
return getNameWithPrefixImpl(OS, GVName, Mangler::Default, DL, Prefix);
|
||||
}
|
||||
|
||||
void Mangler::getNameWithPrefix(SmallVectorImpl<char> &OutName,
|
||||
const Twine &GVName,
|
||||
ManglerPrefixTy PrefixTy) const {
|
||||
raw_svector_ostream OS(OutName);
|
||||
return getNameWithPrefix(OS, GVName, PrefixTy);
|
||||
char Prefix = DL->getGlobalPrefix();
|
||||
return getNameWithPrefixImpl(OS, GVName, PrefixTy, *DL, Prefix);
|
||||
}
|
||||
|
||||
static bool hasByteCountSuffix(CallingConv::ID CC) {
|
||||
@ -132,7 +140,7 @@ void Mangler::getNameWithPrefix(raw_ostream &OS, const GlobalValue *GV,
|
||||
Prefix = '\0'; // vectorcall functions have no prefix.
|
||||
}
|
||||
|
||||
getNameWithPrefixx(OS, Name, PrefixTy, *DL, Prefix);
|
||||
getNameWithPrefixImpl(OS, Name, PrefixTy, *DL, Prefix);
|
||||
|
||||
if (!MSFunc)
|
||||
return;
|
||||
|
@ -36,6 +36,7 @@
|
||||
#include "llvm/IR/Instructions.h"
|
||||
#include "llvm/IR/IntrinsicInst.h"
|
||||
#include "llvm/IR/Operator.h"
|
||||
#include "llvm/MC/MCSymbol.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
using namespace llvm;
|
||||
|
||||
@ -3070,9 +3071,9 @@ bool AArch64FastISel::fastLowerCall(CallLoweringInfo &CLI) {
|
||||
bool IsTailCall = CLI.IsTailCall;
|
||||
bool IsVarArg = CLI.IsVarArg;
|
||||
const Value *Callee = CLI.Callee;
|
||||
const char *SymName = CLI.SymName;
|
||||
MCSymbol *Symbol = CLI.Symbol;
|
||||
|
||||
if (!Callee && !SymName)
|
||||
if (!Callee && !Symbol)
|
||||
return false;
|
||||
|
||||
// Allow SelectionDAG isel to handle tail calls.
|
||||
@ -3134,8 +3135,8 @@ bool AArch64FastISel::fastLowerCall(CallLoweringInfo &CLI) {
|
||||
if (CM == CodeModel::Small) {
|
||||
const MCInstrDesc &II = TII.get(Addr.getReg() ? AArch64::BLR : AArch64::BL);
|
||||
MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, II);
|
||||
if (SymName)
|
||||
MIB.addExternalSymbol(SymName, 0);
|
||||
if (Symbol)
|
||||
MIB.addSym(Symbol, 0);
|
||||
else if (Addr.getGlobalValue())
|
||||
MIB.addGlobalAddress(Addr.getGlobalValue(), 0, 0);
|
||||
else if (Addr.getReg()) {
|
||||
@ -3145,18 +3146,18 @@ bool AArch64FastISel::fastLowerCall(CallLoweringInfo &CLI) {
|
||||
return false;
|
||||
} else {
|
||||
unsigned CallReg = 0;
|
||||
if (SymName) {
|
||||
if (Symbol) {
|
||||
unsigned ADRPReg = createResultReg(&AArch64::GPR64commonRegClass);
|
||||
BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, TII.get(AArch64::ADRP),
|
||||
ADRPReg)
|
||||
.addExternalSymbol(SymName, AArch64II::MO_GOT | AArch64II::MO_PAGE);
|
||||
.addSym(Symbol, AArch64II::MO_GOT | AArch64II::MO_PAGE);
|
||||
|
||||
CallReg = createResultReg(&AArch64::GPR64RegClass);
|
||||
BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, TII.get(AArch64::LDRXui),
|
||||
CallReg)
|
||||
.addReg(ADRPReg)
|
||||
.addExternalSymbol(SymName, AArch64II::MO_GOT | AArch64II::MO_PAGEOFF |
|
||||
AArch64II::MO_NC);
|
||||
BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc,
|
||||
TII.get(AArch64::LDRXui), CallReg)
|
||||
.addReg(ADRPReg)
|
||||
.addSym(Symbol,
|
||||
AArch64II::MO_GOT | AArch64II::MO_PAGEOFF | AArch64II::MO_NC);
|
||||
} else if (Addr.getGlobalValue())
|
||||
CallReg = materializeGV(Addr.getGlobalValue());
|
||||
else if (Addr.getReg())
|
||||
@ -3460,7 +3461,8 @@ bool AArch64FastISel::fastLowerIntrinsicCall(const IntrinsicInst *II) {
|
||||
}
|
||||
|
||||
CallLoweringInfo CLI;
|
||||
CLI.setCallee(TLI.getLibcallCallingConv(LC), II->getType(),
|
||||
MCContext &Ctx = MF->getContext();
|
||||
CLI.setCallee(DL, Ctx, TLI.getLibcallCallingConv(LC), II->getType(),
|
||||
TLI.getLibcallName(LC), std::move(Args));
|
||||
if (!lowerCallTo(CLI))
|
||||
return false;
|
||||
@ -4734,7 +4736,8 @@ bool AArch64FastISel::selectFRem(const Instruction *I) {
|
||||
}
|
||||
|
||||
CallLoweringInfo CLI;
|
||||
CLI.setCallee(TLI.getLibcallCallingConv(LC), I->getType(),
|
||||
MCContext &Ctx = MF->getContext();
|
||||
CLI.setCallee(DL, Ctx, TLI.getLibcallCallingConv(LC), I->getType(),
|
||||
TLI.getLibcallName(LC), std::move(Args));
|
||||
if (!lowerCallTo(CLI))
|
||||
return false;
|
||||
|
@ -187,6 +187,9 @@ bool AArch64MCInstLower::lowerOperand(const MachineOperand &MO,
|
||||
case MachineOperand::MO_ExternalSymbol:
|
||||
MCOp = LowerSymbolOperand(MO, GetExternalSymbolSymbol(MO));
|
||||
break;
|
||||
case MachineOperand::MO_MCSymbol:
|
||||
MCOp = LowerSymbolOperand(MO, MO.getMCSymbol());
|
||||
break;
|
||||
case MachineOperand::MO_JumpTableIndex:
|
||||
MCOp = LowerSymbolOperand(MO, Printer.GetJTISymbol(MO.getIndex()));
|
||||
break;
|
||||
|
@ -16,6 +16,7 @@
|
||||
#include "llvm/IR/GetElementPtrTypeIterator.h"
|
||||
#include "llvm/IR/GlobalAlias.h"
|
||||
#include "llvm/IR/GlobalVariable.h"
|
||||
#include "llvm/MC/MCSymbol.h"
|
||||
#include "llvm/Target/TargetInstrInfo.h"
|
||||
|
||||
using namespace llvm;
|
||||
@ -143,7 +144,7 @@ private:
|
||||
unsigned materializeGV(const GlobalValue *GV, MVT VT);
|
||||
unsigned materializeInt(const Constant *C, MVT VT);
|
||||
unsigned materialize32BitInt(int64_t Imm, const TargetRegisterClass *RC);
|
||||
unsigned materializeExternalCallSym(const char *SynName);
|
||||
unsigned materializeExternalCallSym(MCSymbol *Syn);
|
||||
|
||||
MachineInstrBuilder emitInst(unsigned Opc) {
|
||||
return BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, TII.get(Opc));
|
||||
@ -369,12 +370,12 @@ unsigned MipsFastISel::materializeGV(const GlobalValue *GV, MVT VT) {
|
||||
return DestReg;
|
||||
}
|
||||
|
||||
unsigned MipsFastISel::materializeExternalCallSym(const char *SymName) {
|
||||
unsigned MipsFastISel::materializeExternalCallSym(MCSymbol *Sym) {
|
||||
const TargetRegisterClass *RC = &Mips::GPR32RegClass;
|
||||
unsigned DestReg = createResultReg(RC);
|
||||
emitInst(Mips::LW, DestReg)
|
||||
.addReg(MFI->getGlobalBaseReg())
|
||||
.addExternalSymbol(SymName, MipsII::MO_GOT);
|
||||
.addSym(Sym, MipsII::MO_GOT);
|
||||
return DestReg;
|
||||
}
|
||||
|
||||
@ -1234,7 +1235,7 @@ bool MipsFastISel::fastLowerCall(CallLoweringInfo &CLI) {
|
||||
bool IsTailCall = CLI.IsTailCall;
|
||||
bool IsVarArg = CLI.IsVarArg;
|
||||
const Value *Callee = CLI.Callee;
|
||||
const char *SymName = CLI.SymName;
|
||||
MCSymbol *Symbol = CLI.Symbol;
|
||||
|
||||
// Allow SelectionDAG isel to handle tail calls.
|
||||
if (IsTailCall)
|
||||
@ -1286,8 +1287,8 @@ bool MipsFastISel::fastLowerCall(CallLoweringInfo &CLI) {
|
||||
|
||||
// Issue the call.
|
||||
unsigned DestAddress;
|
||||
if (SymName)
|
||||
DestAddress = materializeExternalCallSym(SymName);
|
||||
if (Symbol)
|
||||
DestAddress = materializeExternalCallSym(Symbol);
|
||||
else
|
||||
DestAddress = materializeGV(Addr.getGlobalValue(), MVT::i32);
|
||||
emitInst(TargetOpcode::COPY, Mips::T9).addReg(DestAddress);
|
||||
|
@ -88,6 +88,11 @@ MCOperand MipsMCInstLower::LowerSymbolOperand(const MachineOperand &MO,
|
||||
Offset += MO.getOffset();
|
||||
break;
|
||||
|
||||
case MachineOperand::MO_MCSymbol:
|
||||
Symbol = MO.getMCSymbol();
|
||||
Offset += MO.getOffset();
|
||||
break;
|
||||
|
||||
case MachineOperand::MO_JumpTableIndex:
|
||||
Symbol = AsmPrinter.GetJTISymbol(MO.getIndex());
|
||||
break;
|
||||
@ -141,6 +146,7 @@ MCOperand MipsMCInstLower::LowerOperand(const MachineOperand &MO,
|
||||
case MachineOperand::MO_MachineBasicBlock:
|
||||
case MachineOperand::MO_GlobalAddress:
|
||||
case MachineOperand::MO_ExternalSymbol:
|
||||
case MachineOperand::MO_MCSymbol:
|
||||
case MachineOperand::MO_JumpTableIndex:
|
||||
case MachineOperand::MO_ConstantPoolIndex:
|
||||
case MachineOperand::MO_BlockAddress:
|
||||
|
@ -1448,9 +1448,9 @@ bool PPCFastISel::fastLowerCall(CallLoweringInfo &CLI) {
|
||||
bool IsTailCall = CLI.IsTailCall;
|
||||
bool IsVarArg = CLI.IsVarArg;
|
||||
const Value *Callee = CLI.Callee;
|
||||
const char *SymName = CLI.SymName;
|
||||
const MCSymbol *Symbol = CLI.Symbol;
|
||||
|
||||
if (!Callee && !SymName)
|
||||
if (!Callee && !Symbol)
|
||||
return false;
|
||||
|
||||
// Allow SelectionDAG isel to handle tail calls.
|
||||
|
@ -38,6 +38,7 @@
|
||||
#include "llvm/IR/IntrinsicInst.h"
|
||||
#include "llvm/IR/Operator.h"
|
||||
#include "llvm/MC/MCAsmInfo.h"
|
||||
#include "llvm/MC/MCSymbol.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Target/TargetOptions.h"
|
||||
using namespace llvm;
|
||||
@ -2821,7 +2822,7 @@ bool X86FastISel::fastLowerCall(CallLoweringInfo &CLI) {
|
||||
bool &IsTailCall = CLI.IsTailCall;
|
||||
bool IsVarArg = CLI.IsVarArg;
|
||||
const Value *Callee = CLI.Callee;
|
||||
const char *SymName = CLI.SymName;
|
||||
MCSymbol *Symbol = CLI.Symbol;
|
||||
|
||||
bool Is64Bit = Subtarget->is64Bit();
|
||||
bool IsWin64 = Subtarget->isCallingConvWin64(CC);
|
||||
@ -3117,8 +3118,8 @@ bool X86FastISel::fastLowerCall(CallLoweringInfo &CLI) {
|
||||
}
|
||||
|
||||
MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, TII.get(CallOpc));
|
||||
if (SymName)
|
||||
MIB.addExternalSymbol(SymName, OpFlags);
|
||||
if (Symbol)
|
||||
MIB.addSym(Symbol, OpFlags);
|
||||
else
|
||||
MIB.addGlobalAddress(GV, 0, OpFlags);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user