r303546 - [mips] Support `micromips` attribute
Aaron Ballman via cfe-commits
cfe-commits at lists.llvm.org
Mon May 22 05:57:00 PDT 2017
On Mon, May 22, 2017 at 8:47 AM, Simon Atanasyan via cfe-commits
<cfe-commits at lists.llvm.org> wrote:
> Author: atanasyan
> Date: Mon May 22 07:47:43 2017
> New Revision: 303546
>
> URL: http://llvm.org/viewvc/llvm-project?rev=303546&view=rev
> Log:
> [mips] Support `micromips` attribute
>
> This patch adds support for the `micromips` and `nomicromips` attributes
> for MIPS targets.
>
> Differential revision: https://reviews.llvm.org/D33363
>
> Added:
> cfe/trunk/test/CodeGen/micromips-attr.c
> cfe/trunk/test/Sema/attr-micromips.c
> Modified:
> cfe/trunk/include/clang/Basic/Attr.td
> cfe/trunk/include/clang/Basic/AttrDocs.td
> cfe/trunk/lib/CodeGen/TargetInfo.cpp
> cfe/trunk/lib/Sema/SemaDeclAttr.cpp
> cfe/trunk/test/Misc/pragma-attribute-supported-attributes-list.test
>
> Modified: cfe/trunk/include/clang/Basic/Attr.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Attr.td?rev=303546&r1=303545&r2=303546&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/Attr.td (original)
> +++ cfe/trunk/include/clang/Basic/Attr.td Mon May 22 07:47:43 2017
> @@ -1179,6 +1179,12 @@ def MipsInterrupt : InheritableAttr, Tar
> let Documentation = [MipsInterruptDocs];
> }
>
> +def MicroMips : InheritableAttr, TargetSpecificAttr<TargetMips> {
> + let Spellings = [GCC<"micromips">];
> + let Subjects = SubjectList<[Function], ErrorDiag>;
Why is this an error rather than a warning? Same question below.
> + let Documentation = [MicroMipsDocs];
> +}
> +
> def Mode : Attr {
> let Spellings = [GCC<"mode">];
> let Subjects = SubjectList<[Var, Enum, TypedefName, Field], ErrorDiag,
> @@ -1261,6 +1267,12 @@ def NoMips16 : InheritableAttr, TargetSp
> let Documentation = [Undocumented];
> }
>
> +def NoMicroMips : InheritableAttr, TargetSpecificAttr<TargetMips> {
> + let Spellings = [GCC<"nomicromips">];
> + let Subjects = SubjectList<[Function], ErrorDiag>;
> + let Documentation = [MicroMipsDocs];
> +}
> +
> // This is not a TargetSpecificAttr so that is silently accepted and
> // ignored on other targets as encouraged by the OpenCL spec.
> //
>
> Modified: cfe/trunk/include/clang/Basic/AttrDocs.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/AttrDocs.td?rev=303546&r1=303545&r2=303546&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/AttrDocs.td (original)
> +++ cfe/trunk/include/clang/Basic/AttrDocs.td Mon May 22 07:47:43 2017
> @@ -1269,6 +1269,19 @@ The semantics are as follows:
> }];
> }
>
> +def MicroMipsDocs : Documentation {
> + let Category = DocCatFunction;
> + let Content = [{
> +Clang supports the GNU style ``__attribute__((micromips))`` and
> +``__attribute__((nomicromips))`` attributes on MIPS targets. These attributes
> +may be attached to a function definition and instructs the backend to generate
> +or not to generate microMIPS code for that function.
> +
> +These attributes override the -mmicromips and -mno-micromips options
Please quote the command line options with ``.
> +on the command line.
> + }];
> +}
> +
> def AVRInterruptDocs : Documentation {
> let Category = DocCatFunction;
> let Content = [{
>
> Modified: cfe/trunk/lib/CodeGen/TargetInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/TargetInfo.cpp?rev=303546&r1=303545&r2=303546&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/TargetInfo.cpp (original)
> +++ cfe/trunk/lib/CodeGen/TargetInfo.cpp Mon May 22 07:47:43 2017
> @@ -6557,6 +6557,11 @@ public:
> Fn->addFnAttr("nomips16");
> }
>
> + if (FD->hasAttr<MicroMipsAttr>())
> + Fn->addFnAttr("micromips");
> + else if (FD->hasAttr<NoMicroMipsAttr>())
> + Fn->addFnAttr("nomicromips");
> +
> const MipsInterruptAttr *Attr = FD->getAttr<MipsInterruptAttr>();
> if (!Attr)
> return;
>
> Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=303546&r1=303545&r2=303546&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Mon May 22 07:47:43 2017
> @@ -5935,12 +5935,18 @@ static void ProcessDeclAttribute(Sema &S
> handleDLLAttr(S, D, Attr);
> break;
> case AttributeList::AT_Mips16:
> - handleSimpleAttributeWithExclusions<Mips16Attr, MipsInterruptAttr>(S, D,
> - Attr);
> + handleSimpleAttributeWithExclusions<Mips16Attr, MicroMipsAttr,
> + MipsInterruptAttr>(S, D, Attr);
> break;
> case AttributeList::AT_NoMips16:
> handleSimpleAttribute<NoMips16Attr>(S, D, Attr);
> break;
> + case AttributeList::AT_MicroMips:
> + handleSimpleAttributeWithExclusions<MicroMipsAttr, Mips16Attr>(S, D, Attr);
> + break;
> + case AttributeList::AT_NoMicroMips:
> + handleSimpleAttribute<NoMicroMipsAttr>(S, D, Attr);
> + break;
> case AttributeList::AT_AMDGPUFlatWorkGroupSize:
> handleAMDGPUFlatWorkGroupSizeAttr(S, D, Attr);
> break;
>
> Added: cfe/trunk/test/CodeGen/micromips-attr.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/micromips-attr.c?rev=303546&view=auto
> ==============================================================================
> --- cfe/trunk/test/CodeGen/micromips-attr.c (added)
> +++ cfe/trunk/test/CodeGen/micromips-attr.c Mon May 22 07:47:43 2017
> @@ -0,0 +1,12 @@
> +// RUN: %clang_cc1 -triple mips-linux-gnu -emit-llvm -o - %s | FileCheck %s
> +
> +void __attribute__((micromips)) foo (void) {}
> +
> +// CHECK: define void @foo() [[MICROMIPS:#[0-9]+]]
> +
> +void __attribute__((nomicromips)) nofoo (void) {}
> +
> +// CHECK: define void @nofoo() [[NOMICROMIPS:#[0-9]+]]
> +
> +// CHECK: attributes [[MICROMIPS]] = { noinline nounwind {{.*}} "micromips" {{.*}} }
> +// CHECK: attributes [[NOMICROMIPS]] = { noinline nounwind {{.*}} "nomicromips" {{.*}} }
>
> Modified: cfe/trunk/test/Misc/pragma-attribute-supported-attributes-list.test
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Misc/pragma-attribute-supported-attributes-list.test?rev=303546&r1=303545&r2=303546&view=diff
> ==============================================================================
> --- cfe/trunk/test/Misc/pragma-attribute-supported-attributes-list.test (original)
> +++ cfe/trunk/test/Misc/pragma-attribute-supported-attributes-list.test Mon May 22 07:47:43 2017
> @@ -2,7 +2,7 @@
>
> // The number of supported attributes should never go down!
>
> -// CHECK: #pragma clang attribute supports 60 attributes:
> +// CHECK: #pragma clang attribute supports 62 attributes:
> // CHECK-NEXT: AMDGPUFlatWorkGroupSize (SubjectMatchRule_function)
> // CHECK-NEXT: AMDGPUNumSGPR (SubjectMatchRule_function)
> // CHECK-NEXT: AMDGPUNumVGPR (SubjectMatchRule_function)
> @@ -30,8 +30,10 @@
> // CHECK-NEXT: IFunc (SubjectMatchRule_function)
> // CHECK-NEXT: InternalLinkage (SubjectMatchRule_variable, SubjectMatchRule_function, SubjectMatchRule_record)
> // CHECK-NEXT: LTOVisibilityPublic (SubjectMatchRule_record)
> +// CHECK-NEXT: MicroMips (SubjectMatchRule_function)
> // CHECK-NEXT: NoDebug (SubjectMatchRule_hasType_functionType, SubjectMatchRule_objc_method, SubjectMatchRule_variable_not_is_parameter)
> // CHECK-NEXT: NoDuplicate (SubjectMatchRule_function)
> +// CHECK-NEXT: NoMicroMips (SubjectMatchRule_function)
> // CHECK-NEXT: NoSanitize (SubjectMatchRule_function, SubjectMatchRule_objc_method, SubjectMatchRule_variable_is_global)
> // CHECK-NEXT: NoSanitizeSpecific (SubjectMatchRule_function, SubjectMatchRule_variable_is_global)
> // CHECK-NEXT: NoSplitStack (SubjectMatchRule_function)
>
> Added: cfe/trunk/test/Sema/attr-micromips.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/attr-micromips.c?rev=303546&view=auto
> ==============================================================================
> --- cfe/trunk/test/Sema/attr-micromips.c (added)
> +++ cfe/trunk/test/Sema/attr-micromips.c Mon May 22 07:47:43 2017
> @@ -0,0 +1,15 @@
> +// RUN: %clang_cc1 -triple mips-linux-gnu -fsyntax-only -verify %s
> +
> +__attribute__((nomicromips(0))) void foo1(); // expected-error {{'nomicromips' attribute takes no arguments}}
> +__attribute__((micromips(1))) void foo2(); // expected-error {{'micromips' attribute takes no arguments}}
> +
> +__attribute((nomicromips)) int a; // expected-error {{attribute only applies to functions}}
> +__attribute((micromips)) int b; // expected-error {{attribute only applies to functions}}
> +
> +__attribute__((micromips,mips16)) void foo5(); // expected-error {{'micromips' and 'mips16' attributes are not compatible}} \
> + // expected-note {{conflicting attribute is here}}
> +__attribute__((mips16,micromips)) void foo6(); // expected-error {{'mips16' and 'micromips' attributes are not compatible}} \
> + // expected-note {{conflicting attribute is here}}
Can you also add a test like:
__attribute__((mips16)) void foo9(void) __attribute__((micromips));
~Aaron
> +
> +__attribute((micromips)) void foo7();
> +__attribute((nomicromips)) void foo8();
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list