mirror of
https://github.com/mirror/tinycc.git
synced 2025-02-10 06:50:10 +08:00
Identifiers can start and/or contain '.' in *.S
modified version of the old one which don't allow '.' in #define Identifiers. This allow correctly preprocess the following code in *.S #define SRC(y...) \ 9999: y; \ .section __ex_table, "a"; \ .long 9999b, 6001f ; \ // .previous SRC(1: movw (%esi), %bx) 6001: A test included.
This commit is contained in:
parent
21665f4338
commit
d3e85e80fd
4
tcc.h
4
tcc.h
@ -957,7 +957,9 @@ struct TCCState {
|
|||||||
|
|
||||||
#define DEF_ASM(x) DEF(TOK_ASM_ ## x, #x)
|
#define DEF_ASM(x) DEF(TOK_ASM_ ## x, #x)
|
||||||
#define TOK_ASM_int TOK_INT
|
#define TOK_ASM_int TOK_INT
|
||||||
#define TOK_ASM_weak TOK_WEAK1
|
#define DEF_ASMDIR(x) DEF(TOK_ASMDIR_ ## x, "." #x)
|
||||||
|
#define TOK_ASMDIR_FIRST TOK_ASMDIR_byte
|
||||||
|
#define TOK_ASMDIR_LAST TOK_ASMDIR_section
|
||||||
|
|
||||||
#if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64
|
#if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64
|
||||||
/* only used for i386 asm opcodes definitions */
|
/* only used for i386 asm opcodes definitions */
|
||||||
|
87
tccasm.c
87
tccasm.c
@ -331,24 +331,23 @@ static void asm_parse_directive(TCCState *s1)
|
|||||||
uint8_t *ptr;
|
uint8_t *ptr;
|
||||||
|
|
||||||
/* assembler directive */
|
/* assembler directive */
|
||||||
next();
|
|
||||||
sec = cur_text_section;
|
sec = cur_text_section;
|
||||||
switch(tok) {
|
switch(tok) {
|
||||||
case TOK_ASM_align:
|
case TOK_ASMDIR_align:
|
||||||
case TOK_ASM_p2align:
|
case TOK_ASMDIR_p2align:
|
||||||
case TOK_ASM_skip:
|
case TOK_ASMDIR_skip:
|
||||||
case TOK_ASM_space:
|
case TOK_ASMDIR_space:
|
||||||
tok1 = tok;
|
tok1 = tok;
|
||||||
next();
|
next();
|
||||||
n = asm_int_expr(s1);
|
n = asm_int_expr(s1);
|
||||||
if (tok1 == TOK_ASM_p2align)
|
if (tok1 == TOK_ASMDIR_p2align)
|
||||||
{
|
{
|
||||||
if (n < 0 || n > 30)
|
if (n < 0 || n > 30)
|
||||||
tcc_error("invalid p2align, must be between 0 and 30");
|
tcc_error("invalid p2align, must be between 0 and 30");
|
||||||
n = 1 << n;
|
n = 1 << n;
|
||||||
tok1 = TOK_ASM_align;
|
tok1 = TOK_ASMDIR_align;
|
||||||
}
|
}
|
||||||
if (tok1 == TOK_ASM_align) {
|
if (tok1 == TOK_ASMDIR_align) {
|
||||||
if (n < 0 || (n & (n-1)) != 0)
|
if (n < 0 || (n & (n-1)) != 0)
|
||||||
tcc_error("alignment must be a positive power of two");
|
tcc_error("alignment must be a positive power of two");
|
||||||
offset = (ind + n - 1) & -n;
|
offset = (ind + n - 1) & -n;
|
||||||
@ -372,7 +371,7 @@ static void asm_parse_directive(TCCState *s1)
|
|||||||
}
|
}
|
||||||
ind += size;
|
ind += size;
|
||||||
break;
|
break;
|
||||||
case TOK_ASM_quad:
|
case TOK_ASMDIR_quad:
|
||||||
next();
|
next();
|
||||||
for(;;) {
|
for(;;) {
|
||||||
uint64_t vl;
|
uint64_t vl;
|
||||||
@ -399,15 +398,15 @@ static void asm_parse_directive(TCCState *s1)
|
|||||||
next();
|
next();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TOK_ASM_byte:
|
case TOK_ASMDIR_byte:
|
||||||
size = 1;
|
size = 1;
|
||||||
goto asm_data;
|
goto asm_data;
|
||||||
case TOK_ASM_word:
|
case TOK_ASMDIR_word:
|
||||||
case TOK_SHORT:
|
case TOK_ASMDIR_short:
|
||||||
size = 2;
|
size = 2;
|
||||||
goto asm_data;
|
goto asm_data;
|
||||||
case TOK_LONG:
|
case TOK_ASMDIR_long:
|
||||||
case TOK_INT:
|
case TOK_ASMDIR_int:
|
||||||
size = 4;
|
size = 4;
|
||||||
asm_data:
|
asm_data:
|
||||||
next();
|
next();
|
||||||
@ -433,7 +432,7 @@ static void asm_parse_directive(TCCState *s1)
|
|||||||
next();
|
next();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TOK_ASM_fill:
|
case TOK_ASMDIR_fill:
|
||||||
{
|
{
|
||||||
int repeat, size, val, i, j;
|
int repeat, size, val, i, j;
|
||||||
uint8_t repeat_buf[8];
|
uint8_t repeat_buf[8];
|
||||||
@ -475,7 +474,7 @@ static void asm_parse_directive(TCCState *s1)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TOK_ASM_org:
|
case TOK_ASMDIR_org:
|
||||||
{
|
{
|
||||||
unsigned long n;
|
unsigned long n;
|
||||||
next();
|
next();
|
||||||
@ -488,10 +487,10 @@ static void asm_parse_directive(TCCState *s1)
|
|||||||
goto zero_pad;
|
goto zero_pad;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TOK_ASM_globl:
|
case TOK_ASMDIR_globl:
|
||||||
case TOK_ASM_global:
|
case TOK_ASMDIR_global:
|
||||||
case TOK_ASM_weak:
|
case TOK_ASMDIR_weak:
|
||||||
case TOK_ASM_hidden:
|
case TOK_ASMDIR_hidden:
|
||||||
tok1 = tok;
|
tok1 = tok;
|
||||||
do {
|
do {
|
||||||
Sym *sym;
|
Sym *sym;
|
||||||
@ -502,18 +501,18 @@ static void asm_parse_directive(TCCState *s1)
|
|||||||
sym = label_push(&s1->asm_labels, tok, 0);
|
sym = label_push(&s1->asm_labels, tok, 0);
|
||||||
sym->type.t = VT_VOID;
|
sym->type.t = VT_VOID;
|
||||||
}
|
}
|
||||||
if (tok1 != TOK_ASM_hidden)
|
if (tok1 != TOK_ASMDIR_hidden)
|
||||||
sym->type.t &= ~VT_STATIC;
|
sym->type.t &= ~VT_STATIC;
|
||||||
if (tok1 == TOK_ASM_weak)
|
if (tok1 == TOK_ASMDIR_weak)
|
||||||
sym->type.t |= VT_WEAK;
|
sym->type.t |= VT_WEAK;
|
||||||
else if (tok1 == TOK_ASM_hidden)
|
else if (tok1 == TOK_ASMDIR_hidden)
|
||||||
sym->type.t |= STV_HIDDEN << VT_VIS_SHIFT;
|
sym->type.t |= STV_HIDDEN << VT_VIS_SHIFT;
|
||||||
next();
|
next();
|
||||||
} while (tok == ',');
|
} while (tok == ',');
|
||||||
break;
|
break;
|
||||||
case TOK_ASM_string:
|
case TOK_ASMDIR_string:
|
||||||
case TOK_ASM_ascii:
|
case TOK_ASMDIR_ascii:
|
||||||
case TOK_ASM_asciz:
|
case TOK_ASMDIR_asciz:
|
||||||
{
|
{
|
||||||
const uint8_t *p;
|
const uint8_t *p;
|
||||||
int i, size, t;
|
int i, size, t;
|
||||||
@ -525,7 +524,7 @@ static void asm_parse_directive(TCCState *s1)
|
|||||||
expect("string constant");
|
expect("string constant");
|
||||||
p = tokc.str.data;
|
p = tokc.str.data;
|
||||||
size = tokc.str.size;
|
size = tokc.str.size;
|
||||||
if (t == TOK_ASM_ascii && size > 0)
|
if (t == TOK_ASMDIR_ascii && size > 0)
|
||||||
size--;
|
size--;
|
||||||
for(i = 0; i < size; i++)
|
for(i = 0; i < size; i++)
|
||||||
g(p[i]);
|
g(p[i]);
|
||||||
@ -538,9 +537,9 @@ static void asm_parse_directive(TCCState *s1)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TOK_ASM_text:
|
case TOK_ASMDIR_text:
|
||||||
case TOK_ASM_data:
|
case TOK_ASMDIR_data:
|
||||||
case TOK_ASM_bss:
|
case TOK_ASMDIR_bss:
|
||||||
{
|
{
|
||||||
char sname[64];
|
char sname[64];
|
||||||
tok1 = tok;
|
tok1 = tok;
|
||||||
@ -557,7 +556,7 @@ static void asm_parse_directive(TCCState *s1)
|
|||||||
use_section(s1, sname);
|
use_section(s1, sname);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TOK_ASM_file:
|
case TOK_ASMDIR_file:
|
||||||
{
|
{
|
||||||
char filename[512];
|
char filename[512];
|
||||||
|
|
||||||
@ -575,7 +574,7 @@ static void asm_parse_directive(TCCState *s1)
|
|||||||
next();
|
next();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TOK_ASM_ident:
|
case TOK_ASMDIR_ident:
|
||||||
{
|
{
|
||||||
char ident[256];
|
char ident[256];
|
||||||
|
|
||||||
@ -593,7 +592,7 @@ static void asm_parse_directive(TCCState *s1)
|
|||||||
next();
|
next();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TOK_ASM_size:
|
case TOK_ASMDIR_size:
|
||||||
{
|
{
|
||||||
Sym *sym;
|
Sym *sym;
|
||||||
|
|
||||||
@ -614,7 +613,7 @@ static void asm_parse_directive(TCCState *s1)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TOK_ASM_type:
|
case TOK_ASMDIR_type:
|
||||||
{
|
{
|
||||||
Sym *sym;
|
Sym *sym;
|
||||||
const char *newtype;
|
const char *newtype;
|
||||||
@ -632,7 +631,7 @@ static void asm_parse_directive(TCCState *s1)
|
|||||||
newtype = tokc.str.data;
|
newtype = tokc.str.data;
|
||||||
} else {
|
} else {
|
||||||
if (tok == '@' || tok == '%')
|
if (tok == '@' || tok == '%')
|
||||||
skip(tok);
|
next();
|
||||||
newtype = get_tok_str(tok, NULL);
|
newtype = get_tok_str(tok, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -646,7 +645,7 @@ static void asm_parse_directive(TCCState *s1)
|
|||||||
next();
|
next();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TOK_SECTION1:
|
case TOK_ASMDIR_section:
|
||||||
{
|
{
|
||||||
char sname[256];
|
char sname[256];
|
||||||
|
|
||||||
@ -666,12 +665,18 @@ static void asm_parse_directive(TCCState *s1)
|
|||||||
if (tok != TOK_STR)
|
if (tok != TOK_STR)
|
||||||
expect("string constant");
|
expect("string constant");
|
||||||
next();
|
next();
|
||||||
|
if (tok == ',') {
|
||||||
|
next();
|
||||||
|
if (tok == '@' || tok == '%')
|
||||||
|
next();
|
||||||
|
next();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
last_text_section = cur_text_section;
|
last_text_section = cur_text_section;
|
||||||
use_section(s1, sname);
|
use_section(s1, sname);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TOK_ASM_previous:
|
case TOK_ASMDIR_previous:
|
||||||
{
|
{
|
||||||
Section *sec;
|
Section *sec;
|
||||||
next();
|
next();
|
||||||
@ -683,13 +688,13 @@ static void asm_parse_directive(TCCState *s1)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#ifdef TCC_TARGET_I386
|
#ifdef TCC_TARGET_I386
|
||||||
case TOK_ASM_code16:
|
case TOK_ASMDIR_code16:
|
||||||
{
|
{
|
||||||
next();
|
next();
|
||||||
s1->seg_size = 16;
|
s1->seg_size = 16;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TOK_ASM_code32:
|
case TOK_ASMDIR_code32:
|
||||||
{
|
{
|
||||||
next();
|
next();
|
||||||
s1->seg_size = 32;
|
s1->seg_size = 32;
|
||||||
@ -698,7 +703,7 @@ static void asm_parse_directive(TCCState *s1)
|
|||||||
#endif
|
#endif
|
||||||
#ifdef TCC_TARGET_X86_64
|
#ifdef TCC_TARGET_X86_64
|
||||||
/* added for compatibility with GAS */
|
/* added for compatibility with GAS */
|
||||||
case TOK_ASM_code64:
|
case TOK_ASMDIR_code64:
|
||||||
next();
|
next();
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
@ -763,7 +768,7 @@ static int tcc_assemble_internal(TCCState *s1, int do_preprocess)
|
|||||||
/* horrible gas comment */
|
/* horrible gas comment */
|
||||||
while (tok != TOK_LINEFEED)
|
while (tok != TOK_LINEFEED)
|
||||||
next();
|
next();
|
||||||
} else if (tok == '.') {
|
} else if (tok >= TOK_ASMDIR_FIRST && tok <= TOK_ASMDIR_LAST) {
|
||||||
asm_parse_directive(s1);
|
asm_parse_directive(s1);
|
||||||
} else if (tok == TOK_PPNUM) {
|
} else if (tok == TOK_PPNUM) {
|
||||||
const char *p;
|
const char *p;
|
||||||
|
12
tccpp.c
12
tccpp.c
@ -1328,6 +1328,8 @@ ST_FUNC void parse_define(void)
|
|||||||
parse_flags |= PARSE_FLAG_SPACES;
|
parse_flags |= PARSE_FLAG_SPACES;
|
||||||
next_nomacro_spc();
|
next_nomacro_spc();
|
||||||
if (tok == '(') {
|
if (tok == '(') {
|
||||||
|
/* must be able to parse TOK_DOTS (in asm mode '.' can be part of identifier) */
|
||||||
|
parse_flags &= ~PARSE_FLAG_ASM_FILE;
|
||||||
next_nomacro();
|
next_nomacro();
|
||||||
ps = &first;
|
ps = &first;
|
||||||
if (tok != ')') for (;;) {
|
if (tok != ')') for (;;) {
|
||||||
@ -1355,6 +1357,7 @@ ST_FUNC void parse_define(void)
|
|||||||
}
|
}
|
||||||
next_nomacro_spc();
|
next_nomacro_spc();
|
||||||
t = MACRO_FUNC;
|
t = MACRO_FUNC;
|
||||||
|
parse_flags |= (saved_parse_flags & PARSE_FLAG_ASM_FILE);
|
||||||
}
|
}
|
||||||
tok_str_new(&str);
|
tok_str_new(&str);
|
||||||
spc = 2;
|
spc = 2;
|
||||||
@ -2460,7 +2463,8 @@ maybe_newline:
|
|||||||
p1 = p;
|
p1 = p;
|
||||||
h = TOK_HASH_INIT;
|
h = TOK_HASH_INIT;
|
||||||
h = TOK_HASH_FUNC(h, c);
|
h = TOK_HASH_FUNC(h, c);
|
||||||
while (c = *++p, isidnum_table[c - CH_EOF] & (IS_ID|IS_NUM))
|
while (c = *++p, (isidnum_table[c - CH_EOF] & (IS_ID|IS_NUM))
|
||||||
|
|| (c == '.' && (parse_flags & PARSE_FLAG_ASM_FILE)))
|
||||||
h = TOK_HASH_FUNC(h, c);
|
h = TOK_HASH_FUNC(h, c);
|
||||||
if (c != '\\') {
|
if (c != '\\') {
|
||||||
TokenSym **pts;
|
TokenSym **pts;
|
||||||
@ -2492,7 +2496,9 @@ maybe_newline:
|
|||||||
p--;
|
p--;
|
||||||
PEEKC(c, p);
|
PEEKC(c, p);
|
||||||
parse_ident_slow:
|
parse_ident_slow:
|
||||||
while (isidnum_table[c - CH_EOF] & (IS_ID|IS_NUM)) {
|
while ((isidnum_table[c - CH_EOF] & (IS_ID|IS_NUM))
|
||||||
|
|| (c == '.' && (parse_flags & PARSE_FLAG_ASM_FILE)))
|
||||||
|
{
|
||||||
cstr_ccat(&tokcstr, c);
|
cstr_ccat(&tokcstr, c);
|
||||||
PEEKC(c, p);
|
PEEKC(c, p);
|
||||||
}
|
}
|
||||||
@ -2551,7 +2557,7 @@ maybe_newline:
|
|||||||
cstr_reset(&tokcstr);
|
cstr_reset(&tokcstr);
|
||||||
cstr_ccat(&tokcstr, '.');
|
cstr_ccat(&tokcstr, '.');
|
||||||
goto parse_num;
|
goto parse_num;
|
||||||
} else if ((isidnum_table['.' - CH_EOF] & IS_ID) != 0) { /* asm mode */
|
} else if (parse_flags & PARSE_FLAG_ASM_FILE) {
|
||||||
*--p = c = '.';
|
*--p = c = '.';
|
||||||
goto parse_ident_fast;
|
goto parse_ident_fast;
|
||||||
} else if (c == '.') {
|
} else if (c == '.') {
|
||||||
|
57
tcctok.h
57
tcctok.h
@ -301,35 +301,40 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Tiny Assembler */
|
/* Tiny Assembler */
|
||||||
DEF_ASM(byte)
|
DEF_ASMDIR(byte) /* must be first directive */
|
||||||
DEF_ASM(word)
|
DEF_ASMDIR(word)
|
||||||
DEF_ASM(align)
|
DEF_ASMDIR(align)
|
||||||
DEF_ASM(p2align)
|
DEF_ASMDIR(p2align)
|
||||||
DEF_ASM(skip)
|
DEF_ASMDIR(skip)
|
||||||
DEF_ASM(space)
|
DEF_ASMDIR(space)
|
||||||
DEF_ASM(string)
|
DEF_ASMDIR(string)
|
||||||
DEF_ASM(asciz)
|
DEF_ASMDIR(asciz)
|
||||||
DEF_ASM(ascii)
|
DEF_ASMDIR(ascii)
|
||||||
DEF_ASM(file)
|
DEF_ASMDIR(file)
|
||||||
DEF_ASM(globl)
|
DEF_ASMDIR(globl)
|
||||||
DEF_ASM(global)
|
DEF_ASMDIR(global)
|
||||||
DEF_ASM(hidden)
|
DEF_ASMDIR(weak)
|
||||||
DEF_ASM(ident)
|
DEF_ASMDIR(hidden)
|
||||||
DEF_ASM(size)
|
DEF_ASMDIR(ident)
|
||||||
DEF_ASM(type)
|
DEF_ASMDIR(size)
|
||||||
DEF_ASM(text)
|
DEF_ASMDIR(type)
|
||||||
DEF_ASM(data)
|
DEF_ASMDIR(text)
|
||||||
DEF_ASM(bss)
|
DEF_ASMDIR(data)
|
||||||
DEF_ASM(previous)
|
DEF_ASMDIR(bss)
|
||||||
DEF_ASM(fill)
|
DEF_ASMDIR(previous)
|
||||||
DEF_ASM(org)
|
DEF_ASMDIR(fill)
|
||||||
DEF_ASM(quad)
|
DEF_ASMDIR(org)
|
||||||
|
DEF_ASMDIR(quad)
|
||||||
#if defined(TCC_TARGET_I386)
|
#if defined(TCC_TARGET_I386)
|
||||||
DEF_ASM(code16)
|
DEF_ASMDIR(code16)
|
||||||
DEF_ASM(code32)
|
DEF_ASMDIR(code32)
|
||||||
#elif defined(TCC_TARGET_X86_64)
|
#elif defined(TCC_TARGET_X86_64)
|
||||||
DEF_ASM(code64)
|
DEF_ASMDIR(code64)
|
||||||
#endif
|
#endif
|
||||||
|
DEF_ASMDIR(short)
|
||||||
|
DEF_ASMDIR(long)
|
||||||
|
DEF_ASMDIR(int)
|
||||||
|
DEF_ASMDIR(section) /* must be last directive */
|
||||||
|
|
||||||
#if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64
|
#if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64
|
||||||
#include "i386-tok.h"
|
#include "i386-tok.h"
|
||||||
|
@ -73,7 +73,11 @@ DISAS = objdump -d
|
|||||||
|
|
||||||
# libtcc test
|
# libtcc test
|
||||||
ifdef LIBTCC1
|
ifdef LIBTCC1
|
||||||
LIBTCC1:=$(TOP)/$(LIBTCC1)
|
ifdef CONFIG_WIN32
|
||||||
|
LIBTCC1:=$(TOP)/win32/libtcc/libtcc.a
|
||||||
|
else
|
||||||
|
LIBTCC1:=$(TOP)/$(LIBTCC1)
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
all test : $(TESTS)
|
all test : $(TESTS)
|
||||||
|
8
tests/pp/12.S
Normal file
8
tests/pp/12.S
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#define SRC(y...) \
|
||||||
|
9999: y; \
|
||||||
|
.section __ex_table, "a"; \
|
||||||
|
.long 9999b, 6001f ; \
|
||||||
|
// .previous
|
||||||
|
|
||||||
|
SRC(1: movw (%esi), %bx)
|
||||||
|
6001:
|
2
tests/pp/12.expect
Normal file
2
tests/pp/12.expect
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
9999: 1: movw (%esi), %bx; .section __ex_table, "a"; .long 9999b, 6001f ;
|
||||||
|
6001:
|
@ -7,6 +7,7 @@ include $(TOP)/Makefile
|
|||||||
|
|
||||||
TCC = $(TOP)/tcc
|
TCC = $(TOP)/tcc
|
||||||
TESTS = $(patsubst %.c,%.test,$(wildcard *.c))
|
TESTS = $(patsubst %.c,%.test,$(wildcard *.c))
|
||||||
|
TESTS += $(patsubst %.S,%.test,$(wildcard *.S))
|
||||||
|
|
||||||
ifdef CONFIG_WIN32
|
ifdef CONFIG_WIN32
|
||||||
TCC = $(top_srcdir)/win32/tcc
|
TCC = $(top_srcdir)/win32/tcc
|
||||||
@ -20,10 +21,19 @@ all test : $(TESTS)
|
|||||||
diff -Nu -b -B -I "^#" $(EXTRA_DIFF_OPTS) $*.expect $*.output \
|
diff -Nu -b -B -I "^#" $(EXTRA_DIFF_OPTS) $*.expect $*.output \
|
||||||
&& rm -f $*.output
|
&& rm -f $*.output
|
||||||
|
|
||||||
|
%.test: %.S %.expect
|
||||||
|
@echo PPTest $* ...
|
||||||
|
@$(TCC) -E -P $< >$*.output 2>&1 ; \
|
||||||
|
diff -Nu -b -B -I "^#" $(EXTRA_DIFF_OPTS) $*.expect $*.output \
|
||||||
|
&& rm -f $*.output
|
||||||
|
|
||||||
# automatically generate .expect files with gcc:
|
# automatically generate .expect files with gcc:
|
||||||
%.expect :
|
%.expect: %.c
|
||||||
gcc -E -P $*.c >$*.expect 2>&1
|
gcc -E -P $*.c >$*.expect 2>&1
|
||||||
|
|
||||||
|
%.expect: %.S
|
||||||
|
gcc -E -P $*.S >$*.expect 2>&1
|
||||||
|
|
||||||
# tell make not to delete
|
# tell make not to delete
|
||||||
.PRECIOUS: %.expect
|
.PRECIOUS: %.expect
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user