Retro68/binutils/gprofng/src/LoadObject.h
Wolfgang Thaller f485e125c4 binutils 2.39
2022-10-27 20:45:45 +02:00

211 lines
5.8 KiB
C++

/* Copyright (C) 2021 Free Software Foundation, Inc.
Contributed by Oracle.
This file is part of GNU Binutils.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, 51 Franklin Street - Fifth Floor, Boston,
MA 02110-1301, USA. */
#ifndef _LOADOBJECT_H
#define _LOADOBJECT_H
// A Segment object represents a segment of the program text.
#include "Histable.h"
#include "Stabs.h"
#include "DbeLock.h"
#define JAVA_COMPILED_METHODS "JAVA_COMPILED_METHODS"
#define DYNFUNC_SEGMENT "DYNAMIC_FUNCTIONS"
#define SEG_FLAG_DYNAMIC 0x01
#define SEG_FLAG_JVM 0x02
#define SEG_FLAG_OMP 0x04
#define SEG_FLAG_EXE 0x08
#define SEG_FLAG_REORDER 0x10
/* Hash name for all comparable executions */
#define COMP_EXE_NAME "<COMP_EXE_NAME>"
class Emsg;
class Elf;
class Experiment;
class Function;
class Module;
template <typename Key_t, typename Value_t> class HashMap;
template <typename Key_t, typename Value_t> class Map;
template <class ITEM> class Vector;
enum
{
CMP_PATH = 1,
CMP_RUNTIMEPATH = 2,
CMP_CHKSUM = 4
};
class LoadObject : public HistableFile, public DbeLock
{
public:
// The various segments types.
enum seg_type
{
SEG_TEXT,
SEG_DATA,
SEG_BSS,
SEG_HEAP,
SEG_STACK,
SEG_DEVICE,
SEG_UNKNOWN
};
// These codes are stored in *.archive files
enum Arch_status
{
ARCHIVE_SUCCESS,
ARCHIVE_EXIST,
ARCHIVE_BAD_STABS,
ARCHIVE_ERR_SEG,
ARCHIVE_ERR_OPEN,
ARCHIVE_ERR_MAP,
ARCHIVE_WARN_MTIME,
ARCHIVE_WARN_HOST,
ARCHIVE_ERR_VERSION,
ARCHIVE_NO_STABS,
ARCHIVE_WRONG_ARCH,
ARCHIVE_NO_LIBDWARF,
ARCHIVE_NO_DWARF,
ARCHIVE_WARN_CHECKSUM
};
LoadObject (const char *loname);
static LoadObject *create_item (const char *nm, int64_t chksum);
static LoadObject *create_item (const char *nm, const char *_runTimePath, DbeFile *df);
virtual ~LoadObject ();
virtual void set_name (char *string);
virtual uint64_t get_addr ();
virtual Vector<Histable*> *get_comparable_objs ();
virtual Histable_type
get_type ()
{
return LOADOBJECT;
};
virtual int64_t
get_size ()
{
return size;
}
char *
get_pathname ()
{
return pathname;
}
void
set_archname (char *aname)
{
free (arch_name);
arch_name = aname;
}
bool
is_relocatable ()
{
return isRelocatable;
}
bool compare (const char *nm, int64_t _checksum);
int compare (const char *_path, const char *_runTimePath, DbeFile *df);
void set_platform (Platform_t pltf, int wsz);
void dump_functions (FILE *);
int get_index (Function *func);
char *get_alias (Function *func);
DbeInstr *find_dbeinstr (uint64_t file_off);
Function *find_function (uint64_t offset);
Function *find_function (char *fname);
Function *find_function (char *fname, unsigned int chksum);
Module *find_module (char *mname);
Module *get_comparable_Module (Module *mod);
void append_module (Module *mod);
Elf *get_elf ();
Stabs *openDebugInfo (char *fname, Stabs::Stab_status *stp = NULL);
Arch_status read_stabs ();
Arch_status sync_read_stabs ();
void post_process_functions ();
char *status_str (Arch_status rv, char *arg = NULL);
Function *get_hide_function ();
DbeInstr *get_hide_instr (DbeInstr *instr);
uint32_t get_checksum ();
Emsg *
fetch_warnings (void) // fetch the queue of warning messages
{
return warnq->fetch ();
}
Emsg *
fetch_comments (void) // fetch the queue of comment messages
{
return commentq->fetch ();
}
unsigned int flags; // SEG_FLAG_*
bool isReadStabs;
bool need_swap_endian;
int seg_idx; // for compatibility (ADDRESS)
seg_type type;
int64_t size; // size of loadobject in bytes
int64_t max_size; // Maximum size of loadobject in bytes
int64_t min_size; // Min size of loadobject in bytes.
Vector<Function*> *functions; // Ordered list of functions
Vector<Module*> *seg_modules; // list of modules
HashMap<char*, Module*> *modules;
Module *noname; // Module pointer to unknown name
Platform_t platform; // Sparc, Sparcv9, Intel
WSize_t wsize; // word size: 32,64
Stabs *objStabs;
HashMap<char*, Function*> *comp_funcs; // list of comparable functions
Experiment *firstExp;
char *runTimePath;
time_t mtime; // file timestamp (in seconds)
int64_t checksum; // file checksum
private:
Elf *elf_lo;
bool elf_inited;
DbeInstr **instHTable; // hash table for DbeInstr
char *pathname; // User name of object file
ino64_t inode; // inode number of segment file
bool isRelocatable; // is relocatable .o
char *arch_name; // .archive name
Emsgqueue *warnq;
Emsgqueue *commentq;
Function **funcHTable; // hash table for functions
Function *h_function; // hide pseudo function
DbeInstr *h_instr; // hide pseudo instr
HashMap<char*, Module*> *seg_modules_map; // to find a comparable module
static int func_compare (const void *p1, const void *p2);
int read_archive ();
void init_datatypes ();
void update_datatypes (Module*, Vaddr, uint32_t datatype_id);
};
#endif /* _LOADOBJECT_H */