r268777 - Frontend: support -I=path for sysroot expansion

Sean Silva via cfe-commits cfe-commits at lists.llvm.org
Tue May 10 00:58:53 PDT 2016


Do we also handle ':'? The corresponding behavior in the linker is in:
http://llvm.org/klaus/lld/blob/master/ELF/DriverUtils.cpp#L-232

-- Sean Silva

On Fri, May 6, 2016 at 12:13 PM, Saleem Abdulrasool via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Author: compnerd
> Date: Fri May  6 14:13:55 2016
> New Revision: 268777
>
> URL: http://llvm.org/viewvc/llvm-project?rev=268777&view=rev
> Log:
> Frontend: support -I=path for sysroot expansion
>
> From the GCC manpage:
>
>   -I dir
>     ... If dir begins with =, then the = will be replaced by the sysroot
> prefix;
>     see --sysroot and -isysroot.
>
> Add support to expand the `=` as a prefix of the include path with the
> sysroot
> if specified.  `-isysroot` takes precedence over `--sysroot` as the normal
> argument behaviour occurs.  The ordering of the `-isysroot` is relevant to
> the
> path substituted.  If no `--sysroot=` or `-isysroot` option is present,
> the = is
> not expanded.
>
> Resolves PR26965!
>
> Added:
>     cfe/trunk/test/Preprocessor/sysroot-prefix.c
> Modified:
>     cfe/trunk/lib/Frontend/CompilerInvocation.cpp
>
> Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=268777&r1=268776&r2=268777&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)
> +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Fri May  6 14:13:55 2016
> @@ -1278,6 +1278,8 @@ static void ParseHeaderSearchArgs(Header
>
>    // Add -I..., -F..., and -index-header-map options in order.
>    bool IsIndexHeaderMap = false;
> +  bool IsSysrootSpecified =
> +      Args.hasArg(OPT__sysroot_EQ) || Args.hasArg(OPT_isysroot);
>    for (const Arg *A : Args.filtered(OPT_I, OPT_F, OPT_index_header_map)) {
>      if (A->getOption().matches(OPT_index_header_map)) {
>        // -index-header-map applies to the next -I or -F.
> @@ -1288,8 +1290,18 @@ static void ParseHeaderSearchArgs(Header
>      frontend::IncludeDirGroup Group =
>          IsIndexHeaderMap ? frontend::IndexHeaderMap : frontend::Angled;
>
> -    Opts.AddPath(A->getValue(), Group,
> -                 /*IsFramework=*/A->getOption().matches(OPT_F), true);
> +    bool IsFramework = A->getOption().matches(OPT_F);
> +    std::string Path = A->getValue();
> +
> +    if (IsSysrootSpecified && !IsFramework && A->getValue()[0] == '=') {
> +      SmallString<32> Buffer;
> +      llvm::sys::path::append(Buffer, Opts.Sysroot,
> +                              llvm::StringRef(A->getValue()).substr(1));
> +      Path = Buffer.str();
> +    }
> +
> +    Opts.AddPath(Path.c_str(), Group, IsFramework,
> +                 /*IgnoreSysroot*/ true);
>      IsIndexHeaderMap = false;
>    }
>
>
> Added: cfe/trunk/test/Preprocessor/sysroot-prefix.c
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Preprocessor/sysroot-prefix.c?rev=268777&view=auto
>
> ==============================================================================
> --- cfe/trunk/test/Preprocessor/sysroot-prefix.c (added)
> +++ cfe/trunk/test/Preprocessor/sysroot-prefix.c Fri May  6 14:13:55 2016
> @@ -0,0 +1,28 @@
> +// RUN: %clang_cc1 -v -isysroot /var/empty -I /dev/null -E %s -o
> /dev/null 2>&1 | FileCheck -check-prefix CHECK-ISYSROOT_NO_SYSROOT %s
> +// RUN: %clang_cc1 -v -isysroot /var/empty -I =/dev/null -E %s -o
> /dev/null 2>&1 | FileCheck -check-prefix CHECK-ISYSROOT_SYSROOT_DEV_NULL %s
> +// RUN: %clang_cc1 -v -I =/dev/null -E %s -o /dev/null 2>&1 | FileCheck
> -check-prefix CHECK-NO_ISYSROOT_SYSROOT_DEV_NULL %s
> +// RUN: %clang_cc1 -v -isysroot /var/empty -I =null -E %s -o /dev/null
> 2>&1 | FileCheck -check-prefix CHECK-ISYSROOT_SYSROOT_NULL %s
> +// RUN: %clang_cc1 -v -isysroot /var/empty -isysroot /var/empty/root -I
> =null -E %s -o /dev/null 2>&1 | FileCheck -check-prefix
> CHECK-ISYSROOT_ISYSROOT_SYSROOT_NULL %s
> +// RUN: %clang_cc1 -v -isysroot /var/empty/root -isysroot /var/empty -I
> =null -E %s -o /dev/null 2>&1 | FileCheck -check-prefix
> CHECK-ISYSROOT_ISYSROOT_SWAPPED_SYSROOT_NULL %s
> +
> +// CHECK-ISYSROOT_NO_SYSROOT: ignoring nonexistent directory "/dev/null"
> +// CHECK-ISYSROOT_NO_SYSROOT-NOT: ignoring nonexistent directory
> "/var/empty/dev/null"
> +
> +// CHECK-NO_ISYSROOT_SYSROOT_DEV_NULL: ignoring nonexistent directory
> "=/dev/null"
> +// CHECK-NO_ISYSROOT_SYSROOT_DEV_NULL-NOT: ignoring nonexistent directory
> "/dev/null"
> +
> +// CHECK-ISYSROOT_SYSROOT_DEV_NULL: ignoring nonexistent directory
> "/var/empty/dev/null"
> +// CHECK-ISYSROOT_SYSROOT_DEV_NULL-NOT: ignoring nonexistent directory
> "/dev/null"
> +
> +// CHECK-NO_ISYSROOT_SYSROOT: ignoring nonexistent directory "=/dev/null"
> +// CHECK-NO_ISYSROOT_SYSROOT-NOT: ignoring nonexistent directory
> "/var/empty/dev/null"
> +
> +// CHECK-ISYSROOT_SYSROOT_NULL: ignoring nonexistent directory
> "/var/empty/null"
> +// CHECK-ISYSROOT_SYSROOT_NULL-NOT: ignoring nonexistent directory "=null"
> +
> +// CHECK-ISYSROOT_ISYSROOT_SYSROOT_NULL: ignoring nonexistent directory
> "/var/empty/root/null"
> +// CHECK-ISYSROOT_ISYSROOT_SYSROOT_NULL-NOT: ignoring nonexistent
> directory "=null"
> +
> +// CHECK-ISYSROOT_ISYSROOT_SWAPPED_SYSROOT_NULL: ignoring nonexistent
> directory "/var/empty/null"
> +// CHECK-ISYSROOT_ISYSROOT_SWAPPED_SYSROOT_NULL-NOT: ignoring nonexistent
> directory "=null"
> +
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160510/fb68f1ec/attachment-0001.html>


More information about the cfe-commits mailing list