From 2025c1131f3be73c2b906400bae3c7cc0d43e4f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Fri, 16 Apr 2021 13:30:47 +0300 Subject: [PATCH] [llvm-rc] Fix handling of the /X option to match its documentation and rc.exe This matches how it's documented in the option listing. Differential Revision: https://reviews.llvm.org/D100754 --- test/tools/llvm-rc/include-paths.test | 10 ++++++++++ tools/llvm-rc/ResourceFileWriter.cpp | 9 +++++---- tools/llvm-rc/ResourceFileWriter.h | 2 +- tools/llvm-rc/llvm-rc.cpp | 2 +- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/test/tools/llvm-rc/include-paths.test b/test/tools/llvm-rc/include-paths.test index 6acc967af94..0097ae88e1d 100644 --- a/test/tools/llvm-rc/include-paths.test +++ b/test/tools/llvm-rc/include-paths.test @@ -13,6 +13,16 @@ ; RUN: llvm-rc /FO %t.nested-include.res /I %p/Inputs/nested -- %p/Inputs/deep-include.rc ; RUN: llvm-readobj %t.nested-include.res | FileCheck --check-prefix=FOUND %s +; The include dir can be specified via the INCLUDE env var too. +; RUN: rm -f %t.nested-include.res +; RUN: env INCLUDE=%p/Inputs/nested llvm-rc /FO %t.nested-include.res -- %p/Inputs/deep-include.rc +; RUN: llvm-readobj %t.nested-include.res | FileCheck --check-prefix=FOUND %s + +; Specifying the /X option should make it ignore the INCLUDE variable. +; RUN: rm -f %t.nested-include.res +; RUN: not env INCLUDE=%p/Inputs/nested llvm-rc /X /FO %t.nested-include.res -- %p/Inputs/deep-include.rc 2>&1 \ +; RUN: | FileCheck --check-prefix=MISSING %s + ; Otherwise, it should not find the bitmap. ; RUN: rm -f %t.nested-include.res ; RUN: not llvm-rc /FO %t.nested-include.res -- %p/Inputs/deep-include.rc 2>&1 \ diff --git a/tools/llvm-rc/ResourceFileWriter.cpp b/tools/llvm-rc/ResourceFileWriter.cpp index 2856fa8fe08..0c922698f57 100644 --- a/tools/llvm-rc/ResourceFileWriter.cpp +++ b/tools/llvm-rc/ResourceFileWriter.cpp @@ -1553,10 +1553,11 @@ ResourceFileWriter::loadFile(StringRef File) const { Path, /*IsText=*/false, /*RequiresNullTerminator=*/false)); } - if (auto Result = - llvm::sys::Process::FindInEnvPath("INCLUDE", File, Params.NoInclude)) - return errorOrToExpected(MemoryBuffer::getFile( - *Result, /*IsText=*/false, /*RequiresNullTerminator=*/false)); + if (!Params.NoInclude) { + if (auto Result = llvm::sys::Process::FindInEnvPath("INCLUDE", File)) + return errorOrToExpected(MemoryBuffer::getFile( + *Result, /*IsText=*/false, /*RequiresNullTerminator=*/false)); + } return make_error("error : file not found : " + Twine(File), inconvertibleErrorCode()); diff --git a/tools/llvm-rc/ResourceFileWriter.h b/tools/llvm-rc/ResourceFileWriter.h index d545a7a9cab..0f3d5937259 100644 --- a/tools/llvm-rc/ResourceFileWriter.h +++ b/tools/llvm-rc/ResourceFileWriter.h @@ -35,7 +35,7 @@ enum CodePage { struct WriterParams { std::vector Include; // Additional folders to search for files. - std::vector NoInclude; // Folders to exclude from file search. + bool NoInclude; // Ignore the INCLUDE variable. StringRef InputFilePath; // The full path of the input file. int CodePage = CpAcp; // The codepage for interpreting characters. }; diff --git a/tools/llvm-rc/llvm-rc.cpp b/tools/llvm-rc/llvm-rc.cpp index e9027a21d46..2007ef903c7 100644 --- a/tools/llvm-rc/llvm-rc.cpp +++ b/tools/llvm-rc/llvm-rc.cpp @@ -142,7 +142,7 @@ int main(int Argc, const char **Argv) { llvm::sys::fs::make_absolute(InputFile); Params.InputFilePath = InputFile; Params.Include = InputArgs.getAllArgValues(OPT_includepath); - Params.NoInclude = InputArgs.getAllArgValues(OPT_noinclude); + Params.NoInclude = InputArgs.hasArg(OPT_noinclude); if (InputArgs.hasArg(OPT_codepage)) { if (InputArgs.getLastArgValue(OPT_codepage)