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@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@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits