Blame objects.h

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