Commit de7bf722 authored by Simon Cook's avatar Simon Cook
Browse files

[RISCV] Add error checking for extensions missing separating underscores

Currently if two multi-letter extensions are provided in a -march=
string, the verification code checks the version of the first and
consumes the second, resulting in that part of the architecture
string being ignored. This adds a test that when a version number has
been parsed for an extension, there are no subsequent characters.

Differential Revision: https://reviews.llvm.org/D83819
parent 14bc5e14
Loading
Loading
Loading
Loading
+11 −1
Original line number Diff line number Diff line
@@ -89,7 +89,7 @@ static bool getExtensionVersion(const Driver &D, const ArgList &Args,

  if (Major.size() && In.consume_front("p")) {
    Minor = std::string(In.take_while(isDigit));
    In = In.substr(Major.size());
    In = In.substr(Major.size() + 1);

    // Expected 'p' to be followed by minor version number.
    if (Minor.empty()) {
@@ -101,6 +101,16 @@ static bool getExtensionVersion(const Driver &D, const ArgList &Args,
    }
  }

  // Expected multi-character extension with version number to have no
  // subsequent characters (i.e. must either end string or be followed by
  // an underscore).
  if (Ext.size() > 1 && In.size()) {
    std::string Error =
        "multi-character extensions must be separated by underscores";
    D.Diag(diag::err_drv_invalid_riscv_ext_arch_name) << MArch << Error << In;
    return false;
  }

  // If experimental extension, require use of current version number number
  if (auto ExperimentalExtension = isExperimentalExtension(Ext)) {
    if (!Args.hasArg(options::OPT_menable_experimental_extensions)) {
+4 −0
Original line number Diff line number Diff line
@@ -361,6 +361,10 @@
// RV32-EXPERIMENTAL-ZBB-ZBP: "-target-feature" "+experimental-zbb"
// RV32-EXPERIMENTAL-ZBB-ZBP: "-target-feature" "+experimental-zbp"

// RUN: %clang -target riscv32-unknown-elf -march=rv32izbb0p92zbp0p92 -menable-experimental-extensions -### %s \
// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32-EXPERIMENTAL-ZBB-ZBP-UNDERSCORE %s
// RV32-EXPERIMENTAL-ZBB-ZBP-UNDERSCORE: error: invalid arch name 'rv32izbb0p92zbp0p92', multi-character extensions must be separated by underscores

// RUN: %clang -target riscv32-unknown-elf -march=rv32iv -### %s -c 2>&1 | \
// RUN:   FileCheck -check-prefix=RV32-EXPERIMENTAL-V-NOFLAG %s
// RV32-EXPERIMENTAL-V-NOFLAG: error: invalid arch name 'rv32iv'