forked from OSchip/llvm-project
Handle __attribute__((annotate("string")))
llvm-svn: 47451
This commit is contained in:
parent
e82c7a44d6
commit
d45d38d2b7
|
@ -57,6 +57,9 @@ AttributeList::Kind AttributeList::getKind(const IdentifierInfo *Name) {
|
|||
case 7:
|
||||
if (!memcmp(Str, "aligned", 7)) return AT_aligned;
|
||||
break;
|
||||
case 8:
|
||||
if (!memcmp(Str, "annotate", 8)) return AT_annotate;
|
||||
break;
|
||||
case 11:
|
||||
if (!memcmp(Str, "vector_size", 11)) return AT_vector_size;
|
||||
break;
|
||||
|
|
|
@ -271,6 +271,7 @@ private:
|
|||
|
||||
void HandleAlignedAttribute(Decl *d, AttributeList *rawAttr);
|
||||
void HandlePackedAttribute(Decl *d, AttributeList *rawAttr);
|
||||
void HandleAnnotateAttribute(Decl *d, AttributeList *rawAttr);
|
||||
|
||||
void WarnUndefinedMethod(SourceLocation ImpLoc, ObjCMethodDecl *method,
|
||||
bool &IncompleteImpl);
|
||||
|
|
|
@ -1777,6 +1777,9 @@ void Sema::HandleDeclAttribute(Decl *New, AttributeList *Attr) {
|
|||
case AttributeList::AT_packed:
|
||||
HandlePackedAttribute(New, Attr);
|
||||
break;
|
||||
case AttributeList::AT_annotate:
|
||||
HandleAnnotateAttribute(New, Attr);
|
||||
break;
|
||||
default:
|
||||
// FIXME: add other attributes...
|
||||
break;
|
||||
|
@ -1890,9 +1893,8 @@ QualType Sema::HandleVectorTypeAttribute(QualType curType,
|
|||
sizeExpr->getSourceRange());
|
||||
return QualType();
|
||||
}
|
||||
// Since OpenCU requires 3 element vectors (OpenCU 5.1.2), we don't restrict
|
||||
// the number of elements to be a power of two (unlike GCC).
|
||||
// Instantiate the vector type, the number of elements is > 0.
|
||||
// Instantiate the vector type, the number of elements is > 0, and not
|
||||
// required to be a power of 2, unlike GCC.
|
||||
return Context.getVectorType(curType, vectorSize/typeSize);
|
||||
}
|
||||
|
||||
|
@ -1919,7 +1921,27 @@ void Sema::HandlePackedAttribute(Decl *d, AttributeList *rawAttr) {
|
|||
Diag(rawAttr->getLoc(), diag::warn_attribute_ignored,
|
||||
rawAttr->getName()->getName());
|
||||
}
|
||||
|
||||
void Sema::HandleAnnotateAttribute(Decl *d, AttributeList *rawAttr) {
|
||||
// check the attribute arguments.
|
||||
if (rawAttr->getNumArgs() != 1) {
|
||||
Diag(rawAttr->getLoc(), diag::err_attribute_wrong_number_arguments,
|
||||
std::string("1"));
|
||||
return;
|
||||
}
|
||||
Expr *argExpr = static_cast<Expr *>(rawAttr->getArg(0));
|
||||
StringLiteral *SE = dyn_cast<StringLiteral>(argExpr);
|
||||
|
||||
// Make sure that there is a string literal as the annotation's single
|
||||
// argument.
|
||||
if (!SE) {
|
||||
Diag(rawAttr->getLoc(), diag::err_attribute_annotate_no_string);
|
||||
return;
|
||||
}
|
||||
d->addAttr(new AnnotateAttr(std::string(SE->getStrData(),
|
||||
SE->getByteLength())));
|
||||
}
|
||||
|
||||
void Sema::HandleAlignedAttribute(Decl *d, AttributeList *rawAttr)
|
||||
{
|
||||
// check the attribute arguments.
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#define LLVM_CLANG_AST_ATTR_H
|
||||
|
||||
#include <cassert>
|
||||
#include <string>
|
||||
|
||||
namespace clang {
|
||||
|
||||
|
@ -23,7 +24,8 @@ class Attr {
|
|||
public:
|
||||
enum Kind {
|
||||
Aligned,
|
||||
Packed
|
||||
Packed,
|
||||
Annotate
|
||||
};
|
||||
|
||||
private:
|
||||
|
@ -80,6 +82,20 @@ public:
|
|||
static bool classof(const AlignedAttr *A) { return true; }
|
||||
};
|
||||
|
||||
class AnnotateAttr : public Attr {
|
||||
std::string Annotation;
|
||||
public:
|
||||
AnnotateAttr(const std::string &ann) : Attr(Annotate), Annotation(ann) {}
|
||||
|
||||
const std::string& getAnnotation() const { return Annotation; }
|
||||
|
||||
// Implement isa/cast/dyncast/etc.
|
||||
static bool classof(const Attr *A) {
|
||||
return A->getKind() == Annotate;
|
||||
}
|
||||
static bool classof(const AnnotateAttr *A) { return true; }
|
||||
};
|
||||
|
||||
} // end namespace clang
|
||||
|
||||
#endif
|
||||
|
|
|
@ -581,10 +581,12 @@ DIAG(err_attribute_address_space_not_int, ERROR,
|
|||
"address space attribute requires an integer constant")
|
||||
DIAG(err_attribute_address_multiple_qualifiers, ERROR,
|
||||
"multiple address spaces specified for type")
|
||||
DIAG(err_attribute_annotate_no_string, ERROR,
|
||||
"argument to annotate attribute was not a string literal")
|
||||
DIAG(warn_attribute_ignored, WARNING,
|
||||
"'%0' attribute ignored")
|
||||
"'%0' attribute ignored")
|
||||
DIAG(warn_attribute_ignored_for_field_of_type, WARNING,
|
||||
"'%0' attribute ignored for field of type '%1'")
|
||||
"'%0' attribute ignored for field of type '%1'")
|
||||
|
||||
// Function Parameter Semantic Analysis.
|
||||
DIAG(err_param_with_void_type, ERROR,
|
||||
|
|
|
@ -47,7 +47,8 @@ public:
|
|||
AT_ocu_vector_type,
|
||||
AT_address_space,
|
||||
AT_aligned,
|
||||
AT_packed
|
||||
AT_packed,
|
||||
AT_annotate
|
||||
};
|
||||
|
||||
IdentifierInfo *getName() const { return AttrName; }
|
||||
|
|
Loading…
Reference in New Issue