2 * Inline assembler for the D programming language compiler.
4 * Specification: $(LINK2 https://dlang.org/spec/iasm.html, Inline Assembler)
6 * Copyright (C) 2018-2024 by The D Language Foundation, All Rights Reserved
7 * Authors: $(LINK2 https://www.digitalmars.com, Walter Bright)
8 * License: $(LINK2 https://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
9 * Source: $(LINK2 https://github.com/dlang/dmd/blob/master/src/dmd/iasm.d, _iasm.d)
10 * Documentation: https://dlang.org/phobos/dmd_iasm.html
11 * Coverage: https://codecov.io/gh/dlang/dmd/src/master/src/dmd/iasm.d
16 import core
.stdc
.stdio
;
20 import dmd
.expression
;
25 import dmd
.statementsem
;
40 /************************ AsmStatement ***************************************/
42 Statement
asmSemantic(AsmStatement s
, Scope
*sc
)
44 //printf("AsmStatement.semantic()\n");
46 FuncDeclaration fd
= sc
.parent
.isFuncDeclaration();
52 // Assume assembler code takes care of setting the return value
53 sc
.func
.hasReturnExp |
= 8;
61 /* If it starts with a string literal, it's gcc inline asm
63 if (s
.tokens
.value
== TOK
.string_
)
65 /* Replace the asm statement with an assert(0, msg) that trips at runtime.
68 auto e
= new IntegerExp(loc
, 0, Type
.tint32
);
69 auto msg
= new StringExp(loc
, "Gnu Asm not supported - compile this function with gcc or clang");
70 auto ae
= new AssertExp(loc
, e
, msg
);
71 auto se
= new ExpStatement(loc
, ae
);
72 return statementSemantic(se
, sc
);
74 auto ias
= new InlineAsmStatement(s
.loc
, s
.tokens
);
75 ias
.caseSensitive
= s
.caseSensitive
;
76 return inlineAsmSemantic(ias
, sc
);
80 auto eas
= new GccAsmStatement(s
.loc
, s
.tokens
);
81 return gccAsmSemantic(eas
, sc
);
85 s
.error("D inline assembler statements are not supported");
86 return new ErrorStatement();
90 /************************ CAsmDeclaration ************************************/
92 void asmSemantic(CAsmDeclaration ad
, Scope
*sc
)
99 return gccAsmSemantic(ad
, sc
);
103 import dmd
.errors
: error
;
104 error(ad
.code
.loc
, "Gnu Asm not supported - compile this file with gcc or clang");