mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-28 04:33:05 +00:00
cdb105b62f
Summary: Currently when emitting a label, a new data fragment is created for it if the current fragment isn't a data fragment. This change instead enqueues the label and attaches it to the next fragment (e.g. created for the next instruction) if possible. When bundle alignment is not enabled, this has no functionality change (it just results in fewer extra fragments being created). For bundle alignment, previously labels would point to the beginning of the bundle padding instead of the beginning of the emitted instruction. This was not only less efficient (e.g. jumping to the nops instead of past them) but also led to miscalculation of the address of the GOT (since MC uses a label difference rather than emitting a "." symbol). Fixes https://code.google.com/p/nativeclient/issues/detail?id=3982 Test Plan: regression test attached Reviewers: jvoung, eliben Subscribers: jfb, llvm-commits Differential Revision: http://reviews.llvm.org/D5915 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@220439 91177308-0d34-0410-b5e6-96231b3b80d8
28 lines
768 B
ArmAsm
28 lines
768 B
ArmAsm
# RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - \
|
|
# RUN: | llvm-objdump -disassemble -no-show-raw-insn - | FileCheck %s
|
|
|
|
# Test that long nops are generated for padding where possible.
|
|
|
|
.text
|
|
foo:
|
|
.bundle_align_mode 5
|
|
|
|
# This callq instruction is 5 bytes long
|
|
.bundle_lock align_to_end
|
|
callq bar
|
|
.bundle_unlock
|
|
# To align this group to a bundle end, we need a 15-byte NOP and a 12-byte NOP.
|
|
# CHECK: 0: nop
|
|
# CHECK-NEXT: f: nop
|
|
# CHECK: 1b: callq
|
|
|
|
# This push instruction is 1 byte long
|
|
.bundle_lock align_to_end
|
|
push %rax
|
|
.bundle_unlock
|
|
# To align this group to a bundle end, we need two 15-byte NOPs, and a 1-byte.
|
|
# CHECK: 20: nop
|
|
# CHECK-NEXT: 2f: nop
|
|
# CHECK-NEXT: 3e: nop
|
|
# CHECK-NEXT: 3f: pushq
|