forked from OSchip/llvm-project
[sanitizer] Compare against the alignment of the latter range trying to find consecutive TLS blocks in GetStaticTlsBoundary
On a mips64el-linux-gnu system, the dynamic linker arranges TLS blocks like: [0] 0xfff7fe9680..0xfff7fe9684, align = 0x4 [1] 0xfff7fe9688..0xfff7fe96a8, align = 0x8 [2] 0xfff7fe96c0..0xfff7fe9e60, align = 0x40 [3] 0xfff7fe9e60..0xfff7fe9ef8, align = 0x8 Note that the dynamic linker can only put [1] at 0xfff7fe9688, not 0xfff7fe9684 or it will be misaligned. But we were comparing the distance between two blocks with the alignment of the previous range, causing GetStaticTlsBoundary fail to merge the consecutive blocks. Compare against the alignment of the latter range to fix the issue. Reviewed By: MaskRay Differential Revision: https://reviews.llvm.org/D129112
This commit is contained in:
parent
601b3a13de
commit
36b52c38aa
|
@ -395,14 +395,14 @@ __attribute__((unused)) static void GetStaticTlsBoundary(uptr *addr, uptr *size,
|
|||
return;
|
||||
}
|
||||
// Find the maximum consecutive ranges. We consider two modules consecutive if
|
||||
// the gap is smaller than the alignment. The dynamic loader places static TLS
|
||||
// blocks this way not to waste space.
|
||||
// the gap is smaller than the alignment of the latter range. The dynamic
|
||||
// loader places static TLS blocks this way not to waste space.
|
||||
uptr l = one;
|
||||
*align = ranges[l].align;
|
||||
while (l != 0 && ranges[l].begin < ranges[l - 1].end + ranges[l - 1].align)
|
||||
while (l != 0 && ranges[l].begin < ranges[l - 1].end + ranges[l].align)
|
||||
*align = Max(*align, ranges[--l].align);
|
||||
uptr r = one + 1;
|
||||
while (r != len && ranges[r].begin < ranges[r - 1].end + ranges[r - 1].align)
|
||||
while (r != len && ranges[r].begin < ranges[r - 1].end + ranges[r].align)
|
||||
*align = Max(*align, ranges[r++].align);
|
||||
*addr = ranges[l].begin;
|
||||
*size = ranges[r - 1].end - ranges[l].begin;
|
||||
|
|
Loading…
Reference in New Issue