libFirm
Code Generation

Code Generation (backend) produces machine-code. More...

Modules

 Just in Time Compilation
 Provides interface to generate code and resolve symbols in memory buffers.
 

Data Structures

struct  vararg_params
 This structure holds the information on how the backend implements variadic functions. More...
 
struct  backend_params
 This structure contains parameters that should be propagated to the libFirm parameter set. More...
 

Typedefs

typedef void(* lower_func) (ir_node *)
 
typedef void(* after_transform_func) (ir_graph *irg, const char *name)
 

Enumerations

enum  asm_constraint_flags_t {
  ASM_CONSTRAINT_FLAG_NONE = 0, ASM_CONSTRAINT_FLAG_SUPPORTS_REGISTER = 1u << 0, ASM_CONSTRAINT_FLAG_SUPPORTS_MEMOP = 1u << 1, ASM_CONSTRAINT_FLAG_SUPPORTS_IMMEDIATE = 1u << 2,
  ASM_CONSTRAINT_FLAG_SUPPORTS_ANY = ASM_CONSTRAINT_FLAG_SUPPORTS_IMMEDIATE | ASM_CONSTRAINT_FLAG_SUPPORTS_MEMOP | ASM_CONSTRAINT_FLAG_SUPPORTS_REGISTER, ASM_CONSTRAINT_FLAG_NO_SUPPORT = 1u << 3, ASM_CONSTRAINT_FLAG_MODIFIER_WRITE = 1u << 4, ASM_CONSTRAINT_FLAG_MODIFIER_READ = 1u << 5,
  ASM_CONSTRAINT_FLAG_MODIFIER_EARLYCLOBBER = 1u << 6, ASM_CONSTRAINT_FLAG_MODIFIER_COMMUTATIVE = 1u << 7, ASM_CONSTRAINT_FLAG_INVALID = 1u << 8
}
 flags categorizing assembler constraint specifications More...
 
enum  dwarf_source_language {
  DW_LANG_C89 = 0x0001, DW_LANG_C = 0x0002, DW_LANG_Ada83 = 0x0003, DW_LANG_C_plus_plus = 0x0004,
  DW_LANG_Cobol74 = 0x0005, DW_LANG_Cobol85 = 0x0006, DW_LANG_Fortran77 = 0x0007, DW_LANG_Fortran90 = 0x0008,
  DW_LANG_Pascal83 = 0x0009, DW_LANG_Modula2 = 0x000a, DW_LANG_Java = 0x000b, DW_LANG_C99 = 0x000c,
  DW_LANG_Ada95 = 0x000d, DW_LANG_Fortran95 = 0x000e, DW_LANG_PLI = 0x000f, DW_LANG_ObjC = 0x0010,
  DW_LANG_ObjC_plus_plus = 0x0011, DW_LANG_UPC = 0x0012, DW_LANG_D = 0x0013, DW_LANG_Python = 0x0014,
  DW_LANG_Go = 0x0016
}
 Dwarf source language codes. More...
 

Functions

int be_parse_arg (const char *arg)
 Parse one backend argument. More...
 
int be_is_big_endian (void)
 Returns 1 if the backend uses big-endian byte ordering and 0 for little-endian. More...
 
unsigned be_get_machine_size (void)
 Returns size of machine words. More...
 
ir_modebe_get_mode_float_arithmetic (void)
 Returns supported float arithmetic mode or NULL if mode_D and mode_F are supported natively. More...
 
ir_typebe_get_type_long_double (void)
 Returns type used for long double or NULL if none available. More...
 
float_int_conversion_overflow_style_t be_get_float_int_overflow (void)
 Returns the backend behaviour on float to integer conversion overflow. More...
 
void be_initialize (void)
 Initialize the backend for the selected isa. More...
 
const backend_paramsbe_get_backend_param (void)
 Returns the backend configuration parameter. More...
 
void be_lower_for_target (void)
 Lowers current program for the target architecture. More...
 
void be_set_after_transform_func (after_transform_func func)
 Sets a callback that is called after each transformation step in be_lower_for_target(). More...
 
void be_main (FILE *output, const char *compilation_unit_name)
 Main interface to the frontend. More...
 
asm_constraint_flags_t be_parse_asm_constraints (const char *constraints)
 parse assembler constraint strings and returns flags (so the frontend knows which operands are inputs/outputs and whether memory is required) More...
 
int be_is_valid_clobber (const char *clobber)
 tests whether a string is a valid clobber in an ASM instruction More...
 
void be_dwarf_set_source_language (dwarf_source_language language)
 Sets source language for dwarf debug information. More...
 
void be_dwarf_set_compilation_directory (const char *directory)
 Sets working directory of the compiler (or directory where the compiler searched for sources) for dwarf debug information. More...
 

Detailed Description

Code Generation (backend) produces machine-code.


Data Structure Documentation

struct vararg_params

This structure holds the information on how the backend implements variadic functions.

Definition at line 87 of file be.h.

Data Fields
lower_func lower_va_arg The function to lower a call to the va_arg macro.
ir_type * va_list_type Which type is to be used for va_list.

If this is NULL, the backend does not implement variadic functions.

struct backend_params

This structure contains parameters that should be propagated to the libFirm parameter set.

Definition at line 99 of file be.h.

Data Fields
arch_allow_ifconv_func allow_ifconv Backend settings for if-conversion.
unsigned byte_order_big_endian:1 the backend uses big-endian byte ordering if set, else little endian
const ir_settings_arch_dep_t * dep_param Settings for architecture dependent optimizations.
char const * experimental
float_int_conversion_overflow_style_t float_int_overflow Semantic on float->int conversion overflow.
unsigned machine_size size of machine word in bits.

This is usually the size of the general purpose integer/address registers.

ir_mode * mode_float_arithmetic some backends like x87 can only do arithmetic in a specific float mode (load/store are still done in the "normal" float/double modes).
unsigned modulo_shift Shifts on this architecture only read some bits of the shift value.

For example on x86 for every mode with less than 32bits only 5 bits of the shift value are read resulting in a modulo shift value of 32. On an architecture without modulo_shift this value is 0.

unsigned pic_supported:1 1 if backend supports generation of position independent code (PIC)
unsigned stack_param_align Alignment of stack parameters.
unsigned thread_local_storage_supported:1 Whether thread local storage is supported.
ir_type * type_long_double type used for long double or NULL if none available.
unsigned unaligned_memaccess_supported:1 unaligned memory accesses are not supported natively (but the backend may break the access up into several smaller ones)
vararg_params vararg How this backend implements variadic functions.

Typedef Documentation

typedef void(* after_transform_func) (ir_graph *irg, const char *name)

Definition at line 211 of file be.h.

typedef void(* lower_func) (ir_node *)

Definition at line 81 of file be.h.

Enumeration Type Documentation

flags categorizing assembler constraint specifications

Enumerator
ASM_CONSTRAINT_FLAG_NONE 

no constraints

ASM_CONSTRAINT_FLAG_SUPPORTS_REGISTER 

input/output can be in a register

ASM_CONSTRAINT_FLAG_SUPPORTS_MEMOP 

input/output can be read/written to/from a memory address

ASM_CONSTRAINT_FLAG_SUPPORTS_IMMEDIATE 

input can be encoded as an immediate number

ASM_CONSTRAINT_FLAG_SUPPORTS_ANY 

input/output can be in a register, in memory or an immediate

ASM_CONSTRAINT_FLAG_NO_SUPPORT 

the constraint is not supported yet by libFirm (but valid in gcc)

ASM_CONSTRAINT_FLAG_MODIFIER_WRITE 

The input is also written to.

ASM_CONSTRAINT_FLAG_MODIFIER_READ 

the input is read

ASM_CONSTRAINT_FLAG_MODIFIER_EARLYCLOBBER 

the value is modified before all inputs to the asm block are handled.

ASM_CONSTRAINT_FLAG_MODIFIER_COMMUTATIVE 

This operand and the following operand are commutative.

ASM_CONSTRAINT_FLAG_INVALID 

invalid constraint (due to parse error)

Definition at line 30 of file be.h.

Dwarf source language codes.

Enumerator
DW_LANG_C89 
DW_LANG_C 
DW_LANG_Ada83 
DW_LANG_C_plus_plus 
DW_LANG_Cobol74 
DW_LANG_Cobol85 
DW_LANG_Fortran77 
DW_LANG_Fortran90 
DW_LANG_Pascal83 
DW_LANG_Modula2 
DW_LANG_Java 
DW_LANG_C99 
DW_LANG_Ada95 
DW_LANG_Fortran95 
DW_LANG_PLI 
DW_LANG_ObjC 
DW_LANG_ObjC_plus_plus 
DW_LANG_UPC 
DW_LANG_D 
DW_LANG_Python 
DW_LANG_Go 

Definition at line 57 of file be.h.

Function Documentation

void be_dwarf_set_compilation_directory ( const char *  directory)

Sets working directory of the compiler (or directory where the compiler searched for sources) for dwarf debug information.

void be_dwarf_set_source_language ( dwarf_source_language  language)

Sets source language for dwarf debug information.

const backend_params* be_get_backend_param ( void  )

Returns the backend configuration parameter.

Returns
libFirm configuration parameters for the selected backend
float_int_conversion_overflow_style_t be_get_float_int_overflow ( void  )

Returns the backend behaviour on float to integer conversion overflow.

unsigned be_get_machine_size ( void  )

Returns size of machine words.

This is usually the size of the general purpose integer registers.

ir_mode* be_get_mode_float_arithmetic ( void  )

Returns supported float arithmetic mode or NULL if mode_D and mode_F are supported natively.

Some backends like x87 can only do arithmetic in a specific float mode (load/store are still done in the "normal" float/double modes).

ir_type* be_get_type_long_double ( void  )

Returns type used for long double or NULL if none available.

void be_initialize ( void  )

Initialize the backend for the selected isa.

This initializes mode_P and should be called after all options are set with be_parse_arg().

int be_is_big_endian ( void  )

Returns 1 if the backend uses big-endian byte ordering and 0 for little-endian.

int be_is_valid_clobber ( const char *  clobber)

tests whether a string is a valid clobber in an ASM instruction

void be_lower_for_target ( void  )

Lowers current program for the target architecture.

This must be run once before using be_main. The idea here is that the backend can perform lowerings like doubleword-lowering, ABI adjustments or implementation of boolean values, if-conversion, with target specific settings. The resulting graph is still a "normal" firm-graph on which you can and should perform further architecture-neutral optimizations before be_main.

void be_main ( FILE *  output,
const char *  compilation_unit_name 
)

Main interface to the frontend.

int be_parse_arg ( const char *  arg)

Parse one backend argument.

This is intended to provide commandline options to various backend parameters that might be changing. Returns -1 if 'help' was found, 0 if the argument could not be parsed, 1 if the option could be set.

asm_constraint_flags_t be_parse_asm_constraints ( const char *  constraints)

parse assembler constraint strings and returns flags (so the frontend knows which operands are inputs/outputs and whether memory is required)

void be_set_after_transform_func ( after_transform_func  func)

Sets a callback that is called after each transformation step in be_lower_for_target().

This is typically used to run dump & verify steps to help debugging.