Skip to content

Commit

Permalink
[RISCV] Remove support for attribute interrupt("user").
Browse files Browse the repository at this point in the history
This was part of the N extension which didn't make it version
1.12 of the privilege specification.

Reviewed By: kito-cheng

Differential Revision: https://reviews.llvm.org/D149314
  • Loading branch information
topperc committed Apr 27, 2023
1 parent 96f3033 commit 05d0cae
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 17 deletions.
4 changes: 2 additions & 2 deletions clang/include/clang/Basic/Attr.td
Original file line number Diff line number Diff line change
Expand Up @@ -1864,8 +1864,8 @@ def RISCVInterrupt : InheritableAttr, TargetSpecificAttr<TargetRISCV> {
let Spellings = [GCC<"interrupt">];
let Subjects = SubjectList<[Function]>;
let Args = [EnumArgument<"Interrupt", "InterruptType",
["user", "supervisor", "machine"],
["user", "supervisor", "machine"],
["supervisor", "machine"],
["supervisor", "machine"],
1>];
let ParseKind = "Interrupt";
let Documentation = [RISCVInterruptDocs];
Expand Down
1 change: 0 additions & 1 deletion clang/lib/CodeGen/TargetInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11524,7 +11524,6 @@ class RISCVTargetCodeGenInfo : public TargetCodeGenInfo {

const char *Kind;
switch (Attr->getInterrupt()) {
case RISCVInterruptAttr::user: Kind = "user"; break;
case RISCVInterruptAttr::supervisor: Kind = "supervisor"; break;
case RISCVInterruptAttr::machine: Kind = "machine"; break;
}
Expand Down
23 changes: 9 additions & 14 deletions clang/test/Sema/riscv-interrupt-attr.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,35 +4,32 @@
// RUN: %clang_cc1 %s -triple riscv64-unknown-elf -verify -fsyntax-only

#if defined(CHECK_IR)
// CHECK-LABEL: @foo_user() #0
// CHECK: ret void
__attribute__((interrupt("user"))) void foo_user(void) {}
// CHECK-LABEL: @foo_supervisor() #1
// CHECK-LABEL: @foo_supervisor() #0
// CHECK: ret void
__attribute__((interrupt("supervisor"))) void foo_supervisor(void) {}
// CHECK-LABEL: @foo_machine() #2
// CHECK-LABEL: @foo_machine() #1
// CHECK: ret void
__attribute__((interrupt("machine"))) void foo_machine(void) {}
// CHECK-LABEL: @foo_default() #2
// CHECK-LABEL: @foo_default() #1
// CHECK: ret void
__attribute__((interrupt())) void foo_default(void) {}
// CHECK-LABEL: @foo_default2() #2
// CHECK-LABEL: @foo_default2() #1
// CHECK: ret void
__attribute__((interrupt())) void foo_default2(void) {}
// CHECK: attributes #0
// CHECK: "interrupt"="user"
// CHECK: attributes #1
// CHECK: "interrupt"="supervisor"
// CHECK: attributes #2
// CHECK: attributes #1
// CHECK: "interrupt"="machine"
#else
struct a { int b; };

struct a test __attribute__((interrupt)); // expected-warning {{'interrupt' attribute only applies to functions}}

__attribute__((interrupt("USER"))) void foo1(void) {} // expected-warning {{'interrupt' attribute argument not supported: USER}}
__attribute__((interrupt("user"))) void foo1b(void) {} // expected-warning {{'interrupt' attribute argument not supported: user}}
__attribute__((interrupt("MACHINE"))) void foo1c(void) {} // expected-warning {{'interrupt' attribute argument not supported: MACHINE}}

__attribute__((interrupt("user", 1))) void foo2(void) {} // expected-error {{'interrupt' attribute takes no more than 1 argument}}
__attribute__((interrupt("machine", 1))) void foo2(void) {} // expected-error {{'interrupt' attribute takes no more than 1 argument}}

__attribute__((interrupt)) int foo3(void) {return 0;} // expected-warning {{RISC-V 'interrupt' attribute only applies to functions that have a 'void' return type}}

Expand All @@ -41,19 +38,17 @@ __attribute__((interrupt())) void foo4(void) {}

__attribute__((interrupt())) void foo5(int a) {} // expected-warning {{RISC-V 'interrupt' attribute only applies to functions that have no parameters}}

__attribute__((interrupt("user"), interrupt("supervisor"))) void foo6(void) {} // expected-warning {{repeated RISC-V 'interrupt' attribute}} \
__attribute__((interrupt("machine"), interrupt("supervisor"))) void foo6(void) {} // expected-warning {{repeated RISC-V 'interrupt' attribute}} \
// expected-note {{repeated RISC-V 'interrupt' attribute is here}}

__attribute__((interrupt, interrupt)) void foo7(void) {} // expected-warning {{repeated RISC-V 'interrupt' attribute}} \
// expected-note {{repeated RISC-V 'interrupt' attribute is here}}

__attribute__((interrupt(""))) void foo8(void) {} // expected-warning {{'interrupt' attribute argument not supported}}

__attribute__((interrupt("user"))) void foo9(void);
__attribute__((interrupt("supervisor"))) void foo9(void);
__attribute__((interrupt("machine"))) void foo9(void);

__attribute__((interrupt("user"))) void foo10(void) {}
__attribute__((interrupt("supervisor"))) void foo11(void) {}
__attribute__((interrupt("machine"))) void foo12(void) {}
__attribute__((interrupt())) void foo13(void) {}
Expand Down

0 comments on commit 05d0cae

Please sign in to comment.