1*5ac3bc71Schristos /* $NetBSD: dwarf_pro_attr.c,v 1.5 2024/03/03 17:37:32 christos Exp $ */
2e81373b4Schristos
39dd9d0cfSchristos /*-
49dd9d0cfSchristos * Copyright (c) 2009 Kai Wang
59dd9d0cfSchristos * All rights reserved.
69dd9d0cfSchristos *
79dd9d0cfSchristos * Redistribution and use in source and binary forms, with or without
89dd9d0cfSchristos * modification, are permitted provided that the following conditions
99dd9d0cfSchristos * are met:
109dd9d0cfSchristos * 1. Redistributions of source code must retain the above copyright
119dd9d0cfSchristos * notice, this list of conditions and the following disclaimer.
129dd9d0cfSchristos * 2. Redistributions in binary form must reproduce the above copyright
139dd9d0cfSchristos * notice, this list of conditions and the following disclaimer in the
149dd9d0cfSchristos * documentation and/or other materials provided with the distribution.
159dd9d0cfSchristos *
169dd9d0cfSchristos * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
179dd9d0cfSchristos * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
189dd9d0cfSchristos * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
199dd9d0cfSchristos * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
209dd9d0cfSchristos * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
219dd9d0cfSchristos * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
229dd9d0cfSchristos * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
239dd9d0cfSchristos * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
249dd9d0cfSchristos * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
259dd9d0cfSchristos * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
269dd9d0cfSchristos * SUCH DAMAGE.
279dd9d0cfSchristos */
289dd9d0cfSchristos
299dd9d0cfSchristos #include "_libdwarf.h"
309dd9d0cfSchristos
31*5ac3bc71Schristos __RCSID("$NetBSD: dwarf_pro_attr.c,v 1.5 2024/03/03 17:37:32 christos Exp $");
32*5ac3bc71Schristos ELFTC_VCSID("Id: dwarf_pro_attr.c 3802 2020-02-07 02:13:19Z emaste");
339dd9d0cfSchristos
349dd9d0cfSchristos Dwarf_P_Attribute
dwarf_add_AT_location_expr(Dwarf_P_Debug dbg,Dwarf_P_Die die,Dwarf_Half attr,Dwarf_P_Expr loc_expr,Dwarf_Error * error)359dd9d0cfSchristos dwarf_add_AT_location_expr(Dwarf_P_Debug dbg, Dwarf_P_Die die, Dwarf_Half attr,
369dd9d0cfSchristos Dwarf_P_Expr loc_expr, Dwarf_Error *error)
379dd9d0cfSchristos {
389dd9d0cfSchristos Dwarf_Attribute at;
399dd9d0cfSchristos
409dd9d0cfSchristos if (dbg == NULL || die == NULL || loc_expr == NULL) {
419dd9d0cfSchristos DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
429dd9d0cfSchristos return (DW_DLV_BADADDR);
439dd9d0cfSchristos }
449dd9d0cfSchristos
459dd9d0cfSchristos if (_dwarf_attr_alloc(die, &at, error) != DW_DLE_NONE)
469dd9d0cfSchristos return (DW_DLV_BADADDR);
479dd9d0cfSchristos
489dd9d0cfSchristos at->at_die = die;
499dd9d0cfSchristos at->at_attrib = attr;
509dd9d0cfSchristos at->at_expr = loc_expr;
519dd9d0cfSchristos
52*5ac3bc71Schristos if (_dwarf_expr_into_block(loc_expr, error) != DW_DLE_NONE) {
53*5ac3bc71Schristos free(at);
549dd9d0cfSchristos return (DW_DLV_BADADDR);
55*5ac3bc71Schristos }
569dd9d0cfSchristos at->u[0].u64 = loc_expr->pe_length;
579dd9d0cfSchristos at->u[1].u8p = loc_expr->pe_block;
589dd9d0cfSchristos if (loc_expr->pe_length <= UCHAR_MAX)
599dd9d0cfSchristos at->at_form = DW_FORM_block1;
609dd9d0cfSchristos else if (loc_expr->pe_length <= USHRT_MAX)
619dd9d0cfSchristos at->at_form = DW_FORM_block2;
629dd9d0cfSchristos else if (loc_expr->pe_length <= UINT_MAX)
639dd9d0cfSchristos at->at_form = DW_FORM_block4;
649dd9d0cfSchristos else
659dd9d0cfSchristos at->at_form = DW_FORM_block;
669dd9d0cfSchristos
679dd9d0cfSchristos STAILQ_INSERT_TAIL(&die->die_attr, at, at_next);
689dd9d0cfSchristos
699dd9d0cfSchristos return (at);
709dd9d0cfSchristos }
719dd9d0cfSchristos
729dd9d0cfSchristos Dwarf_P_Attribute
dwarf_add_AT_name(Dwarf_P_Die die,char * name,Dwarf_Error * error)739dd9d0cfSchristos dwarf_add_AT_name(Dwarf_P_Die die, char *name, Dwarf_Error *error)
749dd9d0cfSchristos {
759dd9d0cfSchristos Dwarf_Attribute at;
769dd9d0cfSchristos
779dd9d0cfSchristos if (_dwarf_add_string_attr(die, &at, DW_AT_name, name, error) !=
789dd9d0cfSchristos DW_DLE_NONE)
799dd9d0cfSchristos return (DW_DLV_BADADDR);
809dd9d0cfSchristos
819dd9d0cfSchristos return (at);
829dd9d0cfSchristos }
839dd9d0cfSchristos
849dd9d0cfSchristos Dwarf_P_Attribute
dwarf_add_AT_comp_dir(Dwarf_P_Die die,char * dir,Dwarf_Error * error)859dd9d0cfSchristos dwarf_add_AT_comp_dir(Dwarf_P_Die die, char *dir, Dwarf_Error *error)
869dd9d0cfSchristos {
879dd9d0cfSchristos Dwarf_Attribute at;
889dd9d0cfSchristos
899dd9d0cfSchristos if (_dwarf_add_string_attr(die, &at, DW_AT_comp_dir, dir, error) !=
909dd9d0cfSchristos DW_DLE_NONE)
919dd9d0cfSchristos return (DW_DLV_BADADDR);
929dd9d0cfSchristos
939dd9d0cfSchristos return (at);
949dd9d0cfSchristos }
959dd9d0cfSchristos
969dd9d0cfSchristos Dwarf_P_Attribute
dwarf_add_AT_producer(Dwarf_P_Die die,char * producer,Dwarf_Error * error)979dd9d0cfSchristos dwarf_add_AT_producer(Dwarf_P_Die die, char *producer, Dwarf_Error *error)
989dd9d0cfSchristos {
999dd9d0cfSchristos Dwarf_Attribute at;
1009dd9d0cfSchristos
1019dd9d0cfSchristos if (_dwarf_add_string_attr(die, &at, DW_AT_producer, producer, error) !=
1029dd9d0cfSchristos DW_DLE_NONE)
1039dd9d0cfSchristos return (DW_DLV_BADADDR);
1049dd9d0cfSchristos
1059dd9d0cfSchristos return (at);
1069dd9d0cfSchristos }
1079dd9d0cfSchristos
1089dd9d0cfSchristos Dwarf_P_Attribute
dwarf_add_AT_const_value_signedint(Dwarf_P_Die die,Dwarf_Signed value,Dwarf_Error * error)1099dd9d0cfSchristos dwarf_add_AT_const_value_signedint(Dwarf_P_Die die, Dwarf_Signed value,
1109dd9d0cfSchristos Dwarf_Error *error)
1119dd9d0cfSchristos {
1129dd9d0cfSchristos Dwarf_Attribute at;
1139dd9d0cfSchristos Dwarf_Debug dbg;
1149dd9d0cfSchristos
1159dd9d0cfSchristos dbg = die != NULL ? die->die_dbg : NULL;
1169dd9d0cfSchristos
1179dd9d0cfSchristos if (die == NULL) {
1189dd9d0cfSchristos DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
1199dd9d0cfSchristos return (DW_DLV_BADADDR);
1209dd9d0cfSchristos }
1219dd9d0cfSchristos
1229dd9d0cfSchristos if (_dwarf_attr_alloc(die, &at, error) != DW_DLE_NONE)
1239dd9d0cfSchristos return (DW_DLV_BADADDR);
1249dd9d0cfSchristos
1259dd9d0cfSchristos at->at_die = die;
1269dd9d0cfSchristos at->at_attrib = DW_AT_const_value;
1279dd9d0cfSchristos at->at_form = DW_FORM_sdata;
1289dd9d0cfSchristos at->u[0].s64 = value;
1299dd9d0cfSchristos
1309dd9d0cfSchristos STAILQ_INSERT_TAIL(&die->die_attr, at, at_next);
1319dd9d0cfSchristos
1329dd9d0cfSchristos return (at);
1339dd9d0cfSchristos }
1349dd9d0cfSchristos
1359dd9d0cfSchristos Dwarf_P_Attribute
dwarf_add_AT_const_value_unsignedint(Dwarf_P_Die die,Dwarf_Unsigned value,Dwarf_Error * error)1369dd9d0cfSchristos dwarf_add_AT_const_value_unsignedint(Dwarf_P_Die die, Dwarf_Unsigned value,
1379dd9d0cfSchristos Dwarf_Error *error)
1389dd9d0cfSchristos {
1399dd9d0cfSchristos Dwarf_Attribute at;
1409dd9d0cfSchristos Dwarf_Debug dbg;
1419dd9d0cfSchristos
1429dd9d0cfSchristos dbg = die != NULL ? die->die_dbg : NULL;
1439dd9d0cfSchristos
1449dd9d0cfSchristos if (die == NULL) {
1459dd9d0cfSchristos DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
1469dd9d0cfSchristos return (DW_DLV_BADADDR);
1479dd9d0cfSchristos }
1489dd9d0cfSchristos
1499dd9d0cfSchristos if (_dwarf_attr_alloc(die, &at, error) != DW_DLE_NONE)
1509dd9d0cfSchristos return (DW_DLV_BADADDR);
1519dd9d0cfSchristos
1529dd9d0cfSchristos at->at_die = die;
1539dd9d0cfSchristos at->at_attrib = DW_AT_const_value;
1549dd9d0cfSchristos at->at_form = DW_FORM_udata;
1559dd9d0cfSchristos at->u[0].u64 = value;
1569dd9d0cfSchristos
1579dd9d0cfSchristos STAILQ_INSERT_TAIL(&die->die_attr, at, at_next);
1589dd9d0cfSchristos
1599dd9d0cfSchristos return (at);
1609dd9d0cfSchristos }
1619dd9d0cfSchristos
1629dd9d0cfSchristos Dwarf_P_Attribute
dwarf_add_AT_const_value_string(Dwarf_P_Die die,char * string,Dwarf_Error * error)1639dd9d0cfSchristos dwarf_add_AT_const_value_string(Dwarf_P_Die die, char *string,
1649dd9d0cfSchristos Dwarf_Error *error)
1659dd9d0cfSchristos {
1669dd9d0cfSchristos Dwarf_Attribute at;
1679dd9d0cfSchristos
1689dd9d0cfSchristos if (_dwarf_add_string_attr(die, &at, DW_AT_const_value, string,
1699dd9d0cfSchristos error) != DW_DLE_NONE)
1709dd9d0cfSchristos return (DW_DLV_BADADDR);
1719dd9d0cfSchristos
1729dd9d0cfSchristos return (at);
1739dd9d0cfSchristos }
1749dd9d0cfSchristos
1759dd9d0cfSchristos Dwarf_P_Attribute
dwarf_add_AT_targ_address(Dwarf_P_Debug dbg,Dwarf_P_Die die,Dwarf_Half attr,Dwarf_Unsigned pc_value,Dwarf_Signed sym_index,Dwarf_Error * error)1769dd9d0cfSchristos dwarf_add_AT_targ_address(Dwarf_P_Debug dbg, Dwarf_P_Die die, Dwarf_Half attr,
1779dd9d0cfSchristos Dwarf_Unsigned pc_value, Dwarf_Signed sym_index, Dwarf_Error *error)
1789dd9d0cfSchristos {
1799dd9d0cfSchristos
1809dd9d0cfSchristos return (dwarf_add_AT_targ_address_b(dbg, die, attr, pc_value, sym_index,
1819dd9d0cfSchristos error));
1829dd9d0cfSchristos }
1839dd9d0cfSchristos
1849dd9d0cfSchristos Dwarf_P_Attribute
dwarf_add_AT_targ_address_b(Dwarf_P_Debug dbg,Dwarf_P_Die die,Dwarf_Half attr,Dwarf_Unsigned pc_value,Dwarf_Unsigned sym_index,Dwarf_Error * error)1859dd9d0cfSchristos dwarf_add_AT_targ_address_b(Dwarf_P_Debug dbg, Dwarf_P_Die die, Dwarf_Half attr,
1869dd9d0cfSchristos Dwarf_Unsigned pc_value, Dwarf_Unsigned sym_index, Dwarf_Error *error)
1879dd9d0cfSchristos {
1889dd9d0cfSchristos Dwarf_Attribute at;
1899dd9d0cfSchristos
1909dd9d0cfSchristos if (dbg == NULL || die == NULL) {
1919dd9d0cfSchristos DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
1929dd9d0cfSchristos return (DW_DLV_BADADDR);
1939dd9d0cfSchristos }
1949dd9d0cfSchristos
1959dd9d0cfSchristos if (_dwarf_attr_alloc(die, &at, error) != DW_DLE_NONE)
1969dd9d0cfSchristos return (DW_DLV_BADADDR);
1979dd9d0cfSchristos
1989dd9d0cfSchristos at->at_die = die;
1999dd9d0cfSchristos at->at_attrib = attr;
2009dd9d0cfSchristos at->at_form = DW_FORM_addr;
2019dd9d0cfSchristos at->at_relsym = sym_index;
2029dd9d0cfSchristos at->u[0].u64 = pc_value;
2039dd9d0cfSchristos
2049dd9d0cfSchristos STAILQ_INSERT_TAIL(&die->die_attr, at, at_next);
2059dd9d0cfSchristos
2069dd9d0cfSchristos return (at);
2079dd9d0cfSchristos }
2089dd9d0cfSchristos
2099dd9d0cfSchristos Dwarf_P_Attribute
dwarf_add_AT_dataref(Dwarf_P_Debug dbg,Dwarf_P_Die die,Dwarf_Half attr,Dwarf_Unsigned pc_value,Dwarf_Unsigned sym_index,Dwarf_Error * error)2109dd9d0cfSchristos dwarf_add_AT_dataref(Dwarf_P_Debug dbg, Dwarf_P_Die die, Dwarf_Half attr,
2119dd9d0cfSchristos Dwarf_Unsigned pc_value, Dwarf_Unsigned sym_index, Dwarf_Error *error)
2129dd9d0cfSchristos {
2139dd9d0cfSchristos Dwarf_Attribute at;
2149dd9d0cfSchristos int ret;
2159dd9d0cfSchristos
2169dd9d0cfSchristos if (dbg == NULL || die == NULL) {
2179dd9d0cfSchristos DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
2189dd9d0cfSchristos return (DW_DLV_BADADDR);
2199dd9d0cfSchristos }
2209dd9d0cfSchristos
2219dd9d0cfSchristos ret = _dwarf_add_AT_dataref(dbg, die, attr, pc_value, sym_index,
2229dd9d0cfSchristos NULL, &at, error);
2239dd9d0cfSchristos if (ret != DW_DLE_NONE)
2249dd9d0cfSchristos return (DW_DLV_BADADDR);
2259dd9d0cfSchristos
2269dd9d0cfSchristos return (at);
2279dd9d0cfSchristos
2289dd9d0cfSchristos }
2299dd9d0cfSchristos
2309dd9d0cfSchristos Dwarf_P_Attribute
dwarf_add_AT_ref_address(Dwarf_P_Debug dbg,Dwarf_P_Die die,Dwarf_Half attr,Dwarf_Unsigned pc_value,Dwarf_Unsigned sym_index,Dwarf_Error * error)2319dd9d0cfSchristos dwarf_add_AT_ref_address(Dwarf_P_Debug dbg, Dwarf_P_Die die, Dwarf_Half attr,
2329dd9d0cfSchristos Dwarf_Unsigned pc_value, Dwarf_Unsigned sym_index, Dwarf_Error *error)
2339dd9d0cfSchristos {
2349dd9d0cfSchristos Dwarf_Attribute at;
2359dd9d0cfSchristos
2369dd9d0cfSchristos if (dbg == NULL || die == NULL) {
2379dd9d0cfSchristos DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
2389dd9d0cfSchristos return (DW_DLV_BADADDR);
2399dd9d0cfSchristos }
2409dd9d0cfSchristos
2419dd9d0cfSchristos if (_dwarf_attr_alloc(die, &at, error) != DW_DLE_NONE)
2429dd9d0cfSchristos return (DW_DLV_BADADDR);
2439dd9d0cfSchristos
2449dd9d0cfSchristos at->at_die = die;
2459dd9d0cfSchristos at->at_attrib = attr;
2469dd9d0cfSchristos at->at_form = DW_FORM_ref_addr;
2479dd9d0cfSchristos at->at_relsym = sym_index;
2489dd9d0cfSchristos at->u[0].u64 = pc_value;
2499dd9d0cfSchristos
2509dd9d0cfSchristos STAILQ_INSERT_TAIL(&die->die_attr, at, at_next);
2519dd9d0cfSchristos
2529dd9d0cfSchristos return (at);
2539dd9d0cfSchristos }
2549dd9d0cfSchristos
2559dd9d0cfSchristos Dwarf_P_Attribute
dwarf_add_AT_unsigned_const(Dwarf_P_Debug dbg,Dwarf_P_Die die,Dwarf_Half attr,Dwarf_Unsigned value,Dwarf_Error * error)2569dd9d0cfSchristos dwarf_add_AT_unsigned_const(Dwarf_P_Debug dbg, Dwarf_P_Die die, Dwarf_Half attr,
2579dd9d0cfSchristos Dwarf_Unsigned value, Dwarf_Error *error)
2589dd9d0cfSchristos {
2599dd9d0cfSchristos Dwarf_Attribute at;
2609dd9d0cfSchristos
2619dd9d0cfSchristos if (dbg == NULL || die == NULL) {
2629dd9d0cfSchristos DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
2639dd9d0cfSchristos return (DW_DLV_BADADDR);
2649dd9d0cfSchristos }
2659dd9d0cfSchristos
2669dd9d0cfSchristos if (_dwarf_attr_alloc(die, &at, error) != DW_DLE_NONE)
2679dd9d0cfSchristos return (DW_DLV_BADADDR);
2689dd9d0cfSchristos
2699dd9d0cfSchristos at->at_die = die;
2709dd9d0cfSchristos at->at_attrib = attr;
2719dd9d0cfSchristos at->u[0].u64 = value;
2729dd9d0cfSchristos
2739dd9d0cfSchristos if (value <= UCHAR_MAX)
2749dd9d0cfSchristos at->at_form = DW_FORM_data1;
2759dd9d0cfSchristos else if (value <= USHRT_MAX)
2769dd9d0cfSchristos at->at_form = DW_FORM_data2;
2779dd9d0cfSchristos else if (value <= UINT_MAX)
2789dd9d0cfSchristos at->at_form = DW_FORM_data4;
2799dd9d0cfSchristos else
2809dd9d0cfSchristos at->at_form = DW_FORM_data8;
2819dd9d0cfSchristos
2829dd9d0cfSchristos STAILQ_INSERT_TAIL(&die->die_attr, at, at_next);
2839dd9d0cfSchristos
2849dd9d0cfSchristos return (at);
2859dd9d0cfSchristos }
2869dd9d0cfSchristos
2879dd9d0cfSchristos Dwarf_P_Attribute
dwarf_add_AT_signed_const(Dwarf_P_Debug dbg,Dwarf_P_Die die,Dwarf_Half attr,Dwarf_Signed value,Dwarf_Error * error)2889dd9d0cfSchristos dwarf_add_AT_signed_const(Dwarf_P_Debug dbg, Dwarf_P_Die die, Dwarf_Half attr,
2899dd9d0cfSchristos Dwarf_Signed value, Dwarf_Error *error)
2909dd9d0cfSchristos {
2919dd9d0cfSchristos Dwarf_Attribute at;
2929dd9d0cfSchristos
2939dd9d0cfSchristos if (dbg == NULL || die == NULL) {
2949dd9d0cfSchristos DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
2959dd9d0cfSchristos return (DW_DLV_BADADDR);
2969dd9d0cfSchristos }
2979dd9d0cfSchristos
2989dd9d0cfSchristos if (_dwarf_attr_alloc(die, &at, error) != DW_DLE_NONE)
2999dd9d0cfSchristos return (DW_DLV_BADADDR);
3009dd9d0cfSchristos
3019dd9d0cfSchristos at->at_die = die;
3029dd9d0cfSchristos at->at_attrib = attr;
3039dd9d0cfSchristos at->u[0].u64 = value;
3049dd9d0cfSchristos
3059dd9d0cfSchristos if (value >= SCHAR_MIN && value <= SCHAR_MAX)
3069dd9d0cfSchristos at->at_form = DW_FORM_data1;
3079dd9d0cfSchristos else if (value >= SHRT_MIN && value <= SHRT_MAX)
3089dd9d0cfSchristos at->at_form = DW_FORM_data2;
3099dd9d0cfSchristos else if (value >= INT_MIN && value <= INT_MAX)
3109dd9d0cfSchristos at->at_form = DW_FORM_data4;
3119dd9d0cfSchristos else
3129dd9d0cfSchristos at->at_form = DW_FORM_data8;
3139dd9d0cfSchristos
3149dd9d0cfSchristos STAILQ_INSERT_TAIL(&die->die_attr, at, at_next);
3159dd9d0cfSchristos
3169dd9d0cfSchristos return (at);
3179dd9d0cfSchristos }
3189dd9d0cfSchristos
3199dd9d0cfSchristos Dwarf_P_Attribute
dwarf_add_AT_reference(Dwarf_P_Debug dbg,Dwarf_P_Die die,Dwarf_Half attr,Dwarf_P_Die ref_die,Dwarf_Error * error)3209dd9d0cfSchristos dwarf_add_AT_reference(Dwarf_P_Debug dbg, Dwarf_P_Die die, Dwarf_Half attr,
3219dd9d0cfSchristos Dwarf_P_Die ref_die, Dwarf_Error *error)
3229dd9d0cfSchristos {
3239dd9d0cfSchristos Dwarf_Attribute at;
3249dd9d0cfSchristos
3259dd9d0cfSchristos if (dbg == NULL || die == NULL) {
3269dd9d0cfSchristos DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
3279dd9d0cfSchristos return (DW_DLV_BADADDR);
3289dd9d0cfSchristos }
3299dd9d0cfSchristos
3309dd9d0cfSchristos if (_dwarf_attr_alloc(die, &at, error) != DW_DLE_NONE)
3319dd9d0cfSchristos return (DW_DLV_BADADDR);
3329dd9d0cfSchristos
3339dd9d0cfSchristos at->at_die = die;
3349dd9d0cfSchristos at->at_attrib = attr;
3359dd9d0cfSchristos if (dbg->dbg_offset_size == 4)
3369dd9d0cfSchristos at->at_form = DW_FORM_ref4;
3379dd9d0cfSchristos else
3389dd9d0cfSchristos at->at_form = DW_FORM_ref8;
3399dd9d0cfSchristos
3409dd9d0cfSchristos at->at_refdie = ref_die;
3419dd9d0cfSchristos
3429dd9d0cfSchristos STAILQ_INSERT_TAIL(&die->die_attr, at, at_next);
3439dd9d0cfSchristos
3449dd9d0cfSchristos return (at);
3459dd9d0cfSchristos }
3469dd9d0cfSchristos
3479dd9d0cfSchristos Dwarf_P_Attribute
dwarf_add_AT_flag(Dwarf_P_Debug dbg,Dwarf_P_Die die,Dwarf_Half attr,Dwarf_Small flag,Dwarf_Error * error)3489dd9d0cfSchristos dwarf_add_AT_flag(Dwarf_P_Debug dbg, Dwarf_P_Die die, Dwarf_Half attr,
3499dd9d0cfSchristos Dwarf_Small flag, Dwarf_Error *error)
3509dd9d0cfSchristos {
3519dd9d0cfSchristos Dwarf_Attribute at;
3529dd9d0cfSchristos
3539dd9d0cfSchristos if (dbg == NULL || die == NULL) {
3549dd9d0cfSchristos DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
3559dd9d0cfSchristos return (DW_DLV_BADADDR);
3569dd9d0cfSchristos }
3579dd9d0cfSchristos
3589dd9d0cfSchristos if (_dwarf_attr_alloc(die, &at, error) != DW_DLE_NONE)
3599dd9d0cfSchristos return (DW_DLV_BADADDR);
3609dd9d0cfSchristos
3619dd9d0cfSchristos at->at_die = die;
3629dd9d0cfSchristos at->at_attrib = attr;
3639dd9d0cfSchristos at->at_form = DW_FORM_flag;
3649dd9d0cfSchristos at->u[0].u64 = flag ? 1 : 0;
3659dd9d0cfSchristos
3669dd9d0cfSchristos STAILQ_INSERT_TAIL(&die->die_attr, at, at_next);
3679dd9d0cfSchristos
3689dd9d0cfSchristos return (at);
3699dd9d0cfSchristos }
3709dd9d0cfSchristos
3719dd9d0cfSchristos Dwarf_P_Attribute
dwarf_add_AT_string(Dwarf_P_Debug dbg,Dwarf_P_Die die,Dwarf_Half attr,char * string,Dwarf_Error * error)3729dd9d0cfSchristos dwarf_add_AT_string(Dwarf_P_Debug dbg, Dwarf_P_Die die, Dwarf_Half attr,
3739dd9d0cfSchristos char *string, Dwarf_Error *error)
3749dd9d0cfSchristos {
3759dd9d0cfSchristos Dwarf_Attribute at;
3769dd9d0cfSchristos
3779dd9d0cfSchristos if (dbg == NULL || die == NULL) {
3789dd9d0cfSchristos DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
3799dd9d0cfSchristos return (DW_DLV_BADADDR);
3809dd9d0cfSchristos }
3819dd9d0cfSchristos
3829dd9d0cfSchristos /* XXX Add DW_FORM_string style string instead? */
3839dd9d0cfSchristos
3849dd9d0cfSchristos if (_dwarf_add_string_attr(die, &at, attr, string, error) !=
3859dd9d0cfSchristos DW_DLE_NONE)
3869dd9d0cfSchristos return (DW_DLV_BADADDR);
3879dd9d0cfSchristos
3889dd9d0cfSchristos return (at);
3899dd9d0cfSchristos }
390