|
Packit |
400c17 |
/*
|
|
Packit |
400c17 |
Copyright(C) 2016, Red Hat, Inc., Jerome Marchand
|
|
Packit |
400c17 |
|
|
Packit |
400c17 |
This program is free software: you can redistribute it and/or modify
|
|
Packit |
400c17 |
it under the terms of the GNU General Public License as published by
|
|
Packit |
400c17 |
the Free Software Foundation, either version 3 of the License, or
|
|
Packit |
400c17 |
(at your option) any later version.
|
|
Packit |
400c17 |
|
|
Packit |
400c17 |
This program is distributed in the hope that it will be useful,
|
|
Packit |
400c17 |
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
400c17 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
400c17 |
GNU General Public License for more details.
|
|
Packit |
400c17 |
|
|
Packit |
400c17 |
You should have received a copy of the GNU General Public License
|
|
Packit |
400c17 |
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
Packit |
400c17 |
*/
|
|
Packit |
400c17 |
|
|
Packit |
400c17 |
/*
|
|
Packit |
400c17 |
* Internal representation of symbols
|
|
Packit |
400c17 |
*/
|
|
Packit |
400c17 |
|
|
Packit |
400c17 |
#ifndef _OBJECTS_H
|
|
Packit |
400c17 |
#define _OBJECTS_H
|
|
Packit |
400c17 |
|
|
Packit |
400c17 |
#include <stdbool.h>
|
|
Packit |
400c17 |
#include <stdio.h>
|
|
Packit |
400c17 |
|
|
Packit |
400c17 |
#include "list.h"
|
|
Packit |
400c17 |
|
|
Packit |
400c17 |
#ifdef DEBUG
|
|
Packit |
400c17 |
#define debug(args...) do { printf(args); } while (0)
|
|
Packit |
400c17 |
#else
|
|
Packit |
400c17 |
#define debug(args...)
|
|
Packit |
400c17 |
#endif
|
|
Packit |
400c17 |
|
|
Packit |
400c17 |
#define MERGE_DECL true
|
|
Packit |
400c17 |
#define NO_MERGE_DECL false
|
|
Packit |
400c17 |
|
|
Packit |
400c17 |
typedef enum {
|
|
Packit |
400c17 |
__type_reffile,
|
|
Packit |
400c17 |
__type_struct,
|
|
Packit |
400c17 |
__type_union,
|
|
Packit |
400c17 |
__type_enum,
|
|
Packit |
400c17 |
__type_func,
|
|
Packit |
400c17 |
__type_ptr,
|
|
Packit |
400c17 |
__type_typedef,
|
|
Packit |
400c17 |
__type_array,
|
|
Packit |
400c17 |
__type_var, /* a variable, member of an union or a function argument */
|
|
Packit |
400c17 |
__type_struct_member,
|
|
Packit |
400c17 |
__type_qualifier, /* a type qualifier such as "const" or "volatile" */
|
|
Packit |
400c17 |
__type_base,
|
|
Packit |
400c17 |
__type_constant, /* An element of an enumeration */
|
|
Packit |
400c17 |
__type_assembly,
|
|
Packit |
400c17 |
__type_weak,
|
|
Packit |
400c17 |
NR_OBJ_TYPES
|
|
Packit |
400c17 |
} obj_types;
|
|
Packit |
400c17 |
|
|
Packit |
400c17 |
struct obj;
|
|
Packit |
400c17 |
typedef struct obj_list {
|
|
Packit |
400c17 |
struct obj *member;
|
|
Packit |
400c17 |
struct obj_list *next;
|
|
Packit |
400c17 |
} obj_list_t;
|
|
Packit |
400c17 |
|
|
Packit |
400c17 |
typedef struct obj_list_head {
|
|
Packit |
400c17 |
obj_list_t *first, *last;
|
|
Packit |
400c17 |
struct obj *object;
|
|
Packit |
400c17 |
} obj_list_head_t;
|
|
Packit |
400c17 |
|
|
Packit |
400c17 |
/*
|
|
Packit |
400c17 |
* Structure representing symbols. Several field are overloaded.
|
|
Packit |
400c17 |
*
|
|
Packit |
400c17 |
* type: type of the symbol (such as struct, function, pointer, base
|
|
Packit |
400c17 |
* type...)
|
|
Packit |
400c17 |
* name: name of the symbol
|
|
Packit |
400c17 |
* base_type: (base type) the type of the symbol,
|
|
Packit |
400c17 |
* (qualifier) the type qualifier (const or volatile)
|
|
Packit |
400c17 |
* (reffile) path to the file
|
|
Packit |
400c17 |
* alignment: value of DW_AT_alignment attribute or 0 if not present
|
|
Packit |
400c17 |
* member_list: (struct, union, enum) list of members
|
|
Packit |
400c17 |
* (function) list of arguments
|
|
Packit |
400c17 |
* ptr: (pointer) object pointed to
|
|
Packit |
400c17 |
* (typedef) defined type
|
|
Packit |
400c17 |
* (function) return type
|
|
Packit |
400c17 |
* (var) type
|
|
Packit |
400c17 |
* constant: (constant) constant value of an enumeration
|
|
Packit |
400c17 |
* index: (array) index of array
|
|
Packit |
400c17 |
* link: (weak) weak alias link
|
|
Packit |
400c17 |
* offset: (var) offset of a struct member
|
|
Packit |
400c17 |
* is_bitfield: (var) It's a bitfield
|
|
Packit |
400c17 |
* first_bit, last_bit: (var) bit range within the offset.
|
|
Packit |
400c17 |
* depend_rec_node: (reffile) node from dependents field of record where
|
|
Packit |
400c17 |
* this obj references.
|
|
Packit |
400c17 |
*
|
|
Packit |
400c17 |
* Note the dual parent/child relationship with the n-ary member_list and the
|
|
Packit |
400c17 |
* the unary ptr. Only functions uses both.
|
|
Packit |
400c17 |
*/
|
|
Packit |
400c17 |
typedef struct obj {
|
|
Packit |
400c17 |
obj_types type;
|
|
Packit |
400c17 |
char *name;
|
|
Packit |
400c17 |
char *base_type;
|
|
Packit |
400c17 |
unsigned alignment;
|
|
Packit |
400c17 |
obj_list_head_t *member_list;
|
|
Packit |
400c17 |
struct obj *ptr, *parent;
|
|
Packit |
400c17 |
union {
|
|
Packit |
400c17 |
unsigned long constant;
|
|
Packit |
400c17 |
unsigned long index;
|
|
Packit |
400c17 |
char *link;
|
|
Packit |
400c17 |
struct {
|
|
Packit |
400c17 |
unsigned long offset;
|
|
Packit |
400c17 |
unsigned char is_bitfield, first_bit, last_bit;
|
|
Packit |
400c17 |
};
|
|
Packit |
400c17 |
struct list_node *depend_rec_node;
|
|
Packit |
400c17 |
};
|
|
Packit |
400c17 |
} obj_t;
|
|
Packit |
400c17 |
|
|
Packit |
400c17 |
static inline bool has_offset(obj_t *o)
|
|
Packit |
400c17 |
{
|
|
Packit |
400c17 |
return o->type == __type_struct_member;
|
|
Packit |
400c17 |
}
|
|
Packit |
400c17 |
|
|
Packit |
400c17 |
static inline bool has_constant(obj_t *o)
|
|
Packit |
400c17 |
{
|
|
Packit |
400c17 |
return o->type == __type_constant;
|
|
Packit |
400c17 |
}
|
|
Packit |
400c17 |
|
|
Packit |
400c17 |
static inline bool has_index(obj_t *o)
|
|
Packit |
400c17 |
{
|
|
Packit |
400c17 |
return o->type == __type_array;
|
|
Packit |
400c17 |
}
|
|
Packit |
400c17 |
|
|
Packit |
400c17 |
static inline bool is_bitfield(obj_t *o)
|
|
Packit |
400c17 |
{
|
|
Packit |
400c17 |
return o->is_bitfield != 0;
|
|
Packit |
400c17 |
}
|
|
Packit |
400c17 |
|
|
Packit |
400c17 |
static inline bool is_terminal(obj_t *o)
|
|
Packit |
400c17 |
{
|
|
Packit |
400c17 |
switch (o->type) {
|
|
Packit |
400c17 |
case __type_reffile:
|
|
Packit |
400c17 |
case __type_base:
|
|
Packit |
400c17 |
case __type_constant:
|
|
Packit |
400c17 |
return true;
|
|
Packit |
400c17 |
default:
|
|
Packit |
400c17 |
return false;
|
|
Packit |
400c17 |
}
|
|
Packit |
400c17 |
}
|
|
Packit |
400c17 |
|
|
Packit |
400c17 |
static inline bool is_unary(obj_t *o)
|
|
Packit |
400c17 |
{
|
|
Packit |
400c17 |
switch (o->type) {
|
|
Packit |
400c17 |
case __type_ptr:
|
|
Packit |
400c17 |
case __type_typedef:
|
|
Packit |
400c17 |
case __type_array:
|
|
Packit |
400c17 |
case __type_var:
|
|
Packit |
400c17 |
case __type_struct_member:
|
|
Packit |
400c17 |
case __type_qualifier:
|
|
Packit |
400c17 |
return true;
|
|
Packit |
400c17 |
default:
|
|
Packit |
400c17 |
return false;
|
|
Packit |
400c17 |
}
|
|
Packit |
400c17 |
}
|
|
Packit |
400c17 |
|
|
Packit |
400c17 |
static inline bool is_n_ary(obj_t *o)
|
|
Packit |
400c17 |
{
|
|
Packit |
400c17 |
switch (o->type) {
|
|
Packit |
400c17 |
case __type_struct:
|
|
Packit |
400c17 |
case __type_union:
|
|
Packit |
400c17 |
case __type_enum:
|
|
Packit |
400c17 |
case __type_func:
|
|
Packit |
400c17 |
return true;
|
|
Packit |
400c17 |
default:
|
|
Packit |
400c17 |
return false;
|
|
Packit |
400c17 |
}
|
|
Packit |
400c17 |
}
|
|
Packit |
400c17 |
|
|
Packit |
400c17 |
static inline bool is_weak(obj_t *o)
|
|
Packit |
400c17 |
{
|
|
Packit |
400c17 |
return o->type == __type_weak;
|
|
Packit |
400c17 |
}
|
|
Packit |
400c17 |
|
|
Packit |
400c17 |
/*
|
|
Packit |
400c17 |
* Display options
|
|
Packit |
400c17 |
*
|
|
Packit |
400c17 |
* Used for show and compare commands.
|
|
Packit |
400c17 |
*/
|
|
Packit |
400c17 |
struct dopt {
|
|
Packit |
400c17 |
int no_offset; /* Don't display struct offset */
|
|
Packit |
400c17 |
};
|
|
Packit |
400c17 |
extern struct dopt display_options;
|
|
Packit |
400c17 |
|
|
Packit |
400c17 |
/* Return values for tree walk callbacks */
|
|
Packit |
400c17 |
typedef enum {
|
|
Packit |
400c17 |
CB_CONT = 0, /* Continue tree walk */
|
|
Packit |
400c17 |
CB_SKIP, /* Skip the children of this node */
|
|
Packit |
400c17 |
CB_FAIL, /* Failed: stop the walk */
|
|
Packit |
400c17 |
} cb_ret_t;
|
|
Packit |
400c17 |
|
|
Packit |
400c17 |
typedef int cb_t(obj_t *o, void *args);
|
|
Packit |
400c17 |
|
|
Packit |
400c17 |
obj_list_t *obj_list_new(obj_t *obj);
|
|
Packit |
400c17 |
obj_list_head_t *obj_list_head_new(obj_t *obj);
|
|
Packit |
400c17 |
void obj_list_add(obj_list_head_t *head, obj_t *obj);
|
|
Packit |
400c17 |
void obj_free(obj_t *o);
|
|
Packit |
400c17 |
|
|
Packit |
400c17 |
obj_t *obj_struct_new(char *name);
|
|
Packit |
400c17 |
obj_t *obj_union_new(char *name);
|
|
Packit |
400c17 |
obj_t *obj_enum_new(char *name);
|
|
Packit |
400c17 |
obj_t *obj_constant_new(char *name);
|
|
Packit |
400c17 |
obj_t *obj_reffile_new();
|
|
Packit |
400c17 |
obj_t *obj_func_new_add(char *name, obj_t *obj);
|
|
Packit |
400c17 |
obj_t *obj_typedef_new_add(char *name, obj_t *obj);
|
|
Packit |
400c17 |
obj_t *obj_var_new_add(char *name, obj_t *obj);
|
|
Packit |
400c17 |
obj_t *obj_struct_member_new_add(char *name, obj_t *obj);
|
|
Packit |
400c17 |
obj_t *obj_ptr_new_add(obj_t *obj);
|
|
Packit |
400c17 |
obj_t *obj_array_new_add(obj_t *obj);
|
|
Packit |
400c17 |
obj_t *obj_qualifier_new_add(obj_t *obj);
|
|
Packit |
400c17 |
obj_t *obj_assembly_new(char *name);
|
|
Packit |
400c17 |
obj_t *obj_weak_new(char *name);
|
|
Packit |
400c17 |
|
|
Packit |
400c17 |
obj_t *obj_basetype_new(char *base_type);
|
|
Packit |
400c17 |
|
|
Packit |
400c17 |
void obj_print_tree(obj_t *root);
|
|
Packit |
400c17 |
void obj_print_tree__prefix(obj_t *root, const char *prefix, FILE *stream);
|
|
Packit |
400c17 |
int obj_debug_tree(obj_t *root);
|
|
Packit |
400c17 |
void obj_fill_parent(obj_t *root);
|
|
Packit |
400c17 |
int obj_walk_tree(obj_t *root, cb_t cb, void *args);
|
|
Packit |
400c17 |
int obj_walk_tree3(obj_t *o, cb_t cb_pre, cb_t cb_in, cb_t cb_post,
|
|
Packit |
400c17 |
void *args, bool ptr_first);
|
|
Packit |
400c17 |
|
|
Packit |
400c17 |
int obj_hide_kabi(obj_t *root, bool show_new_field);
|
|
Packit |
400c17 |
|
|
Packit |
400c17 |
obj_t *obj_parse(FILE *file, char *fn);
|
|
Packit |
400c17 |
obj_t *obj_merge(obj_t *o1, obj_t *o2, bool merge_decl);
|
|
Packit |
400c17 |
void obj_dump(obj_t *o, FILE *f);
|
|
Packit |
400c17 |
|
|
Packit |
400c17 |
#endif
|