1
0
mirror of https://git.FreeBSD.org/ports.git synced 2024-11-24 00:45:52 +00:00

lang/tcc: Update version 0.9.25 => 0.9.26 and assign maintainer

PR:		191154
Submitted by:	Carlos Jacobo Puga Medina
Verified by:	Redports x4 (i386-only)
This commit is contained in:
John Marino 2014-06-19 20:13:42 +00:00
parent 706d15c991
commit b8d66f2d08
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=358463
10 changed files with 34 additions and 1055 deletions

View File

@ -1,29 +1,28 @@
# $FreeBSD$
PORTNAME= tcc
PORTVERSION= 0.9.25
PORTREVISION= 2
PORTVERSION= 0.9.26
CATEGORIES= lang
MASTER_SITES= SAVANNAH/tinycc
MAINTAINER= ports@FreeBSD.org
MAINTAINER= cjpugmed@gmail.com
COMMENT= Tiny C Compiler
LICENSE= LGPL21
ONLY_FOR_ARCHS= i386
#ONLY_FOR_ARCHS= i386 amd64 arm mips powerpc
CONFLICTS= TenDRA-*
CONFLICTS= TenDRA-[0-9]*
USES= gmake perl5
USE_BZIP2= yes
USES= tar:bzip2 gmake perl5
USE_PERL5= build
HAS_CONFIGURE= yes
CONFIGURE_ARGS= --prefix="${PREFIX}" --cc="${CC}"
MAKE_ARGS= CONFIG_NOLDL=1
OPTIONS_DEFINE= DOCS
OPTIONS_DEFINE= DOCS EXAMPLES
PORTDOCS= COPYING Changelog README TODO VERSION
.include <bsd.port.options.mk>
@ -37,8 +36,19 @@ PLIST_SUB+= I386="@comment "
CFLAGS+= -fheinous-gnu-extensions
.endif
.if ! ${PORT_OPTIONS:MDOCS}
MAKE_ARGS+= NOPORTDOCS=1
post-install:
${STRIP_CMD} ${STAGEDIR}${PREFIX}/bin/tcc
${INSTALL_MAN} ${WRKSRC}/tcc.1 ${STAGEDIR}${MAN1PREFIX}/man/man1
${INSTALL_DATA} ${WRKSRC}/lib/i386/bcheck.o ${STAGEDIR}${PREFIX}/lib/tcc/
.if ${PORT_OPTIONS:MDOCS}
${MKDIR} ${STAGEDIR}${DOCSDIR}
${INSTALL_DATA} ${PORTDOCS:S,^,${WRKSRC}/,} ${STAGEDIR}${DOCSDIR}
.endif
.if ${PORT_OPTIONS:MEXAMPLES}
${MKDIR} ${STAGEDIR}${EXAMPLESDIR}
${INSTALL_DATA} ${WRKSRC}/examples/* ${STAGEDIR}${EXAMPLESDIR}
.endif
.include <bsd.port.mk>

View File

@ -1,2 +1,2 @@
SHA256 (tcc-0.9.25.tar.bz2) = 1bed6cb0fb2ef4100df1b94435d22863679e84cf419ec48ef96d9c0e9063de35
SIZE (tcc-0.9.25.tar.bz2) = 382914
SHA256 (tcc-0.9.26.tar.bz2) = 521e701ae436c302545c3f973a9c9b7e2694769c71d9be10f70a2460705b6d71
SIZE (tcc-0.9.26.tar.bz2) = 525906

View File

@ -1,39 +0,0 @@
The patches in this directory include some updates to tcc 0.9.25.
Some of them have been committed in the main tcc repository so
we will not need them in future updates.
In particular:
1. ELF file format (merged upstream)
tcc 0.9.25 produces an ELF executable which is good for linux but
not for FreeBSD. It misses the PHDR section which is almost
mandatory for shared executables, puts in the .dynsym section
some relocation info that FreeBSD expects to be in .got,
and expect the relocation sections to be contiguous.
patch-tccelf.c tries to address the above problem using
conditional sections (so hopefully can be imported upstream)
and also adds the ability to override the name of the dynamic
loader through an environment variable (this is important to
debug tcc).
The resulting elf file is still not 100% correct -- if you strip it,
the program will not run (presumably there is some dangling reference).
Other than that, program do seem to run correctly.
2. predefined macros (partially merged upstream)
patch-libtcc.c adds/fixes some predefined macros when compiling
on FreeBSD: these are __FreeBSD__ and the usual set of
__i386__ and __unix__ variants.
It also #defines __builtin_inline(x,y), __PRETTY_FUNCTION__,
__CC_SUPPORTS___INLINE, __aligned(x), __packed that are used
in cdefs.h and by several user programs.
Note that tcc recognises the __aligned__ and __packed__
attributes but does not honor them.
3. -include, -M and other preprocessor directives
patch-z1-preproc (name chosen because it must be applied after
the other two) implements -include, -M (and related options),
and makes tcc ignore -isystem and -std= which are often used
to build code.

View File

@ -1,104 +0,0 @@
--- Makefile.orig 2009-05-18 16:27:06.000000000 +0200
+++ Makefile 2009-07-03 07:40:15.000000000 +0200
@@ -28,6 +28,9 @@ endif
ifeq ($(ARCH),x86-64)
CFLAGS+=-Wno-pointer-sign
endif
+ifeq ($(ARCH),amd64)
+CFLAGS+=-Wno-pointer-sign
+endif
ifndef CONFIG_WIN32
LIBS=-lm
@@ -53,6 +56,11 @@ else
ifeq ($(ARCH),x86-64)
NATIVE_TARGET=-DTCC_TARGET_X86_64
LIBTCC1=libtcc1.a
+else
+ifeq ($(ARCH),amd64)
+NATIVE_TARGET=-DTCC_TARGET_X86_64
+LIBTCC1=libtcc1.a
+endif
endif
endif
endif
@@ -99,6 +107,10 @@ ifeq ($(ARCH),x86-64)
NATIVE_FILES=$(X86_64_FILES)
PROGS_CROSS=$(I386_CROSS) $(WIN32_CROSS) $(ARM_CROSS) $(C67_CROSS)
else
+ifeq ($(ARCH),amd64)
+NATIVE_FILES=$(X86_64_FILES)
+PROGS_CROSS=$(I386_CROSS) $(WIN32_CROSS) $(ARM_CROSS) $(C67_CROSS)
+else
ifeq ($(ARCH),arm)
NATIVE_FILES=$(ARM_FILES)
PROGS_CROSS=$(I386_CROSS) $(X64_CROSS) $(WIN32_CROSS) $(C67_CROSS)
@@ -106,6 +118,7 @@ endif
endif
endif
endif
+endif
ifdef CONFIG_CROSS
PROGS+=$(PROGS_CROSS)
@@ -180,7 +193,7 @@ LIBTCC1_OBJS+=alloca86.o alloca86-bt.o
endif
%.o: %.c
- $(LIBTCC1_CC) -o $@ -c $< -O2 -Wall
+ $(LIBTCC1_CC) -o $@ -c $< $(CFLAGS) -Wall
%.o: %.S
$(LIBTCC1_CC) -o $@ -c $<
@@ -189,7 +202,7 @@ libtcc1.a: $(LIBTCC1_OBJS)
$(AR) rcs $@ $^
bcheck.o: bcheck.c
- $(CC) -o $@ -c $< -O2 -Wall
+ $(CC) -o $@ -c $< $(CFLAGS) -Wall
# install
TCC_INCLUDES = stdarg.h stddef.h stdbool.h float.h varargs.h tcclib.h
@@ -197,25 +210,27 @@ INSTALL=install
ifndef CONFIG_WIN32
install: $(PROGS) $(LIBTCC1) $(BCHECK_O) libtcc.a tcc.1 tcc-doc.html
- mkdir -p "$(bindir)"
- $(INSTALL) -s -m755 $(PROGS) "$(bindir)"
- mkdir -p "$(mandir)/man1"
- $(INSTALL) tcc.1 "$(mandir)/man1"
- mkdir -p "$(tccdir)"
- mkdir -p "$(tccdir)/include"
+ mkdir -p "$(DESTDIR)$(bindir)"
+ $(INSTALL) -s -m755 $(PROGS) "$(DESTDIR)$(bindir)"
+ mkdir -p "$(DESTDIR)$(mandir)/man1"
+ $(INSTALL) tcc.1 "$(DESTDIR)$(mandir)/man1"
+ mkdir -p "$(DESTDIR)$(tccdir)"
+ mkdir -p "$(DESTDIR)$(tccdir)/include"
ifneq ($(LIBTCC1),)
- $(INSTALL) -m644 $(LIBTCC1) "$(tccdir)"
+ $(INSTALL) -m644 $(LIBTCC1) "$(DESTDIR)$(tccdir)"
endif
ifneq ($(BCHECK_O),)
- $(INSTALL) -m644 $(BCHECK_O) "$(tccdir)"
+ $(INSTALL) -m644 $(BCHECK_O) "$(DESTDIR)$(tccdir)"
endif
- $(INSTALL) -m644 $(addprefix include/,$(TCC_INCLUDES)) "$(tccdir)/include"
- mkdir -p "$(docdir)"
- $(INSTALL) -m644 tcc-doc.html "$(docdir)"
- mkdir -p "$(libdir)"
- $(INSTALL) -m644 libtcc.a "$(libdir)"
- mkdir -p "$(includedir)"
- $(INSTALL) -m644 libtcc.h "$(includedir)"
+ $(INSTALL) -m644 $(addprefix include/,$(TCC_INCLUDES)) "$(DESTDIR)$(tccdir)/include"
+ifndef NOPORTDOCS
+ mkdir -p "$(DESTDIR)$(docdir)"
+ $(INSTALL) -m644 tcc-doc.html "$(DESTDIR)$(docdir)"
+endif
+ mkdir -p "$(DESTDIR)$(libdir)"
+ $(INSTALL) -m644 libtcc.a "$(DESTDIR)$(libdir)"
+ mkdir -p "$(DESTDIR)$(includedir)"
+ $(INSTALL) -m644 libtcc.h "$(DESTDIR)$(includedir)"
uninstall:
rm -fv $(foreach P,$(PROGS),"$(bindir)/$P")

View File

@ -1,12 +0,0 @@
--- configure.orig 2009-05-18 16:27:06.000000000 +0200
+++ configure 2009-07-03 07:32:51.000000000 +0200
@@ -38,6 +38,9 @@
i386|i486|i586|i686|i86pc|BePC)
cpu="x86"
;;
+ amd64)
+ cpu="x86-64"
+ ;;
x86_64)
cpu="x86-64"
;;

View File

@ -1,57 +0,0 @@
diff -ubwr ./libtcc.c ../../work.2/tcc-0.9.25/libtcc.c
--- ./libtcc.c 2009-05-18 16:27:06.000000000 +0200
+++ ../../work.2/tcc-0.9.25/libtcc.c 2009-11-29 02:25:14.000000000 +0100
@@ -1509,10 +1509,18 @@
if (level == 0) {
/* XXX: only support linux */
+#if defined(__FreeBSD__)
+ *paddr = uc->uc_mcontext.mc_rip;
+#else
*paddr = uc->uc_mcontext.gregs[REG_RIP];
+#endif
return 0;
} else {
+#if defined(__FreeBSD__)
+ fp = uc->uc_mcontext.mc_rbp;
+#else
fp = uc->uc_mcontext.gregs[REG_RBP];
+#endif
for(i=1;i<level;i++) {
/* XXX: check address validity with program info */
if (fp <= 0x1000)
@@ -1784,7 +1792,9 @@
tcc_define_symbol(s, "__STDC__", NULL);
tcc_define_symbol(s, "__STDC_VERSION__", "199901L");
#if defined(TCC_TARGET_I386)
tcc_define_symbol(s, "__i386__", NULL);
+ tcc_define_symbol(s, "__i386", NULL); /* NULL defaults to "1" */
+ tcc_define_symbol(s, "i386", NULL);
#endif
#if defined(TCC_TARGET_X86_64)
tcc_define_symbol(s, "__x86_64__", NULL);
@@ -1802,6 +1812,14 @@
#else
tcc_define_symbol(s, "__unix__", NULL);
tcc_define_symbol(s, "__unix", NULL);
+ tcc_define_symbol(s, "unix", NULL);
+#if defined(__FreeBSD__)
+#define str(s) #s
+ tcc_define_symbol(s, "__FreeBSD__", str( __FreeBSD__));
+#undef str
+ tcc_define_symbol(s, "__aligned(x)", "__attribute__((__aligned__(x)))");
+ tcc_define_symbol(s, "__packed", "__attribute__((packed))");
+#endif
#if defined(__linux)
tcc_define_symbol(s, "__linux__", NULL);
tcc_define_symbol(s, "__linux", NULL);
@@ -1834,6 +1841,9 @@
tcc_define_symbol(s, "__TINYC__", NULL);
/* tiny C & gcc defines */
+ tcc_define_symbol(s, "__CC_SUPPORTS___INLINE", NULL);
+ tcc_define_symbol(s, "__builtin_inline(x,y)", "(x)");
+ tcc_define_symbol(s, "__PRETTY_FUNCTION__", "__FUNCTION__");
tcc_define_symbol(s, "__SIZE_TYPE__", "unsigned int");
tcc_define_symbol(s, "__PTRDIFF_TYPE__", "int");
#ifdef TCC_TARGET_PE

View File

@ -1,175 +0,0 @@
diff -ubwr ./tccelf.c ../../work.2/tcc-0.9.25/tccelf.c
--- ./tccelf.c 2009-05-18 16:27:06.000000000 +0200
+++ ../../work.2/tcc-0.9.25/tccelf.c 2009-11-29 02:12:36.000000000 +0100
@@ -1273,7 +1273,7 @@
/* name of ELF interpreter */
#if defined __FreeBSD__
-static char elf_interp[] = "/usr/libexec/ld-elf.so.1";
+static char elf_interp[] = "/libexec/ld-elf.so.1";
#elif defined TCC_ARM_EABI
static char elf_interp[] = "/lib/ld-linux.so.3";
#elif defined(TCC_TARGET_X86_64)
@@ -1306,6 +1306,31 @@
}
}
+#if defined(__FreeBSD__)
+#define HAVE_PHDR 1
+#define EXTRA_RELITEMS 14
+
+/* move the relocation value from .dynsym to .got */
+void patch_dynsym_undef(TCCState *s1, Section *s)
+{
+ uint32_t *gotd = (void *)s1->got->data;
+ ElfW(Sym) *sym, *sym_end;
+
+ gotd += 3; // dummy entries in .got
+ /* relocate symbols in .dynsym */
+ sym_end = (ElfW(Sym) *)(s->data + s->data_offset);
+ for (sym = (ElfW(Sym) *)s->data + 1; sym < sym_end; sym++) {
+ if (sym->st_shndx == SHN_UNDEF) {
+ *gotd++ = sym->st_value + 6; // XXX 6 is magic ?
+ sym->st_value = 0;
+ }
+ }
+}
+#else
+#define HAVE_PHDR 0
+#define EXTRA_RELITEMS 9
+#endif
+
/* output an ELF file */
/* XXX: suppress unneeded sections */
int elf_output_file(TCCState *s1, const char *filename)
@@ -1324,6 +1349,7 @@
ElfW(Sym) *sym;
int type, file_type;
unsigned long rel_addr, rel_size;
+ unsigned long bss_addr, bss_size;
file_type = s1->output_type;
s1->nb_errors = 0;
@@ -1351,11 +1377,15 @@
if (file_type == TCC_OUTPUT_EXE) {
char *ptr;
+ /* allow override the dynamic loader */
+ char *elfint = getenv("LD_SO");
+ if (elfint == NULL)
+ elfint = elf_interp;
/* add interpreter section only if executable */
interp = new_section(s1, ".interp", SHT_PROGBITS, SHF_ALLOC);
interp->sh_addralign = 1;
- ptr = section_ptr_add(interp, sizeof(elf_interp));
- strcpy(ptr, elf_interp);
+ ptr = section_ptr_add(interp, 1+strlen(elfint));
+ strcpy(ptr, elfint);
}
/* add dynamic symbol table */
@@ -1514,7 +1544,7 @@
/* add necessary space for other entries */
saved_dynamic_data_offset = dynamic->data_offset;
- dynamic->data_offset += sizeof(ElfW(Dyn)) * 9;
+ dynamic->data_offset += sizeof(ElfW(Dyn)) * EXTRA_RELITEMS;
} else {
/* still need to build got entries in case of static link */
build_got_entries(s1);
@@ -1543,7 +1573,7 @@
break;
case TCC_OUTPUT_EXE:
if (!s1->static_link)
- phnum = 4;
+ phnum = 4 + HAVE_PHDR;
else
phnum = 2;
break;
@@ -1620,10 +1650,11 @@
rel_size = 0;
rel_addr = 0;
+ bss_addr = bss_size = 0;
/* leave one program header for the program interpreter */
ph = &phdr[0];
if (interp)
- ph++;
+ ph += 1 + HAVE_PHDR;
for(j = 0; j < 2; j++) {
ph->p_type = PT_LOAD;
@@ -1685,9 +1716,20 @@
}
/* update dynamic relocation infos */
if (s->sh_type == SHT_RELX) {
+#if defined(__FreeBSD__)
+ if (!strcmp(strsec->data + s->sh_name, ".rel.got")) { // rel_size == 0) {
+ rel_addr = addr;
+ rel_size += s->sh_size; // XXX only first rel.
+ }
+ if (!strcmp(strsec->data + s->sh_name, ".rel.bss")) { // rel_size == 0) {
+ bss_addr = addr;
+ bss_size = s->sh_size; // XXX only first rel.
+ }
+#else
if (rel_size == 0)
rel_addr = addr;
rel_size += s->sh_size;
+#endif
}
addr += s->sh_size;
if (s->sh_type != SHT_NOBITS)
@@ -1715,6 +1757,21 @@
if (interp) {
ph = &phdr[0];
+#if defined(__FreeBSD__)
+ {
+ int len = phnum * sizeof(ElfW(Phdr));
+
+ ph->p_type = PT_PHDR;
+ ph->p_offset = sizeof(ElfW(Ehdr));
+ ph->p_vaddr = interp->sh_addr - len;
+ ph->p_paddr = ph->p_vaddr;
+ ph->p_filesz = ph->p_memsz = len;
+ ph->p_flags = PF_R | PF_X;
+ ph->p_align = 4; // interp->sh_addralign;
+ ph++;
+ }
+#endif
+
ph->p_type = PT_INTERP;
ph->p_offset = interp->sh_offset;
ph->p_vaddr = interp->sh_addr;
@@ -1815,10 +1872,19 @@
put_dt(dynamic, DT_RELASZ, rel_size);
put_dt(dynamic, DT_RELAENT, sizeof(ElfW_Rel));
#else
+#if defined(__FreeBSD__)
+ put_dt(dynamic, DT_PLTGOT, s1->got->sh_addr);
+ put_dt(dynamic, DT_PLTRELSZ, rel_size);
+ put_dt(dynamic, DT_JMPREL, rel_addr);
+ put_dt(dynamic, DT_PLTREL, DT_REL);
+ put_dt(dynamic, DT_REL, bss_addr);
+ put_dt(dynamic, DT_RELSZ, bss_size);
+#else
put_dt(dynamic, DT_REL, rel_addr);
put_dt(dynamic, DT_RELSZ, rel_size);
put_dt(dynamic, DT_RELENT, sizeof(ElfW_Rel));
#endif
+#endif
if (s1->do_debug)
put_dt(dynamic, DT_DEBUG, 0);
put_dt(dynamic, DT_NULL, 0);
@@ -1950,6 +2016,10 @@
for(i=1;i<s1->nb_sections;i++) {
s = s1->sections[section_order[i]];
if (s->sh_type != SHT_NOBITS) {
+#if defined(__FreeBSD__)
+ if (s->sh_type == SHT_DYNSYM)
+ patch_dynsym_undef(s1, s);
+#endif
while (offset < s->sh_offset) {
fputc(0, f);
offset++;

View File

@ -1,223 +0,0 @@
diff -ubwr --exclude .svn ./libtcc.c /usr/ports-luigi/tcc/work/tcc-0.9.25/libtcc.c
--- ./libtcc.c 2009-12-06 14:35:51.000000000 +0100
+++ /usr/ports-luigi/tcc/work/tcc-0.9.25/libtcc.c 2009-12-06 14:34:34.000000000 +0100
@@ -1108,7 +1108,15 @@
bf->fd = fd;
bf->buf_ptr = bf->buffer;
bf->buf_end = bf->buffer;
+ if (s1->include_len <= 0) {
bf->buffer[0] = CH_EOB; /* put eob symbol */
+ } else { /* add the list of -include */
+ if (s1->include_len >= sizeof(bf->buffer))
+ error("too many '-include directives %s\n", s1->include_buf);
+ memcpy(bf->buf_ptr, s1->include_buf, s1->include_len);
+ bf->buffer[s1->include_len] = CH_EOB; /* put eob symbol */
+ s1->include_len = -s1->include_len;
+ }
pstrcpy(bf->filename, sizeof(bf->filename), filename);
#ifdef _WIN32
normalize_slashes(bf->filename);
@@ -1945,6 +1955,9 @@
if (ext[0])
ext++;
+ /* enable -include on each new file */
+ if (s1->include_len < 0)
+ s1->include_len = -s1->include_len;
/* open the file */
saved_file = file;
file = tcc_open(s1, filename);
@@ -2121,7 +2134,9 @@
{
char buf[1024];
- s->output_type = output_type;
+ s->output_type = output_type & 7;
+ s->mode_m = output_type & 8;
+ output_type = s->output_type;
if (!s->nostdinc) {
/* default include paths */
diff -ubwr --exclude .svn ./tcc.c /usr/ports-luigi/tcc/work/tcc-0.9.25/tcc.c
--- ./tcc.c 2009-05-18 16:27:06.000000000 +0200
+++ /usr/ports-luigi/tcc/work/tcc-0.9.25/tcc.c 2009-12-06 13:42:09.000000000 +0100
@@ -66,6 +66,7 @@
static int multiple_files;
static int print_search_dirs;
static int output_type;
+static int mode_m;
static int reloc_output;
static const char *outfile;
static int do_bench = 0;
@@ -111,6 +112,10 @@
TCC_OPTION_w,
TCC_OPTION_pipe,
TCC_OPTION_E,
+ TCC_OPTION_M, /* -M and related options */
+ TCC_OPTION_std, /* -std= */
+ TCC_OPTION_isystem, /* -isystem x */
+ TCC_OPTION_include, /* -include x */
};
static const TCCOption tcc_options[] = {
@@ -148,6 +153,10 @@
{ "w", TCC_OPTION_w, 0 },
{ "pipe", TCC_OPTION_pipe, 0},
{ "E", TCC_OPTION_E, 0},
+ { "M", TCC_OPTION_M, TCC_OPTION_HAS_ARG | TCC_OPTION_NOSEP },
+ { "std=", TCC_OPTION_std, TCC_OPTION_HAS_ARG | TCC_OPTION_NOSEP },
+ { "isystem", TCC_OPTION_isystem, TCC_OPTION_HAS_ARG },
+ { "include", TCC_OPTION_include, TCC_OPTION_HAS_ARG },
{ NULL },
};
@@ -399,10 +408,45 @@
}
}
break;
+ case TCC_OPTION_include:
+ {
+ int len = strlen(optarg) + s->include_len + 12; /* #include ""\n */
+ char *dst;
+ s->include_buf = (s->include_len == 0) ?
+ tcc_malloc(len + 1) :
+ tcc_realloc(s->include_buf, len + 1);
+ dst = s->include_buf + s->include_len;
+ sprintf(dst, "#include \"%s\"\n", optarg);
+ s->include_len = len; /* exclude '\0' */
+ }
+ break;
+ case TCC_OPTION_isystem:
+ break; /* ignore isystem */
+ case TCC_OPTION_std:
+ break; /* ignore -std= */
+ case TCC_OPTION_M:
+ mode_m |= 8;
+ if (optarg[0] == '\0') /* plain -M */
+ ;
+ else if (optarg[0] == 'D') /* add output filename */
+ ;
+ else if (optarg[0] == 'F') { /* output filename */
+ if (optind < argc)
+ outfile = argv[optind++];
+ } else if (optarg[0] == 'T') { /* target filename */
+ if (optind < argc)
+ s->target_name = argv[optind++];
+ } else if (optarg[0] == 'P') { /* phony filename */
+ ;
+ } else {
+ goto l_default;
+ }
+ /* FALLTHROUGH */
case TCC_OPTION_E:
output_type = TCC_OUTPUT_PREPROCESS;
break;
default:
+l_default:
if (s->warn_unsupported) {
unsupported_option:
warning("unsupported option '%s'", r);
@@ -502,7 +546,7 @@
start_time = getclock_us();
}
- tcc_set_output_type(s, output_type);
+ tcc_set_output_type(s, output_type | mode_m);
/* compile or add each files or library */
for(i = 0; i < nb_files && ret == 0; i++) {
diff -ubwr --exclude .svn ./tcc.h /usr/ports-luigi/tcc/work/tcc-0.9.25/tcc.h
--- ./tcc.h 2009-05-18 16:27:06.000000000 +0200
+++ /usr/ports-luigi/tcc/work/tcc-0.9.25/tcc.h 2009-12-06 13:28:32.000000000 +0100
@@ -475,6 +475,10 @@
/* output file for preprocessing */
FILE *outfile;
+ int mode_m; /* tcc -M */
+ const char *target_name; /* set with -MT or -MQ */
+ char *include_buf; /* -include ... */
+ int include_len; /* length of -include ... */
/* for tcc_relocate */
int runtime_added;
diff -ubwr --exclude .svn ./tccpp.c /usr/ports-luigi/tcc/work/tcc-0.9.25/tccpp.c
--- ./tccpp.c 2009-05-18 16:27:06.000000000 +0200
+++ /usr/ports-luigi/tcc/work/tcc-0.9.25/tccpp.c 2009-12-05 15:18:13.000000000 +0100
@@ -2897,6 +2897,7 @@
Sym *define_start;
BufferedFile *file_ref;
int token_seen, line_ref;
+ const char *base_file;
preprocess_init(s1);
define_start = define_stack;
@@ -2908,6 +2909,15 @@
line_ref = 0;
file_ref = NULL;
+ base_file = file->filename;
+ if (s1->mode_m) {
+ int l = strlen(base_file);
+ if (s1->target_name)
+ fprintf(s1->outfile, "%s: %s", s1->target_name, base_file);
+ else
+ fprintf(s1->outfile, "%.*s.o: %s", l-2, base_file, base_file);
+ }
+
for (;;) {
next();
if (tok == TOK_EOF) {
@@ -2919,16 +2929,25 @@
token_seen = 0;
} else if (!token_seen) {
int d = file->line_num - line_ref;
+ if (s1->mode_m) {
+ if (file != file_ref && file->filename != base_file &&
+ !search_cached_include(s1, '>', file->filename))
+ fprintf(s1->outfile, " \\\n %s", file->filename);
+ } else {
if (file != file_ref || d < 0 || d >= 8)
fprintf(s1->outfile, "# %d \"%s\"\n", file->line_num, file->filename);
else
while (d)
fputs("\n", s1->outfile), --d;
+ }
line_ref = (file_ref = file)->line_num;
token_seen = 1;
}
+ if (!s1->mode_m)
fputs(get_tok_str(tok, &tokc), s1->outfile);
}
+ if (s1->mode_m)
+ fprintf(s1->outfile, "\n");
free_defines(define_start);
return 0;
}
diff -ubwr --exclude .svn ./tcc.c /usr/ports-luigi/tcc/work/tcc-0.9.25/tcc.c
--- ./tcc.c 2009-12-06 15:42:02.000000000 +0100
+++ /usr/ports-luigi/tcc/work/tcc-0.9.25/tcc.c 2009-12-06 15:42:40.000000000 +0100
@@ -40,8 +40,11 @@
"Preprocessor options:\n"
" -E preprocess only\n"
" -Idir add include path 'dir'\n"
+ " -include f #include file 'f' before everything else\n"
" -Dsym[=val] define 'sym' with value 'val'\n"
" -Usym undefine 'sym'\n"
+ " -M generate include list. Implies -E\n"
+ " -MT file use 'file' as target for -M.\n"
"Linker options:\n"
" -Ldir add library path 'dir'\n"
" -llib link with dynamic or static library 'lib'\n"
@@ -58,6 +61,12 @@
#ifdef CONFIG_TCC_BACKTRACE
" -bt N show N callers in stack traces\n"
#endif
+ "Ignored options (for gcc compatibility):\n"
+ " -std=X \n"
+ " -MD name\n"
+ " -MP\n"
+ " -isystem dir\n"
+
);
}

View File

@ -1,431 +0,0 @@
#! /usr/bin/perl -w
# Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
# This file is part of GNU CC.
# GNU CC is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
# GNU CC 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 General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with GNU CC; see the file COPYING. If not, write to
# the Free Software Foundation, 59 Temple Place - Suite 330,
# Boston MA 02111-1307, USA.
# This does trivial (and I mean _trivial_) conversion of Texinfo
# markup to Perl POD format. It's intended to be used to extract
# something suitable for a manpage from a Texinfo document.
$output = 0;
$skipping = 0;
%sects = ();
$section = "";
@icstack = ();
@endwstack = ();
@skstack = ();
@instack = ();
$shift = "";
%defs = ();
$fnno = 1;
$inf = "";
$ibase = "";
while ($_ = shift) {
if (/^-D(.*)$/) {
if ($1 ne "") {
$flag = $1;
} else {
$flag = shift;
}
$value = "";
($flag, $value) = ($flag =~ /^([^=]+)(?:=(.+))?/);
die "no flag specified for -D\n"
unless $flag ne "";
die "flags may only contain letters, digits, hyphens, dashes and underscores\n"
unless $flag =~ /^[a-zA-Z0-9_-]+$/;
$defs{$flag} = $value;
} elsif (/^-/) {
usage();
} else {
$in = $_, next unless defined $in;
$out = $_, next unless defined $out;
usage();
}
}
if (defined $in) {
$inf = gensym();
open($inf, "<$in") or die "opening \"$in\": $!\n";
$ibase = $1 if $in =~ m|^(.+)/[^/]+$|;
} else {
$inf = \*STDIN;
}
if (defined $out) {
open(STDOUT, ">$out") or die "opening \"$out\": $!\n";
}
while(defined $inf) {
while(<$inf>) {
# Certain commands are discarded without further processing.
/^\@(?:
[a-z]+index # @*index: useful only in complete manual
|need # @need: useful only in printed manual
|(?:end\s+)?group # @group .. @end group: ditto
|page # @page: ditto
|node # @node: useful only in .info file
|(?:end\s+)?ifnottex # @ifnottex .. @end ifnottex: use contents
)\b/x and next;
chomp;
# Look for filename and title markers.
/^\@setfilename\s+([^.]+)/ and $fn = $1, next;
/^\@settitle\s+([^.]+)/ and $tl = postprocess($1), next;
# Identify a man title but keep only the one we are interested in.
/^\@c\s+man\s+title\s+([A-Za-z0-9-]+)\s+(.+)/ and do {
if (exists $defs{$1}) {
$fn = $1;
$tl = postprocess($2);
}
next;
};
# Look for blocks surrounded by @c man begin SECTION ... @c man end.
# This really oughta be @ifman ... @end ifman and the like, but such
# would require rev'ing all other Texinfo translators.
/^\@c\s+man\s+begin\s+([A-Z]+)\s+([A-Za-z0-9-]+)/ and do {
$output = 1 if exists $defs{$2};
$sect = $1;
next;
};
/^\@c\s+man\s+begin\s+([A-Z]+)/ and $sect = $1, $output = 1, next;
/^\@c\s+man\s+end/ and do {
$sects{$sect} = "" unless exists $sects{$sect};
$sects{$sect} .= postprocess($section);
$section = "";
$output = 0;
next;
};
# handle variables
/^\@set\s+([a-zA-Z0-9_-]+)\s*(.*)$/ and do {
$defs{$1} = $2;
next;
};
/^\@clear\s+([a-zA-Z0-9_-]+)/ and do {
delete $defs{$1};
next;
};
next unless $output;
# Discard comments. (Can't do it above, because then we'd never see
# @c man lines.)
/^\@c\b/ and next;
# End-block handler goes up here because it needs to operate even
# if we are skipping.
/^\@end\s+([a-z]+)/ and do {
# Ignore @end foo, where foo is not an operation which may
# cause us to skip, if we are presently skipping.
my $ended = $1;
next if $skipping && $ended !~ /^(?:ifset|ifclear|ignore|menu|iftex)$/;
die "\@end $ended without \@$ended at line $.\n" unless defined $endw;
die "\@$endw ended by \@end $ended at line $.\n" unless $ended eq $endw;
$endw = pop @endwstack;
if ($ended =~ /^(?:ifset|ifclear|ignore|menu|iftex)$/) {
$skipping = pop @skstack;
next;
} elsif ($ended =~ /^(?:example|smallexample|display)$/) {
$shift = "";
$_ = ""; # need a paragraph break
} elsif ($ended =~ /^(?:itemize|enumerate|[fv]?table)$/) {
$_ = "\n=back\n";
$ic = pop @icstack;
} else {
die "unknown command \@end $ended at line $.\n";
}
};
# We must handle commands which can cause skipping even while we
# are skipping, otherwise we will not process nested conditionals
# correctly.
/^\@ifset\s+([a-zA-Z0-9_-]+)/ and do {
push @endwstack, $endw;
push @skstack, $skipping;
$endw = "ifset";
$skipping = 1 unless exists $defs{$1};
next;
};
/^\@ifclear\s+([a-zA-Z0-9_-]+)/ and do {
push @endwstack, $endw;
push @skstack, $skipping;
$endw = "ifclear";
$skipping = 1 if exists $defs{$1};
next;
};
/^\@(ignore|menu|iftex)\b/ and do {
push @endwstack, $endw;
push @skstack, $skipping;
$endw = $1;
$skipping = 1;
next;
};
next if $skipping;
# Character entities. First the ones that can be replaced by raw text
# or discarded outright:
s/\@copyright\{\}/(c)/g;
s/\@dots\{\}/.../g;
s/\@enddots\{\}/..../g;
s/\@([.!? ])/$1/g;
s/\@[:-]//g;
s/\@bullet(?:\{\})?/*/g;
s/\@TeX\{\}/TeX/g;
s/\@pounds\{\}/\#/g;
s/\@minus(?:\{\})?/-/g;
s/\\,/,/g;
# Now the ones that have to be replaced by special escapes
# (which will be turned back into text by unmunge())
s/&/&amp;/g;
s/\@\{/&lbrace;/g;
s/\@\}/&rbrace;/g;
s/\@\@/&at;/g;
# Inside a verbatim block, handle @var specially.
if ($shift ne "") {
s/\@var\{([^\}]*)\}/<$1>/g;
}
# POD doesn't interpret E<> inside a verbatim block.
if ($shift eq "") {
s/</&lt;/g;
s/>/&gt;/g;
} else {
s/</&LT;/g;
s/>/&GT;/g;
}
# Single line command handlers.
/^\@include\s+(.+)$/ and do {
push @instack, $inf;
$inf = gensym();
# Try cwd and $ibase.
open($inf, "<" . $1)
or open($inf, "<" . $ibase . "/" . $1)
or die "cannot open $1 or $ibase/$1: $!\n";
next;
};
/^\@(?:section|unnumbered|unnumberedsec|center)\s+(.+)$/
and $_ = "\n=head2 $1\n";
/^\@subsection\s+(.+)$/
and $_ = "\n=head3 $1\n";
# Block command handlers:
/^\@itemize\s+(\@[a-z]+|\*|-)/ and do {
push @endwstack, $endw;
push @icstack, $ic;
$ic = $1;
$_ = "\n=over 4\n";
$endw = "itemize";
};
/^\@enumerate(?:\s+([a-zA-Z0-9]+))?/ and do {
push @endwstack, $endw;
push @icstack, $ic;
if (defined $1) {
$ic = $1 . ".";
} else {
$ic = "1.";
}
$_ = "\n=over 4\n";
$endw = "enumerate";
};
/^\@([fv]?table)\s+(\@[a-z]+)/ and do {
push @endwstack, $endw;
push @icstack, $ic;
$endw = $1;
$ic = $2;
$ic =~ s/\@(?:samp|strong|key|gcctabopt|env)/B/;
$ic =~ s/\@(?:code|kbd)/C/;
$ic =~ s/\@(?:dfn|var|emph|cite|i)/I/;
$ic =~ s/\@(?:file)/F/;
$_ = "\n=over 4\n";
};
/^\@((?:small)?example|display)/ and do {
push @endwstack, $endw;
$endw = $1;
$shift = "\t";
$_ = ""; # need a paragraph break
};
/^\@itemx?\s*(.+)?$/ and do {
if (defined $1) {
# Entity escapes prevent munging by the <> processing below.
$_ = "\n=item $ic\&LT;$1\&GT;\n";
} else {
$_ = "\n=item $ic\n";
$ic =~ y/A-Ya-y/B-Zb-z/;
$ic =~ s/(\d+)/$1 + 1/eg;
}
};
$section .= $shift.$_."\n";
}
# End of current file.
close($inf);
$inf = pop @instack;
}
die "No filename or title\n" unless defined $fn && defined $tl;
$sects{NAME} = "$fn \- $tl\n";
$sects{FOOTNOTES} .= "=back\n" if exists $sects{FOOTNOTES};
for $sect (qw(NAME SYNOPSIS DESCRIPTION OPTIONS ENVIRONMENT FILES
BUGS NOTES FOOTNOTES SEEALSO AUTHOR COPYRIGHT)) {
if(exists $sects{$sect}) {
$head = $sect;
$head =~ s/SEEALSO/SEE ALSO/;
print "=head1 $head\n\n";
print scalar unmunge ($sects{$sect});
print "\n";
}
}
sub usage
{
die "usage: $0 [-D toggle...] [infile [outfile]]\n";
}
sub postprocess
{
local $_ = $_[0];
# @value{foo} is replaced by whatever 'foo' is defined as.
while (m/(\@value\{([a-zA-Z0-9_-]+)\})/g) {
if (! exists $defs{$2}) {
print STDERR "Option $2 not defined\n";
s/\Q$1\E//;
} else {
$value = $defs{$2};
s/\Q$1\E/$value/;
}
}
# Formatting commands.
# Temporary escape for @r.
s/\@r\{([^\}]*)\}/R<$1>/g;
s/\@(?:dfn|var|emph|cite|i)\{([^\}]*)\}/I<$1>/g;
s/\@(?:code|kbd)\{([^\}]*)\}/C<$1>/g;
s/\@(?:gccoptlist|samp|strong|key|option|env|command|b)\{([^\}]*)\}/B<$1>/g;
s/\@sc\{([^\}]*)\}/\U$1/g;
s/\@file\{([^\}]*)\}/F<$1>/g;
s/\@w\{([^\}]*)\}/S<$1>/g;
s/\@(?:dmn|math)\{([^\}]*)\}/$1/g;
# Cross references are thrown away, as are @noindent and @refill.
# (@noindent is impossible in .pod, and @refill is unnecessary.)
# @* is also impossible in .pod; we discard it and any newline that
# follows it. Similarly, our macro @gol must be discarded.
s/\(?\@xref\{(?:[^\}]*)\}(?:[^.<]|(?:<[^<>]*>))*\.\)?//g;
s/\s+\(\@pxref\{(?:[^\}]*)\}\)//g;
s/;\s+\@pxref\{(?:[^\}]*)\}//g;
s/\@noindent\s*//g;
s/\@refill//g;
s/\@gol//g;
s/\@\*\s*\n?//g;
# @uref can take one, two, or three arguments, with different
# semantics each time. @url and @email are just like @uref with
# one argument, for our purposes.
s/\@(?:uref|url|email)\{([^\},]*)\}/&lt;B<$1>&gt;/g;
s/\@uref\{([^\},]*),([^\},]*)\}/$2 (C<$1>)/g;
s/\@uref\{([^\},]*),([^\},]*),([^\},]*)\}/$3/g;
# Un-escape <> at this point.
s/&LT;/</g;
s/&GT;/>/g;
# Now un-nest all B<>, I<>, R<>. Theoretically we could have
# indefinitely deep nesting; in practice, one level suffices.
1 while s/([BIR])<([^<>]*)([BIR])<([^<>]*)>/$1<$2>$3<$4>$1</g;
# Replace R<...> with bare ...; eliminate empty markup, B<>;
# shift white space at the ends of [BI]<...> expressions outside
# the expression.
s/R<([^<>]*)>/$1/g;
s/[BI]<>//g;
s/([BI])<(\s+)([^>]+)>/$2$1<$3>/g;
s/([BI])<([^>]+?)(\s+)>/$1<$2>$3/g;
# Extract footnotes. This has to be done after all other
# processing because otherwise the regexp will choke on formatting
# inside @footnote.
while (/\@footnote/g) {
s/\@footnote\{([^\}]+)\}/[$fnno]/;
add_footnote($1, $fnno);
$fnno++;
}
return $_;
}
sub unmunge
{
# Replace escaped symbols with their equivalents.
local $_ = $_[0];
s/&lt;/E<lt>/g;
s/&gt;/E<gt>/g;
s/&lbrace;/\{/g;
s/&rbrace;/\}/g;
s/&at;/\@/g;
s/&amp;/&/g;
return $_;
}
sub add_footnote
{
unless (exists $sects{FOOTNOTES}) {
$sects{FOOTNOTES} = "\n=over 4\n\n";
}
$sects{FOOTNOTES} .= "=item $fnno.\n\n"; $fnno++;
$sects{FOOTNOTES} .= $_[0];
$sects{FOOTNOTES} .= "\n\n";
}
# stolen from Symbol.pm
{
my $genseq = 0;
sub gensym
{
my $name = "GEN" . $genseq++;
my $ref = \*{$name};
delete $::{$name};
return $ref;
}
}

View File

@ -1,16 +1,26 @@
bin/tcc
include/libtcc.h
lib/libtcc.a
%%I386%%lib/tcc/bcheck.o
lib/tcc/include/float.h
lib/tcc/include/stdarg.h
lib/tcc/include/stdbool.h
lib/tcc/include/stddef.h
lib/tcc/include/tcclib.h
lib/tcc/include/varargs.h
lib/tcc/bcheck.o
lib/tcc/libtcc1.a
man/man1/tcc.1.gz
share/info/tcc-doc.info
share/man/man1/tcc.1
@dirrm lib/tcc/include
@dirrm lib/tcc
@dirrmtry share/info
@dirrmtry share/man/man1
@dirrmtry share/man
%%PORTDOCS%%%%DOCSDIR%%/tcc-doc.html
%%PORTDOCS%%@dirrm %%DOCSDIR%%
%%PORTEXAMPLES%%%%EXAMPLESDIR%%/ex1.c
%%PORTEXAMPLES%%%%EXAMPLESDIR%%/ex2.c
%%PORTEXAMPLES%%%%EXAMPLESDIR%%/ex3.c
%%PORTEXAMPLES%%%%EXAMPLESDIR%%/ex4.c
%%PORTEXAMPLES%%%%EXAMPLESDIR%%/ex5.c
%%PORTEXAMPLES%%@dirrmtry %%EXAMPLESDIR%%