forked from OSchip/llvm-project
Attributes on block functions were not being set.
- <rdar://problem/6800351> clang not producing correct large struct return code for Blocks llvm-svn: 69337
This commit is contained in:
parent
09dbb0b5e0
commit
c3e7cff6d3
|
@ -670,6 +670,8 @@ CodeGenFunction::GenerateBlockFunction(const BlockExpr *BExpr,
|
|||
Name,
|
||||
&CGM.getModule());
|
||||
|
||||
CGM.SetInternalFunctionAttributes(BD, Fn, FI);
|
||||
|
||||
StartFunction(BD, ResultType, Fn, Args,
|
||||
BExpr->getBody()->getLocEnd());
|
||||
CurFuncDecl = OuterFuncDecl;
|
||||
|
|
|
@ -109,7 +109,8 @@ void CodeGenFunction::StartObjCMethod(const ObjCMethodDecl *OMD,
|
|||
FunctionArgList Args;
|
||||
llvm::Function *Fn = CGM.getObjCRuntime().GenerateMethod(OMD, CD);
|
||||
|
||||
CGM.SetMethodAttributes(OMD, Fn);
|
||||
const CGFunctionInfo &FI = CGM.getTypes().getFunctionInfo(OMD);
|
||||
CGM.SetInternalFunctionAttributes(OMD, Fn, FI);
|
||||
|
||||
Args.push_back(std::make_pair(OMD->getSelfDecl(),
|
||||
OMD->getSelfDecl()->getType()));
|
||||
|
|
|
@ -340,14 +340,15 @@ void CodeGenModule::SetCommonAttributes(const Decl *D,
|
|||
GV->setSection(SA->getName());
|
||||
}
|
||||
|
||||
void CodeGenModule::SetMethodAttributes(const ObjCMethodDecl *MD,
|
||||
llvm::Function *F) {
|
||||
SetLLVMFunctionAttributes(MD, getTypes().getFunctionInfo(MD), F);
|
||||
SetLLVMFunctionAttributesForDefinition(MD, F);
|
||||
void CodeGenModule::SetInternalFunctionAttributes(const Decl *D,
|
||||
llvm::Function *F,
|
||||
const CGFunctionInfo &FI) {
|
||||
SetLLVMFunctionAttributes(D, FI, F);
|
||||
SetLLVMFunctionAttributesForDefinition(D, F);
|
||||
|
||||
F->setLinkage(llvm::Function::InternalLinkage);
|
||||
|
||||
SetCommonAttributes(MD, F);
|
||||
SetCommonAttributes(D, F);
|
||||
}
|
||||
|
||||
void CodeGenModule::SetFunctionAttributes(const FunctionDecl *FD,
|
||||
|
|
|
@ -303,8 +303,12 @@ public:
|
|||
void ErrorUnsupported(const Decl *D, const char *Type,
|
||||
bool OmitOnError=false);
|
||||
|
||||
void SetMethodAttributes(const ObjCMethodDecl *MD,
|
||||
llvm::Function *F);
|
||||
/// SetInternalFunctionAttributes - Set the attributes on the LLVM
|
||||
/// function for the given decl and function info. This applies
|
||||
/// attributes necessary for handling the ABI as well as user
|
||||
/// specified attributes like section.
|
||||
void SetInternalFunctionAttributes(const Decl *D, llvm::Function *F,
|
||||
const CGFunctionInfo &FI);
|
||||
|
||||
/// SetLLVMFunctionAttributes - Set the LLVM function attributes
|
||||
/// (sext, zext, etc).
|
||||
|
|
|
@ -1,7 +1,20 @@
|
|||
// RUN: clang-cc %s -emit-llvm -o %t -fblocks
|
||||
// RUN: clang-cc -triple i386-unknown-unknown %s -emit-llvm -o %t -fblocks &&
|
||||
void (^f)(void) = ^{};
|
||||
|
||||
// rdar://6768379
|
||||
int f0(int (^a0)()) {
|
||||
return a0(1, 2, 3);
|
||||
}
|
||||
|
||||
// Verify that attributes on blocks are set correctly.
|
||||
typedef struct s0 T;
|
||||
struct s0 {
|
||||
int a[64];
|
||||
};
|
||||
|
||||
// RUN: grep 'internal void @__f2_block_invoke_(.struct.s0\* noalias sret .*, .*, .* byval .*)' %t &&
|
||||
struct s0 f2(struct s0 a0) {
|
||||
return ^(struct s0 a1){ return a1; }(a0);
|
||||
}
|
||||
|
||||
// RUN: true
|
||||
|
|
Loading…
Reference in New Issue