[PATCH] D56925: Do not use frame pointer by default for MSP430
dmikushin created this revision. Herald added a subscriber: cfe-commits. dmikushin added a reviewer: asl. > 3.3.9 Frame Pointer > MSP430 does not use a frame pointer. This effectively limits a single call > frame to 0x7fff bytes, which is the minimum SP offset supported by any > instruction We do allow user to manually enable frame pointer. GCC toolchain uses the same behavior. Repository: rC Clang https://reviews.llvm.org/D56925 Files: lib/Driver/ToolChains/Clang.cpp Index: lib/Driver/ToolChains/Clang.cpp === --- lib/Driver/ToolChains/Clang.cpp +++ lib/Driver/ToolChains/Clang.cpp @@ -519,10 +519,10 @@ case llvm::Triple::xcore: case llvm::Triple::wasm32: case llvm::Triple::wasm64: + case llvm::Triple::msp430: // XCore never wants frame pointers, regardless of OS. // WebAssembly never wants frame pointers. return false; - case llvm::Triple::msp430: case llvm::Triple::riscv32: case llvm::Triple::riscv64: return !areOptimizationsEnabled(Args); Index: lib/Driver/ToolChains/Clang.cpp === --- lib/Driver/ToolChains/Clang.cpp +++ lib/Driver/ToolChains/Clang.cpp @@ -519,10 +519,10 @@ case llvm::Triple::xcore: case llvm::Triple::wasm32: case llvm::Triple::wasm64: + case llvm::Triple::msp430: // XCore never wants frame pointers, regardless of OS. // WebAssembly never wants frame pointers. return false; - case llvm::Triple::msp430: case llvm::Triple::riscv32: case llvm::Triple::riscv64: return !areOptimizationsEnabled(Args); ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D56927: Disable PIC/PIE for MSP430 target
dmikushin created this revision. dmikushin added a reviewer: asl. Herald added a subscriber: cfe-commits. Relocatable code generation is meaningless on MSP430, as the platform is too small to use shared libraries. Repository: rC Clang https://reviews.llvm.org/D56927 Files: lib/Driver/ToolChains/MSP430.h Index: lib/Driver/ToolChains/MSP430.h === --- lib/Driver/ToolChains/MSP430.h +++ lib/Driver/ToolChains/MSP430.h @@ -37,6 +37,10 @@ llvm::opt::ArgStringList &CC1Args, Action::OffloadKind) const override; + bool isPICDefault() const override { return false; } + bool isPIEDefault() const override { return false; } + bool isPICDefaultForced() const override { return true; } + protected: Tool *buildLinker() const override; Index: lib/Driver/ToolChains/MSP430.h === --- lib/Driver/ToolChains/MSP430.h +++ lib/Driver/ToolChains/MSP430.h @@ -37,6 +37,10 @@ llvm::opt::ArgStringList &CC1Args, Action::OffloadKind) const override; + bool isPICDefault() const override { return false; } + bool isPIEDefault() const override { return false; } + bool isPICDefaultForced() const override { return true; } + protected: Tool *buildLinker() const override; ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D56925: Do not use frame pointer by default for MSP430
dmikushin updated this revision to Diff 182998. dmikushin added a comment. @grimar Please find the updated patch with a test case. Repository: rC Clang CHANGES SINCE LAST ACTION https://reviews.llvm.org/D56925/new/ https://reviews.llvm.org/D56925 Files: lib/Driver/ToolChains/Clang.cpp test/CodeGen/msp430-fp-elim.c Index: test/CodeGen/msp430-fp-elim.c === --- /dev/null +++ test/CodeGen/msp430-fp-elim.c @@ -0,0 +1,18 @@ +// RUN: %clang_cc1 -mdisable-fp-elim -triple msp430 -S %s -o - | FileCheck %s --check-prefix=FP_ENFORCED +// RUN: %clang_cc1 -triple msp430 -S %s -o - | FileCheck %s --check-prefix=FP_DEFAULT + +// Check the frame pointer is not used on MSP430 by default, but can be forcibly turned on. + +// FP_ENFORCED: push r4 +// FP_ENFORCED: calla r4 +// FP_ENFORCED: pop r4 +// FP_DEFAULT: .globl fp_elim_check +// FP_DEFAULT-NOT: push r4 +// FP_DEFAULT: calla r4 +// FP_DEFAULT-NOT: pop r4 + +void fp_elim_check() +{ + asm volatile ("calla r4"); +} + Index: lib/Driver/ToolChains/Clang.cpp === --- lib/Driver/ToolChains/Clang.cpp +++ lib/Driver/ToolChains/Clang.cpp @@ -519,10 +519,10 @@ case llvm::Triple::xcore: case llvm::Triple::wasm32: case llvm::Triple::wasm64: + case llvm::Triple::msp430: // XCore never wants frame pointers, regardless of OS. // WebAssembly never wants frame pointers. return false; - case llvm::Triple::msp430: case llvm::Triple::riscv32: case llvm::Triple::riscv64: return !areOptimizationsEnabled(Args); Index: test/CodeGen/msp430-fp-elim.c === --- /dev/null +++ test/CodeGen/msp430-fp-elim.c @@ -0,0 +1,18 @@ +// RUN: %clang_cc1 -mdisable-fp-elim -triple msp430 -S %s -o - | FileCheck %s --check-prefix=FP_ENFORCED +// RUN: %clang_cc1 -triple msp430 -S %s -o - | FileCheck %s --check-prefix=FP_DEFAULT + +// Check the frame pointer is not used on MSP430 by default, but can be forcibly turned on. + +// FP_ENFORCED: push r4 +// FP_ENFORCED: calla r4 +// FP_ENFORCED: pop r4 +// FP_DEFAULT: .globl fp_elim_check +// FP_DEFAULT-NOT: push r4 +// FP_DEFAULT: calla r4 +// FP_DEFAULT-NOT: pop r4 + +void fp_elim_check() +{ + asm volatile ("calla r4"); +} + Index: lib/Driver/ToolChains/Clang.cpp === --- lib/Driver/ToolChains/Clang.cpp +++ lib/Driver/ToolChains/Clang.cpp @@ -519,10 +519,10 @@ case llvm::Triple::xcore: case llvm::Triple::wasm32: case llvm::Triple::wasm64: + case llvm::Triple::msp430: // XCore never wants frame pointers, regardless of OS. // WebAssembly never wants frame pointers. return false; - case llvm::Triple::msp430: case llvm::Triple::riscv32: case llvm::Triple::riscv64: return !areOptimizationsEnabled(Args); ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D56927: Disable PIC/PIE for MSP430 target
dmikushin updated this revision to Diff 183214. dmikushin added a comment. Adding test case Repository: rC Clang CHANGES SINCE LAST ACTION https://reviews.llvm.org/D56927/new/ https://reviews.llvm.org/D56927 Files: lib/Driver/ToolChains/MSP430.h test/CodeGen/msp430-reloc.c Index: test/CodeGen/msp430-reloc.c === --- /dev/null +++ test/CodeGen/msp430-reloc.c @@ -0,0 +1,29 @@ +// RUN: %clang -target msp430 -fPIC -S %s -o - | FileCheck %s + +// Check the compilation does not crash as it was crashing before with "-fPIC" enabled + +void *alloca(unsigned int size); + +// CHECK: .globl foo +short foo(char** data, char encoding) +{ + char* encoding_addr = alloca(sizeof(char)); + *encoding_addr = encoding; + + char tmp3 = *encoding_addr; + short conv2 = tmp3; + short and = conv2 & 0xf; + + switch (and) + { + case 0 : + case 4 : + case 10 : + return 1; + case 11 : + return 2; + } + + return 0; +} + Index: lib/Driver/ToolChains/MSP430.h === --- lib/Driver/ToolChains/MSP430.h +++ lib/Driver/ToolChains/MSP430.h @@ -37,6 +37,10 @@ llvm::opt::ArgStringList &CC1Args, Action::OffloadKind) const override; + bool isPICDefault() const override { return false; } + bool isPIEDefault() const override { return false; } + bool isPICDefaultForced() const override { return true; } + protected: Tool *buildLinker() const override; Index: test/CodeGen/msp430-reloc.c === --- /dev/null +++ test/CodeGen/msp430-reloc.c @@ -0,0 +1,29 @@ +// RUN: %clang -target msp430 -fPIC -S %s -o - | FileCheck %s + +// Check the compilation does not crash as it was crashing before with "-fPIC" enabled + +void *alloca(unsigned int size); + +// CHECK: .globl foo +short foo(char** data, char encoding) +{ + char* encoding_addr = alloca(sizeof(char)); + *encoding_addr = encoding; + + char tmp3 = *encoding_addr; + short conv2 = tmp3; + short and = conv2 & 0xf; + + switch (and) + { + case 0 : + case 4 : + case 10 : + return 1; + case 11 : + return 2; + } + + return 0; +} + Index: lib/Driver/ToolChains/MSP430.h === --- lib/Driver/ToolChains/MSP430.h +++ lib/Driver/ToolChains/MSP430.h @@ -37,6 +37,10 @@ llvm::opt::ArgStringList &CC1Args, Action::OffloadKind) const override; + bool isPICDefault() const override { return false; } + bool isPIEDefault() const override { return false; } + bool isPICDefaultForced() const override { return true; } + protected: Tool *buildLinker() const override; ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D56925: Do not use frame pointer by default for MSP430
dmikushin updated this revision to Diff 184116. dmikushin edited the summary of this revision. dmikushin added a comment. Unbreaking clang driver patch. Not using calla asm instruction, as recomended. Repository: rC Clang CHANGES SINCE LAST ACTION https://reviews.llvm.org/D56925/new/ https://reviews.llvm.org/D56925 Files: lib/Driver/ToolChains/Clang.cpp test/CodeGen/msp430-fp-elim.c Index: test/CodeGen/msp430-fp-elim.c === --- /dev/null +++ test/CodeGen/msp430-fp-elim.c @@ -0,0 +1,19 @@ +// REQUIRES: msp430-registered-target +// RUN: %clang_cc1 -mdisable-fp-elim -triple msp430 -S %s -o - | FileCheck %s --check-prefix=FP_ENFORCED +// RUN: %clang_cc1 -triple msp430 -S %s -o - | FileCheck %s --check-prefix=FP_DEFAULT + +// Check the frame pointer is not used on MSP430 by default, but can be forcibly turned on. + +// FP_ENFORCED: push r4 +// FP_ENFORCED: mov r4, r4 +// FP_ENFORCED: pop r4 +// FP_DEFAULT: .globl fp_elim_check +// FP_DEFAULT-NOT: push r4 +// FP_DEFAULT: mov r4, r4 +// FP_DEFAULT-NOT: pop r4 + +void fp_elim_check() +{ + asm volatile ("mov r4, r4"); +} + Index: lib/Driver/ToolChains/Clang.cpp === --- lib/Driver/ToolChains/Clang.cpp +++ lib/Driver/ToolChains/Clang.cpp @@ -519,6 +519,7 @@ case llvm::Triple::xcore: case llvm::Triple::wasm32: case llvm::Triple::wasm64: + case llvm::Triple::msp430: // XCore never wants frame pointers, regardless of OS. // WebAssembly never wants frame pointers. return false; Index: test/CodeGen/msp430-fp-elim.c === --- /dev/null +++ test/CodeGen/msp430-fp-elim.c @@ -0,0 +1,19 @@ +// REQUIRES: msp430-registered-target +// RUN: %clang_cc1 -mdisable-fp-elim -triple msp430 -S %s -o - | FileCheck %s --check-prefix=FP_ENFORCED +// RUN: %clang_cc1 -triple msp430 -S %s -o - | FileCheck %s --check-prefix=FP_DEFAULT + +// Check the frame pointer is not used on MSP430 by default, but can be forcibly turned on. + +// FP_ENFORCED: push r4 +// FP_ENFORCED: mov r4, r4 +// FP_ENFORCED: pop r4 +// FP_DEFAULT: .globl fp_elim_check +// FP_DEFAULT-NOT: push r4 +// FP_DEFAULT: mov r4, r4 +// FP_DEFAULT-NOT: pop r4 + +void fp_elim_check() +{ + asm volatile ("mov r4, r4"); +} + Index: lib/Driver/ToolChains/Clang.cpp === --- lib/Driver/ToolChains/Clang.cpp +++ lib/Driver/ToolChains/Clang.cpp @@ -519,6 +519,7 @@ case llvm::Triple::xcore: case llvm::Triple::wasm32: case llvm::Triple::wasm64: + case llvm::Triple::msp430: // XCore never wants frame pointers, regardless of OS. // WebAssembly never wants frame pointers. return false; ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D56927: Disable PIC/PIE for MSP430 target
dmikushin updated this revision to Diff 184118. dmikushin added a comment. Unbreaking patch by providing an appropriate toolchain requirement Repository: rC Clang CHANGES SINCE LAST ACTION https://reviews.llvm.org/D56927/new/ https://reviews.llvm.org/D56927 Files: lib/Driver/ToolChains/MSP430.h test/CodeGen/msp430-reloc.c Index: test/CodeGen/msp430-reloc.c === --- /dev/null +++ test/CodeGen/msp430-reloc.c @@ -0,0 +1,30 @@ +// REQUIRES: msp430-registered-target +// RUN: %clang -target msp430 -fPIC -S %s -o - | FileCheck %s + +// Check the compilation does not crash as it was crashing before with "-fPIC" enabled + +void *alloca(unsigned int size); + +// CHECK: .globl foo +short foo(char** data, char encoding) +{ + char* encoding_addr = alloca(sizeof(char)); + *encoding_addr = encoding; + + char tmp3 = *encoding_addr; + short conv2 = tmp3; + short and = conv2 & 0xf; + + switch (and) + { + case 0 : + case 4 : + case 10 : + return 1; + case 11 : + return 2; + } + + return 0; +} + Index: lib/Driver/ToolChains/MSP430.h === --- lib/Driver/ToolChains/MSP430.h +++ lib/Driver/ToolChains/MSP430.h @@ -36,6 +36,10 @@ llvm::opt::ArgStringList &CC1Args, Action::OffloadKind) const override; + bool isPICDefault() const override { return false; } + bool isPIEDefault() const override { return false; } + bool isPICDefaultForced() const override { return true; } + protected: Tool *buildLinker() const override; Index: test/CodeGen/msp430-reloc.c === --- /dev/null +++ test/CodeGen/msp430-reloc.c @@ -0,0 +1,30 @@ +// REQUIRES: msp430-registered-target +// RUN: %clang -target msp430 -fPIC -S %s -o - | FileCheck %s + +// Check the compilation does not crash as it was crashing before with "-fPIC" enabled + +void *alloca(unsigned int size); + +// CHECK: .globl foo +short foo(char** data, char encoding) +{ + char* encoding_addr = alloca(sizeof(char)); + *encoding_addr = encoding; + + char tmp3 = *encoding_addr; + short conv2 = tmp3; + short and = conv2 & 0xf; + + switch (and) + { + case 0 : + case 4 : + case 10 : + return 1; + case 11 : + return 2; + } + + return 0; +} + Index: lib/Driver/ToolChains/MSP430.h === --- lib/Driver/ToolChains/MSP430.h +++ lib/Driver/ToolChains/MSP430.h @@ -36,6 +36,10 @@ llvm::opt::ArgStringList &CC1Args, Action::OffloadKind) const override; + bool isPICDefault() const override { return false; } + bool isPIEDefault() const override { return false; } + bool isPICDefaultForced() const override { return true; } + protected: Tool *buildLinker() const override; ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits