PreviousUpNext

15.3.115  src/lib/compiler/back/low/jmp/squash-jumps-and-write-code-to-code-segment-buffer.api

# squash-jumps-and-write-code-to-code-segment-buffer.api
#
# API for the packages which select shortest possible representation
# for each branch and jump instruction and then generate the final
# absolute machine-code bytevector for the file being compiled.
#
# (Don't ask *me* why those are both done by the same package!)

# Compiled by:
#     src/lib/compiler/back/low/lib/lowhalf.lib

###               "A computer lets you make more mistakes
###                faster than any other invention, with the
###                possible exceptions of handguns and Tequila."
###
###                                     -- Mitch Ratcliffe


stipulate
    package pp  =  standard_prettyprinter;                                      # standard_prettyprinter                is from   src/lib/prettyprint/big/src/standard-prettyprinter.pkg
    package cv  =  compiler_verbosity;                                          # compiler_verbosity                            is from   src/lib/compiler/front/basics/main/compiler-verbosity.pkg
   
    #
    Npp = pp::Npp;
herein

    # This api is implemented in:
    #
    # for intel32:    src/lib/compiler/back/low/jmp/squash-jumps-and-write-code-to-code-segment-buffer-intel32-g.pkg
    # for pwrpc32:    src/lib/compiler/back/low/jmp/squash-jumps-and-write-code-to-code-segment-buffer-pwrpc32-g.pkg
    # for sparc32:    src/lib/compiler/back/low/jmp/squash-jumps-and-write-code-to-code-segment-buffer-sparc32-g.pkg
    #
    api Squash_Jumps_And_Write_Code_To_Code_Segment_Buffer {
        #
        package mcg:  Machcode_Controlflow_Graph;                               # Machcode_Controlflow_Graph    is from   src/lib/compiler/back/low/mcg/machcode-controlflow-graph.api


        clear__textseg_list__and__dataseg_list:  Void -> Void;                          # Sheeeit, man.
            #
            # This call clears the internal global variables
            #     dataseg_list
            #     codeseg_list



        extract_all_code_and_data_from_machcode_controlflow_graph
            :
            (Npp, cv::Compiler_Verbosity)
            ->
            (mcg::Machcode_Controlflow_Graph,  List(mcg::Node)) # This basic-block list gives the final order in which all basic blocks should be concatenated to produce final machine-code bytevector.
            ->
            Void;
            #
            # This call saves everything into the internal global variables
            #     dataseg_list
            #     codeseg_list


        squash_jumps_and_write_all_machine_code_and_data_bytes_into_code_segment_buffer:    (Npp, cv::Compiler_Verbosity) -> Void;
            #
            # This takes the saved state in
            #     dataseg_list
            #     codeseg_list
            # and writes it all into the code_segment_buffer.
            #
            # Jump-squashing ("span-dependent-instruction size minimization")
            # is done along the way.
            # 
            # This call is is exported per
            # the Backend_Lowhalf_Core api in                                           # Backend_Lowhalf_Core                  is from   src/lib/compiler/back/low/main/main/backend-lowhalf-core.api
            # the Backend_Lowhalf api                                                   # Backend_Lowhalf                       is from   src/lib/compiler/back/low/main/main/backend-lowhalf.api
            # whence it gets invoked by the appropriate one of
            #
            #     backend_intel32_g::harvest_code_segment                               # backend_intel32_g                     is from   src/lib/compiler/back/low/main/intel32/backend-intel32-g.pkg
            #     backend_pwrpc32::harvest_code_segment                                 # backend_pwrpc32                       is from   src/lib/compiler/back/low/main/pwrpc32/backend-pwrpc32.pkg
            #     backend_sparc32::harvest_code_segment                                 # backend_sparc32                       is from   src/lib/compiler/back/low/main/sparc32/backend-sparc32.pkg             
            #
            # which use
            #
            #     code_segment_buffer::harvest_code_segment                             # code_segment_buffer                   is from   src/lib/compiler/execution/code-segments/code-segment-buffer.pkg
            #
            # to actually obtain the executable bytestring.
            #
            # Just to round things off, the above three functions
            # are basically the last thing called by
            #
            #     backend_tophalf_g::translate_anormcode_to_execode                     # backend_tophalf_g                     is from   src/lib/compiler/back/top/main/backend-tophalf-g.pkg
            #
            # which is basically the last thing called by
            #
            #     translate_raw_syntax_to_execode_g::translate_raw_syntax_to_execode    # translate_raw_syntax_to_execode_g     is from   src/lib/compiler/toplevel/main/translate-raw-syntax-to-execode-g.pkg
            #
            # which is the central call in both of
            #
            #     fun compile_one_sourcefile ()                                         # compile_in_dependency_order_g         is from   src/app/makelib/compile/compile-in-dependency-order-g.pkg
            #     fun prompt_read_evaluate_and_print_one_toplevel_mythryl_expression () # read_eval_print_loop_g                is from   src/lib/compiler/toplevel/interact/read-eval-print-loop-g.pkg
            #
            # which make the world go 'round. :-)
    };
end;


Comments and suggestions to: bugs@mythryl.org

PreviousUpNext