From 5b113f3ee3bc0f3e476535f39d9c3b4562242976 Mon Sep 17 00:00:00 2001 From: grischka Date: Fri, 13 Nov 2009 17:14:05 +0100 Subject: win32: handle __declspec(dllimport) --- i386-gen.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'i386-gen.c') diff --git a/i386-gen.c b/i386-gen.c index ff5028e..d44737a 100644 --- a/i386-gen.c +++ b/i386-gen.c @@ -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; -- cgit v1.3.1