[all-commits] [llvm/llvm-project] 01ad4c: [LLD][ELF][ARM][AArch64] Only round up ThunkSectio...

Peter Smith via All-commits all-commits at lists.llvm.org
Fri Jan 17 02:47:43 PST 2020


  Branch: refs/heads/master
  Home:   https://github.com/llvm/llvm-project
  Commit: 01ad4c838466bd5db180608050ed8ccb3b62d136
      https://github.com/llvm/llvm-project/commit/01ad4c838466bd5db180608050ed8ccb3b62d136
  Author: Peter Smith <peter.smith at linaro.org>
  Date:   2020-01-17 (Fri, 17 Jan 2020)

  Changed paths:
    M lld/ELF/Relocations.cpp
    M lld/ELF/SyntheticSections.cpp
    M lld/ELF/SyntheticSections.h
    A lld/test/ELF/aarch64-cortex-a53-843419-thunk-align.s
    M lld/test/ELF/aarch64-cortex-a53-843419-thunk.s
    A lld/test/ELF/arm-fix-cortex-a8-thunk-align.s
    M lld/test/ELF/arm-fix-cortex-a8-thunk.s

  Log Message:
  -----------
  [LLD][ELF][ARM][AArch64] Only round up ThunkSection Size when large OS.

In D71281 a fix was put in to round up the size of a ThunkSection to the
nearest 4KiB when performing errata patching. This fixed a problem with a
very large instrumented program that had thunks and patches mutually
trigger each other. Unfortunately it triggers an assertion failure in an
AArch64 allyesconfig build of the kernel. There is a specific assertion
preventing an InputSectionDescription being larger than 4KiB. This will
always trigger if there is at least one Thunk needed in that
InputSectionDescription, which is possible for an allyesconfig build.

Abstractly the problem case is:
.text : {
          *(.text) ;
          ...
          . = ALIGN(SZ_4K);
          __idmap_text_start = .;
          *(.idmap.text)
          __idmap_text_end = .;
          ...
        }
The assertion checks that __idmap_text_end - __idmap_start is < 4 KiB.
Note that there is more than one InputSectionDescription in the
OutputSection so we can't just restrict the fix to OutputSections smaller
than 4 KiB.

The fix presented here limits the D71281 to InputSectionDescriptions that
meet the following conditions:
1.) The OutputSection is bigger than the thunkSectionSpacing so adding
thunks will affect the addresses of following code.
2.) The InputSectionDescription is larger than 4 KiB. This will prevent
any assertion failures that an InputSectionDescription is < 4 KiB
in size.

We do this at ThunkSection creation time as at this point we know that
the addresses are stable and up to date prior to adding the thunks as
assignAddresses() will have been called immediately prior to thunk
generation.

The fix reverts the two tests affected by D71281 to their original state
as they no longer need the 4KiB size roundup. I've added simpler tests to
check for D71281 when the OutputSection size is larger than the ThunkSection
spacing.

Fixes https://github.com/ClangBuiltLinux/linux/issues/812

Differential Revision: https://reviews.llvm.org/D72344




More information about the All-commits mailing list