diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -557,11 +557,15 @@ Triple.isOSHurd()) { switch (Triple.getArch()) { // Don't use a frame pointer on linux if optimizing for certain targets. + case llvm::Triple::arm: + case llvm::Triple::armeb: case llvm::Triple::mips64: case llvm::Triple::mips64el: case llvm::Triple::mips: case llvm::Triple::mipsel: case llvm::Triple::systemz: + case llvm::Triple::thumb: + case llvm::Triple::thumbeb: case llvm::Triple::x86: case llvm::Triple::x86_64: return !areOptimizationsEnabled(Args); diff --git a/clang/test/Driver/frame-pointer-elim.c b/clang/test/Driver/frame-pointer-elim.c --- a/clang/test/Driver/frame-pointer-elim.c +++ b/clang/test/Driver/frame-pointer-elim.c @@ -103,5 +103,24 @@ // RUN: %clang -### -target powerpc64 -S -O1 %s 2>&1 | \ // RUN: FileCheck --check-prefix=KEEP-NONE %s +// For AAarch32 (A32, T32) linux targets, default omit frame pointer when +// optimizations are enabled. +// RUN: %clang -### -target arm-linux-gnueabihf- -marm -S %s 2>&1 | \ +// RUN: FileCheck --check-prefix=KEEP-ALL %s +// RUN: %clang -### -target arm-linux-gnueabihf- -mthumb -S %s 2>&1 | \ +// RUN: FileCheck --check-prefix=KEEP-ALL %s +// RUN: %clang -### -target arm-linux-gnueabihf- -marm -mbig-endian -S %s 2>&1 | \ +// RUN: FileCheck --check-prefix=KEEP-ALL %s +// RUN: %clang -### -target arm-linux-gnueabihf- -mthumb -mbig-endian -S %s 2>&1 | \ +// RUN: FileCheck --check-prefix=KEEP-ALL %s +// RUN: %clang -### -target arm-linux-gnueabihf- -marm -O2 -S %s 2>&1 | \ +// RUN: FileCheck --check-prefix=KEEP-NONE %s +// RUN: %clang -### -target arm-linux-gnueabihf- -mthumb -O2 -S %s 2>&1 | \ +// RUN: FileCheck --check-prefix=KEEP-NONE %s +// RUN: %clang -### -target arm-linux-gnueabihf- -marm -mbig-endian -O2 -S %s 2>&1 | \ +// RUN: FileCheck --check-prefix=KEEP-NONE %s +// RUN: %clang -### -target arm-linux-gnueabihf- -mthumb -mbig-endian -O2 -S %s 2>&1 | \ +// RUN: FileCheck --check-prefix=KEEP-NONE %s + void f0() {} void f1() { f0(); } diff --git a/llvm/docs/ReleaseNotes.rst b/llvm/docs/ReleaseNotes.rst --- a/llvm/docs/ReleaseNotes.rst +++ b/llvm/docs/ReleaseNotes.rst @@ -91,6 +91,12 @@ * Implemented C-language intrinsics ```` for the CDE instruction set. +* Clang now defaults to `-fomit-frame-pointer` when targeting Linux for arm + and thumb when optimizations are enabled. Users that were previously not + specifying a value and relying on the implicit compiler default may wish + to specify `-fno-omit-frame-pointer` to get the old behavior. This improves + compatibility with GCC. + Changes to the MIPS Target --------------------------