arch/arch
This module provides a generic implementation of arch component. This allows declaring all relations of the interface, and defining default rules for some of them.
- arch(Name:symbol)
The name of the active architecture
WARNING: Predicate not present in compiled Datalog program (Dead Code)
- float_operation(Operation:symbol)
Define a set of floating point operations
WARNING: Predicate not present in compiled Datalog program (Dead Code)
- interrupt_operation(Operation:symbol)
Used by:
must_fallthrough
- jump_operation(Operation:symbol)
An operation that may be a jump, depending on context. Use arch.jump(EA) for a defintive list of jumps.
Uses:
arch.conditional_branch,arch.jump_comp_operation,arch.jump_condition_code,arch.jump_equal_operation,arch.jump_operation_may_have_cc,arch.jump_unequal_operation,arch.loop_operation,arch.test_jump_operation,condition_code_mapUsed by:
arch.delay_slot,arch.jump,arch.jump_operation_op_index,arch.op_access_override
- move_operation(Operation:symbol)
Define all variants of the move operation.
- load_operation(Operation:symbol)
Uses:
instructionUsed by:
arch.data_access_size,arch.jump_operation_op_index,arch.memory_access,arch.reg_arithmetic_operation,arch.reg_reg_arithmetic_operation,base_addr_offset_operand,cinf_ldr_add_pc,gp_relative_operand,init_ldr_add_pc,litpool_symbolic_operand,plt_entry,plt_entry_arm_candidate,split_load
- load_word_operation(Operation:symbol)
WARNING: Predicate not present in compiled Datalog program (Dead Code)
- store_operation(Operation:symbol)
- conditional_operation(Operation:symbol, CC:condition_code)
- conditional(EA:address, CC:condition_code)
Uses:
arch.conditional_operation,arch.it_conditional,condition_code_map,instruction,instruction_cond_code,instruction_get_op,op_specialUsed by:
arch.register_access_override,arm_jump_table_cmp_limit,cfg_edge,cfg_edge_to_symbol,compare_and_jump_immediate,compare_and_jump_register,conditional_jump,conditional_return,flags_and_jump_pair,reg_def_use.block_last_def,reg_def_use.flow_def,reg_def_use.last_def_in_block,stack_def_use.block_last_def,stack_def_use.last_def_in_block,straight_line_last_def,unconditional_jump,unconditional_return
- multiplication_operation(Operation:symbol)
This can include any multiplication operations, including shift-left operation.
Uses:
instructionUsed by:
def_register_is_not_base_address
- shift_rotate_operation(Operation:symbol)
This can include shift and rotation (right/left, arithmetic/logical) operations.
Uses:
instructionUsed by:
def_register_is_not_base_address
- arithmetic_operation(Operation:symbol)
This can include any kinds of arithmetic operations including arithmetic shifts and multiplications.
WARNING: Predicate not present in compiled Datalog program (Dead Code)
- logic_operation(Operation:symbol)
This can include logical operations including bitwise operations.
- call_operation(Operation:symbol)
- syscall_operation(Operation:symbol)
Used by:
must_fallthrough
- return_operation(Operation:symbol)
Used by:
arch.delay_slot,arch.jump,arch.return
- cmp_operation(Operation:symbol)
May include operations that:
compare two values and implicitly set flags, e.g, Intel “CMP”
compare two values in a manner other than subtraction, e.g, Intel “TEST”
make a comparison and branch, e.g., mips32 “BEQZ”
Uses:
arch.jump_comp_operation,arch.jump_equal_operation,arch.jump_unequal_operation,instructionUsed by:
cmp_immediate_to_reg,cmp_reg_to_reg,compare_and_jump_immediate,compare_and_jump_indirect,contains_plausible_instr_seq,moved_label_candidate,moved_label_class,no_value_reg_limit,symbolic_operand_point
- cmp_zero_operation(Operation:symbol)
Comparison operations where a value is implicitly compared to zero.
Comparison may occur within an instruction that is also a branch operation, e.g., “BEQZ” on MIPS.
Uses:
arch.loop_operation,instructionUsed by:
compare_and_jump_immediate
- jump_operation_op_index(Operation:symbol, operand_index:operand_index)
Uses:
arch.jump_comp_operation_3op,arch.jump_equal_operation_3op,arch.jump_operation,arch.jump_unequal_operation_3op,arch.load_operation,arch.loop_operation,arch.move_operation,arch.test_jump_operationUsed by:
+disconnected2,branch_to_calculated_pc_rel_addr,cmp_immediate_to_reg,direct_jump,indirect_jump,plt_bx_pc,reg_jump,symbolic_operand_candidate
- call_operation_op_index(Operation:symbol, operand_index:operand_index)
Uses:
arch.call_operationUsed by:
arch.call
- move_reg_reg(EA:address, Dst:register, Src:register)
Moves from a register to a register; a move does not transform the value (except by sign extension).
Dst and Src may be untracked registers.
- move_reg_imm(EA:address, Dst:register, Imm:number, ImmIndex:operand_index)
Moves an immediate value to a register.
Dst may be an untracked register.
Uses:
arch.move_operation,arch.move_reg_reg,arch.reg_arithmetic_operation,arch.zero_reg,instruction,op_immediate,op_regdirect_contains_regUsed by:
arch.op_access_override,boundary_sym_expr,moved_immediate_candidate,moved_label_class,no_value_reg_limit,tls_relative_operand,value_reg,value_reg_limit
- move(EA:address)
WARNING: Predicate not present in compiled Datalog program (Dead Code)
- is_nop(EA:address)
- return(EA:address)
Returns
- jump(EA:address)
Uses:
arch.jump_operation,arch.memory_access,arch.move_reg_reg,arch.reg_reg_arithmetic_operation,arch.return,arch.return_operation,instructionUsed by:
arm_jump_table_cmp_limit,cfg_edge,cfg_edge_to_symbol,cmp_immediate_to_reg,compare_and_jump_immediate,compare_and_jump_register,conditional_jump,contains_plausible_instr_seq,direct_jump,flags_and_jump_pair,indirect_jump,moved_label_candidate,moved_label_class,pc_relative_jump,plt_entry,reg_def_use.flow_def,reg_jump,relative_address_start,resolved_transfer,symbolic_operand_point,unconditional_jump
- call(EA:address, DestOperandIndex:operand_index)
Uses:
arch.call_operation,arch.call_operation_op_index,instructionUsed by:
__agg_subclause2,__agg_subclause3,basic_reg_def_use.def,cfg_edge_to_symbol,direct_call,indirect_call,known_block,litpool_confidence,pc_relative_call,reg_call,reg_def_use.def,resolved_transfer,symbolic_operand_candidate,tls_desc_call,value_reg_unsupported
- memory_access_aggregated(AccessType:symbol, EA:address, BaseReg:reg_nullable, IndexReg:reg_nullable, Mult:number, Offset:number, AccessSize:unsigned)
Represents a load or store of a given instruction at EA.
This rule can represent complex vector loads, the semantics of which
memory_accesscannot accommodate. E.g., vld2.32, etc., in arm neon- AccesSize: The size of the entire consecutive memory that the given
instruction at EA accesses.
- memory_access(AccessType:symbol, EA:address, SrcOp:operand_index, DstOp:operand_index, DirectReg:register, BaseReg:reg_nullable, IndexReg:reg_nullable, Mult:number, Offset:number)
Represents a load or store of a register.
The address of the accessed memory is of the form:
BaseReg + IndexReg * Mult + Offset
Complex memory accesses may be represented with multiple members of this relation at the same address. For example, the arm64 instruction:
0x1000: ldp x7, x8, [x0, #10]
generates two arch.memory_access members:
memory_access(“LOAD”,0x1000,2,3,”X7”,”X0”,”NONE”,0,10) memory_access(“LOAD”,0x1000,2,1,”X8”,”X0”,”NONE”,0,18)
AccessType is either “LOAD” or “STORE” DirectReg, BaseReg, and IndexReg may be untracked registers or unstandardized names.
Uses:
arch.load_operation,arch.move_operation,arch.non_mult_shift,arch.register_size_bytes,arch.stack_pointer,arch.store_operation,instruction,instruction_writeback,op_immediate,op_indirect_mapped,op_regdirect,op_regdirect_contains_reg,op_register_bitfield,reg_mapUsed by:
__agg_subclause7,arch.extend_load,arch.jump,arch.op_access_override,arch.reg_arithmetic_operation,arch.reg_reg_arithmetic_operation,arch.reg_relative_load,arch.simple_data_load,arm_jump_table_cmp_limit,block_heuristic,compare_and_jump_indirect_op_valid,data_block_candidate,def_used_for_address,hi_load_prop,indexed_pc_relative_load,invalid,litpool_confidence,reg_has_base_image,relative_address_start,resolved_transfer_to_symbol,split_load_candidate,split_load_tail,stack_def_use.def,stack_def_use.used,symbolic_expr_from_relocation,value_reg,value_reg_edge,value_reg_limit,value_reg_unsupported
- load(EA:address, SrcOp:operand_index, DstOp:operand_index, DstReg:register, BaseReg:reg_nullable, IndexReg:reg_nullable, Mult:number, Offset:number)
Represents a load from memory to a register.
See arch.memory_access().
WARNING: Predicate not present in compiled Datalog program (Dead Code)
- store(EA:address, SrcOp:operand_index, DstOp:operand_index, SrcReg:register, BaseReg:reg_nullable, IndexReg:reg_nullable, Mult:number, Offset:number)
Represents a store from a register to memory.
See arch.memory_access().
WARNING: Predicate not present in compiled Datalog program (Dead Code)
- store_immediate(EA:address, SrcOp:operand_index, DstOp:operand_index, Immediate:number, BaseReg:reg_nullable, IndexReg:reg_nullable, Mult:number, Offset:number)
Represents the store of an immediate to memory. The address of the written memory is: BaseReg + IndexReg * Mult + Offset. The immediate stored to memory is Immediate.
This is not instantiatied for all architectures but it is defined here to maintain a uniform interface. E.g. It is possible in x86 but not in ARM.
- delay_slot(BranchEA:address, EA:address)
- data_access_size(Operation:symbol, DestReg:register, Size:unsigned)
These operations are either special like LEA (does not read memory) or are not decoded correctly from capstone
Operation: Operation name
DestReg: The destination register of the operation
Size: Data-access size in bytes
Uses:
arch.float_reg,arch.load_operation,arch.register_size_bytes,condition_code_map,instruction,op_regdirectUsed by:
instruction_memory_access_sizeRecursive:
arch.data_access_size
- reg_arithmetic_operation(EA:address, Dst:register, Src:register, Mult:number, Offset:number)
Arithmetic operation on one source register of the form Dst = Src * Mult + Offset
Uses:
arch.load_operation,arch.memory_access,arch.non_mult_shift,arch.reg_reg_arithmetic_operation,arch.register_size_bytes,arch.stack_pointer,arch.store_operation,instruction,instruction_writeback,op_immediate,op_indirect,op_indirect_mapped,op_regdirect,op_regdirect_contains_regUsed by:
adjusts_stack_in_block,arch.is_nop,arch.move_reg_imm,base_addr_offset_operand,contains_plausible_instr_seq,limit_reg_op,plt_entry,plt_entry_arm_candidate,split_load_candidate,split_load_tail,value_reg,value_reg_address_before,value_reg_edge
- reg_reg_arithmetic_operation(EA:address, Dst:register, Src1:register, Src2:register, Mult:number, Offset:number)
Arithmetic operation on two source registers of the form Dst = Src1 + Src2 * Mult + Offset
Note: Src1 and Src2 may be the same register.
Uses:
arch.load_operation,arch.memory_access,arch.non_mult_shift,arch.store_operation,instruction,instruction_writeback,op_indirect_mapped,op_regdirect_contains_reg,op_shiftedUsed by:
arch.jump,arch.reg_arithmetic_operation,base_relative_operand,branch_to_calculated_pc_rel_addr,cinf_ldr_add_pc,got_relative_operand,indexed_pc_relative_load_relative,init_ldr_add_pc,invalid,jump_table_element_access,jump_table_start,missed_jump_table,plt_entry_arm_candidate,reg_has_base_image,reg_reg_arithmetic_operation_defs,split_load_candidate,split_load_point,symbol_minus_symbol_litpool_access_patternRecursive:
arch.reg_reg_arithmetic_operation
- reg_reg_bitwise_binary_op(EA:address, Dst:register, Src1:register, Src2:register, Op:symbol)
Bitwise operation on two source of the form Dst = Src1 op Src2
op—– ASR: Arithmetic Shift Right LSR: Logical Shift Right LSL: Logical Shift Left AND: Bitwise AND OR: Bitwise OR XOR: Bitwise Exclusive OR
Note: The second source is either a register or an immediate.
Used by:
value_reg
- reg_imm_bitwise_binary_op(EA:address, Dst:register, Src:register, Imm:number, Op:symbol)
Uses:
instruction,op_immediate,op_regdirect_contains_reg,op_shiftedUsed by:
value_reg
- extend_reg(EA:address, Reg:register, Signed:unsigned, SrcBits:unsigned)
A value in a register is zero/sign-extended.
The initial value to be extended is SrcBits wide.
A value of 0 for Signed indicates the value is zero-extended, while 1 indicates that it is sign-extended.
If the register is used for other operations in the instruction, it is assumed the sign extension occurs first.
- extend_load(EA:address, Signed:unsigned, SrcBits:unsigned)
A value loaded from memory is zero/sign-extended.
Uses:
arch.memory_access,instructionRecursive:
arm_jump_table_block_instruction,stack_def_use.live_var_at_prior_used,possible_target_from,data_access,stack_def_use.ref_in_block,code_in_block_candidate,candidate_block_is_padding,relocation_adjustment,data_in_code,cmp_reg_to_reg,__agg_single3,jump_table_candidate_refined,invalid,inferred_main_in_reg,base_relative_operand,relative_address,wis_has_prior,compare_and_jump_indirect_op_valid,litpool_confidence,block_boundaries,resolved_reaches,indexed_pc_relative_load_relative,unresolved_block,split_load_for_symbolization,base_relative_jump,last_value_reg_limit,instruction_memory_access_size,plt_block,straight_line_last_def,__agg_subclause2,symbol_minus_symbol_litpool_access_pattern,jump_table_element_access,block_points,const_value_reg_used,reg_reg_arithmetic_operation_defs,stack_def_use.live_var_def,stack_def_use.live_var_used_in_block,composite_data_access,jump_table_target,value_reg_limit,block_candidate_dependency_edge,tls_get_addr,indefinite_litpool_ref,reg_def_use.used_in_block,simple_data_access_pattern,arch.simple_data_load,split_load,value_reg,stack_def_use.live_var_at_block_end,block_limit,arm_jump_table_data_block,value_reg_unsupported,stack_def_use.last_def_in_block,overlapping_instruction,next_start,block,wis_memo,next_type,cinf_ldr_add_pc,possible_target,relative_jump_table_entry_candidate,arm_jump_table_data_block_limit,reg_def_use.last_def_in_block,__agg_subclause6,stack_def_use.live_var_used,def_used_for_address,known_block,contains_plausible_instr_seq,reg_def_use.live_var_at_block_end,arch.reg_relative_load,split_load_point,candidate_block_is_not_padding,split_load_candidate,split_load_conflict,incomplete_block,wis_schedule_iter,reg_def_use.defined_in_block,__agg_subclause3,reg_def_use.ref_in_block,contains_implausible_instr_seq,base_relative_operation,negative_block_heuristic,no_return_call,reg_def_use.used,block_total_points,reg_def_use.block_last_def,discarded_block,reg_has_base_image,no_return_call_propagated,block_points_proportional,nop_in_padding_candidate,reg_def_use.live_var_used,block_heuristic,litpool_ref,after_end,reg_def_use.flow_def,transition_block_limit,unresolved_interval_order,cmp_defines,block_last_instruction,block_overlap,jump_table_max,arch.extend_load,reg_def_use.ambiguous_last_def_in_block,arm_jump_table_skip_first_entry,impossible_block,hi_load_prop,block_candidate_boundaries,is_padding,may_fallthrough,gp_relative_operand,segment_target_range,arm_jump_table_candidate_start,discarded_split_load,arm_jump_table_cmp_limit,first_block_in_byte_interval,arm_jump_table_candidate,jump_table_signed,stack_def_use.used_in_block,no_value_reg_limit,tls_desc_call,reg_used_for,branch_to_calculated_pc_rel_addr,__agg_single2,init_symbol_minus_symbol_candidate_arm,data_block_candidate,start_function,basic_target,reg_def_use.return_val_used,padding_block_limit,straight_line_def_used,data_block_limit,reg_def_use.ambiguous_block_last_def,wis_prior,stack_def_use.def_used,split_load_operand,init_ldr_add_pc,got_relative_operand,next_block_in_byte_interval,data_in_code_propagate,no_return_call_refined,call_tls_get_addr,inferred_main_dispatch,reg_def_use.def_used,must_fallthrough,block_next,value_reg_edge,unlikely_have_symbolic_immediate,adjusts_stack_in_block,self_contained_segment,block_implies_block,__agg_subclause7,__agg_single6,stack_def_use.defined_in_block,relocation_adjustment_total,compare_and_jump_indirect,flags_and_jump_pair,jump_table_candidate,function_inference.function_entry_initial,invalid_jump_table_candidate,reg_def_use.return_block_end,plt_entry,jump_table_start,reg_has_got,code_in_block_candidate_refined,code_in_block,no_return_block,unresolved_interval,litpool_symbolic_operand,split_load_total_points,unresolved_block_overlap,symbolic_expr_from_relocation,compare_and_jump_register,indexed_pc_relative_load,reg_def_use.live_var_def,arm_jump_table_block_start,overlap_with_litpool,compare_and_jump_immediate,initialized_data_segment,litpool_boundaries,padding_block_candidate,relative_address_start,stack_def_use.block_last_def,jump_table_prelude,correlated_live_reg,inter_procedural_edge,likely_fallthrough,adrp_used,next_end,common_tail,wis_schedule,stack_base_reg_move,reg_def_use.live_var_at_prior_used,data_segment,block_instruction_next
- register_access_override(EA:address, Register:register, Access:access_mode, Enable:unsigned)
Override the register access mode reported by Capstone
The Enable field indicates if the (EA,Register,Access) tuple should be a logical addition to register_access (Enable = 1) or ignored if it is in register_access (Enable = 0).
- op_access_override(EA:address, Index:operand_index, Access:access_mode, Enable:unsigned)
Override the operand access mode reported by Capstone.
The Enable field indicates if the (EA,Register,Access) tuple should be a logical addition to instruction_op_access (Enable = 1) or ignored if it is in instruction_op_access (Enable = 0).
- reg_relative_load(LoadEA:address, Reg:register, Offset:number, Size:unsigned)
Data is loaded from a register-relative address.
Uses:
arch.memory_access,arch.memory_access_aggregated,instruction,instruction_get_dest_op,op_register_bitfieldRecursive:
arm_jump_table_block_instruction,stack_def_use.live_var_at_prior_used,possible_target_from,data_access,stack_def_use.ref_in_block,code_in_block_candidate,candidate_block_is_padding,relocation_adjustment,data_in_code,cmp_reg_to_reg,__agg_single3,jump_table_candidate_refined,invalid,inferred_main_in_reg,base_relative_operand,relative_address,wis_has_prior,compare_and_jump_indirect_op_valid,litpool_confidence,block_boundaries,resolved_reaches,indexed_pc_relative_load_relative,unresolved_block,split_load_for_symbolization,base_relative_jump,last_value_reg_limit,instruction_memory_access_size,plt_block,straight_line_last_def,__agg_subclause2,symbol_minus_symbol_litpool_access_pattern,jump_table_element_access,block_points,const_value_reg_used,reg_reg_arithmetic_operation_defs,stack_def_use.live_var_def,stack_def_use.live_var_used_in_block,composite_data_access,jump_table_target,value_reg_limit,block_candidate_dependency_edge,tls_get_addr,indefinite_litpool_ref,reg_def_use.used_in_block,simple_data_access_pattern,arch.simple_data_load,split_load,value_reg,stack_def_use.live_var_at_block_end,block_limit,arm_jump_table_data_block,value_reg_unsupported,stack_def_use.last_def_in_block,overlapping_instruction,next_start,block,wis_memo,next_type,cinf_ldr_add_pc,possible_target,relative_jump_table_entry_candidate,arm_jump_table_data_block_limit,reg_def_use.last_def_in_block,__agg_subclause6,stack_def_use.live_var_used,def_used_for_address,known_block,contains_plausible_instr_seq,reg_def_use.live_var_at_block_end,arch.reg_relative_load,split_load_point,candidate_block_is_not_padding,split_load_candidate,split_load_conflict,incomplete_block,wis_schedule_iter,reg_def_use.defined_in_block,__agg_subclause3,reg_def_use.ref_in_block,contains_implausible_instr_seq,base_relative_operation,negative_block_heuristic,no_return_call,reg_def_use.used,block_total_points,reg_def_use.block_last_def,discarded_block,reg_has_base_image,no_return_call_propagated,block_points_proportional,nop_in_padding_candidate,reg_def_use.live_var_used,block_heuristic,litpool_ref,after_end,reg_def_use.flow_def,transition_block_limit,unresolved_interval_order,cmp_defines,block_last_instruction,block_overlap,jump_table_max,arch.extend_load,reg_def_use.ambiguous_last_def_in_block,arm_jump_table_skip_first_entry,impossible_block,hi_load_prop,block_candidate_boundaries,is_padding,may_fallthrough,gp_relative_operand,segment_target_range,arm_jump_table_candidate_start,discarded_split_load,arm_jump_table_cmp_limit,first_block_in_byte_interval,arm_jump_table_candidate,jump_table_signed,stack_def_use.used_in_block,no_value_reg_limit,tls_desc_call,reg_used_for,branch_to_calculated_pc_rel_addr,__agg_single2,init_symbol_minus_symbol_candidate_arm,data_block_candidate,start_function,basic_target,reg_def_use.return_val_used,padding_block_limit,straight_line_def_used,data_block_limit,reg_def_use.ambiguous_block_last_def,wis_prior,stack_def_use.def_used,split_load_operand,init_ldr_add_pc,got_relative_operand,next_block_in_byte_interval,data_in_code_propagate,no_return_call_refined,call_tls_get_addr,inferred_main_dispatch,reg_def_use.def_used,must_fallthrough,block_next,value_reg_edge,unlikely_have_symbolic_immediate,adjusts_stack_in_block,self_contained_segment,block_implies_block,__agg_subclause7,__agg_single6,stack_def_use.defined_in_block,relocation_adjustment_total,compare_and_jump_indirect,flags_and_jump_pair,jump_table_candidate,function_inference.function_entry_initial,invalid_jump_table_candidate,reg_def_use.return_block_end,plt_entry,jump_table_start,reg_has_got,code_in_block_candidate_refined,code_in_block,no_return_block,unresolved_interval,litpool_symbolic_operand,split_load_total_points,unresolved_block_overlap,symbolic_expr_from_relocation,compare_and_jump_register,indexed_pc_relative_load,reg_def_use.live_var_def,arm_jump_table_block_start,overlap_with_litpool,compare_and_jump_immediate,initialized_data_segment,litpool_boundaries,padding_block_candidate,relative_address_start,stack_def_use.block_last_def,jump_table_prelude,correlated_live_reg,inter_procedural_edge,likely_fallthrough,adrp_used,next_end,common_tail,wis_schedule,stack_base_reg_move,reg_def_use.live_var_at_prior_used,data_segment,block_instruction_next
- simple_data_load(EA:address, Data:address, Size:unsigned)
A single instruction reads data with a predetermined size and location
Recursive:
arm_jump_table_block_instruction,stack_def_use.live_var_at_prior_used,possible_target_from,data_access,stack_def_use.ref_in_block,code_in_block_candidate,candidate_block_is_padding,relocation_adjustment,data_in_code,cmp_reg_to_reg,__agg_single3,jump_table_candidate_refined,invalid,inferred_main_in_reg,base_relative_operand,relative_address,wis_has_prior,compare_and_jump_indirect_op_valid,litpool_confidence,block_boundaries,resolved_reaches,indexed_pc_relative_load_relative,unresolved_block,split_load_for_symbolization,base_relative_jump,last_value_reg_limit,instruction_memory_access_size,plt_block,straight_line_last_def,__agg_subclause2,symbol_minus_symbol_litpool_access_pattern,jump_table_element_access,block_points,const_value_reg_used,reg_reg_arithmetic_operation_defs,stack_def_use.live_var_def,stack_def_use.live_var_used_in_block,composite_data_access,jump_table_target,value_reg_limit,block_candidate_dependency_edge,tls_get_addr,indefinite_litpool_ref,reg_def_use.used_in_block,simple_data_access_pattern,arch.simple_data_load,split_load,value_reg,stack_def_use.live_var_at_block_end,block_limit,arm_jump_table_data_block,value_reg_unsupported,stack_def_use.last_def_in_block,overlapping_instruction,next_start,block,wis_memo,next_type,cinf_ldr_add_pc,possible_target,relative_jump_table_entry_candidate,arm_jump_table_data_block_limit,reg_def_use.last_def_in_block,__agg_subclause6,stack_def_use.live_var_used,def_used_for_address,known_block,contains_plausible_instr_seq,reg_def_use.live_var_at_block_end,arch.reg_relative_load,split_load_point,candidate_block_is_not_padding,split_load_candidate,split_load_conflict,incomplete_block,wis_schedule_iter,reg_def_use.defined_in_block,__agg_subclause3,reg_def_use.ref_in_block,contains_implausible_instr_seq,base_relative_operation,negative_block_heuristic,no_return_call,reg_def_use.used,block_total_points,reg_def_use.block_last_def,discarded_block,reg_has_base_image,no_return_call_propagated,block_points_proportional,nop_in_padding_candidate,reg_def_use.live_var_used,block_heuristic,litpool_ref,after_end,reg_def_use.flow_def,transition_block_limit,unresolved_interval_order,cmp_defines,block_last_instruction,block_overlap,jump_table_max,arch.extend_load,reg_def_use.ambiguous_last_def_in_block,arm_jump_table_skip_first_entry,impossible_block,hi_load_prop,block_candidate_boundaries,is_padding,may_fallthrough,gp_relative_operand,segment_target_range,arm_jump_table_candidate_start,discarded_split_load,arm_jump_table_cmp_limit,first_block_in_byte_interval,arm_jump_table_candidate,jump_table_signed,stack_def_use.used_in_block,no_value_reg_limit,tls_desc_call,reg_used_for,branch_to_calculated_pc_rel_addr,__agg_single2,init_symbol_minus_symbol_candidate_arm,data_block_candidate,start_function,basic_target,reg_def_use.return_val_used,padding_block_limit,straight_line_def_used,data_block_limit,reg_def_use.ambiguous_block_last_def,wis_prior,stack_def_use.def_used,split_load_operand,init_ldr_add_pc,got_relative_operand,next_block_in_byte_interval,data_in_code_propagate,no_return_call_refined,call_tls_get_addr,inferred_main_dispatch,reg_def_use.def_used,must_fallthrough,block_next,value_reg_edge,unlikely_have_symbolic_immediate,adjusts_stack_in_block,self_contained_segment,block_implies_block,__agg_subclause7,__agg_single6,stack_def_use.defined_in_block,relocation_adjustment_total,compare_and_jump_indirect,flags_and_jump_pair,jump_table_candidate,function_inference.function_entry_initial,invalid_jump_table_candidate,reg_def_use.return_block_end,plt_entry,jump_table_start,reg_has_got,code_in_block_candidate_refined,code_in_block,no_return_block,unresolved_interval,litpool_symbolic_operand,split_load_total_points,unresolved_block_overlap,symbolic_expr_from_relocation,compare_and_jump_register,indexed_pc_relative_load,reg_def_use.live_var_def,arm_jump_table_block_start,overlap_with_litpool,compare_and_jump_immediate,initialized_data_segment,litpool_boundaries,padding_block_candidate,relative_address_start,stack_def_use.block_last_def,jump_table_prelude,correlated_live_reg,inter_procedural_edge,likely_fallthrough,adrp_used,next_end,common_tail,wis_schedule,stack_base_reg_move,reg_def_use.live_var_at_prior_used,data_segment,block_instruction_next
- reg_map_rule(RegIn:input_reg, Reg:register)
Defines explicit register mappings.
Used by:
reg_map_nullable
- function_non_maintained_reg(Reg:register)
This specifies the registers whose value is not kept through a function call according to the architecture’s calling convention.
WARNING: Predicate not present in compiled Datalog program (Dead Code)
- pc_reg(Reg:register)
The PC register, if architecturally accessible.
WARNING: Predicate not present in compiled Datalog program (Dead Code)
- frame_pointer(Reg:register)
Register that may hold the stack frame pointer.
The frame pointer is often also a general_purpose_reg.
- stack_pointer(Reg:register)
Register that may hold the stack pointer.
Used by:
adjusts_stack_in_block,arch.memory_access,arch.reg_arithmetic_operation,arch.store_immediate,arm_jump_table_cmp_limit,basic_reg_def_use.def,contains_plausible_instr_seq,invalid,reg_def_use.def,stack_base_reg_move,stack_def_use.def,stack_def_use.live_var_used_in_block,stack_def_use.used,track_register
- return_reg(Reg:register)
Registers that hold the return value of a function.
- general_purpose_reg(Reg:register)
Registers that may be used for general purpose calculations.
Used by:
arch.register_size_bytes,track_register
- zero_reg(Reg:register)
A register with a constant value of zero.
Used by:
arch.move_reg_imm
- integer_reg_param(Reg:register, Index:unsigned)
Registers used for passing function arguments by calling convention: e.g., {r0-r3} for ARM32, {rcx,rdx,r8,r9} for Microsoft x64, etc.
Uses:
binary_formatUsed by:
inferred_main_in_reg,litpool_confidence
- float_reg(Reg:register, Size:unsigned)
Floating-point registers
- condition_flags_reg(Reg:register)
The register that holds condition flags.
- pc_relative_addr(EA:address, Reg:register, Target:address)
A pc-relative address ‘Target’ is loaded into ‘Reg’ at address ‘EA’.
Uses:
direct_call,get_pc_thunk,instruction,instruction_get_dest_op,instruction_get_op,instruction_get_src_op,op_immediate,op_regdirect_contains_reg,pc_load_call,pc_relative_operandUsed by:
arm_jump_table_candidate_start,block_heuristic,block_limit,branch_to_calculated_pc_rel_addr,composite_data_access,data_block_candidate,def_used_for_address,indefinite_litpool_ref,indexed_pc_relative_load,indexed_pc_relative_load_relative,litpool_confidence,litpool_ref,straight_line_last_def,symbol_minus_symbol_litpool_access_pattern,symbolic_operand_candidate,value_reg
- instruction_at(EA:address, Instruction:address)
Maps instruction identifier address to the instruction’s real memory address.
While this is a simple one-to-one mapping on most architectures, Thumb instructions on ARM are offset by 1 byte. This relation makes it easier to write portable rules.
Maps all instructions in the instruction input relation, regardless of invalid(), etc.
Uses:
instructionUsed by:
arm_jump_table_candidate,arm_jump_table_data_block_limit,arm_jump_table_skip_first_entry,basic_target,block_candidate_boundaries,block_information,block_limit,branch_to_calculated_pc_rel_addr,data_block_limit,invalid,invalid_jump_table_candidate,known_block,negative_block_heuristic,padding_block_limit
- alignment_required(EA:address, AlignInBits:unsigned)
Instruction at EA requires alignment on the referenced memory.
- register_size_bytes(Reg:input_reg, Size:unsigned)
The size of a register, in bytes.
- loop_prefix(Prefix:symbol)
Used by:
instruction_has_loop_prefix
- pointer_size(N:unsigned)
WARNING: Predicate not present in compiled Datalog program (Dead Code)