aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgrischka <grischka>2009-07-18 22:05:58 +0200
committergrischka <grischka>2009-07-18 22:05:58 +0200
commit035918ef2f33c4d9f1312dab3fde6f08b80a3766 (patch)
tree7d4f90965101faea3a0d3bb34ff9aa5018ec8f00
parent459875796b1b3049551dabd887bc24addffab136 (diff)
downloadtinycc-035918ef2f33c4d9f1312dab3fde6f08b80a3766.tar.gz
tinycc-035918ef2f33c4d9f1312dab3fde6f08b80a3766.tar.bz2
win64: fix pointer <-> unsigned long typecast issues
-rw-r--r--libtcc.c13
-rw-r--r--tcc.h12
-rw-r--r--tccelf.c12
-rw-r--r--tccgen.c8
-rw-r--r--tccpe.c2
-rw-r--r--tccpp.c6
6 files changed, 34 insertions, 19 deletions
diff --git a/libtcc.c b/libtcc.c
index 8a6fa0c..bfa6839 100644
--- a/libtcc.c
+++ b/libtcc.c
@@ -191,7 +191,7 @@ static int put_elf_str(Section *s, const char *sym);
static int put_elf_sym(Section *s,
unsigned long value, unsigned long size,
int info, int other, int shndx, const char *name);
-static int add_elf_sym(Section *s, unsigned long value, unsigned long size,
+static int add_elf_sym(Section *s, uplong value, unsigned long size,
int info, int other, int sh_num, const char *name);
static void put_elf_reloc(Section *symtab, Section *s, unsigned long offset,
int type, int symbol);
@@ -1183,7 +1183,7 @@ BufferedFile *tcc_open(TCCState *s1, const char *filename)
fd = open(filename, O_RDONLY | O_BINARY);
if ((s1->verbose == 2 && fd >= 0) || s1->verbose == 3)
printf("%s %*s%s\n", fd < 0 ? "nf":"->",
- (s1->include_stack_ptr - s1->include_stack), "", filename);
+ (int)(s1->include_stack_ptr - s1->include_stack), "", filename);
if (fd < 0)
return NULL;
bf = tcc_malloc(sizeof(BufferedFile));
@@ -1656,7 +1656,8 @@ static void sig_error(int signum, siginfo_t *siginf, void *puc)
int tcc_relocate(TCCState *s1, void *ptr)
{
Section *s;
- unsigned long offset, length, mem;
+ unsigned long offset, length;
+ uplong mem;
int i;
if (0 == s1->runtime_added) {
@@ -1674,7 +1675,7 @@ int tcc_relocate(TCCState *s1, void *ptr)
return -1;
}
- offset = 0, mem = (unsigned long)ptr;
+ offset = 0, mem = (uplong)ptr;
for(i = 1; i < s1->nb_sections; i++) {
s = s1->sections[i];
if (0 == (s->sh_flags & SHF_ALLOC))
@@ -1715,7 +1716,7 @@ int tcc_relocate(TCCState *s1, void *ptr)
continue;
length = s->data_offset;
// printf("%-12s %08x %04x\n", s->name, s->sh_addr, length);
- ptr = (void*)s->sh_addr;
+ ptr = (void*)(uplong)s->sh_addr;
if (NULL == s->data || s->sh_type == SHT_NOBITS)
memset(ptr, 0, length);
else
@@ -2155,7 +2156,7 @@ int tcc_add_library(TCCState *s, const char *libraryname)
int tcc_add_symbol(TCCState *s, const char *name, void *val)
{
- add_elf_sym(symtab_section, (unsigned long)val, 0,
+ add_elf_sym(symtab_section, (uplong)val, 0,
ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0,
SHN_ABS, name);
return 0;
diff --git a/tcc.h b/tcc.h
index ab95f8d..74761f0 100644
--- a/tcc.h
+++ b/tcc.h
@@ -47,6 +47,9 @@
#define inline __inline
#define inp next_inp
#define dlclose FreeLibrary
+#ifdef _WIN64
+#define uplong unsigned long long
+#endif
#endif
#ifndef _WIN32
@@ -58,6 +61,10 @@
#endif /* !CONFIG_TCCBOOT */
+#ifndef uplong
+#define uplong unsigned long
+#endif
+
#ifndef PAGESIZE
#define PAGESIZE 4096
#endif
@@ -204,7 +211,10 @@ typedef struct Sym {
int *d; /* define token stream */
};
CType type; /* associated type */
- struct Sym *next; /* next related symbol */
+ union {
+ struct Sym *next; /* next related symbol */
+ long jnext; /* next jump label */
+ };
struct Sym *prev; /* prev symbol in stack */
struct Sym *prev_tok; /* previous symbol for this token */
} Sym;
diff --git a/tccelf.c b/tccelf.c
index 5981d68..69f94c4 100644
--- a/tccelf.c
+++ b/tccelf.c
@@ -177,7 +177,7 @@ void *tcc_get_symbol(TCCState *s, const char *name)
if (!sym_index)
return NULL;
sym = &((ElfW(Sym) *)symtab_section->data)[sym_index];
- return (void*)(long)sym->st_value;
+ return (void*)(uplong)sym->st_value;
}
void *tcc_get_symbol_err(TCCState *s, const char *name)
@@ -191,7 +191,7 @@ void *tcc_get_symbol_err(TCCState *s, const char *name)
/* add an elf symbol : check if it is already defined and patch
it. Return symbol index. NOTE that sh_num can be SHN_UNDEF. */
-static int add_elf_sym(Section *s, unsigned long value, unsigned long size,
+static int add_elf_sym(Section *s, uplong value, unsigned long size,
int info, int other, int sh_num, const char *name)
{
ElfW(Sym) *esym;
@@ -442,11 +442,11 @@ static void relocate_syms(TCCState *s1, int do_resolve)
name = strtab_section->data + sym->st_name;
if (do_resolve) {
#ifndef _WIN32
- unsigned long addr;
+ void *addr;
name = symtab_section->link->data + sym->st_name;
- addr = (unsigned long)resolve_sym(s1, name);
+ addr = resolve_sym(s1, name);
if (addr) {
- sym->st_value = addr;
+ sym->st_value = (uplong)addr;
goto found;
}
#endif
@@ -1884,7 +1884,7 @@ int elf_output_file(TCCState *s1, const char *filename)
/* get entry point address */
if (file_type == TCC_OUTPUT_EXE)
- ehdr.e_entry = (unsigned long)tcc_get_symbol_err(s1, "_start");
+ ehdr.e_entry = (uplong)tcc_get_symbol_err(s1, "_start");
else
ehdr.e_entry = text_section->sh_addr; /* XXX: is it correct ? */
}
diff --git a/tccgen.c b/tccgen.c
index c59613b..0ff7ac3 100644
--- a/tccgen.c
+++ b/tccgen.c
@@ -4088,9 +4088,9 @@ static void block(int *bsym, int *csym, int *case_sym, int *def_sym,
}
/* label already defined */
if (s->r & LABEL_FORWARD)
- s->next = (void *)gjmp((long)s->next);
+ s->jnext = gjmp(s->jnext);
else
- gjmp_addr((long)s->next);
+ gjmp_addr(s->jnext);
next();
} else {
expect("label identifier");
@@ -4106,12 +4106,12 @@ static void block(int *bsym, int *csym, int *case_sym, int *def_sym,
if (s) {
if (s->r == LABEL_DEFINED)
error("duplicate label '%s'", get_tok_str(s->v, NULL));
- gsym((long)s->next);
+ gsym(s->jnext);
s->r = LABEL_DEFINED;
} else {
s = label_push(&global_label_stack, b, LABEL_DEFINED);
}
- s->next = (void *)ind;
+ s->jnext = ind;
/* we accept this, but it is a mistake */
block_after_label:
if (tok == '}') {
diff --git a/tccpe.c b/tccpe.c
index 55b23b0..ac3688f 100644
--- a/tccpe.c
+++ b/tccpe.c
@@ -1548,7 +1548,7 @@ ST_FN void pe_add_runtime_ex(TCCState *s1, struct pe_info *pe)
}
if (start_symbol) {
- addr = (ADDR3264)tcc_get_symbol_err(s1, start_symbol);
+ addr = (uplong)tcc_get_symbol_err(s1, start_symbol);
if (s1->output_type == TCC_OUTPUT_MEMORY && addr)
/* for -run GUI's, put '_runwinmain' instead of 'main' */
add_elf_sym(symtab_section,
diff --git a/tccpp.c b/tccpp.c
index 1a9242b..505ba52 100644
--- a/tccpp.c
+++ b/tccpp.c
@@ -129,7 +129,11 @@ char *get_tok_str(int v, CValue *cv)
case TOK_CLLONG:
case TOK_CULLONG:
/* XXX: not quite exact, but only useful for testing */
+#ifdef _WIN32
+ sprintf(p, "%u", (unsigned)cv->ull);
+#else
sprintf(p, "%Lu", cv->ull);
+#endif
break;
case TOK_LCHAR:
cstr_ccat(&cstr_buf, 'L');
@@ -947,7 +951,7 @@ static void label_pop(Sym **ptop, Sym *slast)
if (s->c) {
/* define corresponding symbol. A size of
1 is put. */
- put_extern_sym(s, cur_text_section, (long)s->next, 1);
+ put_extern_sym(s, cur_text_section, s->jnext, 1);
}
}
/* remove label */