[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:
Jian Cai 2020-03-12 18:09:19 -07:00
parent 7aa28995e8
commit 6a38e0e4f5
2 changed files with 20 additions and 1 deletions

View File

@ -785,9 +785,15 @@ void MCAssembler::layout(MCAsmLayout &Layout) {
} }
// Layout until everything fits. // Layout until everything fits.
while (layoutOnce(Layout)) while (layoutOnce(Layout)) {
if (getContext().hadError()) if (getContext().hadError())
return; 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", { DEBUG_WITH_TYPE("mc-dump", {
errs() << "assembler backend - post-relaxation\n--\n"; errs() << "assembler backend - post-relaxation\n--\n";

View 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: