When using libtcc it's reasonable to be able to use the application's memory allocator for all allocations, including tcc_new(), and including #define MEM_DEBUG Ideally the allocator would be stored in the TCCState, like TCCErrorFunc. That would imply a new API tcc_new_with_allocator(), but more importantly would require all uses of tcc_malloc(x) to be changed to s->tcc_malloc(x). That's a non-starter in my book. Instead I refactored the memory management code so that all allocations flow through tcc_realloc(). Which simply calls a function pointer, the default value of which is the previous tcc_realloc(). It then becomess trivial to install a new allocator with the new function: LIBTCCAPI void tcc_set_realloc(TCCReallocFunc realloc); The resulting code adds the trivial cost of an additional function call per allocation/free. It also doesn't distinguish between malloc failure and realloc failure, but since both just fprintf then exit() that seems unimportant to me. On the plus side the preprocessor magic is much more clear. The diffs don't hightlight that, but take a look at the result to see if you agree. All tests passed on my x86 linux box.
118 lines
3.9 KiB
C
118 lines
3.9 KiB
C
#ifndef LIBTCC_H
|
|
#define LIBTCC_H
|
|
|
|
#ifndef LIBTCCAPI
|
|
# define LIBTCCAPI
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
struct TCCState;
|
|
|
|
typedef struct TCCState TCCState;
|
|
|
|
typedef void (*TCCErrorFunc)(void *opaque, const char *msg);
|
|
typedef void *(*TCCReallocFunc)(void *ptr, size_t size);
|
|
|
|
/* to be used for all allocation (including tcc_new()), otherwise malloc(), realloc(), free() */
|
|
LIBTCCAPI void tcc_set_realloc(TCCReallocFunc realloc);
|
|
|
|
/* return current allocator */
|
|
LIBTCCAPI TCCReallocFunc tcc_get_realloc();
|
|
|
|
/* create a new TCC compilation context */
|
|
LIBTCCAPI TCCState *tcc_new(void);
|
|
|
|
/* free a TCC compilation context */
|
|
LIBTCCAPI void tcc_delete(TCCState *s);
|
|
|
|
/* set CONFIG_TCCDIR at runtime */
|
|
LIBTCCAPI void tcc_set_lib_path(TCCState *s, const char *path);
|
|
|
|
/* set error/warning display callback */
|
|
LIBTCCAPI void tcc_set_error_func(TCCState *s, void *error_opaque, TCCErrorFunc error_func);
|
|
|
|
/* return error/warning callback */
|
|
LIBTCCAPI TCCErrorFunc tcc_get_error_func(TCCState *s);
|
|
|
|
/* return error/warning callback opaque pointer */
|
|
LIBTCCAPI void *tcc_get_error_opaque(TCCState *s);
|
|
|
|
/* set options as from command line (multiple supported) */
|
|
LIBTCCAPI int tcc_set_options(TCCState *s, const char *str);
|
|
|
|
/*****************************/
|
|
/* preprocessor */
|
|
|
|
/* add include path */
|
|
LIBTCCAPI int tcc_add_include_path(TCCState *s, const char *pathname);
|
|
|
|
/* add in system include path */
|
|
LIBTCCAPI int tcc_add_sysinclude_path(TCCState *s, const char *pathname);
|
|
|
|
/* define preprocessor symbol 'sym'. value can be NULL, sym can be "sym=val" */
|
|
LIBTCCAPI void tcc_define_symbol(TCCState *s, const char *sym, const char *value);
|
|
|
|
/* undefine preprocess symbol 'sym' */
|
|
LIBTCCAPI void tcc_undefine_symbol(TCCState *s, const char *sym);
|
|
|
|
/*****************************/
|
|
/* compiling */
|
|
|
|
/* add a file (C file, dll, object, library, ld script). Return -1 if error. */
|
|
LIBTCCAPI int tcc_add_file(TCCState *s, const char *filename);
|
|
|
|
/* compile a string containing a C source. Return -1 if error. */
|
|
LIBTCCAPI int tcc_compile_string(TCCState *s, const char *buf);
|
|
|
|
/*****************************/
|
|
/* linking commands */
|
|
|
|
/* set output type. MUST BE CALLED before any compilation */
|
|
LIBTCCAPI int tcc_set_output_type(TCCState *s, int output_type);
|
|
#define TCC_OUTPUT_MEMORY 1 /* output will be run in memory */
|
|
#define TCC_OUTPUT_EXE 2 /* executable file */
|
|
#define TCC_OUTPUT_DLL 4 /* dynamic library */
|
|
#define TCC_OUTPUT_OBJ 3 /* object file */
|
|
#define TCC_OUTPUT_PREPROCESS 5 /* only preprocess */
|
|
|
|
/* equivalent to -Lpath option */
|
|
LIBTCCAPI int tcc_add_library_path(TCCState *s, const char *pathname);
|
|
|
|
/* the library name is the same as the argument of the '-l' option */
|
|
LIBTCCAPI int tcc_add_library(TCCState *s, const char *libraryname);
|
|
|
|
/* add a symbol to the compiled program */
|
|
LIBTCCAPI int tcc_add_symbol(TCCState *s, const char *name, const void *val);
|
|
|
|
/* output an executable, library or object file. DO NOT call
|
|
tcc_relocate() before. */
|
|
LIBTCCAPI int tcc_output_file(TCCState *s, const char *filename);
|
|
|
|
/* link and run main() function and return its value. DO NOT call
|
|
tcc_relocate() before. */
|
|
LIBTCCAPI int tcc_run(TCCState *s, int argc, char **argv);
|
|
|
|
/* do all relocations (needed before using tcc_get_symbol()) */
|
|
LIBTCCAPI int tcc_relocate(TCCState *s1, void *ptr);
|
|
/* possible values for 'ptr':
|
|
- TCC_RELOCATE_AUTO : Allocate and manage memory internally
|
|
- NULL : return required memory size for the step below
|
|
- memory address : copy code to memory passed by the caller
|
|
returns -1 if error. */
|
|
#define TCC_RELOCATE_AUTO (void*)1
|
|
|
|
/* return symbol value or NULL if not found */
|
|
LIBTCCAPI void *tcc_get_symbol(TCCState *s, const char *name);
|
|
|
|
/* return symbol value or NULL if not found */
|
|
LIBTCCAPI void tcc_list_symbols(TCCState *s, void *ctx,
|
|
void (*symbol_cb)(void *ctx, const char *name, const void *val));
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|