summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen
diff options
context:
space:
mode:
authorDale Johannesen <dalej@apple.com>2009-07-07 23:26:33 +0000
committerDale Johannesen <dalej@apple.com>2009-07-07 23:26:33 +0000
commit4e33115e5e0b81d515c6f987ff7e869ad6003390 (patch)
tree256fdcee93a3d0233af3f6315907463084d5a86a /llvm/lib/CodeGen
parent9fc6097145600e92e10e0205ff38d26934200ec9 (diff)
downloadbcm5719-llvm-4e33115e5e0b81d515c6f987ff7e869ad6003390.tar.gz
bcm5719-llvm-4e33115e5e0b81d515c6f987ff7e869ad6003390.zip
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
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp19
1 files changed, 16 insertions, 3 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
index 83357e06600..b9b518afc00 100644
--- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
@@ -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.
OpenPOWER on IntegriCloud