@@ -1721,6 +1721,48 @@ public class IRBuilder {
1721
1721
return Alias ( llvm: LLVMAddAlias ( module. llvm, type. asLLVM ( ) , aliasee. asLLVM ( ) , name) )
1722
1722
}
1723
1723
1724
+ // MARK: Inline Assembly
1725
+
1726
+ /// Builds a value representing an inline assembly expression (as opposed to
1727
+ /// module-level inline assembly).
1728
+ ///
1729
+ /// LLVM represents inline assembler as a template string (containing the
1730
+ /// instructions to emit), a list of operand constraints (stored as a string),
1731
+ /// and some flags.
1732
+ ///
1733
+ /// The template string supports argument substitution of the operands using
1734
+ /// "$" followed by a number, to indicate substitution of the given
1735
+ /// register/memory location, as specified by the constraint string.
1736
+ /// "${NUM:MODIFIER}" may also be used, where MODIFIER is a target-specific
1737
+ /// annotation for how to print the operand (see [Asm Template Argument
1738
+ /// Modifiers](https://llvm.org/docs/LangRef.html#inline-asm-modifiers)).
1739
+ ///
1740
+ /// LLVM’s support for inline asm is modeled closely on the requirements of
1741
+ /// Clang’s GCC-compatible inline-asm support. Thus, the feature-set and the
1742
+ /// constraint and modifier codes are similar or identical to those in GCC’s
1743
+ /// inline asm support.
1744
+ ///
1745
+ /// However, the syntax of the template and constraint strings is not the
1746
+ /// same as the syntax accepted by GCC and Clang, and, while most constraint
1747
+ /// letters are passed through as-is by Clang, some get translated to other
1748
+ /// codes when converting from the C source to the LLVM assembly.
1749
+ ///
1750
+ /// - parameter asm: The inline assembly expression template string.
1751
+ /// - parameter type: The type of the parameters and return value of the
1752
+ /// assembly expression string.
1753
+ /// - parameter constraints: A comma-separated string, each element containing
1754
+ /// one or more constraint codes.
1755
+ /// - parameter hasSideEffects: Whether this inline asm expression has
1756
+ /// side effects. Defaults to `false`.
1757
+ /// - parameter needsAlignedStack: Whether the function containing the
1758
+ /// asm needs to align its stack conservatively. Defaults to `true`.
1759
+ ///
1760
+ /// - returns: A representation of the newly created inline assembly
1761
+ /// expression.
1762
+ public func buildInlineAssembly( _ asm: String , type: FunctionType , constraints: String = " " , hasSideEffects: Bool = true , needsAlignedStack: Bool = true ) -> IRValue {
1763
+ return LLVMConstInlineAsm ( type. asLLVM ( ) , asm, constraints, hasSideEffects. llvm, needsAlignedStack. llvm)
1764
+ }
1765
+
1724
1766
deinit {
1725
1767
LLVMDisposeBuilder ( llvm)
1726
1768
}
0 commit comments