Revision: 124303 Author: clattner Date: 2007-02-25 14:01:13 -0800 (Sun, 25 Feb 2007)
Log Message: ----------- Lower calls to "implicit ..." functions more carefully. This implements test/CFrontend/2007-02-25-C-DotDotDot.c Modified Paths: -------------- apple-local/branches/llvm/gcc/llvm-convert.cpp Modified: apple-local/branches/llvm/gcc/llvm-convert.cpp =================================================================== --- apple-local/branches/llvm/gcc/llvm-convert.cpp 2007-02-25 18:44:39 UTC (rev 124302) +++ apple-local/branches/llvm/gcc/llvm-convert.cpp 2007-02-25 22:01:13 UTC (rev 124303) @@ -2190,7 +2190,7 @@ // Pass the static chain, if any, as the first parameter. if (TREE_OPERAND(exp, 2)) - CallOperands.push_back (Emit(TREE_OPERAND(exp, 2), 0)); + CallOperands.push_back(Emit(TREE_OPERAND(exp, 2), 0)); // Loop over the arguments, expanding them and adding them to the op list. const PointerType *PFTy = cast<PointerType>(Callee->getType()); @@ -2226,8 +2226,28 @@ } } - // TODO: Check to see if the arguments and callee types disagree. If so, - // insert a cast of the callee to a type that will work. + // Compile stuff like: + // %tmp = call float (...)* bitcast (float ()* @foo to float (...)*)( ) + // to: + // %tmp = call float @foo( ) + // This commonly occurs due to C "implicit ..." semantics. + if (ConstantExpr *CE = dyn_cast<ConstantExpr>(Callee)) { + if (CallOperands.empty() && CE->getOpcode() == Instruction::BitCast) { + Constant *RealCallee = CE->getOperand(0); + assert(isa<PointerType>(RealCallee->getType()) && + "Bitcast to ptr not from ptr?"); + const PointerType *RealPT = cast<PointerType>(RealCallee->getType()); + if (const FunctionType *RealFT = + dyn_cast<FunctionType>(RealPT->getElementType())) { + const PointerType *ActualPT = cast<PointerType>(Callee->getType()); + const FunctionType *ActualFT = + cast<FunctionType>(ActualPT->getElementType()); + if (RealFT->getReturnType() == ActualFT->getReturnType() && + ActualFT->getNumParams() == 0) + Callee = RealCallee; + } + } + } Value *Call; if (!UnwindBlock) { _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits