Fix unaligned access arm (openbsd)
libtcc.c: Fix unaligned load/store from magic3 tccgen.c: For packed struct allways use single byte code If field does not start at at align check it Align stack correctly with vla
This commit is contained in:
parent
38eaf9b3a7
commit
5043268cb1
2 changed files with 20 additions and 8 deletions
18
libtcc.c
18
libtcc.c
|
@ -273,12 +273,20 @@ PUB_FUNC char *tcc_strdup(const char *str)
|
||||||
#define MEM_DEBUG_MAGIC2 0xFEEDDEB2
|
#define MEM_DEBUG_MAGIC2 0xFEEDDEB2
|
||||||
#define MEM_DEBUG_MAGIC3 0xFEEDDEB3
|
#define MEM_DEBUG_MAGIC3 0xFEEDDEB3
|
||||||
#define MEM_DEBUG_FILE_LEN 40
|
#define MEM_DEBUG_FILE_LEN 40
|
||||||
|
#define MEM_DEBUG_OFF3 offsetof(mem_debug_header_t, magic3)
|
||||||
#define MEM_DEBUG_CHECK3(header) \
|
#define MEM_DEBUG_CHECK3(header) \
|
||||||
((mem_debug_header_t*)((char*)header + header->size))->magic3
|
({unsigned magic3; \
|
||||||
|
memcpy(&magic3, (char*)header + MEM_DEBUG_OFF3 + header->size, \
|
||||||
|
sizeof (magic3)); \
|
||||||
|
magic3;})
|
||||||
|
#define MEM_DEBUG_SET3(header) \
|
||||||
|
{unsigned magic3 = MEM_DEBUG_MAGIC3; \
|
||||||
|
memcpy((char*)header + MEM_DEBUG_OFF3 + header->size, &magic3, \
|
||||||
|
sizeof (magic3));}
|
||||||
#define MEM_USER_PTR(header) \
|
#define MEM_USER_PTR(header) \
|
||||||
((char *)header + offsetof(mem_debug_header_t, magic3))
|
((char *)header + MEM_DEBUG_OFF3)
|
||||||
#define MEM_HEADER_PTR(ptr) \
|
#define MEM_HEADER_PTR(ptr) \
|
||||||
(mem_debug_header_t *)((char*)ptr - offsetof(mem_debug_header_t, magic3))
|
(mem_debug_header_t *)((char*)ptr - MEM_DEBUG_OFF3)
|
||||||
|
|
||||||
struct mem_debug_header {
|
struct mem_debug_header {
|
||||||
unsigned magic1;
|
unsigned magic1;
|
||||||
|
@ -325,7 +333,7 @@ PUB_FUNC void *tcc_malloc_debug(unsigned long size, const char *file, int line)
|
||||||
header->magic1 = MEM_DEBUG_MAGIC1;
|
header->magic1 = MEM_DEBUG_MAGIC1;
|
||||||
header->magic2 = MEM_DEBUG_MAGIC2;
|
header->magic2 = MEM_DEBUG_MAGIC2;
|
||||||
header->size = size;
|
header->size = size;
|
||||||
MEM_DEBUG_CHECK3(header) = MEM_DEBUG_MAGIC3;
|
MEM_DEBUG_SET3(header);
|
||||||
header->line_num = line;
|
header->line_num = line;
|
||||||
ofs = strlen(file) - MEM_DEBUG_FILE_LEN;
|
ofs = strlen(file) - MEM_DEBUG_FILE_LEN;
|
||||||
strncpy(header->file_name, file + (ofs > 0 ? ofs : 0), MEM_DEBUG_FILE_LEN);
|
strncpy(header->file_name, file + (ofs > 0 ? ofs : 0), MEM_DEBUG_FILE_LEN);
|
||||||
|
@ -382,7 +390,7 @@ PUB_FUNC void *tcc_realloc_debug(void *ptr, unsigned long size, const char *file
|
||||||
if (!header)
|
if (!header)
|
||||||
_tcc_error("memory full (realloc)");
|
_tcc_error("memory full (realloc)");
|
||||||
header->size = size;
|
header->size = size;
|
||||||
MEM_DEBUG_CHECK3(header) = MEM_DEBUG_MAGIC3;
|
MEM_DEBUG_SET3(header);
|
||||||
if (header->next)
|
if (header->next)
|
||||||
header->next->prev = header;
|
header->next->prev = header;
|
||||||
if (header->prev)
|
if (header->prev)
|
||||||
|
|
10
tccgen.c
10
tccgen.c
|
@ -4727,7 +4727,10 @@ static void struct_layout(CType *type, AttributeDef *ad)
|
||||||
continue;
|
continue;
|
||||||
bit_pos = BIT_POS(f->type.t);
|
bit_pos = BIT_POS(f->type.t);
|
||||||
size = type_size(&f->type, &align);
|
size = type_size(&f->type, &align);
|
||||||
if (bit_pos + bit_size <= size * 8 && f->c + size <= c)
|
if (c & 3) /* packed struct */
|
||||||
|
goto single_byte;
|
||||||
|
if (bit_pos + bit_size <= size * 8 && f->c + size <= c &&
|
||||||
|
(f->c & (align - 1)) == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* try to access the field using a different type */
|
/* try to access the field using a different type */
|
||||||
|
@ -4768,6 +4771,7 @@ static void struct_layout(CType *type, AttributeDef *ad)
|
||||||
cx, s, align, px, bit_size);
|
cx, s, align, px, bit_size);
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
|
single_byte:
|
||||||
/* fall back to load/store single-byte wise */
|
/* fall back to load/store single-byte wise */
|
||||||
f->auxtype = VT_STRUCT;
|
f->auxtype = VT_STRUCT;
|
||||||
#ifdef BF_DEBUG
|
#ifdef BF_DEBUG
|
||||||
|
@ -8269,7 +8273,7 @@ static void decl_initializer_alloc(CType *type, AttributeDef *ad, int r,
|
||||||
#ifdef CONFIG_TCC_BCHECK
|
#ifdef CONFIG_TCC_BCHECK
|
||||||
if (bcheck && v) {
|
if (bcheck && v) {
|
||||||
/* add padding between stack variables for bound checking */
|
/* add padding between stack variables for bound checking */
|
||||||
loc--;
|
loc -= align;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
loc = (loc - size) & -align;
|
loc = (loc - size) & -align;
|
||||||
|
@ -8278,7 +8282,7 @@ static void decl_initializer_alloc(CType *type, AttributeDef *ad, int r,
|
||||||
#ifdef CONFIG_TCC_BCHECK
|
#ifdef CONFIG_TCC_BCHECK
|
||||||
if (bcheck && v) {
|
if (bcheck && v) {
|
||||||
/* add padding between stack variables for bound checking */
|
/* add padding between stack variables for bound checking */
|
||||||
loc--;
|
loc -= align;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (v) {
|
if (v) {
|
||||||
|
|
Loading…
Reference in a new issue