mirror of
https://github.com/odin-lang/Odin.git
synced 2026-08-26 15:01:31 +00:00
Infer asm #side_effects where possible from the mnemonics
This commit is contained in:
@@ -200,7 +200,18 @@ main :: proc() {
|
||||
strings.write_string(&sb, "\t\t\t\t SideEffectFlag_SERIALIZING)) != 0;\n")
|
||||
strings.write_string(&sb, "\t\t}\n")
|
||||
strings.write_string(&sb, "\t\tbool implies_side_effects() {\n")
|
||||
strings.write_string(&sb, "\t\t\treturn side_effects;\n")
|
||||
strings.write_string(&sb, "\t\t\tu16 const VOLATILE_SE =\n")
|
||||
strings.write_string(&sb, "\t\t\t\tSideEffectFlag_FENCE |\n")
|
||||
strings.write_string(&sb, "\t\t\t\tSideEffectFlag_SERIALIZING |\n")
|
||||
strings.write_string(&sb, "\t\t\t\tSideEffectFlag_CACHE |\n")
|
||||
strings.write_string(&sb, "\t\t\t\tSideEffectFlag_TRAP |\n")
|
||||
strings.write_string(&sb, "\t\t\t\tSideEffectFlag_INTERRUPT |\n")
|
||||
strings.write_string(&sb, "\t\t\t\tSideEffectFlag_HALT |\n")
|
||||
strings.write_string(&sb, "\t\t\t\tSideEffectFlag_PRIVILEGED |\n")
|
||||
strings.write_string(&sb, "\t\t\t\tSideEffectFlag_CONTROL |\n")
|
||||
strings.write_string(&sb, "\t\t\t\tSideEffectFlag_CET;\n")
|
||||
strings.write_string(&sb, "\t\t\t\t// NOTE: SideEffectFlag_HINT deliberately excluded — inert, may be DCE'd.\n")
|
||||
strings.write_string(&sb, "\t\t\treturn ((side_effects & VOLATILE_SE) != 0);\n")
|
||||
strings.write_string(&sb, "\t\t}\n")
|
||||
strings.write_string(&sb, "\t};\n")
|
||||
}
|
||||
|
||||
@@ -205,7 +205,18 @@ struct Asm_amd64 {
|
||||
SideEffectFlag_SERIALIZING)) != 0;
|
||||
}
|
||||
bool implies_side_effects() {
|
||||
return side_effects;
|
||||
u16 const VOLATILE_SE =
|
||||
SideEffectFlag_FENCE |
|
||||
SideEffectFlag_SERIALIZING |
|
||||
SideEffectFlag_CACHE |
|
||||
SideEffectFlag_TRAP |
|
||||
SideEffectFlag_INTERRUPT |
|
||||
SideEffectFlag_HALT |
|
||||
SideEffectFlag_PRIVILEGED |
|
||||
SideEffectFlag_CONTROL |
|
||||
SideEffectFlag_CET;
|
||||
// NOTE: SideEffectFlag_HINT deliberately excluded — inert, may be DCE'd.
|
||||
return ((side_effects & VOLATILE_SE) != 0);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -480,21 +480,18 @@ struct lbAsmGenerate_amd64 : lbAsmGenerate {
|
||||
|
||||
LLVMTypeRef fn_ty = LLVMFunctionType(ret_ty, param_types.data, cast(unsigned)param_types.count, /*vararg*/false);
|
||||
|
||||
// TODO(bill): determine all the cases when side-effects happen
|
||||
bool has_side_effects = tmpl_node->has_side_effects;
|
||||
|
||||
LLVMValueRef ia = LLVMGetInlineAsm(
|
||||
fn_ty,
|
||||
asm_string, cast(size_t)gb_string_length(asm_string),
|
||||
constraints, cast(size_t)gb_string_length(constraints),
|
||||
/*HasSideEffects*/ has_side_effects,
|
||||
/*IsAlignStack*/ tmpl_node->is_align_stack,
|
||||
/*HasSideEffects*/ tmpl_entity->AsmTemplate.has_side_effects,
|
||||
/*IsAlignStack*/ tmpl_entity->AsmTemplate.is_align_stack,
|
||||
LLVMInlineAsmDialectATT,
|
||||
/*CanThrow*/ false);
|
||||
|
||||
LLVMValueRef call = LLVMBuildCall2(p->builder, fn_ty, ia, call_args.data, cast(unsigned)call_args.count, "");
|
||||
|
||||
if (false) {
|
||||
if (true) {
|
||||
// DEBUG PRINT!!!
|
||||
// DEBUG PRINT!!!
|
||||
// DEBUG PRINT!!!
|
||||
|
||||
Reference in New Issue
Block a user