diff --git a/llvm/lib/MC/MCAsmBackend.cpp b/llvm/lib/MC/MCAsmBackend.cpp --- a/llvm/lib/MC/MCAsmBackend.cpp +++ b/llvm/lib/MC/MCAsmBackend.cpp @@ -117,12 +117,17 @@ } bool MCAsmBackend::isDarwinCanonicalPersonality(const MCSymbol *Sym) const { - if (Sym && Sym->isMachO()) { - StringRef name = Sym->getName(); - // XXX: We intentionally leave out "___gcc_personality_v0" because, despite - // being system-defined like these two, it is not very commonly-used. - // Reserving an empty slot for it seems silly. - return name == "___gxx_personality_v0" || name == "___objc_personality_v0"; - } - return false; + // Consider a NULL personality (ie., no personality encoding) to be canonical + // because it's always at 0. + if (!Sym) + return true; + + if (!Sym->isMachO()) + llvm_unreachable("Expected MachO symbols only"); + + StringRef name = Sym->getName(); + // XXX: We intentionally leave out "___gcc_personality_v0" because, despite + // being system-defined like these two, it is not very commonly-used. + // Reserving an empty slot for it seems silly. + return name == "___gxx_personality_v0" || name == "___objc_personality_v0"; } diff --git a/llvm/test/MC/MachO/AArch64/darwin-ARM64-no-personality.s b/llvm/test/MC/MachO/AArch64/darwin-ARM64-no-personality.s new file mode 100644 --- /dev/null +++ b/llvm/test/MC/MachO/AArch64/darwin-ARM64-no-personality.s @@ -0,0 +1,73 @@ +# RUN: llvm-mc -filetype=obj -triple=arm64-apple-macos11.0 %s | llvm-objdump --unwind-info - | FileCheck %s + +# Check that we emit the right encoding for the no-personality case. + +# CHECK: Contents of __compact_unwind section: +# CHECK: Entry at offset {{.+}} +# CHECK: start: {{.+}} ltmp0 +# CHECK: length: {{.+}} +# CHECK: compact encoding: 0x02001000 +# CHECK: Entry at offset {{.+}} +# CHECK: start: {{.+}} __Z3foov +# CHECK: length: {{.+}} +# CHECK: compact encoding: 0x04000000 +# CHECK: Entry at offset {{.+}} +# CHECK: start: {{.+}} _main +# CHECK: length: {{.+}} +# CHECK: compact encoding: 0x04000000 + + + .section __TEXT,__text,regular,pure_instructions + .build_version macos, 11, 0 + .globl __Z3barPi + .p2align 2 +__Z3barPi: + .cfi_startproc + sub sp, sp, #16 + .cfi_def_cfa_offset 16 + str x0, [sp, #8] + add sp, sp, #16 + ret + .cfi_endproc + + .globl __Z3foov + .p2align 2 +__Z3foov: + .cfi_startproc + + sub sp, sp, #32 + .cfi_def_cfa_offset 32 + stp x29, x30, [sp, #16] + add x29, sp, #16 + .cfi_def_cfa w29, 16 + .cfi_offset w30, -8 + .cfi_offset w29, -16 + sub x0, x29, #4 + bl __Z3barPi + ldp x29, x30, [sp, #16] + add sp, sp, #32 + ret + .cfi_endproc + + .globl _main + .p2align 2 +_main: + .cfi_startproc + sub sp, sp, #32 + .cfi_def_cfa_offset 32 + stp x29, x30, [sp, #16] + add x29, sp, #16 + .cfi_def_cfa w29, 16 + .cfi_offset w30, -8 + .cfi_offset w29, -16 + mov w8, #0 + str w8, [sp, #8] + stur wzr, [x29, #-4] + bl __Z3foov + ldr w0, [sp, #8] + ldp x29, x30, [sp, #16] + add sp, sp, #32 + ret + .cfi_endproc + +.subsections_via_symbols diff --git a/llvm/test/MC/MachO/darwin-x86_64-no-personality.s b/llvm/test/MC/MachO/darwin-x86_64-no-personality.s new file mode 100644 --- /dev/null +++ b/llvm/test/MC/MachO/darwin-x86_64-no-personality.s @@ -0,0 +1,68 @@ +# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin10.0 %s | llvm-objdump --unwind-info - | FileCheck %s + +# Check that we emit the right encoding for the no-personality case. + +# CHECK: Contents of __compact_unwind section: +# CHECK: Entry at offset {{.+}} +# CHECK: start: {{.+}} __Z3barPi +# CHECK: length: {{.+}} +# CHECK: compact encoding: 0x01000000 +# CHECK: Entry at offset {{.+}} +# CHECK: start: {{.+}} __Z3foov +# CHECK: length: {{.+}} +# CHECK: compact encoding: 0x01000000 +# CHECK: Entry at offset {{.+}} +# CHECK: start: {{.+}} _main +# CHECK: length: 0x1c + + .section __TEXT,__text,regular,pure_instructions + .globl __Z3barPi + .p2align 4, 0x90 +__Z3barPi: + .cfi_startproc + pushq %rbp + .cfi_def_cfa_offset 16 + .cfi_offset %rbp, -16 + movq %rsp, %rbp + .cfi_def_cfa_register %rbp + movq %rdi, -8(%rbp) + popq %rbp + retq + .cfi_endproc + + .globl __Z3foov + .p2align 4, 0x90 +__Z3foov: + .cfi_startproc + pushq %rbp + .cfi_def_cfa_offset 16 + .cfi_offset %rbp, -16 + movq %rsp, %rbp + .cfi_def_cfa_register %rbp + subq $16, %rsp + leaq -4(%rbp), %rdi + callq __Z3barPi + addq $16, %rsp + popq %rbp + retq + .cfi_endproc + + .globl _main + .p2align 4, 0x90 +_main: + .cfi_startproc + pushq %rbp + .cfi_def_cfa_offset 16 + .cfi_offset %rbp, -16 + movq %rsp, %rbp + .cfi_def_cfa_register %rbp + subq $16, %rsp + movl $0, -4(%rbp) + callq __Z3foov + xorl %eax, %eax + addq $16, %rsp + popq %rbp + retq + .cfi_endproc + +.subsections_via_symbols