1 /* Copyright (C) 2021-2024 Free Software Foundation, Inc.
4 This file is part of GNU Binutils.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
27 #include "DbeSession.h"
28 #include "Application.h"
29 #include "DataObject.h"
33 DataObject::DataObject ()
38 _unannotated_name
= NULL
;
42 EAs
= new Vector
<DbeEA
*>;
44 offset
= (uint64_t) (-1);
47 DataObject::~DataObject ()
49 free (_unannotated_name
);
56 // get_addr() doesn't return an actual address for a DataObject
57 // but rather synthesises an address-like identifier tuple.
58 // XXXX since an aggregate and its first element have identical tuples
59 // may need to arrange for special-purpose sorting "by address"
61 DataObject::get_addr ()
64 if (parent
&& parent
->get_typename ())
65 addr
= MAKE_ADDRESS (parent
->id
, offset
); // element
67 addr
= MAKE_ADDRESS (parent
->id
, id
) | 0x8000000000000000ULL
; // Scalar, Unknown
68 else if (id
== dbeSession
->get_Scalars_DataObject ()->id
)
69 addr
= MAKE_ADDRESS (id
, 0) | 0x8000000000000000ULL
; // Scalar aggregate
70 else if (id
== dbeSession
->get_Unknown_DataObject ()->id
)
71 addr
= MAKE_ADDRESS (id
, 0) | 0x8000000000000000ULL
; // Unknown aggregate
73 addr
= MAKE_ADDRESS (id
, 0); // aggregate
78 DataObject::convertto (Histable_type type
, Histable
*)
80 return type
== DOBJECT
? this : NULL
;
84 DataObject::get_offset_mark ()
91 if (size
== 0 || offset
== -1)
92 return '?'; // undefined
94 return '#'; // requires multiple blocks
95 if (size
== blocksize
&& (offset
% blocksize
== 0))
96 return '<'; // fits block entirely
97 if (offset
% blocksize
== 0)
98 return '/'; // starts block
99 if ((offset
+ size
) % blocksize
== 0)
100 return '\\'; // closes block
101 if (offset
/ blocksize
== ((offset
+ size
) / blocksize
))
102 return '|'; // inside block
103 return 'X'; // crosses blocks unnecessarily
107 DataObject::get_offset_name ()
110 if (parent
&& parent
->get_typename ()) // element
111 offset_name
= dbe_sprintf (GTXT ("%c%+6lld .{%s %s}"),
112 get_offset_mark (), (long long) offset
,
113 _typename
? _typename
: GTXT ("NO_TYPE"),
114 _instname
? _instname
: GTXT ("-")); // "NO_NAME"
115 else if ((offset
!= -1) && (offset
> 0)) // filler
116 offset_name
= dbe_sprintf (GTXT ("%c%+6lld %s"), get_offset_mark (),
117 (long long) offset
, get_name ());
118 else if (parent
) // Scalar/Unknown element
119 offset_name
= dbe_sprintf (GTXT (" .%s"), get_unannotated_name ());
121 offset_name
= dbe_strdup (get_name ());
126 DataObject::set_dobjname (char *type_name
, char *inst_name
)
128 _unannotated_name
= _typename
= _instname
= NULL
;
130 _instname
= dbe_strdup (inst_name
);
133 if (parent
== dbeSession
->get_Scalars_DataObject ())
136 _typename
= dbe_strdup (type_name
);
137 _unannotated_name
= dbe_sprintf (NTXT ("{%s %s}"), type_name
,
138 inst_name
? inst_name
: NTXT ("-"));
139 buf
= dbe_sprintf (NTXT ("%s.%s"), parent
->get_name (), _unannotated_name
);
141 else if (parent
== dbeSession
->get_Unknown_DataObject ())
143 _unannotated_name
= dbe_strdup (type_name
);
144 buf
= dbe_sprintf (NTXT ("%s.%s"), parent
->get_name (), _unannotated_name
);
149 _typename
= dbe_strdup (type_name
);
150 if (parent
&& parent
->get_typename ())
151 buf
= dbe_sprintf (NTXT ("%s.{%s %s}"),
152 parent
->get_name () ? parent
->get_name () : NTXT ("ORPHAN"),
153 type_name
? type_name
: NTXT ("NO_TYPE"),
154 inst_name
? inst_name
: NTXT ("-")); // "NO_NAME"
156 buf
= dbe_sprintf (NTXT ("{%s %s}"),
157 type_name
? type_name
: NTXT ("NO_TYPE"),
158 inst_name
? inst_name
: NTXT ("-")); // "NO_NAME"
161 dbeSession
->dobj_updateHT (this);
165 DataObject::set_name (char *string
)
167 name
= dbe_strdup (string
);
168 dbeSession
->dobj_updateHT (this);
172 DataObject::find_dbeEA (Vaddr EA
)
176 int right
= EAs
->size () - 1;
177 while (left
<= right
)
179 int index
= (left
+ right
) / 2;
180 dbeEA
= EAs
->fetch (index
);
181 if (EA
< dbeEA
->eaddr
)
183 else if (EA
> dbeEA
->eaddr
)
189 // None found, create a new one
190 dbeEA
= new DbeEA (this, EA
);
191 EAs
->insert (left
, dbeEA
);