On Saturday, 8 January 2022 at 18:47:11 UTC, Vladimir Marchevsky wrote:
> On Friday, 7 January 2022 at 21:41:55 UTC, Walter Bright wrote:
> Compile with -vasm to see it! Enjoy!
Any practical reason to put disassembler into compiler instead of making it a separate tool? Any ETA for renaming it into DMD Burning ROM? :)
Most other compilers have been able to do this for years. The only difference is that the way the dmd backend is designed basically means that it never knows the instructions in a given basic block until they are actually emitted, so it has to disassemble it's own output rather than printing it's internal representation with (say) Intel assembly syntax.
See https://llvm.org/doxygen/classllvm_1_1MachineInstr.html from LLVM
GCC actually only uses an assembler to build object files. It doesn't have a distinct IR like LLVM does but the final stage of the RTL is basically a 1:1 representation of the instruction set:
void phoneHome(size_t);
auto getLen(int[] arr)
{
phoneHome(arr.length);
return arr.length;
}
ends up as
;; Function getLen (_D7example6getLenFAiZm, funcdef_no=0, decl_uid=1395, cgraph_uid=2, symbol_order=1)
(note 1 0 37 NOTE_INSN_DELETED)
(note 37 1 8 (var_location arr (parallel [
(expr_list:REG_DEP_TRUE (reg:DI 5 di [ arr ])
(const_int 0 [0]))
(expr_list:REG_DEP_TRUE (reg:DI 4 si [ arr+8 ])
(const_int 8 [0x8]))
])) NOTE_INSN_VAR_LOCATION)
(note 8 37 7 2 [bb 2] NOTE_INSN_BASIC_BLOCK)
(note 7 8 26 2 NOTE_INSN_FUNCTION_BEG)
(insn/f:TI 26 7 27 2 (set (mem:DI (pre_dec:DI (reg/f:DI 7 sp)) [0 S8 A8])
(reg:DI 3 bx)) "/app/example.d":2:6 54 {*pushdi2_rex64}
(expr_list:REG_DEAD (reg:DI 3 bx)
(nil)))
(note 27 26 2 2 NOTE_INSN_PROLOGUE_END)
(insn 2 27 38 2 (set (reg:DI 3 bx [orig:85 arr ] [85])
(reg:DI 5 di [92])) "/app/example.d":2:6 80 {*movdi_internal}
(nil))
(note 38 2 13 2 (var_location arr (reg:TI 3 bx [orig:85 arr ] [85])) NOTE_INSN_VAR_LOCATION)
(call_insn:TI 13 38 39 2 (call (mem:QI (symbol_ref:DI ("_D7example9phoneHomeFmZv") [flags 0x41] <function_decl 0x7f491d317600 phoneHome>) [0 phoneHome S1 A8])
(const_int 0 [0])) "/app/example.d":4:14 886 {*call}
(expr_list:REG_CALL_ARG_LOCATION (nil)
(expr_list:REG_DEAD (reg:DI 5 di)
(expr_list:REG_CALL_DECL (symbol_ref:DI ("_D7example9phoneHomeFmZv") [flags 0x41] <function_decl 0x7f491d317600 phoneHome>)
(nil))))
(expr_list:DI (use (reg:DI 5 di))
(nil)))
(note/c 39 13 17 2 (var_location arr (nil)) NOTE_INSN_VAR_LOCATION)
(insn 17 39 36 2 (set (reg/i:DI 0 ax)
(reg:DI 3 bx [orig:85 arr ] [85])) "/app/example.d":6:1 80 {*movdi_internal}
(expr_list:REG_DEAD (reg:DI 3 bx [orig:85 arr ] [85])
(nil)))
(note 36 17 29 2 NOTE_INSN_EPILOGUE_BEG)
(insn/f 29 36 40 2 (set (reg:DI 3 bx)
(mem:DI (post_inc:DI (reg/f:DI 7 sp)) [0 S8 A8])) "/app/example.d":6:1 62 {*popdi1}
(expr_list:REG_CFA_ADJUST_CFA (set (reg/f:DI 7 sp)
(plus:DI (reg/f:DI 7 sp)
(const_int 8 [0x8])))
(nil)))
(note 40 29 18 2 (var_location arr (nil) [uninit]) NOTE_INSN_VAR_LOCATION)
(insn 18 40 30 2 (use (reg/i:DI 0 ax)) "/app/example.d":6:1 -1
(nil))
(jump_insn:TI 30 18 33 2 (simple_return) "/app/example.d":6:1 910 {simple_return_internal}
(nil)
-> simple_return)
(barrier 33 30 25)
(note 25 33 0 NOTE_INSN_DELETED)
just prior to spitting it out for the assembler to process.