mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-27 14:34:58 +00:00
allow the address of a global to be used with the "i" constraint when in
-static mode. This implements PR882. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31326 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
0d92499455
commit
22aaf1d61c
@ -5466,6 +5466,36 @@ X86TargetLowering::getConstraintType(char ConstraintLetter) const {
|
||||
}
|
||||
}
|
||||
|
||||
/// isOperandValidForConstraint - Return the specified operand (possibly
|
||||
/// modified) if the specified SDOperand is valid for the specified target
|
||||
/// constraint letter, otherwise return null.
|
||||
SDOperand X86TargetLowering::
|
||||
isOperandValidForConstraint(SDOperand Op, char Constraint, SelectionDAG &DAG) {
|
||||
switch (Constraint) {
|
||||
default: break;
|
||||
case 'i':
|
||||
// Literal immediates are always ok.
|
||||
if (isa<ConstantSDNode>(Op)) return Op;
|
||||
|
||||
// If we are in non-pic codegen mode, we allow the address of a global to
|
||||
// be used with 'i'.
|
||||
if (GlobalAddressSDNode *GA = dyn_cast<GlobalAddressSDNode>(Op)) {
|
||||
if (getTargetMachine().getRelocationModel() == Reloc::PIC_)
|
||||
return SDOperand(0, 0);
|
||||
|
||||
if (GA->getOpcode() != ISD::TargetGlobalAddress)
|
||||
Op = DAG.getTargetGlobalAddress(GA->getGlobal(), GA->getValueType(0),
|
||||
GA->getOffset());
|
||||
return Op;
|
||||
}
|
||||
|
||||
// Otherwise, not valid for this mode.
|
||||
return SDOperand(0, 0);
|
||||
}
|
||||
return TargetLowering::isOperandValidForConstraint(Op, Constraint, DAG);
|
||||
}
|
||||
|
||||
|
||||
std::vector<unsigned> X86TargetLowering::
|
||||
getRegClassForInlineAsmConstraint(const std::string &Constraint,
|
||||
MVT::ValueType VT) const {
|
||||
|
@ -300,7 +300,12 @@ namespace llvm {
|
||||
std::vector<unsigned>
|
||||
getRegClassForInlineAsmConstraint(const std::string &Constraint,
|
||||
MVT::ValueType VT) const;
|
||||
|
||||
/// isOperandValidForConstraint - Return the specified operand (possibly
|
||||
/// modified) if the specified SDOperand is valid for the specified target
|
||||
/// constraint letter, otherwise return null.
|
||||
SDOperand isOperandValidForConstraint(SDOperand Op, char ConstraintLetter,
|
||||
SelectionDAG &DAG);
|
||||
|
||||
/// getRegForInlineAsmConstraint - Given a physical register constraint
|
||||
/// (e.g. {edx}), return the register number and the register class for the
|
||||
/// register. This should only be used for C_Register constraints. On
|
||||
|
Loading…
x
Reference in New Issue
Block a user