forked from OSchip/llvm-project
Fix subtle bug in generating LLVM function declarations for builtin functions.
The decl wasn't being passed down, which meant that function attributes were not being set correctly. This is particularly important for ARM, since it wants to override the calling convention. Instead we would emit the builtin with the wrong calling convention, and instcombine would come along and merrily shred all the calls to it. :) llvm-svn: 81756
This commit is contained in:
parent
4dc75de733
commit
ff0553ec61
|
@ -556,7 +556,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
|
|||
// that function.
|
||||
if (getContext().BuiltinInfo.isLibFunction(BuiltinID) ||
|
||||
getContext().BuiltinInfo.isPredefinedLibFunction(BuiltinID))
|
||||
return EmitCall(CGM.getBuiltinLibFunction(BuiltinID),
|
||||
return EmitCall(CGM.getBuiltinLibFunction(FD, BuiltinID),
|
||||
E->getCallee()->getType(), E->arg_begin(),
|
||||
E->arg_end());
|
||||
|
||||
|
|
|
@ -1256,7 +1256,8 @@ void CodeGenModule::EmitAliasDefinition(const ValueDecl *D) {
|
|||
|
||||
/// getBuiltinLibFunction - Given a builtin id for a function like
|
||||
/// "__builtin_fabsf", return a Function* for "fabsf".
|
||||
llvm::Value *CodeGenModule::getBuiltinLibFunction(unsigned BuiltinID) {
|
||||
llvm::Value *CodeGenModule::getBuiltinLibFunction(const FunctionDecl *FD,
|
||||
unsigned BuiltinID) {
|
||||
assert((Context.BuiltinInfo.isLibFunction(BuiltinID) ||
|
||||
Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID)) &&
|
||||
"isn't a lib fn");
|
||||
|
@ -1276,8 +1277,7 @@ llvm::Value *CodeGenModule::getBuiltinLibFunction(unsigned BuiltinID) {
|
|||
|
||||
// Unique the name through the identifier table.
|
||||
Name = getContext().Idents.get(Name).getName();
|
||||
// FIXME: param attributes for sext/zext etc.
|
||||
return GetOrCreateLLVMFunction(Name, Ty, GlobalDecl());
|
||||
return GetOrCreateLLVMFunction(Name, Ty, GlobalDecl(FD));
|
||||
}
|
||||
|
||||
llvm::Function *CodeGenModule::getIntrinsic(unsigned IID,const llvm::Type **Tys,
|
||||
|
|
|
@ -303,7 +303,8 @@ public:
|
|||
|
||||
/// getBuiltinLibFunction - Given a builtin id for a function like
|
||||
/// "__builtin_fabsf", return a Function* for "fabsf".
|
||||
llvm::Value *getBuiltinLibFunction(unsigned BuiltinID);
|
||||
llvm::Value *getBuiltinLibFunction(const FunctionDecl *FD,
|
||||
unsigned BuiltinID);
|
||||
|
||||
llvm::Function *getMemCpyFn();
|
||||
llvm::Function *getMemMoveFn();
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
// RUN: clang-cc -triple arm-unknown-unknown -emit-llvm -o - %s | FileCheck %s
|
||||
|
||||
// CHECK: declare arm_aapcscc i32 @printf(i8*, ...)
|
||||
void f0() {
|
||||
printf("a\n");
|
||||
}
|
||||
|
||||
// CHECK: call arm_aapcscc void @exit
|
||||
// CHECK: unreachable
|
||||
void f1() {
|
||||
exit(1);
|
||||
}
|
Loading…
Reference in New Issue