@@ -1143,7 +1143,6 @@ static int disasm_line__parse(char *line, const char **namep, char **rawp)
1143
1143
}
1144
1144
1145
1145
struct annotate_args {
1146
- size_t privsize ;
1147
1146
struct arch * arch ;
1148
1147
struct map_symbol ms ;
1149
1148
struct evsel * evsel ;
@@ -1153,83 +1152,61 @@ struct annotate_args {
1153
1152
int line_nr ;
1154
1153
};
1155
1154
1156
- static void annotation_line__delete (struct annotation_line * al )
1155
+ static void annotation_line__init (struct annotation_line * al ,
1156
+ struct annotate_args * args ,
1157
+ int nr )
1157
1158
{
1158
- void * ptr = (void * ) al - al -> privsize ;
1159
+ al -> offset = args -> offset ;
1160
+ al -> line = strdup (args -> line );
1161
+ al -> line_nr = args -> line_nr ;
1162
+ al -> data_nr = nr ;
1163
+ }
1159
1164
1165
+ static void annotation_line__exit (struct annotation_line * al )
1166
+ {
1160
1167
free_srcline (al -> path );
1161
1168
zfree (& al -> line );
1162
- free (ptr );
1163
1169
}
1164
1170
1165
- /*
1166
- * Allocating the annotation line data with following
1167
- * structure:
1168
- *
1169
- * --------------------------------------
1170
- * private space | struct annotation_line
1171
- * --------------------------------------
1172
- *
1173
- * Size of the private space is stored in 'struct annotation_line'.
1174
- *
1175
- */
1176
- static struct annotation_line *
1177
- annotation_line__new (struct annotate_args * args , size_t privsize )
1171
+ static size_t disasm_line_size (int nr )
1178
1172
{
1179
1173
struct annotation_line * al ;
1180
- struct evsel * evsel = args -> evsel ;
1181
- size_t size = privsize + sizeof (* al );
1182
- int nr = 1 ;
1183
-
1184
- if (perf_evsel__is_group_event (evsel ))
1185
- nr = evsel -> core .nr_members ;
1186
-
1187
- size += sizeof (al -> data [0 ]) * nr ;
1188
1174
1189
- al = zalloc (size );
1190
- if (al ) {
1191
- al = (void * ) al + privsize ;
1192
- al -> privsize = privsize ;
1193
- al -> offset = args -> offset ;
1194
- al -> line = strdup (args -> line );
1195
- al -> line_nr = args -> line_nr ;
1196
- al -> data_nr = nr ;
1197
- }
1198
-
1199
- return al ;
1175
+ return (sizeof (struct disasm_line ) + (sizeof (al -> data [0 ]) * nr ));
1200
1176
}
1201
1177
1202
1178
/*
1203
1179
* Allocating the disasm annotation line data with
1204
1180
* following structure:
1205
1181
*
1206
- * ------------------------------------------------------------
1207
- * privsize space | struct disasm_line | struct annotation_line
1208
- * ------------------------------------------------------------
1182
+ * -------------------------------------------
1183
+ * struct disasm_line | struct annotation_line
1184
+ * -------------------------------------------
1209
1185
*
1210
1186
* We have 'struct annotation_line' member as last member
1211
1187
* of 'struct disasm_line' to have an easy access.
1212
- *
1213
1188
*/
1214
1189
static struct disasm_line * disasm_line__new (struct annotate_args * args )
1215
1190
{
1216
1191
struct disasm_line * dl = NULL ;
1217
- struct annotation_line * al ;
1218
- size_t privsize = args -> privsize + offsetof(struct disasm_line , al );
1192
+ int nr = 1 ;
1219
1193
1220
- al = annotation_line__new (args , privsize );
1221
- if (al != NULL ) {
1222
- dl = disasm_line (al );
1194
+ if (perf_evsel__is_group_event (args -> evsel ))
1195
+ nr = args -> evsel -> core .nr_members ;
1223
1196
1224
- if (dl -> al .line == NULL )
1225
- goto out_delete ;
1197
+ dl = zalloc (disasm_line_size (nr ));
1198
+ if (!dl )
1199
+ return NULL ;
1226
1200
1227
- if ( args -> offset != -1 ) {
1228
- if (disasm_line__parse ( dl -> al .line , & dl -> ins . name , & dl -> ops . raw ) < 0 )
1229
- goto out_free_line ;
1201
+ annotation_line__init ( & dl -> al , args , nr );
1202
+ if (dl -> al .line == NULL )
1203
+ goto out_delete ;
1230
1204
1231
- disasm_line__init_ins (dl , args -> arch , & args -> ms );
1232
- }
1205
+ if (args -> offset != -1 ) {
1206
+ if (disasm_line__parse (dl -> al .line , & dl -> ins .name , & dl -> ops .raw ) < 0 )
1207
+ goto out_free_line ;
1208
+
1209
+ disasm_line__init_ins (dl , args -> arch , & args -> ms );
1233
1210
}
1234
1211
1235
1212
return dl ;
@@ -1248,7 +1225,8 @@ void disasm_line__free(struct disasm_line *dl)
1248
1225
else
1249
1226
ins__delete (& dl -> ops );
1250
1227
zfree (& dl -> ins .name );
1251
- annotation_line__delete (& dl -> al );
1228
+ annotation_line__exit (& dl -> al );
1229
+ free (dl );
1252
1230
}
1253
1231
1254
1232
int disasm_line__scnprintf (struct disasm_line * dl , char * bf , size_t size , bool raw , int max_ins_name )
@@ -2152,11 +2130,9 @@ void symbol__calc_percent(struct symbol *sym, struct evsel *evsel)
2152
2130
int symbol__annotate (struct map_symbol * ms , struct evsel * evsel ,
2153
2131
struct annotation_options * options , struct arch * * parch )
2154
2132
{
2155
- size_t privsize = 0 ;
2156
2133
struct symbol * sym = ms -> sym ;
2157
2134
struct annotation * notes = symbol__annotation (sym );
2158
2135
struct annotate_args args = {
2159
- .privsize = privsize ,
2160
2136
.evsel = evsel ,
2161
2137
.options = options ,
2162
2138
};
0 commit comments