/*
* %CopyrightBegin%
*
* Copyright Ericsson AB 1999-2017. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* %CopyrightEnd%
*/
#ifndef _BEAM_LOAD_H
# define _BEAM_LOAD_H
#include "beam_opcodes.h"
#include "erl_process.h"
Eterm beam_make_current_old(Process *c_p, ErtsProcLocks c_p_locks,
Eterm module);
typedef struct gen_op_entry {
char* name;
int arity;
int specific;
int num_specific;
int transform;
} GenOpEntry;
extern const GenOpEntry gen_opc[];
extern BeamInstr beam_debug_apply[];
extern BeamInstr* em_call_error_handler;
extern BeamInstr* em_apply_bif;
extern BeamInstr* em_call_nif;
struct ErtsLiteralArea_;
/*
* The following variables keep a sorted list of address ranges for
* each module. It allows us to quickly find a function given an
* instruction pointer.
*/
/* Total code size in bytes */
extern Uint erts_total_code_size;
typedef struct BeamCodeLineTab_ BeamCodeLineTab;
/*
* Header of code chunks which contains additional information
* about the loaded module.
*/
typedef struct beam_code_header {
/*
* Number of functions.
*/
UWord num_functions;
/*
* The attributes retrieved by Mod:module_info(attributes).
*/
byte* attr_ptr;
UWord attr_size;
UWord attr_size_on_heap;
/*
* The compilation information retrieved by Mod:module_info(compile).
*/
byte* compile_ptr;
UWord compile_size;
UWord compile_size_on_heap;
/*
* Literal area (constant pool).
*/
struct ErtsLiteralArea_ *literal_area;
/*
* Pointer to the on_load function (or NULL if none).
*/
BeamInstr* on_load_function_ptr;
/*
* Pointer to the line table (or NULL if none).
*/
BeamCodeLineTab* line_table;
/*
* Pointer to the module MD5 sum (16 bytes)
*/
byte* md5_ptr;
/*
* Start of function pointer table. This table contains pointers to
* all functions in the module plus an additional pointer just beyond
* the end of the last function.
*
* The actual loaded code (for the first function) start just beyond
* this table.
*/
ErtsCodeInfo* functions[1];
}BeamCodeHeader;
# define BEAM_NIF_MIN_FUNC_SZ 4
void erts_release_literal_area(struct ErtsLiteralArea_* literal_area);
int erts_is_module_native(BeamCodeHeader* code);
int erts_is_function_native(ErtsCodeInfo*);
void erts_beam_bif_load_init(void);
struct erl_fun_entry;
void erts_purge_state_add_fun(struct erl_fun_entry *fe);
Export *erts_suspend_process_on_pending_purge_lambda(Process *c_p,
struct erl_fun_entry*);
/*
* Layout of the line table.
*/
struct BeamCodeLineTab_ {
Eterm* fname_ptr;
int loc_size;
union {
Uint16* p2;
Uint32* p4;
}loc_tab;
const BeamInstr** func_tab[1];
};
#define LINE_INVALID_LOCATION (0)
/*
* Macros for manipulating locations.
*/
#define IS_VALID_LOCATION(File, Line) \
((unsigned) (File) < 255 && (unsigned) (Line) < ((1 << 24) - 1))
#define MAKE_LOCATION(File, Line) (((File) << 24) | (Line))
#define LOC_FILE(Loc) ((Loc) >> 24)
#define LOC_LINE(Loc) ((Loc) & ((1 << 24)-1))
/*
* MFA event debug "tracing" usage:
*
* #define ENABLE_DBG_TRACE_MFA
* call dbg_set_traced_mfa("mymod","myfunc",arity)
* for the function(s) to trace, in some init function.
*
* Run and get stderr printouts when interesting things happen to your MFA.
*/
#ifdef ENABLE_DBG_TRACE_MFA
void dbg_set_traced_mfa(const char* m, const char* f, Uint a);
int dbg_is_traced_mfa(Eterm m, Eterm f, Uint a);
void dbg_vtrace_mfa(unsigned ix, const char* format, ...);
#define DBG_TRACE_MFA(M,F,A,FMT, ...) do {\
unsigned ix;\
if ((ix=dbg_is_traced_mfa(M,F,A))) \
dbg_vtrace_mfa(ix, FMT"\n", ##__VA_ARGS__);\
}while(0)
#define DBG_TRACE_MFA_P(MFA, FMT, ...) \
DBG_TRACE_MFA((MFA)->module, (MFA)->function, (MFA)->arity, FMT, ##__VA_ARGS__)
#else
# define dbg_set_traced_mfa(M,F,A)
# define DBG_TRACE_MFA(M,F,A,FMT, ...)
# define DBG_TRACE_MFA_P(MFA,FMT, ...)
#endif /* ENABLE_DBG_TRACE_MFA */
#endif /* _BEAM_LOAD_H */