bugTiny C Compiler - Bugs: bug #48900, Wrong code generation on Windows...

 
 

bug #48900: Wrong code generation on Windows for external variables

Submitted by:  Shixin Zeng <shixinzeng>
Submitted on:  Thu 25 Aug 2016 04:18:19 PM UTC  
 
Category:  None Severity:  3 - Normal
Item Group:  None Status:  None
Privacy:  Public Assigned to:  None
Open/Closed:  Open

Add a New Comment (Rich Markup)
   

You are not logged in

Please log in, so followups can be emailed to you.

 

Thu 25 Aug 2016 06:29:53 PM UTC, comment #2: 

Somebody please close it, I can't find anywhere to change the status.

Shixin Zeng <shixinzeng>
Thu 25 Aug 2016 06:28:13 PM UTC, comment #1: 

My bad, the extern variable needs _attribute_((dllimport)) to make it work.

After change the code to:

extern _attribute_((dllimport)) long long global;

it works fine.

Shixin Zeng <shixinzeng>
Thu 25 Aug 2016 04:18:19 PM UTC, original submission:  

I found this while testing this program:
#include <stdlib.h>
#include "libtcc.h"

int global = 100;
int main()
{
int m_size;
void *m;
void (*p) (void);
TCCState *s = tcc_new();
tcc_set_output_type(s, TCC_OUTPUT_MEMORY);
    tcc_set_options(s, "-nostdinc -nostdlib");
    tcc_compile_string(s, "extern long long global;\nvoid printf(const char*fmt, ...);\nvoid p() {__asm__ volatile (\"int $0x03\");\nprintf(\"global: %d\n\", global);}\n");
#ifdef WIN32
    tcc_add_library_path(s, "c:\\Users\\user\\tcc");
    tcc_add_library(s, "tcc1");
    tcc_add_library(s, "ucrtbase");
    tcc_add_library(s, "msvcrt");
#else
    tcc_add_library_path(s, "/home/zsx/work/r3-build/tcc");
    tcc_add_library(s, "tcc1");
#endif
tcc_add_symbol(s, "global", &global);
m_size = tcc_relocate(s, NULL);
m = malloc(m_size);
tcc_relocate(s, m);
p = tcc_get_symbol(s, "p");
p ();

   

    free(m);
return 0;

}

What I tried to do was passing the global variable to the tcc compiled code, and print it out.
On Linux, it worked fine (outputs 100), on Windows it's not(outputs some random number, like -866870476).

I looked at the assembly code generated on both platforms, and I found this difference:

Linux
   0x0000000000668700: push   rbp
   0x0000000000668701: mov    rbp,rsp
   0x0000000000668704: sub    rsp,0x0
   0x000000000066870b: int3  
=> 0x000000000066870c: mov    rax,QWORD PTR [rip+0x45]        # 0x668758
   0x0000000000668713: mov    rax,QWORD PTR [rax]    #reading memory pointed by rax. The content of that memory location is address of "global" passed by tcc_add_symbol.
   0x0000000000668716: mov    rsi,rax
   0x0000000000668719: lea    rax,[rip+0x10]        # 0x668730
   0x0000000000668720: mov    rdi,rax
   0x0000000000668723: mov    eax,0x0
   0x0000000000668728: call   0x668780
   0x000000000066872d: leave 
   0x000000000066872e: ret   

Windows
000002697FA51A50  push        rbp 
000002697FA51A51  mov         rbp,rsp 
000002697FA51A54  sub         rsp,20h 
000002697FA51A5B  int         3 
000002697FA51A5C  mov         rax,qword ptr [2697FA51ADCh] 
000002697FA51A63  mov         r11,rax             #Copy rax to r11, should be "move r11, QWORD PTR [rax]", I think.
000002697FA51A66  lea         rax,[2697FA51A90h] 
000002697FA51A6D  mov         r10,rax 
000002697FA51A70  mov         rcx,r10 
000002697FA51A73  mov         rdx,r11 
000002697FA51A76  call        000002697FA51A88 
000002697FA51A7B  leave 
000002697FA51A7C  ret 

Shixin Zeng <shixinzeng>

 

(Note: upload size limit is set to 16384 kB, after insertion of the required escape characters.)

Attach Files:
   
   
Comment:
   

No files currently attached

 

Depends on the following items: None found

Items that depend on this one: None found

 

Carbon-Copy List
  • -email is unavailable- added by shixinzeng (Submitted the item)
  •  

    Do you think this task is very important?
    If so, you can add your encouragement to it.
    This task has 0 encouragements so far.

    Only logged-in users can vote.

     

     

     

    No changes have been made to this item

    Back to the top


    Powered by Savane 3.5