From 756eaf3dcfd574b6bbc295487d5bee5b03e2b1c4 Mon Sep 17 00:00:00 2001 From: Lain Yang Date: Mon, 28 Nov 2022 10:40:42 -0600 Subject: [PATCH 1/2] llvm-build: Make mipsel target use -mnan=2008 and -mfp64 in building scripts Signed-off-by: Lain Yang --- llvm-build/Makefile | 2 +- llvm-build/build.py | 2 +- llvm-build/build_musl.sh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/llvm-build/Makefile b/llvm-build/Makefile index c45575a8a990..9df865b3df64 100644 --- a/llvm-build/Makefile +++ b/llvm-build/Makefile @@ -97,7 +97,7 @@ ifeq ($(ARCH),riscv64) CFLAGS = -march=rv64gc -O2 -Wall -fstack-protector-strong -D_FORTIFY_SOURCE=2 -Wl,-z,relro,-z,now,-z,noexecstack else ifeq ($(ARCH),mips) -CFLAGS = -march=mips32r2 -O2 -Wall -fstack-protector-strong -D_FORTIFY_SOURCE=2 -Wl,-z,relro,-z,now,-z,noexecstack +CFLAGS = -march=mips32r2 -O2 -Wall -fstack-protector-strong -D_FORTIFY_SOURCE=2 -Wl,-z,relro,-z,now,-z,noexecstack -mnan=2008 -mfp64 else ifeq ($(ARCH),x86_64) CFLAGS = -march=x86-64 -O2 -Wall -fstack-protector-strong -D_FORTIFY_SOURCE=2 -Wl,-z,relro,-z,now,-z,noexecstack diff --git a/llvm-build/build.py b/llvm-build/build.py index 9df15f4f4921..9e5c6c5c3ca1 100755 --- a/llvm-build/build.py +++ b/llvm-build/build.py @@ -880,7 +880,7 @@ class LlvmLibs(BuildUtils): '-march=armv7-a -mcpu=cortex-a7 -mfloat-abi=hard -mfpu=neon-vfpv4', 'a7_hard_neon-vfpv4'), ('aarch64', self.open_ohos_triple('aarch64'), '', ''), ('riscv64', self.open_ohos_triple('riscv64'), '', ''), - ('mipsel', self.open_ohos_triple('mipsel'), '-march=mips32r2', ''), + ('mipsel', self.open_ohos_triple('mipsel'), '-march=mips32r2 -mnan=2008 -mfp64', ''), ('x86_64', self.open_ohos_triple('x86_64'), '', ''),] cc = os.path.join(llvm_install, 'bin', 'clang') diff --git a/llvm-build/build_musl.sh b/llvm-build/build_musl.sh index d6c3a0add8d5..e82261dc3637 100755 --- a/llvm-build/build_musl.sh +++ b/llvm-build/build_musl.sh @@ -80,7 +80,7 @@ elif [ $TARGET_TRIPLE == "arm-linux-ohos" ]; then elif [ $TARGET_TRIPLE == "mipsel-linux-ohos" ]; then TARGET_USER="linux_user" TARGETS_PREFIX="mips" - CFLAGS_FOR_TARGET=("-march=mips32r2") + CFLAGS_FOR_TARGET=("-march=mips32r2 -mfp64 -mnan=2008") elif [ $TARGET_TRIPLE == "riscv64-linux-ohos" ]; then TARGET_USER="linux_user" TARGETS_PREFIX="riscv64" -- Gitee From 47a80788c7556c1b17aab02b5988f8c962c45d93 Mon Sep 17 00:00:00 2001 From: Lain Yang Date: Mon, 28 Nov 2022 10:43:16 -0600 Subject: [PATCH 2/2] MIPS: fix build from IR files, nan2008 and FpAbi When we use llc or lld to compiler IR files, the features +nan2008 and +fpxx/+fp64 are not used. Thus wrong format files are produced. In IR files, the attributes are only set for function while not the whole compile units. So we output .nan 2008 and .module fp=xx/64 before every function. isFPXXDefault: for o32, the FPXX should always be the default, no matter about the vendors. Of course some distributions with FP64 default enabled should be listed explicit. Let's add them in future if we know about one. Differential Revision: https://reviews.llvm.org/D138179 Signed-off-by: Lain Yang --- clang/lib/Driver/ToolChains/Arch/Mips.cpp | 5 ----- clang/test/Driver/mips-as.c | 10 +++++----- clang/test/Driver/mips-integrated-as.s | 6 +++--- llvm/lib/Target/Mips/MipsAsmPrinter.cpp | 8 ++++++++ llvm/test/CodeGen/Mips/abiflags-2008-fp64.ll | 13 +++++++++++++ 5 files changed, 29 insertions(+), 13 deletions(-) create mode 100644 llvm/test/CodeGen/Mips/abiflags-2008-fp64.ll diff --git a/clang/lib/Driver/ToolChains/Arch/Mips.cpp b/clang/lib/Driver/ToolChains/Arch/Mips.cpp index 5a509dbb2bd3..9670c09bc084 100644 --- a/clang/lib/Driver/ToolChains/Arch/Mips.cpp +++ b/clang/lib/Driver/ToolChains/Arch/Mips.cpp @@ -466,11 +466,6 @@ bool mips::isFP64ADefault(const llvm::Triple &Triple, StringRef CPUName) { bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName, StringRef ABIName, mips::FloatABI FloatABI) { - if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies && - Triple.getVendor() != llvm::Triple::MipsTechnologies && - !Triple.isAndroid()) - return false; - if (ABIName != "32") return false; diff --git a/clang/test/Driver/mips-as.c b/clang/test/Driver/mips-as.c index cd4808d14ec7..f075567119e3 100644 --- a/clang/test/Driver/mips-as.c +++ b/clang/test/Driver/mips-as.c @@ -196,7 +196,7 @@ // RUN: %clang -target mips-linux-gnu -mno-mips16 -mips16 -### \ // RUN: -no-integrated-as -c %s 2>&1 \ // RUN: | FileCheck -check-prefix=MIPS-16 %s -// MIPS-16: as{{(.exe)?}}" "-march" "mips32r2" "-mabi" "32" "-mno-shared" "-call_nonpic" "-EB" "-mips16" +// MIPS-16: as{{(.exe)?}}" "-march" "mips32r2" "-mabi" "32" "-mno-shared" "-call_nonpic" "-EB" "-mfpxx" "-mips16" // // RUN: %clang -target mips-linux-gnu -mips16 -mno-mips16 -### \ // RUN: -no-integrated-as -c %s 2>&1 \ @@ -207,7 +207,7 @@ // RUN: %clang -target mips-linux-gnu -mno-micromips -mmicromips -### \ // RUN: -no-integrated-as -c %s 2>&1 \ // RUN: | FileCheck -check-prefix=MIPS-MICRO %s -// MIPS-MICRO: as{{(.exe)?}}" "-march" "mips32r2" "-mabi" "32" "-mno-shared" "-call_nonpic" "-EB" "-mmicromips" +// MIPS-MICRO: as{{(.exe)?}}" "-march" "mips32r2" "-mabi" "32" "-mno-shared" "-call_nonpic" "-EB" "-mfpxx" "-mmicromips" // // RUN: %clang -target mips-linux-gnu -mmicromips -mno-micromips -### \ // RUN: -no-integrated-as -c %s 2>&1 \ @@ -218,7 +218,7 @@ // RUN: %clang -target mips-linux-gnu -mno-dsp -mdsp -### \ // RUN: -no-integrated-as -c %s 2>&1 \ // RUN: | FileCheck -check-prefix=MIPS-DSP %s -// MIPS-DSP: as{{(.exe)?}}" "-march" "mips32r2" "-mabi" "32" "-mno-shared" "-call_nonpic" "-EB" "-mdsp" +// MIPS-DSP: as{{(.exe)?}}" "-march" "mips32r2" "-mabi" "32" "-mno-shared" "-call_nonpic" "-EB" "-mfpxx" "-mdsp" // // RUN: %clang -target mips-linux-gnu -mdsp -mno-dsp -### \ // RUN: -no-integrated-as -c %s 2>&1 \ @@ -229,7 +229,7 @@ // RUN: %clang -target mips-linux-gnu -mno-dspr2 -mdspr2 -### \ // RUN: -no-integrated-as -c %s 2>&1 \ // RUN: | FileCheck -check-prefix=MIPS-DSPR2 %s -// MIPS-DSPR2: as{{(.exe)?}}" "-march" "mips32r2" "-mabi" "32" "-mno-shared" "-call_nonpic" "-EB" "-mdspr2" +// MIPS-DSPR2: as{{(.exe)?}}" "-march" "mips32r2" "-mabi" "32" "-mno-shared" "-call_nonpic" "-EB" "-mfpxx" "-mdspr2" // // RUN: %clang -target mips-linux-gnu -mdspr2 -mno-dspr2 -### \ // RUN: -no-integrated-as -c %s 2>&1 \ @@ -266,7 +266,7 @@ // RUN: %clang -target mips-linux-gnu -mno-msa -mmsa -### \ // RUN: -no-integrated-as -c %s 2>&1 \ // RUN: | FileCheck -check-prefix=MIPS-MSA %s -// MIPS-MSA: as{{(.exe)?}}" "-march" "mips32r2" "-mabi" "32" "-mno-shared" "-call_nonpic" "-EB" "-mmsa" +// MIPS-MSA: as{{(.exe)?}}" "-march" "mips32r2" "-mabi" "32" "-mno-shared" "-call_nonpic" "-EB" "-mfpxx" "-mmsa" // // RUN: %clang -target mips-linux-gnu -mmsa -mno-msa -### \ // RUN: -no-integrated-as -c %s 2>&1 \ diff --git a/clang/test/Driver/mips-integrated-as.s b/clang/test/Driver/mips-integrated-as.s index 46ce5b6871f4..e248ba7f77e9 100644 --- a/clang/test/Driver/mips-integrated-as.s +++ b/clang/test/Driver/mips-integrated-as.s @@ -160,8 +160,8 @@ // RUN: %clang -target mips-linux-gnu -### -fintegrated-as -c %s 2>&1 | \ // RUN: FileCheck -check-prefix=FPXX-DEFAULT %s // FPXX-DEFAULT: -cc1as -// FPXX-DEFAULT-NOT: "-target-feature" "+fpxx" -// FPXX-DEFAULT-NOT: "-target-feature" "+nooddspreg" +// FPXX-DEFAULT: "-target-feature" "+fpxx" +// FPXX-DEFAULT: "-target-feature" "+nooddspreg" // RUN: %clang -target mips-linux-gnu -### -fintegrated-as -c %s -mfp32 2>&1 | \ // RUN: FileCheck -check-prefix=FP32 %s @@ -182,7 +182,7 @@ // RUN: %clang -target mips-linux-gnu -### -fintegrated-as -c %s 2>&1 | \ // RUN: FileCheck -check-prefix=ODDSPREG-DEFAULT %s // ODDSPREG-DEFAULT: -cc1as -// ODDSPREG-DEFAULT-NOT: "-target-feature" "{{[+-]}}nooddspreg" +// ODDSPREG-DEFAULT: "-target-feature" "+nooddspreg" // RUN: %clang -target mips-linux-gnu -### -fintegrated-as -c %s -modd-spreg 2>&1 | \ // RUN: FileCheck -check-prefix=ODDSPREG-ON %s diff --git a/llvm/lib/Target/Mips/MipsAsmPrinter.cpp b/llvm/lib/Target/Mips/MipsAsmPrinter.cpp index b460bc71b11f..e50ab949f32a 100644 --- a/llvm/lib/Target/Mips/MipsAsmPrinter.cpp +++ b/llvm/lib/Target/Mips/MipsAsmPrinter.cpp @@ -400,6 +400,14 @@ const char *MipsAsmPrinter::getCurrentABIString() const { void MipsAsmPrinter::emitFunctionEntryLabel() { MipsTargetStreamer &TS = getTargetStreamer(); + bool IsO32 = (static_cast(TM)).getABI().IsO32(); + + TS.updateABIInfo(*Subtarget); + if (Subtarget->isNaN2008()) + TS.emitDirectiveNaN2008(); + if ((IsO32 && (Subtarget->isABI_FPXX() || Subtarget->isFP64bit())) || + Subtarget->useSoftFloat()) + TS.emitDirectiveModuleFP(); // NaCl sandboxing requires that indirect call instructions are masked. // This means that function entry points should be bundle-aligned. diff --git a/llvm/test/CodeGen/Mips/abiflags-2008-fp64.ll b/llvm/test/CodeGen/Mips/abiflags-2008-fp64.ll new file mode 100644 index 000000000000..f05fc67e0b0f --- /dev/null +++ b/llvm/test/CodeGen/Mips/abiflags-2008-fp64.ll @@ -0,0 +1,13 @@ +; RUN: llc %s -o - | FileCheck %s + +target triple = "mipsel-unknown-linux-gnu" + +define dso_local void @test() #0 { + ret void +} + +attributes #0 = { "target-cpu"="mips32r2" "target-features"="+fp64,+mips32r2,+nan2008" } + + +; CHECK: .nan 2008 +; CHECK: .module fp=64 -- Gitee