Menu

- Learn
- Documentation
  - Language Reference
  - Library Reference
  - Command-line Reference
  - Feature Overview
  - Articles
- Downloads
- Packages
- Community
  - Blog
  - Orgs using D
  - Twitter
  - Calendar
  - Forums
  - IRC
  - Community Discord
  - Wiki
  - GitHub
  - Issues
  - Get involved
  - Contributors
  - Foundation
  - Security Team
  - Donate
  - Sponsors
- Resources
  - Tour
  - Books
  - Tutorials
  - Tools
  - Editors
  - IDEs
  - run.dlang.io
  - Visual D
  - Acknowledgments
  - D Style
  - Glossary
  - Sitemap

Search
Report a bug
If you spot a problem with this page, click here to create a Bugzilla issue.
Improve this page
Quickly fork, edit online, and submit a pull request for this page. Requires a signed-in GitHub account. This works well for small changes. If you'd like to make larger changes you may want to consider using a local clone.

# dmd.toir

Convert to Intermediate Representation (IR) for the back-end.
Authors:
Walter Bright
License:
Boost License 1.0

Source toir.d

Documentation https://dlang.org/phobos/dmd_toir.html

Coverage https://codecov.io/gh/dlang/dmd/src/master/src/dmd/toir.d

struct `Label`;
  Our label symbol
struct `IRState`;
  Collect state variables needed by the intermediate representation (IR)
  bool `arrayBoundsCheck`();
    Returns:
    true if do array bounds checking for the current function
  bool `isNothrow`();
    Returns:
    true if in a nothrow section of code
elem* `incUsageElem`(IRState* `irs`, ref const Loc `loc`);
  Produce elem which increments the usage count for a particular line. Sets corresponding bit in bitmap m.covb[linnum]. Used to implement -cov switch (coverage analysis).
  Parameters:

  IRState* `irs` | context
  Loc `loc` | line and file of what line to show usage for

  Returns:
  elem that increments the line count

  References https://dlang.org/dmd-windows.html#switch-cov

elem* `getEthis`(ref const Loc `loc`, IRState* `irs`, Dsymbol `fd`, Dsymbol `fdp` = null, Dsymbol `origSc` = null);
  Return elem that evaluates to the static frame pointer for function fd. If fd is a member function, the returned expression will compute the value of fd's 'this' variable. 'fdp' is the parent of 'fd' if the frame pointer is being used to call 'fd'. 'origSc' is the original scope we inlined from. This routine is critical for implementing nested functions.
elem* `fixEthis2`(elem* `ethis`, FuncDeclaration `fd`, bool `ctxt2` = false);
  Select one context pointer from a dual-context array
  Returns:
  *(ethis + offset);
elem* `setEthis`(ref const Loc `loc`, IRState* `irs`, elem* `ey`, AggregateDeclaration `ad`, bool `setthis2` = false);
  Initialize the hidden aggregate member, vthis, with the context pointer.
  Returns:
  *(ey + (ethis2 ? ad.vthis2 : ad.vthis).offset) = this;
int `intrinsic_op`(FuncDeclaration `fd`);
  Convert intrinsic function to operator.
  Returns:
  the operator as backend OPER, NotIntrinsic if not an intrinsic function, OPtoPrec if frontend-only intrinsic
elem* `resolveLengthVar`(VarDeclaration `lengthVar`, elem** `pe`, Type `t1`);
  Given an expression e that is an array, determine and set the 'length' variable.

  Input lengthVar Symbol of 'length' variable &e expression that is the array t1 Type of the array

  Output e is rewritten to avoid side effects

  Returns:
  expression that initializes 'length'
TYPE* `getParentClosureType`(Symbol* `sthis`, FuncDeclaration `fd`);
  for a nested function 'fd' return the type of the closure of an outer function or aggregate. If the function is a member function the 'this' type is expected to be stored in 'sthis.Sthis'. It is always returned if it is not a void pointer. buildClosure() must have been called on the outer function before.
  Parameters:

  Symbol* `sthis` | the symbol of the current 'this' derived from fd.vthis
  FuncDeclaration `fd` | the nested function

void `setClosureVarOffset`(FuncDeclaration `fd`);
  Go through the variables in function fd that are to be allocated in a closure, and set the .offset fields for those variables to their positions relative to the start of the closure instance. Also turns off nrvo for closure variables.
  Parameters:

  FuncDeclaration `fd` | function

void `buildClosure`(FuncDeclaration `fd`, IRState* `irs`);
  Closures are implemented by taking the local variables that need to survive the scope of the function, and copying them into a gc allocated chuck of memory. That chunk, called the closure here, is inserted into the linked list of stack frames instead of the usual stack frame.
  buildClosure() inserts code just after the function prolog is complete. It allocates memory for the closure, allocates a local variable (sclosure) to point to it, inserts into it the link to the enclosing frame, and copies into it the parameters that are referred to in nested functions. In VarExp::toElem and SymOffExp::toElem, when referring to a variable that is in a closure, takes the offset from sclosure rather than from the frame pointer.
  getEthis() and NewExp::toElem need to use sclosure, if set, rather than the current frame pointer.
void `buildCapture`(FuncDeclaration `fd`);
  build a debug info struct for variables captured by nested functions, but not in a closure. must be called after generating the function to fill stack offsets
  Parameters:

  FuncDeclaration `fd` | function

RET `retStyle`(TypeFunction `tf`, bool `needsThis`);
  Determine return style of function - whether in registers or through a hidden pointer to the caller's stack.
  Parameters:

  TypeFunction `tf` | function type to check
  bool `needsThis` | true if the function type is for a non-static member function

  Returns:
  RET.stack if return value from function is on the stack, RET.regs otherwise

Copyright © 1999-2020 by the D Language Foundation | Page generated by Ddoc on Sat Aug 15 10:01:06 2020