diff options
| author | grischka <grischka> | 2009-11-13 17:14:05 +0100 |
|---|---|---|
| committer | grischka <grischka> | 2009-11-13 18:04:56 +0100 |
| commit | 5b113f3ee3bc0f3e476535f39d9c3b4562242976 (patch) | |
| tree | 765eb5a1a989a31799790667ccc9685136230ae1 /i386-gen.c | |
| parent | dd70d19267ac343adae7bf15fe15c08fa604e5e1 (diff) | |
| download | tinycc-5b113f3ee3bc0f3e476535f39d9c3b4562242976.tar.gz tinycc-5b113f3ee3bc0f3e476535f39d9c3b4562242976.tar.bz2 | |
win32: handle __declspec(dllimport)
Diffstat (limited to 'i386-gen.c')
| -rw-r--r-- | i386-gen.c | 34 |
1 files changed, 34 insertions, 0 deletions
@@ -184,6 +184,32 @@ static void gen_modrm(int op_reg, int r, Sym *sym, int c) } } +#ifdef TCC_TARGET_PE +static void mk_pointer(CType *type); +static void indir(void); + +int handle_dllimport(int r, SValue *sv, void (*fn)(int r, SValue *sv)) +{ + if ((sv->r & (VT_VALMASK|VT_SYM|VT_CONST)) != (VT_SYM|VT_CONST)) + return 0; + if (0 == (sv->sym->type.t & VT_IMPORT)) + return 0; + + printf("import %d %04x %s\n", r, ind, get_tok_str(sv->sym->v, NULL)); + + sv->sym->type.t &= ~VT_IMPORT; + ++vtop; + + *vtop = *sv; + mk_pointer(&vtop->type); + indir(); + fn(r, vtop); + + --vtop; + sv->sym->type.t |= VT_IMPORT; + return 1; +} +#endif /* load 'r' from value 'sv' */ void load(int r, SValue *sv) @@ -191,6 +217,10 @@ void load(int r, SValue *sv) int v, t, ft, fc, fr; SValue v1; +#ifdef TCC_TARGET_PE + if (handle_dllimport(r, sv, load)) + return; +#endif fr = sv->r; ft = sv->type.t; fc = sv->c.ul; @@ -255,6 +285,10 @@ void store(int r, SValue *v) { int fr, bt, ft, fc; +#ifdef TCC_TARGET_PE + if (handle_dllimport(r, v, store)) + return; +#endif ft = v->type.t; fc = v->c.ul; fr = v->r & VT_VALMASK; |
