blob: 98ff521b4fea2f0172cf34be2fc22c6d624d2291 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2010 Wind River Systems, Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Eclipse Distribution License v1.0 which accompany this distribution.
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Wind River Systems - initial API and implementation
*******************************************************************************/
/*
* This module implements caching of DWARF debug information.
*
* Cached data stays in memory at least until end of the current event dispatch cycle.
* To lock data for longer period of time clients can use ELF_File.ref_cnt.
*
* Functions in this module use exceptions to report errors, see exceptions.h
*/
#ifndef D_dwarfcache
#define D_dwarfcache
#include <config.h>
#if ENABLE_ELF
#include <services/tcf_elf.h>
#include <services/dwarfio.h>
#include <framework/errors.h>
typedef struct FileInfo FileInfo;
typedef struct LocationInfo LocationInfo;
typedef struct ObjectInfo ObjectInfo;
typedef struct PubNamesInfo PubNamesInfo;
typedef struct PubNamesTable PubNamesTable;
typedef struct ObjectArray ObjectArray;
typedef struct SymbolInfo SymbolInfo;
typedef struct PropertyValue PropertyValue;
typedef struct LineNumbersState LineNumbersState;
typedef struct CompUnit CompUnit;
typedef struct SymbolSection SymbolSection;
typedef struct UnitAddressRange UnitAddressRange;
typedef struct FrameInfoRange FrameInfoRange;
typedef struct DWARFCache DWARFCache;
struct FileInfo {
char * mName;
char * mDir;
U4_T mModTime;
U4_T mSize;
unsigned mNameHash;
};
#define SYM_HASH_SIZE (32 * MEM_USAGE_FACTOR - 1)
struct SymbolSection {
ELF_File * mFile;
unsigned mIndex;
char * mStrPool;
size_t mStrPoolSize;
unsigned mSymCount;
ElfX_Sym * mSymPool; /* pointer to ELF section data: array of Elf32_Sym or Elf64_Sym */
size_t mSymPoolSize;
unsigned * mSymNamesHash;
unsigned * mSymNamesNext;
};
struct SymbolInfo {
SymbolSection * mSymSection;
U4_T mSectionIndex;
ELF_Section * mSection;
char * mName;
U1_T mBind;
U1_T mType;
U8_T mValue;
U8_T mSize;
};
#define TAG_fund_type 0x2000
struct ObjectInfo {
ObjectInfo * mHashNext;
ObjectInfo * mSibling;
ObjectInfo * mChildren;
ObjectInfo * mParent;
U8_T mID; /* Link-time debug information entry address: address of .debug_info section + offset in the section */
U2_T mTag;
U2_T mFundType;
ObjectInfo * mType;
CompUnit * mCompUnit;
char * mName;
};
#define OBJECT_ARRAY_SIZE 128
struct ObjectArray {
ObjectArray * mNext;
ObjectInfo mArray[OBJECT_ARRAY_SIZE];
};
struct PubNamesInfo {
unsigned mNext;
U8_T mID;
};
struct PubNamesTable {
unsigned * mHash;
PubNamesInfo * mNext;
unsigned mCnt;
unsigned mMax;
};
struct PropertyValue {
Context * mContext;
int mFrame;
ObjectInfo * mObject;
U2_T mAttr;
U2_T mForm;
U8_T mValue;
U1_T * mAddr;
size_t mSize;
int mBigEndian;
RegisterDefinition * mRegister;
};
#define LINE_IsStmt 0x01
#define LINE_BasicBlock 0x02
#define LINE_PrologueEnd 0x04
#define LINE_EpilogueBegin 0x08
#define LINE_EndSequence 0x10
struct LineNumbersState {
ContextAddress mAddress;
char * mFileName;
U4_T mNext;
U4_T mFile;
U4_T mLine;
U2_T mColumn;
U1_T mFlags;
U1_T mISA;
};
struct CompUnit {
ObjectInfo * mObject;
ELF_File * mFile;
ELF_Section * mTextSection;
ContextAddress mLowPC;
ContextAddress mHighPC;
DIO_UnitDescriptor mDesc;
RegisterIdScope mRegIdScope;
U8_T mDebugRangesOffs;
U8_T mLineInfoOffs;
char * mDir;
U4_T mFilesCnt;
U4_T mFilesMax;
FileInfo * mFiles;
U4_T mDirsCnt;
U4_T mDirsMax;
char ** mDirs;
U4_T mStatesCnt;
U4_T mStatesMax;
LineNumbersState * mStates;
LineNumbersState ** mStatesIndex;
CompUnit * mBaseTypes;
U1_T mARangesFound;
};
/* Address range of a compilation unit. A unit can occupy multiple address ranges. */
struct UnitAddressRange {
CompUnit * mUnit; /* Compilation unit */
ELF_Section * mSection; /* ELF file secdtion that contains the range */
ContextAddress mAddr; /* Link-time start address of the range */
ContextAddress mSize; /* Size of the range */
};
struct FrameInfoRange {
ContextAddress mAddr;
ContextAddress mSize;
U8_T mOffset;
};
#define DWARF_CACHE_MAGIC 0x34625490
struct DWARFCache {
int magic;
ELF_File * mFile;
ErrorReport * mErrorReport;
ObjectInfo * mCompUnits;
ELF_Section * mDebugLine;
ELF_Section * mDebugLoc;
ELF_Section * mDebugRanges;
ELF_Section * mDebugFrame;
ELF_Section * mEHFrame;
SymbolSection ** mSymSections;
unsigned mSymSectionsCnt;
unsigned mSymSectionsMax;
ObjectInfo ** mObjectHash;
unsigned mObjectHashSize;
ObjectArray * mObjectList;
unsigned mObjectArrayPos;
UnitAddressRange * mAddrRanges;
unsigned mAddrRangesCnt;
unsigned mAddrRangesMax;
PubNamesTable mPubNames;
PubNamesTable mPubTypes;
FrameInfoRange * mFrameInfoRanges;
unsigned mFrameInfoRangesCnt;
unsigned mFrameInfoRangesMax;
};
/* Return DWARF cache for given file, create and populate the cache if needed, throw an exception if error */
extern DWARFCache * get_dwarf_cache(ELF_File * file);
/* Return symbol name hash. The hash is used to build mSymNamesHash table. */
extern unsigned calc_symbol_name_hash(const char * s);
/* Compare symbol names. */
extern int cmp_symbol_names(const char * x, const char * y);
/* Return file name hash. The hash is used to search FileInfo. */
extern unsigned calc_file_name_hash(const char * s);
/* Load line number information for given compilation unit, throw an exception if error */
extern void load_line_numbers(CompUnit * unit);
/* Find ObjectInfo by ID */
extern ObjectInfo * find_object(DWARFCache * cache, U8_T ID);
/* Search and return first compilation unit address range in given link-time address range 'addr_min'..'addr_max'. */
extern UnitAddressRange * find_comp_unit_addr_range(DWARFCache * cache, ContextAddress addr_min, ContextAddress addr_max);
/* Get SymbolInfo */
extern void unpack_elf_symbol_info(SymbolSection * section, U4_T index, SymbolInfo * info);
/*
* Read and evaluate a property of a DWARF object, perform ELF relocations if any.
* FORM_ADDR values are mapped to run-time address space.
*/
extern void read_and_evaluate_dwarf_object_property(Context * ctx, int frame, U8_T base, ObjectInfo * obj, U2_T attr_tag, PropertyValue * value);
/* Convert PropertyValue to a number */
extern U8_T get_numeric_property_value(PropertyValue * Value);
#endif /* ENABLE_ELF */
#endif /* D_dwarfcache */