forked from Mirrors/tinycc
Revert all of my changes to directories & codingstyle.
parent
5a16f5ea98
commit
89ad24e7d6
|
@ -5,7 +5,7 @@ a.out
|
||||||
*.log
|
*.log
|
||||||
tcc_g
|
tcc_g
|
||||||
tcc
|
tcc
|
||||||
/src/*-tcc
|
/*-tcc
|
||||||
tc2.c
|
tc2.c
|
||||||
doc
|
doc
|
||||||
tc3s.c
|
tc3s.c
|
||||||
|
@ -63,7 +63,7 @@ lib/i386-win32
|
||||||
lib/arm
|
lib/arm
|
||||||
lib/arm64
|
lib/arm64
|
||||||
tcc-doc.info
|
tcc-doc.info
|
||||||
conftest*!conftest.c
|
conftest*
|
||||||
tiny_libmaker
|
tiny_libmaker
|
||||||
*.dSYM
|
*.dSYM
|
||||||
*~
|
*~
|
||||||
|
|
|
@ -85,14 +85,14 @@ endif()
|
||||||
|
|
||||||
file(STRINGS "VERSION" TCC_VERSION)
|
file(STRINGS "VERSION" TCC_VERSION)
|
||||||
list(GET TCC_VERSION 0 TCC_VERSION)
|
list(GET TCC_VERSION 0 TCC_VERSION)
|
||||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src/)
|
include_directories(${CMAKE_BINARY_DIR})
|
||||||
configure_file(src/config.h.in ${CMAKE_CURRENT_SOURCE_DIR}/src/config.h)
|
configure_file(config.h.in config.h)
|
||||||
configure_file(docs/config.texi.in ${CMAKE_CURRENT_SOURCE_DIR}/docs/config.texi)
|
configure_file(config.texi.in config.texi)
|
||||||
|
|
||||||
# Utility variables
|
# Utility variables
|
||||||
set(I386_SOURCES src/x86/i386-gen.c src/x86/i386-asm.c src/x86/i386-asm.h src/x86/i386-tok.h)
|
set(I386_SOURCES i386-gen.c i386-asm.c i386-asm.h i386-tok.h)
|
||||||
set(X86_64_SOURCES src/x86/x86_64-gen.c src/x86/i386-asm.c src/x86/x86_64-asm.h)
|
set(X86_64_SOURCES x86_64-gen.c i386-asm.c x86_64-asm.h)
|
||||||
set(ARM_SOURCES src/arm/arm_gen.c)
|
set(ARM_SOURCES arm_gen.c)
|
||||||
|
|
||||||
set(LIBTCC1_I386_SOURCES lib/alloca86.S lib/alloca86-bt.S)
|
set(LIBTCC1_I386_SOURCES lib/alloca86.S lib/alloca86-bt.S)
|
||||||
set(LIBTCC1_WIN_SOURCES win32/lib/crt1.c win32/lib/wincrt1.c win32/lib/dllcrt1.c win32/lib/dllmain.c win32/lib/chkstk.S)
|
set(LIBTCC1_WIN_SOURCES win32/lib/crt1.c win32/lib/wincrt1.c win32/lib/dllcrt1.c win32/lib/dllmain.c win32/lib/chkstk.S)
|
||||||
|
@ -157,22 +157,22 @@ macro(make_tcc native_name cross_name cross_enabled definitions tcc_sources libt
|
||||||
|
|
||||||
if (TCC_BUILD_NATIVE)
|
if (TCC_BUILD_NATIVE)
|
||||||
add_library(libtcc
|
add_library(libtcc
|
||||||
src/libtcc.c
|
libtcc.c
|
||||||
src/tccpp.c
|
tccpp.c
|
||||||
src/tccgen.c
|
tccgen.c
|
||||||
src/tccelf.c
|
tccelf.c
|
||||||
src/tccasm.c
|
tccasm.c
|
||||||
src/tccrun.c
|
tccrun.c
|
||||||
src/tcc.h
|
tcc.h
|
||||||
src/libtcc.h
|
libtcc.h
|
||||||
src/tcctok.h
|
tcctok.h
|
||||||
${tcc_sources}
|
${tcc_sources}
|
||||||
)
|
)
|
||||||
set_target_properties(libtcc PROPERTIES OUTPUT_NAME tcc PREFIX lib)
|
set_target_properties(libtcc PROPERTIES OUTPUT_NAME tcc PREFIX lib)
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
set_target_properties(libtcc PROPERTIES LINK_FLAGS "-Wl,--output-def,libtcc.def")
|
set_target_properties(libtcc PROPERTIES LINK_FLAGS "-Wl,--output-def,libtcc.def")
|
||||||
endif()
|
endif()
|
||||||
add_executable(tcc src/tcc.c)
|
add_executable(tcc tcc.c)
|
||||||
target_link_libraries(tcc libtcc)
|
target_link_libraries(tcc libtcc)
|
||||||
if(NOT WIN32)
|
if(NOT WIN32)
|
||||||
target_link_libraries(tcc dl)
|
target_link_libraries(tcc dl)
|
||||||
|
@ -185,7 +185,7 @@ macro(make_tcc native_name cross_name cross_enabled definitions tcc_sources libt
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
elseif(${cross_enabled})
|
elseif(${cross_enabled})
|
||||||
add_executable(${cross_name}-tcc src/tcc.c)
|
add_executable(${cross_name}-tcc tcc.c)
|
||||||
set_target_properties(${cross_name}-tcc PROPERTIES COMPILE_DEFINITIONS "ONE_SOURCE;${definitions}")
|
set_target_properties(${cross_name}-tcc PROPERTIES COMPILE_DEFINITIONS "ONE_SOURCE;${definitions}")
|
||||||
install(TARGETS ${cross_name}-tcc RUNTIME DESTINATION ${EXE_PATH})
|
install(TARGETS ${cross_name}-tcc RUNTIME DESTINATION ${EXE_PATH})
|
||||||
|
|
||||||
|
@ -197,17 +197,17 @@ endmacro()
|
||||||
|
|
||||||
make_tcc("Win32" i386-w64-mingw32 TCC_BUILD_WIN32
|
make_tcc("Win32" i386-w64-mingw32 TCC_BUILD_WIN32
|
||||||
"TCC_TARGET_I386;TCC_TARGET_PE"
|
"TCC_TARGET_I386;TCC_TARGET_PE"
|
||||||
"${I386_SOURCES};src/tccpe.c"
|
"${I386_SOURCES};tccpe.c"
|
||||||
tiny_libmaker_32 "${LIBTCC1_I386_SOURCES};${LIBTCC1_WIN_SOURCES}" "win32/include;win32/include/winapi"
|
tiny_libmaker_32 "${LIBTCC1_I386_SOURCES};${LIBTCC1_WIN_SOURCES}" "win32/include;win32/include/winapi"
|
||||||
)
|
)
|
||||||
make_tcc("Win64" x86_64-w64-mingw32 TCC_BUILD_WIN64
|
make_tcc("Win64" x86_64-w64-mingw32 TCC_BUILD_WIN64
|
||||||
"TCC_TARGET_X86_64;TCC_TARGET_PE"
|
"TCC_TARGET_X86_64;TCC_TARGET_PE"
|
||||||
"${X86_64_SOURCES};src/tccpe.c"
|
"${X86_64_SOURCES};tccpe.c"
|
||||||
tiny_libmaker_64 "lib/alloca86_64.S;${LIBTCC1_WIN_SOURCES}" "win32/include;win32/include/winapi"
|
tiny_libmaker_64 "lib/alloca86_64.S;${LIBTCC1_WIN_SOURCES}" "win32/include;win32/include/winapi"
|
||||||
)
|
)
|
||||||
make_tcc("WinCE" arm-wince-mingw32ce TCC_BUILD_WINCE
|
make_tcc("WinCE" arm-wince-mingw32ce TCC_BUILD_WINCE
|
||||||
"TCC_TARGET_ARM;TCC_ARM_VERSION=${TCC_ARM_VERSION};TCC_TARGET_PE"
|
"TCC_TARGET_ARM;TCC_ARM_VERSION=${TCC_ARM_VERSION};TCC_TARGET_PE"
|
||||||
"${ARM_SOURCES};src/tccpe.c"
|
"${ARM_SOURCES};tccpe.c"
|
||||||
"" "" ""
|
"" "" ""
|
||||||
)
|
)
|
||||||
make_tcc("i386" i386-linux-gnu TCC_BUILD_I386
|
make_tcc("i386" i386-linux-gnu TCC_BUILD_I386
|
||||||
|
@ -248,7 +248,7 @@ make_tcc("" arm-linux-gnu TCC_BUILD_ARM_VFP
|
||||||
)
|
)
|
||||||
make_tcc("" c67 TCC_BUILD_C67
|
make_tcc("" c67 TCC_BUILD_C67
|
||||||
TCC_TARGET_C67
|
TCC_TARGET_C67
|
||||||
"c67-gen.c;src/tcccoff.c"
|
"c67-gen.c;tcccoff.c"
|
||||||
"" "" ""
|
"" "" ""
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -257,14 +257,14 @@ add_subdirectory(tests)
|
||||||
find_program(MAKEINFO NAMES makeinfo PATHS C:/MinGW/MSYS/1.0/bin)
|
find_program(MAKEINFO NAMES makeinfo PATHS C:/MinGW/MSYS/1.0/bin)
|
||||||
if(MAKEINFO)
|
if(MAKEINFO)
|
||||||
add_custom_command(OUTPUT tcc-doc.html
|
add_custom_command(OUTPUT tcc-doc.html
|
||||||
COMMAND ${MAKEINFO} --no-split --html -o tcc-doc.html ${CMAKE_CURRENT_SOURCE_DIR}/docs/tcc-doc.texi
|
COMMAND ${MAKEINFO} --no-split --html -o tcc-doc.html ${CMAKE_CURRENT_SOURCE_DIR}/tcc-doc.texi
|
||||||
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/docs/tcc-doc.texi
|
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/tcc-doc.texi
|
||||||
)
|
)
|
||||||
set(TCC_DOC_FILES tcc-doc.html)
|
set(TCC_DOC_FILES tcc-doc.html)
|
||||||
if(NOT WIN32)
|
if(NOT WIN32)
|
||||||
add_custom_command(OUTPUT tcc-doc.info
|
add_custom_command(OUTPUT tcc-doc.info
|
||||||
COMMAND ${MAKEINFO} -o tcc-doc.info ${CMAKE_CURRENT_SOURCE_DIR}/docs/tcc-doc.texi
|
COMMAND ${MAKEINFO} -o tcc-doc.info ${CMAKE_CURRENT_SOURCE_DIR}/tcc-doc.texi
|
||||||
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/docs/tcc-doc.texi
|
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/tcc-doc.texi
|
||||||
)
|
)
|
||||||
set(TCC_DOC_FILES ${TCC_DOC_FILES} tcc-doc.info)
|
set(TCC_DOC_FILES ${TCC_DOC_FILES} tcc-doc.info)
|
||||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/tcc-doc.info DESTINATION share/info)
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/tcc-doc.info DESTINATION share/info)
|
||||||
|
@ -290,3 +290,4 @@ else()
|
||||||
install(DIRECTORY win32/include/ DESTINATION lib/tcc/win32/include)
|
install(DIRECTORY win32/include/ DESTINATION lib/tcc/win32/include)
|
||||||
install(DIRECTORY include/ DESTINATION lib/tcc/win32/include)
|
install(DIRECTORY include/ DESTINATION lib/tcc/win32/include)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,5 @@
|
||||||
TinyCC Coding Style
|
Indentation
|
||||||
==========================
|
|
||||||
Lines should be no more than 80 columns long.
|
|
||||||
|
|
||||||
Indentation
|
|
||||||
--------------------------------------
|
|
||||||
Turn on a "fill tabs with spaces" option in your editor.
|
Turn on a "fill tabs with spaces" option in your editor.
|
||||||
|
|
||||||
Be also careful that some files are indented with 2 spaces (when they
|
Be also careful that some files are indented with 2 spaces (when they
|
423
Makefile
423
Makefile
|
@ -1,8 +1,421 @@
|
||||||
SRC_DIR = src
|
#
|
||||||
|
# Tiny C Compiler Makefile
|
||||||
|
#
|
||||||
|
|
||||||
.PHONY: default
|
TOP ?= .
|
||||||
default:
|
include $(TOP)/config.mak
|
||||||
$(MAKE) -C $(SRC_DIR)
|
VPATH = $(top_srcdir)
|
||||||
|
|
||||||
|
CPPFLAGS += -I$(TOP) # for config.h
|
||||||
|
|
||||||
|
ifneq (-$(findstring gcc,$(CC))-,-gcc-)
|
||||||
|
ifeq (-$(findstring clang,$(CC))-,-clang-)
|
||||||
|
# make clang accept gnuisms in libtcc1.c
|
||||||
|
CFLAGS+=-fheinous-gnu-extensions
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
CPPFLAGS_P=$(CPPFLAGS) -DCONFIG_TCC_STATIC
|
||||||
|
CFLAGS_P=$(CFLAGS) -pg -static
|
||||||
|
LIBS_P=
|
||||||
|
LDFLAGS_P=$(LDFLAGS)
|
||||||
|
|
||||||
|
ifdef CONFIG_WIN64
|
||||||
|
CONFIG_WIN32=yes
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifndef CONFIG_WIN32
|
||||||
|
LIBS=-lm
|
||||||
|
ifndef CONFIG_NOLDL
|
||||||
|
LIBS+=-ldl
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
# make libtcc as static or dynamic library?
|
||||||
|
ifdef DISABLE_STATIC
|
||||||
|
ifndef CONFIG_WIN32
|
||||||
|
LIBTCC=libtcc.so.1.0
|
||||||
|
else
|
||||||
|
LIBTCC=libtcc.dll
|
||||||
|
LIBTCC_DLL=yes
|
||||||
|
LIBTCC_EXTRA=libtcc.def libtcc.a
|
||||||
|
endif
|
||||||
|
LINK_LIBTCC=-Wl,-rpath,"$(libdir)"
|
||||||
|
ifdef DISABLE_RPATH
|
||||||
|
LINK_LIBTCC=
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
LIBTCC=libtcc.a
|
||||||
|
LINK_LIBTCC=
|
||||||
|
endif
|
||||||
|
|
||||||
|
CONFIG_$(ARCH) = yes
|
||||||
|
NATIVE_DEFINES_$(CONFIG_i386) += -DTCC_TARGET_I386
|
||||||
|
NATIVE_DEFINES_$(CONFIG_x86-64) += -DTCC_TARGET_X86_64
|
||||||
|
NATIVE_DEFINES_$(CONFIG_WIN32) += -DTCC_TARGET_PE
|
||||||
|
NATIVE_DEFINES_$(CONFIG_uClibc) += -DTCC_UCLIBC
|
||||||
|
NATIVE_DEFINES_$(CONFIG_arm) += -DTCC_TARGET_ARM
|
||||||
|
NATIVE_DEFINES_$(CONFIG_arm_eabihf) += -DTCC_ARM_EABI -DTCC_ARM_HARDFLOAT
|
||||||
|
NATIVE_DEFINES_$(CONFIG_arm_eabi) += -DTCC_ARM_EABI
|
||||||
|
NATIVE_DEFINES_$(CONFIG_arm_vfp) += -DTCC_ARM_VFP
|
||||||
|
NATIVE_DEFINES_$(CONFIG_arm64) += -DTCC_TARGET_ARM64
|
||||||
|
NATIVE_DEFINES += $(NATIVE_DEFINES_yes)
|
||||||
|
|
||||||
|
ifeq ($(TOP),.)
|
||||||
|
|
||||||
|
PROGS=tcc$(EXESUF)
|
||||||
|
I386_CROSS = i386-linux-gnu-tcc$(EXESUF)
|
||||||
|
WIN32_CROSS = i386-win-mingw32-tcc$(EXESUF)
|
||||||
|
WIN64_CROSS = x86_64-win-mingw32-tcc$(EXESUF)
|
||||||
|
WINCE_CROSS = arm-win-mingw32ce-tcc$(EXESUF)
|
||||||
|
X64_CROSS = x86_64-linux-gnu-tcc$(EXESUF)
|
||||||
|
ARM_FPA_CROSS = arm-linux-fpa-tcc$(EXESUF)
|
||||||
|
ARM_FPA_LD_CROSS = arm-linux-fpa-ld-tcc$(EXESUF)
|
||||||
|
ARM_VFP_CROSS = arm-linux-gnu-tcc$(EXESUF)
|
||||||
|
ARM_EABI_CROSS = arm-linux-gnueabi-tcc$(EXESUF)
|
||||||
|
ARM_EABIHF_CROSS = arm-linux-gnueabihf-tcc$(EXESUF)
|
||||||
|
ARM_CROSS = $(ARM_FPA_CROSS) $(ARM_FPA_LD_CROSS) $(ARM_VFP_CROSS) $(ARM_EABI_CROSS)
|
||||||
|
ARM64_CROSS = arm64-tcc$(EXESUF)
|
||||||
|
C67_CROSS = c67-tcc$(EXESUF)
|
||||||
|
|
||||||
|
# Legacy symlinks for cross compilers
|
||||||
|
$(I386_CROSS)_LINK = i386-tcc$(EXESUF)
|
||||||
|
$(WIN32_CROSS)_LINK = i386-win-tcc$(EXESUF)
|
||||||
|
$(WIN64_CROSS)_LINK = x86_64-win-tcc$(EXESUF)
|
||||||
|
$(WINCE_CROSS)_LINK = arm-win-tcc$(EXESUF)
|
||||||
|
$(X64_CROSS)_LINK = x86_64-tcc$(EXESUF)
|
||||||
|
$(ARM_FPA_CROSS)_LINK = arm-fpa-tcc$(EXESUF)
|
||||||
|
$(ARM_FPA_LD_CROSS)_LINK = arm-fpa-ld-tcc$(EXESUF)
|
||||||
|
$(ARM_VFP_CROSS)_LINK = arm-vfp-tcc$(EXESUF)
|
||||||
|
$(ARM_EABI_CROSS)_LINK = arm-eabi-tcc$(EXESUF)
|
||||||
|
|
||||||
|
ifeq ($(TARGETOS),Windows)
|
||||||
|
ifeq ($(ARCH),i386)
|
||||||
|
PROGS:=$($(WIN32_CROSS)_LINK)
|
||||||
|
$($(WIN32_CROSS)_LINK)_TCC = yes
|
||||||
|
endif
|
||||||
|
ifeq ($(ARCH),x86-64)
|
||||||
|
PROGS:=$($(WIN64_CROSS)_LINK)
|
||||||
|
$($(WIN64_CROSS)_LINK)_TCC = yes
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(TARGETOS),Linux)
|
||||||
|
ifeq ($(ARCH),i386)
|
||||||
|
PROGS:=$($(I386_CROSS)_LINK)
|
||||||
|
$($(I386_CROSS)_LINK)_TCC = yes
|
||||||
|
endif
|
||||||
|
ifeq ($(ARCH),x86-64)
|
||||||
|
PROGS:=$($(X64_CROSS)_LINK)
|
||||||
|
$($(X64_CROSS)_LINK)_TCC = yes
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
CORE_FILES = tcc.c libtcc.c tccpp.c tccgen.c tccelf.c tccasm.c tccrun.c
|
||||||
|
CORE_FILES += tcc.h config.h libtcc.h tcctok.h
|
||||||
|
I386_FILES = $(CORE_FILES) i386-gen.c i386-asm.c i386-asm.h i386-tok.h
|
||||||
|
WIN32_FILES = $(CORE_FILES) i386-gen.c i386-asm.c i386-asm.h i386-tok.h tccpe.c
|
||||||
|
WIN64_FILES = $(CORE_FILES) x86_64-gen.c i386-asm.c x86_64-asm.h tccpe.c
|
||||||
|
WINCE_FILES = $(CORE_FILES) arm-gen.c tccpe.c
|
||||||
|
X86_64_FILES = $(CORE_FILES) x86_64-gen.c i386-asm.c x86_64-asm.h
|
||||||
|
ARM_FILES = $(CORE_FILES) arm-gen.c
|
||||||
|
ARM64_FILES = $(CORE_FILES) arm64-gen.c
|
||||||
|
C67_FILES = $(CORE_FILES) c67-gen.c tcccoff.c
|
||||||
|
|
||||||
|
ifdef CONFIG_WIN64
|
||||||
|
PROGS+=tiny_impdef$(EXESUF) tiny_libmaker$(EXESUF)
|
||||||
|
NATIVE_FILES=$(WIN64_FILES)
|
||||||
|
PROGS_CROSS=$(WIN32_CROSS) $(I386_CROSS) $(X64_CROSS) $(ARM_CROSS) $(ARM64_CROSS) $(C67_CROSS) $(WINCE_CROSS)
|
||||||
|
LIBTCC1_CROSS=lib/i386-win/libtcc1.a
|
||||||
|
LIBTCC1=libtcc1.a
|
||||||
|
else ifdef CONFIG_WIN32
|
||||||
|
PROGS+=tiny_impdef$(EXESUF) tiny_libmaker$(EXESUF)
|
||||||
|
NATIVE_FILES=$(WIN32_FILES)
|
||||||
|
PROGS_CROSS=$(WIN64_CROSS) $(I386_CROSS) $(X64_CROSS) $(ARM_CROSS) $(ARM64_CROSS) $(C67_CROSS) $(WINCE_CROSS)
|
||||||
|
LIBTCC1_CROSS=lib/x86_64-win/libtcc1.a
|
||||||
|
LIBTCC1=libtcc1.a
|
||||||
|
else ifeq ($(ARCH),i386)
|
||||||
|
NATIVE_FILES=$(I386_FILES)
|
||||||
|
PROGS_CROSS=$($(X64_CROSS)_LINK) $($(WIN32_CROSS)_LINK) $($(WIN64_CROSS)_LINK) $(ARM_CROSS) $(ARM64_CROSS) $(C67_CROSS) $(WINCE_CROSS)
|
||||||
|
LIBTCC1_CROSS=lib/i386-win/libtcc1.a lib/x86_64-win/libtcc1.a lib/i386/libtcc1.a lib/x86_64/libtcc1.a \
|
||||||
|
lib/arm64/libtcc1.a
|
||||||
|
LIBTCC1=libtcc1.a
|
||||||
|
else ifeq ($(ARCH),x86-64)
|
||||||
|
ifeq ($(TARGETOS),Darwin)
|
||||||
|
NATIVE_FILES=$(X86_64_FILES)
|
||||||
|
PROGS_CROSS=$($(I386_CROSS)_LINK) $($(WIN32_CROSS)_LINK) $($(WIN64_CROSS)_LINK) $(ARM_CROSS) $(C67_CROSS) $(WINCE_CROSS)
|
||||||
|
LIBTCC1_CROSS=lib/i386-win/libtcc1.a lib/x86_64-win/libtcc1.a lib/i386/libtcc1.a lib/x86_64/libtcc1.a
|
||||||
|
LIBTCC1=libtcc1.a
|
||||||
|
else
|
||||||
|
NATIVE_FILES=$(X86_64_FILES)
|
||||||
|
PROGS_CROSS=$($(I386_CROSS)_LINK) $($(WIN32_CROSS)_LINK) $($(WIN64_CROSS)_LINK) $(ARM_CROSS) $(ARM64_CROSS) $(C67_CROSS) $(WINCE_CROSS)
|
||||||
|
LIBTCC1_CROSS=lib/i386-win/libtcc1.a lib/x86_64-win/libtcc1.a lib/i386/libtcc1.a lib/x86_64/libtcc1.a \
|
||||||
|
lib/arm64/libtcc1.a
|
||||||
|
LIBTCC1=libtcc1.a
|
||||||
|
endif
|
||||||
|
else ifeq ($(ARCH),arm)
|
||||||
|
NATIVE_FILES=$(ARM_FILES)
|
||||||
|
PROGS_CROSS=$(I386_CROSS) $(X64_CROSS) $(WIN32_CROSS) $(WIN64_CROSS) $(ARM64_CROSS) $(C67_CROSS) $(WINCE_CROSS)
|
||||||
|
LIBTCC1=libtcc1.a
|
||||||
|
LIBTCC1_CROSS=lib/i386-win/libtcc1.a lib/x86_64-win/libtcc1.a lib/i386/libtcc1.a
|
||||||
|
else ifeq ($(ARCH),arm64)
|
||||||
|
NATIVE_FILES=$(ARM64_FILES)
|
||||||
|
PROGS_CROSS=$(I386_CROSS) $(X64_CROSS) $(WIN32_CROSS) $(WIN64_CROSS) $(ARM_CROSS) $(C67_CROSS) $(WINCE_CROSS)
|
||||||
|
LIBTCC1=libtcc1.a
|
||||||
|
LIBTCC1_CROSS=lib/i386-win/libtcc1.a lib/x86_64-win/libtcc1.a lib/i386/libtcc1.a
|
||||||
|
endif
|
||||||
|
PROGS_CROSS_LINK=$(foreach PROG_CROSS,$(PROGS_CROSS),$($(PROG_CROSS)_LINK))
|
||||||
|
|
||||||
|
ifeq ($(TARGETOS),Darwin)
|
||||||
|
PROGS+=tiny_libmaker$(EXESUF)
|
||||||
|
endif
|
||||||
|
|
||||||
|
TCCLIBS = $(LIBTCC1) $(LIBTCC) $(LIBTCC_EXTRA)
|
||||||
|
TCCDOCS = tcc.1 tcc-doc.html tcc-doc.info
|
||||||
|
|
||||||
|
ifdef CONFIG_CROSS
|
||||||
|
PROGS+=$(PROGS_CROSS)
|
||||||
|
TCCLIBS+=$(LIBTCC1_CROSS)
|
||||||
|
endif
|
||||||
|
|
||||||
|
all: $(PROGS) $(TCCLIBS) $(TCCDOCS)
|
||||||
|
|
||||||
|
# Host Tiny C Compiler
|
||||||
|
tcc$(EXESUF): tcc.o $(LIBTCC)
|
||||||
|
$(CC) -o $@ $^ $(LIBS) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) $(LINK_LIBTCC)
|
||||||
|
|
||||||
|
# Cross Tiny C Compilers
|
||||||
|
%-tcc$(EXESUF): tcc.c
|
||||||
|
$(CC) -o $@ $< -DONE_SOURCE $(if $($@_TCC),$(NATIVE_DEFINES),$(DEFINES)) $(CPPFLAGS) $(CFLAGS) $(LIBS) $(LDFLAGS)
|
||||||
|
$(if $($@_LINK),ln -sf $@ $($@_LINK))
|
||||||
|
$(if $($@_TCC),ln -sf $@ tcc$(EXESUF))
|
||||||
|
|
||||||
|
# profiling version
|
||||||
|
tcc_p$(EXESUF): $(NATIVE_FILES)
|
||||||
|
$(CC) -o $@ $< -DONE_SOURCE $(NATIVE_DEFINES) $(CPPFLAGS_P) $(CFLAGS_P) $(LIBS_P) $(LDFLAGS_P)
|
||||||
|
|
||||||
|
$(I386_CROSS) $($(I386_CROSS)_LINK): DEFINES = -DTCC_TARGET_I386
|
||||||
|
$(X64_CROSS) $($(X64_CROSS)_LINK): DEFINES = -DTCC_TARGET_X86_64
|
||||||
|
$(WIN32_CROSS) $($(WIN32_CROSS)_LINK): DEFINES = -DTCC_TARGET_I386 -DTCC_TARGET_PE \
|
||||||
|
-DCONFIG_TCCDIR="\"$(tccdir)/win32\"" \
|
||||||
|
-DCONFIG_TCC_LIBPATHS="\"{B}/lib/32;{B}/lib\""
|
||||||
|
$(WIN64_CROSS) $($(WIN64_CROSS)_LINK): DEFINES = -DTCC_TARGET_X86_64 -DTCC_TARGET_PE \
|
||||||
|
-DCONFIG_TCCDIR="\"$(tccdir)/win32\"" \
|
||||||
|
-DCONFIG_TCC_LIBPATHS="\"{B}/lib/64;{B}/lib\""
|
||||||
|
$(WINCE_CROSS): DEFINES = -DTCC_TARGET_PE
|
||||||
|
$(C67_CROSS): DEFINES = -DTCC_TARGET_C67
|
||||||
|
$(ARM_FPA_CROSS): DEFINES = -DTCC_TARGET_ARM
|
||||||
|
$(ARM_FPA_LD_CROSS)$(EXESUF): DEFINES = -DTCC_TARGET_ARM -DLDOUBLE_SIZE=12
|
||||||
|
$(ARM_VFP_CROSS): DEFINES = -DTCC_TARGET_ARM -DTCC_ARM_VFP
|
||||||
|
$(ARM_EABI_CROSS): DEFINES = -DTCC_TARGET_ARM -DTCC_ARM_EABI -DTCC_ARM_VFP
|
||||||
|
$(ARM64_CROSS): DEFINES = -DTCC_TARGET_ARM64
|
||||||
|
|
||||||
|
$(I386_CROSS) $($(I386_CROSS)_LINK): $(I386_FILES)
|
||||||
|
$(X64_CROSS) $($(X64_CROSS)_LINK): $(X86_64_FILES)
|
||||||
|
$(WIN32_CROSS) $($(WIN32_CROSS)_LINK): $(WIN32_FILES)
|
||||||
|
$(WIN64_CROSS) $($(WIN64_CROSS)_LINK): $(WIN64_FILES)
|
||||||
|
$(WINCE_CROSS) $($(WINCE_CROSS)_LINK): $(WINCE_FILES)
|
||||||
|
$(C67_CROSS) $($(C67_CROSS)_LINK): $(C67_FILES)
|
||||||
|
$(ARM_FPA_CROSS) $(ARM_FPA_LD_CROSS) $(ARM_VFP_CROSS) $(ARM_EABI_CROSS): $(ARM_FILES)
|
||||||
|
$($(ARM_FPA_CROSS)_LINK) $($(ARM_FPA_LD_CROSS)_LINK) $($(ARM_VFP_CROSS)_LINK) $($(ARM_EABI_CROSS)_LINK): $(ARM_FILES)
|
||||||
|
$(ARM64_CROSS): $(ARM64_FILES)
|
||||||
|
|
||||||
|
# libtcc generation and test
|
||||||
|
ifndef ONE_SOURCE
|
||||||
|
LIBTCC_OBJ = $(filter-out tcc.o,$(patsubst %.c,%.o,$(filter %.c,$(NATIVE_FILES))))
|
||||||
|
LIBTCC_INC = $(filter %.h,$(CORE_FILES)) $(filter-out $(CORE_FILES),$(NATIVE_FILES))
|
||||||
|
else
|
||||||
|
LIBTCC_OBJ = libtcc.o
|
||||||
|
LIBTCC_INC = $(NATIVE_FILES)
|
||||||
|
libtcc.o : NATIVE_DEFINES += -DONE_SOURCE
|
||||||
|
endif
|
||||||
|
|
||||||
|
$(LIBTCC_OBJ) tcc.o : %.o : %.c $(LIBTCC_INC)
|
||||||
|
$(CC) -o $@ -c $< $(NATIVE_DEFINES) $(CPPFLAGS) $(CFLAGS)
|
||||||
|
|
||||||
|
ifndef LIBTCC_DLL
|
||||||
|
libtcc.a: $(LIBTCC_OBJ)
|
||||||
|
$(AR) rcs $@ $^
|
||||||
|
endif
|
||||||
|
|
||||||
|
libtcc.so.1.0: $(LIBTCC_OBJ)
|
||||||
|
$(CC) -shared -Wl,-soname,$@ -o $@ $^ $(LDFLAGS)
|
||||||
|
|
||||||
|
libtcc.so.1.0: CFLAGS+=-fPIC
|
||||||
|
|
||||||
|
ifdef LIBTCC_DLL
|
||||||
|
libtcc.dll libtcc.def libtcc.a: $(LIBTCC_OBJ)
|
||||||
|
$(CC) -shared $^ -o $@ $(LDFLAGS) -Wl,--output-def,libtcc.def,--out-implib,libtcc.a
|
||||||
|
endif
|
||||||
|
|
||||||
|
# windows utilities
|
||||||
|
tiny_impdef$(EXESUF): win32/tools/tiny_impdef.c
|
||||||
|
$(CC) -o $@ $< $(CPPFLAGS) $(CFLAGS) $(LDFLAGS)
|
||||||
|
tiny_libmaker$(EXESUF): win32/tools/tiny_libmaker.c
|
||||||
|
$(CC) -o $@ $< $(CPPFLAGS) $(CFLAGS) $(LDFLAGS)
|
||||||
|
|
||||||
|
# TinyCC runtime libraries
|
||||||
|
libtcc1.a : FORCE
|
||||||
|
$(MAKE) -C lib native
|
||||||
|
if test ! -d $(ARCH); then mkdir $(ARCH); fi
|
||||||
|
if test ! -L $(ARCH)/$@; then ln -sf ../$@ $(ARCH)/$@; fi
|
||||||
|
lib/%/libtcc1.a : FORCE $(PROGS_CROSS)
|
||||||
|
$(MAKE) -C lib cross TARGET=$*
|
||||||
|
|
||||||
|
FORCE:
|
||||||
|
|
||||||
|
# install
|
||||||
|
TCC_INCLUDES = stdarg.h stddef.h stdbool.h float.h varargs.h
|
||||||
|
INSTALL=install
|
||||||
|
ifdef STRIP_BINARIES
|
||||||
|
INSTALLBIN=$(INSTALL) -s
|
||||||
|
else
|
||||||
|
INSTALLBIN=$(INSTALL)
|
||||||
|
endif
|
||||||
|
|
||||||
|
install-strip: install
|
||||||
|
strip $(foreach PROG,$(PROGS),"$(bindir)"/$(PROG))
|
||||||
|
|
||||||
|
ifndef CONFIG_WIN32
|
||||||
|
install: $(PROGS) $(TCCLIBS) $(TCCDOCS)
|
||||||
|
mkdir -p "$(bindir)"
|
||||||
|
$(INSTALLBIN) -m755 $(PROGS) "$(bindir)"
|
||||||
|
cp -P tcc$(EXESUF) "$(bindir)"
|
||||||
|
mkdir -p "$(mandir)/man1"
|
||||||
|
-$(INSTALL) -m644 tcc.1 "$(mandir)/man1"
|
||||||
|
mkdir -p "$(infodir)"
|
||||||
|
-$(INSTALL) -m644 tcc-doc.info "$(infodir)"
|
||||||
|
mkdir -p "$(tccdir)"
|
||||||
|
mkdir -p "$(tccdir)/include"
|
||||||
|
ifneq ($(LIBTCC1),)
|
||||||
|
mkdir -p "$(tccdir)/$(ARCH)"
|
||||||
|
$(INSTALL) -m644 $(LIBTCC1) "$(tccdir)/$(ARCH)"
|
||||||
|
endif
|
||||||
|
$(INSTALL) -m644 $(addprefix $(top_srcdir)/include/,$(TCC_INCLUDES)) $(top_srcdir)/tcclib.h "$(tccdir)/include"
|
||||||
|
mkdir -p "$(libdir)"
|
||||||
|
$(INSTALL) -m644 $(LIBTCC) "$(libdir)"
|
||||||
|
ifdef DISABLE_STATIC
|
||||||
|
ln -sf "$(ln_libdir)/libtcc.so.1.0" "$(libdir)/libtcc.so.1"
|
||||||
|
ln -sf "$(ln_libdir)/libtcc.so.1.0" "$(libdir)/libtcc.so"
|
||||||
|
endif
|
||||||
|
mkdir -p "$(includedir)"
|
||||||
|
$(INSTALL) -m644 $(top_srcdir)/libtcc.h "$(includedir)"
|
||||||
|
mkdir -p "$(docdir)"
|
||||||
|
-$(INSTALL) -m644 tcc-doc.html "$(docdir)"
|
||||||
|
ifdef CONFIG_CROSS
|
||||||
|
mkdir -p "$(tccdir)/win32/lib/32"
|
||||||
|
mkdir -p "$(tccdir)/win32/lib/64"
|
||||||
|
mkdir -p "$(tccdir)/i386"
|
||||||
|
mkdir -p "$(tccdir)/x86-64"
|
||||||
|
ifneq ($(HOST_OS),Darwin)
|
||||||
|
mkdir -p "$(tccdir)/arm64"
|
||||||
|
$(INSTALL) -m644 lib/arm64/libtcc1.a "$(tccdir)/arm64"
|
||||||
|
endif
|
||||||
|
$(INSTALL) -m644 lib/i386/libtcc1.a "$(tccdir)/i386"
|
||||||
|
$(INSTALL) -m644 lib/x86_64/libtcc1.a "$(tccdir)/x86-64"
|
||||||
|
$(INSTALL) -m644 $(top_srcdir)/win32/lib/*.def "$(tccdir)/win32/lib"
|
||||||
|
$(INSTALL) -m644 lib/i386-win/libtcc1.a "$(tccdir)/win32/lib/32"
|
||||||
|
$(INSTALL) -m644 lib/x86_64-win/libtcc1.a "$(tccdir)/win32/lib/64"
|
||||||
|
cp -r $(top_srcdir)/win32/include/. "$(tccdir)/win32/include"
|
||||||
|
cp -r "$(tccdir)/include" "$(tccdir)/win32"
|
||||||
|
endif
|
||||||
|
|
||||||
|
uninstall:
|
||||||
|
rm -fv $(foreach P,$(PROGS),"$(bindir)/$P")
|
||||||
|
rm -fv "$(bindir)/tcc$(EXESUF)"
|
||||||
|
rm -fv $(foreach P,$(LIBTCC1),"$(tccdir)/$P")
|
||||||
|
rm -fv $(foreach P,$(TCC_INCLUDES),"$(tccdir)/include/$P")
|
||||||
|
rm -fv "$(mandir)/man1/tcc.1" "$(infodir)/tcc-doc.info"
|
||||||
|
rm -fv "$(libdir)/$(LIBTCC)" "$(includedir)/libtcc.h"
|
||||||
|
rm -fv "$(libdir)/libtcc.so*"
|
||||||
|
rm -rv "$(tccdir)"
|
||||||
|
rm -rv "$(docdir)"
|
||||||
|
else
|
||||||
|
# on windows
|
||||||
|
install: $(PROGS) $(TCCLIBS) $(TCCDOCS)
|
||||||
|
mkdir -p "$(tccdir)"
|
||||||
|
mkdir -p "$(tccdir)/lib"
|
||||||
|
mkdir -p "$(tccdir)/include"
|
||||||
|
mkdir -p "$(tccdir)/examples"
|
||||||
|
mkdir -p "$(tccdir)/doc"
|
||||||
|
mkdir -p "$(tccdir)/libtcc"
|
||||||
|
$(INSTALLBIN) -m755 $(PROGS) "$(tccdir)"
|
||||||
|
$(INSTALLBIN) -m755 tcc.exe "$(tccdir)"
|
||||||
|
$(INSTALL) -m644 $(LIBTCC1) $(top_srcdir)/win32/lib/*.def "$(tccdir)/lib"
|
||||||
|
cp -r $(top_srcdir)/win32/include/. "$(tccdir)/include"
|
||||||
|
cp -r $(top_srcdir)/win32/examples/. "$(tccdir)/examples"
|
||||||
|
$(INSTALL) -m644 $(addprefix $(top_srcdir)/include/,$(TCC_INCLUDES)) $(top_srcdir)/tcclib.h "$(tccdir)/include"
|
||||||
|
$(INSTALL) -m644 tcc-doc.html $(top_srcdir)/win32/tcc-win32.txt "$(tccdir)/doc"
|
||||||
|
$(INSTALL) -m644 $(top_srcdir)/libtcc.h $(LIBTCC_EXTRA) "$(tccdir)/libtcc"
|
||||||
|
$(INSTALL) -m644 $(LIBTCC) "$(tccdir)"
|
||||||
|
ifdef CONFIG_CROSS
|
||||||
|
mkdir -p "$(tccdir)/lib/32"
|
||||||
|
mkdir -p "$(tccdir)/lib/64"
|
||||||
|
-$(INSTALL) -m644 lib/i386-win/libtcc1.a "$(tccdir)/lib/32"
|
||||||
|
-$(INSTALL) -m644 lib/x86_64-win/libtcc1.a "$(tccdir)/lib/64"
|
||||||
|
endif
|
||||||
|
|
||||||
|
uninstall:
|
||||||
|
rm -rfv "$(tccdir)/*"
|
||||||
|
endif
|
||||||
|
|
||||||
|
# documentation and man page
|
||||||
|
tcc-doc.html: tcc-doc.texi
|
||||||
|
-makeinfo --no-split --html --number-sections -o $@ $<
|
||||||
|
|
||||||
|
tcc.1: tcc-doc.texi
|
||||||
|
-$(top_srcdir)/texi2pod.pl $< tcc.pod
|
||||||
|
-pod2man --section=1 --center="Tiny C Compiler" --release=`cat $(top_srcdir)/VERSION` tcc.pod > $@
|
||||||
|
|
||||||
|
tcc-doc.info: tcc-doc.texi
|
||||||
|
-makeinfo $<
|
||||||
|
|
||||||
|
# in tests subdir
|
||||||
|
export LIBTCC1
|
||||||
|
|
||||||
|
%est:
|
||||||
|
$(MAKE) -C tests $@ 'PROGS_CROSS=$(PROGS_CROSS)'
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(MAKE) -C $(SRC_DIR) clean
|
rm -vf $(PROGS) tcc_p$(EXESUF) tcc.pod *~ *.o *.a *.so* *.out *.log \
|
||||||
|
*.exe a.out tags TAGS libtcc_test$(EXESUF) tcc$(EXESUF)
|
||||||
|
-rm -r $(ARCH) arm64
|
||||||
|
ifeq ($(HOST_OS),Linux)
|
||||||
|
-rm -r ./C:
|
||||||
|
endif
|
||||||
|
-rm *-tcc$(EXESUF)
|
||||||
|
$(MAKE) -C tests $@
|
||||||
|
ifneq ($(LIBTCC1),)
|
||||||
|
$(MAKE) -C lib $@
|
||||||
|
endif
|
||||||
|
|
||||||
|
distclean: clean
|
||||||
|
rm -vf config.h config.mak config.texi tcc.1 tcc-doc.info tcc-doc.html
|
||||||
|
|
||||||
|
config.mak:
|
||||||
|
@echo "Please run ./configure."
|
||||||
|
@exit 1
|
||||||
|
|
||||||
|
tags:
|
||||||
|
ctags $(top_srcdir)/*.[ch] $(top_srcdir)/include/*.h $(top_srcdir)/lib/*.[chS]
|
||||||
|
|
||||||
|
TAGS:
|
||||||
|
ctags -e $(top_srcdir)/*.[ch] $(top_srcdir)/include/*.h $(top_srcdir)/lib/*.[chS]
|
||||||
|
|
||||||
|
# create release tarball from *current* git branch (including tcc-doc.html
|
||||||
|
# and converting two files to CRLF)
|
||||||
|
TCC-VERSION := tcc-$(shell cat $(top_srcdir)/VERSION)
|
||||||
|
tar: tcc-doc.html
|
||||||
|
mkdir $(TCC-VERSION)
|
||||||
|
( cd $(TCC-VERSION) && git --git-dir ../.git checkout -f )
|
||||||
|
cp tcc-doc.html $(TCC-VERSION)
|
||||||
|
for f in tcc-win32.txt build-tcc.bat ; do \
|
||||||
|
cat win32/$$f | sed 's,\(.*\),\1\r,g' > $(TCC-VERSION)/win32/$$f ; \
|
||||||
|
done
|
||||||
|
tar cjf $(TCC-VERSION).tar.bz2 $(TCC-VERSION)
|
||||||
|
rm -rf $(TCC-VERSION)
|
||||||
|
git reset
|
||||||
|
|
||||||
|
.PHONY: all clean tar tags TAGS distclean install uninstall FORCE
|
||||||
|
|
||||||
|
endif # ifeq ($(TOP),.)
|
||||||
|
|
|
@ -58,7 +58,7 @@ typedef int RegArgs;
|
||||||
/******************************************************/
|
/******************************************************/
|
||||||
#else /* ! TARGET_DEFS_ONLY */
|
#else /* ! TARGET_DEFS_ONLY */
|
||||||
/******************************************************/
|
/******************************************************/
|
||||||
#include "../tcc.h"
|
#include "tcc.h"
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
ST_DATA const int reg_classes[NB_REGS] = {
|
ST_DATA const int reg_classes[NB_REGS] = {
|
|
@ -127,7 +127,7 @@ enum {
|
||||||
/******************************************************/
|
/******************************************************/
|
||||||
#else /* ! TARGET_DEFS_ONLY */
|
#else /* ! TARGET_DEFS_ONLY */
|
||||||
/******************************************************/
|
/******************************************************/
|
||||||
#include "../tcc.h"
|
#include "tcc.h"
|
||||||
|
|
||||||
ST_DATA const int reg_classes[NB_REGS] = {
|
ST_DATA const int reg_classes[NB_REGS] = {
|
||||||
/* eax */ RC_INT | RC_FLOAT | RC_EAX,
|
/* eax */ RC_INT | RC_FLOAT | RC_EAX,
|
|
@ -370,7 +370,7 @@ struct syment
|
||||||
#define INCREF_COFF(x) ((((x)&~N_BTMASK_COFF)<<N_TSHIFT_COFF)|(DT_PTR<<N_BTSHFT_COFF)|(x&N_BTMASK_COFF))
|
#define INCREF_COFF(x) ((((x)&~N_BTMASK_COFF)<<N_TSHIFT_COFF)|(DT_PTR<<N_BTSHFT_COFF)|(x&N_BTMASK_COFF))
|
||||||
#define DECREF_COFF(x) ((((x)>>N_TSHIFT_COFF)&~N_BTMASK_COFF)|((x)&N_BTMASK_COFF))
|
#define DECREF_COFF(x) ((((x)>>N_TSHIFT_COFF)&~N_BTMASK_COFF)|((x)&N_BTMASK_COFF))
|
||||||
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------*/
|
/*------------------------------------------------------------------------*/
|
||||||
/* AUXILIARY SYMBOL ENTRY */
|
/* AUXILIARY SYMBOL ENTRY */
|
||||||
/*------------------------------------------------------------------------*/
|
/*------------------------------------------------------------------------*/
|
|
@ -337,7 +337,7 @@ strip="${cross_prefix}${strip}"
|
||||||
CONFTEST=./conftest$EXESUF
|
CONFTEST=./conftest$EXESUF
|
||||||
|
|
||||||
if test -z "$cross_prefix" ; then
|
if test -z "$cross_prefix" ; then
|
||||||
if ! $cc -o $CONFTEST $source_path/src/conftest.c 2>/dev/null ; then
|
if ! $cc -o $CONFTEST $source_path/conftest.c 2>/dev/null ; then
|
||||||
echo "configure: error: '$cc' failed to compile conftest.c."
|
echo "configure: error: '$cc' failed to compile conftest.c."
|
||||||
else
|
else
|
||||||
bigendian="$($CONFTEST bigendian)"
|
bigendian="$($CONFTEST bigendian)"
|
||||||
|
@ -560,7 +560,7 @@ fi
|
||||||
version=`head $source_path/VERSION`
|
version=`head $source_path/VERSION`
|
||||||
echo "VERSION=$version" >>config.mak
|
echo "VERSION=$version" >>config.mak
|
||||||
echo "#define TCC_VERSION \"$version\"" >> $TMPH
|
echo "#define TCC_VERSION \"$version\"" >> $TMPH
|
||||||
echo "@set VERSION $version" >docs/config.texi
|
echo "@set VERSION $version" > config.texi
|
||||||
echo "SRC_PATH=$source_path" >>config.mak
|
echo "SRC_PATH=$source_path" >>config.mak
|
||||||
|
|
||||||
if test "$source_path_used" = "yes" ; then
|
if test "$source_path_used" = "yes" ; then
|
||||||
|
@ -573,9 +573,9 @@ else
|
||||||
fi
|
fi
|
||||||
echo 'top_builddir=$(TOP)' >>config.mak
|
echo 'top_builddir=$(TOP)' >>config.mak
|
||||||
|
|
||||||
diff $TMPH src/config.h >/dev/null 2>&1
|
diff $TMPH config.h >/dev/null 2>&1
|
||||||
if test $? -ne 0 ; then
|
if test $? -ne 0 ; then
|
||||||
mv -f $TMPH src/config.h
|
mv -f $TMPH config.h
|
||||||
else
|
else
|
||||||
echo "config.h is unchanged"
|
echo "config.h is unchanged"
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "../tcc.h"
|
#include "tcc.h"
|
||||||
|
|
||||||
/* #define NB_ASM_REGS 8 */
|
/* #define NB_ASM_REGS 8 */
|
||||||
#define MAX_OPERANDS 3
|
#define MAX_OPERANDS 3
|
|
@ -89,7 +89,7 @@ enum {
|
||||||
/******************************************************/
|
/******************************************************/
|
||||||
#else /* ! TARGET_DEFS_ONLY */
|
#else /* ! TARGET_DEFS_ONLY */
|
||||||
/******************************************************/
|
/******************************************************/
|
||||||
#include "../tcc.h"
|
#include "tcc.h"
|
||||||
|
|
||||||
ST_DATA const int reg_classes[NB_REGS] = {
|
ST_DATA const int reg_classes[NB_REGS] = {
|
||||||
/* eax */ RC_INT | RC_EAX,
|
/* eax */ RC_INT | RC_EAX,
|
16
lib/Makefile
16
lib/Makefile
|
@ -2,9 +2,9 @@
|
||||||
# Tiny C Compiler Makefile for libtcc1.a
|
# Tiny C Compiler Makefile for libtcc1.a
|
||||||
#
|
#
|
||||||
|
|
||||||
TOP = ../src
|
TOP = ..
|
||||||
include $(TOP)/Makefile
|
include $(TOP)/Makefile
|
||||||
VPATH = $(top_srcdir)/../lib $(top_srcdir)/../win32/lib
|
VPATH = $(top_srcdir)/lib $(top_srcdir)/win32/lib
|
||||||
|
|
||||||
ifndef TARGET # native library
|
ifndef TARGET # native library
|
||||||
ifdef CONFIG_WIN64
|
ifdef CONFIG_WIN64
|
||||||
|
@ -37,7 +37,7 @@ endif
|
||||||
BCHECK_O = bcheck.o
|
BCHECK_O = bcheck.o
|
||||||
DIR = $(TARGET)
|
DIR = $(TARGET)
|
||||||
|
|
||||||
native : $(DIR)/libtcc1.a
|
native : ../libtcc1.a
|
||||||
cross : $(DIR)/libtcc1.a
|
cross : $(DIR)/libtcc1.a
|
||||||
|
|
||||||
native : TCC = $(TOP)/tcc$(EXESUF)
|
native : TCC = $(TOP)/tcc$(EXESUF)
|
||||||
|
@ -61,26 +61,26 @@ CFLAGS := $(filter-out -fstack-protector-strong,$(CFLAGS))
|
||||||
ifeq "$(TARGET)" "i386-win"
|
ifeq "$(TARGET)" "i386-win"
|
||||||
OBJ = $(addprefix $(DIR)/,$(WIN32_O))
|
OBJ = $(addprefix $(DIR)/,$(WIN32_O))
|
||||||
TGT = -DTCC_TARGET_I386 -DTCC_TARGET_PE
|
TGT = -DTCC_TARGET_I386 -DTCC_TARGET_PE
|
||||||
XCC ?= $(TCC) -B$(top_srcdir)/win32 -I$(top_srcdir)/../include
|
XCC ?= $(TCC) -B$(top_srcdir)/win32 -I$(top_srcdir)/include
|
||||||
XAR ?= $(DIR)/tiny_libmaker$(EXESUF)
|
XAR ?= $(DIR)/tiny_libmaker$(EXESUF)
|
||||||
PICFLAGS =
|
PICFLAGS =
|
||||||
else
|
else
|
||||||
ifeq "$(TARGET)" "x86_64-win"
|
ifeq "$(TARGET)" "x86_64-win"
|
||||||
OBJ = $(addprefix $(DIR)/,$(WIN64_O))
|
OBJ = $(addprefix $(DIR)/,$(WIN64_O))
|
||||||
TGT = -DTCC_TARGET_X86_64 -DTCC_TARGET_PE
|
TGT = -DTCC_TARGET_X86_64 -DTCC_TARGET_PE
|
||||||
XCC = $(TCC) -B$(top_srcdir)/win32 -I$(top_srcdir)/../include
|
XCC = $(TCC) -B$(top_srcdir)/win32 -I$(top_srcdir)/include
|
||||||
XAR ?= $(DIR)/tiny_libmaker$(EXESUF)
|
XAR ?= $(DIR)/tiny_libmaker$(EXESUF)
|
||||||
PICFLAGS =
|
PICFLAGS =
|
||||||
else
|
else
|
||||||
ifeq "$(TARGET)" "i386"
|
ifeq "$(TARGET)" "i386"
|
||||||
OBJ = $(addprefix $(DIR)/,$(I386_O))
|
OBJ = $(addprefix $(DIR)/,$(I386_O))
|
||||||
TGT = -DTCC_TARGET_I386
|
TGT = -DTCC_TARGET_I386
|
||||||
XCC ?= $(TCC) -B$(TOP) -I$(top_srcdir)/../include
|
XCC ?= $(TCC) -B$(TOP)
|
||||||
else
|
else
|
||||||
ifeq "$(TARGET)" "x86_64"
|
ifeq "$(TARGET)" "x86_64"
|
||||||
OBJ = $(addprefix $(DIR)/,$(X86_64_O))
|
OBJ = $(addprefix $(DIR)/,$(X86_64_O))
|
||||||
TGT = -DTCC_TARGET_X86_64
|
TGT = -DTCC_TARGET_X86_64
|
||||||
XCC ?= $(TCC) -B$(TOP) -I$(top_srcdir)/../include
|
XCC ?= $(TCC) -B$(TOP)
|
||||||
else
|
else
|
||||||
ifeq "$(TARGET)" "arm"
|
ifeq "$(TARGET)" "arm"
|
||||||
OBJ = $(addprefix $(DIR)/,$(ARM_O))
|
OBJ = $(addprefix $(DIR)/,$(ARM_O))
|
||||||
|
@ -110,7 +110,7 @@ endif
|
||||||
|
|
||||||
XAR ?= $(AR)
|
XAR ?= $(AR)
|
||||||
|
|
||||||
$(DIR)/libtcc1.a : $(OBJ) $(XAR)
|
$(DIR)/libtcc1.a ../libtcc1.a : $(OBJ) $(XAR)
|
||||||
$(XAR) rcs $@ $(OBJ)
|
$(XAR) rcs $@ $(OBJ)
|
||||||
$(DIR)/%.o : %.c
|
$(DIR)/%.o : %.c
|
||||||
$(XCC) -c $< -o $@ $(XFLAGS)
|
$(XCC) -c $< -o $@ $(XFLAGS)
|
||||||
|
|
|
@ -40,24 +40,24 @@ ST_DATA struct TCCState *tcc_state;
|
||||||
#include "tccelf.c"
|
#include "tccelf.c"
|
||||||
#include "tccrun.c"
|
#include "tccrun.c"
|
||||||
#ifdef TCC_TARGET_I386
|
#ifdef TCC_TARGET_I386
|
||||||
#include "x86/i386-gen.c"
|
#include "i386-gen.c"
|
||||||
#endif
|
#endif
|
||||||
#ifdef TCC_TARGET_ARM
|
#ifdef TCC_TARGET_ARM
|
||||||
#include "arm/arm-gen.c"
|
#include "arm-gen.c"
|
||||||
#endif
|
#endif
|
||||||
#ifdef TCC_TARGET_ARM64
|
#ifdef TCC_TARGET_ARM64
|
||||||
#include "arm/arm64-gen.c"
|
#include "arm64-gen.c"
|
||||||
#endif
|
#endif
|
||||||
#ifdef TCC_TARGET_C67
|
#ifdef TCC_TARGET_C67
|
||||||
#include "tms320c67/c67-gen.c"
|
#include "c67-gen.c"
|
||||||
#endif
|
#endif
|
||||||
#ifdef TCC_TARGET_X86_64
|
#ifdef TCC_TARGET_X86_64
|
||||||
#include "x86/x86_64-gen.c"
|
#include "x86_64-gen.c"
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_TCC_ASM
|
#ifdef CONFIG_TCC_ASM
|
||||||
#include "tccasm.c"
|
#include "tccasm.c"
|
||||||
#if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64
|
#if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64
|
||||||
#include "x86/i386-asm.c"
|
#include "i386-asm.c"
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#ifdef TCC_TARGET_COFF
|
#ifdef TCC_TARGET_COFF
|
421
src/Makefile
421
src/Makefile
|
@ -1,421 +0,0 @@
|
||||||
#
|
|
||||||
# Tiny C Compiler Makefile
|
|
||||||
#
|
|
||||||
|
|
||||||
TOP ?= .
|
|
||||||
include $(TOP)/../config.mak
|
|
||||||
VPATH = $(top_srcdir)
|
|
||||||
|
|
||||||
CPPFLAGS += -I$(TOP) # for config.h
|
|
||||||
|
|
||||||
ifneq (-$(findstring gcc,$(CC))-,-gcc-)
|
|
||||||
ifeq (-$(findstring clang,$(CC))-,-clang-)
|
|
||||||
# make clang accept gnuisms in libtcc1.c
|
|
||||||
CFLAGS+=-fheinous-gnu-extensions
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
CPPFLAGS_P=$(CPPFLAGS) -DCONFIG_TCC_STATIC
|
|
||||||
CFLAGS_P=$(CFLAGS) -pg -static
|
|
||||||
LIBS_P=
|
|
||||||
LDFLAGS_P=$(LDFLAGS)
|
|
||||||
|
|
||||||
ifdef CONFIG_WIN64
|
|
||||||
CONFIG_WIN32=yes
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifndef CONFIG_WIN32
|
|
||||||
LIBS=-lm
|
|
||||||
ifndef CONFIG_NOLDL
|
|
||||||
LIBS+=-ldl
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
# make libtcc as static or dynamic library?
|
|
||||||
ifdef DISABLE_STATIC
|
|
||||||
ifndef CONFIG_WIN32
|
|
||||||
LIBTCC=libtcc.so.1.0
|
|
||||||
else
|
|
||||||
LIBTCC=libtcc.dll
|
|
||||||
LIBTCC_DLL=yes
|
|
||||||
LIBTCC_EXTRA=libtcc.def libtcc.a
|
|
||||||
endif
|
|
||||||
LINK_LIBTCC=-Wl,-rpath,"$(libdir)"
|
|
||||||
ifdef DISABLE_RPATH
|
|
||||||
LINK_LIBTCC=
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
LIBTCC=libtcc.a
|
|
||||||
LINK_LIBTCC=
|
|
||||||
endif
|
|
||||||
|
|
||||||
CONFIG_$(ARCH) = yes
|
|
||||||
NATIVE_DEFINES_$(CONFIG_i386) += -DTCC_TARGET_I386
|
|
||||||
NATIVE_DEFINES_$(CONFIG_x86-64) += -DTCC_TARGET_X86_64
|
|
||||||
NATIVE_DEFINES_$(CONFIG_WIN32) += -DTCC_TARGET_PE
|
|
||||||
NATIVE_DEFINES_$(CONFIG_uClibc) += -DTCC_UCLIBC
|
|
||||||
NATIVE_DEFINES_$(CONFIG_arm) += -DTCC_TARGET_ARM
|
|
||||||
NATIVE_DEFINES_$(CONFIG_arm_eabihf) += -DTCC_ARM_EABI -DTCC_ARM_HARDFLOAT
|
|
||||||
NATIVE_DEFINES_$(CONFIG_arm_eabi) += -DTCC_ARM_EABI
|
|
||||||
NATIVE_DEFINES_$(CONFIG_arm_vfp) += -DTCC_ARM_VFP
|
|
||||||
NATIVE_DEFINES_$(CONFIG_arm64) += -DTCC_TARGET_ARM64
|
|
||||||
NATIVE_DEFINES += $(NATIVE_DEFINES_yes)
|
|
||||||
|
|
||||||
ifeq ($(TOP),.)
|
|
||||||
|
|
||||||
PROGS=tcc$(EXESUF)
|
|
||||||
I386_CROSS = i386-linux-gnu-tcc$(EXESUF)
|
|
||||||
WIN32_CROSS = i386-win-mingw32-tcc$(EXESUF)
|
|
||||||
WIN64_CROSS = x86_64-win-mingw32-tcc$(EXESUF)
|
|
||||||
WINCE_CROSS = arm-win-mingw32ce-tcc$(EXESUF)
|
|
||||||
X64_CROSS = x86_64-linux-gnu-tcc$(EXESUF)
|
|
||||||
ARM_FPA_CROSS = arm-linux-fpa-tcc$(EXESUF)
|
|
||||||
ARM_FPA_LD_CROSS = arm-linux-fpa-ld-tcc$(EXESUF)
|
|
||||||
ARM_VFP_CROSS = arm-linux-gnu-tcc$(EXESUF)
|
|
||||||
ARM_EABI_CROSS = arm-linux-gnueabi-tcc$(EXESUF)
|
|
||||||
ARM_EABIHF_CROSS = arm-linux-gnueabihf-tcc$(EXESUF)
|
|
||||||
ARM_CROSS = $(ARM_FPA_CROSS) $(ARM_FPA_LD_CROSS) $(ARM_VFP_CROSS) $(ARM_EABI_CROSS)
|
|
||||||
ARM64_CROSS = arm64-tcc$(EXESUF)
|
|
||||||
C67_CROSS = c67-tcc$(EXESUF)
|
|
||||||
|
|
||||||
# Legacy symlinks for cross compilers
|
|
||||||
$(I386_CROSS)_LINK = i386-tcc$(EXESUF)
|
|
||||||
$(WIN32_CROSS)_LINK = i386-win-tcc$(EXESUF)
|
|
||||||
$(WIN64_CROSS)_LINK = x86_64-win-tcc$(EXESUF)
|
|
||||||
$(WINCE_CROSS)_LINK = arm-win-tcc$(EXESUF)
|
|
||||||
$(X64_CROSS)_LINK = x86_64-tcc$(EXESUF)
|
|
||||||
$(ARM_FPA_CROSS)_LINK = arm-fpa-tcc$(EXESUF)
|
|
||||||
$(ARM_FPA_LD_CROSS)_LINK = arm-fpa-ld-tcc$(EXESUF)
|
|
||||||
$(ARM_VFP_CROSS)_LINK = arm-vfp-tcc$(EXESUF)
|
|
||||||
$(ARM_EABI_CROSS)_LINK = arm-eabi-tcc$(EXESUF)
|
|
||||||
|
|
||||||
ifeq ($(TARGETOS),Windows)
|
|
||||||
ifeq ($(ARCH),i386)
|
|
||||||
PROGS:=$($(WIN32_CROSS)_LINK)
|
|
||||||
$($(WIN32_CROSS)_LINK)_TCC = yes
|
|
||||||
endif
|
|
||||||
ifeq ($(ARCH),x86-64)
|
|
||||||
PROGS:=$($(WIN64_CROSS)_LINK)
|
|
||||||
$($(WIN64_CROSS)_LINK)_TCC = yes
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(TARGETOS),Linux)
|
|
||||||
ifeq ($(ARCH),i386)
|
|
||||||
PROGS:=$($(I386_CROSS)_LINK)
|
|
||||||
$($(I386_CROSS)_LINK)_TCC = yes
|
|
||||||
endif
|
|
||||||
ifeq ($(ARCH),x86-64)
|
|
||||||
PROGS:=$($(X64_CROSS)_LINK)
|
|
||||||
$($(X64_CROSS)_LINK)_TCC = yes
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
CORE_FILES = tcc.c libtcc.c tccpp.c tccgen.c tccelf.c tccasm.c tccrun.c
|
|
||||||
CORE_FILES += tcc.h config.h libtcc.h tcctok.h
|
|
||||||
I386_FILES = $(CORE_FILES) x86/i386-gen.c x86/i386-asm.c x86/i386-asm.h x86/i386-tok.h
|
|
||||||
WIN32_FILES = $(CORE_FILES) x86/i386-gen.c x86/i386-asm.c x86/i386-asm.h x86/i386-tok.h tccpe.c
|
|
||||||
WIN64_FILES = $(CORE_FILES) x86/x86_64-gen.c x86/i386-asm.c x86/x86_64-asm.h tccpe.c
|
|
||||||
WINCE_FILES = $(CORE_FILES) arm/arm-gen.c tccpe.c
|
|
||||||
X86_64_FILES = $(CORE_FILES) x86/x86_64-gen.c x86/i386-asm.c x86/x86_64-asm.h
|
|
||||||
ARM_FILES = $(CORE_FILES) arm/arm-gen.c
|
|
||||||
ARM64_FILES = $(CORE_FILES) arm/arm64-gen.c
|
|
||||||
C67_FILES = $(CORE_FILES) tms320c67/c67-gen.c tcccoff.c
|
|
||||||
|
|
||||||
ifdef CONFIG_WIN64
|
|
||||||
PROGS+=tiny_impdef$(EXESUF) tiny_libmaker$(EXESUF)
|
|
||||||
NATIVE_FILES=$(WIN64_FILES)
|
|
||||||
PROGS_CROSS=$(WIN32_CROSS) $(I386_CROSS) $(X64_CROSS) $(ARM_CROSS) $(ARM64_CROSS) $(C67_CROSS) $(WINCE_CROSS)
|
|
||||||
LIBTCC1_CROSS=lib/i386-win/libtcc1.a
|
|
||||||
LIBTCC1=libtcc1.a
|
|
||||||
else ifdef CONFIG_WIN32
|
|
||||||
PROGS+=tiny_impdef$(EXESUF) tiny_libmaker$(EXESUF)
|
|
||||||
NATIVE_FILES=$(WIN32_FILES)
|
|
||||||
PROGS_CROSS=$(WIN64_CROSS) $(I386_CROSS) $(X64_CROSS) $(ARM_CROSS) $(ARM64_CROSS) $(C67_CROSS) $(WINCE_CROSS)
|
|
||||||
LIBTCC1_CROSS=lib/x86_64-win/libtcc1.a
|
|
||||||
LIBTCC1=libtcc1.a
|
|
||||||
else ifeq ($(ARCH),i386)
|
|
||||||
NATIVE_FILES=$(I386_FILES)
|
|
||||||
PROGS_CROSS=$($(X64_CROSS)_LINK) $($(WIN32_CROSS)_LINK) $($(WIN64_CROSS)_LINK) $(ARM_CROSS) $(ARM64_CROSS) $(C67_CROSS) $(WINCE_CROSS)
|
|
||||||
LIBTCC1_CROSS=lib/i386-win/libtcc1.a lib/x86_64-win/libtcc1.a lib/i386/libtcc1.a lib/x86_64/libtcc1.a \
|
|
||||||
lib/arm64/libtcc1.a
|
|
||||||
LIBTCC1=libtcc1.a
|
|
||||||
else ifeq ($(ARCH),x86-64)
|
|
||||||
ifeq ($(TARGETOS),Darwin)
|
|
||||||
NATIVE_FILES=$(X86_64_FILES)
|
|
||||||
PROGS_CROSS=$($(I386_CROSS)_LINK) $($(WIN32_CROSS)_LINK) $($(WIN64_CROSS)_LINK) $(ARM_CROSS) $(C67_CROSS) $(WINCE_CROSS)
|
|
||||||
LIBTCC1_CROSS=lib/i386-win/libtcc1.a lib/x86_64-win/libtcc1.a lib/i386/libtcc1.a lib/x86_64/libtcc1.a
|
|
||||||
LIBTCC1=libtcc1.a
|
|
||||||
else
|
|
||||||
NATIVE_FILES=$(X86_64_FILES)
|
|
||||||
PROGS_CROSS=$($(I386_CROSS)_LINK) $($(WIN32_CROSS)_LINK) $($(WIN64_CROSS)_LINK) $(ARM_CROSS) $(ARM64_CROSS) $(C67_CROSS) $(WINCE_CROSS)
|
|
||||||
LIBTCC1_CROSS=lib/i386-win/libtcc1.a lib/x86_64-win/libtcc1.a lib/i386/libtcc1.a lib/x86_64/libtcc1.a \
|
|
||||||
lib/arm64/libtcc1.a
|
|
||||||
LIBTCC1=libtcc1.a
|
|
||||||
endif
|
|
||||||
else ifeq ($(ARCH),arm)
|
|
||||||
NATIVE_FILES=$(ARM_FILES)
|
|
||||||
PROGS_CROSS=$(I386_CROSS) $(X64_CROSS) $(WIN32_CROSS) $(WIN64_CROSS) $(ARM64_CROSS) $(C67_CROSS) $(WINCE_CROSS)
|
|
||||||
LIBTCC1=libtcc1.a
|
|
||||||
LIBTCC1_CROSS=lib/i386-win/libtcc1.a lib/x86_64-win/libtcc1.a lib/i386/libtcc1.a
|
|
||||||
else ifeq ($(ARCH),arm64)
|
|
||||||
NATIVE_FILES=$(ARM64_FILES)
|
|
||||||
PROGS_CROSS=$(I386_CROSS) $(X64_CROSS) $(WIN32_CROSS) $(WIN64_CROSS) $(ARM_CROSS) $(C67_CROSS) $(WINCE_CROSS)
|
|
||||||
LIBTCC1=libtcc1.a
|
|
||||||
LIBTCC1_CROSS=lib/i386-win/libtcc1.a lib/x86_64-win/libtcc1.a lib/i386/libtcc1.a
|
|
||||||
endif
|
|
||||||
PROGS_CROSS_LINK=$(foreach PROG_CROSS,$(PROGS_CROSS),$($(PROG_CROSS)_LINK))
|
|
||||||
|
|
||||||
ifeq ($(TARGETOS),Darwin)
|
|
||||||
PROGS+=tiny_libmaker$(EXESUF)
|
|
||||||
endif
|
|
||||||
|
|
||||||
TCCLIBS = $(LIBTCC1) $(LIBTCC) $(LIBTCC_EXTRA)
|
|
||||||
TCCDOCS = tcc.1 tcc-doc.html tcc-doc.info
|
|
||||||
|
|
||||||
ifdef CONFIG_CROSS
|
|
||||||
PROGS+=$(PROGS_CROSS)
|
|
||||||
TCCLIBS+=$(LIBTCC1_CROSS)
|
|
||||||
endif
|
|
||||||
|
|
||||||
all: $(PROGS) $(TCCLIBS) $(TCCDOCS)
|
|
||||||
|
|
||||||
# Host Tiny C Compiler
|
|
||||||
tcc$(EXESUF): tcc.o $(LIBTCC)
|
|
||||||
$(CC) -o $@ $^ $(LIBS) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) $(LINK_LIBTCC)
|
|
||||||
|
|
||||||
# Cross Tiny C Compilers
|
|
||||||
%-tcc$(EXESUF): tcc.c
|
|
||||||
$(CC) -o $@ $< -DONE_SOURCE $(if $($@_TCC),$(NATIVE_DEFINES),$(DEFINES)) $(CPPFLAGS) $(CFLAGS) $(LIBS) $(LDFLAGS)
|
|
||||||
$(if $($@_LINK),ln -sf $@ $($@_LINK))
|
|
||||||
$(if $($@_TCC),ln -sf $@ tcc$(EXESUF))
|
|
||||||
|
|
||||||
# profiling version
|
|
||||||
tcc_p$(EXESUF): $(NATIVE_FILES)
|
|
||||||
$(CC) -o $@ $< -DONE_SOURCE $(NATIVE_DEFINES) $(CPPFLAGS_P) $(CFLAGS_P) $(LIBS_P) $(LDFLAGS_P)
|
|
||||||
|
|
||||||
$(I386_CROSS) $($(I386_CROSS)_LINK): DEFINES = -DTCC_TARGET_I386
|
|
||||||
$(X64_CROSS) $($(X64_CROSS)_LINK): DEFINES = -DTCC_TARGET_X86_64
|
|
||||||
$(WIN32_CROSS) $($(WIN32_CROSS)_LINK): DEFINES = -DTCC_TARGET_I386 -DTCC_TARGET_PE \
|
|
||||||
-DCONFIG_TCCDIR="\"$(tccdir)/win32\"" \
|
|
||||||
-DCONFIG_TCC_LIBPATHS="\"{B}/lib/32;{B}/lib\""
|
|
||||||
$(WIN64_CROSS) $($(WIN64_CROSS)_LINK): DEFINES = -DTCC_TARGET_X86_64 -DTCC_TARGET_PE \
|
|
||||||
-DCONFIG_TCCDIR="\"$(tccdir)/win32\"" \
|
|
||||||
-DCONFIG_TCC_LIBPATHS="\"{B}/lib/64;{B}/lib\""
|
|
||||||
$(WINCE_CROSS): DEFINES = -DTCC_TARGET_PE
|
|
||||||
$(C67_CROSS): DEFINES = -DTCC_TARGET_C67
|
|
||||||
$(ARM_FPA_CROSS): DEFINES = -DTCC_TARGET_ARM
|
|
||||||
$(ARM_FPA_LD_CROSS)$(EXESUF): DEFINES = -DTCC_TARGET_ARM -DLDOUBLE_SIZE=12
|
|
||||||
$(ARM_VFP_CROSS): DEFINES = -DTCC_TARGET_ARM -DTCC_ARM_VFP
|
|
||||||
$(ARM_EABI_CROSS): DEFINES = -DTCC_TARGET_ARM -DTCC_ARM_EABI -DTCC_ARM_VFP
|
|
||||||
$(ARM64_CROSS): DEFINES = -DTCC_TARGET_ARM64
|
|
||||||
|
|
||||||
$(I386_CROSS) $($(I386_CROSS)_LINK): $(I386_FILES)
|
|
||||||
$(X64_CROSS) $($(X64_CROSS)_LINK): $(X86_64_FILES)
|
|
||||||
$(WIN32_CROSS) $($(WIN32_CROSS)_LINK): $(WIN32_FILES)
|
|
||||||
$(WIN64_CROSS) $($(WIN64_CROSS)_LINK): $(WIN64_FILES)
|
|
||||||
$(WINCE_CROSS) $($(WINCE_CROSS)_LINK): $(WINCE_FILES)
|
|
||||||
$(C67_CROSS) $($(C67_CROSS)_LINK): $(C67_FILES)
|
|
||||||
$(ARM_FPA_CROSS) $(ARM_FPA_LD_CROSS) $(ARM_VFP_CROSS) $(ARM_EABI_CROSS): $(ARM_FILES)
|
|
||||||
$($(ARM_FPA_CROSS)_LINK) $($(ARM_FPA_LD_CROSS)_LINK) $($(ARM_VFP_CROSS)_LINK) $($(ARM_EABI_CROSS)_LINK): $(ARM_FILES)
|
|
||||||
$(ARM64_CROSS): $(ARM64_FILES)
|
|
||||||
|
|
||||||
# libtcc generation and test
|
|
||||||
ifndef ONE_SOURCE
|
|
||||||
LIBTCC_OBJ = $(filter-out tcc.o,$(patsubst %.c,%.o,$(filter %.c,$(NATIVE_FILES))))
|
|
||||||
LIBTCC_INC = $(filter %.h,$(CORE_FILES)) $(filter-out $(CORE_FILES),$(NATIVE_FILES))
|
|
||||||
else
|
|
||||||
LIBTCC_OBJ = libtcc.o
|
|
||||||
LIBTCC_INC = $(NATIVE_FILES)
|
|
||||||
libtcc.o : NATIVE_DEFINES += -DONE_SOURCE
|
|
||||||
endif
|
|
||||||
|
|
||||||
$(LIBTCC_OBJ) tcc.o : %.o : %.c $(LIBTCC_INC)
|
|
||||||
$(CC) -o $@ -c $< $(NATIVE_DEFINES) $(CPPFLAGS) $(CFLAGS)
|
|
||||||
|
|
||||||
ifndef LIBTCC_DLL
|
|
||||||
libtcc.a: $(LIBTCC_OBJ)
|
|
||||||
$(AR) rcs $@ $^
|
|
||||||
endif
|
|
||||||
|
|
||||||
libtcc.so.1.0: $(LIBTCC_OBJ)
|
|
||||||
$(CC) -shared -Wl,-soname,$@ -o $@ $^ $(LDFLAGS)
|
|
||||||
|
|
||||||
libtcc.so.1.0: CFLAGS+=-fPIC
|
|
||||||
|
|
||||||
ifdef LIBTCC_DLL
|
|
||||||
libtcc.dll libtcc.def libtcc.a: $(LIBTCC_OBJ)
|
|
||||||
$(CC) -shared $^ -o $@ $(LDFLAGS) -Wl,--output-def,libtcc.def,--out-implib,libtcc.a
|
|
||||||
endif
|
|
||||||
|
|
||||||
# windows utilities
|
|
||||||
tiny_impdef$(EXESUF): ../win32/tools/tiny_impdef.c
|
|
||||||
$(CC) -o $@ $< $(CPPFLAGS) $(CFLAGS) $(LDFLAGS)
|
|
||||||
tiny_libmaker$(EXESUF): ../win32/tools/tiny_libmaker.c
|
|
||||||
$(CC) -o $@ $< $(CPPFLAGS) $(CFLAGS) $(LDFLAGS)
|
|
||||||
|
|
||||||
# TinyCC runtime libraries
|
|
||||||
libtcc1.a : FORCE
|
|
||||||
$(MAKE) -C ../lib native
|
|
||||||
if test ! -d $(ARCH); then mkdir $(ARCH); fi
|
|
||||||
if test ! -L $(ARCH)/$@; then ln -sf ../$@ $(ARCH)/$@; fi
|
|
||||||
lib/%/libtcc1.a : FORCE $(PROGS_CROSS)
|
|
||||||
$(MAKE) -C ../lib cross TARGET=$*
|
|
||||||
|
|
||||||
FORCE:
|
|
||||||
|
|
||||||
# install
|
|
||||||
TCC_INCLUDES = stdarg.h stddef.h stdbool.h float.h varargs.h
|
|
||||||
INSTALL=install
|
|
||||||
ifdef STRIP_BINARIES
|
|
||||||
INSTALLBIN=$(INSTALL) -s
|
|
||||||
else
|
|
||||||
INSTALLBIN=$(INSTALL)
|
|
||||||
endif
|
|
||||||
|
|
||||||
install-strip: install
|
|
||||||
strip $(foreach PROG,$(PROGS),"$(bindir)"/$(PROG))
|
|
||||||
|
|
||||||
ifndef CONFIG_WIN32
|
|
||||||
install: $(PROGS) $(TCCLIBS) $(TCCDOCS)
|
|
||||||
mkdir -p "$(bindir)"
|
|
||||||
$(INSTALLBIN) -m755 $(PROGS) "$(bindir)"
|
|
||||||
cp -P tcc$(EXESUF) "$(bindir)"
|
|
||||||
mkdir -p "$(mandir)/man1"
|
|
||||||
-$(INSTALL) -m644 tcc.1 "$(mandir)/man1"
|
|
||||||
mkdir -p "$(infodir)"
|
|
||||||
-$(INSTALL) -m644 tcc-doc.info "$(infodir)"
|
|
||||||
mkdir -p "$(tccdir)"
|
|
||||||
mkdir -p "$(tccdir)/include"
|
|
||||||
ifneq ($(LIBTCC1),)
|
|
||||||
mkdir -p "$(tccdir)/$(ARCH)"
|
|
||||||
$(INSTALL) -m644 $(LIBTCC1) "$(tccdir)/$(ARCH)"
|
|
||||||
endif
|
|
||||||
$(INSTALL) -m644 $(addprefix $(top_srcdir)/include/,$(TCC_INCLUDES)) $(top_srcdir)/tcclib.h "$(tccdir)/include"
|
|
||||||
mkdir -p "$(libdir)"
|
|
||||||
$(INSTALL) -m644 $(LIBTCC) "$(libdir)"
|
|
||||||
ifdef DISABLE_STATIC
|
|
||||||
ln -sf "$(ln_libdir)/libtcc.so.1.0" "$(libdir)/libtcc.so.1"
|
|
||||||
ln -sf "$(ln_libdir)/libtcc.so.1.0" "$(libdir)/libtcc.so"
|
|
||||||
endif
|
|
||||||
mkdir -p "$(includedir)"
|
|
||||||
$(INSTALL) -m644 $(top_srcdir)/libtcc.h "$(includedir)"
|
|
||||||
mkdir -p "$(docdir)"
|
|
||||||
-$(INSTALL) -m644 tcc-doc.html "$(docdir)"
|
|
||||||
ifdef CONFIG_CROSS
|
|
||||||
mkdir -p "$(tccdir)/win32/lib/32"
|
|
||||||
mkdir -p "$(tccdir)/win32/lib/64"
|
|
||||||
mkdir -p "$(tccdir)/i386"
|
|
||||||
mkdir -p "$(tccdir)/x86-64"
|
|
||||||
ifneq ($(HOST_OS),Darwin)
|
|
||||||
mkdir -p "$(tccdir)/arm64"
|
|
||||||
$(INSTALL) -m644 lib/arm64/libtcc1.a "$(tccdir)/arm64"
|
|
||||||
endif
|
|
||||||
$(INSTALL) -m644 lib/i386/libtcc1.a "$(tccdir)/i386"
|
|
||||||
$(INSTALL) -m644 lib/x86_64/libtcc1.a "$(tccdir)/x86-64"
|
|
||||||
$(INSTALL) -m644 $(top_srcdir)/win32/lib/*.def "$(tccdir)/win32/lib"
|
|
||||||
$(INSTALL) -m644 lib/i386-win/libtcc1.a "$(tccdir)/win32/lib/32"
|
|
||||||
$(INSTALL) -m644 lib/x86_64-win/libtcc1.a "$(tccdir)/win32/lib/64"
|
|
||||||
cp -r $(top_srcdir)/win32/include/. "$(tccdir)/win32/include"
|
|
||||||
cp -r "$(tccdir)/include" "$(tccdir)/win32"
|
|
||||||
endif
|
|
||||||
|
|
||||||
uninstall:
|
|
||||||
rm -fv $(foreach P,$(PROGS),"$(bindir)/$P")
|
|
||||||
rm -fv "$(bindir)/tcc$(EXESUF)"
|
|
||||||
rm -fv $(foreach P,$(LIBTCC1),"$(tccdir)/$P")
|
|
||||||
rm -fv $(foreach P,$(TCC_INCLUDES),"$(tccdir)/include/$P")
|
|
||||||
rm -fv "$(mandir)/man1/tcc.1" "$(infodir)/tcc-doc.info"
|
|
||||||
rm -fv "$(libdir)/$(LIBTCC)" "$(includedir)/libtcc.h"
|
|
||||||
rm -fv "$(libdir)/libtcc.so*"
|
|
||||||
rm -rv "$(tccdir)"
|
|
||||||
rm -rv "$(docdir)"
|
|
||||||
else
|
|
||||||
# on windows
|
|
||||||
install: $(PROGS) $(TCCLIBS) $(TCCDOCS)
|
|
||||||
mkdir -p "$(tccdir)"
|
|
||||||
mkdir -p "$(tccdir)/lib"
|
|
||||||
mkdir -p "$(tccdir)/include"
|
|
||||||
mkdir -p "$(tccdir)/examples"
|
|
||||||
mkdir -p "$(tccdir)/doc"
|
|
||||||
mkdir -p "$(tccdir)/libtcc"
|
|
||||||
$(INSTALLBIN) -m755 $(PROGS) "$(tccdir)"
|
|
||||||
$(INSTALLBIN) -m755 tcc.exe "$(tccdir)"
|
|
||||||
$(INSTALL) -m644 $(LIBTCC1) $(top_srcdir)/win32/lib/*.def "$(tccdir)/lib"
|
|
||||||
cp -r $(top_srcdir)/win32/include/. "$(tccdir)/include"
|
|
||||||
cp -r $(top_srcdir)/win32/examples/. "$(tccdir)/examples"
|
|
||||||
$(INSTALL) -m644 $(addprefix $(top_srcdir)/include/,$(TCC_INCLUDES)) $(top_srcdir)/tcclib.h "$(tccdir)/include"
|
|
||||||
$(INSTALL) -m644 tcc-doc.html $(top_srcdir)/win32/tcc-win32.txt "$(tccdir)/doc"
|
|
||||||
$(INSTALL) -m644 $(top_srcdir)/libtcc.h $(LIBTCC_EXTRA) "$(tccdir)/libtcc"
|
|
||||||
$(INSTALL) -m644 $(LIBTCC) "$(tccdir)"
|
|
||||||
ifdef CONFIG_CROSS
|
|
||||||
mkdir -p "$(tccdir)/lib/32"
|
|
||||||
mkdir -p "$(tccdir)/lib/64"
|
|
||||||
-$(INSTALL) -m644 lib/i386-win/libtcc1.a "$(tccdir)/lib/32"
|
|
||||||
-$(INSTALL) -m644 lib/x86_64-win/libtcc1.a "$(tccdir)/lib/64"
|
|
||||||
endif
|
|
||||||
|
|
||||||
uninstall:
|
|
||||||
rm -rfv "$(tccdir)/*"
|
|
||||||
endif
|
|
||||||
|
|
||||||
# documentation and man page
|
|
||||||
tcc-doc.html: ../docs/tcc-doc.texi
|
|
||||||
-makeinfo --no-split --html --number-sections -o $@ $<
|
|
||||||
|
|
||||||
tcc.1: ../docs/tcc-doc.texi
|
|
||||||
-$(top_srcdir)/../docs/texi2pod.pl $< tcc.pod
|
|
||||||
-pod2man --section=1 --center="Tiny C Compiler" --release=`cat $(top_srcdir)/../VERSION` tcc.pod > $@
|
|
||||||
|
|
||||||
tcc-doc.info: ../docs/tcc-doc.texi
|
|
||||||
-makeinfo $<
|
|
||||||
|
|
||||||
# in tests subdir
|
|
||||||
export LIBTCC1
|
|
||||||
|
|
||||||
%est:
|
|
||||||
$(MAKE) -C ../tests $@ 'PROGS_CROSS=$(PROGS_CROSS)'
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -vf $(PROGS) tcc_p$(EXESUF) tcc.pod *~ *.o *.a *.so* *.out *.log \
|
|
||||||
*.exe a.out tags TAGS libtcc_test$(EXESUF) tcc$(EXESUF)
|
|
||||||
-rm -r $(ARCH) arm64
|
|
||||||
ifeq ($(HOST_OS),Linux)
|
|
||||||
-rm -r ./C:
|
|
||||||
endif
|
|
||||||
-rm *-tcc$(EXESUF)
|
|
||||||
$(MAKE) -C ../tests $@
|
|
||||||
ifneq ($(LIBTCC1),)
|
|
||||||
$(MAKE) -C ../lib $@
|
|
||||||
endif
|
|
||||||
|
|
||||||
distclean: clean
|
|
||||||
rm -vf config.h config.mak config.texi tcc.1 tcc-doc.info tcc-doc.html
|
|
||||||
|
|
||||||
config.mak:
|
|
||||||
@echo "Please run ./configure."
|
|
||||||
@exit 1
|
|
||||||
|
|
||||||
tags:
|
|
||||||
ctags $(top_srcdir)/*.[ch] $(top_srcdir)/include/*.h $(top_srcdir)/lib/*.[chS]
|
|
||||||
|
|
||||||
TAGS:
|
|
||||||
ctags -e $(top_srcdir)/*.[ch] $(top_srcdir)/include/*.h $(top_srcdir)/lib/*.[chS]
|
|
||||||
|
|
||||||
# create release tarball from *current* git branch (including tcc-doc.html
|
|
||||||
# and converting two files to CRLF)
|
|
||||||
TCC-VERSION := tcc-$(shell cat $(top_srcdir)/../VERSION)
|
|
||||||
tar: tcc-doc.html
|
|
||||||
mkdir $(TCC-VERSION)
|
|
||||||
( cd $(TCC-VERSION) && git --git-dir ../.git checkout -f )
|
|
||||||
cp tcc-doc.html $(TCC-VERSION)
|
|
||||||
for f in tcc-win32.txt build-tcc.bat ; do \
|
|
||||||
cat win32/$$f | sed 's,\(.*\),\1\r,g' > $(TCC-VERSION)/win32/$$f ; \
|
|
||||||
done
|
|
||||||
tar cjf $(TCC-VERSION).tar.bz2 $(TCC-VERSION)
|
|
||||||
rm -rf $(TCC-VERSION)
|
|
||||||
git reset
|
|
||||||
|
|
||||||
.PHONY: all clean tar tags TAGS distclean install uninstall FORCE
|
|
||||||
|
|
||||||
endif # ifeq ($(TOP),.)
|
|
2162
src/arm/arm-gen.c
2162
src/arm/arm-gen.c
File diff suppressed because it is too large
Load Diff
924
src/tcccoff.c
924
src/tcccoff.c
|
@ -1,924 +0,0 @@
|
||||||
/*
|
|
||||||
* COFF file handling for TCC
|
|
||||||
*
|
|
||||||
* Copyright (c) 2003, 2004 TK
|
|
||||||
* Copyright (c) 2004 Fabrice Bellard
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "tcc.h"
|
|
||||||
|
|
||||||
#define MAXNSCNS 255 /* MAXIMUM NUMBER OF SECTIONS */
|
|
||||||
#define MAX_STR_TABLE 1000000
|
|
||||||
AOUTHDR o_filehdr; /* OPTIONAL (A.OUT) FILE HEADER */
|
|
||||||
|
|
||||||
SCNHDR section_header[MAXNSCNS];
|
|
||||||
|
|
||||||
#define MAX_FUNCS 1000
|
|
||||||
#define MAX_FUNC_NAME_LENGTH 128
|
|
||||||
|
|
||||||
int nFuncs;
|
|
||||||
char Func[MAX_FUNCS][MAX_FUNC_NAME_LENGTH];
|
|
||||||
char AssociatedFile[MAX_FUNCS][MAX_FUNC_NAME_LENGTH];
|
|
||||||
int LineNoFilePtr[MAX_FUNCS];
|
|
||||||
int EndAddress[MAX_FUNCS];
|
|
||||||
int LastLineNo[MAX_FUNCS];
|
|
||||||
int FuncEntries[MAX_FUNCS];
|
|
||||||
|
|
||||||
int OutputTheSection(Section* sect);
|
|
||||||
short int GetCoffFlags(const char* s);
|
|
||||||
void SortSymbolTable(void);
|
|
||||||
Section* FindSection(TCCState* s1, const char* sname);
|
|
||||||
|
|
||||||
int C67_main_entry_point;
|
|
||||||
|
|
||||||
int FindCoffSymbolIndex(const char* func_name);
|
|
||||||
int nb_syms;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
long tag;
|
|
||||||
long size;
|
|
||||||
long fileptr;
|
|
||||||
long nextsym;
|
|
||||||
short int dummy;
|
|
||||||
} AUXFUNC;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
long regmask;
|
|
||||||
unsigned short lineno;
|
|
||||||
unsigned short nentries;
|
|
||||||
int localframe;
|
|
||||||
int nextentry;
|
|
||||||
short int dummy;
|
|
||||||
} AUXBF;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
long dummy;
|
|
||||||
unsigned short lineno;
|
|
||||||
unsigned short dummy1;
|
|
||||||
int dummy2;
|
|
||||||
int dummy3;
|
|
||||||
unsigned short dummy4;
|
|
||||||
} AUXEF;
|
|
||||||
|
|
||||||
ST_FUNC int tcc_output_coff(TCCState* s1, FILE* f)
|
|
||||||
{
|
|
||||||
Section* tcc_sect;
|
|
||||||
SCNHDR* coff_sec;
|
|
||||||
int file_pointer;
|
|
||||||
char* Coff_str_table, *pCoff_str_table;
|
|
||||||
int CoffTextSectionNo, coff_nb_syms;
|
|
||||||
FILHDR file_hdr; /* FILE HEADER STRUCTURE */
|
|
||||||
Section* stext, *sdata, *sbss;
|
|
||||||
int i, NSectionsToOutput = 0;
|
|
||||||
|
|
||||||
Coff_str_table = pCoff_str_table = NULL;
|
|
||||||
|
|
||||||
stext = FindSection(s1, ".text");
|
|
||||||
sdata = FindSection(s1, ".data");
|
|
||||||
sbss = FindSection(s1, ".bss");
|
|
||||||
|
|
||||||
nb_syms = symtab_section->data_offset / sizeof(Elf32_Sym);
|
|
||||||
coff_nb_syms = FindCoffSymbolIndex("XXXXXXXXXX1");
|
|
||||||
|
|
||||||
file_hdr.f_magic = COFF_C67_MAGIC; /* magic number */
|
|
||||||
file_hdr.f_timdat = 0; /* time & date stamp */
|
|
||||||
file_hdr.f_opthdr = sizeof(AOUTHDR); /* sizeof(optional hdr) */
|
|
||||||
file_hdr.f_flags = 0x1143; /* flags (copied from what code composer does) */
|
|
||||||
file_hdr.f_TargetID = 0x99; /* for C6x = 0x0099 */
|
|
||||||
|
|
||||||
o_filehdr.magic = 0x0108; /* see magic.h */
|
|
||||||
o_filehdr.vstamp = 0x0190; /* version stamp */
|
|
||||||
o_filehdr.tsize =
|
|
||||||
stext->data_offset; /* text size in bytes, padded to FW bdry */
|
|
||||||
o_filehdr.dsize = sdata->data_offset; /* initialized data " " */
|
|
||||||
o_filehdr.bsize = sbss->data_offset; /* uninitialized data " " */
|
|
||||||
o_filehdr.entrypt = C67_main_entry_point; /* entry pt. */
|
|
||||||
o_filehdr.text_start = stext->sh_addr; /* base of text used for this file */
|
|
||||||
o_filehdr.data_start = sdata->sh_addr; /* base of data used for this file */
|
|
||||||
|
|
||||||
// create all the section headers
|
|
||||||
|
|
||||||
file_pointer = FILHSZ + sizeof(AOUTHDR);
|
|
||||||
|
|
||||||
CoffTextSectionNo = -1;
|
|
||||||
|
|
||||||
for (i = 1; i < s1->nb_sections; i++) {
|
|
||||||
coff_sec = §ion_header[i];
|
|
||||||
tcc_sect = s1->sections[i];
|
|
||||||
|
|
||||||
if (OutputTheSection(tcc_sect)) {
|
|
||||||
NSectionsToOutput++;
|
|
||||||
|
|
||||||
if (CoffTextSectionNo == -1 && tcc_sect == stext)
|
|
||||||
CoffTextSectionNo = NSectionsToOutput; // rem which coff sect
|
|
||||||
// number the .text sect
|
|
||||||
// is
|
|
||||||
|
|
||||||
strcpy(coff_sec->s_name, tcc_sect->name); /* section name */
|
|
||||||
|
|
||||||
coff_sec->s_paddr = tcc_sect->sh_addr; /* physical address */
|
|
||||||
coff_sec->s_vaddr = tcc_sect->sh_addr; /* virtual address */
|
|
||||||
coff_sec->s_size = tcc_sect->data_offset; /* section size */
|
|
||||||
coff_sec->s_scnptr = 0; /* file ptr to raw data for section */
|
|
||||||
coff_sec->s_relptr = 0; /* file ptr to relocation */
|
|
||||||
coff_sec->s_lnnoptr = 0; /* file ptr to line numbers */
|
|
||||||
coff_sec->s_nreloc = 0; /* number of relocation entries */
|
|
||||||
coff_sec->s_flags = GetCoffFlags(coff_sec->s_name); /* flags */
|
|
||||||
coff_sec->s_reserved = 0; /* reserved byte */
|
|
||||||
coff_sec->s_page = 0; /* memory page id */
|
|
||||||
|
|
||||||
file_pointer += sizeof(SCNHDR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
file_hdr.f_nscns = NSectionsToOutput; /* number of sections */
|
|
||||||
|
|
||||||
// now loop through and determine file pointer locations
|
|
||||||
// for the raw data
|
|
||||||
|
|
||||||
for (i = 1; i < s1->nb_sections; i++) {
|
|
||||||
coff_sec = §ion_header[i];
|
|
||||||
tcc_sect = s1->sections[i];
|
|
||||||
|
|
||||||
if (OutputTheSection(tcc_sect)) {
|
|
||||||
// put raw data
|
|
||||||
coff_sec->s_scnptr =
|
|
||||||
file_pointer; /* file ptr to raw data for section */
|
|
||||||
file_pointer += coff_sec->s_size;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// now loop through and determine file pointer locations
|
|
||||||
// for the relocation data
|
|
||||||
|
|
||||||
for (i = 1; i < s1->nb_sections; i++) {
|
|
||||||
coff_sec = §ion_header[i];
|
|
||||||
tcc_sect = s1->sections[i];
|
|
||||||
|
|
||||||
if (OutputTheSection(tcc_sect)) {
|
|
||||||
// put relocations data
|
|
||||||
if (coff_sec->s_nreloc > 0) {
|
|
||||||
coff_sec->s_relptr = file_pointer; /* file ptr to relocation */
|
|
||||||
file_pointer += coff_sec->s_nreloc * sizeof(struct reloc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// now loop through and determine file pointer locations
|
|
||||||
// for the line number data
|
|
||||||
|
|
||||||
for (i = 1; i < s1->nb_sections; i++) {
|
|
||||||
coff_sec = §ion_header[i];
|
|
||||||
tcc_sect = s1->sections[i];
|
|
||||||
|
|
||||||
coff_sec->s_nlnno = 0;
|
|
||||||
coff_sec->s_lnnoptr = 0;
|
|
||||||
|
|
||||||
if (s1->do_debug && tcc_sect == stext) {
|
|
||||||
// count how many line nos data
|
|
||||||
|
|
||||||
// also find association between source file name and function
|
|
||||||
// so we can sort the symbol table
|
|
||||||
|
|
||||||
Stab_Sym* sym, *sym_end;
|
|
||||||
char func_name[MAX_FUNC_NAME_LENGTH],
|
|
||||||
last_func_name[MAX_FUNC_NAME_LENGTH];
|
|
||||||
unsigned long func_addr, last_pc, pc;
|
|
||||||
const char* incl_files[INCLUDE_STACK_SIZE];
|
|
||||||
int incl_index, len, last_line_num;
|
|
||||||
const char* str, *p;
|
|
||||||
|
|
||||||
coff_sec->s_lnnoptr = file_pointer; /* file ptr to linno */
|
|
||||||
|
|
||||||
func_name[0] = '\0';
|
|
||||||
func_addr = 0;
|
|
||||||
incl_index = 0;
|
|
||||||
last_func_name[0] = '\0';
|
|
||||||
last_pc = 0xffffffff;
|
|
||||||
last_line_num = 1;
|
|
||||||
sym = (Stab_Sym*)stab_section->data + 1;
|
|
||||||
sym_end =
|
|
||||||
(Stab_Sym*)(stab_section->data + stab_section->data_offset);
|
|
||||||
|
|
||||||
nFuncs = 0;
|
|
||||||
while (sym < sym_end) {
|
|
||||||
switch (sym->n_type) {
|
|
||||||
/* function start or end */
|
|
||||||
case N_FUN:
|
|
||||||
if (sym->n_strx == 0) {
|
|
||||||
// end of function
|
|
||||||
|
|
||||||
coff_sec->s_nlnno++;
|
|
||||||
file_pointer += LINESZ;
|
|
||||||
|
|
||||||
pc = sym->n_value + func_addr;
|
|
||||||
func_name[0] = '\0';
|
|
||||||
func_addr = 0;
|
|
||||||
EndAddress[nFuncs] = pc;
|
|
||||||
FuncEntries[nFuncs] =
|
|
||||||
(file_pointer - LineNoFilePtr[nFuncs]) / LINESZ - 1;
|
|
||||||
LastLineNo[nFuncs++] = last_line_num + 1;
|
|
||||||
} else {
|
|
||||||
// beginning of function
|
|
||||||
|
|
||||||
LineNoFilePtr[nFuncs] = file_pointer;
|
|
||||||
coff_sec->s_nlnno++;
|
|
||||||
file_pointer += LINESZ;
|
|
||||||
|
|
||||||
str = (const char*)stabstr_section->data + sym->n_strx;
|
|
||||||
|
|
||||||
p = strchr(str, ':');
|
|
||||||
if (!p) {
|
|
||||||
pstrcpy(func_name, sizeof(func_name), str);
|
|
||||||
pstrcpy(Func[nFuncs], sizeof(func_name), str);
|
|
||||||
} else {
|
|
||||||
len = p - str;
|
|
||||||
if (len > sizeof(func_name) - 1)
|
|
||||||
len = sizeof(func_name) - 1;
|
|
||||||
memcpy(func_name, str, len);
|
|
||||||
memcpy(Func[nFuncs], str, len);
|
|
||||||
func_name[len] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
// save the file that it came in so we can sort later
|
|
||||||
pstrcpy(AssociatedFile[nFuncs], sizeof(func_name),
|
|
||||||
incl_files[incl_index - 1]);
|
|
||||||
|
|
||||||
func_addr = sym->n_value;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* line number info */
|
|
||||||
case N_SLINE:
|
|
||||||
pc = sym->n_value + func_addr;
|
|
||||||
|
|
||||||
last_pc = pc;
|
|
||||||
last_line_num = sym->n_desc;
|
|
||||||
|
|
||||||
/* XXX: slow! */
|
|
||||||
strcpy(last_func_name, func_name);
|
|
||||||
|
|
||||||
coff_sec->s_nlnno++;
|
|
||||||
file_pointer += LINESZ;
|
|
||||||
break;
|
|
||||||
/* include files */
|
|
||||||
case N_BINCL:
|
|
||||||
str = (const char*)stabstr_section->data + sym->n_strx;
|
|
||||||
add_incl:
|
|
||||||
if (incl_index < INCLUDE_STACK_SIZE) {
|
|
||||||
incl_files[incl_index++] = str;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case N_EINCL:
|
|
||||||
if (incl_index > 1)
|
|
||||||
incl_index--;
|
|
||||||
break;
|
|
||||||
case N_SO:
|
|
||||||
if (sym->n_strx == 0) {
|
|
||||||
incl_index = 0; /* end of translation unit */
|
|
||||||
} else {
|
|
||||||
str = (const char*)stabstr_section->data + sym->n_strx;
|
|
||||||
/* do not add path */
|
|
||||||
len = strlen(str);
|
|
||||||
if (len > 0 && str[len - 1] != '/')
|
|
||||||
goto add_incl;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
sym++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
file_hdr.f_symptr = file_pointer; /* file pointer to symtab */
|
|
||||||
|
|
||||||
if (s1->do_debug)
|
|
||||||
file_hdr.f_nsyms = coff_nb_syms; /* number of symtab entries */
|
|
||||||
else
|
|
||||||
file_hdr.f_nsyms = 0;
|
|
||||||
|
|
||||||
file_pointer += file_hdr.f_nsyms * SYMNMLEN;
|
|
||||||
|
|
||||||
// OK now we are all set to write the file
|
|
||||||
|
|
||||||
fwrite(&file_hdr, FILHSZ, 1, f);
|
|
||||||
fwrite(&o_filehdr, sizeof(o_filehdr), 1, f);
|
|
||||||
|
|
||||||
// write section headers
|
|
||||||
for (i = 1; i < s1->nb_sections; i++) {
|
|
||||||
coff_sec = §ion_header[i];
|
|
||||||
tcc_sect = s1->sections[i];
|
|
||||||
|
|
||||||
if (OutputTheSection(tcc_sect)) {
|
|
||||||
fwrite(coff_sec, sizeof(SCNHDR), 1, f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// write raw data
|
|
||||||
for (i = 1; i < s1->nb_sections; i++) {
|
|
||||||
coff_sec = §ion_header[i];
|
|
||||||
tcc_sect = s1->sections[i];
|
|
||||||
|
|
||||||
if (OutputTheSection(tcc_sect)) {
|
|
||||||
fwrite(tcc_sect->data, tcc_sect->data_offset, 1, f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// write relocation data
|
|
||||||
for (i = 1; i < s1->nb_sections; i++) {
|
|
||||||
coff_sec = §ion_header[i];
|
|
||||||
tcc_sect = s1->sections[i];
|
|
||||||
|
|
||||||
if (OutputTheSection(tcc_sect)) {
|
|
||||||
// put relocations data
|
|
||||||
if (coff_sec->s_nreloc > 0) {
|
|
||||||
fwrite(tcc_sect->reloc,
|
|
||||||
coff_sec->s_nreloc * sizeof(struct reloc), 1, f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// group the symbols in order of filename, func1, func2, etc
|
|
||||||
// finally global symbols
|
|
||||||
|
|
||||||
if (s1->do_debug)
|
|
||||||
SortSymbolTable();
|
|
||||||
|
|
||||||
// write line no data
|
|
||||||
|
|
||||||
for (i = 1; i < s1->nb_sections; i++) {
|
|
||||||
coff_sec = §ion_header[i];
|
|
||||||
tcc_sect = s1->sections[i];
|
|
||||||
|
|
||||||
if (s1->do_debug && tcc_sect == stext) {
|
|
||||||
// count how many line nos data
|
|
||||||
|
|
||||||
Stab_Sym* sym, *sym_end;
|
|
||||||
char func_name[128], last_func_name[128];
|
|
||||||
unsigned long func_addr, last_pc, pc;
|
|
||||||
const char* incl_files[INCLUDE_STACK_SIZE];
|
|
||||||
int incl_index, len, last_line_num;
|
|
||||||
const char* str, *p;
|
|
||||||
|
|
||||||
LINENO CoffLineNo;
|
|
||||||
|
|
||||||
func_name[0] = '\0';
|
|
||||||
func_addr = 0;
|
|
||||||
incl_index = 0;
|
|
||||||
last_func_name[0] = '\0';
|
|
||||||
last_pc = 0;
|
|
||||||
last_line_num = 1;
|
|
||||||
sym = (Stab_Sym*)stab_section->data + 1;
|
|
||||||
sym_end =
|
|
||||||
(Stab_Sym*)(stab_section->data + stab_section->data_offset);
|
|
||||||
|
|
||||||
while (sym < sym_end) {
|
|
||||||
switch (sym->n_type) {
|
|
||||||
/* function start or end */
|
|
||||||
case N_FUN:
|
|
||||||
if (sym->n_strx == 0) {
|
|
||||||
// end of function
|
|
||||||
|
|
||||||
CoffLineNo.l_addr.l_paddr = last_pc;
|
|
||||||
CoffLineNo.l_lnno = last_line_num + 1;
|
|
||||||
fwrite(&CoffLineNo, 6, 1, f);
|
|
||||||
|
|
||||||
pc = sym->n_value + func_addr;
|
|
||||||
func_name[0] = '\0';
|
|
||||||
func_addr = 0;
|
|
||||||
} else {
|
|
||||||
// beginning of function
|
|
||||||
|
|
||||||
str = (const char*)stabstr_section->data + sym->n_strx;
|
|
||||||
|
|
||||||
p = strchr(str, ':');
|
|
||||||
if (!p) {
|
|
||||||
pstrcpy(func_name, sizeof(func_name), str);
|
|
||||||
} else {
|
|
||||||
len = p - str;
|
|
||||||
if (len > sizeof(func_name) - 1)
|
|
||||||
len = sizeof(func_name) - 1;
|
|
||||||
memcpy(func_name, str, len);
|
|
||||||
func_name[len] = '\0';
|
|
||||||
}
|
|
||||||
func_addr = sym->n_value;
|
|
||||||
last_pc = func_addr;
|
|
||||||
last_line_num = -1;
|
|
||||||
|
|
||||||
// output a function begin
|
|
||||||
|
|
||||||
CoffLineNo.l_addr.l_symndx =
|
|
||||||
FindCoffSymbolIndex(func_name);
|
|
||||||
CoffLineNo.l_lnno = 0;
|
|
||||||
|
|
||||||
fwrite(&CoffLineNo, 6, 1, f);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* line number info */
|
|
||||||
case N_SLINE:
|
|
||||||
pc = sym->n_value + func_addr;
|
|
||||||
|
|
||||||
/* XXX: slow! */
|
|
||||||
strcpy(last_func_name, func_name);
|
|
||||||
|
|
||||||
// output a line reference
|
|
||||||
|
|
||||||
CoffLineNo.l_addr.l_paddr = last_pc;
|
|
||||||
|
|
||||||
if (last_line_num == -1) {
|
|
||||||
CoffLineNo.l_lnno = sym->n_desc;
|
|
||||||
} else {
|
|
||||||
CoffLineNo.l_lnno = last_line_num + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
fwrite(&CoffLineNo, 6, 1, f);
|
|
||||||
|
|
||||||
last_pc = pc;
|
|
||||||
last_line_num = sym->n_desc;
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* include files */
|
|
||||||
case N_BINCL:
|
|
||||||
str = (const char*)stabstr_section->data + sym->n_strx;
|
|
||||||
add_incl2:
|
|
||||||
if (incl_index < INCLUDE_STACK_SIZE) {
|
|
||||||
incl_files[incl_index++] = str;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case N_EINCL:
|
|
||||||
if (incl_index > 1)
|
|
||||||
incl_index--;
|
|
||||||
break;
|
|
||||||
case N_SO:
|
|
||||||
if (sym->n_strx == 0) {
|
|
||||||
incl_index = 0; /* end of translation unit */
|
|
||||||
} else {
|
|
||||||
str = (const char*)stabstr_section->data + sym->n_strx;
|
|
||||||
/* do not add path */
|
|
||||||
len = strlen(str);
|
|
||||||
if (len > 0 && str[len - 1] != '/')
|
|
||||||
goto add_incl2;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
sym++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// write symbol table
|
|
||||||
if (s1->do_debug) {
|
|
||||||
int k;
|
|
||||||
struct syment csym;
|
|
||||||
AUXFUNC auxfunc;
|
|
||||||
AUXBF auxbf;
|
|
||||||
AUXEF auxef;
|
|
||||||
int i;
|
|
||||||
Elf32_Sym* p;
|
|
||||||
const char* name;
|
|
||||||
int nstr;
|
|
||||||
int n = 0;
|
|
||||||
|
|
||||||
Coff_str_table = (char*)tcc_malloc(MAX_STR_TABLE);
|
|
||||||
pCoff_str_table = Coff_str_table;
|
|
||||||
nstr = 0;
|
|
||||||
|
|
||||||
p = (Elf32_Sym*)symtab_section->data;
|
|
||||||
|
|
||||||
for (i = 0; i < nb_syms; i++) {
|
|
||||||
|
|
||||||
name = symtab_section->link->data + p->st_name;
|
|
||||||
|
|
||||||
for (k = 0; k < 8; k++)
|
|
||||||
csym._n._n_name[k] = 0;
|
|
||||||
|
|
||||||
if (strlen(name) <= 8) {
|
|
||||||
strcpy(csym._n._n_name, name);
|
|
||||||
} else {
|
|
||||||
if (pCoff_str_table - Coff_str_table + strlen(name) >
|
|
||||||
MAX_STR_TABLE - 1)
|
|
||||||
tcc_error("String table too large");
|
|
||||||
|
|
||||||
csym._n._n_n._n_zeroes = 0;
|
|
||||||
csym._n._n_n._n_offset = pCoff_str_table - Coff_str_table + 4;
|
|
||||||
|
|
||||||
strcpy(pCoff_str_table, name);
|
|
||||||
pCoff_str_table += strlen(name) + 1; // skip over null
|
|
||||||
nstr++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (p->st_info == 4) {
|
|
||||||
// put a filename symbol
|
|
||||||
csym.n_value = 33; // ?????
|
|
||||||
csym.n_scnum = N_DEBUG;
|
|
||||||
csym.n_type = 0;
|
|
||||||
csym.n_sclass = C_FILE;
|
|
||||||
csym.n_numaux = 0;
|
|
||||||
fwrite(&csym, 18, 1, f);
|
|
||||||
n++;
|
|
||||||
|
|
||||||
} else if (p->st_info == 0x12) {
|
|
||||||
// find the function data
|
|
||||||
|
|
||||||
for (k = 0; k < nFuncs; k++) {
|
|
||||||
if (strcmp(name, Func[k]) == 0)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (k >= nFuncs) {
|
|
||||||
tcc_error("debug info can't find function: %s", name);
|
|
||||||
}
|
|
||||||
// put a Function Name
|
|
||||||
|
|
||||||
csym.n_value = p->st_value; // physical address
|
|
||||||
csym.n_scnum = CoffTextSectionNo;
|
|
||||||
csym.n_type = MKTYPE(T_INT, DT_FCN, 0, 0, 0, 0, 0);
|
|
||||||
csym.n_sclass = C_EXT;
|
|
||||||
csym.n_numaux = 1;
|
|
||||||
fwrite(&csym, 18, 1, f);
|
|
||||||
|
|
||||||
// now put aux info
|
|
||||||
|
|
||||||
auxfunc.tag = 0;
|
|
||||||
auxfunc.size = EndAddress[k] - p->st_value;
|
|
||||||
auxfunc.fileptr = LineNoFilePtr[k];
|
|
||||||
auxfunc.nextsym = n + 6; // tktk
|
|
||||||
auxfunc.dummy = 0;
|
|
||||||
fwrite(&auxfunc, 18, 1, f);
|
|
||||||
|
|
||||||
// put a .bf
|
|
||||||
|
|
||||||
strcpy(csym._n._n_name, ".bf");
|
|
||||||
csym.n_value = p->st_value; // physical address
|
|
||||||
csym.n_scnum = CoffTextSectionNo;
|
|
||||||
csym.n_type = 0;
|
|
||||||
csym.n_sclass = C_FCN;
|
|
||||||
csym.n_numaux = 1;
|
|
||||||
fwrite(&csym, 18, 1, f);
|
|
||||||
|
|
||||||
// now put aux info
|
|
||||||
|
|
||||||
auxbf.regmask = 0;
|
|
||||||
auxbf.lineno = 0;
|
|
||||||
auxbf.nentries = FuncEntries[k];
|
|
||||||
auxbf.localframe = 0;
|
|
||||||
auxbf.nextentry = n + 6;
|
|
||||||
auxbf.dummy = 0;
|
|
||||||
fwrite(&auxbf, 18, 1, f);
|
|
||||||
|
|
||||||
// put a .ef
|
|
||||||
|
|
||||||
strcpy(csym._n._n_name, ".ef");
|
|
||||||
csym.n_value = EndAddress[k]; // physical address
|
|
||||||
csym.n_scnum = CoffTextSectionNo;
|
|
||||||
csym.n_type = 0;
|
|
||||||
csym.n_sclass = C_FCN;
|
|
||||||
csym.n_numaux = 1;
|
|
||||||
fwrite(&csym, 18, 1, f);
|
|
||||||
|
|
||||||
// now put aux info
|
|
||||||
|
|
||||||
auxef.dummy = 0;
|
|
||||||
auxef.lineno = LastLineNo[k];
|
|
||||||
auxef.dummy1 = 0;
|
|
||||||
auxef.dummy2 = 0;
|
|
||||||
auxef.dummy3 = 0;
|
|
||||||
auxef.dummy4 = 0;
|
|
||||||
fwrite(&auxef, 18, 1, f);
|
|
||||||
|
|
||||||
n += 6;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
// try an put some type info
|
|
||||||
|
|
||||||
if ((p->st_other & VT_BTYPE) == VT_DOUBLE) {
|
|
||||||
csym.n_type = T_DOUBLE; // int
|
|
||||||
csym.n_sclass = C_EXT;
|
|
||||||
} else if ((p->st_other & VT_BTYPE) == VT_FLOAT) {
|
|
||||||
csym.n_type = T_FLOAT;
|
|
||||||
csym.n_sclass = C_EXT;
|
|
||||||
} else if ((p->st_other & VT_BTYPE) == VT_INT) {
|
|
||||||
csym.n_type = T_INT; // int
|
|
||||||
csym.n_sclass = C_EXT;
|
|
||||||
} else if ((p->st_other & VT_BTYPE) == VT_SHORT) {
|
|
||||||
csym.n_type = T_SHORT;
|
|
||||||
csym.n_sclass = C_EXT;
|
|
||||||
} else if ((p->st_other & VT_BTYPE) == VT_BYTE) {
|
|
||||||
csym.n_type = T_CHAR;
|
|
||||||
csym.n_sclass = C_EXT;
|
|
||||||
} else {
|
|
||||||
csym.n_type = T_INT; // just mark as a label
|
|
||||||
csym.n_sclass = C_LABEL;
|
|
||||||
}
|
|
||||||
|
|
||||||
csym.n_value = p->st_value;
|
|
||||||
csym.n_scnum = 2;
|
|
||||||
csym.n_numaux = 1;
|
|
||||||
fwrite(&csym, 18, 1, f);
|
|
||||||
|
|
||||||
auxfunc.tag = 0;
|
|
||||||
auxfunc.size = 0x20;
|
|
||||||
auxfunc.fileptr = 0;
|
|
||||||
auxfunc.nextsym = 0;
|
|
||||||
auxfunc.dummy = 0;
|
|
||||||
fwrite(&auxfunc, 18, 1, f);
|
|
||||||
n++;
|
|
||||||
n++;
|
|
||||||
}
|
|
||||||
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (s1->do_debug) {
|
|
||||||
// write string table
|
|
||||||
|
|
||||||
// first write the size
|
|
||||||
i = pCoff_str_table - Coff_str_table;
|
|
||||||
fwrite(&i, 4, 1, f);
|
|
||||||
|
|
||||||
// then write the strings
|
|
||||||
fwrite(Coff_str_table, i, 1, f);
|
|
||||||
|
|
||||||
tcc_free(Coff_str_table);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// group the symbols in order of filename, func1, func2, etc
|
|
||||||
// finally global symbols
|
|
||||||
|
|
||||||
void SortSymbolTable(void)
|
|
||||||
{
|
|
||||||
int i, j, k, n = 0;
|
|
||||||
Elf32_Sym* p, *p2, *NewTable;
|
|
||||||
char* name, *name2;
|
|
||||||
|
|
||||||
NewTable = (Elf32_Sym*)tcc_malloc(nb_syms * sizeof(Elf32_Sym));
|
|
||||||
|
|
||||||
p = (Elf32_Sym*)symtab_section->data;
|
|
||||||
|
|
||||||
// find a file symbol, copy it over
|
|
||||||
// then scan the whole symbol list and copy any function
|
|
||||||
// symbols that match the file association
|
|
||||||
|
|
||||||
for (i = 0; i < nb_syms; i++) {
|
|
||||||
if (p->st_info == 4) {
|
|
||||||
name = (char*)symtab_section->link->data + p->st_name;
|
|
||||||
|
|
||||||
// this is a file symbol, copy it over
|
|
||||||
|
|
||||||
NewTable[n++] = *p;
|
|
||||||
|
|
||||||
p2 = (Elf32_Sym*)symtab_section->data;
|
|
||||||
|
|
||||||
for (j = 0; j < nb_syms; j++) {
|
|
||||||
if (p2->st_info == 0x12) {
|
|
||||||
// this is a func symbol
|
|
||||||
|
|
||||||
name2 = (char*)symtab_section->link->data + p2->st_name;
|
|
||||||
|
|
||||||
// find the function data index
|
|
||||||
|
|
||||||
for (k = 0; k < nFuncs; k++) {
|
|
||||||
if (strcmp(name2, Func[k]) == 0)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (k >= nFuncs) {
|
|
||||||
tcc_error("debug (sort) info can't find function: %s",
|
|
||||||
name2);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strcmp(AssociatedFile[k], name) == 0) {
|
|
||||||
// yes they match copy it over
|
|
||||||
|
|
||||||
NewTable[n++] = *p2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
p2++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// now all the filename and func symbols should have been copied over
|
|
||||||
// copy all the rest over (all except file and funcs)
|
|
||||||
|
|
||||||
p = (Elf32_Sym*)symtab_section->data;
|
|
||||||
for (i = 0; i < nb_syms; i++) {
|
|
||||||
if (p->st_info != 4 && p->st_info != 0x12) {
|
|
||||||
NewTable[n++] = *p;
|
|
||||||
}
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (n != nb_syms)
|
|
||||||
tcc_error("Internal Compiler error, debug info");
|
|
||||||
|
|
||||||
// copy it all back
|
|
||||||
|
|
||||||
p = (Elf32_Sym*)symtab_section->data;
|
|
||||||
for (i = 0; i < nb_syms; i++) {
|
|
||||||
*p++ = NewTable[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
tcc_free(NewTable);
|
|
||||||
}
|
|
||||||
|
|
||||||
int FindCoffSymbolIndex(const char* func_name)
|
|
||||||
{
|
|
||||||
int i, n = 0;
|
|
||||||
Elf32_Sym* p;
|
|
||||||
char* name;
|
|
||||||
|
|
||||||
p = (Elf32_Sym*)symtab_section->data;
|
|
||||||
|
|
||||||
for (i = 0; i < nb_syms; i++) {
|
|
||||||
|
|
||||||
name = (char*)symtab_section->link->data + p->st_name;
|
|
||||||
|
|
||||||
if (p->st_info == 4) {
|
|
||||||
// put a filename symbol
|
|
||||||
n++;
|
|
||||||
} else if (p->st_info == 0x12) {
|
|
||||||
|
|
||||||
if (strcmp(func_name, name) == 0)
|
|
||||||
return n;
|
|
||||||
|
|
||||||
n += 6;
|
|
||||||
|
|
||||||
// put a Function Name
|
|
||||||
|
|
||||||
// now put aux info
|
|
||||||
|
|
||||||
// put a .bf
|
|
||||||
|
|
||||||
// now put aux info
|
|
||||||
|
|
||||||
// put a .ef
|
|
||||||
|
|
||||||
// now put aux info
|
|
||||||
|
|
||||||
} else {
|
|
||||||
n += 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return n; // total number of symbols
|
|
||||||
}
|
|
||||||
|
|
||||||
int OutputTheSection(Section* sect)
|
|
||||||
{
|
|
||||||
const char* s = sect->name;
|
|
||||||
|
|
||||||
if (!strcmp(s, ".text"))
|
|
||||||
return 1;
|
|
||||||
else if (!strcmp(s, ".data"))
|
|
||||||
return 1;
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
short int GetCoffFlags(const char* s)
|
|
||||||
{
|
|
||||||
if (!strcmp(s, ".text"))
|
|
||||||
return STYP_TEXT | STYP_DATA | STYP_ALIGN | 0x400;
|
|
||||||
else if (!strcmp(s, ".data"))
|
|
||||||
return STYP_DATA;
|
|
||||||
else if (!strcmp(s, ".bss"))
|
|
||||||
return STYP_BSS;
|
|
||||||
else if (!strcmp(s, ".stack"))
|
|
||||||
return STYP_BSS | STYP_ALIGN | 0x200;
|
|
||||||
else if (!strcmp(s, ".cinit"))
|
|
||||||
return STYP_COPY | STYP_DATA | STYP_ALIGN | 0x200;
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
Section* FindSection(TCCState* s1, const char* sname)
|
|
||||||
{
|
|
||||||
Section* s;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 1; i < s1->nb_sections; i++) {
|
|
||||||
s = s1->sections[i];
|
|
||||||
|
|
||||||
if (!strcmp(sname, s->name))
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
tcc_error("could not find section %s", sname);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ST_FUNC int tcc_load_coff(TCCState* s1, int fd)
|
|
||||||
{
|
|
||||||
// tktk TokenSym *ts;
|
|
||||||
|
|
||||||
FILE* f;
|
|
||||||
unsigned int str_size;
|
|
||||||
char* Coff_str_table, *name;
|
|
||||||
int i, k;
|
|
||||||
struct syment csym;
|
|
||||||
char name2[9];
|
|
||||||
FILHDR file_hdr; /* FILE HEADER STRUCTURE */
|
|
||||||
|
|
||||||
f = fdopen(fd, "rb");
|
|
||||||
if (!f) {
|
|
||||||
tcc_error("Unable to open .out file for input");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fread(&file_hdr, FILHSZ, 1, f) != 1)
|
|
||||||
tcc_error("error reading .out file for input");
|
|
||||||
|
|
||||||
if (fread(&o_filehdr, sizeof(o_filehdr), 1, f) != 1)
|
|
||||||
tcc_error("error reading .out file for input");
|
|
||||||
|
|
||||||
// first read the string table
|
|
||||||
|
|
||||||
if (fseek(f, file_hdr.f_symptr + file_hdr.f_nsyms * SYMESZ, SEEK_SET))
|
|
||||||
tcc_error("error reading .out file for input");
|
|
||||||
|
|
||||||
if (fread(&str_size, sizeof(int), 1, f) != 1)
|
|
||||||
tcc_error("error reading .out file for input");
|
|
||||||
|
|
||||||
Coff_str_table = (char*)tcc_malloc(str_size);
|
|
||||||
|
|
||||||
if (fread(Coff_str_table, str_size - 4, 1, f) != 1)
|
|
||||||
tcc_error("error reading .out file for input");
|
|
||||||
|
|
||||||
// read/process all the symbols
|
|
||||||
|
|
||||||
// seek back to symbols
|
|
||||||
|
|
||||||
if (fseek(f, file_hdr.f_symptr, SEEK_SET))
|
|
||||||
tcc_error("error reading .out file for input");
|
|
||||||
|
|
||||||
for (i = 0; i < file_hdr.f_nsyms; i++) {
|
|
||||||
if (fread(&csym, SYMESZ, 1, f) != 1)
|
|
||||||
tcc_error("error reading .out file for input");
|
|
||||||
|
|
||||||
if (csym._n._n_n._n_zeroes == 0) {
|
|
||||||
name = Coff_str_table + csym._n._n_n._n_offset - 4;
|
|
||||||
} else {
|
|
||||||
name = csym._n._n_name;
|
|
||||||
|
|
||||||
if (name[7] != 0) {
|
|
||||||
for (k = 0; k < 8; k++)
|
|
||||||
name2[k] = name[k];
|
|
||||||
|
|
||||||
name2[8] = 0;
|
|
||||||
|
|
||||||
name = name2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// if (strcmp("_DAC_Buffer",name)==0) // tktk
|
|
||||||
// name[0]=0;
|
|
||||||
|
|
||||||
if (((csym.n_type & 0x30) == 0x20 && csym.n_sclass == 0x2) ||
|
|
||||||
((csym.n_type & 0x30) == 0x30 && csym.n_sclass == 0x2) ||
|
|
||||||
(csym.n_type == 0x4 && csym.n_sclass == 0x2) ||
|
|
||||||
(csym.n_type == 0x8 && csym.n_sclass == 0x2) || // structures
|
|
||||||
(csym.n_type == 0x18 &&
|
|
||||||
csym.n_sclass == 0x2) || // pointer to structure
|
|
||||||
(csym.n_type == 0x7 && csym.n_sclass == 0x2) || // doubles
|
|
||||||
(csym.n_type == 0x6 && csym.n_sclass == 0x2)) // floats
|
|
||||||
{
|
|
||||||
// strip off any leading underscore (except for other main routine)
|
|
||||||
|
|
||||||
if (name[0] == '_' && strcmp(name, "_main") != 0)
|
|
||||||
name++;
|
|
||||||
|
|
||||||
tcc_add_symbol(s1, name, (void*)(uintptr_t)csym.n_value);
|
|
||||||
}
|
|
||||||
// skip any aux records
|
|
||||||
|
|
||||||
if (csym.n_numaux == 1) {
|
|
||||||
if (fread(&csym, SYMESZ, 1, f) != 1)
|
|
||||||
tcc_error("error reading .out file for input");
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -293,20 +293,20 @@
|
||||||
|
|
||||||
#define TARGET_DEFS_ONLY
|
#define TARGET_DEFS_ONLY
|
||||||
#ifdef TCC_TARGET_I386
|
#ifdef TCC_TARGET_I386
|
||||||
# include "x86/i386-gen.c"
|
# include "i386-gen.c"
|
||||||
#endif
|
#endif
|
||||||
#ifdef TCC_TARGET_X86_64
|
#ifdef TCC_TARGET_X86_64
|
||||||
# include "x86/x86_64-gen.c"
|
# include "x86_64-gen.c"
|
||||||
#endif
|
#endif
|
||||||
#ifdef TCC_TARGET_ARM
|
#ifdef TCC_TARGET_ARM
|
||||||
# include "arm/arm-gen.c"
|
# include "arm-gen.c"
|
||||||
#endif
|
#endif
|
||||||
#ifdef TCC_TARGET_ARM64
|
#ifdef TCC_TARGET_ARM64
|
||||||
# include "arm/arm64-gen.c"
|
# include "arm64-gen.c"
|
||||||
#endif
|
#endif
|
||||||
#ifdef TCC_TARGET_C67
|
#ifdef TCC_TARGET_C67
|
||||||
# include "coff.h"
|
# include "coff.h"
|
||||||
# include "tms320c67c67-gen.c"
|
# include "c67-gen.c"
|
||||||
#endif
|
#endif
|
||||||
#undef TARGET_DEFS_ONLY
|
#undef TARGET_DEFS_ONLY
|
||||||
|
|
|
@ -0,0 +1,948 @@
|
||||||
|
/*
|
||||||
|
* COFF file handling for TCC
|
||||||
|
*
|
||||||
|
* Copyright (c) 2003, 2004 TK
|
||||||
|
* Copyright (c) 2004 Fabrice Bellard
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "tcc.h"
|
||||||
|
|
||||||
|
#define MAXNSCNS 255 /* MAXIMUM NUMBER OF SECTIONS */
|
||||||
|
#define MAX_STR_TABLE 1000000
|
||||||
|
AOUTHDR o_filehdr; /* OPTIONAL (A.OUT) FILE HEADER */
|
||||||
|
|
||||||
|
SCNHDR section_header[MAXNSCNS];
|
||||||
|
|
||||||
|
#define MAX_FUNCS 1000
|
||||||
|
#define MAX_FUNC_NAME_LENGTH 128
|
||||||
|
|
||||||
|
int nFuncs;
|
||||||
|
char Func[MAX_FUNCS][MAX_FUNC_NAME_LENGTH];
|
||||||
|
char AssociatedFile[MAX_FUNCS][MAX_FUNC_NAME_LENGTH];
|
||||||
|
int LineNoFilePtr[MAX_FUNCS];
|
||||||
|
int EndAddress[MAX_FUNCS];
|
||||||
|
int LastLineNo[MAX_FUNCS];
|
||||||
|
int FuncEntries[MAX_FUNCS];
|
||||||
|
|
||||||
|
int OutputTheSection(Section * sect);
|
||||||
|
short int GetCoffFlags(const char *s);
|
||||||
|
void SortSymbolTable(void);
|
||||||
|
Section *FindSection(TCCState * s1, const char *sname);
|
||||||
|
|
||||||
|
int C67_main_entry_point;
|
||||||
|
|
||||||
|
int FindCoffSymbolIndex(const char *func_name);
|
||||||
|
int nb_syms;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
long tag;
|
||||||
|
long size;
|
||||||
|
long fileptr;
|
||||||
|
long nextsym;
|
||||||
|
short int dummy;
|
||||||
|
} AUXFUNC;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
long regmask;
|
||||||
|
unsigned short lineno;
|
||||||
|
unsigned short nentries;
|
||||||
|
int localframe;
|
||||||
|
int nextentry;
|
||||||
|
short int dummy;
|
||||||
|
} AUXBF;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
long dummy;
|
||||||
|
unsigned short lineno;
|
||||||
|
unsigned short dummy1;
|
||||||
|
int dummy2;
|
||||||
|
int dummy3;
|
||||||
|
unsigned short dummy4;
|
||||||
|
} AUXEF;
|
||||||
|
|
||||||
|
ST_FUNC int tcc_output_coff(TCCState *s1, FILE *f)
|
||||||
|
{
|
||||||
|
Section *tcc_sect;
|
||||||
|
SCNHDR *coff_sec;
|
||||||
|
int file_pointer;
|
||||||
|
char *Coff_str_table, *pCoff_str_table;
|
||||||
|
int CoffTextSectionNo, coff_nb_syms;
|
||||||
|
FILHDR file_hdr; /* FILE HEADER STRUCTURE */
|
||||||
|
Section *stext, *sdata, *sbss;
|
||||||
|
int i, NSectionsToOutput = 0;
|
||||||
|
|
||||||
|
Coff_str_table = pCoff_str_table = NULL;
|
||||||
|
|
||||||
|
stext = FindSection(s1, ".text");
|
||||||
|
sdata = FindSection(s1, ".data");
|
||||||
|
sbss = FindSection(s1, ".bss");
|
||||||
|
|
||||||
|
nb_syms = symtab_section->data_offset / sizeof(Elf32_Sym);
|
||||||
|
coff_nb_syms = FindCoffSymbolIndex("XXXXXXXXXX1");
|
||||||
|
|
||||||
|
file_hdr.f_magic = COFF_C67_MAGIC; /* magic number */
|
||||||
|
file_hdr.f_timdat = 0; /* time & date stamp */
|
||||||
|
file_hdr.f_opthdr = sizeof(AOUTHDR); /* sizeof(optional hdr) */
|
||||||
|
file_hdr.f_flags = 0x1143; /* flags (copied from what code composer does) */
|
||||||
|
file_hdr.f_TargetID = 0x99; /* for C6x = 0x0099 */
|
||||||
|
|
||||||
|
o_filehdr.magic = 0x0108; /* see magic.h */
|
||||||
|
o_filehdr.vstamp = 0x0190; /* version stamp */
|
||||||
|
o_filehdr.tsize = stext->data_offset; /* text size in bytes, padded to FW bdry */
|
||||||
|
o_filehdr.dsize = sdata->data_offset; /* initialized data " " */
|
||||||
|
o_filehdr.bsize = sbss->data_offset; /* uninitialized data " " */
|
||||||
|
o_filehdr.entrypt = C67_main_entry_point; /* entry pt. */
|
||||||
|
o_filehdr.text_start = stext->sh_addr; /* base of text used for this file */
|
||||||
|
o_filehdr.data_start = sdata->sh_addr; /* base of data used for this file */
|
||||||
|
|
||||||
|
|
||||||
|
// create all the section headers
|
||||||
|
|
||||||
|
file_pointer = FILHSZ + sizeof(AOUTHDR);
|
||||||
|
|
||||||
|
CoffTextSectionNo = -1;
|
||||||
|
|
||||||
|
for (i = 1; i < s1->nb_sections; i++) {
|
||||||
|
coff_sec = §ion_header[i];
|
||||||
|
tcc_sect = s1->sections[i];
|
||||||
|
|
||||||
|
if (OutputTheSection(tcc_sect)) {
|
||||||
|
NSectionsToOutput++;
|
||||||
|
|
||||||
|
if (CoffTextSectionNo == -1 && tcc_sect == stext)
|
||||||
|
CoffTextSectionNo = NSectionsToOutput; // rem which coff sect number the .text sect is
|
||||||
|
|
||||||
|
strcpy(coff_sec->s_name, tcc_sect->name); /* section name */
|
||||||
|
|
||||||
|
coff_sec->s_paddr = tcc_sect->sh_addr; /* physical address */
|
||||||
|
coff_sec->s_vaddr = tcc_sect->sh_addr; /* virtual address */
|
||||||
|
coff_sec->s_size = tcc_sect->data_offset; /* section size */
|
||||||
|
coff_sec->s_scnptr = 0; /* file ptr to raw data for section */
|
||||||
|
coff_sec->s_relptr = 0; /* file ptr to relocation */
|
||||||
|
coff_sec->s_lnnoptr = 0; /* file ptr to line numbers */
|
||||||
|
coff_sec->s_nreloc = 0; /* number of relocation entries */
|
||||||
|
coff_sec->s_flags = GetCoffFlags(coff_sec->s_name); /* flags */
|
||||||
|
coff_sec->s_reserved = 0; /* reserved byte */
|
||||||
|
coff_sec->s_page = 0; /* memory page id */
|
||||||
|
|
||||||
|
file_pointer += sizeof(SCNHDR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
file_hdr.f_nscns = NSectionsToOutput; /* number of sections */
|
||||||
|
|
||||||
|
// now loop through and determine file pointer locations
|
||||||
|
// for the raw data
|
||||||
|
|
||||||
|
|
||||||
|
for (i = 1; i < s1->nb_sections; i++) {
|
||||||
|
coff_sec = §ion_header[i];
|
||||||
|
tcc_sect = s1->sections[i];
|
||||||
|
|
||||||
|
if (OutputTheSection(tcc_sect)) {
|
||||||
|
// put raw data
|
||||||
|
coff_sec->s_scnptr = file_pointer; /* file ptr to raw data for section */
|
||||||
|
file_pointer += coff_sec->s_size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// now loop through and determine file pointer locations
|
||||||
|
// for the relocation data
|
||||||
|
|
||||||
|
for (i = 1; i < s1->nb_sections; i++) {
|
||||||
|
coff_sec = §ion_header[i];
|
||||||
|
tcc_sect = s1->sections[i];
|
||||||
|
|
||||||
|
if (OutputTheSection(tcc_sect)) {
|
||||||
|
// put relocations data
|
||||||
|
if (coff_sec->s_nreloc > 0) {
|
||||||
|
coff_sec->s_relptr = file_pointer; /* file ptr to relocation */
|
||||||
|
file_pointer += coff_sec->s_nreloc * sizeof(struct reloc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// now loop through and determine file pointer locations
|
||||||
|
// for the line number data
|
||||||
|
|
||||||
|
for (i = 1; i < s1->nb_sections; i++) {
|
||||||
|
coff_sec = §ion_header[i];
|
||||||
|
tcc_sect = s1->sections[i];
|
||||||
|
|
||||||
|
coff_sec->s_nlnno = 0;
|
||||||
|
coff_sec->s_lnnoptr = 0;
|
||||||
|
|
||||||
|
if (s1->do_debug && tcc_sect == stext) {
|
||||||
|
// count how many line nos data
|
||||||
|
|
||||||
|
// also find association between source file name and function
|
||||||
|
// so we can sort the symbol table
|
||||||
|
|
||||||
|
|
||||||
|
Stab_Sym *sym, *sym_end;
|
||||||
|
char func_name[MAX_FUNC_NAME_LENGTH],
|
||||||
|
last_func_name[MAX_FUNC_NAME_LENGTH];
|
||||||
|
unsigned long func_addr, last_pc, pc;
|
||||||
|
const char *incl_files[INCLUDE_STACK_SIZE];
|
||||||
|
int incl_index, len, last_line_num;
|
||||||
|
const char *str, *p;
|
||||||
|
|
||||||
|
coff_sec->s_lnnoptr = file_pointer; /* file ptr to linno */
|
||||||
|
|
||||||
|
|
||||||
|
func_name[0] = '\0';
|
||||||
|
func_addr = 0;
|
||||||
|
incl_index = 0;
|
||||||
|
last_func_name[0] = '\0';
|
||||||
|
last_pc = 0xffffffff;
|
||||||
|
last_line_num = 1;
|
||||||
|
sym = (Stab_Sym *) stab_section->data + 1;
|
||||||
|
sym_end =
|
||||||
|
(Stab_Sym *) (stab_section->data +
|
||||||
|
stab_section->data_offset);
|
||||||
|
|
||||||
|
nFuncs = 0;
|
||||||
|
while (sym < sym_end) {
|
||||||
|
switch (sym->n_type) {
|
||||||
|
/* function start or end */
|
||||||
|
case N_FUN:
|
||||||
|
if (sym->n_strx == 0) {
|
||||||
|
// end of function
|
||||||
|
|
||||||
|
coff_sec->s_nlnno++;
|
||||||
|
file_pointer += LINESZ;
|
||||||
|
|
||||||
|
pc = sym->n_value + func_addr;
|
||||||
|
func_name[0] = '\0';
|
||||||
|
func_addr = 0;
|
||||||
|
EndAddress[nFuncs] = pc;
|
||||||
|
FuncEntries[nFuncs] =
|
||||||
|
(file_pointer -
|
||||||
|
LineNoFilePtr[nFuncs]) / LINESZ - 1;
|
||||||
|
LastLineNo[nFuncs++] = last_line_num + 1;
|
||||||
|
} else {
|
||||||
|
// beginning of function
|
||||||
|
|
||||||
|
LineNoFilePtr[nFuncs] = file_pointer;
|
||||||
|
coff_sec->s_nlnno++;
|
||||||
|
file_pointer += LINESZ;
|
||||||
|
|
||||||
|
str =
|
||||||
|
(const char *) stabstr_section->data +
|
||||||
|
sym->n_strx;
|
||||||
|
|
||||||
|
p = strchr(str, ':');
|
||||||
|
if (!p) {
|
||||||
|
pstrcpy(func_name, sizeof(func_name), str);
|
||||||
|
pstrcpy(Func[nFuncs], sizeof(func_name), str);
|
||||||
|
} else {
|
||||||
|
len = p - str;
|
||||||
|
if (len > sizeof(func_name) - 1)
|
||||||
|
len = sizeof(func_name) - 1;
|
||||||
|
memcpy(func_name, str, len);
|
||||||
|
memcpy(Func[nFuncs], str, len);
|
||||||
|
func_name[len] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
// save the file that it came in so we can sort later
|
||||||
|
pstrcpy(AssociatedFile[nFuncs], sizeof(func_name),
|
||||||
|
incl_files[incl_index - 1]);
|
||||||
|
|
||||||
|
func_addr = sym->n_value;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* line number info */
|
||||||
|
case N_SLINE:
|
||||||
|
pc = sym->n_value + func_addr;
|
||||||
|
|
||||||
|
last_pc = pc;
|
||||||
|
last_line_num = sym->n_desc;
|
||||||
|
|
||||||
|
/* XXX: slow! */
|
||||||
|
strcpy(last_func_name, func_name);
|
||||||
|
|
||||||
|
coff_sec->s_nlnno++;
|
||||||
|
file_pointer += LINESZ;
|
||||||
|
break;
|
||||||
|
/* include files */
|
||||||
|
case N_BINCL:
|
||||||
|
str =
|
||||||
|
(const char *) stabstr_section->data + sym->n_strx;
|
||||||
|
add_incl:
|
||||||
|
if (incl_index < INCLUDE_STACK_SIZE) {
|
||||||
|
incl_files[incl_index++] = str;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case N_EINCL:
|
||||||
|
if (incl_index > 1)
|
||||||
|
incl_index--;
|
||||||
|
break;
|
||||||
|
case N_SO:
|
||||||
|
if (sym->n_strx == 0) {
|
||||||
|
incl_index = 0; /* end of translation unit */
|
||||||
|
} else {
|
||||||
|
str =
|
||||||
|
(const char *) stabstr_section->data +
|
||||||
|
sym->n_strx;
|
||||||
|
/* do not add path */
|
||||||
|
len = strlen(str);
|
||||||
|
if (len > 0 && str[len - 1] != '/')
|
||||||
|
goto add_incl;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sym++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
file_hdr.f_symptr = file_pointer; /* file pointer to symtab */
|
||||||
|
|
||||||
|
if (s1->do_debug)
|
||||||
|
file_hdr.f_nsyms = coff_nb_syms; /* number of symtab entries */
|
||||||
|
else
|
||||||
|
file_hdr.f_nsyms = 0;
|
||||||
|
|
||||||
|
file_pointer += file_hdr.f_nsyms * SYMNMLEN;
|
||||||
|
|
||||||
|
// OK now we are all set to write the file
|
||||||
|
|
||||||
|
|
||||||
|
fwrite(&file_hdr, FILHSZ, 1, f);
|
||||||
|
fwrite(&o_filehdr, sizeof(o_filehdr), 1, f);
|
||||||
|
|
||||||
|
// write section headers
|
||||||
|
for (i = 1; i < s1->nb_sections; i++) {
|
||||||
|
coff_sec = §ion_header[i];
|
||||||
|
tcc_sect = s1->sections[i];
|
||||||
|
|
||||||
|
if (OutputTheSection(tcc_sect)) {
|
||||||
|
fwrite(coff_sec, sizeof(SCNHDR), 1, f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// write raw data
|
||||||
|
for (i = 1; i < s1->nb_sections; i++) {
|
||||||
|
coff_sec = §ion_header[i];
|
||||||
|
tcc_sect = s1->sections[i];
|
||||||
|
|
||||||
|
if (OutputTheSection(tcc_sect)) {
|
||||||
|
fwrite(tcc_sect->data, tcc_sect->data_offset, 1, f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// write relocation data
|
||||||
|
for (i = 1; i < s1->nb_sections; i++) {
|
||||||
|
coff_sec = §ion_header[i];
|
||||||
|
tcc_sect = s1->sections[i];
|
||||||
|
|
||||||
|
if (OutputTheSection(tcc_sect)) {
|
||||||
|
// put relocations data
|
||||||
|
if (coff_sec->s_nreloc > 0) {
|
||||||
|
fwrite(tcc_sect->reloc,
|
||||||
|
coff_sec->s_nreloc * sizeof(struct reloc), 1, f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// group the symbols in order of filename, func1, func2, etc
|
||||||
|
// finally global symbols
|
||||||
|
|
||||||
|
if (s1->do_debug)
|
||||||
|
SortSymbolTable();
|
||||||
|
|
||||||
|
// write line no data
|
||||||
|
|
||||||
|
for (i = 1; i < s1->nb_sections; i++) {
|
||||||
|
coff_sec = §ion_header[i];
|
||||||
|
tcc_sect = s1->sections[i];
|
||||||
|
|
||||||
|
if (s1->do_debug && tcc_sect == stext) {
|
||||||
|
// count how many line nos data
|
||||||
|
|
||||||
|
|
||||||
|
Stab_Sym *sym, *sym_end;
|
||||||
|
char func_name[128], last_func_name[128];
|
||||||
|
unsigned long func_addr, last_pc, pc;
|
||||||
|
const char *incl_files[INCLUDE_STACK_SIZE];
|
||||||
|
int incl_index, len, last_line_num;
|
||||||
|
const char *str, *p;
|
||||||
|
|
||||||
|
LINENO CoffLineNo;
|
||||||
|
|
||||||
|
func_name[0] = '\0';
|
||||||
|
func_addr = 0;
|
||||||
|
incl_index = 0;
|
||||||
|
last_func_name[0] = '\0';
|
||||||
|
last_pc = 0;
|
||||||
|
last_line_num = 1;
|
||||||
|
sym = (Stab_Sym *) stab_section->data + 1;
|
||||||
|
sym_end =
|
||||||
|
(Stab_Sym *) (stab_section->data +
|
||||||
|
stab_section->data_offset);
|
||||||
|
|
||||||
|
while (sym < sym_end) {
|
||||||
|
switch (sym->n_type) {
|
||||||
|
/* function start or end */
|
||||||
|
case N_FUN:
|
||||||
|
if (sym->n_strx == 0) {
|
||||||
|
// end of function
|
||||||
|
|
||||||
|
CoffLineNo.l_addr.l_paddr = last_pc;
|
||||||
|
CoffLineNo.l_lnno = last_line_num + 1;
|
||||||
|
fwrite(&CoffLineNo, 6, 1, f);
|
||||||
|
|
||||||
|
pc = sym->n_value + func_addr;
|
||||||
|
func_name[0] = '\0';
|
||||||
|
func_addr = 0;
|
||||||
|
} else {
|
||||||
|
// beginning of function
|
||||||
|
|
||||||
|
str =
|
||||||
|
(const char *) stabstr_section->data +
|
||||||
|
sym->n_strx;
|
||||||
|
|
||||||
|
|
||||||
|
p = strchr(str, ':');
|
||||||
|
if (!p) {
|
||||||
|
pstrcpy(func_name, sizeof(func_name), str);
|
||||||
|
} else {
|
||||||
|
len = p - str;
|
||||||
|
if (len > sizeof(func_name) - 1)
|
||||||
|
len = sizeof(func_name) - 1;
|
||||||
|
memcpy(func_name, str, len);
|
||||||
|
func_name[len] = '\0';
|
||||||
|
}
|
||||||
|
func_addr = sym->n_value;
|
||||||
|
last_pc = func_addr;
|
||||||
|
last_line_num = -1;
|
||||||
|
|
||||||
|
// output a function begin
|
||||||
|
|
||||||
|
CoffLineNo.l_addr.l_symndx =
|
||||||
|
FindCoffSymbolIndex(func_name);
|
||||||
|
CoffLineNo.l_lnno = 0;
|
||||||
|
|
||||||
|
fwrite(&CoffLineNo, 6, 1, f);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* line number info */
|
||||||
|
case N_SLINE:
|
||||||
|
pc = sym->n_value + func_addr;
|
||||||
|
|
||||||
|
|
||||||
|
/* XXX: slow! */
|
||||||
|
strcpy(last_func_name, func_name);
|
||||||
|
|
||||||
|
// output a line reference
|
||||||
|
|
||||||
|
CoffLineNo.l_addr.l_paddr = last_pc;
|
||||||
|
|
||||||
|
if (last_line_num == -1) {
|
||||||
|
CoffLineNo.l_lnno = sym->n_desc;
|
||||||
|
} else {
|
||||||
|
CoffLineNo.l_lnno = last_line_num + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
fwrite(&CoffLineNo, 6, 1, f);
|
||||||
|
|
||||||
|
last_pc = pc;
|
||||||
|
last_line_num = sym->n_desc;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* include files */
|
||||||
|
case N_BINCL:
|
||||||
|
str =
|
||||||
|
(const char *) stabstr_section->data + sym->n_strx;
|
||||||
|
add_incl2:
|
||||||
|
if (incl_index < INCLUDE_STACK_SIZE) {
|
||||||
|
incl_files[incl_index++] = str;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case N_EINCL:
|
||||||
|
if (incl_index > 1)
|
||||||
|
incl_index--;
|
||||||
|
break;
|
||||||
|
case N_SO:
|
||||||
|
if (sym->n_strx == 0) {
|
||||||
|
incl_index = 0; /* end of translation unit */
|
||||||
|
} else {
|
||||||
|
str =
|
||||||
|
(const char *) stabstr_section->data +
|
||||||
|
sym->n_strx;
|
||||||
|
/* do not add path */
|
||||||
|
len = strlen(str);
|
||||||
|
if (len > 0 && str[len - 1] != '/')
|
||||||
|
goto add_incl2;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sym++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// write symbol table
|
||||||
|
if (s1->do_debug) {
|
||||||
|
int k;
|
||||||
|
struct syment csym;
|
||||||
|
AUXFUNC auxfunc;
|
||||||
|
AUXBF auxbf;
|
||||||
|
AUXEF auxef;
|
||||||
|
int i;
|
||||||
|
Elf32_Sym *p;
|
||||||
|
const char *name;
|
||||||
|
int nstr;
|
||||||
|
int n = 0;
|
||||||
|
|
||||||
|
Coff_str_table = (char *) tcc_malloc(MAX_STR_TABLE);
|
||||||
|
pCoff_str_table = Coff_str_table;
|
||||||
|
nstr = 0;
|
||||||
|
|
||||||
|
p = (Elf32_Sym *) symtab_section->data;
|
||||||
|
|
||||||
|
|
||||||
|
for (i = 0; i < nb_syms; i++) {
|
||||||
|
|
||||||
|
name = symtab_section->link->data + p->st_name;
|
||||||
|
|
||||||
|
for (k = 0; k < 8; k++)
|
||||||
|
csym._n._n_name[k] = 0;
|
||||||
|
|
||||||
|
if (strlen(name) <= 8) {
|
||||||
|
strcpy(csym._n._n_name, name);
|
||||||
|
} else {
|
||||||
|
if (pCoff_str_table - Coff_str_table + strlen(name) >
|
||||||
|
MAX_STR_TABLE - 1)
|
||||||
|
tcc_error("String table too large");
|
||||||
|
|
||||||
|
csym._n._n_n._n_zeroes = 0;
|
||||||
|
csym._n._n_n._n_offset =
|
||||||
|
pCoff_str_table - Coff_str_table + 4;
|
||||||
|
|
||||||
|
strcpy(pCoff_str_table, name);
|
||||||
|
pCoff_str_table += strlen(name) + 1; // skip over null
|
||||||
|
nstr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p->st_info == 4) {
|
||||||
|
// put a filename symbol
|
||||||
|
csym.n_value = 33; // ?????
|
||||||
|
csym.n_scnum = N_DEBUG;
|
||||||
|
csym.n_type = 0;
|
||||||
|
csym.n_sclass = C_FILE;
|
||||||
|
csym.n_numaux = 0;
|
||||||
|
fwrite(&csym, 18, 1, f);
|
||||||
|
n++;
|
||||||
|
|
||||||
|
} else if (p->st_info == 0x12) {
|
||||||
|
// find the function data
|
||||||
|
|
||||||
|
for (k = 0; k < nFuncs; k++) {
|
||||||
|
if (strcmp(name, Func[k]) == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (k >= nFuncs) {
|
||||||
|
tcc_error("debug info can't find function: %s", name);
|
||||||
|
}
|
||||||
|
// put a Function Name
|
||||||
|
|
||||||
|
csym.n_value = p->st_value; // physical address
|
||||||
|
csym.n_scnum = CoffTextSectionNo;
|
||||||
|
csym.n_type = MKTYPE(T_INT, DT_FCN, 0, 0, 0, 0, 0);
|
||||||
|
csym.n_sclass = C_EXT;
|
||||||
|
csym.n_numaux = 1;
|
||||||
|
fwrite(&csym, 18, 1, f);
|
||||||
|
|
||||||
|
// now put aux info
|
||||||
|
|
||||||
|
auxfunc.tag = 0;
|
||||||
|
auxfunc.size = EndAddress[k] - p->st_value;
|
||||||
|
auxfunc.fileptr = LineNoFilePtr[k];
|
||||||
|
auxfunc.nextsym = n + 6; // tktk
|
||||||
|
auxfunc.dummy = 0;
|
||||||
|
fwrite(&auxfunc, 18, 1, f);
|
||||||
|
|
||||||
|
// put a .bf
|
||||||
|
|
||||||
|
strcpy(csym._n._n_name, ".bf");
|
||||||
|
csym.n_value = p->st_value; // physical address
|
||||||
|
csym.n_scnum = CoffTextSectionNo;
|
||||||
|
csym.n_type = 0;
|
||||||
|
csym.n_sclass = C_FCN;
|
||||||
|
csym.n_numaux = 1;
|
||||||
|
fwrite(&csym, 18, 1, f);
|
||||||
|
|
||||||
|
// now put aux info
|
||||||
|
|
||||||
|
auxbf.regmask = 0;
|
||||||
|
auxbf.lineno = 0;
|
||||||
|
auxbf.nentries = FuncEntries[k];
|
||||||
|
auxbf.localframe = 0;
|
||||||
|
auxbf.nextentry = n + 6;
|
||||||
|
auxbf.dummy = 0;
|
||||||
|
fwrite(&auxbf, 18, 1, f);
|
||||||
|
|
||||||
|
// put a .ef
|
||||||
|
|
||||||
|
strcpy(csym._n._n_name, ".ef");
|
||||||
|
csym.n_value = EndAddress[k]; // physical address
|
||||||
|
csym.n_scnum = CoffTextSectionNo;
|
||||||
|
csym.n_type = 0;
|
||||||
|
csym.n_sclass = C_FCN;
|
||||||
|
csym.n_numaux = 1;
|
||||||
|
fwrite(&csym, 18, 1, f);
|
||||||
|
|
||||||
|
// now put aux info
|
||||||
|
|
||||||
|
auxef.dummy = 0;
|
||||||
|
auxef.lineno = LastLineNo[k];
|
||||||
|
auxef.dummy1 = 0;
|
||||||
|
auxef.dummy2 = 0;
|
||||||
|
auxef.dummy3 = 0;
|
||||||
|
auxef.dummy4 = 0;
|
||||||
|
fwrite(&auxef, 18, 1, f);
|
||||||
|
|
||||||
|
n += 6;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// try an put some type info
|
||||||
|
|
||||||
|
if ((p->st_other & VT_BTYPE) == VT_DOUBLE) {
|
||||||
|
csym.n_type = T_DOUBLE; // int
|
||||||
|
csym.n_sclass = C_EXT;
|
||||||
|
} else if ((p->st_other & VT_BTYPE) == VT_FLOAT) {
|
||||||
|
csym.n_type = T_FLOAT;
|
||||||
|
csym.n_sclass = C_EXT;
|
||||||
|
} else if ((p->st_other & VT_BTYPE) == VT_INT) {
|
||||||
|
csym.n_type = T_INT; // int
|
||||||
|
csym.n_sclass = C_EXT;
|
||||||
|
} else if ((p->st_other & VT_BTYPE) == VT_SHORT) {
|
||||||
|
csym.n_type = T_SHORT;
|
||||||
|
csym.n_sclass = C_EXT;
|
||||||
|
} else if ((p->st_other & VT_BTYPE) == VT_BYTE) {
|
||||||
|
csym.n_type = T_CHAR;
|
||||||
|
csym.n_sclass = C_EXT;
|
||||||
|
} else {
|
||||||
|
csym.n_type = T_INT; // just mark as a label
|
||||||
|
csym.n_sclass = C_LABEL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
csym.n_value = p->st_value;
|
||||||
|
csym.n_scnum = 2;
|
||||||
|
csym.n_numaux = 1;
|
||||||
|
fwrite(&csym, 18, 1, f);
|
||||||
|
|
||||||
|
auxfunc.tag = 0;
|
||||||
|
auxfunc.size = 0x20;
|
||||||
|
auxfunc.fileptr = 0;
|
||||||
|
auxfunc.nextsym = 0;
|
||||||
|
auxfunc.dummy = 0;
|
||||||
|
fwrite(&auxfunc, 18, 1, f);
|
||||||
|
n++;
|
||||||
|
n++;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s1->do_debug) {
|
||||||
|
// write string table
|
||||||
|
|
||||||
|
// first write the size
|
||||||
|
i = pCoff_str_table - Coff_str_table;
|
||||||
|
fwrite(&i, 4, 1, f);
|
||||||
|
|
||||||
|
// then write the strings
|
||||||
|
fwrite(Coff_str_table, i, 1, f);
|
||||||
|
|
||||||
|
tcc_free(Coff_str_table);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// group the symbols in order of filename, func1, func2, etc
|
||||||
|
// finally global symbols
|
||||||
|
|
||||||
|
void SortSymbolTable(void)
|
||||||
|
{
|
||||||
|
int i, j, k, n = 0;
|
||||||
|
Elf32_Sym *p, *p2, *NewTable;
|
||||||
|
char *name, *name2;
|
||||||
|
|
||||||
|
NewTable = (Elf32_Sym *) tcc_malloc(nb_syms * sizeof(Elf32_Sym));
|
||||||
|
|
||||||
|
p = (Elf32_Sym *) symtab_section->data;
|
||||||
|
|
||||||
|
|
||||||
|
// find a file symbol, copy it over
|
||||||
|
// then scan the whole symbol list and copy any function
|
||||||
|
// symbols that match the file association
|
||||||
|
|
||||||
|
for (i = 0; i < nb_syms; i++) {
|
||||||
|
if (p->st_info == 4) {
|
||||||
|
name = (char *) symtab_section->link->data + p->st_name;
|
||||||
|
|
||||||
|
// this is a file symbol, copy it over
|
||||||
|
|
||||||
|
NewTable[n++] = *p;
|
||||||
|
|
||||||
|
p2 = (Elf32_Sym *) symtab_section->data;
|
||||||
|
|
||||||
|
for (j = 0; j < nb_syms; j++) {
|
||||||
|
if (p2->st_info == 0x12) {
|
||||||
|
// this is a func symbol
|
||||||
|
|
||||||
|
name2 =
|
||||||
|
(char *) symtab_section->link->data + p2->st_name;
|
||||||
|
|
||||||
|
// find the function data index
|
||||||
|
|
||||||
|
for (k = 0; k < nFuncs; k++) {
|
||||||
|
if (strcmp(name2, Func[k]) == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (k >= nFuncs) {
|
||||||
|
tcc_error("debug (sort) info can't find function: %s", name2);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(AssociatedFile[k], name) == 0) {
|
||||||
|
// yes they match copy it over
|
||||||
|
|
||||||
|
NewTable[n++] = *p2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
p2++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// now all the filename and func symbols should have been copied over
|
||||||
|
// copy all the rest over (all except file and funcs)
|
||||||
|
|
||||||
|
p = (Elf32_Sym *) symtab_section->data;
|
||||||
|
for (i = 0; i < nb_syms; i++) {
|
||||||
|
if (p->st_info != 4 && p->st_info != 0x12) {
|
||||||
|
NewTable[n++] = *p;
|
||||||
|
}
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n != nb_syms)
|
||||||
|
tcc_error("Internal Compiler error, debug info");
|
||||||
|
|
||||||
|
// copy it all back
|
||||||
|
|
||||||
|
p = (Elf32_Sym *) symtab_section->data;
|
||||||
|
for (i = 0; i < nb_syms; i++) {
|
||||||
|
*p++ = NewTable[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
tcc_free(NewTable);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int FindCoffSymbolIndex(const char *func_name)
|
||||||
|
{
|
||||||
|
int i, n = 0;
|
||||||
|
Elf32_Sym *p;
|
||||||
|
char *name;
|
||||||
|
|
||||||
|
p = (Elf32_Sym *) symtab_section->data;
|
||||||
|
|
||||||
|
for (i = 0; i < nb_syms; i++) {
|
||||||
|
|
||||||
|
name = (char *) symtab_section->link->data + p->st_name;
|
||||||
|
|
||||||
|
if (p->st_info == 4) {
|
||||||
|
// put a filename symbol
|
||||||
|
n++;
|
||||||
|
} else if (p->st_info == 0x12) {
|
||||||
|
|
||||||
|
if (strcmp(func_name, name) == 0)
|
||||||
|
return n;
|
||||||
|
|
||||||
|
n += 6;
|
||||||
|
|
||||||
|
// put a Function Name
|
||||||
|
|
||||||
|
// now put aux info
|
||||||
|
|
||||||
|
// put a .bf
|
||||||
|
|
||||||
|
// now put aux info
|
||||||
|
|
||||||
|
// put a .ef
|
||||||
|
|
||||||
|
// now put aux info
|
||||||
|
|
||||||
|
} else {
|
||||||
|
n += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return n; // total number of symbols
|
||||||
|
}
|
||||||
|
|
||||||
|
int OutputTheSection(Section * sect)
|
||||||
|
{
|
||||||
|
const char *s = sect->name;
|
||||||
|
|
||||||
|
if (!strcmp(s, ".text"))
|
||||||
|
return 1;
|
||||||
|
else if (!strcmp(s, ".data"))
|
||||||
|
return 1;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
short int GetCoffFlags(const char *s)
|
||||||
|
{
|
||||||
|
if (!strcmp(s, ".text"))
|
||||||
|
return STYP_TEXT | STYP_DATA | STYP_ALIGN | 0x400;
|
||||||
|
else if (!strcmp(s, ".data"))
|
||||||
|
return STYP_DATA;
|
||||||
|
else if (!strcmp(s, ".bss"))
|
||||||
|
return STYP_BSS;
|
||||||
|
else if (!strcmp(s, ".stack"))
|
||||||
|
return STYP_BSS | STYP_ALIGN | 0x200;
|
||||||
|
else if (!strcmp(s, ".cinit"))
|
||||||
|
return STYP_COPY | STYP_DATA | STYP_ALIGN | 0x200;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Section *FindSection(TCCState * s1, const char *sname)
|
||||||
|
{
|
||||||
|
Section *s;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 1; i < s1->nb_sections; i++) {
|
||||||
|
s = s1->sections[i];
|
||||||
|
|
||||||
|
if (!strcmp(sname, s->name))
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
tcc_error("could not find section %s", sname);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ST_FUNC int tcc_load_coff(TCCState * s1, int fd)
|
||||||
|
{
|
||||||
|
// tktk TokenSym *ts;
|
||||||
|
|
||||||
|
FILE *f;
|
||||||
|
unsigned int str_size;
|
||||||
|
char *Coff_str_table, *name;
|
||||||
|
int i, k;
|
||||||
|
struct syment csym;
|
||||||
|
char name2[9];
|
||||||
|
FILHDR file_hdr; /* FILE HEADER STRUCTURE */
|
||||||
|
|
||||||
|
f = fdopen(fd, "rb");
|
||||||
|
if (!f) {
|
||||||
|
tcc_error("Unable to open .out file for input");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fread(&file_hdr, FILHSZ, 1, f) != 1)
|
||||||
|
tcc_error("error reading .out file for input");
|
||||||
|
|
||||||
|
if (fread(&o_filehdr, sizeof(o_filehdr), 1, f) != 1)
|
||||||
|
tcc_error("error reading .out file for input");
|
||||||
|
|
||||||
|
// first read the string table
|
||||||
|
|
||||||
|
if (fseek(f, file_hdr.f_symptr + file_hdr.f_nsyms * SYMESZ, SEEK_SET))
|
||||||
|
tcc_error("error reading .out file for input");
|
||||||
|
|
||||||
|
if (fread(&str_size, sizeof(int), 1, f) != 1)
|
||||||
|
tcc_error("error reading .out file for input");
|
||||||
|
|
||||||
|
|
||||||
|
Coff_str_table = (char *) tcc_malloc(str_size);
|
||||||
|
|
||||||
|
if (fread(Coff_str_table, str_size - 4, 1, f) != 1)
|
||||||
|
tcc_error("error reading .out file for input");
|
||||||
|
|
||||||
|
// read/process all the symbols
|
||||||
|
|
||||||
|
// seek back to symbols
|
||||||
|
|
||||||
|
if (fseek(f, file_hdr.f_symptr, SEEK_SET))
|
||||||
|
tcc_error("error reading .out file for input");
|
||||||
|
|
||||||
|
for (i = 0; i < file_hdr.f_nsyms; i++) {
|
||||||
|
if (fread(&csym, SYMESZ, 1, f) != 1)
|
||||||
|
tcc_error("error reading .out file for input");
|
||||||
|
|
||||||
|
if (csym._n._n_n._n_zeroes == 0) {
|
||||||
|
name = Coff_str_table + csym._n._n_n._n_offset - 4;
|
||||||
|
} else {
|
||||||
|
name = csym._n._n_name;
|
||||||
|
|
||||||
|
if (name[7] != 0) {
|
||||||
|
for (k = 0; k < 8; k++)
|
||||||
|
name2[k] = name[k];
|
||||||
|
|
||||||
|
name2[8] = 0;
|
||||||
|
|
||||||
|
name = name2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// if (strcmp("_DAC_Buffer",name)==0) // tktk
|
||||||
|
// name[0]=0;
|
||||||
|
|
||||||
|
if (((csym.n_type & 0x30) == 0x20 && csym.n_sclass == 0x2) || ((csym.n_type & 0x30) == 0x30 && csym.n_sclass == 0x2) || (csym.n_type == 0x4 && csym.n_sclass == 0x2) || (csym.n_type == 0x8 && csym.n_sclass == 0x2) || // structures
|
||||||
|
(csym.n_type == 0x18 && csym.n_sclass == 0x2) || // pointer to structure
|
||||||
|
(csym.n_type == 0x7 && csym.n_sclass == 0x2) || // doubles
|
||||||
|
(csym.n_type == 0x6 && csym.n_sclass == 0x2)) // floats
|
||||||
|
{
|
||||||
|
// strip off any leading underscore (except for other main routine)
|
||||||
|
|
||||||
|
if (name[0] == '_' && strcmp(name, "_main") != 0)
|
||||||
|
name++;
|
||||||
|
|
||||||
|
tcc_add_symbol(s1, name, (void*)(uintptr_t)csym.n_value);
|
||||||
|
}
|
||||||
|
// skip any aux records
|
||||||
|
|
||||||
|
if (csym.n_numaux == 1) {
|
||||||
|
if (fread(&csym, SYMESZ, 1, f) != 1)
|
||||||
|
tcc_error("error reading .out file for input");
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -1335,7 +1335,7 @@ ST_FUNC void build_got_entries(TCCState *s1)
|
||||||
ofs = put_got_entry(s1, reloc_type, sym->st_size,
|
ofs = put_got_entry(s1, reloc_type, sym->st_size,
|
||||||
sym->st_info, sym_index);
|
sym->st_info, sym_index);
|
||||||
#ifdef DEBUG_RELOC
|
#ifdef DEBUG_RELOC
|
||||||
printf("maybegot: %s, %d, %d --> ofs=0x%x\n",
|
printf ("maybegot: %s, %d, %d --> ofs=0x%x\n",
|
||||||
(char *) symtab_section->link->data + sym->st_name,
|
(char *) symtab_section->link->data + sym->st_name,
|
||||||
type, sym->st_shndx, ofs);
|
type, sym->st_shndx, ofs);
|
||||||
#endif
|
#endif
|
||||||
|
@ -1549,7 +1549,7 @@ static int tcc_add_support(TCCState *s1, const char *filename)
|
||||||
"i386"
|
"i386"
|
||||||
#endif
|
#endif
|
||||||
#ifdef TCC_TARGET_X86_64
|
#ifdef TCC_TARGET_X86_64
|
||||||
"x86_64"
|
"x86-64"
|
||||||
#endif
|
#endif
|
||||||
#ifdef TCC_TARGET_ARM
|
#ifdef TCC_TARGET_ARM
|
||||||
"arm"
|
"arm"
|
||||||
|
@ -1560,7 +1560,7 @@ static int tcc_add_support(TCCState *s1, const char *filename)
|
||||||
#ifdef TCC_TARGET_C67
|
#ifdef TCC_TARGET_C67
|
||||||
"C67"
|
"C67"
|
||||||
#endif
|
#endif
|
||||||
, filename);
|
,filename);
|
||||||
|
|
||||||
return tcc_add_file(s1, buf, TCC_FILETYPE_BINARY);
|
return tcc_add_file(s1, buf, TCC_FILETYPE_BINARY);
|
||||||
}
|
}
|
|
@ -4783,7 +4783,8 @@ static void label_or_decl(int l)
|
||||||
int last_tok;
|
int last_tok;
|
||||||
|
|
||||||
/* fast test first */
|
/* fast test first */
|
||||||
if (tok >= TOK_UIDENT) {
|
if (tok >= TOK_UIDENT)
|
||||||
|
{
|
||||||
/* no need to save tokc because tok is an identifier */
|
/* no need to save tokc because tok is an identifier */
|
||||||
last_tok = tok;
|
last_tok = tok;
|
||||||
next();
|
next();
|
|
@ -1636,7 +1636,7 @@ quit:
|
||||||
|
|
||||||
/* ------------------------------------------------------------- */
|
/* ------------------------------------------------------------- */
|
||||||
#define TINY_IMPDEF_GET_EXPORT_NAMES_ONLY
|
#define TINY_IMPDEF_GET_EXPORT_NAMES_ONLY
|
||||||
#include "../win32/tools/tiny_impdef.c"
|
#include "win32/tools/tiny_impdef.c"
|
||||||
|
|
||||||
static int pe_load_dll(TCCState *s1, const char *dllname, int fd)
|
static int pe_load_dll(TCCState *s1, const char *dllname, int fd)
|
||||||
{
|
{
|
|
@ -697,7 +697,7 @@ static int rt_get_caller_pc(addr_t *paddr, CONTEXT *uc, int level)
|
||||||
fp = uc->Ebp;
|
fp = uc->Ebp;
|
||||||
#endif
|
#endif
|
||||||
if (level > 0) {
|
if (level > 0) {
|
||||||
for(i = 1; i < level; i++) {
|
for(i=1;i<level;i++) {
|
||||||
/* XXX: check address validity with program info */
|
/* XXX: check address validity with program info */
|
||||||
if (fp <= 0x1000 || fp >= 0xc0000000)
|
if (fp <= 0x1000 || fp >= 0xc0000000)
|
||||||
return -1;
|
return -1;
|
|
@ -331,5 +331,5 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64
|
#if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64
|
||||||
#include "x86/i386-tok.h"
|
#include "i386-tok.h"
|
||||||
#endif
|
#endif
|
|
@ -2,7 +2,7 @@
|
||||||
# Tiny C Compiler Makefile - tests
|
# Tiny C Compiler Makefile - tests
|
||||||
#
|
#
|
||||||
|
|
||||||
TOP = ../src
|
TOP = ..
|
||||||
include $(TOP)/Makefile
|
include $(TOP)/Makefile
|
||||||
SRCDIR = $(top_srcdir)/tests
|
SRCDIR = $(top_srcdir)/tests
|
||||||
VPATH = $(SRCDIR) $(top_srcdir)
|
VPATH = $(SRCDIR) $(top_srcdir)
|
||||||
|
@ -60,11 +60,11 @@ ifeq ($(TARGETOS),Darwin)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# run local version of tcc with local libraries and includes
|
# run local version of tcc with local libraries and includes
|
||||||
TCCFLAGS = -B$(TOP)/../lib -I$(TOP) -I$(top_srcdir) -I$(top_srcdir)/../include -L$(TOP)
|
TCCFLAGS = -B$(TOP) -I$(TOP) -I$(top_srcdir) -I$(top_srcdir)/include -L$(TOP)
|
||||||
ifdef CONFIG_WIN32
|
ifdef CONFIG_WIN32
|
||||||
TCCFLAGS = -B$(top_srcdir)/win32 -I$(top_srcdir) -I$(top_srcdir)/../include -L$(TOP)
|
TCCFLAGS = -B$(top_srcdir)/win32 -I$(top_srcdir) -I$(top_srcdir)/include -L$(TOP)
|
||||||
endif
|
endif
|
||||||
XTCCFLAGS = -B$(TOP)/../lib -B$(top_srcdir)/win32 -I$(TOP) -I$(top_srcdir) -I$(top_srcdir)/../include
|
XTCCFLAGS = -B$(TOP) -B$(top_srcdir)/win32 -I$(TOP) -I$(top_srcdir) -I$(top_srcdir)/include
|
||||||
|
|
||||||
TCC = $(TOP)/tcc $(TCCFLAGS)
|
TCC = $(TOP)/tcc $(TCCFLAGS)
|
||||||
RUN_TCC = $(NATIVE_DEFINES) -DONE_SOURCE -run $(top_srcdir)/tcc.c $(TCCFLAGS)
|
RUN_TCC = $(NATIVE_DEFINES) -DONE_SOURCE -run $(top_srcdir)/tcc.c $(TCCFLAGS)
|
||||||
|
@ -73,7 +73,7 @@ DISAS = objdump -d
|
||||||
|
|
||||||
# libtcc test
|
# libtcc test
|
||||||
ifdef LIBTCC1
|
ifdef LIBTCC1
|
||||||
LIBTCC1:=$(TOP)/lib/$(LIBTCC1)
|
LIBTCC1:=$(TOP)/$(LIBTCC1)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
all test : $(TESTS)
|
all test : $(TESTS)
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
# credits: 01..13.c from the pcc cpp-tests suite
|
# credits: 01..13.c from the pcc cpp-tests suite
|
||||||
#
|
#
|
||||||
|
|
||||||
TCC = ../../src/tcc
|
TCC = ../../tcc
|
||||||
TESTS = $(patsubst %.c,%.test,$(wildcard *.c))
|
TESTS = $(patsubst %.c,%.test,$(wildcard *.c))
|
||||||
|
|
||||||
all test : $(TESTS)
|
all test : $(TESTS)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
TOP = ../../src
|
TOP = ../..
|
||||||
include $(TOP)/Makefile
|
include $(TOP)/Makefile
|
||||||
|
|
||||||
# clear CFLAGS and LDFLAGS
|
# clear CFLAGS and LDFLAGS
|
||||||
|
@ -6,9 +6,9 @@ CFLAGS :=
|
||||||
LDFLAGS :=
|
LDFLAGS :=
|
||||||
|
|
||||||
ifdef CONFIG_WIN32
|
ifdef CONFIG_WIN32
|
||||||
TCCFLAGS = -B$(top_srcdir)/win32 -I$(top_srcdir)/../include -L$(TOP)
|
TCCFLAGS = -B$(top_srcdir)/win32 -I$(top_srcdir)/include -L$(TOP)
|
||||||
else
|
else
|
||||||
TCCFLAGS = -B$(TOP)/../lib -I$(top_srcdir)/../include -lm
|
TCCFLAGS = -B$(TOP) -I$(top_srcdir)/include -lm
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(TARGETOS),Darwin)
|
ifeq ($(TARGETOS),Darwin)
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "../../src/elf.h"
|
#include "../../elf.h"
|
||||||
|
|
||||||
#ifdef TCC_TARGET_X86_64
|
#ifdef TCC_TARGET_X86_64
|
||||||
# define ELFCLASSW ELFCLASS64
|
# define ELFCLASSW ELFCLASS64
|
||||||
|
|
|
@ -136,7 +136,7 @@ enum {
|
||||||
/******************************************************/
|
/******************************************************/
|
||||||
#else /* ! TARGET_DEFS_ONLY */
|
#else /* ! TARGET_DEFS_ONLY */
|
||||||
/******************************************************/
|
/******************************************************/
|
||||||
#include "../tcc.h"
|
#include "tcc.h"
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
ST_DATA const int reg_classes[NB_REGS] = {
|
ST_DATA const int reg_classes[NB_REGS] = {
|
||||||
|
@ -481,10 +481,11 @@ void load(int r, SValue *sv)
|
||||||
oad(0xb8 + REG_VALUE(r), 0); /* mov $0, r */
|
oad(0xb8 + REG_VALUE(r), 0); /* mov $0, r */
|
||||||
else
|
else
|
||||||
oad(0xb8 + REG_VALUE(r), 1); /* mov $1, r */
|
oad(0xb8 + REG_VALUE(r), 1); /* mov $1, r */
|
||||||
if (fc & 0x100) {
|
if (fc & 0x100)
|
||||||
|
{
|
||||||
/* This was a float compare. If the parity bit is
|
/* This was a float compare. If the parity bit is
|
||||||
* set the result was unordered, meaning false for everything
|
set the result was unordered, meaning false for everything
|
||||||
* except TOK_NE, and true for TOK_NE. */
|
except TOK_NE, and true for TOK_NE. */
|
||||||
fc &= ~0x100;
|
fc &= ~0x100;
|
||||||
o(0x037a + (REX_BASE(r) << 8));
|
o(0x037a + (REX_BASE(r) << 8));
|
||||||
}
|
}
|
||||||
|
@ -1817,7 +1818,8 @@ int gtst(int inv, int t)
|
||||||
vtop->c.i &= ~0x100;
|
vtop->c.i &= ~0x100;
|
||||||
if (!inv == (vtop->c.i != TOK_NE))
|
if (!inv == (vtop->c.i != TOK_NE))
|
||||||
o(0x067a); /* jp +6 */
|
o(0x067a); /* jp +6 */
|
||||||
else {
|
else
|
||||||
|
{
|
||||||
g(0x0f);
|
g(0x0f);
|
||||||
t = psym(0x8a, t); /* jp t */
|
t = psym(0x8a, t); /* jp t */
|
||||||
}
|
}
|
Loading…
Reference in New Issue