aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgrischka <grischka>2012-03-05 20:15:56 +0100
committergrischka <grischka>2012-03-05 20:15:56 +0100
commita35b3059bb0aaaa5965022ad317aaba27e22f148 (patch)
tree17df79be55c72aafe2d1856a20fc1c367c9e20e4
parenta0db7162af0f694c25b278984ac66a46fa099000 (diff)
downloadtinycc-a35b3059bb0aaaa5965022ad317aaba27e22f148.tar.gz
tinycc-a35b3059bb0aaaa5965022ad317aaba27e22f148.tar.bz2
tcc.h: define TCC_IS_NATIVE
- disable tccrun feature for non-native (cross-) compilers - define uplong for target adress size - fix using -Wl,-Ttext=... for Win64 (tccpe: ADDR3264 imagebase)
-rw-r--r--tcc.c4
-rw-r--r--tcc.h34
-rw-r--r--tccpe.c11
-rw-r--r--tccrun.c5
4 files changed, 34 insertions, 20 deletions
diff --git a/tcc.c b/tcc.c
index 0c51451..0bcb029 100644
--- a/tcc.c
+++ b/tcc.c
@@ -578,7 +578,11 @@ int main(int argc, char **argv)
tcc_print_stats(s, getclock_us() - start_time);
if (s->output_type == TCC_OUTPUT_MEMORY) {
+#ifdef TCC_IS_NATIVE
ret = tcc_run(s, argc - optind, argv + optind);
+#else
+ tcc_error_noabort("-run is not available in a cross compiler");
+#endif
} else if (s->output_type == TCC_OUTPUT_PREPROCESS) {
if (s->outfile)
fclose(s->outfile);
diff --git a/tcc.h b/tcc.h
index 18a6b91..a5ae144 100644
--- a/tcc.h
+++ b/tcc.h
@@ -49,9 +49,6 @@
#include <direct.h> /* getcwd */
#define inline __inline
#define inp next_inp
-#ifdef _WIN64
-# define uplong unsigned long long
-#endif
#ifdef LIBTCC_AS_DLL
# define LIBTCCAPI __declspec(dllexport)
#endif
@@ -67,17 +64,10 @@
#endif /* !CONFIG_TCCBOOT */
-#ifndef uplong
-#define uplong unsigned long
-#endif
-
#ifndef PAGESIZE
#define PAGESIZE 4096
#endif
-#include "elf.h"
-#include "stab.h"
-
#ifndef O_BINARY
#define O_BINARY 0
#endif
@@ -86,6 +76,8 @@
#define SA_SIGINFO 0x00000004u
#endif
+#include "elf.h"
+#include "stab.h"
#include "libtcc.h"
/* parser debug */
@@ -131,8 +123,26 @@
#define TCC_TARGET_COFF
#endif
-#if !defined(CONFIG_TCCBOOT)
-#define CONFIG_TCC_BACKTRACE
+/* only native compiler supports -run */
+#if defined _WIN32 == defined TCC_TARGET_PE
+# if (defined __i386__ || defined _X86_) && defined TCC_TARGET_I386
+# define TCC_IS_NATIVE
+# elif (defined __x86_64__ || defined _AMD64_) && defined TCC_TARGET_X86_64
+# define TCC_IS_NATIVE
+# elif defined __arm__ && defined TCC_TARGET_ARM
+# define TCC_IS_NATIVE
+# endif
+#endif
+
+#if defined TCC_IS_NATIVE && !defined CONFIG_TCCBOOT
+# define CONFIG_TCC_BACKTRACE
+#endif
+
+/* target address type */
+#if defined TCC_TARGET_X86_64 && (!defined __x86_64__ || defined _WIN32)
+# define uplong unsigned long long
+#else
+# define uplong unsigned long
#endif
/* ------------ path configuration ------------ */
diff --git a/tccpe.c b/tccpe.c
index 51f4c53..4dec1d8 100644
--- a/tccpe.c
+++ b/tccpe.c
@@ -38,10 +38,6 @@
# define ADDR3264 DWORD
#endif
-#if defined _WIN32 && (defined _WIN64) == (defined TCC_TARGET_X86_64)
-#define TCC_IS_NATIVE
-#endif
-
#ifdef _WIN32
void dbg_printf (const char *fmt, ...)
{
@@ -339,7 +335,7 @@ struct pe_info {
const char *filename;
int type;
DWORD sizeofheaders;
- DWORD imagebase;
+ ADDR3264 imagebase;
DWORD start_addr;
DWORD imp_offs;
DWORD imp_size;
@@ -1870,11 +1866,10 @@ ST_FUNC int pe_output_file(TCCState * s1, const char *filename)
ret = pe_write(&pe);
tcc_free(pe.sec_info);
} else {
-#ifndef TCC_IS_NATIVE
- tcc_error_noabort("-run supported only on native platform");
-#endif
+#ifdef TCC_IS_NATIVE
pe.thunk = data_section;
pe_build_imports(&pe);
+#endif
}
#ifdef PE_PRINT_SECTIONS
diff --git a/tccrun.c b/tccrun.c
index de0ef89..41081cc 100644
--- a/tccrun.c
+++ b/tccrun.c
@@ -20,6 +20,9 @@
#include "tcc.h"
+/* only native compiler supports -run */
+#ifdef TCC_IS_NATIVE
+
#ifdef CONFIG_TCC_BACKTRACE
ST_DATA int rt_num_callers = 6;
ST_DATA const char **rt_bound_error_msg;
@@ -217,6 +220,8 @@ static void set_pages_executable(void *ptr, unsigned long length)
}
/* ------------------------------------------------------------- */
+#endif /* TCC_IS_NATIVE */
+
#ifdef CONFIG_TCC_BACKTRACE
PUB_FUNC void tcc_set_num_callers(int n)