From: David Peixotto Date: Fri, 6 Dec 2013 20:27:33 +0000 (+0000) Subject: Add option to use temporary file for assembling with clang X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d27975a1381bb92337e06397f8ee2d9f712c3667;p=clang Add option to use temporary file for assembling with clang This commit adds the flag '-via-file-asm' to the clang driver. The purpose of this flag is to have a way to test that clang can consume the assembly code that it outputs. When passed this flag, clang will generate a temporary file that contains the assembly output from the compile step. This assembly file will then be consumed by either the integrated assembler or the external assembler. To test that the integrated assembler can consume its own output compile with: $ clang -integrated-assembler -via-file-asm Without the '-via-file-asm' flag, clang would directly create the object file when using the integrated assembler. With the flag it will first create the temporary assembly file and then read that file and assemble it with the integrated assembler. The flow is similar to -save-temps, except that it only effects the assembly input and the temporary file is not saved. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@196606 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td index f80069591a..34641722af 100644 --- a/include/clang/Driver/Options.td +++ b/include/clang/Driver/Options.td @@ -1230,6 +1230,8 @@ def rtlib_EQ : Joined<["-", "--"], "rtlib=">; def r : Flag<["-"], "r">; def save_temps : Flag<["-", "--"], "save-temps">, Flags<[DriverOption]>, HelpText<"Save intermediate compilation results">; +def via_file_asm : Flag<["-", "--"], "via-file-asm">, Flags<[DriverOption]>, + HelpText<"Write assembly to file for input to assemble jobs">; def sectalign : MultiArg<["-"], "sectalign", 3>; def sectcreate : MultiArg<["-"], "sectcreate", 3>; def sectobjectsymbols : MultiArg<["-"], "sectobjectsymbols", 2>; diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp index d4a2e47048..7826cb30fc 100644 --- a/lib/Driver/Driver.cpp +++ b/lib/Driver/Driver.cpp @@ -1456,6 +1456,7 @@ static const Tool *SelectToolForJob(Compilation &C, const ToolChain *TC, if (TC->useIntegratedAs() && !C.getArgs().hasArg(options::OPT_save_temps) && + !C.getArgs().hasArg(options::OPT_via_file_asm) && !C.getArgs().hasArg(options::OPT__SLASH_FA) && !C.getArgs().hasArg(options::OPT__SLASH_Fa) && isa(JA) && diff --git a/test/Driver/via-file-asm.c b/test/Driver/via-file-asm.c new file mode 100644 index 0000000000..92fc19096e --- /dev/null +++ b/test/Driver/via-file-asm.c @@ -0,0 +1,14 @@ +// Should save and read back the assembly from a file +// RUN: %clang -integrated-as -via-file-asm %s -### 2>&1 | FileCheck %s +// CHECK: "-cc1" +// CHECK: "-o" "[[TMP:[^"]*]]" +// CHECK: -cc1as +// CHECK: [[TMP]] + +// Should not force using the integrated assembler +// RUN: %clang -no-integrated-as -via-file-asm %s -### 2>&1 | FileCheck --check-prefix=NO_IAS %s +// NO_IAS-NOT: "-cc1as" + +// Test arm target specifically for the same behavior +// RUN: %clang -target arm -integrated-as -via-file-asm %s -### 2>&1 | FileCheck %s +// RUN: %clang -target arm -no-integrated-as -via-file-asm %s -### 2>&1 | FileCheck --check-prefix=NO_IAS %s