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 Service 28f424
#include "utils.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 Service 28f424
struct set;
Packit Service 28f424
Packit Service 28f424
enum merge_flag {
Packit Service 28f424
	MERGE_DEFAULT = 0,
Packit Service 28f424
	MERGE_FLAG_DECL_MERGE = 1 << 0,
Packit Service 28f424
	MERGE_FLAG_VER_IGNORE = 1 << 1,
Packit Service 28f424
	MERGE_FLAG_DECL_EQ = 1 << 2,
Packit Service 28f424
};
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 Service 28f424
 * is_bitfield:	(var) It's a bitfield
Packit Service 28f424
 * first_bit, last_bit:	(var) bit range within the offset.
Packit 400c17
 * name:	name of the symbol
Packit Service 28f424
 * ref_record:	(reffile) pointer to the referenced record (only while
Packit Service 28f424
 *              generating records, otherwise base_type with string is used)
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
 * 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 Service 28f424
	unsigned char is_bitfield, first_bit, last_bit;
Packit Service 28f424
	union {
Packit Service 28f424
		const char *name;
Packit Service 28f424
		struct record *ref_record;
Packit Service 28f424
	};
Packit Service 28f424
	const char *base_type;
Packit 400c17
	unsigned alignment;
Packit Service 28f424
	unsigned int byte_size;
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 Service 28f424
		unsigned long offset;
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 Service 28f424
obj_t *obj_merge(obj_t *o1, obj_t *o2, unsigned int flags);
Packit 400c17
void obj_dump(obj_t *o, FILE *f);
Packit 400c17
Packit Service 28f424
bool obj_eq(obj_t *o1, obj_t *o2, bool ignore_versions);
Packit Service 28f424
Packit Service 28f424
bool obj_same_declarations(obj_t *o1, obj_t *o2, struct set *processed);
Packit Service 28f424
Packit 400c17
#endif