ARM IAS: support .personalityindex

The .personalityindex directive is equivalent to the .personality directive with
the ARM EABI personality with the specific index (0, 1, 2).  Both of these
directives indicate personality routines, so enhance the personality directive
handling to take into account personalityindex.

Bonus fix: flush the UnwindContext at the beginning of a new function.

Thanks to Logan Chien for additional tests!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@199706 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Saleem Abdulrasool
2014-01-21 02:33:02 +00:00
parent 9fe8c2b527
commit 27276437ae
6 changed files with 434 additions and 7 deletions

View File

@@ -0,0 +1,122 @@
@ RUN: not llvm-mc -triple armv7-linux-eabi -filetype asm -o /dev/null %s 2>&1 \
@ RUN: | FileCheck %s
.syntax unified
.thumb
.global function
.type function,%function
.thumb_func
function:
.personalityindex 0
@ CHECK: error: .fnstart must precede .personalityindex directive
@ CHECK: .personalityindex 0
@ CHECK: ^
.global ununwindable
.type ununwindable,%function
.thumb_func
ununwindable:
.fnstart
.cantunwind
.personalityindex 0
.fnend
@ CHECK: error: .personalityindex cannot be used with .cantunwind
@ CHECK: .personalityindex 0
@ CHECK: ^
@ CHECK: note: .cantunwind was specified here
@ CHECK: .cantunwind
@ CHECK: ^
.global nodata
.type nodata,%function
.thumb_func
nodata:
.fnstart
.handlerdata
.personalityindex 0
.fnend
@ CHECK: error: .personalityindex must precede .handlerdata directive
@ CHECK: .personalityindex 0
@ CHECK: ^
@ CHECK: note: .handlerdata was specified here
@ CHECK: .handlerdata
@ CHECK: ^
.global multiple_personality
.type multiple_personality,%function
.thumb_func
multiple_personality:
.fnstart
.personality __aeabi_personality_pr0
.personalityindex 0
.fnend
@ CHECK: error: multiple personality directives
@ CHECK: .personalityindex 0
@ CHECK: ^
@ CHECK: note: .personality was specified here
@ CHECK: .personality __aeabi_personality_pr0
@ CHECK: ^
@ CHECK: note: .personalityindex was specified here
@ CHECK: .personalityindex 0
@ CHECK: ^
.global multiple_personality_indicies
.type multiple_personality_indicies,%function
.thumb_func
multiple_personality_indicies:
.fnstart
.personalityindex 0
.personalityindex 1
.fnend
@ CHECK: error: multiple personality directives
@ CHECK: .personalityindex 1
@ CHECK: ^
@ CHECK: note: .personalityindex was specified here
@ CHECK: .personalityindex 0
@ CHECK: ^
@ CHECK: note: .personalityindex was specified here
@ CHECK: .personalityindex 1
@ CHECK: ^
.global invalid_expression
.type invalid_expression,%function
.thumb_func
invalid_expression:
.fnstart
.personalityindex <expression>
.fnend
@ CHECK: error: unknown token in expression
@ CHECK: .personalityindex <expression>
@ CHECK: ^
.global nonconstant_expression
.type nonconstant_expression,%function
.thumb_func
nonconstant_expression:
.fnstart
.personalityindex nonconstant_expression
.fnend
@ CHECK: error: index must be a constant number
@ CHECK: .personalityindex nonconstant_expression
@ CHECK: ^
.global bad_index
.type bad_index,%function
.thumb_func
bad_index:
.fnstart
.personalityindex 42
.fnend
@ CHECK: error: personality routine index should be in range [0-3]
@ CHECK: .personalityindex 42
@ CHECK: ^

View File

@@ -0,0 +1,202 @@
@ RUN: llvm-mc -triple armv7-linux-eabi -filetype obj -o - %s \
@ RUN: | llvm-readobj -s -sd -sr | FileCheck %s
.syntax unified
.thumb
.section .pr0
.global pr0
.type pr0,%function
.thumb_func
pr0:
.fnstart
.personalityindex 0
bx lr
.fnend
@ CHECK: Section {
@ CHECK: Name: .ARM.exidx.pr0
@ CHECK: SectionData (
@ CHECK: 0000: 00000000 B0B0B080
@ CHECK: )
@ CHECK: }
@ CHECK: Section {
@ CHECK: Name: .rel.ARM.exidx.pr0
@ CHECK: Relocations [
@ CHECK: 0x0 R_ARM_PREL31 .pr0 0x0
@ CHECK: 0x0 R_ARM_NONE __aeabi_unwind_cpp_pr0 0x0
@ CHECK: ]
@ CHECK: }
.section .pr0.nontrivial
.global pr0_nontrivial
.type pr0_nontrivial,%function
.thumb_func
pr0_nontrivial:
.fnstart
.personalityindex 0
.pad #0x10
sub sp, sp, #0x10
add sp, sp, #0x10
bx lr
.fnend
@ CHECK: Section {
@ CHECK: Name: .ARM.exidx.pr0.nontrivial
@ CHECK: SectionData (
@ CHECK: 0000: 00000000 B0B00380
@ CHECK: )
@ CHECK: }
@ CHECK: Section {
@ CHECK: Name: .rel.ARM.exidx.pr0.nontrivial
@ CHECK: Relocations [
@ CHECK: 0x0 R_ARM_PREL31 .pr0.nontrivial 0x0
@ CHECK: 0x0 R_ARM_NONE __aeabi_unwind_cpp_pr0 0x0
@ CHECK: ]
@ CHECK: }
.section .pr1
.global pr1
.type pr1,%function
.thumb_func
pr1:
.fnstart
.personalityindex 1
bx lr
.fnend
@ CHECK: Section {
@ CHECK: Name: .ARM.extab.pr1
@ CHECK: SectionData (
@ CHECK: 0000: B0B00081 00000000
@ CHECK: )
@ CHECK: }
@ CHECK: Section {
@ CHECK: Name: .ARM.exidx.pr1
@ CHECK: SectionData (
@ CHECK: 0000: 00000000 00000000
@ CHECK: )
@ CHECK: }
@ CHECK: Section {
@ CHECK: Name: .rel.ARM.exidx.pr1
@ CHECK: Relocations [
@ CHECK: 0x0 R_ARM_PREL31 .pr1 0x0
@ CHECK: 0x0 R_ARM_NONE __aeabi_unwind_cpp_pr1 0x0
@ CHECK: 0x4 R_ARM_PREL31 .ARM.extab.pr1 0x0
@ CHECK: ]
@ CHECK: }
.section .pr1.nontrivial
.global pr1_nontrivial
.type pr1_nontrivial,%function
.thumb_func
pr1_nontrivial:
.fnstart
.personalityindex 1
.pad #0x10
sub sp, sp, #0x10
add sp, sp, #0x10
bx lr
.fnend
@ CHECK: Section {
@ CHECK: Name: .ARM.extab.pr1.nontrivial
@ CHECK: SectionData (
@ CHECK: 0000: B0030081 00000000
@ CHECK: )
@ CHECK: }
@ CHECK: Section {
@ CHECK: Name: .ARM.exidx.pr1.nontrivial
@ CHECK: SectionData (
@ CHECK: 0000: 00000000 00000000
@ CHECK: )
@ CHECK: }
@ CHECK: Section {
@ CHECK: Name: .rel.ARM.exidx.pr1.nontrivial
@ CHECK: Relocations [
@ CHECK: 0x0 R_ARM_PREL31 .pr1.nontrivial 0x0
@ CHECK: 0x0 R_ARM_NONE __aeabi_unwind_cpp_pr1 0x0
@ CHECK: 0x4 R_ARM_PREL31 .ARM.extab.pr1.nontrivial 0x0
@ CHECK: ]
@ CHECK: }
.section .pr2
.global pr2
.type pr2,%function
.thumb_func
pr2:
.fnstart
.personalityindex 2
bx lr
.fnend
@ CHECK: Section {
@ CHECK: Name: .ARM.extab.pr2
@ CHECK: SectionData (
@ CHECK: 0000: B0B00082 00000000
@ CHECK: )
@ CHECK: }
@ CHECK: Section {
@ CHECK: Name: .ARM.exidx.pr2
@ CHECK: SectionData (
@ CHECK: 0000: 00000000 00000000
@ CHECK: )
@ CHECK: }
@ CHECK: Section {
@ CHECK: Name: .rel.ARM.exidx.pr2
@ CHECK: Relocations [
@ CHECK: 0x0 R_ARM_PREL31 .pr2 0x0
@ CHECK: 0x0 R_ARM_NONE __aeabi_unwind_cpp_pr2 0x0
@ CHECK: 0x4 R_ARM_PREL31 .ARM.extab.pr2 0x0
@ CHECK: ]
@ CHECK: }
.section .pr2.nontrivial
.type pr2_nontrivial,%function
.thumb_func
pr2_nontrivial:
.fnstart
.personalityindex 2
.pad #0x10
sub sp, sp, #0x10
add sp, sp, #0x10
bx lr
.fnend
@ CHECK: Section {
@ CHECK: Name: .ARM.extab.pr2.nontrivial
@ CHECK: SectionData (
@ CHECK: 0000: B0030082 00000000
@ CHECK: )
@ CHECK: }
@ CHECK: Section {
@ CHECK: Name: .ARM.exidx.pr2.nontrivial
@ CHECK: SectionData (
@ CHECK: 0000: 00000000 00000000
@ CHECK: )
@ CHECK: }
@ CHECK: Section {
@ CHECK: Name: .rel.ARM.exidx.pr2.nontrivial
@ CHECK: Relocations [
@ CHECK: 0x0 R_ARM_PREL31 .pr2.nontrivial 0x0
@ CHECK: 0x0 R_ARM_NONE __aeabi_unwind_cpp_pr2 0x0
@ CHECK: 0x4 R_ARM_PREL31 .ARM.extab.pr2.nontrivial 0x0
@ CHECK: ]
@ CHECK: }