1 macro_push and macro_pop work I made a mistake, no matter the definition does not define can be macro_push.

And the modified tcctest.c test
2, pack: in the compiler under the mode of s1->ppfp, I have no clear ideas1->ppfp
Some advice thank you Roy to me.This patch, I hope I can pass the Roy test
This commit is contained in:
jiang 2014-05-17 00:55:02 +08:00
parent 276553c6b2
commit 196c999515
3 changed files with 40 additions and 32 deletions

1
tcc.h
View File

@ -1132,7 +1132,6 @@ ST_DATA TokenSym **table_ident;
returned at eof */ returned at eof */
#define PARSE_FLAG_ASM_COMMENTS 0x0008 /* '#' can be used for line comment */ #define PARSE_FLAG_ASM_COMMENTS 0x0008 /* '#' can be used for line comment */
#define PARSE_FLAG_SPACES 0x0010 /* next() returns space tokens (for -E) */ #define PARSE_FLAG_SPACES 0x0010 /* next() returns space tokens (for -E) */
#define PARSE_FLAG_PACK 0x0020 /* #pragma pack */
ST_FUNC TokenSym *tok_alloc(const char *str, int len); ST_FUNC TokenSym *tok_alloc(const char *str, int len);
ST_FUNC char *get_tok_str(int v, CValue *cv); ST_FUNC char *get_tok_str(int v, CValue *cv);

27
tccpp.c
View File

@ -1627,7 +1627,7 @@ skip:
break; break;
case TOK_PRAGMA: case TOK_PRAGMA:
next(); next();
if (tok == TOK_pack && parse_flags & PARSE_FLAG_PACK) { if (tok == TOK_pack && s1->output_type != TCC_OUTPUT_PREPROCESS) {
/* /*
This may be: This may be:
#pragma pack(1) // set #pragma pack(1) // set
@ -1736,32 +1736,29 @@ pack_error:
def = &ts->sym_define; def = &ts->sym_define;
if(t == TOK_PUSH_MACRO){ if(t == TOK_PUSH_MACRO){
void *tmp = def->data[def->off]; void *tmp = def->data[def->off];
if(tmp){ def->off++;
def->off++; if(def->off >= def->size){
if(def->off >= def->size){ int size = def->size;
int size = def->size; size *= 2;
size *= 2; if (size > MACRO_STACK_SIZE)
if (size > MACRO_STACK_SIZE) tcc_error("stack full");
tcc_error("stack full"); def->data = tcc_realloc(def->data, size*sizeof(Sym*));
def->data = tcc_realloc(def->data, size*sizeof(Sym*)); def->size = size;
def->size = size;
}
def->data[def->off] = tmp;
} }
def->data[def->off] = tmp;
}else{ }else{
if(def->off){ if(def->off){
--def->off; --def->off;
}else{
tcc_warning("stack empty");
} }
} }
} }
}else{ }else if(s1->output_type == TCC_OUTPUT_PREPROCESS){
fputs("#pragma ", s1->ppfp); fputs("#pragma ", s1->ppfp);
while (tok != TOK_LINEFEED){ while (tok != TOK_LINEFEED){
fputs(get_tok_str(tok, &tokc), s1->ppfp); fputs(get_tok_str(tok, &tokc), s1->ppfp);
next(); next();
} }
fputs("\n", s1->ppfp);
goto the_end; goto the_end;
} }
break; break;

View File

@ -379,34 +379,46 @@ comment
/* And again when the name and parenthes are separated by a /* And again when the name and parenthes are separated by a
comment. */ comment. */
TEST2 /* the comment */ (); TEST2 /* the comment */ ();
/* macro_push and macro_pop test */ /* macro_push and macro_pop test */
#define MACRO_TEST "macro_test1\n"
#pragma push_macro("MACRO_TEST")
printf(MACRO_TEST);
#undef MACRO_TEST #undef MACRO_TEST
#ifdef MACRO_TEST
printf("define MACRO_TEST\n");
#else
printf("undef MACRO_TEST\n");
#endif
#define MACRO_TEST "macro_test2\n"
#pragma push_macro("MACRO_TEST") #pragma push_macro("MACRO_TEST")
printf(MACRO_TEST); #define MACRO_TEST
#undef MACRO_TEST
#define MACRO_TEST "macro_test3\n"
#pragma push_macro("MACRO_TEST") #pragma push_macro("MACRO_TEST")
printf(MACRO_TEST);
#undef MACRO_TEST
#define MACRO_TEST "macro_test4\n"
printf(MACRO_TEST);
#undef MACRO_TEST #undef MACRO_TEST
#pragma push_macro("MACRO_TEST")
#pragma pop_macro("MACRO_TEST") #pragma pop_macro("MACRO_TEST")
printf(MACRO_TEST); #ifdef MACRO_TEST
printf("define MACRO_TEST\n");
#else
printf("undef MACRO_TEST\n");
#endif
#pragma pop_macro("MACRO_TEST") #pragma pop_macro("MACRO_TEST")
printf(MACRO_TEST); #ifdef MACRO_TEST
printf("define MACRO_TEST\n");
#else
printf("undef MACRO_TEST\n");
#endif
#pragma pop_macro("MACRO_TEST") #pragma pop_macro("MACRO_TEST")
printf(MACRO_TEST); #ifdef MACRO_TEST
printf("define MACRO_TEST\n");
#else
printf("undef MACRO_TEST\n");
#endif
/* pack test */
#pragma pack(push,8)
#pragma pack(pop)
/* gcc does not support /* gcc does not support
#define MACRO_TEST_MACRO "MACRO_TEST" #define MACRO_TEST_MACRO "MACRO_TEST"
#pragma push_macro(MACRO_TEST_MACRO) #pragma push_macro(MACRO_TEST_MACRO)