Add support for inline assembly

This depends on support in LLVM, which hasn't been merged yet.
See: https://reviews.llvm.org/D46437
This commit is contained in:
Ayke van Laethem
2018-06-07 18:29:35 +02:00
parent 808cb991af
commit 802302a1aa
3 changed files with 13 additions and 1 deletions
+9
View File
@@ -1038,6 +1038,15 @@ func (c *Compiler) parseCall(frame *Frame, instr *ssa.CallCommon, parentHandle l
case *ssa.Builtin:
return c.parseBuiltin(frame, instr.Args, call.Name())
case *ssa.Function:
if call.Name() == "Asm" && len(instr.Args) == 1 {
// Magic function: insert inline assembly instead of calling it.
if named, ok := instr.Args[0].Type().(*types.Named); ok && named.Obj().Name() == "__asm" {
fnType := llvm.FunctionType(llvm.VoidType(), []llvm.Type{}, false)
asm := constant.StringVal(instr.Args[0].(*ssa.Const).Value)
target := llvm.InlineAsm(fnType, asm, "", true, false, 0)
return c.builder.CreateCall(target, nil, ""), nil
}
}
targetBlocks := false
name := getFunctionName(call, targetBlocks)
llvmFn := c.mod.NamedFunction(name)