diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 250821a9f9c45..996dfcba0f35e 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -455,6 +455,8 @@ LoongArch Support RISC-V Support ^^^^^^^^^^^^^^ +- The option ``-mcmodel=large`` for the large code model is supported. + CUDA/HIP Language Changes ^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index 2ce6779f4b43e..f58b816a9709d 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -2902,11 +2902,16 @@ void tools::addMCModel(const Driver &D, const llvm::opt::ArgList &Args, } else if (Triple.isPPC64() || Triple.isOSAIX()) { Ok = CM == "small" || CM == "medium" || CM == "large"; } else if (Triple.isRISCV()) { + // Large code model is disallowed to be used with PIC code model. + if (CM == "large" && RelocationModel != llvm::Reloc::Static) + D.Diag(diag::err_drv_argument_not_allowed_with) + << A->getAsString(Args) << "-fpic"; if (CM == "medlow") CM = "small"; else if (CM == "medany") CM = "medium"; - Ok = CM == "small" || CM == "medium"; + Ok = CM == "small" || CM == "medium" || + (CM == "large" && Triple.isRISCV64()); } else if (Triple.getArch() == llvm::Triple::x86_64) { Ok = llvm::is_contained({"small", "kernel", "medium", "large", "tiny"}, CM); diff --git a/clang/test/Driver/riscv-mcmodel.c b/clang/test/Driver/riscv-mcmodel.c index 4f5fa95f59b66..c27d7c63a75a4 100644 --- a/clang/test/Driver/riscv-mcmodel.c +++ b/clang/test/Driver/riscv-mcmodel.c @@ -10,5 +10,14 @@ // RUN: %clang --target=riscv32 -### -c -mcmodel=medany %s 2>&1 | FileCheck --check-prefix=MEDIUM %s // RUN: %clang --target=riscv64 -### -c -mcmodel=medany %s 2>&1 | FileCheck --check-prefix=MEDIUM %s +// RUN: not %clang --target=riscv32 -### -c -mcmodel=large %s 2>&1 | FileCheck --check-prefix=ERR-LARGE %s +// RUN: %clang --target=riscv64 -### -c -mcmodel=large %s 2>&1 | FileCheck --check-prefix=LARGE %s + +// RUN: not %clang --target=riscv64 -### -c -mcmodel=large -fpic %s 2>&1 | FileCheck --check-prefix=LARGE %s + // SMALL: "-mcmodel=small" // MEDIUM: "-mcmodel=medium" +// LARGE: "-mcmodel=large" + +// ERR-LARGE: error: unsupported argument 'large' to option '-mcmodel=' for target 'riscv32' +// ERR-PIC-LARGE: error: invalid argument '-mcmodel=large' not allowed with '-fpic'