From 3166547cf6d62217d3142a18e3aae3fc84e49b24 Mon Sep 17 00:00:00 2001 From: Ilia K Date: Fri, 14 Oct 2022 13:24:47 +0200 Subject: ASM_MARMASM: Add support for Microsoft ARM assembler language https://learn.microsoft.com/en-us/cpp/assembler/arm/arm-assembler-reference Fixes: #23999 --- Help/envvar/ASM_DIALECT.rst | 10 +- Help/envvar/ASM_DIALECTFLAGS.rst | 1 + Help/release/dev/marmasm-language.rst | 4 + Modules/CMakeASM_MARMASMInformation.cmake | 20 ++++ Modules/CMakeDetermineASM_MARMASMCompiler.cmake | 18 +++ Modules/CMakeTestASM_MARMASMCompiler.cmake | 13 +++ Source/cmGlobalGenerator.cxx | 3 +- Source/cmGlobalVisualStudio10Generator.cxx | 8 ++ Source/cmGlobalVisualStudio10Generator.h | 2 + Source/cmGlobalVisualStudio11Generator.cxx | 12 ++ Source/cmGlobalVisualStudio11Generator.h | 3 + Source/cmGlobalVisualStudio7Generator.cxx | 1 + Source/cmGlobalVisualStudio7Generator.h | 2 + Source/cmLocalVisualStudio7Generator.cxx | 33 ++++++ Source/cmVisualStudio10TargetGenerator.cxx | 73 ++++++++++++ Source/cmVisualStudio10TargetGenerator.h | 4 + Source/cmVisualStudioGeneratorOptions.h | 1 + Templates/MSBuild/FlagTables/v10_MARMASM.json | 149 ++++++++++++++++++++++++ Tests/CMakeLists.txt | 6 + Tests/VSMARMASM/CMakeLists.txt | 3 + Tests/VSMARMASM/foo.asm | 10 ++ Tests/VSMARMASM/main.c | 5 + 22 files changed, 378 insertions(+), 3 deletions(-) create mode 100644 Help/release/dev/marmasm-language.rst create mode 100644 Modules/CMakeASM_MARMASMInformation.cmake create mode 100644 Modules/CMakeDetermineASM_MARMASMCompiler.cmake create mode 100644 Modules/CMakeTestASM_MARMASMCompiler.cmake create mode 100644 Templates/MSBuild/FlagTables/v10_MARMASM.json create mode 100644 Tests/VSMARMASM/CMakeLists.txt create mode 100644 Tests/VSMARMASM/foo.asm create mode 100644 Tests/VSMARMASM/main.c diff --git a/Help/envvar/ASM_DIALECT.rst b/Help/envvar/ASM_DIALECT.rst index c89515e..11dbe5a 100644 --- a/Help/envvar/ASM_DIALECT.rst +++ b/Help/envvar/ASM_DIALECT.rst @@ -4,8 +4,14 @@ ASM .. include:: ENV_VAR.txt Preferred executable for compiling a specific dialect of assembly language -files. ``ASM`` can be ``ASM``, ``ASM_NASM`` (Netwide Assembler), -``ASM_MASM`` (Microsoft Assembler) or ``ASM-ATT`` (Assembler AT&T). +files. ``ASM`` can be one of: + +* ``ASM`` +* ``ASM_NASM`` (Netwide Assembler) +* ``ASM_MASM`` (Microsoft Assembler) +* ``ASM_MARMASM`` (Microsoft ARM Assembler) +* ``ASM-ATT`` (Assembler AT&T) + Will only be used by CMake on the first configuration to determine ``ASM`` compiler, after which the value for ``ASM`` is stored in the cache as diff --git a/Help/envvar/ASM_DIALECTFLAGS.rst b/Help/envvar/ASM_DIALECTFLAGS.rst index 2af4b58..f13efbb 100644 --- a/Help/envvar/ASM_DIALECTFLAGS.rst +++ b/Help/envvar/ASM_DIALECTFLAGS.rst @@ -9,6 +9,7 @@ of an assembly language. ``ASMFLAGS`` can be one of: * ``ASMFLAGS`` * ``ASM_NASMFLAGS`` * ``ASM_MASMFLAGS`` +* ``ASM_MARMASMFLAGS`` * ``ASM-ATTFLAGS`` .. |CMAKE_LANG_FLAGS| replace:: :variable:`CMAKE_ASM_FLAGS _FLAGS>` diff --git a/Help/release/dev/marmasm-language.rst b/Help/release/dev/marmasm-language.rst new file mode 100644 index 0000000..2101e6c --- /dev/null +++ b/Help/release/dev/marmasm-language.rst @@ -0,0 +1,4 @@ +marmasm-language +---------------- + +* The ``ASM_MARMASM`` language was added to support the Microsoft ARM assembler language. diff --git a/Modules/CMakeASM_MARMASMInformation.cmake b/Modules/CMakeASM_MARMASMInformation.cmake new file mode 100644 index 0000000..ac81097 --- /dev/null +++ b/Modules/CMakeASM_MARMASMInformation.cmake @@ -0,0 +1,20 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + + +# support for the MS ARM assembler, marmasm and marmasm64 + +set(ASM_DIALECT "_MARMASM") + +set(CMAKE_ASM${ASM_DIALECT}_SOURCE_FILE_EXTENSIONS asm) + +set(CMAKE_ASM${ASM_DIALECT}_COMPILE_OBJECT " -o ") + +# The ASM_MARMASM compiler id for this compiler is "MSVC", so fill out the runtime library table. +set(CMAKE_ASM${ASM_DIALECT}_COMPILE_OPTIONS_MSVC_RUNTIME_LIBRARY_MultiThreaded "") +set(CMAKE_ASM${ASM_DIALECT}_COMPILE_OPTIONS_MSVC_RUNTIME_LIBRARY_MultiThreadedDLL "") +set(CMAKE_ASM${ASM_DIALECT}_COMPILE_OPTIONS_MSVC_RUNTIME_LIBRARY_MultiThreadedDebug "") +set(CMAKE_ASM${ASM_DIALECT}_COMPILE_OPTIONS_MSVC_RUNTIME_LIBRARY_MultiThreadedDebugDLL "") + +include(CMakeASMInformation) +set(ASM_DIALECT) diff --git a/Modules/CMakeDetermineASM_MARMASMCompiler.cmake b/Modules/CMakeDetermineASM_MARMASMCompiler.cmake new file mode 100644 index 0000000..26714dd --- /dev/null +++ b/Modules/CMakeDetermineASM_MARMASMCompiler.cmake @@ -0,0 +1,18 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + + +# Find the MS ARM assembler (marmasm or marmasm64) + +set(ASM_DIALECT "_MARMASM") + +# if we are using the 64bit cl compiler, assume we also want the 64bit assembler +if(";${CMAKE_VS_PLATFORM_NAME};${CMAKE_C_COMPILER_ARCHITECTURE_ID};${CMAKE_CXX_COMPILER_ARCHITECTURE_ID};" + MATCHES ";(ARM64);") + set(CMAKE_ASM${ASM_DIALECT}_COMPILER_INIT armasm64) +else() + set(CMAKE_ASM${ASM_DIALECT}_COMPILER_INIT armasm) +endif() + +include(CMakeDetermineASMCompiler) +set(ASM_DIALECT) diff --git a/Modules/CMakeTestASM_MARMASMCompiler.cmake b/Modules/CMakeTestASM_MARMASMCompiler.cmake new file mode 100644 index 0000000..a6de04c --- /dev/null +++ b/Modules/CMakeTestASM_MARMASMCompiler.cmake @@ -0,0 +1,13 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + + +# This file is used by EnableLanguage in cmGlobalGenerator to +# determine that the selected ASM_MARMASM "compiler" (should be marmasm or marmasm64) +# works. For assembler this can only check whether the compiler has been found, +# because otherwise there would have to be a separate assembler source file +# for each assembler on every architecture. + +set(ASM_DIALECT "_MARMASM") +include(CMakeTestASMCompiler) +set(ASM_DIALECT) diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx index a539d33..a9485b5 100644 --- a/Source/cmGlobalGenerator.cxx +++ b/Source/cmGlobalGenerator.cxx @@ -827,7 +827,8 @@ void cmGlobalGenerator::EnableLanguage( "No " << compilerName << " could be found.\n" ; /* clang-format on */ - } else if ((lang != "RC") && (lang != "ASM_MASM")) { + } else if ((lang != "RC") && (lang != "ASM_MARMASM") && + (lang != "ASM_MASM")) { if (!cmSystemTools::FileIsFullPath(*compilerFile)) { /* clang-format off */ noCompiler << diff --git a/Source/cmGlobalVisualStudio10Generator.cxx b/Source/cmGlobalVisualStudio10Generator.cxx index bea2ae7..d6d808d 100644 --- a/Source/cmGlobalVisualStudio10Generator.cxx +++ b/Source/cmGlobalVisualStudio10Generator.cxx @@ -56,6 +56,7 @@ cmGlobalVisualStudio10Generator::cmGlobalVisualStudio10Generator( { this->DefaultCudaFlagTableName = "v10"; this->DefaultCudaHostFlagTableName = "v10"; + this->DefaultMarmasmFlagTableName = "v10"; this->DefaultNasmFlagTableName = "v10"; } @@ -1466,6 +1467,13 @@ cmIDEFlagTable const* cmGlobalVisualStudio10Generator::GetCudaHostFlagTable() "CudaHost"); } +cmIDEFlagTable const* cmGlobalVisualStudio10Generator::GetMarmasmFlagTable() + const +{ + return LoadFlagTable(std::string(), this->DefaultMarmasmFlagTableName, + "MARMASM"); +} + cmIDEFlagTable const* cmGlobalVisualStudio10Generator::GetMasmFlagTable() const { return LoadFlagTable(this->GetMasmFlagTableName(), diff --git a/Source/cmGlobalVisualStudio10Generator.h b/Source/cmGlobalVisualStudio10Generator.h index b32c0a7..b3d9552 100644 --- a/Source/cmGlobalVisualStudio10Generator.h +++ b/Source/cmGlobalVisualStudio10Generator.h @@ -163,6 +163,7 @@ public: cmIDEFlagTable const* GetLinkFlagTable() const; cmIDEFlagTable const* GetCudaFlagTable() const; cmIDEFlagTable const* GetCudaHostFlagTable() const; + cmIDEFlagTable const* GetMarmasmFlagTable() const; cmIDEFlagTable const* GetMasmFlagTable() const; cmIDEFlagTable const* GetNasmFlagTable() const; @@ -226,6 +227,7 @@ protected: std::string DefaultLinkFlagTableName; std::string DefaultCudaFlagTableName; std::string DefaultCudaHostFlagTableName; + std::string DefaultMarmasmFlagTableName; std::string DefaultMasmFlagTableName; std::string DefaultNasmFlagTableName; std::string DefaultRCFlagTableName; diff --git a/Source/cmGlobalVisualStudio11Generator.cxx b/Source/cmGlobalVisualStudio11Generator.cxx index 086d3af..c53ddf5 100644 --- a/Source/cmGlobalVisualStudio11Generator.cxx +++ b/Source/cmGlobalVisualStudio11Generator.cxx @@ -161,6 +161,18 @@ bool cmGlobalVisualStudio11Generator::MatchesGeneratorName( return false; } +void cmGlobalVisualStudio11Generator::EnableLanguage( + std::vector const& lang, cmMakefile* mf, bool optional) +{ + for (std::string const& it : lang) { + if (it == "ASM_MARMASM") { + this->MarmasmEnabled = true; + } + } + this->AddPlatformDefinitions(mf); + cmGlobalVisualStudio10Generator::EnableLanguage(lang, mf, optional); +} + bool cmGlobalVisualStudio11Generator::InitializeWindowsPhone(cmMakefile* mf) { if (!this->SelectWindowsPhoneToolset(this->DefaultPlatformToolset)) { diff --git a/Source/cmGlobalVisualStudio11Generator.h b/Source/cmGlobalVisualStudio11Generator.h index 2f8a7f6..fd25984 100644 --- a/Source/cmGlobalVisualStudio11Generator.h +++ b/Source/cmGlobalVisualStudio11Generator.h @@ -25,6 +25,9 @@ public: bool MatchesGeneratorName(const std::string& name) const override; + void EnableLanguage(std::vector const& languages, cmMakefile*, + bool optional) override; + bool SupportsCustomCommandDepfile() const override { return true; } cm::optional DepfileFormat() const override diff --git a/Source/cmGlobalVisualStudio7Generator.cxx b/Source/cmGlobalVisualStudio7Generator.cxx index ff76762..7431176 100644 --- a/Source/cmGlobalVisualStudio7Generator.cxx +++ b/Source/cmGlobalVisualStudio7Generator.cxx @@ -70,6 +70,7 @@ cmGlobalVisualStudio7Generator::cmGlobalVisualStudio7Generator( : cmGlobalVisualStudioGenerator(cm, platformInGeneratorName) { this->DevEnvCommandInitialized = false; + this->MarmasmEnabled = false; this->MasmEnabled = false; this->NasmEnabled = false; this->ExtraFlagTable = cmVS7ExtraFlagTable; diff --git a/Source/cmGlobalVisualStudio7Generator.h b/Source/cmGlobalVisualStudio7Generator.h index 288069c..e901ecd 100644 --- a/Source/cmGlobalVisualStudio7Generator.h +++ b/Source/cmGlobalVisualStudio7Generator.h @@ -106,6 +106,7 @@ public: bool FindMakeProgram(cmMakefile* mf) override; /** Is the Microsoft Assembler enabled? */ + bool IsMarmasmEnabled() const { return this->MarmasmEnabled; } bool IsMasmEnabled() const { return this->MasmEnabled; } bool IsNasmEnabled() const { return this->NasmEnabled; } @@ -176,6 +177,7 @@ protected: // Set during OutputSLNFile with the name of the current project. // There is one SLN file per project. std::string CurrentProject; + bool MarmasmEnabled; bool MasmEnabled; bool NasmEnabled; diff --git a/Source/cmLocalVisualStudio7Generator.cxx b/Source/cmLocalVisualStudio7Generator.cxx index af2d31d..383045d 100644 --- a/Source/cmLocalVisualStudio7Generator.cxx +++ b/Source/cmLocalVisualStudio7Generator.cxx @@ -842,6 +842,24 @@ void cmLocalVisualStudio7Generator::WriteConfiguration( } } fout << "/>\n"; // end of IsMarmasmEnabled() && !this->FortranProject) { + Options marmasmOptions(this, Options::MarmasmCompiler, 0, 0); + /* clang-format off */ + fout << + "\t\t\t\n"; + /* clang-format on */ + } if (gg->IsMasmEnabled() && !this->FortranProject) { Options masmOptions(this, Options::MasmCompiler, 0, 0); /* clang-format off */ @@ -1720,6 +1738,10 @@ bool cmLocalVisualStudio7Generator::WriteGroup( aCompilerTool = "VFCustomBuildTool"; } } + if (gg->IsMarmasmEnabled() && !this->FortranProject && + lang == "ASM_MARMASM") { + aCompilerTool = "MARMASM"; + } if (gg->IsMasmEnabled() && !this->FortranProject && lang == "ASM_MASM") { aCompilerTool = "MASM"; @@ -2050,6 +2072,17 @@ void cmLocalVisualStudio7Generator::WriteProjectStart( << "\t\tGetPlatformName() << "\"/>\n" << "\t\n"; /* clang-format on */ + if (gg->IsMarmasmEnabled()) { + /* clang-format off */ + fout << + "\t\n" + "\t\t\n" + "\t\n" + ; + /* clang-format on */ + } if (gg->IsMasmEnabled()) { /* clang-format off */ fout << diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx index c982713..9393389 100644 --- a/Source/cmVisualStudio10TargetGenerator.cxx +++ b/Source/cmVisualStudio10TargetGenerator.cxx @@ -406,6 +406,9 @@ void cmVisualStudio10TargetGenerator::Generate() if (!this->ComputeCudaLinkOptions()) { return; } + if (!this->ComputeMarmasmOptions()) { + return; + } if (!this->ComputeMasmOptions()) { return; } @@ -732,6 +735,11 @@ void cmVisualStudio10TargetGenerator::WriteClassicMsBuildProjectFile( this->GlobalGenerator->GetPlatformToolsetCuda() + ".props"); } + if (this->GlobalGenerator->IsMarmasmEnabled()) { + Elem(e1, "Import") + .Attribute("Project", + "$(VCTargetsPath)\\BuildCustomizations\\marmasm.props"); + } if (this->GlobalGenerator->IsMasmEnabled()) { Elem(e1, "Import") .Attribute("Project", @@ -830,6 +838,11 @@ void cmVisualStudio10TargetGenerator::WriteClassicMsBuildProjectFile( this->GlobalGenerator->GetPlatformToolsetCuda() + ".targets"); } + if (this->GlobalGenerator->IsMarmasmEnabled()) { + Elem(e1, "Import") + .Attribute("Project", + "$(VCTargetsPath)\\BuildCustomizations\\marmasm.targets"); + } if (this->GlobalGenerator->IsMasmEnabled()) { Elem(e1, "Import") .Attribute("Project", @@ -2485,6 +2498,9 @@ void cmVisualStudio10TargetGenerator::WriteAllSources(Elem& e0) const std::string& lang = si.Source->GetLanguage(); if (lang == "C" || lang == "CXX") { tool = "ClCompile"; + } else if (lang == "ASM_MARMASM" && + this->GlobalGenerator->IsMarmasmEnabled()) { + tool = "MARMASM"; } else if (lang == "ASM_MASM" && this->GlobalGenerator->IsMasmEnabled()) { tool = "MASM"; @@ -2740,6 +2756,9 @@ void cmVisualStudio10TargetGenerator::OutputSourceSpecificFlags( const std::string& srclang = source->GetLanguage(); if (srclang == "C" || srclang == "CXX") { flagtable = gg->GetClFlagTable(); + } else if (srclang == "ASM_MARMASM" && + this->GlobalGenerator->IsMarmasmEnabled()) { + flagtable = gg->GetMarmasmFlagTable(); } else if (srclang == "ASM_MASM" && this->GlobalGenerator->IsMasmEnabled()) { flagtable = gg->GetMasmFlagTable(); @@ -3751,6 +3770,59 @@ void cmVisualStudio10TargetGenerator::WriteCudaLinkOptions( cudaLinkOptions.OutputFlagMap(); } +bool cmVisualStudio10TargetGenerator::ComputeMarmasmOptions() +{ + if (!this->GlobalGenerator->IsMarmasmEnabled()) { + return true; + } + for (std::string const& c : this->Configurations) { + if (!this->ComputeMarmasmOptions(c)) { + return false; + } + } + return true; +} + +bool cmVisualStudio10TargetGenerator::ComputeMarmasmOptions( + std::string const& configName) +{ + cmGlobalVisualStudio10Generator* gg = this->GlobalGenerator; + auto pOptions = cm::make_unique( + this->LocalGenerator, Options::MarmasmCompiler, gg->GetMarmasmFlagTable()); + Options& marmasmOptions = *pOptions; + + std::string flags; + this->LocalGenerator->AddLanguageFlags(flags, this->GeneratorTarget, + cmBuildStep::Compile, "ASM_MARMASM", + configName); + + marmasmOptions.Parse(flags); + + // Get includes for this target + marmasmOptions.AddIncludes(this->GetIncludes(configName, "ASM_MARMASM")); + + this->MarmasmOptions[configName] = std::move(pOptions); + return true; +} + +void cmVisualStudio10TargetGenerator::WriteMarmasmOptions( + Elem& e1, std::string const& configName) +{ + if (!this->MSTools || !this->GlobalGenerator->IsMarmasmEnabled()) { + return; + } + Elem e2(e1, "MARMASM"); + + // Preprocessor definitions and includes are shared with clOptions. + OptionsHelper clOptions(*(this->ClOptions[configName]), e2); + clOptions.OutputPreprocessorDefinitions("ASM_MARMASM"); + + OptionsHelper marmasmOptions(*(this->MarmasmOptions[configName]), e2); + marmasmOptions.OutputAdditionalIncludeDirectories("ASM_MARMASM"); + marmasmOptions.PrependInheritedString("AdditionalOptions"); + marmasmOptions.OutputFlagMap(); +} + bool cmVisualStudio10TargetGenerator::ComputeMasmOptions() { if (!this->GlobalGenerator->IsMasmEnabled()) { @@ -4451,6 +4523,7 @@ void cmVisualStudio10TargetGenerator::WriteItemDefinitionGroups(Elem& e0) // output rc compile flags this->WriteRCOptions(e1, c); this->WriteCudaOptions(e1, c); + this->WriteMarmasmOptions(e1, c); this->WriteMasmOptions(e1, c); this->WriteNasmOptions(e1, c); } diff --git a/Source/cmVisualStudio10TargetGenerator.h b/Source/cmVisualStudio10TargetGenerator.h index 17dcecd..60e9736 100644 --- a/Source/cmVisualStudio10TargetGenerator.h +++ b/Source/cmVisualStudio10TargetGenerator.h @@ -132,6 +132,9 @@ private: bool ComputeCudaLinkOptions(std::string const& config); void WriteCudaLinkOptions(Elem& e1, std::string const& config); + bool ComputeMarmasmOptions(); + bool ComputeMarmasmOptions(std::string const& config); + void WriteMarmasmOptions(Elem& e1, std::string const& config); bool ComputeMasmOptions(); bool ComputeMasmOptions(std::string const& config); void WriteMasmOptions(Elem& e1, std::string const& config); @@ -208,6 +211,7 @@ private: OptionsMap RcOptions; OptionsMap CudaOptions; OptionsMap CudaLinkOptions; + OptionsMap MarmasmOptions; OptionsMap MasmOptions; OptionsMap NasmOptions; OptionsMap LinkOptions; diff --git a/Source/cmVisualStudioGeneratorOptions.h b/Source/cmVisualStudioGeneratorOptions.h index ed4ee1d..20e2d22 100644 --- a/Source/cmVisualStudioGeneratorOptions.h +++ b/Source/cmVisualStudioGeneratorOptions.h @@ -24,6 +24,7 @@ public: Compiler, ResourceCompiler, CudaCompiler, + MarmasmCompiler, MasmCompiler, NasmCompiler, Linker, diff --git a/Templates/MSBuild/FlagTables/v10_MARMASM.json b/Templates/MSBuild/FlagTables/v10_MARMASM.json new file mode 100644 index 0000000..5c8de1f --- /dev/null +++ b/Templates/MSBuild/FlagTables/v10_MARMASM.json @@ -0,0 +1,149 @@ +[ + { + "name": "16BitThumbInstructions", + "switch": "16", + "comment": "Assemble source as 16-bit Thumb instructions.", + "value": "true", + "flags": [] + }, + { + "name": "32BitArmInstructions", + "switch": "32", + "comment": "Assemble source as 32-bit ARM instructions.", + "value": "true", + "flags": [] + }, + { + "name": "CoffThumb2Only", + "switch": "coff_thumb2_only", + "comment": "Allow only Thumb-2 code.", + "value": "true", + "flags": [] + }, + { + "name": "ErrorReporting", + "switch": "errorReport:prompt", + "comment": "Prompt to send report immediately (/errorReport:prompt)", + "value": "0", + "flags": [] + }, + { + "name": "ErrorReporting", + "switch": "errorReport:queue", + "comment": "Prompt to send report at the next logon (/errorReport:queue)", + "value": "1", + "flags": [] + }, + { + "name": "ErrorReporting", + "switch": "errorReport:send", + "comment": "Automatically send report (/errorReport:send)", + "value": "2", + "flags": [] + }, + { + "name": "ErrorReporting", + "switch": "errorReport:none", + "comment": "Do not send report (/errorReport:none)", + "value": "3", + "flags": [] + }, + { + "name": "Errors", + "switch": "errors", + "comment": "Redirect error and warning messages.", + "value": "", + "flags": [ + "UserValue" + ] + }, + { + "name": "FunctionOverride", + "switch": "funcOverride", + "comment": "Emit function overriding support for the specified function.", + "value": "", + "flags": [ + "UserValue" + ] + }, + { + "name": "DebugInformation", + "switch": "g", + "comment": "Generate debugging information.", + "value": "true", + "flags": [] + }, + { + "name": "Machine", + "switch": "machine", + "comment": "Specify the machine type to set in the PE header.", + "value": "", + "flags": [ + "UserValue" + ] + }, + { + "name": "NoEsc", + "switch": "noesc", + "comment": "Ignore C-style escaped special characters.", + "value": "true", + "flags": [] + }, + { + "name": "NoLogo", + "switch": "nologo", + "comment": "Suppress the copyright banner.", + "value": "true", + "flags": [] + }, + { + "name": "NoWarn", + "switch": "nowarn", + "comment": "Disable all warning messages.", + "value": "true", + "flags": [] + }, + { + "name": "ObjectFile", + "switch": "o", + "comment": "Specify the name of the object (output) file.", + "value": "", + "flags": [ + "UserValue" + ] + }, + { + "name": "ItBlocks", + "switch": "oldit", + "comment": "Generate ARMv7-style IT blocks.", + "value": "true", + "flags": [] + }, + { + "name": "PredefineDirective", + "switch": "predefine", + "comment": "Specify a SETA, SETL, or SETS directive to predefine a symbol.", + "value": "", + "flags": [ + "UserValue" + ] + }, + { + "name": "SourceLink", + "switch": "sourcelink", + "comment": "Specify the configuration file that contains a simple mapping of local file paths to URLs for source files to display in the debugger.", + "value": "", + "flags": [ + "UserValue" + ] + }, + { + "name": "CommandLineArgumentsViaFile", + "switch": "via", + "comment": "Read extra command-line arguments from the specified file.", + "value": "", + "flags": [ + "UserValue" + ] + } +] diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt index 030f4f6..d4ef7ee 100644 --- a/Tests/CMakeLists.txt +++ b/Tests/CMakeLists.txt @@ -2161,6 +2161,12 @@ if(BUILD_TESTING) list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/MFC") endif() + if(MSVC AND NOT MSVC_VERSION LESS 1700 + AND (CMAKE_C_COMPILER_ARCHITECTURE_ID STREQUAL "ARM64") + ) + ADD_TEST_MACRO(VSMARMASM VSMARMASM) + endif() + if(MSVC AND NOT MSVC_VERSION LESS 1310 AND (NOT CMAKE_GENERATOR MATCHES "Visual Studio 9 " OR CMAKE_SIZEOF_VOID_P EQUAL 4) diff --git a/Tests/VSMARMASM/CMakeLists.txt b/Tests/VSMARMASM/CMakeLists.txt new file mode 100644 index 0000000..eb1bfdb --- /dev/null +++ b/Tests/VSMARMASM/CMakeLists.txt @@ -0,0 +1,3 @@ +cmake_minimum_required(VERSION 2.8.12) +project(VSMARMASM C ASM_MARMASM) +add_executable(VSMARMASM main.c foo.asm) diff --git a/Tests/VSMARMASM/foo.asm b/Tests/VSMARMASM/foo.asm new file mode 100644 index 0000000..e5b2775 --- /dev/null +++ b/Tests/VSMARMASM/foo.asm @@ -0,0 +1,10 @@ + AREA |.text|, CODE + + EXPORT foo + +foo PROC + mov w0, #0 + ret + ENDP + + END diff --git a/Tests/VSMARMASM/main.c b/Tests/VSMARMASM/main.c new file mode 100644 index 0000000..18ddb78 --- /dev/null +++ b/Tests/VSMARMASM/main.c @@ -0,0 +1,5 @@ +extern int foo(void); +int main(void) +{ + return foo(); +} -- cgit v0.12