blob: 93bec12647a9a835fb241a3acff88df841367552 [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.
* You may elect to redistribute this code under either of these licenses.
*
* 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 && ENABLE_DebugContext
#include <services/tcf_elf.h>
#include <services/dwarfio.h>
#include <framework/errors.h>
typedef struct FileInfo FileInfo;
typedef struct ObjectInfo ObjectInfo;
typedef struct PubNamesInfo PubNamesInfo;
typedef struct PubNamesTable PubNamesTable;
typedef struct ObjectArray ObjectArray;
typedef struct SymbolInfo SymbolInfo;
typedef struct PropertyValuePiece PropertyValuePiece;
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;
FileInfo * mNextInHash;
CompUnit * mCompUnit;
};
#define TAG_fund_type 0x2000
#define TAG_index_range 0x2001
#define TAG_mod_pointer 0x2002
#define TAG_mod_reference 0x2003
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;
CompUnit * mCompUnit;
ObjectInfo * mType;
char * mName;
union {
U2_T mFundType;
struct {
ContextAddress mLowPC;
ContextAddress mHighPC;
} mAddr;
struct {
U2_T mFmt;
union {
I8_T mValue;
struct {
U1_T * mAddr;
size_t mSize;
} mExpr;
} mLow;
union {
I8_T mValue;
struct {
U1_T * mAddr;
size_t mSize;
} mExpr;
} mHigh;
} mRange;
} u;
};
#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 PropertyValuePiece {
int mBigEndian;
ContextAddress mAddress;
RegisterDefinition * mRegister;
U4_T mBitOffset;
U4_T mBitSize;
};
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;
PropertyValuePiece * mPieces;
U4_T mPieceCnt;
};
#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;
U2_T mLanguage;
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;
U1_T mLineInfoLoaded;
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 * mDebugLineV1;
ELF_Section * mDebugLine;
ELF_Section * mDebugLoc;
ELF_Section * mDebugRanges;
ELF_Section * mDebugFrame;
ELF_Section * mEHFrame;
ObjectInfo ** mObjectHash;
unsigned mObjectHashSize;
ObjectArray * mObjectList;
unsigned mObjectArrayPos;
UnitAddressRange * mAddrRanges;
unsigned mAddrRangesCnt;
unsigned mAddrRangesMax;
PubNamesTable mPubNames;
PubNamesTable mPubTypes;
FrameInfoRange * mFrameInfoRanges;
unsigned mFrameInfoRangesCnt;
unsigned mFrameInfoRangesMax;
unsigned mFileInfoHashSize;
FileInfo ** mFileInfoHash;
};
/* 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 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' (inclusive). */
extern UnitAddressRange * find_comp_unit_addr_range(DWARFCache * cache, ContextAddress addr_min, ContextAddress addr_max);
/*
* 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);
/*
* Search and return first compilation unit address range in given run-time address range 'addr_min'..'addr_max' (inclusive).
* If 'range_rt_addr' not NULL, *range_rt_addr is assigned run-time address of the range.
*/
extern struct UnitAddressRange * elf_find_unit(Context * ctx, ContextAddress addr_min, ContextAddress addr_max, ContextAddress * range_rt_addr);
#endif /* ENABLE_ELF && ENABLE_DebugContext */
#endif /* D_dwarfcache */