Commit d950f11e authored by Artem Pyanykh's avatar Artem Pyanykh Committed by Marge Bot

Directly test section alignment, fix internal reloc probing length

parent cb745c84
......@@ -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);
}
}
......
......@@ -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
#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];
}
Linking: path = aligned_mem_access.o, symname = _foo
42
\ No newline at end of file
......@@ -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'])
#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;
}
Linking: path = section_alignment.o, symname = _isAligned
1
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment