From: KOSAKI Motohiro <kosaki.motohiro@gmail.com>
To: Christopher Li <sparse@chrisli.org>
Cc: KOSAKI Motohiro <kosaki.motohiro@gmail.com>,
linux-sparse@vger.kernel.org
Subject: Re: [PATCH][RFC] handle -I and -include combination
Date: Sat, 30 Jun 2012 03:38:33 -0400 [thread overview]
Message-ID: <4FEEACF9.4060701@gmail.com> (raw)
In-Reply-To: <CANeU7QmVqaQVKEc-9O28J8Z5Hvy20DYffqVz7yHknoouHVC+fQ@mail.gmail.com>
(6/29/12 8:27 PM), Christopher Li wrote:
> On Wed, Jun 27, 2012 at 10:55 AM, KOSAKI Motohiro
> <kosaki.motohiro@gmail.com> 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@gmail.com>
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@gmail.com>
---
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;
-
prev parent reply other threads:[~2012-06-30 7:38 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-06-18 12:40 [PATCH][RFC] handle -I and -include combination kosaki.motohiro
2012-06-26 7:52 ` Christopher Li
2012-06-27 17:55 ` KOSAKI Motohiro
2012-06-30 0:27 ` Christopher Li
2012-06-30 7:38 ` KOSAKI Motohiro [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4FEEACF9.4060701@gmail.com \
--to=kosaki.motohiro@gmail.com \
--cc=linux-sparse@vger.kernel.org \
--cc=sparse@chrisli.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.