Author: Hans Wennborg Date: 2026-07-03T15:03:37Z New Revision: 433eef6dea23c18d52c51218bb9d7f9bfbf47ecf
URL: https://github.com/llvm/llvm-project/commit/433eef6dea23c18d52c51218bb9d7f9bfbf47ecf DIFF: https://github.com/llvm/llvm-project/commit/433eef6dea23c18d52c51218bb9d7f9bfbf47ecf.diff LOG: Revert "[IR] Explicitly specify target feature for module asm" (#207399) Reverts llvm/llvm-project#204548 This is causing the runtimes build to fail with e.g.: ``` <inline asm>:11:5: error: 32 bit reloc applied to a field with a different size 11 | jmp __interceptor_strlen@plt | ^ ``` See comments on the PR. Added: Modified: clang/lib/CodeGen/CGObjCMac.cpp clang/lib/CodeGen/CodeGenModule.cpp clang/test/CodeGen/2006-01-23-FileScopeAsm.c clang/test/CodeGen/asm.c clang/test/CodeGen/asm_incbin.c clang/test/CodeGen/cfi-salt.c clang/test/CodeGen/kcfi.c clang/test/CodeGenCUDA/filter-decl.cu clang/test/CodeGenCXX/gnu-asm-constexpr.cpp clang/test/CodeGenObjC/category-class.m clang/test/CodeGenObjC/objc-runtime-name.m clang/test/Frontend/ast-codegen.c clang/test/Modules/codegen.test llvm/docs/LangRef.rst llvm/docs/ReleaseNotes.md llvm/include/llvm/Bitcode/LLVMBitCodes.h llvm/include/llvm/CodeGen/AsmPrinter.h llvm/include/llvm/IR/Module.h llvm/lib/AsmParser/LLParser.cpp llvm/lib/Bitcode/Reader/BitcodeReader.cpp llvm/lib/Bitcode/Writer/BitcodeWriter.cpp llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp llvm/lib/IR/AsmWriter.cpp llvm/lib/IR/Core.cpp llvm/lib/IR/Module.cpp llvm/lib/LTO/LTO.cpp llvm/lib/Linker/IRMover.cpp llvm/lib/Object/ModuleSymbolTable.cpp llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp llvm/lib/Transforms/IPO/ExtractGV.cpp llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp llvm/lib/Transforms/Utils/SplitModule.cpp llvm/test/Bitcode/compatibility-3.6.ll llvm/test/Bitcode/compatibility-3.7.ll llvm/test/Bitcode/compatibility-3.8.ll llvm/test/Bitcode/compatibility-3.9.ll llvm/test/Bitcode/compatibility-4.0.ll llvm/test/Bitcode/compatibility-5.0.ll llvm/test/Bitcode/compatibility-6.0.ll llvm/test/Bitcode/compatibility.ll llvm/test/Bitcode/highLevelStructure.3.2.ll llvm/test/Instrumentation/DataFlowSanitizer/prefix-rename.ll llvm/test/LTO/X86/inline-asm-lto-discard.ll llvm/test/Linker/link-arm-and-thumb-module-inline-asm.ll llvm/test/ThinLTO/X86/import-symver.ll llvm/test/Transforms/LowerTypeTests/export-symver.ll llvm/test/Transforms/ThinLTOBitcodeWriter/cfi-icall-static-inline-asm.ll llvm/test/Transforms/ThinLTOBitcodeWriter/x86/module-asm.ll llvm/tools/llvm-reduce/deltas/ReduceModuleData.cpp mlir/lib/Target/LLVMIR/ModuleImport.cpp mlir/test/Target/LLVMIR/module-asm.mlir Removed: llvm/test/Assembler/module-asm-invalid.ll llvm/test/Bitcode/module-asm.ll llvm/test/CodeGen/RISCV/module-asm-features.ll llvm/test/LTO/RISCV/module-asm.ll llvm/test/Linker/Inputs/module-asm.ll llvm/test/Linker/module-asm.ll ################################################################################ diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp index e518b875f44bb..69c5e88f3c768 100644 --- a/clang/lib/CodeGen/CGObjCMac.cpp +++ b/clang/lib/CodeGen/CGObjCMac.cpp @@ -6610,6 +6610,10 @@ void CGObjCMac::FinishModule() { if ((!LazySymbols.empty() || !DefinedSymbols.empty()) && CGM.getTriple().isOSBinFormatMachO()) { SmallString<256> Asm; + Asm += CGM.getModule().getModuleInlineAsm(); + if (!Asm.empty() && Asm.back() != '\n') + Asm += '\n'; + llvm::raw_svector_ostream OS(Asm); for (const auto *Sym : DefinedSymbols) OS << "\t.objc_class_name_" << Sym->getName() << "=0\n" @@ -6620,7 +6624,7 @@ void CGObjCMac::FinishModule() { OS << "\t.objc_category_name_" << Category << "=0\n" << "\t.globl .objc_category_name_" << Category << "\n"; - CGM.getModule().appendModuleInlineAsm(OS.str()); + CGM.getModule().setModuleInlineAsm(OS.str()); } } diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index e155fdd752d7f..813cd67e4dd51 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -8057,13 +8057,7 @@ void CodeGenModule::EmitTopLevelDecl(Decl *D) { if (LangOpts.SYCLIsDevice) break; auto *AD = cast<FileScopeAsmDecl>(D); - - const TargetOptions &TargetOpts = getTarget().getTargetOpts(); - llvm::Module::GlobalAsmProperties Props; - Props.TargetFeatures = llvm::join(TargetOpts.Features, ","); - Props.TargetCPU = TargetOpts.CPU; - getModule().appendModuleInlineAsm( - llvm::Module::GlobalAsmFragment(AD->getAsmString(), Props)); + getModule().appendModuleInlineAsm(AD->getAsmString()); break; } diff --git a/clang/test/CodeGen/2006-01-23-FileScopeAsm.c b/clang/test/CodeGen/2006-01-23-FileScopeAsm.c index 8a212a0b61905..877da4fc669e3 100644 --- a/clang/test/CodeGen/2006-01-23-FileScopeAsm.c +++ b/clang/test/CodeGen/2006-01-23-FileScopeAsm.c @@ -1,18 +1,13 @@ // UNSUPPORTED: target={{.*}}-zos{{.*}} -// RUN: %clang_cc1 %s -triple=riscv64 -emit-llvm -o - | FileCheck %s --check-prefixes=CHECK,RISCV64 -// RUN: %clang_cc1 %s -triple=riscv64 -target-feature +d -emit-llvm -o - | FileCheck %s --check-prefixes=CHECK,RISCV64-D -// RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s --check-prefixes=CHECK,DEFAULT +// RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s -// RISCV64: module asm(target_features: "+64bit,+i") -// RISCV64-D: module asm(target_features: "+64bit,+d,+f,+i,+zicsr") -// DEFAULT: module asm -// CHECK-NEXT: "foo1" +// CHECK: module asm "foo1" __asm__ ("foo1"); -// CHECK-NEXT: "foo2" +// CHECK: module asm "foo2" __asm__ ("foo2"); -// CHECK-NEXT: "foo3" +// CHECK: module asm "foo3" __asm__ ("foo3"); -// CHECK-NEXT: "foo4" +// CHECK: module asm "foo4" __asm__ ("foo4"); -// CHECK-NEXT: "foo5" +// CHECK: module asm "foo5" __asm__ ("foo5"); diff --git a/clang/test/CodeGen/asm.c b/clang/test/CodeGen/asm.c index ea69c7a17d1cb..d7465b22fbbf6 100644 --- a/clang/test/CodeGen/asm.c +++ b/clang/test/CodeGen/asm.c @@ -2,10 +2,9 @@ // PR10415: // -// CHECK: module asm(target_features: "{{.*}}") -// CHECK-NEXT: "foo1" -// CHECK-NEXT: "foo2" -// CHECK-NEXT: "foo3" +// CHECK: module asm "foo1" +// CHECK-NEXT: module asm "foo2" +// CHECK-NEXT: module asm "foo3" __asm__ ("foo1"); __asm__ ("foo2"); __asm__ ("foo3"); diff --git a/clang/test/CodeGen/asm_incbin.c b/clang/test/CodeGen/asm_incbin.c index bbc5d3af55ea2..6234eea1d6738 100644 --- a/clang/test/CodeGen/asm_incbin.c +++ b/clang/test/CodeGen/asm_incbin.c @@ -6,5 +6,4 @@ asm(".incbin \"foo.h\""); // RUN: cd %t // RUN: %clang -c -emit-llvm %t/tu.c -o %t/tu.ll // RUN: llvm-dis %t/tu.ll -o - | FileCheck %s -// CHECK: module asm -// CHECK-NEXT: ".incbin \22foo.h\22" +// CHECK: module asm ".incbin \22foo.h\22" diff --git a/clang/test/CodeGen/cfi-salt.c b/clang/test/CodeGen/cfi-salt.c index 18156dc014280..2a90dc31d939b 100644 --- a/clang/test/CodeGen/cfi-salt.c +++ b/clang/test/CodeGen/cfi-salt.c @@ -26,14 +26,13 @@ typedef unsigned int (*ufn_t)(void); typedef unsigned int (* __cfi_salt ufn_salt_t)(void); /// Must emit __kcfi_typeid symbols for address-taken function declarations -// CHECK: module asm -// CHECK-NEXT: ".weak __kcfi_typeid_[[F4:[a-zA-Z0-9_]+]]" -// CHECK-NEXT: ".set __kcfi_typeid_[[F4]], {{[0-9]+}} /* [[#%d,LOW_SODIUM_HASH:]] */" -// CHECK-NEXT: ".weak __kcfi_typeid_[[F4_SALT:[a-zA-Z0-9_]+]]" -// CHECK-NEXT: ".set __kcfi_typeid_[[F4_SALT]], {{[0-9]+}} /* [[#%d,ASM_SALTY_HASH:]] */" +// CHECK: module asm ".weak __kcfi_typeid_[[F4:[a-zA-Z0-9_]+]]" +// CHECK: module asm ".set __kcfi_typeid_[[F4]], {{[0-9]+}} /* [[#%d,LOW_SODIUM_HASH:]] */" +// CHECK: module asm ".weak __kcfi_typeid_[[F4_SALT:[a-zA-Z0-9_]+]]" +// CHECK: module asm ".set __kcfi_typeid_[[F4_SALT]], {{[0-9]+}} /* [[#%d,ASM_SALTY_HASH:]] */" /// Must not __kcfi_typeid symbols for non-address-taken declarations -// CHECK-NOT: ".weak __kcfi_typeid_f6" +// CHECK-NOT: module asm ".weak __kcfi_typeid_f6" int f1(void); int f1_salt(void) __cfi_salt; diff --git a/clang/test/CodeGen/kcfi.c b/clang/test/CodeGen/kcfi.c index f08cf7635fb5a..da32859dd3d88 100644 --- a/clang/test/CodeGen/kcfi.c +++ b/clang/test/CodeGen/kcfi.c @@ -6,11 +6,10 @@ #endif /// Must emit __kcfi_typeid symbols for address-taken function declarations -// CHECK: module asm -// CHECK-NEXT: ".weak __kcfi_typeid_[[F4:[a-zA-Z0-9_]+]]" -// CHECK-NEXT: ".set __kcfi_typeid_[[F4]], {{[0-9]+}} /* [[#%d,HASH:]] */" +// CHECK: module asm ".weak __kcfi_typeid_[[F4:[a-zA-Z0-9_]+]]" +// CHECK: module asm ".set __kcfi_typeid_[[F4]], {{[0-9]+}} /* [[#%d,HASH:]] */" /// Must not __kcfi_typeid symbols for non-address-taken declarations -// CHECK-NOT: ".weak __kcfi_typeid_{{f6|_Z2f6v}}" +// CHECK-NOT: module asm ".weak __kcfi_typeid_{{f6|_Z2f6v}}" // C: @ifunc1 = ifunc i32 (i32), ptr @resolver1 // C: @ifunc2 = ifunc i64 (i64), ptr @resolver2 diff --git a/clang/test/CodeGenCUDA/filter-decl.cu b/clang/test/CodeGenCUDA/filter-decl.cu index f87d62a56631e..02dacd0ad8ef4 100644 --- a/clang/test/CodeGenCUDA/filter-decl.cu +++ b/clang/test/CodeGenCUDA/filter-decl.cu @@ -5,9 +5,8 @@ // This has to be at the top of the file as that's where file-scope // asm ends up. -// CHECK-HOST: module asm -// CHECK-HOST-NEXT: "file scope asm is host only" -// CHECK-DEVICE-NOT: "file scope asm is host only" +// CHECK-HOST: module asm "file scope asm is host only" +// CHECK-DEVICE-NOT: module asm "file scope asm is host only" __asm__("file scope asm is host only"); // CHECK-HOST: constantdata = internal global diff --git a/clang/test/CodeGenCXX/gnu-asm-constexpr.cpp b/clang/test/CodeGenCXX/gnu-asm-constexpr.cpp index 2b4abee5dc05f..175a3b7bc588c 100644 --- a/clang/test/CodeGenCXX/gnu-asm-constexpr.cpp +++ b/clang/test/CodeGenCXX/gnu-asm-constexpr.cpp @@ -19,8 +19,7 @@ struct string_view { namespace GH143242 { constexpr string_view code2 = R"(nop; nop; nop; nop)"; asm((code2)); - // CHECK: module asm(target_features: "{{.*}}") - // CHECK-NEXT: "nop; nop; nop; nop" + // CHECK: module asm "nop; nop; nop; nop" } int func() {return 0;}; diff --git a/clang/test/CodeGenObjC/category-class.m b/clang/test/CodeGenObjC/category-class.m index febe94ce5b9f5..92fd36cbe4066 100644 --- a/clang/test/CodeGenObjC/category-class.m +++ b/clang/test/CodeGenObjC/category-class.m @@ -1,10 +1,9 @@ // RUN: %clang_cc1 -triple i386-apple-darwin9 -fobjc-runtime=macosx-fragile-10.5 -emit-llvm -o - %s | FileCheck %s // PR7431 -// CHECK: module asm -// CHECK-NEXT: "\09.lazy_reference .objc_class_name_A" -// CHECK-NEXT: "\09.objc_category_name_A_foo=0" -// CHECK-NEXT: "\09.globl .objc_category_name_A_foo" +// CHECK: module asm "\09.lazy_reference .objc_class_name_A" +// CHECK: module asm "\09.objc_category_name_A_foo=0" +// CHECK: module asm "\09.globl .objc_category_name_A_foo" @interface A @end diff --git a/clang/test/CodeGenObjC/objc-runtime-name.m b/clang/test/CodeGenObjC/objc-runtime-name.m index a7f59caced390..c838b8c2c6f1a 100644 --- a/clang/test/CodeGenObjC/objc-runtime-name.m +++ b/clang/test/CodeGenObjC/objc-runtime-name.m @@ -3,10 +3,9 @@ // Check that the runtime name is emitted and used instead of the class // identifier. -// CHECK: module asm -// CHECK-NEXT: {{.*}}objc_class_name_XYZ=0 -// CHECK-NEXT: {{.*}}globl .objc_class_name_XYZ -// CHECK-NEXT: {{.*}}lazy_reference .objc_class_name_XYZ +// CHECK: module asm {{.*}}objc_class_name_XYZ=0 +// CHECK: module asm {{.*}}globl .objc_class_name_XYZ +// CHECK: module asm {{.*}}lazy_reference .objc_class_name_XYZ // CHECK: @[[OBJC_CLASS_NAME:.*]] = private unnamed_addr constant [4 x i8] c"XYZ{{.*}}, section "__TEXT,__cstring,cstring_literals", // CHECK: = private global {{.*}} @[[OBJC_CLASS_NAME]], section "__OBJC,__cls_refs,literal_pointers,no_dead_strip" diff --git a/clang/test/Frontend/ast-codegen.c b/clang/test/Frontend/ast-codegen.c index c26b0a1908379..2e2e3d360dd17 100644 --- a/clang/test/Frontend/ast-codegen.c +++ b/clang/test/Frontend/ast-codegen.c @@ -2,8 +2,7 @@ // RUN: %clang -target i386-unknown-unknown -emit-ast -o %t.ast %s // RUN: %clang -target i386-unknown-unknown -emit-llvm -S -o - %t.ast | FileCheck %s -// CHECK: module asm(target_features: "{{.*}}") -// CHECK-NEXT: "foo" +// CHECK: module asm "foo" __asm__("foo"); // CHECK: @g0 = dso_local global i32 0, align 4 diff --git a/clang/test/Modules/codegen.test b/clang/test/Modules/codegen.test index 5cc5b3c1cda2a..0af630a754805 100644 --- a/clang/test/Modules/codegen.test +++ b/clang/test/Modules/codegen.test @@ -18,8 +18,7 @@ was implemented to workaround/support the initialization of iostreams (implemented as a namespace scope static in the header - only to be provided when that specific header is included in the program). -BOTH: module asm -BOTH-NEXT: "narf" +BOTH: module asm "narf" FOO: $_Z2f1PKcz = comdat any FOO: $_ZN13implicit_dtorD1Ev = comdat any diff --git a/llvm/docs/LangRef.rst b/llvm/docs/LangRef.rst index 2c8276d04b668..5ce6019660e0b 100644 --- a/llvm/docs/LangRef.rst +++ b/llvm/docs/LangRef.rst @@ -3357,34 +3357,19 @@ Module-Level Inline Assembly ---------------------------- Modules may contain "module-level inline asm" blocks, which corresponds -to the GCC "file scope inline asm" blocks: +to the GCC "file scope inline asm" blocks. These blocks are internally +concatenated by LLVM and treated as a single unit, but may be separated +in the ``.ll`` file if desired. The syntax is very simple: .. code-block:: llvm - module asm - "inline asm code goes here" - "more can go here" + module asm "inline asm code goes here" + module asm "more can go here" -The sequence of string literals is internally concatenated using newlines as -separators. The strings can contain any character by escaping non-printable +The strings can contain any character by escaping non-printable characters. The escape sequence used is simply "\\xx" where "xx" is the two digit hex code for the number. -Additionally, module-level inline assembly can specify an optional list of -properties: - -.. code-block:: llvm - - module asm(target_features: "+foo", target_cpu: "bar") - "inline asm code goes here" - "more can go here" - -Currently, the only supported properties are ``target_features`` and -``target_cpu``, with the same meaning as the ``"target-features"`` and -``"target-cpu"`` function attributes. - -Consecutive blocks with identical properties will be concatenated into one. - Note that the assembly string *must* be parseable by LLVM's integrated assembler (unless it is disabled), even when emitting a ``.s`` file. diff --git a/llvm/docs/ReleaseNotes.md b/llvm/docs/ReleaseNotes.md index cbec4d5b912d0..e42a959ab3101 100644 --- a/llvm/docs/ReleaseNotes.md +++ b/llvm/docs/ReleaseNotes.md @@ -111,10 +111,6 @@ Makes programs 10x faster by doing Special New Thing. corresponding metadata) now apply only at the point of definition, instead of for the execution of the function (for arguments) or forever (for returns). -* Module-level inline assembly now accepts optional `target_features` and - `target_cpu` properties. This resolves errors during LTO on some - architectures. - ### Changes to LLVM infrastructure * Removed ``Constant::isZeroValue``. It was functionally identical to diff --git a/llvm/include/llvm/Bitcode/LLVMBitCodes.h b/llvm/include/llvm/Bitcode/LLVMBitCodes.h index 1761e7a542a73..af4cac996a78c 100644 --- a/llvm/include/llvm/Bitcode/LLVMBitCodes.h +++ b/llvm/include/llvm/Bitcode/LLVMBitCodes.h @@ -120,8 +120,6 @@ enum ModuleCodes { // IFUNC: [ifunc value type, addrspace, resolver val#, linkage, visibility] MODULE_CODE_IFUNC = 18, - - MODULE_CODE_ASM_PROPERTY = 19, // [strchr x N] }; /// PARAMATTR blocks have code for defining a parameter attribute set. diff --git a/llvm/include/llvm/CodeGen/AsmPrinter.h b/llvm/include/llvm/CodeGen/AsmPrinter.h index 335bf9de9a071..78e64440657cc 100644 --- a/llvm/include/llvm/CodeGen/AsmPrinter.h +++ b/llvm/include/llvm/CodeGen/AsmPrinter.h @@ -930,19 +930,6 @@ class LLVM_ABI AsmPrinter : public MachineFunctionPass { const MCSubtargetInfo *EndInfo, const MachineInstr *MI); - /// Emit necessary directives to allow use of instructions that are permitted - /// by target features enabled by STI, but are not permitted by target - /// features enabled by the global subtarget (TM.getSubTargetInfo()). - /// Returns whether anything was emitted. - virtual bool emitTargetFeaturePush(const MCSubtargetInfo &STI) { - return false; - } - - /// Emit necessary directives to restore target feature state. - /// The \p DidPush argument is the result of the prior emitTargetFeaturePush() - /// call. - virtual void emitTargetFeaturePop(const MCSubtargetInfo &STI, bool DidPush) {} - /// This emits visibility information about symbol, if this is supported by /// the target. void emitVisibility(MCSymbol *Sym, unsigned Visibility, diff --git a/llvm/include/llvm/IR/Module.h b/llvm/include/llvm/IR/Module.h index 63d1013896b47..4f7e33969f16f 100644 --- a/llvm/include/llvm/IR/Module.h +++ b/llvm/include/llvm/IR/Module.h @@ -169,45 +169,6 @@ class LLVM_ABI Module { : Behavior(B), Key(K), Val(V) {} }; - struct GlobalAsmProperties { - std::string TargetFeatures; - std::string TargetCPU; - - /// Set a property using a string name. - /// Returns whether the property name was valid. - LLVM_ABI bool set(StringRef Name, std::string Value); - - /// Get a list of set properties as pairs of key and value. - LLVM_ABI SmallVector<std::pair<StringRef, StringRef>> getAsStrings() const; - - bool operator==(const GlobalAsmProperties &Other) const { - return TargetFeatures == Other.TargetFeatures && - TargetCPU == Other.TargetCPU; - } - - bool operator!=(const GlobalAsmProperties &Other) const { - return !(*this == Other); - } - }; - - struct GlobalAsmFragment { - std::string Asm; - GlobalAsmProperties Props; - - GlobalAsmFragment(StringRef Asm) : GlobalAsmFragment(Asm.str()) {} - GlobalAsmFragment(std::string AsmArg, GlobalAsmProperties Props = {}) - : Asm(std::move(AsmArg)), Props(std::move(Props)) { - if (!Asm.empty() && Asm.back() != '\n') - Asm += '\n'; - } - - bool empty() const { return Asm.empty(); } - - bool hasSameProperties(const GlobalAsmFragment &Other) const { - return Props == Other.Props; - } - }; - /// @} /// @name Member Variables /// @{ @@ -219,8 +180,7 @@ class LLVM_ABI Module { AliasListType AliasList; ///< The Aliases in the module IFuncListType IFuncList; ///< The IFuncs in the module NamedMDListType NamedMDList; ///< The named metadata in the module - /// Inline Asm at the global scope. - SmallVector<GlobalAsmFragment, 0> GlobalScopeAsm; + std::string GlobalScopeAsm; ///< Inline Asm at global scope. std::unique_ptr<ValueSymbolTable> ValSymTab; ///< Symbol table for values ComdatSymTabType ComdatSymTab; ///< Symbol table for COMDATs std::unique_ptr<MemoryBuffer> @@ -327,17 +287,8 @@ class LLVM_ABI Module { LLVMContext &getContext() const { return Context; } /// Get any module-scope inline assembly blocks. - ArrayRef<GlobalAsmFragment> getModuleInlineAsm() const { - return GlobalScopeAsm; - } - - /// Get any module-scope inline assembly blocks. - MutableArrayRef<GlobalAsmFragment> getModuleInlineAsm() { - return GlobalScopeAsm; - } - - /// Return whether there is any module-scope inline assembly. - bool hasModuleInlineAsm() const { return !GlobalScopeAsm.empty(); } + /// @returns a string containing the module-scope inline assembly blocks. + const std::string &getModuleInlineAsm() const { return GlobalScopeAsm; } /// Get a RandomNumberGenerator salted for use with this module. The /// RNG can be seeded via -rng-seed=<uint64> and is salted with the @@ -374,45 +325,20 @@ class LLVM_ABI Module { /// Set the target triple. void setTargetTriple(Triple T) { TargetTriple = std::move(T); } - void removeModuleInlineAsm() { GlobalScopeAsm.clear(); } - /// Set the module-scope inline assembly blocks. /// A trailing newline is added if the input doesn't have one. - void setModuleInlineAsm(GlobalAsmFragment Fragment) { - GlobalScopeAsm.clear(); - appendModuleInlineAsm(std::move(Fragment)); - } - - void setModuleInlineAsm(ArrayRef<GlobalAsmFragment> Fragments) { - GlobalScopeAsm.clear(); - append_range(GlobalScopeAsm, Fragments); + void setModuleInlineAsm(StringRef Asm) { + GlobalScopeAsm = std::string(Asm); + if (!GlobalScopeAsm.empty() && GlobalScopeAsm.back() != '\n') + GlobalScopeAsm += '\n'; } /// Append to the module-scope inline assembly blocks. /// A trailing newline is added if the input doesn't have one. - void appendModuleInlineAsm(GlobalAsmFragment Fragment) { - if (Fragment.empty()) - return; - - if (!GlobalScopeAsm.empty() && - GlobalScopeAsm.back().hasSameProperties(Fragment)) { - GlobalScopeAsm.back().Asm += Fragment.Asm; - } else { - GlobalScopeAsm.emplace_back(std::move(Fragment)); - } - } - - /// Prepend to the module-scope inline assembly blocks. - void prependModuleInlineAsm(GlobalAsmFragment Fragment) { - if (Fragment.empty()) - return; - - if (!GlobalScopeAsm.empty() && - GlobalScopeAsm.front().hasSameProperties(Fragment)) { - GlobalScopeAsm.front().Asm.insert(0, Fragment.Asm); - } else { - GlobalScopeAsm.insert(GlobalScopeAsm.begin(), std::move(Fragment)); - } + void appendModuleInlineAsm(StringRef Asm) { + GlobalScopeAsm += Asm; + if (!GlobalScopeAsm.empty() && GlobalScopeAsm.back() != '\n') + GlobalScopeAsm += '\n'; } /// @} diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp index 0a5b4c6c91879..75e6add0ec76f 100644 --- a/llvm/lib/AsmParser/LLParser.cpp +++ b/llvm/lib/AsmParser/LLParser.cpp @@ -641,49 +641,16 @@ bool LLParser::parseTopLevelEntities() { /// toplevelentity /// ::= 'module' 'asm' STRINGCONSTANT -/// ::= 'module' 'asm' '(' 'property_name1:' STRINGCONSTANT ',' -/// 'property_name2:' STRINGCONSTANT ')' -/// STRINGCONSTANT bool LLParser::parseModuleAsm() { assert(Lex.getKind() == lltok::kw_module); Lex.Lex(); std::string AsmStr; - if (parseToken(lltok::kw_asm, "expected 'module asm'")) + if (parseToken(lltok::kw_asm, "expected 'module asm'") || + parseStringConstant(AsmStr)) return true; - Module::GlobalAsmProperties Props; - if (EatIfPresent(lltok::lparen)) { - while (true) { - std::string Key, Value; - SMLoc Loc = Lex.getLoc(); - if (Lex.getKind() != lltok::LabelStr) - return error(Loc, "expected property name followed by ':'"); - - Key = Lex.getStrVal(); - Lex.Lex(); - - if (parseStringConstant(Value)) - return true; - - if (!Props.set(Key, Value)) - return error(Loc, "unknown property name"); - - if (EatIfPresent(lltok::rparen)) - break; - if (parseToken(lltok::comma, "expected ',' or ')'")) - return true; - } - } - - do { - std::string AsmStrPart; - if (parseStringConstant(AsmStrPart)) - return true; - AsmStr += AsmStrPart + "\n"; - } while (Lex.getKind() == lltok::StringConstant); - - M->appendModuleInlineAsm({AsmStr, Props}); + M->appendModuleInlineAsm(AsmStr); return false; } diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index 06e9aea4fd3ac..2bd251efd05ce 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -4580,9 +4580,6 @@ Error BitcodeReader::parseModule(uint64_t ResumeBit, // Initialize to the current module's layout string in case none is specified. std::string TentativeDataLayoutStr = TheModule->getDataLayoutStr(); - // Apply to the following module asm. - Module::GlobalAsmProperties Props; - auto ResolveDataLayout = [&]() -> Error { if (ResolvedDataLayout) return Error::success(); @@ -4791,23 +4788,11 @@ Error BitcodeReader::parseModule(uint64_t ResumeBit, return error("Invalid data layout record"); break; } - case bitc::MODULE_CODE_ASM_PROPERTY: { - std::string Str; - if (convertToString(Record, 0, Str)) - return error("Invalid module asm record"); - size_t SepPos = Str.find('\0'); - if (SepPos == std::string::npos) - return error("Invalid module asm record"); - if (!Props.set(StringRef(Str.data(), SepPos), Str.substr(SepPos + 1))) - return error("Unknown module asm property"); - break; - } case bitc::MODULE_CODE_ASM: { // ASM: [strchr x N] std::string S; if (convertToString(Record, 0, S)) return error("Invalid asm record"); - TheModule->appendModuleInlineAsm(Module::GlobalAsmFragment(S, Props)); - Props = {}; + TheModule->setModuleInlineAsm(S); break; } case bitc::MODULE_CODE_DEPLIB: { // DEPLIB: [strchr x N] diff --git a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp index 493cbec7506f2..4aa203b0d12d1 100644 --- a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -1551,19 +1551,9 @@ void ModuleBitcodeWriter::writeModuleInfo() { const std::string &DL = M.getDataLayoutStr(); if (!DL.empty()) writeStringRecord(Stream, bitc::MODULE_CODE_DATALAYOUT, DL, 0 /*TODO*/); - - for (const Module::GlobalAsmFragment &Frag : M.getModuleInlineAsm()) { - SmallVector<std::pair<StringRef, StringRef>> Props = - Frag.Props.getAsStrings(); - for (auto [Key, Value] : Props) { - SmallVector<unsigned, 64> Record; - Record.append(Key.begin(), Key.end()); - Record.push_back(0); - Record.append(Value.begin(), Value.end()); - Stream.EmitRecord(bitc::MODULE_CODE_ASM_PROPERTY, Record); - } - writeStringRecord(Stream, bitc::MODULE_CODE_ASM, Frag.Asm, 0 /*TODO*/); - } + if (!M.getModuleInlineAsm().empty()) + writeStringRecord(Stream, bitc::MODULE_CODE_ASM, M.getModuleInlineAsm(), + 0 /*TODO*/); // Emit information about sections and GC, computing how many there are. Also // compute the maximum alignment value. diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 8248a05f1a35f..abb20a7919fa1 100644 --- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -110,7 +110,6 @@ #include "llvm/MC/MCTargetOptions.h" #include "llvm/MC/MCValue.h" #include "llvm/MC/SectionKind.h" -#include "llvm/MC/TargetRegistry.h" #include "llvm/Object/ELFTypes.h" #include "llvm/Pass.h" #include "llvm/Remarks/RemarkStreamer.h" @@ -128,6 +127,7 @@ #include "llvm/Target/TargetLoweringObjectFile.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetOptions.h" +#include "llvm/TargetParser/Triple.h" #include <algorithm> #include <cassert> #include <cinttypes> @@ -610,29 +610,13 @@ bool AsmPrinter::doInitialization(Module &M) { BeginGCAssembly(M); // Emit module-level inline asm if it exists. - if (M.hasModuleInlineAsm()) { + if (!M.getModuleInlineAsm().empty()) { OutStreamer->AddComment("Start of file scope inline assembly"); OutStreamer->addBlankLine(); - for (const Module::GlobalAsmFragment &Frag : M.getModuleInlineAsm()) { - if (!Frag.Props.TargetFeatures.empty() || !Frag.Props.TargetCPU.empty()) { - std::unique_ptr<MCSubtargetInfo> AsmSTI( - TM.getTarget().createMCSubtargetInfo(TM.getTargetTriple(), - Frag.Props.TargetCPU, - Frag.Props.TargetFeatures)); - bool DidPush = emitTargetFeaturePush(*AsmSTI); - emitInlineAsm( - Frag.Asm, *AsmSTI, TM.Options.MCOptions, nullptr, - InlineAsm::AsmDialect(TM.getMCAsmInfo().getAssemblerDialect())); - emitTargetFeaturePop(*AsmSTI, DidPush); - } else { - // If the module asm does not explicitly specify target features, - // fall back to default subtargetinfo. - emitInlineAsm( - Frag.Asm + "\n", TM.getMCSubtargetInfo(), TM.Options.MCOptions, - nullptr, - InlineAsm::AsmDialect(TM.getMCAsmInfo().getAssemblerDialect())); - } - } + emitInlineAsm( + M.getModuleInlineAsm() + "\n", TM.getMCSubtargetInfo(), + TM.Options.MCOptions, nullptr, + InlineAsm::AsmDialect(TM.getMCAsmInfo().getAssemblerDialect())); OutStreamer->AddComment("End of file scope inline assembly"); OutStreamer->addBlankLine(); } diff --git a/llvm/lib/IR/AsmWriter.cpp b/llvm/lib/IR/AsmWriter.cpp index 02d6bcd90add0..665d7122af2c7 100644 --- a/llvm/lib/IR/AsmWriter.cpp +++ b/llvm/lib/IR/AsmWriter.cpp @@ -3126,38 +3126,21 @@ void AssemblyWriter::printModule(const Module *M) { if (!M->getTargetTriple().empty()) Out << "target triple = \"" << M->getTargetTriple().str() << "\"\n"; - if (M->hasModuleInlineAsm()) { + if (!M->getModuleInlineAsm().empty()) { Out << '\n'; - for (const Module::GlobalAsmFragment &Frag : M->getModuleInlineAsm()) { - Out << "module asm"; - SmallVector<std::pair<StringRef, StringRef>> Props = - Frag.Props.getAsStrings(); - if (!Props.empty()) { - ListSeparator LS; - Out << "("; - for (auto [Key, Value] : Props) { - Out << LS; - Out << Key << ": \""; - printEscapedString(Value, Out); - Out << "\""; - } - Out << ")"; - } - Out << "\n"; - // Split the string into lines, to make it easier to read the .ll file. - StringRef Asm = Frag.Asm; - do { - StringRef Front; - std::tie(Front, Asm) = Asm.split('\n'); - - // We found a newline, print the portion of the asm string from the - // last newline up to this newline. - Out << " \""; - printEscapedString(Front, Out); - Out << "\"\n"; - } while (!Asm.empty()); - } + // Split the string into lines, to make it easier to read the .ll file. + StringRef Asm = M->getModuleInlineAsm(); + do { + StringRef Front; + std::tie(Front, Asm) = Asm.split('\n'); + + // We found a newline, print the portion of the asm string from the + // last newline up to this newline. + Out << "module asm \""; + printEscapedString(Front, Out); + Out << "\"\n"; + } while (!Asm.empty()); } printTypeIdentities(); diff --git a/llvm/lib/IR/Core.cpp b/llvm/lib/IR/Core.cpp index a7abd3eed31c3..6c6c3b5c84ede 100644 --- a/llvm/lib/IR/Core.cpp +++ b/llvm/lib/IR/Core.cpp @@ -510,18 +510,7 @@ void LLVMAppendModuleInlineAsm(LLVMModuleRef M, const char *Asm, size_t Len) { } const char *LLVMGetModuleInlineAsm(LLVMModuleRef M, size_t *Len) { - Module *Mod = unwrap(M); - ArrayRef<Module::GlobalAsmFragment> Frags = Mod->getModuleInlineAsm(); - if (Frags.empty()) { - *Len = 0; - return nullptr; - } - - if (Frags.size() != 1) - reportFatalUsageError("LLVMGetModuleInlineAsm is not supported if there is " - "more than one module inline assembly fragment"); - - auto &Str = Frags.begin()->Asm; + auto &Str = unwrap(M)->getModuleInlineAsm(); *Len = Str.length(); return Str.c_str(); } diff --git a/llvm/lib/IR/Module.cpp b/llvm/lib/IR/Module.cpp index 34e44e26d5db5..40ef7e354da72 100644 --- a/llvm/lib/IR/Module.cpp +++ b/llvm/lib/IR/Module.cpp @@ -977,23 +977,3 @@ ControlFlowGuardMode Module::getControlFlowGuardMode() const { return static_cast<ControlFlowGuardMode>(CI->getZExtValue()); return ControlFlowGuardMode::Disabled; } - -bool Module::GlobalAsmProperties::set(StringRef Name, std::string Value) { - if (Name == "target_features") - TargetFeatures = std::move(Value); - else if (Name == "target_cpu") - TargetCPU = std::move(Value); - else - return false; - return true; -} - -SmallVector<std::pair<StringRef, StringRef>> -Module::GlobalAsmProperties::getAsStrings() const { - SmallVector<std::pair<StringRef, StringRef>> Props; - if (!TargetFeatures.empty()) - Props.emplace_back("target_features", TargetFeatures); - if (!TargetCPU.empty()) - Props.emplace_back("target_cpu", TargetCPU); - return Props; -} diff --git a/llvm/lib/LTO/LTO.cpp b/llvm/lib/LTO/LTO.cpp index b672f4e5fac14..6a754f95092bb 100644 --- a/llvm/lib/LTO/LTO.cpp +++ b/llvm/lib/LTO/LTO.cpp @@ -1112,7 +1112,7 @@ LTO::addRegularLTO(InputFile &Input, ArrayRef<SymbolResolution> InputRes, // Prepend ".lto_discard <sym>, <sym>*" directive to each module inline asm // block. - if (M.hasModuleInlineAsm()) { + if (!M.getModuleInlineAsm().empty()) { std::string NewIA = ".lto_discard"; if (!NonPrevailingAsmSymbols.empty()) { // Don't dicard a symbol if there is a live .symver for it. @@ -1124,7 +1124,7 @@ LTO::addRegularLTO(InputFile &Input, ArrayRef<SymbolResolution> InputRes, NewIA += " " + llvm::join(NonPrevailingAsmSymbols, ", "); } NewIA += "\n"; - M.prependModuleInlineAsm(NewIA); + M.setModuleInlineAsm(NewIA + M.getModuleInlineAsm()); } assert(MsymI == MsymE); diff --git a/llvm/lib/Linker/IRMover.cpp b/llvm/lib/Linker/IRMover.cpp index 3b72b412d0b2e..239201bde1cec 100644 --- a/llvm/lib/Linker/IRMover.cpp +++ b/llvm/lib/Linker/IRMover.cpp @@ -1562,11 +1562,8 @@ Error IRLinker::run() { if (!IsPerformingImport && !SrcM->getModuleInlineAsm().empty()) { // Append the module inline asm string. - for (const Module::GlobalAsmFragment &Frag : SrcM->getModuleInlineAsm()) { - Module::GlobalAsmFragment NewFrag(Frag); - NewFrag.Asm = adjustInlineAsm(NewFrag.Asm, SrcTriple); - DstM.appendModuleInlineAsm(std::move(NewFrag)); - } + DstM.appendModuleInlineAsm(adjustInlineAsm(SrcM->getModuleInlineAsm(), + SrcTriple)); } else if (IsPerformingImport) { // Import any symver directives for symbols in DstM. ModuleSymbolTable::CollectAsmSymvers(*SrcM, @@ -1576,7 +1573,7 @@ Error IRLinker::run() { S += Name; S += ", "; S += Alias; - DstM.appendModuleInlineAsm(std::string(S)); + DstM.appendModuleInlineAsm(S); } }); } diff --git a/llvm/lib/Object/ModuleSymbolTable.cpp b/llvm/lib/Object/ModuleSymbolTable.cpp index 44f717ec12323..1da5fa9c10a0b 100644 --- a/llvm/lib/Object/ModuleSymbolTable.cpp +++ b/llvm/lib/Object/ModuleSymbolTable.cpp @@ -72,7 +72,8 @@ initializeRecordStreamer(const Module &M, // caused errors in the first run, suppress the second run. if (M.getContext().getDiagHandlerPtr()->HasErrors) return; - if (!M.hasModuleInlineAsm()) + StringRef InlineAsm = M.getModuleInlineAsm(); + if (InlineAsm.empty()) return; std::string Err; @@ -89,55 +90,52 @@ initializeRecordStreamer(const Module &M, if (!MAI) return; + std::unique_ptr<MCSubtargetInfo> STI(T->createMCSubtargetInfo(TT, "", "")); + if (!STI) + return; + std::unique_ptr<MCInstrInfo> MCII(T->createMCInstrInfo()); if (!MCII) return; - for (const Module::GlobalAsmFragment &Frag : M.getModuleInlineAsm()) { - std::unique_ptr<MCSubtargetInfo> STI(T->createMCSubtargetInfo( - TT, Frag.Props.TargetCPU, Frag.Props.TargetFeatures)); - if (!STI) - return; - - std::unique_ptr<MemoryBuffer> Buffer( - MemoryBuffer::getMemBuffer(Frag.Asm, "<inline asm>")); - SourceMgr SrcMgr; - SrcMgr.AddNewSourceBuffer(std::move(Buffer), SMLoc()); - - MCContext MCCtx(TT, *MAI, *MRI, *STI, &SrcMgr); - std::unique_ptr<MCObjectFileInfo> MOFI( - T->createMCObjectFileInfo(MCCtx, /*PIC=*/false)); - MCCtx.setObjectFileInfo(MOFI.get()); - RecordStreamer Streamer(MCCtx, M); - T->createNullTargetStreamer(Streamer); - - std::unique_ptr<MCAsmParser> Parser( - createMCAsmParser(SrcMgr, MCCtx, Streamer, *MAI)); - - std::unique_ptr<MCTargetAsmParser> TAP( - T->createMCAsmParser(*STI, *Parser, *MCII)); - if (!TAP) - return; - - MCCtx.setDiagnosticHandler([&](const SMDiagnostic &SMD, bool IsInlineAsm, - const SourceMgr &SrcMgr, - std::vector<const MDNode *> &LocInfos) { - M.getContext().diagnose( - DiagnosticInfoSrcMgr(SMD, M.getName(), IsInlineAsm, /*LocCookie=*/0)); - }); - - // Module-level inline asm is assumed to use At&t syntax (see - // AsmPrinter::doInitialization()). - Parser->setAssemblerDialect(InlineAsm::AD_ATT); - - Parser->setSymbolScanningMode(true); - - Parser->setTargetParser(*TAP); - if (Parser->Run(false)) - return; - - Init(Streamer); - } + std::unique_ptr<MemoryBuffer> Buffer( + MemoryBuffer::getMemBuffer(InlineAsm, "<inline asm>")); + SourceMgr SrcMgr; + SrcMgr.AddNewSourceBuffer(std::move(Buffer), SMLoc()); + + MCContext MCCtx(TT, *MAI, *MRI, *STI, &SrcMgr); + std::unique_ptr<MCObjectFileInfo> MOFI( + T->createMCObjectFileInfo(MCCtx, /*PIC=*/false)); + MCCtx.setObjectFileInfo(MOFI.get()); + RecordStreamer Streamer(MCCtx, M); + T->createNullTargetStreamer(Streamer); + + std::unique_ptr<MCAsmParser> Parser( + createMCAsmParser(SrcMgr, MCCtx, Streamer, *MAI)); + + std::unique_ptr<MCTargetAsmParser> TAP( + T->createMCAsmParser(*STI, *Parser, *MCII)); + if (!TAP) + return; + + MCCtx.setDiagnosticHandler([&](const SMDiagnostic &SMD, bool IsInlineAsm, + const SourceMgr &SrcMgr, + std::vector<const MDNode *> &LocInfos) { + M.getContext().diagnose( + DiagnosticInfoSrcMgr(SMD, M.getName(), IsInlineAsm, /*LocCookie=*/0)); + }); + + // Module-level inline asm is assumed to use At&t syntax (see + // AsmPrinter::doInitialization()). + Parser->setAssemblerDialect(InlineAsm::AD_ATT); + + Parser->setSymbolScanningMode(true); + + Parser->setTargetParser(*TAP); + if (Parser->Run(false)) + return; + + Init(Streamer); } void ModuleSymbolTable::CollectAsmSymbols( diff --git a/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp b/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp index e37ea27364e6e..dbda25c34cee0 100644 --- a/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp +++ b/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp @@ -113,8 +113,7 @@ class RISCVAsmPrinter : public AsmPrinter { void emitEndOfAsmFile(Module &M) override; void emitFunctionEntryLabel() override; - bool emitTargetFeaturePush(const MCSubtargetInfo &STI) override; - void emitTargetFeaturePop(const MCSubtargetInfo &STI, bool DidPush) override; + bool emitDirectiveOptionArch(); void emitNoteGnuProperty(const Module &M); @@ -524,19 +523,19 @@ bool RISCVAsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI, return false; } -bool RISCVAsmPrinter::emitTargetFeaturePush(const MCSubtargetInfo &STI) { +bool RISCVAsmPrinter::emitDirectiveOptionArch() { RISCVTargetStreamer &RTS = getTargetStreamer(); SmallVector<RISCVOptionArchArg> NeedEmitStdOptionArgs; const MCSubtargetInfo &MCSTI = TM.getMCSubtargetInfo(); for (const auto &Feature : MCSTI.getAllProcessorFeatures()) { - if (STI.hasFeature(Feature.Value) == MCSTI.hasFeature(Feature.Value)) + if (STI->hasFeature(Feature.Value) == MCSTI.hasFeature(Feature.Value)) continue; if (!llvm::RISCVISAInfo::isSupportedExtensionFeature(Feature.key())) continue; - auto Delta = STI.hasFeature(Feature.Value) ? RISCVOptionArchArgType::Plus - : RISCVOptionArchArgType::Minus; + auto Delta = STI->hasFeature(Feature.Value) ? RISCVOptionArchArgType::Plus + : RISCVOptionArchArgType::Minus; StringRef ExtName = Feature.key(); ExtName.consume_front("experimental-"); NeedEmitStdOptionArgs.emplace_back(Delta, ExtName.str()); @@ -550,16 +549,11 @@ bool RISCVAsmPrinter::emitTargetFeaturePush(const MCSubtargetInfo &STI) { return false; } -void RISCVAsmPrinter::emitTargetFeaturePop(const MCSubtargetInfo &STI, - bool DidPush) { - if (DidPush) - getTargetStreamer().emitDirectiveOptionPop(); -} - bool RISCVAsmPrinter::runOnMachineFunction(MachineFunction &MF) { STI = &MF.getSubtarget<RISCVSubtarget>(); + RISCVTargetStreamer &RTS = getTargetStreamer(); - bool EmittedOptionArch = emitTargetFeaturePush(*STI); + bool EmittedOptionArch = emitDirectiveOptionArch(); SetupMachineFunction(MF); emitFunctionBody(); @@ -567,7 +561,8 @@ bool RISCVAsmPrinter::runOnMachineFunction(MachineFunction &MF) { // Emit the XRay table emitXRayTable(); - emitTargetFeaturePop(*STI, EmittedOptionArch); + if (EmittedOptionArch) + RTS.emitDirectiveOptionPop(); return false; } diff --git a/llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp b/llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp index 22d0d97090746..2a5d16a470c4a 100644 --- a/llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp @@ -955,7 +955,7 @@ bool SPIRVAsmPrinter::doInitialization(Module &M) { if (!M.getModuleInlineAsm().empty()) { M.getContext().emitError( "SPIR-V does not support module-level inline assembly"); - M.removeModuleInlineAsm(); + M.setModuleInlineAsm(""); } // Register the NSDI handler before calling the base class so that diff --git a/llvm/lib/Transforms/IPO/ExtractGV.cpp b/llvm/lib/Transforms/IPO/ExtractGV.cpp index 4b76b02c32fe4..16fdb93e2b21b 100644 --- a/llvm/lib/Transforms/IPO/ExtractGV.cpp +++ b/llvm/lib/Transforms/IPO/ExtractGV.cpp @@ -58,7 +58,7 @@ ExtractGVPass::ExtractGVPass(std::vector<GlobalValue *> &GVs, bool deleteS, PreservedAnalyses ExtractGVPass::run(Module &M, ModuleAnalysisManager &) { // Visit the global inline asm. if (!deleteStuff) - M.removeModuleInlineAsm(); + M.setModuleInlineAsm(""); // For simplicity, just give all GlobalValues ExternalLinkage. A trickier // implementation could figure out which GlobalValues are actually diff --git a/llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp b/llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp index e857c94330bad..a486979a58c2d 100644 --- a/llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp +++ b/llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp @@ -388,7 +388,7 @@ void splitAndWriteThinLTOBitcode( return false; })); StripDebugInfo(*MergedM); - MergedM->removeModuleInlineAsm(); + MergedM->setModuleInlineAsm(""); // Clone any llvm.*used globals to ensure the included values are // not deleted. diff --git a/llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp index 375ac069272eb..c349fe33dd237 100644 --- a/llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp @@ -1283,20 +1283,18 @@ void DataFlowSanitizer::addGlobalNameSuffix(GlobalValue *GV) { // corrupting asm which happens to contain the symbol name as a substring. // Note that the substitution for .symver assumes that the versioned symbol // also has an instrumented name. - for (Module::GlobalAsmFragment &Frag : - GV->getParent()->getModuleInlineAsm()) { - std::string SearchStr = ".symver " + GVName + ","; - size_t Pos = Frag.Asm.find(SearchStr); - if (Pos != std::string::npos) { - Frag.Asm.replace(Pos, SearchStr.size(), - ".symver " + GVName + Suffix + ","); - Pos = Frag.Asm.find('@'); - - if (Pos == std::string::npos) - report_fatal_error(Twine("unsupported .symver: ", Frag.Asm)); - - Frag.Asm.replace(Pos, 1, Suffix + "@"); - } + std::string Asm = GV->getParent()->getModuleInlineAsm(); + std::string SearchStr = ".symver " + GVName + ","; + size_t Pos = Asm.find(SearchStr); + if (Pos != std::string::npos) { + Asm.replace(Pos, SearchStr.size(), ".symver " + GVName + Suffix + ","); + Pos = Asm.find('@'); + + if (Pos == std::string::npos) + report_fatal_error(Twine("unsupported .symver: ", Asm)); + + Asm.replace(Pos, 1, Suffix + "@"); + GV->getParent()->setModuleInlineAsm(Asm); } } diff --git a/llvm/lib/Transforms/Utils/SplitModule.cpp b/llvm/lib/Transforms/Utils/SplitModule.cpp index 8e70902c4dac2..64910b4d1ce99 100644 --- a/llvm/lib/Transforms/Utils/SplitModule.cpp +++ b/llvm/lib/Transforms/Utils/SplitModule.cpp @@ -304,7 +304,7 @@ void llvm::SplitModule( return isInPartition(GV, I, N); })); if (I != 0) - MPart->removeModuleInlineAsm(); + MPart->setModuleInlineAsm(""); ModuleCallback(std::move(MPart)); } } diff --git a/llvm/test/Assembler/module-asm-invalid.ll b/llvm/test/Assembler/module-asm-invalid.ll deleted file mode 100644 index 34e5b71e683a9..0000000000000 --- a/llvm/test/Assembler/module-asm-invalid.ll +++ /dev/null @@ -1,25 +0,0 @@ -; RUN: split-file %s %t -; RUN: not llvm-as -disable-output < %t/invalid_prop.ll 2>&1 | FileCheck %t/invalid_prop.ll -; RUN: not llvm-as -disable-output < %t/missing_value1.ll 2>&1 | FileCheck %t/missing_value1.ll -; RUN: not llvm-as -disable-output < %t/missing_value2.ll 2>&1 | FileCheck %t/missing_value2.ll -; RUN: not llvm-as -disable-output < %t/missing_paren.ll 2>&1 | FileCheck %t/missing_paren.ll - -;--- invalid_prop.ll -; CHECK: unknown property name -module asm(foo: "bar") - "asm" - -;--- missing_value1.ll -; CHECK: expected property name followed by ':' -module asm(target_features) - "asm" - -;--- missing_value2.ll -; CHECK: expected string constant -module asm(target_features:) - "asm" - -;--- missing_paren.ll -; CHECK: expected ',' or ')' -module asm(target_features: "bar" - "asm" diff --git a/llvm/test/Bitcode/compatibility-3.6.ll b/llvm/test/Bitcode/compatibility-3.6.ll index c79086bad1ba5..288e0fc50a9ba 100644 --- a/llvm/test/Bitcode/compatibility-3.6.ll +++ b/llvm/test/Bitcode/compatibility-3.6.ll @@ -14,8 +14,7 @@ target triple = "x86_64-apple-macosx10.10.0" ;; Module-level assembly module asm "beep boop" -; CHECK: module asm -; CHECK-NEXT: "beep boop" +; CHECK: module asm "beep boop" ;; Comdats $comdat.any = comdat any diff --git a/llvm/test/Bitcode/compatibility-3.7.ll b/llvm/test/Bitcode/compatibility-3.7.ll index 00b2bb9b30b62..ef9490310fe5d 100644 --- a/llvm/test/Bitcode/compatibility-3.7.ll +++ b/llvm/test/Bitcode/compatibility-3.7.ll @@ -14,8 +14,7 @@ target triple = "x86_64-apple-macosx10.10.0" ;; Module-level assembly module asm "beep boop" -; CHECK: module asm -; CHECK-NEXT: "beep boop" +; CHECK: module asm "beep boop" ;; Comdats $comdat.any = comdat any diff --git a/llvm/test/Bitcode/compatibility-3.8.ll b/llvm/test/Bitcode/compatibility-3.8.ll index 5b86d5ffa1fee..538d6101b3994 100644 --- a/llvm/test/Bitcode/compatibility-3.8.ll +++ b/llvm/test/Bitcode/compatibility-3.8.ll @@ -13,8 +13,7 @@ target triple = "x86_64-apple-macosx10.10.0" ;; Module-level assembly module asm "beep boop" -; CHECK: module asm -; CHECK-NEXT: "beep boop" +; CHECK: module asm "beep boop" ;; Comdats $comdat.any = comdat any diff --git a/llvm/test/Bitcode/compatibility-3.9.ll b/llvm/test/Bitcode/compatibility-3.9.ll index eca4bbdf03766..3bfef73e485dd 100644 --- a/llvm/test/Bitcode/compatibility-3.9.ll +++ b/llvm/test/Bitcode/compatibility-3.9.ll @@ -13,8 +13,7 @@ target triple = "x86_64-apple-macosx10.10.0" ;; Module-level assembly module asm "beep boop" -; CHECK: module asm -; CHECK-NEXT: "beep boop" +; CHECK: module asm "beep boop" ;; Comdats $comdat.any = comdat any diff --git a/llvm/test/Bitcode/compatibility-4.0.ll b/llvm/test/Bitcode/compatibility-4.0.ll index 8551b98815b1a..aaf9fe5492171 100644 --- a/llvm/test/Bitcode/compatibility-4.0.ll +++ b/llvm/test/Bitcode/compatibility-4.0.ll @@ -13,8 +13,7 @@ target triple = "x86_64-apple-macosx10.10.0" ;; Module-level assembly module asm "beep boop" -; CHECK: module asm -; CHECK-NEXT: "beep boop" +; CHECK: module asm "beep boop" ;; Comdats $comdat.any = comdat any diff --git a/llvm/test/Bitcode/compatibility-5.0.ll b/llvm/test/Bitcode/compatibility-5.0.ll index 883ac3eaaa293..b820417107e8b 100644 --- a/llvm/test/Bitcode/compatibility-5.0.ll +++ b/llvm/test/Bitcode/compatibility-5.0.ll @@ -13,8 +13,7 @@ target triple = "x86_64-apple-macosx10.10.0" ;; Module-level assembly module asm "beep boop" -; CHECK: module asm -; CHECK-NEXT: "beep boop" +; CHECK: module asm "beep boop" ;; Comdats $comdat.any = comdat any diff --git a/llvm/test/Bitcode/compatibility-6.0.ll b/llvm/test/Bitcode/compatibility-6.0.ll index 624d5bd7703c6..67e96c7277cc3 100644 --- a/llvm/test/Bitcode/compatibility-6.0.ll +++ b/llvm/test/Bitcode/compatibility-6.0.ll @@ -13,8 +13,7 @@ target triple = "x86_64-apple-macosx10.10.0" ;; Module-level assembly module asm "beep boop" -; CHECK: module asm -; CHECK-NEXT: "beep boop" +; CHECK: module asm "beep boop" ;; Comdats $comdat.any = comdat any diff --git a/llvm/test/Bitcode/compatibility.ll b/llvm/test/Bitcode/compatibility.ll index 97889d4687516..d55aa1dc496df 100644 --- a/llvm/test/Bitcode/compatibility.ll +++ b/llvm/test/Bitcode/compatibility.ll @@ -16,8 +16,7 @@ target triple = "x86_64-apple-macosx10.10.0" ;; Module-level assembly module asm "beep boop" -; CHECK: module asm -; CHECK-NEXT: "beep boop" +; CHECK: module asm "beep boop" ;; Comdats $comdat.any = comdat any diff --git a/llvm/test/Bitcode/highLevelStructure.3.2.ll b/llvm/test/Bitcode/highLevelStructure.3.2.ll index cd9a34c810d57..f2770ea4e4d34 100644 --- a/llvm/test/Bitcode/highLevelStructure.3.2.ll +++ b/llvm/test/Bitcode/highLevelStructure.3.2.ll @@ -9,8 +9,7 @@ target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v16:16:16-v24:32:32-v32:32:32-v48:64:64-v64:64:64-v96:128:128-v128:128:128-v192:256:256-v256:256:256-v512:512:512-v1024:1024:1024-a0:0:64-f80:32:32-n8:16:32-S32" ; Module-Level Inline Assembly Test -; CHECK: module asm -; CHECK-NEXT: "some assembly" +; CHECK: module asm "some assembly" module asm "some assembly" ; Named Types Test diff --git a/llvm/test/Bitcode/module-asm.ll b/llvm/test/Bitcode/module-asm.ll deleted file mode 100644 index 406f25c5dd28c..0000000000000 --- a/llvm/test/Bitcode/module-asm.ll +++ /dev/null @@ -1,29 +0,0 @@ -; RUN: llvm-as < %s | llvm-dis | FileCheck %s - -; CHECK: module asm -; CHECK: "asm line 0" -; CHECK: module asm(target_features: "+foo", target_cpu: "foo_cpu") -; CHECK: "asm line 1" -; CHECK: "asm line 2" -; CHECK: module asm(target_features: "+bar") -; CHECK: "asm line 3" -; CHECK: module asm(target_cpu: "bar_cpu") -; CHECK: "asm line 4" -; CHECK: module asm -; CHECK: "asm line 5" - -module asm - "asm line 0" - -module asm(target_features: "+foo", target_cpu: "foo_cpu") - "asm line 1" - "asm line 2" - -module asm(target_features: "+bar") - "asm line 3" - -module asm(target_cpu: "bar_cpu") - "asm line 4" - -module asm - "asm line 5" diff --git a/llvm/test/CodeGen/RISCV/module-asm-features.ll b/llvm/test/CodeGen/RISCV/module-asm-features.ll deleted file mode 100644 index ab16acab48688..0000000000000 --- a/llvm/test/CodeGen/RISCV/module-asm-features.ll +++ /dev/null @@ -1,17 +0,0 @@ -; RUN: llc -mtriple=riscv64-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=CHECK,EXTRA-FEATURES -; RUN: llc -mtriple=riscv64-unknown-linux-gnu -mattr=+d < %s | FileCheck %s --check-prefixes=CHECK,SAME-FEATURES - -; This should work fine, because the module asm specifies the necessary -; target features - -; SAME-FEATURES-NOT: .option arch -; EXTRA-FEATURES: .option push -; EXTRA-FEATURES: .option arch, +d -; CHECK: fld ft0, 0(sp) -; EXTRA-FEATURES: .option pop - -module asm(target_features: "+d") - ".globl func" - "func:" - "fld f0, 0(sp)" - "ret" diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/prefix-rename.ll b/llvm/test/Instrumentation/DataFlowSanitizer/prefix-rename.ll index 829dd829d51f9..454c496d1d4bb 100644 --- a/llvm/test/Instrumentation/DataFlowSanitizer/prefix-rename.ll +++ b/llvm/test/Instrumentation/DataFlowSanitizer/prefix-rename.ll @@ -2,8 +2,7 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" -; CHECK: module asm -; CHECK-NEXT: ".symver f1.dfsan,f.dfsan@@version1" +; CHECK: module asm ".symver f1.dfsan,f.dfsan@@version1" module asm ".symver f1,f@@version1" ; CHECK: @f2.dfsan = alias {{.*}} @f1.dfsan diff --git a/llvm/test/LTO/RISCV/module-asm.ll b/llvm/test/LTO/RISCV/module-asm.ll deleted file mode 100644 index 73320185e778a..0000000000000 --- a/llvm/test/LTO/RISCV/module-asm.ll +++ /dev/null @@ -1,18 +0,0 @@ -; RUN: llvm-as %s -o %t.o -; RUN: llvm-lto2 run -save-temps -filetype=asm -o %t.s %t.o -r=%t.o,func,p -; RUN: llvm-nm %t.o | FileCheck %s --check-prefix NM -; RUN: llvm-nm %t.s.0.5.precodegen.bc | FileCheck %s --check-prefix NM -; RUN: FileCheck %s --input-file %t.s.0 - -; NM: T func - -; CHECK: fld ft0, 0(sp) - -target datalayout = "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128" -target triple = "riscv64-unknown-linux-gnu" - -module asm(target_features: "+d") - ".globl func" - "func:" - "fld f0, 0(sp)" - "ret" diff --git a/llvm/test/LTO/X86/inline-asm-lto-discard.ll b/llvm/test/LTO/X86/inline-asm-lto-discard.ll index 6c5173c3f9553..88492e4366489 100644 --- a/llvm/test/LTO/X86/inline-asm-lto-discard.ll +++ b/llvm/test/LTO/X86/inline-asm-lto-discard.ll @@ -32,19 +32,17 @@ ; RUN: -r %t4,foo@@VER1,px ; RUN: llvm-dis < %to3.0.0.preopt.bc | FileCheck %s --check-prefix=ASM3 -; ASM1: module asm -; ASM1-NEXT: ".lto_discard foo" -; ASM1-NEXT: ".weak foo" -; ASM1-NEXT: ".equ foo,bar" - -; ASM2: module asm -; ASM2-NEXT: ".lto_discard foo" -; ASM2-NEXT: ".weak foo" -; ASM2-NEXT: ".equ foo,bar" -; ASM2-NEXT: ".lto_discard" -; ASM2-NEXT: " .global foo ; foo: leal 2(%rdi), %eax" - -; ASM3-NOT: ".lto_discard foo" +; ASM1: module asm ".lto_discard foo" +; ASM1-NEXT: module asm ".weak foo" +; ASM1-NEXT: module asm ".equ foo,bar" + +; ASM2: module asm ".lto_discard foo" +; ASM2-NEXT: module asm ".weak foo" +; ASM2-NEXT: module asm ".equ foo,bar" +; ASM2-NEXT: module asm ".lto_discard" +; ASM2-NEXT: module asm " .global foo ; foo: leal 2(%rdi), %eax" + +; ASM3-NOT: module asm ".lto_discard foo" ; SYM: T foo diff --git a/llvm/test/Linker/Inputs/module-asm.ll b/llvm/test/Linker/Inputs/module-asm.ll deleted file mode 100644 index b097c7067ccc1..0000000000000 --- a/llvm/test/Linker/Inputs/module-asm.ll +++ /dev/null @@ -1,2 +0,0 @@ -module asm(target_features: "+bar") - "asm 2" diff --git a/llvm/test/Linker/link-arm-and-thumb-module-inline-asm.ll b/llvm/test/Linker/link-arm-and-thumb-module-inline-asm.ll index 612bce5be18f1..5e12a8c88d90a 100644 --- a/llvm/test/Linker/link-arm-and-thumb-module-inline-asm.ll +++ b/llvm/test/Linker/link-arm-and-thumb-module-inline-asm.ll @@ -9,12 +9,11 @@ target triple = "armv7-linux-gnueabihf" module asm "add r1, r2, r2" -; CHECK: module asm -; CHECK-NEXT: ".text" -; CHECK-NEXT: ".balign 4" -; CHECK-NEXT: ".arm" -; CHECK-NEXT: "add r1, r2, r2" -; CHECK-NEXT: ".text" -; CHECK-NEXT: ".balign 2" -; CHECK-NEXT: ".thumb" -; CHECK-NEXT: "orn r1, r2, r2" +; CHECK: module asm ".text" +; CHECK-NEXT: module asm ".balign 4" +; CHECK-NEXT: module asm ".arm" +; CHECK-NEXT: module asm "add r1, r2, r2" +; CHECK-NEXT: module asm ".text" +; CHECK-NEXT: module asm ".balign 2" +; CHECK-NEXT: module asm ".thumb" +; CHECK-NEXT: module asm "orn r1, r2, r2" diff --git a/llvm/test/Linker/module-asm.ll b/llvm/test/Linker/module-asm.ll deleted file mode 100644 index 6c600981d72a5..0000000000000 --- a/llvm/test/Linker/module-asm.ll +++ /dev/null @@ -1,9 +0,0 @@ -; RUN: llvm-link %s %p/Inputs/module-asm.ll -S | FileCheck %s - -; CHECK: module asm(target_features: "+foo") -; CHECK-NEXT: "asm 1" -; CHECK: module asm(target_features: "+bar") -; CHECK-NEXT: "asm 2" - -module asm(target_features: "+foo") - "asm 1" diff --git a/llvm/test/ThinLTO/X86/import-symver.ll b/llvm/test/ThinLTO/X86/import-symver.ll index 9525527b4531c..556c4fd992f0d 100644 --- a/llvm/test/ThinLTO/X86/import-symver.ll +++ b/llvm/test/ThinLTO/X86/import-symver.ll @@ -9,8 +9,7 @@ ; RUN: llvm-dis %t1.bc.thinlto.imported.bc -o - | FileCheck --check-prefix=NOIMPORT %s ; When @bar gets imported, the symver must be imported too. -; IMPORT: module asm -; IMPORT-NEXT: ".symver bar, bar@BAR_1.2.3" +; IMPORT: module asm ".symver bar, bar@BAR_1.2.3" ; IMPORT: declare dso_local i32 @bar() ; When @bar isn't imported, the symver is also not imported. diff --git a/llvm/test/Transforms/LowerTypeTests/export-symver.ll b/llvm/test/Transforms/LowerTypeTests/export-symver.ll index 7c3ed3da3537e..ea4594a359cc0 100644 --- a/llvm/test/Transforms/LowerTypeTests/export-symver.ll +++ b/llvm/test/Transforms/LowerTypeTests/export-symver.ll @@ -1,7 +1,6 @@ ; RUN: opt -S %s -passes=lowertypetests -lowertypetests-summary-action=export -lowertypetests-read-summary=%S/Inputs/exported-funcs.yaml | FileCheck %s ; -; CHECK: module asm -; CHECK-NEXT: ".symver external_addrtaken, alias1" +; CHECK: module asm ".symver external_addrtaken, alias1" ; CHECK-NOT: .symver external_addrtaken2 ; CHECK-NOT: .symver not_exported diff --git a/llvm/test/Transforms/ThinLTOBitcodeWriter/cfi-icall-static-inline-asm.ll b/llvm/test/Transforms/ThinLTOBitcodeWriter/cfi-icall-static-inline-asm.ll index 61141c71335bf..d8ebae17d4693 100644 --- a/llvm/test/Transforms/ThinLTOBitcodeWriter/cfi-icall-static-inline-asm.ll +++ b/llvm/test/Transforms/ThinLTOBitcodeWriter/cfi-icall-static-inline-asm.ll @@ -3,8 +3,7 @@ target triple = "x86_64-unknown-linux-gnu" -; CHECK: module asm -; CHECK-NEXT: ".lto_set_conditional a,a.[[HASH:[0-9a-f]+]]" +; CHECK: module asm ".lto_set_conditional a,a.[[HASH:[0-9a-f]+]]" define void @b() { %f = alloca ptr, align 8 diff --git a/llvm/test/Transforms/ThinLTOBitcodeWriter/x86/module-asm.ll b/llvm/test/Transforms/ThinLTOBitcodeWriter/x86/module-asm.ll index 5796537661e60..587ab3fbb5020 100644 --- a/llvm/test/Transforms/ThinLTOBitcodeWriter/x86/module-asm.ll +++ b/llvm/test/Transforms/ThinLTOBitcodeWriter/x86/module-asm.ll @@ -7,7 +7,6 @@ target triple = "x86_64-unknown-linux-gnu" @g = constant i32 0, !type !0 !0 = !{i32 0, !"typeid"} -; M0: module asm -; M0-NEXT: "ret" +; M0: module asm "ret" ; M1-NOT: module asm module asm "ret" diff --git a/llvm/tools/llvm-reduce/deltas/ReduceModuleData.cpp b/llvm/tools/llvm-reduce/deltas/ReduceModuleData.cpp index b5b68404e8690..4aeaef6d8d676 100644 --- a/llvm/tools/llvm-reduce/deltas/ReduceModuleData.cpp +++ b/llvm/tools/llvm-reduce/deltas/ReduceModuleData.cpp @@ -23,5 +23,5 @@ void llvm::reduceModuleDataDeltaPass(Oracle &O, ReducerWorkItem &WorkItem) { Program.setSourceFileName(""); // TODO: clear line by line rather than all at once if (!Program.getModuleInlineAsm().empty() && !O.shouldKeep()) - Program.removeModuleInlineAsm(); + Program.setModuleInlineAsm(""); } diff --git a/mlir/lib/Target/LLVMIR/ModuleImport.cpp b/mlir/lib/Target/LLVMIR/ModuleImport.cpp index bb55678f91005..3038a6a2ed986 100644 --- a/mlir/lib/Target/LLVMIR/ModuleImport.cpp +++ b/mlir/lib/Target/LLVMIR/ModuleImport.cpp @@ -1150,15 +1150,12 @@ void ModuleImport::convertTargetTriple() { } void ModuleImport::convertModuleLevelAsm() { + llvm::StringRef asmStr = llvmModule->getModuleInlineAsm(); llvm::SmallVector<mlir::Attribute> asmArrayAttr; - for (const llvm::Module::GlobalAsmFragment &Frag : - llvmModule->getModuleInlineAsm()) { - // TODO: Preserve module asm properties. - for (llvm::StringRef line : llvm::split(Frag.Asm, '\n')) - if (!line.empty()) - asmArrayAttr.push_back(builder.getStringAttr(line)); - } + for (llvm::StringRef line : llvm::split(asmStr, '\n')) + if (!line.empty()) + asmArrayAttr.push_back(builder.getStringAttr(line)); mlirModule->setAttr(LLVM::LLVMDialect::getModuleLevelAsmAttrName(), builder.getArrayAttr(asmArrayAttr)); diff --git a/mlir/test/Target/LLVMIR/module-asm.mlir b/mlir/test/Target/LLVMIR/module-asm.mlir index 813eeeafdeb44..2afb37cf005bf 100644 --- a/mlir/test/Target/LLVMIR/module-asm.mlir +++ b/mlir/test/Target/LLVMIR/module-asm.mlir @@ -2,6 +2,5 @@ module attributes {llvm.module_asm = ["foo", "bar"]} {} -// CHECK: module asm -// CHECK-NEXT: "foo" -// CHECK-NEXT: "bar" +// CHECK: module asm "foo" +// CHECK: module asm "bar" _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
