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

llvm-svn: 74967
This commit is contained in:
Dale Johannesen 2009-07-07 23:26:33 +00:00
parent 9fc6097145
commit 4e33115e5e
1 changed files with 16 additions and 3 deletions

View File

@ -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.