MimIR 0.1
MimIR is my Intermediate Representation
Loading...
Searching...
No Matches
mim::plug::clos Namespace Reference

The clos Plugin More...

Classes

class  ClosLit
 Wrapper around a Def that can be used to match closures (see isa_clos_lit). More...
class  BranchClosElim
class  Clos2SJLJ
class  ClosConvPrep
class  LowerTypedClosPrep
class  FreeDefAna
 Transitively compute free Def's on demand. More...
class  ClosConv
 Performs typed closure conversion. More...
class  LowerTypedClos
 This pass lowers typed closures to untyped closures. More...

Enumerations

%clos.BufPtr
enum class  BufPtr : flags_t
%clos.alloc_jmpbuf
enum class  alloc_jmpbuf : flags_t
%clos.setjmp
enum class  setjmp : flags_t
%clos.longjmp
enum class  longjmp : flags_t
%clos.clos_conv_prep_pass
enum class  clos_conv_prep_pass : flags_t
%clos.branch_clos_pass
enum class  branch_clos_pass : flags_t
%clos.lower_typed_clos_prep_pass
enum class  lower_typed_clos_prep_pass : flags_t
%clos.clos2sjlj_pass
enum class  clos2sjlj_pass : flags_t
%clos.clos_conv_phase
enum class  clos_conv_phase : flags_t
%clos.lower_typed_clos_phase
enum class  lower_typed_clos_phase : flags_t

Functions

DefSet free_defs (const Nest &nest)
void register_normalizers (Normalizers &normalizers)
Closures
ClosLit isa_clos_lit (const Def *def, bool fn_isa_lam=true)
 Tries to match a closure literal.
const Defclos_pack (const Def *env, const Def *fn, const Def *ct=nullptr)
 Pack a typed closure. This assumes that fn expects the environment as its Clos_Env_Paramth argument.
std::tuple< const Def *, const Def *, const Def * > clos_unpack (const Def *c)
 Deconstruct a closure into (env_type, function, env).
const Defclos_apply (const Def *closure, const Def *args)
 Apply a closure to arguments.
const Defapply_closure (const Def *closure, Defs args)
template<class N>
std::tuple< const Extract *, N * > ca_isa_var (const Def *def)
 Checks is def is the variable of a mut of type N.
Closure Types
const Sigmaisa_clos_type (const Def *def)
Sigmaclos_type (const Pi *pi)
 Creates a typed closure type from pi.
const Piclos_type_to_pi (const Def *ct, const Def *new_env_type=nullptr)
 Convert a closure type to a Pi, where the environment type has been removed or replaced by new_env_type (if new_env_type != nullptr).

Variables

static constexpr plugin_t Plugin_Id = 0x10d4140000000000

%clos.attr

enum class  attr : flags_t {
  returning = 0x10d4140000000400 ,
  freeBB = 0x10d4140000000401 ,
  fstclassBB = 0x10d4140000000402 ,
  esc = 0x10d4140000000403 ,
  bottom = 0x10d4140000000404
}
template<attr o>
const Defnormalize_clos (const Def *, const Def *, const Def *arg)

Closure Environment

static constexpr size_t Clos_Env_Param = 1_u64
 Describes where the environment is placed in the argument list.
size_t shift_env (size_t i)
size_t skip_env (size_t i)
const Defctype (World &w, Defs doms, const Def *env_type=nullptr)
const Defclos_insert_env (size_t i, const Def *env, std::function< const Def *(size_t)> f)
const Defclos_insert_env (size_t i, const Def *env, const Def *a)
const Defclos_insert_env (const Def *env, const Def *tup_or_sig)
const Defclos_remove_env (size_t i, std::function< const Def *(size_t)> f)
const Defclos_remove_env (size_t i, const Def *def)
const Defclos_remove_env (const Def *tup_or_sig)
const Defclos_sub_env (const Def *tup_or_sig, const Def *new_env)

Detailed Description

Enumeration Type Documentation

◆ alloc_jmpbuf

Definition at line 21 of file autogen.h.

◆ attr

enum class mim::plug::clos::attr : flags_t
strong
Enumerator
returning 
freeBB 
fstclassBB 
esc 
bottom 

Definition at line 42 of file autogen.h.

◆ branch_clos_pass

Definition at line 64 of file autogen.h.

◆ BufPtr

enum class mim::plug::clos::BufPtr : flags_t
strong

Definition at line 14 of file autogen.h.

◆ clos2sjlj_pass

Definition at line 78 of file autogen.h.

◆ clos_conv_phase

Definition at line 85 of file autogen.h.

◆ clos_conv_prep_pass

Definition at line 57 of file autogen.h.

◆ longjmp

enum class mim::plug::clos::longjmp : flags_t
strong

Definition at line 35 of file autogen.h.

◆ lower_typed_clos_phase

Definition at line 92 of file autogen.h.

◆ lower_typed_clos_prep_pass

Definition at line 71 of file autogen.h.

◆ setjmp

enum class mim::plug::clos::setjmp : flags_t
strong

Definition at line 28 of file autogen.h.

Function Documentation

◆ apply_closure()

const Def * mim::plug::clos::apply_closure ( const Def * closure,
Defs args )
inline

Definition at line 72 of file clos.h.

References clos_apply(), and mim::Def::world().

◆ ca_isa_var()

template<class N>
std::tuple< const Extract *, N * > mim::plug::clos::ca_isa_var ( const Def * def)

Checks is def is the variable of a mut of type N.

Definition at line 79 of file clos.h.

References mim::Var::mut().

◆ clos_apply()

const Def * mim::plug::clos::clos_apply ( const Def * closure,
const Def * args )

Apply a closure to arguments.

Definition at line 95 of file clos.cpp.

References clos_unpack(), and mim::Def::world().

Referenced by apply_closure(), and mim::plug::clos::Clos2SJLJ::enter().

◆ clos_insert_env() [1/3]

const Def * mim::plug::clos::clos_insert_env ( const Def * env,
const Def * tup_or_sig )
inline

Definition at line 123 of file clos.h.

References mim::Def::num_projs(), and mim::Def::world().

◆ clos_insert_env() [2/3]

const Def * mim::plug::clos::clos_insert_env ( size_t i,
const Def * env,
const Def * a )
inline

Definition at line 119 of file clos.h.

References clos_insert_env().

◆ clos_insert_env() [3/3]

const Def * mim::plug::clos::clos_insert_env ( size_t i,
const Def * env,
std::function< const Def *(size_t)> f )

Definition at line 134 of file clos.cpp.

References Clos_Env_Param, and shift_env().

Referenced by clos_insert_env().

◆ clos_pack()

const Def * mim::plug::clos::clos_pack ( const Def * env,
const Def * fn,
const Def * ct = nullptr )

Pack a typed closure. This assumes that fn expects the environment as its Clos_Env_Paramth argument.

Definition at line 73 of file clos.cpp.

References Clos_Env_Param, clos_remove_env(), clos_type(), isa_clos_type(), mim::Def::type(), and mim::Def::world().

Referenced by mim::plug::clos::Clos2SJLJ::enter(), mim::plug::clos::Clos2SJLJ::rewrite(), and mim::plug::clos::LowerTypedClosPrep::rewrite().

◆ clos_remove_env() [1/3]

const Def * mim::plug::clos::clos_remove_env ( const Def * tup_or_sig)
inline

Definition at line 133 of file clos.h.

References mim::Def::num_projs(), and mim::Def::world().

◆ clos_remove_env() [2/3]

const Def * mim::plug::clos::clos_remove_env ( size_t i,
const Def * def )
inline

Definition at line 130 of file clos.h.

References clos_remove_env(), and mim::Def::proj().

◆ clos_remove_env() [3/3]

const Def * mim::plug::clos::clos_remove_env ( size_t i,
std::function< const Def *(size_t)> f )

◆ clos_sub_env()

const Def * mim::plug::clos::clos_sub_env ( const Def * tup_or_sig,
const Def * new_env )
inline

Definition at line 139 of file clos.h.

References Clos_Env_Param, and mim::Def::refine().

Referenced by clos_type_to_pi().

◆ clos_type()

Sigma * mim::plug::clos::clos_type ( const Pi * pi)

Creates a typed closure type from pi.

Definition at line 116 of file clos.cpp.

References mim::Def::as_mut(), ctype(), and mim::Def::world().

Referenced by clos_pack(), and mim::plug::clos::Clos2SJLJ::enter().

◆ clos_type_to_pi()

const Pi * mim::plug::clos::clos_type_to_pi ( const Def * ct,
const Def * new_env_type = nullptr )

Convert a closure type to a Pi, where the environment type has been removed or replaced by new_env_type (if new_env_type != nullptr).

Definition at line 122 of file clos.cpp.

References clos_remove_env(), clos_sub_env(), isa_clos_type(), mim::Def::op(), and mim::Def::world().

◆ clos_unpack()

std::tuple< const Def *, const Def *, const Def * > mim::plug::clos::clos_unpack ( const Def * c)

Deconstruct a closure into (env_type, function, env).

Important: use this or ClosLit to destruct closures, since typechecking dependent pairs is currently broken.

Definition at line 83 of file clos.cpp.

References isa_clos_type().

Referenced by clos_apply(), mim::plug::clos::ClosLit::env(), mim::plug::clos::ClosLit::fnc(), and mim::plug::clos::ClosLit::isa_clos_lit.

◆ ctype()

const Def * mim::plug::clos::ctype ( World & w,
Defs doms,
const Def * env_type = nullptr )

Definition at line 140 of file clos.cpp.

References ctype().

Referenced by clos_type(), and ctype().

◆ free_defs()

DefSet mim::plug::clos::free_defs ( const Nest & nest)

◆ isa_clos_lit()

ClosLit mim::plug::clos::isa_clos_lit ( const Def * def,
bool fn_isa_lam = true )

◆ isa_clos_type()

const Sigma * mim::plug::clos::isa_clos_type ( const Def * def)

Returns def if def is a closure and nullptr otherwise

Definition at line 106 of file clos.cpp.

References Clos_Env_Param, mim::Pi::isa_cn(), mim::Def::isa_mut(), mim::Def::op(), mim::Def::var(), and mim::Def::world().

Referenced by clos_pack(), clos_type_to_pi(), clos_unpack(), and mim::plug::clos::ClosLit::isa_clos_lit.

◆ normalize_clos()

template<attr o>
const Def * mim::plug::clos::normalize_clos ( const Def * ,
const Def * ,
const Def * arg )

Definition at line 5 of file normalizers.cpp.

References bottom.

◆ register_normalizers()

void mim::plug::clos::register_normalizers ( Normalizers & normalizers)

Referenced by mim_get_plugin().

◆ shift_env()

size_t mim::plug::clos::shift_env ( size_t i)
inline

Definition at line 110 of file clos.h.

References Clos_Env_Param.

Referenced by clos_insert_env().

◆ skip_env()

size_t mim::plug::clos::skip_env ( size_t i)
inline

Definition at line 113 of file clos.h.

References Clos_Env_Param.

Referenced by clos_remove_env().

Variable Documentation

◆ Clos_Env_Param

size_t mim::plug::clos::Clos_Env_Param = 1_u64
staticconstexpr

Describes where the environment is placed in the argument list.

tup_or_sig should generally be a Tuple, Sigma or Var.

Definition at line 107 of file clos.h.

Referenced by clos_insert_env(), clos_pack(), clos_sub_env(), mim::plug::clos::ClosLit::env_var(), isa_clos_type(), shift_env(), and skip_env().

◆ Plugin_Id

plugin_t mim::plug::clos::Plugin_Id = 0x10d4140000000000
staticconstexpr

Definition at line 10 of file autogen.h.