From 4ca9eaebfb283441c3a8398ff190b8e8e13b21eb Mon Sep 17 00:00:00 2001 From: David Peixotto Date: Thu, 14 Nov 2013 22:52:58 +0000 Subject: [PATCH] Pass -Wa,-I and -Xassembler -I args to integrated assembler This patch adds -I to the arguments that are passed to the integrated assembler from -Wa, and -Xassembler args. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@194743 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Driver/Tools.cpp | 18 ++++++++++++++++++ test/Driver/integrated-as.s | 21 +++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 9027f70c3c..86faf0da7b 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -1707,6 +1707,13 @@ static void CollectArgsForIntegratedAssembler(Compilation &C, if (UseRelaxAll(C, Args)) CmdArgs.push_back("-mrelax-all"); + // When passing -I arguments to the assembler we sometimes need to + // uncontionally take the next argument. For example, when parsing + // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the + // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo' + // arg after parsing the '-I' arg. + bool TakeNextArg = false; + // When using an integrated assembler, translate -Wa, and -Xassembler // options. for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA, @@ -1717,6 +1724,11 @@ static void CollectArgsForIntegratedAssembler(Compilation &C, for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) { StringRef Value = A->getValue(i); + if (TakeNextArg) { + CmdArgs.push_back(Value.data()); + TakeNextArg = false; + continue; + } if (Value == "-force_cpusubtype_ALL") { // Do nothing, this is the default and we don't support anything else. @@ -1727,6 +1739,12 @@ static void CollectArgsForIntegratedAssembler(Compilation &C, CmdArgs.push_back("-fatal-assembler-warnings"); } else if (Value == "--noexecstack") { CmdArgs.push_back("-mnoexecstack"); + } else if (Value.startswith("-I")) { + CmdArgs.push_back(Value.data()); + // We need to consume the next argument if the current arg is a plain + // -I. The next arg will be the include directory. + if (Value == "-I") + TakeNextArg = true; } else { D.Diag(diag::err_drv_unsupported_option_argument) << A->getOption().getName() << Value; diff --git a/test/Driver/integrated-as.s b/test/Driver/integrated-as.s index 51ce31cc51..0843cf9345 100644 --- a/test/Driver/integrated-as.s +++ b/test/Driver/integrated-as.s @@ -10,3 +10,24 @@ // RUN: %clang -### -target x86_64-linux-gnu -c -integrated-as %s -fsanitize=address 2>&1 %s | FileCheck --check-prefix=SANITIZE %s // SANITIZE: argument unused during compilation: '-fsanitize=address' + +// Test that -I params in -Wa, and -Xassembler args are passed to integrated assembler +// RUN: %clang -### -c -integrated-as %s -Wa,-I,foo_dir 2>&1 %s | FileCheck --check-prefix=WA_INCLUDE1 %s +// WA_INCLUDE1: cc1as +// WA_INCLUDE1: "-I" "foo_dir" + +// RUN: %clang -### -c -integrated-as %s -Wa,-Ifoo_dir 2>&1 %s | FileCheck --check-prefix=WA_INCLUDE2 %s +// WA_INCLUDE2: cc1as +// WA_INCLUDE2: "-Ifoo_dir" + +// RUN: %clang -### -c -integrated-as %s -Wa,-I -Wa,foo_dir 2>&1 %s | FileCheck --check-prefix=WA_INCLUDE3 %s +// WA_INCLUDE3: cc1as +// WA_INCLUDE3: "-I" "foo_dir" + +// RUN: %clang -### -c -integrated-as %s -Xassembler -I -Xassembler foo_dir 2>&1 %s | FileCheck --check-prefix=XA_INCLUDE1 %s +// XA_INCLUDE1: cc1as +// XA_INCLUDE1: "-I" "foo_dir" + +// RUN: %clang -### -c -integrated-as %s -Xassembler -Ifoo_dir 2>&1 %s | FileCheck --check-prefix=XA_INCLUDE2 %s +// XA_INCLUDE2: cc1as +// XA_INCLUDE2: "-Ifoo_dir" -- 2.40.0