Message ID | 53DFD350.6080701@ramsay1.demon.co.uk (mailing list archive) |
---|---|
State | Mainlined, archived |
Headers | show |
On Tue, Aug 5, 2014 at 2:39 AM, Ramsay Jones <ramsay@ramsay1.demon.co.uk> wrote: > > Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk> May I have a more descriptive change log why is multiarch option useful? > @@ -36,6 +36,9 @@ HAVE_LLVM:=$(shell $(LLVM_CONFIG) --version >/dev/null 2>&1 && echo 'yes') > GCC_BASE = $(shell $(CC) --print-file-name=) > BASIC_CFLAGS = -DGCC_BASE=\"$(GCC_BASE)\" > > +MULTIARCH_TRIPLET = $(shell $(CC) -print-multiarch 2>/dev/null) > +BASIC_CFLAGS += -DMULTIARCH_TRIPLET=\"$(MULTIARCH_TRIPLET)\" My gcc(4.8, FC20) does not support "-print-multiarch". So the patch need to handle that case. As far as I can tell, this patch is not ready for empty MULTIARCH_TRIPLET. > + if (multiarch_dir && *multiarch_dir) { > + add_pre_buffer("#add_system \"/usr/include/%s\"\n", multiarch_dir); > + add_pre_buffer("#add_system \"/usr/local/include/%s\"\n", multiarch_dir); > + } Not sure empty multiarch_dir works here. Chris -- To unsubscribe from this list: send the line "unsubscribe linux-sparse" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 06/10/14 00:33, Christopher Li wrote: > On Tue, Aug 5, 2014 at 2:39 AM, Ramsay Jones <ramsay@ramsay1.demon.co.uk> wrote: >> >> Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk> > > May I have a more descriptive change log why is multiarch option useful? > >> @@ -36,6 +36,9 @@ HAVE_LLVM:=$(shell $(LLVM_CONFIG) --version >/dev/null 2>&1 && echo 'yes') >> GCC_BASE = $(shell $(CC) --print-file-name=) >> BASIC_CFLAGS = -DGCC_BASE=\"$(GCC_BASE)\" >> >> +MULTIARCH_TRIPLET = $(shell $(CC) -print-multiarch 2>/dev/null) >> +BASIC_CFLAGS += -DMULTIARCH_TRIPLET=\"$(MULTIARCH_TRIPLET)\" > > My gcc(4.8, FC20) does not support "-print-multiarch". Yep, same is true for cygwin. > So the patch need to handle that case. > As far as I can tell, this patch is not ready for empty MULTIARCH_TRIPLET. Hmm, works for me! Could you describe the failure you are seeing. > >> + if (multiarch_dir && *multiarch_dir) { >> + add_pre_buffer("#add_system \"/usr/include/%s\"\n", multiarch_dir); >> + add_pre_buffer("#add_system \"/usr/local/include/%s\"\n", multiarch_dir); >> + } > > Not sure empty multiarch_dir works here. Again, it works for me. :-D ATB, Ramsay Jones -- To unsubscribe from this list: send the line "unsubscribe linux-sparse" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Mon, Oct 6, 2014 at 6:31 PM, Ramsay Jones <ramsay@ramsay1.demon.co.uk> wrote: > On 06/10/14 00:33, Christopher Li wrote: >> My gcc(4.8, FC20) does not support "-print-multiarch". > > Yep, same is true for cygwin. I see, I thought your patch is expecting some thing from gcc. Then how to you test this code path? >> >>> + if (multiarch_dir && *multiarch_dir) { >>> + add_pre_buffer("#add_system \"/usr/include/%s\"\n", multiarch_dir); >>> + add_pre_buffer("#add_system \"/usr/local/include/%s\"\n", multiarch_dir); >>> + } >> > Again, it works for me. :-D So I guess multiarch_dir can be empty here. I just did not expect that. Is it always prefix with "/usr/include/" and "/usr/local/include" for different distributions? Chris -- To unsubscribe from this list: send the line "unsubscribe linux-sparse" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 07/10/14 04:55, Christopher Li wrote: > On Mon, Oct 6, 2014 at 6:31 PM, Ramsay Jones <ramsay@ramsay1.demon.co.uk> wrote: >> On 06/10/14 00:33, Christopher Li wrote: >>> My gcc(4.8, FC20) does not support "-print-multiarch". >> >> Yep, same is true for cygwin. > > I see, I thought your patch is expecting some thing from gcc. > Then how to you test this code path? Well, I slightly mis-spoke. Of the two cygwin installations I have, one has a version of gcc which supports '-print-multiarch' and one doesn't (i.e. it isn't really the version of cygwin, but gcc that seems to matter). In any case, cygwin is not a "multiarch" system, so on my 64-bit cygwin installation 'gcc -print-multiarch' prints a blank line (ie an empty string) and exits with 0 status. On my old 32-bit cygwin installation (if memory serves me correctly) then gcc prints an error message and exits with non-zero status. This patch is old enough that it was originally tested on my old cygwin installation (this patch was developed on my old laptop), so I haven't tested there for some time. However, before sending this series I distinctly remember simulating this on 64-bit cygwin by editing the Makefile and changing the '-print-multiarch' option to '-print-junk', which _should_ have the same effect. [ie the $(MULTIARCH_TRIPLET) make variable should be set to the empty string on your FC20 system.] > >>> >>>> + if (multiarch_dir && *multiarch_dir) { >>>> + add_pre_buffer("#add_system \"/usr/include/%s\"\n", multiarch_dir); >>>> + add_pre_buffer("#add_system \"/usr/local/include/%s\"\n", multiarch_dir); >>>> + } >>> >> Again, it works for me. :-D > > So I guess multiarch_dir can be empty here. I just did not expect > that. Yes, indeed this _must_ be empty on non-multiarch systems. [This was developed on Ubuntu, which is a multiarch system (and I'm now on Linux Mint 17, which is also). Until now, I didn't know that Fedora was not! :-D ] > > Is it always prefix with "/usr/include/" and "/usr/local/include" for > different distributions? I can't quite remember how I came up with this list (it was a while ago), but I think I had a look at the gcc source code. (Hmm, don't quote me on that! ;-) ). ATB, Ramsay Jones -- To unsubscribe from this list: send the line "unsubscribe linux-sparse" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/Makefile b/Makefile index 1795905..36061e3 100644 --- a/Makefile +++ b/Makefile @@ -36,6 +36,9 @@ HAVE_LLVM:=$(shell $(LLVM_CONFIG) --version >/dev/null 2>&1 && echo 'yes') GCC_BASE = $(shell $(CC) --print-file-name=) BASIC_CFLAGS = -DGCC_BASE=\"$(GCC_BASE)\" +MULTIARCH_TRIPLET = $(shell $(CC) -print-multiarch 2>/dev/null) +BASIC_CFLAGS += -DMULTIARCH_TRIPLET=\"$(MULTIARCH_TRIPLET)\" + ifeq ($(HAVE_GCC_DEP),yes) BASIC_CFLAGS += -Wp,-MD,$(@D)/.$(@F).d endif diff --git a/cgcc b/cgcc index c075e5f..ed35e39 100755 --- a/cgcc +++ b/cgcc @@ -11,6 +11,7 @@ my $gendeps = 0; my $do_check = 0; my $do_compile = 1; my $gcc_base_dir; +my $multiarch_dir; my $verbose = 0; while (@ARGV) { @@ -44,6 +45,12 @@ while (@ARGV) { next; } + if (/^-multiarch-dir$/) { + $multiarch_dir = shift @ARGV; + die ("$0: missing argument for -multiarch-dir option") if !$multiarch_dir; + next; + } + # If someone adds "-E", don't pre-process twice. $do_compile = 0 if $_ eq '-E'; @@ -66,8 +73,11 @@ if ($do_check) { } $gcc_base_dir = qx($cc -print-file-name=) if !$gcc_base_dir; + chomp($gcc_base_dir); # possibly remove '\n' from compiler $check .= " -gcc-base-dir " . $gcc_base_dir if $gcc_base_dir; + $check .= " -multiarch-dir " . $multiarch_dir if $multiarch_dir; + print "$check\n" if $verbose; if ($do_compile) { system ($check); diff --git a/lib.c b/lib.c index 9c7767e..0b62dcb 100644 --- a/lib.c +++ b/lib.c @@ -59,6 +59,7 @@ int gcc_minor = __GNUC_MINOR__; int gcc_patchlevel = __GNUC_PATCHLEVEL__; static const char *gcc_base_dir = GCC_BASE; +static const char *multiarch_dir = MULTIARCH_TRIPLET; struct token *skip_to(struct token *token, int op) { @@ -363,6 +364,14 @@ static char **handle_switch_M(char *arg, char **next) return next; } +static char **handle_multiarch_dir(char *arg, char **next) +{ + multiarch_dir = *++next; + if (!multiarch_dir) + die("missing argument for -multiarch-dir option"); + return next; +} + static char **handle_switch_m(char *arg, char **next) { if (!strcmp(arg, "m64")) { @@ -371,7 +380,8 @@ static char **handle_switch_m(char *arg, char **next) arch_m64 = 0; } else if (!strcmp(arg, "msize-long")) { arch_msize_long = 1; - } + } else if (!strcmp(arg, "multiarch-dir")) + return handle_multiarch_dir(arg, next); return next; } @@ -881,6 +891,12 @@ void create_builtin_stream(void) add_pre_buffer("#weak_define __GNUC_MINOR__ %d\n", gcc_minor); add_pre_buffer("#weak_define __GNUC_PATCHLEVEL__ %d\n", gcc_patchlevel); + /* add the multiarch include directories, if any */ + if (multiarch_dir && *multiarch_dir) { + add_pre_buffer("#add_system \"/usr/include/%s\"\n", multiarch_dir); + add_pre_buffer("#add_system \"/usr/local/include/%s\"\n", multiarch_dir); + } + /* We add compiler headers path here because we have to parse * the arguments to get it, falling back to default. */ add_pre_buffer("#add_system \"%s/include\"\n", gcc_base_dir); diff --git a/sparse.1 b/sparse.1 index 54da09b..a305a21 100644 --- a/sparse.1 +++ b/sparse.1 @@ -335,6 +335,12 @@ Sparse does not issue these warnings by default. .B \-gcc-base-dir \fIdir\fR Look for compiler-provided system headers in \fIdir\fR/include/ and \fIdir\fR/include-fixed/. . +.TP +.B \-multiarch-dir \fIdir\fR +Look for system headers in the multiarch subdirectory \fIdir\fR. +The \fIdir\fR name would normally take the form of the target's +normalized GNU triplet. (e.g. i386-linux-gnu). +. .SH OTHER OPTIONS .TP .B \-ftabstop=WIDTH
Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk> --- Makefile | 3 +++ cgcc | 10 ++++++++++ lib.c | 18 +++++++++++++++++- sparse.1 | 6 ++++++ 4 files changed, 36 insertions(+), 1 deletion(-)