Merged to 8.0 in r351441.
On Wed, Jan 16, 2019 at 2:47 PM Anton Korobeynikov via cfe-commits <cfe-commits@lists.llvm.org> wrote: > > Author: asl > Date: Wed Jan 16 05:44:01 2019 > New Revision: 351344 > > URL: http://llvm.org/viewvc/llvm-project?rev=351344&view=rev > Log: > [MSP430] Improve support of 'interrupt' attribute > > * Accept as an argument constants in range 0..63 (aligned with TI headers and > linker scripts provided with TI GCC toolchain). > * Emit function attribute 'interrupt'='xx' instead of aliases (used in the > backend to create a section for particular interrupt vector). > * Add more diagnostics. > > Patch by Kristina Bessonova! > > Differential Revision: https://reviews.llvm.org/D56663 > > Added: > cfe/trunk/test/CodeGen/attr-msp430.c > Modified: > cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td > cfe/trunk/lib/CodeGen/TargetInfo.cpp > cfe/trunk/lib/Sema/SemaDeclAttr.cpp > cfe/trunk/test/Sema/attr-msp430.c > > Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=351344&r1=351343&r2=351344&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) > +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Wed Jan 16 05:44:01 > 2019 > @@ -274,6 +274,10 @@ def warn_riscv_interrupt_attribute : War > "RISC-V 'interrupt' attribute only applies to functions that have " > "%select{no parameters|a 'void' return type}0">, > InGroup<IgnoredAttributes>; > +def warn_msp430_interrupt_attribute : Warning< > + "MSP430 'interrupt' attribute only applies to functions that have " > + "%select{no parameters|a 'void' return type}0">, > + InGroup<IgnoredAttributes>; > def warn_unused_parameter : Warning<"unused parameter %0">, > InGroup<UnusedParameter>, DefaultIgnore; > def warn_unused_variable : Warning<"unused variable %0">, > > Modified: cfe/trunk/lib/CodeGen/TargetInfo.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/TargetInfo.cpp?rev=351344&r1=351343&r2=351344&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/TargetInfo.cpp (original) > +++ cfe/trunk/lib/CodeGen/TargetInfo.cpp Wed Jan 16 05:44:01 2019 > @@ -6774,21 +6774,19 @@ void MSP430TargetCodeGenInfo::setTargetA > if (GV->isDeclaration()) > return; > if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) { > - if (const MSP430InterruptAttr *attr = > FD->getAttr<MSP430InterruptAttr>()) { > - // Handle 'interrupt' attribute: > - llvm::Function *F = cast<llvm::Function>(GV); > + const auto *InterruptAttr = FD->getAttr<MSP430InterruptAttr>(); > + if (!InterruptAttr) > + return; > > - // Step 1: Set ISR calling convention. > - F->setCallingConv(llvm::CallingConv::MSP430_INTR); > + // Handle 'interrupt' attribute: > + llvm::Function *F = cast<llvm::Function>(GV); > > - // Step 2: Add attributes goodness. > - F->addFnAttr(llvm::Attribute::NoInline); > + // Step 1: Set ISR calling convention. > + F->setCallingConv(llvm::CallingConv::MSP430_INTR); > > - // Step 3: Emit ISR vector alias. > - unsigned Num = attr->getNumber() / 2; > - llvm::GlobalAlias::create(llvm::Function::ExternalLinkage, > - "__isr_" + Twine(Num), F); > - } > + // Step 2: Add attributes goodness. > + F->addFnAttr(llvm::Attribute::NoInline); > + F->addFnAttr("interrupt", llvm::utostr(InterruptAttr->getNumber())); > } > } > > > Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=351344&r1=351343&r2=351344&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original) > +++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Wed Jan 16 05:44:01 2019 > @@ -5377,6 +5377,27 @@ static void handleARMInterruptAttr(Sema > } > > static void handleMSP430InterruptAttr(Sema &S, Decl *D, const ParsedAttr > &AL) { > + // MSP430 'interrupt' attribute is applied to > + // a function with no parameters and void return type. > + if (!isFunctionOrMethod(D)) { > + S.Diag(D->getLocation(), diag::warn_attribute_wrong_decl_type) > + << "'interrupt'" << ExpectedFunctionOrMethod; > + return; > + } > + > + if (hasFunctionProto(D) && getFunctionOrMethodNumParams(D) != 0) { > + S.Diag(D->getLocation(), diag::warn_msp430_interrupt_attribute) > + << 0; > + return; > + } > + > + if (!getFunctionOrMethodResultType(D)->isVoidType()) { > + S.Diag(D->getLocation(), diag::warn_msp430_interrupt_attribute) > + << 1; > + return; > + } > + > + // The attribute takes one integer argument. > if (!checkAttributeNumArgs(S, AL, 1)) > return; > > @@ -5386,8 +5407,6 @@ static void handleMSP430InterruptAttr(Se > return; > } > > - // FIXME: Check for decl - it should be void ()(void). > - > Expr *NumParamsExpr = static_cast<Expr *>(AL.getArgAsExpr(0)); > llvm::APSInt NumParams(32); > if (!NumParamsExpr->isIntegerConstantExpr(NumParams, S.Context)) { > @@ -5396,9 +5415,9 @@ static void handleMSP430InterruptAttr(Se > << NumParamsExpr->getSourceRange(); > return; > } > - > + // The argument should be in range 0..63. > unsigned Num = NumParams.getLimitedValue(255); > - if ((Num & 1) || Num > 30) { > + if (Num > 63) { > S.Diag(AL.getLoc(), diag::err_attribute_argument_out_of_bounds) > << AL << (int)NumParams.getSExtValue() > << NumParamsExpr->getSourceRange(); > > Added: cfe/trunk/test/CodeGen/attr-msp430.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/attr-msp430.c?rev=351344&view=auto > ============================================================================== > --- cfe/trunk/test/CodeGen/attr-msp430.c (added) > +++ cfe/trunk/test/CodeGen/attr-msp430.c Wed Jan 16 05:44:01 2019 > @@ -0,0 +1,10 @@ > +// RUN: %clang_cc1 -triple msp430-unknown-unknown -emit-llvm < %s| FileCheck > %s > + > +__attribute__((interrupt(1))) void foo(void) {} > +// CHECK: @llvm.used > +// CHECK-SAME: @foo > + > +// CHECK: define msp430_intrcc void @foo() #0 > +// CHECK: attributes #0 > +// CHECK-SAME: noinline > +// CHECK-SAME: "interrupt"="1" > > Modified: cfe/trunk/test/Sema/attr-msp430.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/attr-msp430.c?rev=351344&r1=351343&r2=351344&view=diff > ============================================================================== > --- cfe/trunk/test/Sema/attr-msp430.c (original) > +++ cfe/trunk/test/Sema/attr-msp430.c Wed Jan 16 05:44:01 2019 > @@ -1,6 +1,13 @@ > // RUN: %clang_cc1 -triple msp430-unknown-unknown -fsyntax-only -verify %s > > +__attribute__((interrupt(1))) int t; // expected-warning {{'interrupt' > attribute only applies to functions}} > + > int i; > -void f(void) __attribute__((interrupt(i))); /* expected-error {{'interrupt' > attribute requires an integer constant}} */ > +__attribute__((interrupt(i))) void f(void); // expected-error {{'interrupt' > attribute requires an integer constant}} > +__attribute__((interrupt(1, 2))) void f2(void); // expected-error > {{'interrupt' attribute takes one argument}} > +__attribute__((interrupt(1))) int f3(void); // expected-warning {{MSP430 > 'interrupt' attribute only applies to functions that have a 'void' return > type}} > +__attribute__((interrupt(1))) void f4(int a); // expected-warning {{MSP430 > 'interrupt' attribute only applies to functions that have no parameters}} > +__attribute__((interrupt(64))) void f5(void); // expected-error > {{'interrupt' attribute parameter 64 is out of bounds}} > > -void f2(void) __attribute__((interrupt(12))); > +__attribute__((interrupt(0))) void f6(void); > +__attribute__((interrupt(63))) void f7(void); > > > _______________________________________________ > 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