Index: llvm/lib/MC/MCAssembler.cpp =================================================================== --- llvm/lib/MC/MCAssembler.cpp +++ llvm/lib/MC/MCAssembler.cpp @@ -785,10 +785,17 @@ } // 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"; dump(); }); Index: llvm/test/MC/X86/relax-offset.s =================================================================== --- /dev/null +++ llvm/test/MC/X86/relax-offset.s @@ -0,0 +1,14 @@ +# 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: +