From 373feca7a02a75e5ab4788ac77fd061883c23ff6 Mon Sep 17 00:00:00 2001 From: Reed Kotler Date: Wed, 16 Jan 2013 17:10:28 +0000 Subject: [PATCH] First step in implementation of mips16 and nomips16 attributes. Waiting for new llvm attribute code for the next step. llvm-svn: 172626 --- clang/include/clang/Basic/Attr.td | 10 ++++++ clang/lib/CodeGen/TargetInfo.cpp | 7 +++++ clang/lib/Sema/TargetAttributesSema.cpp | 51 +++++++++++++++++++++++++++++++ clang/test/Sema/mips16_attr_allowed.c | 27 ++++++++++++++++ clang/test/Sema/mips16_attr_not_allowed.c | 7 +++++ 5 files changed, 102 insertions(+) create mode 100644 clang/test/Sema/mips16_attr_allowed.c create mode 100644 clang/test/Sema/mips16_attr_not_allowed.c diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td index 1830a14..9dd92ad 100644 --- a/clang/include/clang/Basic/Attr.td +++ b/clang/include/clang/Basic/Attr.td @@ -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">]; diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp index 1b44352..9811143 100644 --- a/clang/lib/CodeGen/TargetInfo.cpp +++ b/clang/lib/CodeGen/TargetInfo.cpp @@ -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; diff --git a/clang/lib/Sema/TargetAttributesSema.cpp b/clang/lib/Sema/TargetAttributesSema.cpp index 94f240c..1b8889d 100644 --- a/clang/lib/Sema/TargetAttributesSema.cpp +++ b/clang/lib/Sema/TargetAttributesSema.cpp @@ -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(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(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); } diff --git a/clang/test/Sema/mips16_attr_allowed.c b/clang/test/Sema/mips16_attr_allowed.c new file mode 100644 index 0000000..21a94e7 --- /dev/null +++ b/clang/test/Sema/mips16_attr_allowed.c @@ -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}} + + diff --git a/clang/test/Sema/mips16_attr_not_allowed.c b/clang/test/Sema/mips16_attr_not_allowed.c new file mode 100644 index 0000000..54f27d61 --- /dev/null +++ b/clang/test/Sema/mips16_attr_not_allowed.c @@ -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}} + + + -- 2.7.4