使__attribute__((annotate("xxx")))能作用于OC函数
diff -Naur orig/llvm-3.7.0.src/tools/clang/lib/CodeGen/CGBlocks.cpp llvm-3.7.0.src/tools/clang/lib/CodeGen/CGBlocks.cpp
--- orig/llvm-3.7.0.src/tools/clang/lib/CodeGen/CGBlocks.cpp 2015-06-23 01:07:51.000000000 +0200
+++ llvm-3.7.0.src/tools/clang/lib/CodeGen/CGBlocks.cpp 2015-11-13 13:05:44.000000000 +0100
@@ -1157,6 +1157,10 @@
fnLLVMType, llvm::GlobalValue::InternalLinkage, name, &CGM.getModule());
CGM.SetInternalFunctionAttributes(blockDecl, fn, fnInfo);
+ // Emit annotation attributes for ObjC blocks.
+ if (blockDecl->hasAttr<AnnotateAttr>())
+ CGM.AddGlobalAnnotations(blockDecl, fn);
+
// Begin generating the function.
StartFunction(blockDecl, fnType->getReturnType(), fn, fnInfo, args,
blockDecl->getLocation(),
diff -Naur orig/llvm-3.7.0.src/tools/clang/lib/CodeGen/CGObjC.cpp llvm-3.7.0.src/tools/clang/lib/CodeGen/CGObjC.cpp
--- orig/llvm-3.7.0.src/tools/clang/lib/CodeGen/CGObjC.cpp 2015-07-14 19:27:39.000000000 +0200
+++ llvm-3.7.0.src/tools/clang/lib/CodeGen/CGObjC.cpp 2015-11-13 13:02:48.000000000 +0100
@@ -491,6 +491,10 @@
llvm::Function *Fn = CGM.getObjCRuntime().GenerateMethod(OMD, CD);
+ // Emit annotation attributes for ObjC methods.
+ if (OMD->hasAttr<AnnotateAttr>())
+ CGM.AddGlobalAnnotations(OMD, Fn);
+
const CGFunctionInfo &FI = CGM.getTypes().arrangeObjCMethodDeclaration(OMD);
CGM.SetInternalFunctionAttributes(OMD, Fn, FI);
diff -Naur orig/llvm-3.7.0.src/tools/clang/lib/CodeGen/CodeGenModule.cpp llvm-3.7.0.src/tools/clang/lib/CodeGen/CodeGenModule.cpp
--- orig/llvm-3.7.0.src/tools/clang/lib/CodeGen/CodeGenModule.cpp 2015-07-14 00:54:53.000000000 +0200
+++ llvm-3.7.0.src/tools/clang/lib/CodeGen/CodeGenModule.cpp 2015-11-13 13:08:55.000000000 +0100
@@ -1193,7 +1193,7 @@
return llvm::ConstantStruct::getAnon(Fields);
}
-void CodeGenModule::AddGlobalAnnotations(const ValueDecl *D,
+void CodeGenModule::AddGlobalAnnotations(const Decl *D,
llvm::GlobalValue *GV) {
assert(D->hasAttr<AnnotateAttr>() && "no annotate attribute");
// Get the struct elements for these annotations.
diff -Naur orig/llvm-3.7.0.src/tools/clang/lib/CodeGen/CodeGenModule.h llvm-3.7.0.src/tools/clang/lib/CodeGen/CodeGenModule.h
--- orig/llvm-3.7.0.src/tools/clang/lib/CodeGen/CodeGenModule.h 2015-07-09 21:56:14.000000000 +0200
+++ llvm-3.7.0.src/tools/clang/lib/CodeGen/CodeGenModule.h 2015-11-13 13:08:29.000000000 +0100
@@ -1078,7 +1078,7 @@
/// Add global annotations that are set on D, for the global GV. Those
/// annotations are emitted during finalization of the LLVM code.
- void AddGlobalAnnotations(const ValueDecl *D, llvm::GlobalValue *GV);
+ void AddGlobalAnnotations(const Decl *D, llvm::GlobalValue *GV);
bool isInSanitizerBlacklist(llvm::Function *Fn, SourceLocation Loc) const;
--- orig/llvm-3.7.0.src/tools/clang/lib/CodeGen/CGBlocks.cpp 2015-06-23 01:07:51.000000000 +0200
+++ llvm-3.7.0.src/tools/clang/lib/CodeGen/CGBlocks.cpp 2015-11-13 13:05:44.000000000 +0100
@@ -1157,6 +1157,10 @@
fnLLVMType, llvm::GlobalValue::InternalLinkage, name, &CGM.getModule());
CGM.SetInternalFunctionAttributes(blockDecl, fn, fnInfo);
+ // Emit annotation attributes for ObjC blocks.
+ if (blockDecl->hasAttr<AnnotateAttr>())
+ CGM.AddGlobalAnnotations(blockDecl, fn);
+
// Begin generating the function.
StartFunction(blockDecl, fnType->getReturnType(), fn, fnInfo, args,
blockDecl->getLocation(),
diff -Naur orig/llvm-3.7.0.src/tools/clang/lib/CodeGen/CGObjC.cpp llvm-3.7.0.src/tools/clang/lib/CodeGen/CGObjC.cpp
--- orig/llvm-3.7.0.src/tools/clang/lib/CodeGen/CGObjC.cpp 2015-07-14 19:27:39.000000000 +0200
+++ llvm-3.7.0.src/tools/clang/lib/CodeGen/CGObjC.cpp 2015-11-13 13:02:48.000000000 +0100
@@ -491,6 +491,10 @@
llvm::Function *Fn = CGM.getObjCRuntime().GenerateMethod(OMD, CD);
+ // Emit annotation attributes for ObjC methods.
+ if (OMD->hasAttr<AnnotateAttr>())
+ CGM.AddGlobalAnnotations(OMD, Fn);
+
const CGFunctionInfo &FI = CGM.getTypes().arrangeObjCMethodDeclaration(OMD);
CGM.SetInternalFunctionAttributes(OMD, Fn, FI);
diff -Naur orig/llvm-3.7.0.src/tools/clang/lib/CodeGen/CodeGenModule.cpp llvm-3.7.0.src/tools/clang/lib/CodeGen/CodeGenModule.cpp
--- orig/llvm-3.7.0.src/tools/clang/lib/CodeGen/CodeGenModule.cpp 2015-07-14 00:54:53.000000000 +0200
+++ llvm-3.7.0.src/tools/clang/lib/CodeGen/CodeGenModule.cpp 2015-11-13 13:08:55.000000000 +0100
@@ -1193,7 +1193,7 @@
return llvm::ConstantStruct::getAnon(Fields);
}
-void CodeGenModule::AddGlobalAnnotations(const ValueDecl *D,
+void CodeGenModule::AddGlobalAnnotations(const Decl *D,
llvm::GlobalValue *GV) {
assert(D->hasAttr<AnnotateAttr>() && "no annotate attribute");
// Get the struct elements for these annotations.
diff -Naur orig/llvm-3.7.0.src/tools/clang/lib/CodeGen/CodeGenModule.h llvm-3.7.0.src/tools/clang/lib/CodeGen/CodeGenModule.h
--- orig/llvm-3.7.0.src/tools/clang/lib/CodeGen/CodeGenModule.h 2015-07-09 21:56:14.000000000 +0200
+++ llvm-3.7.0.src/tools/clang/lib/CodeGen/CodeGenModule.h 2015-11-13 13:08:29.000000000 +0100
@@ -1078,7 +1078,7 @@
/// Add global annotations that are set on D, for the global GV. Those
/// annotations are emitted during finalization of the LLVM code.
- void AddGlobalAnnotations(const ValueDecl *D, llvm::GlobalValue *GV);
+ void AddGlobalAnnotations(const Decl *D, llvm::GlobalValue *GV);
bool isInSanitizerBlacklist(llvm::Function *Fn, SourceLocation Loc) const;
评论
发表评论