sig
  exception Error of string
  type context
  type result
  type location
  type param
  type lvalue
  type rvalue
  type field
  type struct_
  type type_
  type function_
  type block
  type unary_op = Negate | Bitwise_negate | Logical_negate
  type binary_op =
      Plus
    | Minus
    | Mult
    | Divide
    | Modulo
    | Bitwise_and
    | Bitwise_xor
    | Bitwise_or
    | Logical_and
    | Logical_or
  type comparison = Eq | Ne | Lt | Le | Gt | Ge
  module Context :
    sig
      val create : unit -> Gccjit.context
      val release : Gccjit.context -> unit
      val create_child : Gccjit.context -> Gccjit.context
      val dump_to_file :
        Gccjit.context -> ?update_locs:bool -> string -> unit
      val set_logfile : Gccjit.context -> Unix.file_descr option -> unit
      val dump_reproducer_to_file : Gccjit.context -> string -> unit
      type _ context_option =
          Progname : string Gccjit.Context.context_option
        | Optimization_level : int Gccjit.Context.context_option
        | Debuginfo : bool Gccjit.Context.context_option
        | Dump_initial_tree : bool Gccjit.Context.context_option
        | Dump_initial_gimple : bool Gccjit.Context.context_option
        | Dump_generated_code : bool Gccjit.Context.context_option
        | Dump_summary : bool Gccjit.Context.context_option
        | Dump_everything : bool Gccjit.Context.context_option
        | Selfcheck_gc : bool Gccjit.Context.context_option
        | Keep_intermediates : bool Gccjit.Context.context_option
      val set_option :
        Gccjit.context -> 'Gccjit.Context.context_option -> '-> unit
      val compile : Gccjit.context -> Gccjit.result
      type output_kind =
          Assembler
        | Object_file
        | Dynamic_library
        | Executable
      val compile_to_file :
        Gccjit.context -> Gccjit.Context.output_kind -> string -> unit
    end
  module Field :
    sig
      val create :
        Gccjit.context ->
        ?loc:Gccjit.location -> Gccjit.type_ -> string -> Gccjit.field
      val to_string : Gccjit.field -> string
    end
  module Struct :
    sig
      val create :
        Gccjit.context ->
        ?loc:Gccjit.location -> string -> Gccjit.field list -> Gccjit.struct_
      val opaque :
        Gccjit.context -> ?loc:Gccjit.location -> string -> Gccjit.struct_
      val set_fields :
        ?loc:Gccjit.location -> Gccjit.struct_ -> Gccjit.field list -> unit
      val to_string : Gccjit.struct_ -> string
    end
  module Type :
    sig
      type type_kind =
          Void
        | Void_ptr
        | Bool
        | Char
        | Signed_char
        | Unsigned_char
        | Short
        | Unsigned_short
        | Int
        | Unsigned_int
        | Long
        | Unsigned_long
        | Long_long
        | Unsigned_long_long
        | Float
        | Double
        | Long_double
        | Const_char_ptr
        | Size_t
        | File_ptr
        | Complex_float
        | Complex_double
        | Complex_long_double
      val get : Gccjit.context -> Gccjit.Type.type_kind -> Gccjit.type_
      val int : Gccjit.context -> ?signed:bool -> int -> Gccjit.type_
      val pointer : Gccjit.type_ -> Gccjit.type_
      val const : Gccjit.type_ -> Gccjit.type_
      val volatile : Gccjit.type_ -> Gccjit.type_
      val array :
        Gccjit.context ->
        ?loc:Gccjit.location -> Gccjit.type_ -> int -> Gccjit.type_
      val function_ptr :
        Gccjit.context ->
        ?loc:Gccjit.location ->
        ?variadic:bool -> Gccjit.type_ list -> Gccjit.type_ -> Gccjit.type_
      val struct_ : Gccjit.struct_ -> Gccjit.type_
      val union :
        Gccjit.context ->
        ?loc:Gccjit.location -> string -> Gccjit.field list -> Gccjit.type_
      val to_string : Gccjit.type_ -> string
    end
  module RValue :
    sig
      val type_of : Gccjit.rvalue -> Gccjit.type_
      val int : Gccjit.context -> Gccjit.type_ -> int -> Gccjit.rvalue
      val zero : Gccjit.context -> Gccjit.type_ -> Gccjit.rvalue
      val one : Gccjit.context -> Gccjit.type_ -> Gccjit.rvalue
      val double : Gccjit.context -> Gccjit.type_ -> float -> Gccjit.rvalue
      val ptr :
        Gccjit.context -> Gccjit.type_ -> 'Ctypes.ptr -> Gccjit.rvalue
      val null : Gccjit.context -> Gccjit.type_ -> Gccjit.rvalue
      val string_literal : Gccjit.context -> string -> Gccjit.rvalue
      val unary_op :
        Gccjit.context ->
        ?loc:Gccjit.location ->
        Gccjit.unary_op -> Gccjit.type_ -> Gccjit.rvalue -> Gccjit.rvalue
      val binary_op :
        Gccjit.context ->
        ?loc:Gccjit.location ->
        Gccjit.binary_op ->
        Gccjit.type_ -> Gccjit.rvalue -> Gccjit.rvalue -> Gccjit.rvalue
      val comparison :
        Gccjit.context ->
        ?loc:Gccjit.location ->
        Gccjit.comparison -> Gccjit.rvalue -> Gccjit.rvalue -> Gccjit.rvalue
      val call :
        Gccjit.context ->
        ?loc:Gccjit.location ->
        Gccjit.function_ -> Gccjit.rvalue list -> Gccjit.rvalue
      val indirect_call :
        Gccjit.context ->
        ?loc:Gccjit.location ->
        Gccjit.rvalue -> Gccjit.rvalue list -> Gccjit.rvalue
      val cast :
        Gccjit.context ->
        ?loc:Gccjit.location ->
        Gccjit.rvalue -> Gccjit.type_ -> Gccjit.rvalue
      val access_field :
        ?loc:Gccjit.location ->
        Gccjit.rvalue -> Gccjit.field -> Gccjit.rvalue
      val lvalue : Gccjit.lvalue -> Gccjit.rvalue
      val param : Gccjit.param -> Gccjit.rvalue
      val to_string : Gccjit.rvalue -> string
    end
  module LValue :
    sig
      val address : ?loc:Gccjit.location -> Gccjit.lvalue -> Gccjit.rvalue
      type global_kind = Exported | Internal | Imported
      val global :
        Gccjit.context ->
        ?loc:Gccjit.location ->
        Gccjit.LValue.global_kind -> Gccjit.type_ -> string -> Gccjit.lvalue
      val deref : ?loc:Gccjit.location -> Gccjit.rvalue -> Gccjit.lvalue
      val deref_field :
        ?loc:Gccjit.location ->
        Gccjit.rvalue -> Gccjit.field -> Gccjit.lvalue
      val access_array :
        ?loc:Gccjit.location ->
        Gccjit.rvalue -> Gccjit.rvalue -> Gccjit.lvalue
      val access_field :
        ?loc:Gccjit.location ->
        Gccjit.lvalue -> Gccjit.field -> Gccjit.lvalue
      val param : Gccjit.param -> Gccjit.lvalue
      val to_string : Gccjit.lvalue -> string
    end
  module Param :
    sig
      val create :
        Gccjit.context ->
        ?loc:Gccjit.location -> Gccjit.type_ -> string -> Gccjit.param
      val to_string : Gccjit.param -> string
    end
  module Function :
    sig
      type function_kind = Exported | Internal | Imported | Always_inline
      val create :
        Gccjit.context ->
        ?loc:Gccjit.location ->
        ?variadic:bool ->
        Gccjit.Function.function_kind ->
        Gccjit.type_ -> string -> Gccjit.param list -> Gccjit.function_
      val builtin : Gccjit.context -> string -> Gccjit.function_
      val param : Gccjit.function_ -> int -> Gccjit.param
      val dump_dot : Gccjit.function_ -> string -> unit
      val local :
        ?loc:Gccjit.location ->
        Gccjit.function_ -> Gccjit.type_ -> string -> Gccjit.lvalue
      val to_string : Gccjit.function_ -> string
    end
  module Block :
    sig
      val create : ?name:string -> Gccjit.function_ -> Gccjit.block
      val parent : Gccjit.block -> Gccjit.function_
      val eval :
        ?loc:Gccjit.location -> Gccjit.block -> Gccjit.rvalue -> unit
      val assign :
        ?loc:Gccjit.location ->
        Gccjit.block -> Gccjit.lvalue -> Gccjit.rvalue -> unit
      val assign_op :
        ?loc:Gccjit.location ->
        Gccjit.block ->
        Gccjit.lvalue -> Gccjit.binary_op -> Gccjit.rvalue -> unit
      val comment : ?loc:Gccjit.location -> Gccjit.block -> string -> unit
      val cond_jump :
        ?loc:Gccjit.location ->
        Gccjit.block -> Gccjit.rvalue -> Gccjit.block -> Gccjit.block -> unit
      val jump : ?loc:Gccjit.location -> Gccjit.block -> Gccjit.block -> unit
      val return :
        ?loc:Gccjit.location -> Gccjit.block -> Gccjit.rvalue -> unit
      val return_void : ?loc:Gccjit.location -> Gccjit.block -> unit
      val to_string : Gccjit.block -> string
    end
  module Location :
    sig
      val create : Gccjit.context -> string -> int -> int -> Gccjit.location
      val to_string : Gccjit.location -> string
    end
  module Result :
    sig
      val code : Gccjit.result -> string -> ('-> 'b) Ctypes.fn -> '-> 'b
      val global : Gccjit.result -> string -> 'Ctypes.typ -> 'Ctypes.ptr
      val release : Gccjit.result -> unit
    end
end