forked from llvm-mirror/llvm
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[ARM] Avoid switching ARM/Thumb mode on .arch/.cpu directive
When we see a .arch or .cpu directive, we should try to avoid switching ARM/Thumb mode if possible. If we do have to switch modes, we also need to emit the correct mapping symbol for the new ISA. We did not do this previously, so could emit ARM code with Thumb mapping symbols (or vice-versa). The GAS behaviour is to always stay in the same mode, and to emit an error on any instructions seen when the current mode is not available on the current target. We can't represent that situation easily (we assume that Thumb mode is available if ModeThumb is set), so we differ from the GAS behaviour when switching to a target that can't support the old mode. I've added a warning for when this implicit mode-switch occurs. Differential Revision: http://reviews.llvm.org/D18955 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@265936 91177308-0d34-0410-b5e6-96231b3b80d8
- Loading branch information
Showing
2 changed files
with
82 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
@ RUN: llvm-mc -triple arm-none-eabi -filetype asm %s 2>%t | FileCheck %s | ||
@ RUN: FileCheck %s <%t --check-prefix=STDERR | ||
|
||
@ Start in arm mode | ||
.arm | ||
@ CHECK: .code 32 | ||
|
||
@ In ARM mode, switch to an arch which has ARM and Thumb, no warning or .code directive (stay in ARM mode) | ||
.arch armv7-a | ||
@ STDERR-NOT: [[@LINE-1]]:{{[0-9]+}}: warning: | ||
@ CHECK-NOT: .code | ||
@ CHECK: .arch armv7-a | ||
@ CHECK-NOT: .code | ||
|
||
@ In ARM mode, switch to an arch which has Thumb only, expect warning and .code 16 directive | ||
.arch armv6-m | ||
@ STDERR: [[@LINE-1]]:{{[0-9]+}}: warning: new target does not support arm mode, switching to thumb mode | ||
@ CHECK: .code 16 | ||
@ CHECK: .arch armv6-m | ||
|
||
@ In Thumb mode, switch to an arch which has ARM and Thumb, no warning or .code directive (stay in Thumb mode) | ||
.arch armv7-a | ||
@ STDERR-NOT: [[@LINE-1]]:{{[0-9]+}}: warning: | ||
@ CHECK-NOT: .code | ||
@ CHECK: .arch armv7-a | ||
@ CHECK-NOT: .code | ||
|
||
@ In Thumb mode, switch to a CPU which has ARM and Thumb, no warning or .code directive (stay in Thumb mode) | ||
.cpu cortex-a8 | ||
@ STDERR-NOT: [[@LINE-1]]:{{[0-9]+}}: warning: | ||
@ CHECK-NOT: .code | ||
@ CHECK: .cpu cortex-a8 | ||
@ CHECK-NOT: .code | ||
|
||
@ Switch to ARM mode | ||
.arm | ||
@ CHECK: .code 32 | ||
|
||
@ In ARM mode, switch to a CPU which has ARM and Thumb, no warning or .code directive (stay in ARM mode) | ||
.cpu cortex-a8 | ||
@ STDERR-NOT: [[@LINE-1]]:{{[0-9]+}}: warning: | ||
@ CHECK-NOT: .code | ||
@ CHECK: .cpu cortex-a8 | ||
@ CHECK-NOT: .code | ||
|
||
@ In ARM mode, switch to a CPU which has Thumb only, expect warning and .code 16 directive | ||
.cpu cortex-m3 | ||
@ STDERR: [[@LINE-1]]:{{[0-9]+}}: warning: new target does not support arm mode, switching to thumb mode | ||
@ CHECK: .cpu cortex-m3 | ||
@ CHECK: .code 16 | ||
|
||
@ We don't have any ARM-only targets (i.e. v4), so we can't test the forced Thumb->ARM case |