MimIR
MimIR is my Intermediate Representation
Loading...
Searching...
No Matches

#include <mim/plug/ll/ll.h>

Inheritance diagram for mim::plug::ll::Emitter:
[legend]

Public Types

enum class  Rt {
  embed ,
  ext
}
 How the C runtime wrappers (compiled to a <name>.ll via add_mim_runtime) reach the output. More...
using Super = mim::Emitter<std::string, std::string, BB, Emitter>

Public Member Functions

 Emitter (World &world, std::string name, std::ostream &ostream)
bool is_valid (std::string_view s)
void start () override
 Actual entry.
void emit_imported (Lam *)
virtual std::string prepare ()
virtual void emit_epilogue (Lam *lam)
void finalize ()
std::string emit_bb (BB &bb, const Def *def)
virtual std::optional< std::string > isa_targetspecific_intrinsic (BB &, const Def *)
template<class... Args>
void declare (std::format_string< Args... > s, Args &&... args)
void rt_mode (Rt rt)
void rt_module (std::string ll)
 Provides the textual LLVM IR of the runtime module to splice in Rt::embed mode.
bool load_rt_module (std::string_view filename)
 Locates the runtime module rt/<filename> (produced by add_mim_runtime) in the driver's search paths, reads it, and stores it for Rt::embed splicing.
template<class... Args>
void declare_rt (std::format_string< Args... > sig, Args &&... args)
 Declares a runtime wrapper sig (implemented in a C runtime, see add_mim_runtime) and records that the runtime is required by this module.
Public Member Functions inherited from mim::NestPhase< Lam >
 NestPhase (World &world, std::string name, bool elide_empty, bool schedule=false)
const Nestnest () const
Public Member Functions inherited from mim::ClosedMutPhase< Lam >
 ClosedMutPhase (World &world, std::string name, bool elide_empty, bool schedule=false)
bool elide_empty () const
bool schedule () const
Public Member Functions inherited from mim::Phase
 Phase (World &world, std::string name)
 Phase (World &world, flags_t annex)
virtual ~Phase ()=default
virtual std::unique_ptr< Phaserecreate ()
 Creates a new instance; needed by a fixed-point PhaseMan.
virtual void apply (const App *)
 Invoked if your Phase has additional args.
virtual void apply (Phase &)
 Dito, but invoked by Phase::recreate.
virtual bool redirects () const
 If true, Phase::create uses take_resolved().
virtual std::unique_ptr< Phasetake_resolved ()
 The Phase to use instead; nullptr means elide.
Worldworld ()
Driverdriver ()
Loglog () const
std::string_view name () const
flags_t annex () const
const Vector< std::string > & args ()
 Command-line arguments passed to this Phase's plugin via -X <plugin>:<arg>.
bool todo () const
void invalidate (bool todo=true)
 Signals that another round of fixed-point iteration is required, either as part of.
virtual void run ()
 Entry point and generates some debug output; invokes Phase::start.
void profile_count (std::string_view key, uint64_t n=1)
 Adds n to the custom Profiler counter key of the current run; no-op unless profiling is enabled.

Protected Member Functions

std::string id (const Def *, bool force_bb=false) const
virtual std::string convert (const Def *type, bool simd=true)
std::string convert_ret_pi (const Pi *)
void emit_phi (Lam *callee, const Def *phi, std::string arg, Lam *pred)
 Registers arg as an incoming phi value for phi in callee, coming from predecessor pred.
void emit_phi_args (Lam *callee, const App *app, Lam *pred)
 Wires all non-mem.M arguments of app into callee's phis, coming from predecessor pred.
virtual std::string emit_slot (BB &bb, const App *app, const Def *pointee, const Def *)
 Emits the storage backing a mem.slot of type pointee and yields the pointer value.
Protected Member Functions inherited from mim::Emitter< std::string, std::string, BB, Emitter >
 Emitter (World &world, std::string name, std::ostream &ostream, bool schedule=false)
virtual bool direct_style ()
std::ostream & ostream () const
std::string emit (const Def *def)
 Recursively emits code.
std::string emit_unsafe (const Def *def)
 As above but returning !child().is_valid(value) is permitted.
void visit (const Nest &nest) override
Protected Member Functions inherited from mim::ClosedMutPhase< Lam >
virtual void visit (Lam *)=0
Lamroot () const

Protected Attributes

absl::btree_set< std::string > decls_
std::ostringstream type_decls_
std::ostringstream vars_decls_
std::ostringstream func_decls_
std::ostringstream func_impls_
LamMap< const Def * > simd_phi_
Rt rt_ = Rt::embed
bool rt_used_ = false
std::string rt_module_
Protected Attributes inherited from mim::Emitter< std::string, std::string, BB, Emitter >
Lamcurr_lam_
std::ostream & ostream_
Scheduler scheduler_
DefMap< std::string > locals_
DefMap< std::string > globals_
DefMap< std::string > types_
LamMap< BB > lam2bb_
Protected Attributes inherited from mim::Phase
std::string name_

Friends

void mim_ll_convert (Emitter &e, const Def *type, bool simd, std::string &res)
 The heavy, target-independent emitter methods are compiled once into libmim_ll (see ll.cpp).
void mim_ll_finalize (Emitter &e)
void mim_ll_emit_epilogue (Emitter &e, Lam *lam)
void mim_ll_emit_bb (Emitter &e, BB &bb, const Def *def, std::string &res)

Additional Inherited Members

Static Public Member Functions inherited from mim::Phase
static std::unique_ptr< Phasecreate (const Flags2Phases &phases, const Def *def)
template<class A, class P>
static void hook (Flags2Phases &phases)
template<class P, class... Args>
static void run (Args &&... args)
 Runs a single Phase.
Public Attributes inherited from mim::Emitter< std::string, std::string, BB, Emitter >
fe::Tab tab

Detailed Description

Definition at line 118 of file ll.h.

Member Typedef Documentation

◆ Super

using mim::plug::ll::Emitter::Super = mim::Emitter<std::string, std::string, BB, Emitter>

Definition at line 120 of file ll.h.

Member Enumeration Documentation

◆ Rt

enum class mim::plug::ll::Emitter::Rt
strong

How the C runtime wrappers (compiled to a <name>.ll via add_mim_runtime) reach the output.

Enumerator
embed 

Splice the wrapper IR into the emitted module so it is self-contained.

ext 

Only declare the wrappers; the runtime is linked in externally.

Definition at line 159 of file ll.h.

Constructor & Destructor Documentation

◆ Emitter()

mim::plug::ll::Emitter::Emitter ( World & world,
std::string name,
std::ostream & ostream )
inline

Member Function Documentation

◆ convert()

virtual std::string mim::plug::ll::Emitter::convert ( const Def * type,
bool simd = true )
inlineprotectedvirtual

◆ convert_ret_pi()

std::string mim::plug::ll::Emitter::convert_ret_pi ( const Pi * pi)
inlineprotected

◆ declare()

template<class... Args>
void mim::plug::ll::Emitter::declare ( std::format_string< Args... > s,
Args &&... args )
inline

◆ declare_rt()

template<class... Args>
void mim::plug::ll::Emitter::declare_rt ( std::format_string< Args... > sig,
Args &&... args )
inline

Declares a runtime wrapper sig (implemented in a C runtime, see add_mim_runtime) and records that the runtime is required by this module.

In Rt::ext mode the declaration is emitted like any other declare. In Rt::embed mode the wrapper's definition is spliced into the output, so emitting a declare as well would be a redefinition — hence it is suppressed here.

Definition at line 181 of file ll.h.

References mim::Phase::args(), declare(), ext, rt_, and rt_used_.

◆ emit_bb()

std::string mim::plug::ll::Emitter::emit_bb ( BB & bb,
const Def * def )
inline

Definition at line 142 of file ll.h.

◆ emit_epilogue()

virtual void mim::plug::ll::Emitter::emit_epilogue ( Lam * lam)
inlinevirtual

Definition at line 140 of file ll.h.

◆ emit_imported()

void mim::plug::ll::Emitter::emit_imported ( Lam * lam)
inline

◆ emit_phi()

void mim::plug::ll::Emitter::emit_phi ( Lam * callee,
const Def * phi,
std::string arg,
Lam * pred )
inlineprotected

Registers arg as an incoming phi value for phi in callee, coming from predecessor pred.

Definition at line 196 of file ll.h.

References id(), mim::Emitter< std::string, std::string, BB, Emitter >::lam2bb_, and mim::Emitter< std::string, std::string, BB, Emitter >::locals_.

Referenced by emit_phi_args().

◆ emit_phi_args()

void mim::plug::ll::Emitter::emit_phi_args ( Lam * callee,
const App * app,
Lam * pred )
inlineprotected

Wires all non-mem.M arguments of app into callee's phis, coming from predecessor pred.

Definition at line 202 of file ll.h.

References mim::App::arg(), emit_phi(), mim::Emitter< std::string, std::string, BB, Emitter >::emit_unsafe(), mim::Axm::isa(), mim::Def::num_tvars(), and mim::Def::var().

◆ emit_slot()

virtual std::string mim::plug::ll::Emitter::emit_slot ( BB & bb,
const App * app,
const Def * pointee,
const Def *  )
inlineprotectedvirtual

Emits the storage backing a mem.slot of type pointee and yields the pointer value.

The generic backend allocates on the stack; targets may override (e.g. a global in a specific address space). Kept inline on purpose so Emitter retains no vtable key function (else its vtable would live in a single module and break derived backends loaded from a separate plugin).

Reimplemented in mim::plug::ll_nvptx::DeviceEmitter.

Definition at line 216 of file ll.h.

References mim::plug::ll::BB::body(), convert(), and mim::Def::unique_name().

◆ finalize()

void mim::plug::ll::Emitter::finalize ( )
inline

Definition at line 141 of file ll.h.

◆ id()

◆ is_valid()

bool mim::plug::ll::Emitter::is_valid ( std::string_view s)
inline

Definition at line 134 of file ll.h.

◆ isa_targetspecific_intrinsic()

virtual std::optional< std::string > mim::plug::ll::Emitter::isa_targetspecific_intrinsic ( BB & ,
const Def *  )
inlinevirtual

Reimplemented in mim::plug::ll_nvptx::DeviceEmitter, and mim::plug::ll_nvptx::HostEmitter.

Definition at line 148 of file ll.h.

◆ load_rt_module()

bool mim::plug::ll::Emitter::load_rt_module ( std::string_view filename)
inline

Locates the runtime module rt/<filename> (produced by add_mim_runtime) in the driver's search paths, reads it, and stores it for Rt::embed splicing.

Backends share this instead of duplicating the lookup: ll loads ll_rt.ll, ll_nvptx loads ll_nvptx_rt.ll, and so on — one merged module per plugin.

Returns
whether the module was found.

Definition at line 339 of file ll.h.

References mim::Phase::driver(), rt_module_, and mim::Phase::world().

Referenced by mim::plug::ll_nvptx::emit_host().

◆ prepare()

◆ rt_mode()

void mim::plug::ll::Emitter::rt_mode ( Rt rt)
inline

Definition at line 164 of file ll.h.

References rt_.

Referenced by mim::plug::ll_nvptx::emit_host().

◆ rt_module()

void mim::plug::ll::Emitter::rt_module ( std::string ll)
inline

Provides the textual LLVM IR of the runtime module to splice in Rt::embed mode.

Definition at line 166 of file ll.h.

References rt_module_.

◆ start()

◆ mim_ll_convert

void mim_ll_convert ( Emitter & e,
const Def * type,
bool simd,
std::string & res )
friend

The heavy, target-independent emitter methods are compiled once into libmim_ll (see ll.cpp).

libmim_ll_nvptx reaches them through these extern "C" shims instead of recompiling the bodies; Emitter caches the pointers via GET_FUN_PTR in its constructor.

Definition at line 1093 of file ll.cpp.

References Emitter(), and MIM_EXPORT.

Referenced by Emitter().

◆ mim_ll_emit_bb

void mim_ll_emit_bb ( Emitter & e,
BB & bb,
const Def * def,
std::string & res )
friend

Definition at line 1098 of file ll.cpp.

References Emitter(), and MIM_EXPORT.

Referenced by Emitter().

◆ mim_ll_emit_epilogue

void mim_ll_emit_epilogue ( Emitter & e,
Lam * lam )
friend

Definition at line 1097 of file ll.cpp.

References Emitter(), and MIM_EXPORT.

Referenced by Emitter().

◆ mim_ll_finalize

void mim_ll_finalize ( Emitter & e)
friend

Definition at line 1096 of file ll.cpp.

References Emitter(), and MIM_EXPORT.

Referenced by Emitter().

Member Data Documentation

◆ decls_

absl::btree_set<std::string> mim::plug::ll::Emitter::decls_
protected

Definition at line 222 of file ll.h.

Referenced by declare(), and start().

◆ func_decls_

std::ostringstream mim::plug::ll::Emitter::func_decls_
protected

Definition at line 225 of file ll.h.

Referenced by emit_imported(), and start().

◆ func_impls_

std::ostringstream mim::plug::ll::Emitter::func_impls_
protected

Definition at line 226 of file ll.h.

Referenced by prepare(), mim::plug::ll_nvptx::DeviceEmitter::prepare(), and start().

◆ rt_

Rt mim::plug::ll::Emitter::rt_ = Rt::embed
protected

Definition at line 229 of file ll.h.

Referenced by declare_rt(), rt_mode(), and start().

◆ rt_module_

std::string mim::plug::ll::Emitter::rt_module_
protected

Definition at line 231 of file ll.h.

Referenced by load_rt_module(), rt_module(), and start().

◆ rt_used_

bool mim::plug::ll::Emitter::rt_used_ = false
protected

Definition at line 230 of file ll.h.

Referenced by declare_rt(), and start().

◆ simd_phi_

LamMap<const Def*> mim::plug::ll::Emitter::simd_phi_
protected

Definition at line 227 of file ll.h.

◆ type_decls_

std::ostringstream mim::plug::ll::Emitter::type_decls_
protected

Definition at line 223 of file ll.h.

Referenced by start().

◆ vars_decls_


The documentation for this class was generated from the following files: