(6/29/12 8:27 PM), Christopher Li wrote: > On Wed, Jun 27, 2012 at 10:55 AM, KOSAKI Motohiro > <kosaki.motohiro@xxxxxxxxx> wrote: >> If I understand correctly, cmdline_include is only used from -include >> and -imacro. and, -imacro is also needed to respect -I. Am I missing >> something? > > Actually, I misread your patch. You patch function fine. > The only thing I might change is the name of the "pre_buffer2". > If this buffer is only use by the include files, we might just all it > include_buffer or some thing like that. Let me know if you want to > resend one with a better name, or I can patch it for you. > > Thanks for the patch. That will get rid of the static array as well. > Nice. Thanks. done. >From e4f94099b1f01910cf2de10667c12cdf872a6522 Mon Sep 17 00:00:00 2001 From: KOSAKI Motohiro <kosaki.motohiro@xxxxxxxxx> Date: Mon, 18 Jun 2012 08:04:26 -0400 Subject: [PATCH] handle -I and -include combination Currently, "-include" behavior is far different between sparse and gcc. gcc can compile following testcase. but sparse can't. This patch fixes it. =================================================== Makefile -------------- bar: $(CC) -I./include-for-foo -include foo.h main.c -o bar main.c ------------------ #include <stdio.h> int main(void) { printf("foo = %d¥n", FOO); return 0; } include-for-foo/foo.h ---------------------- #define FOO 42 =================================================== Signed-off-by: KOSAKI Motohiro <kosaki.motohiro@xxxxxxxxx> --- lib.c | 52 ++++++++++++++++++++++++---------------------------- lib.h | 9 --------- 2 files changed, 24 insertions(+), 37 deletions(-) diff --git a/lib.c b/lib.c index 396e9f1..c698fa1 100644 --- a/lib.c +++ b/lib.c @@ -189,6 +189,8 @@ void die(const char *fmt, ...) static struct token *pre_buffer_begin = NULL; static struct token *pre_buffer_end = NULL; +static struct token *include_buffer_begin = NULL; +static struct token *include_buffer_end = NULL; int Waddress_space = 1; int Wbitwise = 0; @@ -224,11 +226,6 @@ static enum { STANDARD_C89, STANDARD_GNU89, STANDARD_GNU99, } standard = STANDARD_GNU89; -#define CMDLINE_INCLUDE 20 -int cmdline_include_nr = 0; -struct cmdline_include cmdline_include[CMDLINE_INCLUDE]; - - void add_pre_buffer(const char *fmt, ...) { va_list args; @@ -247,6 +244,24 @@ void add_pre_buffer(const char *fmt, ...) pre_buffer_end = end; } +void add_include_buffer(const char *fmt, ...) +{ + va_list args; + unsigned int size; + struct token *begin, *end; + char buffer[4096]; + + va_start(args, fmt); + size = vsnprintf(buffer, sizeof(buffer), fmt, args); + va_end(args); + begin = tokenize_buffer(buffer, size, &end); + if (!include_buffer_begin) + include_buffer_begin = begin; + if (include_buffer_end) + include_buffer_end->next = begin; + include_buffer_end = end; +} + static char **handle_switch_D(char *arg, char **next) { const char *name = arg + 1; @@ -299,16 +314,7 @@ static char **handle_switch_I(char *arg, char **next) static void add_cmdline_include(char *filename) { - int fd = open(filename, O_RDONLY); - if (fd < 0) { - perror(filename); - return; - } - if (cmdline_include_nr >= CMDLINE_INCLUDE) - die("too many include files for %s¥n", filename); - cmdline_include[cmdline_include_nr].filename = filename; - cmdline_include[cmdline_include_nr].fd = fd; - cmdline_include_nr++; + add_include_buffer("#include ¥"%s¥"¥n", filename); } static char **handle_switch_i(char *arg, char **next) @@ -892,19 +898,9 @@ static struct symbol_list *sparse_file(const char *filename) */ static struct symbol_list *sparse_initial(void) { - struct token *token; - int i; - - // Prepend any "include" file to the stream. - // We're in global scope, it will affect all files! - token = NULL; - for (i = cmdline_include_nr - 1; i >= 0; i--) - token = tokenize(cmdline_include[i].filename, cmdline_include[i].fd, - token, includepath); - - // Prepend the initial built-in stream - if (token) - pre_buffer_end->next = token; + if (include_buffer_begin) + pre_buffer_end->next = include_buffer_begin; + return sparse_tokenstream(pre_buffer_begin); } diff --git a/lib.h b/lib.h index 2cea252..ee954fe 100644 --- a/lib.h +++ b/lib.h @@ -41,15 +41,6 @@ struct position { noexpand:1; }; -struct cmdline_include { - char *filename; - int fd; -}; - -extern struct cmdline_include cmdline_include[]; -extern int cmdline_include_nr; - - struct ident; struct token; struct symbol; -- 1.7.1 -- To unsubscribe from this list: send the line "unsubscribe linux-sparse" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html