Search code examples
frama-c

How customize machine dependency in Frama-C?


I have got a 16-bit MPU which is different from x86_16 in size of size_t, ptrdiff_t etc. Can anybody give me details and clear instructions about how to customize machine dependency in Frama-C for my MPU?


Solution

  • There is currently no way to do that directly from the command line: you have to write a small OCaml script that will essentially define a new Cil_types.mach (a record containing the necessary information about your architecture) and register it through File.new_machdep. Assuming you have a file my_machdep.ml looking like that:

    let my_machdep = {
      Cil_types.sizeof_short = 2;
      sizeof_int = 2;
      sizeof_long = 4;
      (* ... See `cil_types.mli` for the complete list of fields to define *)
    }
    
    let () = File.new_machdep "my_machdep" my_machdep
    

    You will then be able to launch Frama-C that way to use the new machdep:

    frama-c -load-script my_machdep.ml -machdep my_machdep [normal options]
    

    If you want to have the new machdep permanently available, you can make it a Frama-C plugin. For that, you need a Makefile of the following form:

    FRAMAC_SHARE:=$(shell frama-c -print-share-path)

    PLUGIN_NAME=Custom_machdep
    PLUGIN_CMO=my_machdep
    
    include $(FRAMAC_SHARE)/Makefile.dynamic
    

    my_machdep must be the name of your .ml file. Be sure to choose a different name for PLUGIN_NAME. Then, create an empty Custom_machdep.mli file (touch Custom_machdep.mli should do the trick). Afterwards, make && make install should compile and install the plug-in so that it will be automatically loaded by Frama-C. You can verify this by launching frama-c -machdep help that should output my_machdep among the list of known machdeps.

    UPDATE If you are using some headers from Frama-C's standard library, you will also have to update $(frama-c -print-share-path)/libc/__fc_machdep.h in order to define appropriate macros (related to limits.h and stdint.h mostly).