diff options
author | Artem Pyanykh <artempyanykh@gmail.com> | 2019-03-16 18:12:00 +0300 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2019-03-20 19:52:39 -0400 |
commit | d950f11eff0a5dc0ad950fbd47e3ee32649d1d62 (patch) | |
tree | f2bcc1c6aaac15a0a0a1501fbdb9e99685b2d3c6 | |
parent | cb745c84a192c4a1f992649fbda584941f8ec3eb (diff) | |
download | haskell-d950f11eff0a5dc0ad950fbd47e3ee32649d1d62.tar.gz |
Directly test section alignment, fix internal reloc probing length
-rw-r--r-- | rts/linker/MachO.c | 8 | ||||
-rw-r--r-- | testsuite/tests/rts/linker/Makefile | 6 | ||||
-rw-r--r-- | testsuite/tests/rts/linker/aligned_mem_access.c | 14 | ||||
-rw-r--r-- | testsuite/tests/rts/linker/aligned_mem_access.stdout | 2 | ||||
-rw-r--r-- | testsuite/tests/rts/linker/all.T | 6 | ||||
-rw-r--r-- | testsuite/tests/rts/linker/section_alignment.c | 14 | ||||
-rw-r--r-- | testsuite/tests/rts/linker/section_alignment.stdout | 2 |
7 files changed, 28 insertions, 24 deletions
diff --git a/rts/linker/MachO.c b/rts/linker/MachO.c index b720077bbb..6e109e592d 100644 --- a/rts/linker/MachO.c +++ b/rts/linker/MachO.c @@ -977,11 +977,15 @@ relocateSection(ObjectCode* oc, int curSection) } IF_DEBUG(linker, debugBelch("relocateSection: thing = %p\n", (void *) thing)); + + /* Thing points to memory within one of the relocated sections. We can + * probe the first byte to sanity check internal relocations. + */ if (0 == reloc->r_extern) { if (reloc->r_pcrel) { - checkProddableBlock(oc, (void *)((char *)thing + baseValue), relocLenBytes); + checkProddableBlock(oc, (void *)((char *)thing + baseValue), 1); } else { - checkProddableBlock(oc, (void *)thing, relocLenBytes); + checkProddableBlock(oc, (void *)thing, 1); } } diff --git a/testsuite/tests/rts/linker/Makefile b/testsuite/tests/rts/linker/Makefile index 2320d34d83..edbd291ecb 100644 --- a/testsuite/tests/rts/linker/Makefile +++ b/testsuite/tests/rts/linker/Makefile @@ -7,7 +7,7 @@ unsigned_reloc_macho_x64: '$(TEST_HC)' $(TEST_HC_OPTS_NO_RTSOPTS) -v0 --make -no-rtsopts-suggestions -no-hs-main -o runner runner.c ./runner unsigned_reloc_macho_x64.o getAnswer -aligned_mem_access: - cc -c -o aligned_mem_access.o aligned_mem_access.c +section_alignment: + cc -c -o section_alignment.o section_alignment.c '$(TEST_HC)' $(TEST_HC_OPTS_NO_RTSOPTS) -v0 --make -no-rtsopts-suggestions -no-hs-main -o runner runner.c - ./runner aligned_mem_access.o foo + ./runner section_alignment.o isAligned diff --git a/testsuite/tests/rts/linker/aligned_mem_access.c b/testsuite/tests/rts/linker/aligned_mem_access.c deleted file mode 100644 index cef90c3485..0000000000 --- a/testsuite/tests/rts/linker/aligned_mem_access.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <stdio.h> -#include <immintrin.h> - -__m128 mvec = {1.0, 2.0, 3.0, 42.0}; -float fvec[] = {.0, .0, .0, .0}; - -/* Uses movaps instruction to move data between XMMn <-> mem. Fails - * with segfault when data section is not properly aligned (16 byte). - */ -long foo(void) -{ - _mm_store_ps(fvec, mvec); - return (long) fvec[3]; -} diff --git a/testsuite/tests/rts/linker/aligned_mem_access.stdout b/testsuite/tests/rts/linker/aligned_mem_access.stdout deleted file mode 100644 index 4b728c2ee1..0000000000 --- a/testsuite/tests/rts/linker/aligned_mem_access.stdout +++ /dev/null @@ -1,2 +0,0 @@ -Linking: path = aligned_mem_access.o, symname = _foo -42
\ No newline at end of file diff --git a/testsuite/tests/rts/linker/all.T b/testsuite/tests/rts/linker/all.T index 23d79d3918..be2e972e82 100644 --- a/testsuite/tests/rts/linker/all.T +++ b/testsuite/tests/rts/linker/all.T @@ -8,9 +8,9 @@ test('unsigned_reloc_macho_x64', ], run_command, ['$MAKE -s --no-print-directory unsigned_reloc_macho_x64']) -test('aligned_mem_access', +test('section_alignment', [ - extra_files(['runner.c', 'aligned_mem_access.c']), + extra_files(['runner.c', 'section_alignment.c']), unless(opsys('darwin') and arch('x86_64'), expect_broken(13624)) ], - run_command, ['$MAKE -s --no-print-directory aligned_mem_access']) + run_command, ['$MAKE -s --no-print-directory section_alignment']) diff --git a/testsuite/tests/rts/linker/section_alignment.c b/testsuite/tests/rts/linker/section_alignment.c new file mode 100644 index 0000000000..a5c9b02214 --- /dev/null +++ b/testsuite/tests/rts/linker/section_alignment.c @@ -0,0 +1,14 @@ +#include <stdint.h> +#include <stdalign.h> + +int foo = 42; /* goes to __data, but __data gets page aligned as + * the first section within a segment, so we need + * another section to check the alignment */ + +alignas(32) int bar = 0; /* goes to __common that follows __data + * within the same segment */ + +long isAligned() +{ + return ((uintptr_t)&bar & ~(-32)) == 0; +} diff --git a/testsuite/tests/rts/linker/section_alignment.stdout b/testsuite/tests/rts/linker/section_alignment.stdout new file mode 100644 index 0000000000..a20cf23cc6 --- /dev/null +++ b/testsuite/tests/rts/linker/section_alignment.stdout @@ -0,0 +1,2 @@ +Linking: path = section_alignment.o, symname = _isAligned +1
\ No newline at end of file |