Author: hans Date: Thu Oct 17 11:16:23 2013 New Revision: 192902 URL: http://llvm.org/viewvc/llvm-project?rev=192902&view=rev Log: clang-cl: Add support for asm listings (/FA and /Fa)
This adds support for outputing the assembly to a file during compilation. It does this by changing the compilation pipeling to not use the integrated assembler, and keep the intermediate assembler file. Differential Revision: http://llvm-reviews.chandlerc.com/D1946 Modified: cfe/trunk/docs/UsersManual.rst cfe/trunk/include/clang/Driver/CLCompatOptions.td cfe/trunk/lib/Driver/Driver.cpp cfe/trunk/lib/Driver/Types.cpp cfe/trunk/test/Driver/cl-outputs.c Modified: cfe/trunk/docs/UsersManual.rst URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/UsersManual.rst?rev=192902&r1=192901&r2=192902&view=diff ============================================================================== --- cfe/trunk/docs/UsersManual.rst (original) +++ cfe/trunk/docs/UsersManual.rst Thu Oct 17 11:16:23 2013 @@ -1456,6 +1456,8 @@ Execute ``clang-cl /?`` to see a list of /c Compile only /D <macro[=value]> Define macro /fallback Fall back to cl.exe if clang-cl fails to compile + /FA Output assembly code file during compilation + /Fa<file or directory> Output assembly code to this file during compilation /Fe<file or directory> Set output executable file or directory (ends in / or \) /FI<value> Include file before parsing /Fo<file or directory> Set output object file, or directory (ends in / or \) Modified: cfe/trunk/include/clang/Driver/CLCompatOptions.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/CLCompatOptions.td?rev=192902&r1=192901&r2=192902&view=diff ============================================================================== --- cfe/trunk/include/clang/Driver/CLCompatOptions.td (original) +++ cfe/trunk/include/clang/Driver/CLCompatOptions.td Thu Oct 17 11:16:23 2013 @@ -112,6 +112,11 @@ def _SLASH_Zs : CLFlag<"Zs">, HelpText<" def _SLASH_M_Group : OptionGroup<"</M group>">, Group<cl_compile_Group>; +def _SLASH_FA : CLFlag<"FA">, + HelpText<"Output assembly code file during compilation">; +def _SLASH_Fa : CLJoined<"Fa">, + HelpText<"Output assembly code to this file during compilation">, + MetaVarName<"<file or directory>">; def _SLASH_fallback : CLCompileFlag<"fallback">, HelpText<"Fall back to cl.exe if clang-cl fails to compile">; def _SLASH_FI : CLJoined<"FI">, @@ -165,8 +170,7 @@ def _SLASH_Zm : CLIgnoredJoined<"Zm">; def _SLASH_bigobj : CLFlag<"bigobj">; def _SLASH_EH : CLJoined<"EH">; -def _SLASH_FA : CLJoined<"FA">; -def _SLASH_Fa : CLJoined<"Fa">; +def _SLASH_FA_joined : CLJoined<"FA">; def _SLASH_Fd : CLJoined<"Fd">; def _SLASH_fp : CLJoined<"fp">; def _SLASH_Gd : CLFlag<"Gd">; Modified: cfe/trunk/lib/Driver/Driver.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Driver.cpp?rev=192902&r1=192901&r2=192902&view=diff ============================================================================== --- cfe/trunk/lib/Driver/Driver.cpp (original) +++ cfe/trunk/lib/Driver/Driver.cpp Thu Oct 17 11:16:23 2013 @@ -1446,6 +1446,8 @@ static const Tool *SelectToolForJob(Comp if (TC->useIntegratedAs() && !C.getArgs().hasArg(options::OPT_save_temps) && + !C.getArgs().hasArg(options::OPT__SLASH_FA) && + !C.getArgs().hasArg(options::OPT__SLASH_Fa) && isa<AssembleJobAction>(JA) && Inputs->size() == 1 && isa<CompileJobAction>(*Inputs->begin())) { const Tool *Compiler = @@ -1568,8 +1570,10 @@ void Driver::BuildJobsForAction(Compilat } } -/// \brief Create output filename based on ArgValue, which could either be a -/// full filename, filename without extension, or a directory. +/// \brief Create output filename based on ArgValue, which could either be a +/// full filename, filename without extension, or a directory. If ArgValue +/// does not provide a filename, then use BaseName, and use the extension +/// suitable for FileType. static const char *MakeCLOutputFilename(const ArgList &Args, StringRef ArgValue, StringRef BaseName, types::ID FileType) { SmallString<128> Filename = ArgValue; @@ -1617,6 +1621,17 @@ const char *Driver::GetNamedOutputPath(C (isa<PreprocessJobAction>(JA) || JA.getType() == types::TY_ModuleFile)) return "-"; + // Is this the assembly listing for /FA? + if (JA.getType() == types::TY_PP_Asm && + (C.getArgs().hasArg(options::OPT__SLASH_FA) || + C.getArgs().hasArg(options::OPT__SLASH_Fa))) { + // Use /Fa and the input filename to determine the asm file name. + StringRef BaseName = llvm::sys::path::filename(BaseInput); + StringRef FaValue = C.getArgs().getLastArgValue(options::OPT__SLASH_Fa); + return C.addResultFile(MakeCLOutputFilename(C.getArgs(), FaValue, BaseName, + JA.getType()), &JA); + } + // Output to a temporary file? if ((!AtTopLevel && !C.getArgs().hasArg(options::OPT_save_temps) && !C.getArgs().hasArg(options::OPT__SLASH_Fo)) || Modified: cfe/trunk/lib/Driver/Types.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Types.cpp?rev=192902&r1=192901&r2=192902&view=diff ============================================================================== --- cfe/trunk/lib/Driver/Types.cpp (original) +++ cfe/trunk/lib/Driver/Types.cpp Thu Oct 17 11:16:23 2013 @@ -49,6 +49,8 @@ const char *types::getTypeTempSuffix(ID return "obj"; if (Id == TY_Image && CLMode) return "exe"; + if (Id == TY_PP_Asm && CLMode) + return "asm"; return getInfo(Id).TempSuffix; } Modified: cfe/trunk/test/Driver/cl-outputs.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/cl-outputs.c?rev=192902&r1=192901&r2=192902&view=diff ============================================================================== --- cfe/trunk/test/Driver/cl-outputs.c (original) +++ cfe/trunk/test/Driver/cl-outputs.c Thu Oct 17 11:16:23 2013 @@ -88,3 +88,18 @@ // RUN: %clang_cl /Fefoo /Febar -### -- %s 2>&1 | FileCheck -check-prefix=FeOVERRIDE %s // FeOVERRIDE: "-out:bar.exe" + + +// RUN: %clang_cl /FA -### -- %s 2>&1 | FileCheck -check-prefix=FA %s +// FA: "-o" "cl-outputs.asm" +// RUN: %clang_cl /FA /Fafoo -### -- %s 2>&1 | FileCheck -check-prefix=FaNAME %s +// RUN: %clang_cl /Fafoo -### -- %s 2>&1 | FileCheck -check-prefix=FaNAME %s +// FaNAME: "-o" "foo.asm" +// RUN: %clang_cl /FA /Faa.ext /Fab.ext -### -- %s 2>&1 | FileCheck -check-prefix=FaNAMEEXT %s +// FaNAMEEXT: "-o" "b.ext" +// RUN: %clang_cl /FA /Fafoo.dir/ -### -- %s 2>&1 | FileCheck -check-prefix=FaDIR %s +// FaDIR: "-o" "foo.dir{{[/\\]+}}cl-outputs.asm" +// RUN: %clang_cl /FA /Fafoo.dir/a -### -- %s 2>&1 | FileCheck -check-prefix=FaDIRNAME %s +// FaDIRNAME: "-o" "foo.dir{{[/\\]+}}a.asm" +// RUN: %clang_cl /FA /Fafoo.dir/a.ext -### -- %s 2>&1 | FileCheck -check-prefix=FaDIRNAMEEXT %s +// FaDIRNAMEEXT: "-o" "foo.dir{{[/\\]+}}a.ext" _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
