Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'agent/tcf/services/dwarfcache.h')
-rw-r--r--agent/tcf/services/dwarfcache.h273
1 files changed, 273 insertions, 0 deletions
diff --git a/agent/tcf/services/dwarfcache.h b/agent/tcf/services/dwarfcache.h
new file mode 100644
index 00000000..93bec126
--- /dev/null
+++ b/agent/tcf/services/dwarfcache.h
@@ -0,0 +1,273 @@
+/*******************************************************************************
+ * 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 */

Back to the top