[llvm-dev] Adding a function attribute with an argument

Gaël Jobin via llvm-dev llvm-dev at lists.llvm.org
Thu Oct 8 01:08:05 PDT 2015

Hi Tehila,
I recently added new function attributes to clang/llvm with arguments.
What I did is the following:
1. Add your attributes to tools/clang/include/clang/Basic/Attr.td
def MYATTR : InheritableAttr {
  let Spellings = [GNU<"myattr">, CXX11<"gnu", "myattr">];
  let Args = [DefaultIntArgument<"myargument", 5>];
  let Subjects = SubjectList<[Function]>;
  let Documentation = [Undocumented];
2. Manage it in tools/clang/lib/CodeGen/CGCall.cpp...
void CodeGenModule::ConstructAttributeList(const CGFunctionInfo &FI,
                                           const Decl *TargetDecl,
                                           AttributeListType &PAL,
                                           unsigned &CallingConv,
                                           bool AttrOnCallSite) {
//other code...
if (TargetDecl) {
if (TargetDecl->hasAttr<MYEXAMPLEAttr>())
		auto myexample = TargetDecl->getAttr<MYEXAMPLEAttr>();
		unsigned myargument = myexample->getMyargument();

//other code...
//other code...
3. ...and in tools/clang/lib/Sema/SemaDeclAttr.cpp
static void ProcessDeclAttribute(Sema &S, Scope *scope, Decl *D,
                                 const AttributeList &Attr,
                                 bool IncludeCXX11Attributes) {
//other code...
switch (Attr.getKind()) {
case AttributeList::AT_MYEXAMPLE:
	handleMYEXAMPLEAttr(S, D, Attr);
//other code...

static void handleMYEXAMPLEAttr(Sema &S, Decl *D, const AttributeList
&Attr) {
	uint32_t myargument = AVMAttr::DefaultMyargument;

	if (Attr.getNumArgs() && !checkUInt32Argument(S, Attr,
Attr.getArgAsExpr(0), myargument))

	D->addAttr(::new (S.Context)
			AVMAttr(Attr.getRange(), S.Context, myargument,
Then you should have access to it in LLVM IR.
I may have forgotten some stuff but it should help you get started.
Le jeudi 08 octobre 2015 à 10:02 +0300, Tehila Mayzels via llvm-dev a
écrit :
> Hi,
> I'm trying to add a function attribute to clang/llvm.
> I need an attribute that will have an additional information of a
> variable name.
> e.g. I would like to add support for something like:
> void foo() __attribute__ ((xyz(v)) {…}
> such that on the IR stage I can realize that the function foo has the
> attribute xyz and an argument v that  marks variable v (which is a
> variable inside foo) for my needs.
> I was able to add a function attribute without an argument, but I
> don't understand how to parse/save/analyze the argument.
> I would appreciate any ideas/examples/references.
> Thanks a lot,
> Tehila.
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20151008/dd34ead0/attachment.html>

More information about the llvm-dev mailing list