mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-12 14:17:59 +00:00
Operand of asm("call") (the callee function) is represented
as "X" constraint and "P" modifier on x86. Make this work. (Change may not be sufficient to fix it for non-Darwin, but I'm pretty sure it won't break anything.) gcc.apple/asm-block-32.c gcc.apple/asm-block-33.c git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74967 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c2c27b3627
commit
8ea5ec681b
@ -2405,11 +2405,24 @@ void TargetLowering::ComputeConstraintToUse(AsmOperandInfo &OpInfo,
|
||||
|
||||
// 'X' matches anything.
|
||||
if (OpInfo.ConstraintCode == "X" && OpInfo.CallOperandVal) {
|
||||
// Look through bitcasts over functions. In the context of an asm
|
||||
// argument we don't care about bitcasting function types; the parameters
|
||||
// to the function, if any, will have been handled elsewhere.
|
||||
Value *v = OpInfo.CallOperandVal;
|
||||
ConstantExpr *CE = NULL;
|
||||
while ((CE = dyn_cast<ConstantExpr>(v)) &&
|
||||
CE->getOpcode()==Instruction::BitCast)
|
||||
v = CE->getOperand(0);
|
||||
if (!isa<Function>(v))
|
||||
v = OpInfo.CallOperandVal;
|
||||
// Labels and constants are handled elsewhere ('X' is the only thing
|
||||
// that matches labels).
|
||||
if (isa<BasicBlock>(OpInfo.CallOperandVal) ||
|
||||
isa<ConstantInt>(OpInfo.CallOperandVal))
|
||||
// that matches labels). For Functions, the type here is the type of
|
||||
// the result, which is not what we want to look at; leave them alone
|
||||
// (minus any bitcasts).
|
||||
if (isa<BasicBlock>(v) || isa<ConstantInt>(v) || isa<Function>(v)) {
|
||||
OpInfo.CallOperandVal = v;
|
||||
return;
|
||||
}
|
||||
|
||||
// Otherwise, try to resolve it to something we know about by looking at
|
||||
// the actual operand type.
|
||||
|
Loading…
Reference in New Issue
Block a user