文档章节

LLVM每日谈之十四 如何给Clang添加一个属性

snsn1984
 snsn1984
发布于 2013/06/13 11:06
字数 593
阅读 268
收藏 0
每次内容主要出自文档: “Clang” CFE Internals Manual
地址: http://clang.llvm.org/docs/InternalsManual.html

在这个文档中,以简明的的一个例子说明了如何按照这个方式在Clang中添加一个属性。讲的很清楚,我在这里不再累述,只是将例子中的部分代码和文档结合起来,一起展现给大家。


How to add an attribute

To add an attribute, you’ll have to add it to the list of attributes, add it tothe parsing phase, and look for it in the AST scan.r124217 has a good example of adding a warning attribute.

(Beware that this hasn’t been reviewed/fixed by the people who designed theattributes system yet.)

include/clang/Basic/Attr.td

First, add your attribute to the include/clang/Basic/Attr.td file.

Each attribute gets adefinheriting fromAttror one of itssubclasses.InheritableAttrmeans that the attribute also applies tosubsequent declarations of the same name.

Spellingslists the strings that can appear in__attribute__((here))or[[here]]. All such strings will be synonymous. If you want to allow the[[]]C++11 syntax, you have to define a list ofNamespaces, which willlet users write[[namespace::spelling]]. Using the empty string for anamespace will allow users to write just the spelling with no “::”.Attributes which g++-4.8 accepts should also have aCXX11<"gnu","spelling">spelling.

Subjectsrestricts what kinds of AST node to which this attribute canappertain (roughly, attach).

Argsnames the arguments the attribute takes, in order. IfArgsis[StringArgument<"Arg1">, IntArgument<"Arg2">]then__attribute__((myattribute("Hello",3)))will be a valid use.



--- cfe/trunk/include/clang/Basic/Attr.td	2011/01/25 19:39:31	124216
+++ cfe/trunk/include/clang/Basic/Attr.td	2011/01/25 20:08:12	124217
@@ -232,6 +232,11 @@
   let Spellings = [];
 }
 
+def ForbidTemporaries : Attr {
+  let Spellings = ["forbid_temporaries"];
+  let Subjects = [CXXRecord];
+}
+
 def Format : InheritableAttr {
   let Spellings = ["format"];
   let Args = [StringArgument<"Type">, IntArgument<"FormatIdx">,

Boilerplate

Write a newHandleYourAttr()function inlib/Sema/SemaDeclAttr.cpp,and add a case to the switch inProcessNonInheritableDeclAttr()orProcessInheritableDeclAttr()forwarding to it.

If your attribute causes extra warnings to fire, define a DiagGroupin include/clang/Basic/DiagnosticGroups.td named after the attribute’s Spellingwith “_”s replaced by “-“s. If you’reonly defining one diagnostic, you can skip DiagnosticGroups.tdand use InGroup<DiagGroup<"your-attribute">>directly in DiagnosticSemaKinds.td

--- cfe/trunk/lib/Sema/SemaDeclAttr.cpp	2011/01/25 19:39:31	124216
+++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp	2011/01/25 20:08:12	124217
@@ -885,6 +885,24 @@
   d->addAttr(::new (S.Context) VecReturnAttr(Attr.getLoc(), S.Context));
 }
 
+static void HandleForbidTemporariesAttr(Decl *d, const AttributeList &Attr,
+                                        Sema &S) {
+  assert(Attr.isInvalid() == false);
+
+  if (Attr.getNumArgs() != 0) {
+    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
+    return;
+  }
+
+  if (!isa<TypeDecl>(d)) {
+    S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
+      << Attr.getName() << 9 /*class*/;
+    return;
+  }
+
+  d->addAttr(::new (S.Context) ForbidTemporariesAttr(Attr.getLoc(), S.Context));
+}
+
 static void HandleDependencyAttr(Decl *d, const AttributeList &Attr, Sema &S) {
   if (!isFunctionOrMethod(d) && !isa<ParmVarDecl>(d)) {
     S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type)
@@ -2674,6 +2692,8 @@
   case AttributeList::AT_ext_vector_type:
     HandleExtVectorTypeAttr(scope, D, Attr, S);
     break;
+  case AttributeList::AT_forbid_temporaries:
+    HandleForbidTemporariesAttr(D, Attr, S); break;
   case AttributeList::AT_format:      HandleFormatAttr      (D, Attr, S); break;
   case AttributeList::AT_format_arg:  HandleFormatArgAttr   (D, Attr, S); break;
   case AttributeList::AT_global:      HandleGlobalAttr      (D, Attr, S); break;

The meat of your attribute

Find an appropriate place in Clang to do whatever your attribute needs to do.Check for the attribute’s presence usingDecl::getAttr<YourAttr>().

Update the Clang Language Extensions document to describe your new attribute.

© 著作权归作者所有

snsn1984
粉丝 94
博文 32
码字总数 45245
作品 0
长春
项目经理
私信 提问
LLVM每日谈之七 Clang

作者:snsn1984 官方介绍Clang是LLVM native的一个面向C/C++/Objective-C的编译器,目标是要提供一个编译非常快的编译器。他们宣称在Debug模式下编译Objective-C比GCC快3倍。至于是否能比GCC...

snsn1984
2012/11/24
877
0
计算机的革命----编译器体系的战争-----集团军的危险信号

Symantec C/C++ 已经不见踪影,Symantec现在专心做他的安全软件,诺顿杀毒软件,还有一些其他的,Boland C/C++最后还是被收购了,现在的RAD C++ Builder混的一直不愠不火,WATCOM 被Sybase败...

Force武装卫队
2012/11/23
1K
9
LLVM/Clang On Windows 2013_09

好吧,很久没有写博客了,最近LLVM/Clang的主干版本取得了很大的进步,便在这里汇报下分析心得。 我非常建议研究LLVM/Clang的朋友在自己电脑上安装TortoiseSVN 并且将LLVM的源代码Clone下来,...

Force武装卫队
2013/10/01
6.2K
16
LLVM每日谈之十 LLVM Test简介

作者:snsn1984 就像很多优秀的软件都有自己的测试框架一样,LLVM也有自己的测试框架。LLVM的测试主要分为两 部分:regression tests 和 whole programs。其中,regression tests主要位于LLV...

snsn1984
2013/02/28
648
0
VS2010/MFC编程入门教程之目录和总结(鸡啄米)

鸡啄米的这套VS2010/MFC编程入门教程到此就全部完成了,虽然有些内容还未涉及到,但帮助大家进行VS2010/MFC的入门学习业已足够。以此教程的知识为基础,学习VS2010/MFC较为深入的内容已非难事...

weixin_40647819
2018/05/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

关于AsyncTask的onPostExcute方法是否会在Activity重建过程中调用的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/XG1057415595/article/details/86774575 假设下面一种情况...

shzwork
今天
7
0
object 类中有哪些方法?

getClass(): 获取运行时类的对象 equals():判断其他对象是否与此对象相等 hashcode():返回该对象的哈希码值 toString():返回该对象的字符串表示 clone(): 创建并返此对象的一个副本 wait...

happywe
今天
6
0
Docker容器实战(七) - 容器中进程视野下的文件系统

前两文中,讲了Linux容器最基础的两种技术 Namespace 作用是“隔离”,它让应用进程只能看到该Namespace内的“世界” Cgroups 作用是“限制”,它给这个“世界”围上了一圈看不见的墙 这么一...

JavaEdge
今天
8
0
文件访问和共享的方法介绍

在上一篇文章中,你了解到文件有三个不同的权限集。拥有该文件的用户有一个集合,拥有该文件的组的成员有一个集合,然后最终一个集合适用于其他所有人。在长列表(ls -l)中这些权限使用符号...

老孟的Linux私房菜
今天
7
0
面试套路题目

作者:抱紧超越小姐姐 链接:https://www.nowcoder.com/discuss/309292?type=3 来源:牛客网 面试时候的潜台词 抱紧超越小姐姐 编辑于 2019-10-15 16:14:56APP内打开赞 3 | 收藏 4 | 回复24 ...

MtrS
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部