On Mon, May 22, 2017 at 8:47 AM, Simon Atanasyan via cfe-commits <cfe-commits@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@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits