diff options
-rw-r--r-- | clang/lib/CodeGen/CGBlocks.cpp | 2 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGObjC.cpp | 3 | ||||
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 11 | ||||
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.h | 8 | ||||
-rw-r--r-- | clang/test/CodeGen/blocks.c | 15 |
5 files changed, 30 insertions, 9 deletions
diff --git a/clang/lib/CodeGen/CGBlocks.cpp b/clang/lib/CodeGen/CGBlocks.cpp index 7a8cd0d822f..27b60a01e9e 100644 --- a/clang/lib/CodeGen/CGBlocks.cpp +++ b/clang/lib/CodeGen/CGBlocks.cpp @@ -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; diff --git a/clang/lib/CodeGen/CGObjC.cpp b/clang/lib/CodeGen/CGObjC.cpp index 4423217c7dd..808add74f76 100644 --- a/clang/lib/CodeGen/CGObjC.cpp +++ b/clang/lib/CodeGen/CGObjC.cpp @@ -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())); diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index d1d67a11b8a..7cb5e43cb59 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -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, diff --git a/clang/lib/CodeGen/CodeGenModule.h b/clang/lib/CodeGen/CodeGenModule.h index 17a9a9f907e..469c637e2df 100644 --- a/clang/lib/CodeGen/CodeGenModule.h +++ b/clang/lib/CodeGen/CodeGenModule.h @@ -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). diff --git a/clang/test/CodeGen/blocks.c b/clang/test/CodeGen/blocks.c index 3eb4c43505a..4203fce051d 100644 --- a/clang/test/CodeGen/blocks.c +++ b/clang/test/CodeGen/blocks.c @@ -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 |