mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-18 18:42:46 +02:00
[MC] Recalculate fragment offsets after relaxation
Summary: The current relaxation implementation is not correctly adjusting the size and offsets of fragements in one section based on changes in size of another if the layout order of the two happened to be such that the former was visited before the later. Therefore, we need to invalidate the fragments in all sections after each iteration of relaxation, and possibly further relax some of them in the next ieration. This fixes PR#45190. Subscribers: hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D76114
This commit is contained in:
parent
deba7b1d7c
commit
c97feb8b52
@ -785,9 +785,15 @@ void MCAssembler::layout(MCAsmLayout &Layout) {
|
||||
}
|
||||
|
||||
// Layout until everything fits.
|
||||
while (layoutOnce(Layout))
|
||||
while (layoutOnce(Layout)) {
|
||||
if (getContext().hadError())
|
||||
return;
|
||||
// Size of fragments in one section can depend on the size of fragments in
|
||||
// another. If any fragment has changed size, we have to re-layout (and
|
||||
// as a result possibly further relax) all.
|
||||
for (MCSection &Sec : *this)
|
||||
Layout.invalidateFragmentsFrom(&*Sec.begin());
|
||||
}
|
||||
|
||||
DEBUG_WITH_TYPE("mc-dump", {
|
||||
errs() << "assembler backend - post-relaxation\n--\n";
|
||||
|
13
test/MC/X86/relax-offset.s
Normal file
13
test/MC/X86/relax-offset.s
Normal file
@ -0,0 +1,13 @@
|
||||
# RUN: llvm-mc -filetype=obj -triple=i386 %s | llvm-objdump - --headers | FileCheck %s
|
||||
|
||||
# CHECK: .text1 00000005 00000000
|
||||
# CHECK: .text2 00000005 00000000
|
||||
|
||||
.section .text1
|
||||
.skip after-before,0x0
|
||||
.Lint80_keep_stack:
|
||||
|
||||
.section .text2
|
||||
before:
|
||||
jmp .Lint80_keep_stack
|
||||
after:
|
Loading…
Reference in New Issue
Block a user