[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Tinycc-devel] Miscompilation returning small struct
From: |
Steffen Nurpmeso |
Subject: |
Re: [Tinycc-devel] Miscompilation returning small struct |
Date: |
Tue, 26 Jan 2021 21:09:27 +0100 |
User-agent: |
s-nail v14.9.21-98-g07264876 |
tinycc-devel@nongnu.org wrote in
<47c96f8b-130b-c0b7-79f2-a33e132563cf@ludocode.com>:
|I've encountered what I believe is a miscompilation bug in TinyCC. \
|I'm using
|tcc 0.9.27 on latest Arch Linux on x86_64. I can't reproduce the same \
|issue on
|the mob branch so this may already be fixed, but I can't find a bug report
|about anything similar so it may just be a coincidence; the bug might \
|still be
|around, just reproducible in a different way. I tried reducing the \
|code as much
|as possible:
|
| #include <stdint.h>
| #include <stdio.h>
|
| typedef struct coords_t {
| uint8_t x, y;
| } coords_t;
|
| typedef struct list_t {
| void* context;
| coords_t head;
| coords_t tail;
| } list_t;
|
| static coords_t list_head(list_t* list) {
| return list->head;
| }
|
| int main(void) {
| list_t list;
| list.tail.x = 17;
| list.tail.y = 23;
|
| coords_t bob = {3, 4};
| coords_t alice = {2, 1};
| coords_t eve = {1, 0};
|
| printf("%u:%u\n", eve.x, eve.y);
| list_head(&list); // ignored return value, should be no-op
| printf("%u:%u\n", eve.x, eve.y);
| }
|
|The code prints the contents of a struct before and after a no-op function
|call. The output should be the same. Under GCC, Clang and chibicc it prints
|this:
|
| 1:0
| 1:0
|
|Under TinyCC it prints this:
|
| 1:0
| 17:23
I cannot reproduce this with
e5c3d1dc705f4c1b4ecccf795f97fa409914ea2e from January 4th. Damned
U+00A0 whitespace ;P
--steffen
|
|Der Kragenbaer, The moon bear,
|der holt sich munter he cheerfully and one by one
|einen nach dem anderen runter wa.ks himself off
|(By Robert Gernhardt)