aboutsummaryrefslogtreecommitdiff
path: root/i386-gen.c
diff options
context:
space:
mode:
authorgrischka <grischka>2009-11-13 17:14:05 +0100
committergrischka <grischka>2009-11-13 18:04:56 +0100
commit5b113f3ee3bc0f3e476535f39d9c3b4562242976 (patch)
tree765eb5a1a989a31799790667ccc9685136230ae1 /i386-gen.c
parentdd70d19267ac343adae7bf15fe15c08fa604e5e1 (diff)
downloadtinycc-5b113f3ee3bc0f3e476535f39d9c3b4562242976.tar.gz
tinycc-5b113f3ee3bc0f3e476535f39d9c3b4562242976.tar.bz2
win32: handle __declspec(dllimport)
Diffstat (limited to 'i386-gen.c')
-rw-r--r--i386-gen.c34
1 files changed, 34 insertions, 0 deletions
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;