Blame objects.h

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