First step in implementation of mips16 and nomips16 attributes.

Waiting for new llvm attribute code for the next step.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@172626 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Reed Kotler 2013-01-16 17:10:28 +00:00
parent 93cf969df9
commit 7dfd182752
5 changed files with 102 additions and 0 deletions

View File

@ -404,6 +404,11 @@ def MBlazeSaveVolatiles : InheritableAttr {
let SemaHandler = 0;
}
def Mips16 : InheritableAttr {
let Spellings = [GNU<"mips16">, CXX11<"gnu", "mips16">];
let Subjects = [Function];
}
def Mode : Attr {
let Spellings = [GNU<"mode">, CXX11<"gnu", "mode">];
let Args = [IdentifierArgument<"Mode">];
@ -442,6 +447,11 @@ def NoInline : InheritableAttr {
let Spellings = [GNU<"noinline">, CXX11<"gnu", "noinline">];
}
def NoMips16 : InheritableAttr {
let Spellings = [GNU<"nomips16">, CXX11<"gnu", "nomips16">];
let Subjects = [Function];
}
def NonNull : InheritableAttr {
let Spellings = [GNU<"nonnull">, CXX11<"gnu", "nonnull">];
let Args = [VariadicUnsignedArgument<"Args">];

View File

@ -3884,6 +3884,13 @@ public:
return 29;
}
void SetTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
CodeGen::CodeGenModule &CGM) const {
//
// can fill this in when new attribute work in llvm is done.
// attributes mips16 and nomips16 need to be handled here.
//
}
bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
llvm::Value *Address) const;

View File

@ -262,6 +262,54 @@ namespace {
};
}
static void HandleMips16Attr(Decl *D, const AttributeList &Attr, Sema &S) {
// check the attribute arguments.
if (Attr.hasParameterOrArguments()) {
S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
return;
}
// Attribute can only be applied to function types.
if (!isa<FunctionDecl>(D)) {
S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type)
<< Attr.getName() << /* function */0;
return;
}
D->addAttr(::new (S.Context) Mips16Attr(Attr.getRange(), S.Context));
}
static void HandleNoMips16Attr(Decl *D, const AttributeList &Attr, Sema &S) {
// check the attribute arguments.
if (Attr.hasParameterOrArguments()) {
S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
return;
}
// Attribute can only be applied to function types.
if (!isa<FunctionDecl>(D)) {
S.Diag(Attr.getLoc(), diag::err_attribute_wrong_decl_type)
<< Attr.getName() << /* function */0;
return;
}
D->addAttr(::new (S.Context) NoMips16Attr(Attr.getRange(), S.Context));
}
namespace {
class MipsAttributesSema : public TargetAttributesSema {
public:
MipsAttributesSema() { }
bool ProcessDeclAttribute(Scope *scope, Decl *D, const AttributeList &Attr,
Sema &S) const {
if (Attr.getName()->getName() == "mips16") {
HandleMips16Attr(D, Attr, S);
return true;
} else if (Attr.getName()->getName() == "nomips16") {
HandleNoMips16Attr(D, Attr, S);
return true;
}
return false;
}
};
}
const TargetAttributesSema &Sema::getTargetAttributesSema() const {
if (TheTargetAttributesSema)
return *TheTargetAttributesSema;
@ -275,6 +323,9 @@ const TargetAttributesSema &Sema::getTargetAttributesSema() const {
case llvm::Triple::x86:
case llvm::Triple::x86_64:
return *(TheTargetAttributesSema = new X86AttributesSema);
case llvm::Triple::mips:
case llvm::Triple::mipsel:
return *(TheTargetAttributesSema = new MipsAttributesSema);
default:
return *(TheTargetAttributesSema = new TargetAttributesSema);
}

View File

@ -0,0 +1,27 @@
// RUN: %clang_cc1 -triple mipsel-linux-gnu -fsyntax-only -verify %s
void foo32();
void foo16();
void __attribute__((nomips16)) foo32();
void __attribute__((mips16)) foo16();
void __attribute__((nomips16)) foo32_();
void __attribute__((mips16)) foo16_();
void foo32_();
void foo16_();
void foo32__() __attribute__((nomips16));
void foo32__() __attribute__((mips16));
void foo32a() __attribute__((nomips16(xyz))) ; // expected-error {{attribute takes no arguments}}
void __attribute__((mips16(xyz))) foo16a(); // expected-error {{attribute takes no arguments}}
void __attribute__((nomips16(1, 2))) foo32b(); // expected-error {{attribute takes no arguments}}
void __attribute__((mips16(1, 2))) foo16b(); // expected-error {{attribute takes no arguments}}
__attribute((nomips16)) int a; // expected-error {{attribute only applies to functions}}
__attribute((mips16)) int b; // expected-error {{attribute only applies to functions}}

View File

@ -0,0 +1,7 @@
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fsyntax-only -verify %s
void __attribute__((nomips16)) foo32(); // expected-warning {{unknown attribute 'nomips16' ignored}}
void __attribute__((mips16)) foo16(); // expected-warning {{unknown attribute 'mips16' ignored}}