xref: /titanic_44/usr/src/cmd/sgs/libconv/common/dwarf_ehe.c (revision 6a074c93c5dee390d8ca2377f42e55418f0a9eb3)
17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate  * CDDL HEADER START
37c478bd9Sstevel@tonic-gate  *
47c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
55aefb655Srie  * Common Development and Distribution License (the "License").
65aefb655Srie  * You may not use this file except in compliance with the License.
77c478bd9Sstevel@tonic-gate  *
87c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
107c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
117c478bd9Sstevel@tonic-gate  * and limitations under the License.
127c478bd9Sstevel@tonic-gate  *
137c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
147c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
167c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
177c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
187c478bd9Sstevel@tonic-gate  *
197c478bd9Sstevel@tonic-gate  * CDDL HEADER END
207c478bd9Sstevel@tonic-gate  */
215aefb655Srie 
227c478bd9Sstevel@tonic-gate /*
23de777a60Sab196087  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
247c478bd9Sstevel@tonic-gate  * Use is subject to license terms.
257c478bd9Sstevel@tonic-gate  */
267c478bd9Sstevel@tonic-gate #pragma ident	"%Z%%M%	%I%	%E% SMI"
277c478bd9Sstevel@tonic-gate 
287c478bd9Sstevel@tonic-gate #include	<strings.h>
297c478bd9Sstevel@tonic-gate #include	<dwarf.h>
305aefb655Srie #include	"_conv.h"
31de777a60Sab196087 #include	<dwarf_ehe_msg.h>
327c478bd9Sstevel@tonic-gate 
335aefb655Srie #define	FLAGSZ	MSG_GBL_OSQBRKT_SIZE + \
345aefb655Srie 		MSG_DWEHE_SLEB128_SIZE + \
355aefb655Srie 		MSG_DWEHE_INDIRECT_SIZE + \
36de777a60Sab196087 		CONV_INV_BUFSIZE + MSG_GBL_CSQBRKT_SIZE
37de777a60Sab196087 
38de777a60Sab196087 /*
39de777a60Sab196087  * Ensure that Conv_dwarf_ehe_buf_t is large enough:
40de777a60Sab196087  *
41de777a60Sab196087  * FLAGSZ is the real minimum size of the buffer required by conv_dwarf_ehe().
42de777a60Sab196087  * However, Conv_dwarf_ehe_buf_t uses CONV_EHDR_FLAG_BUFSIZE to set the
43de777a60Sab196087  * buffer size. We do things this way because the definition of FLAGSZ uses
44de777a60Sab196087  * information that is not available in the environment of other programs
45de777a60Sab196087  * that include the conv.h header file.
46de777a60Sab196087  */
47*6a074c93Sab196087 #if (CONV_DWARF_EHE_BUFSIZE != FLAGSZ) && !defined(__lint)
48*6a074c93Sab196087 #define	REPORT_BUFSIZE FLAGSZ
49*6a074c93Sab196087 #include "report_bufsize.h"
50*6a074c93Sab196087 #error "CONV_DWARF_EHE_BUFSIZE does not match FLAGSZ"
51de777a60Sab196087 #endif
525aefb655Srie 
537c478bd9Sstevel@tonic-gate const char *
conv_dwarf_ehe(uint_t flags,Conv_dwarf_ehe_buf_t * dwarf_ehe_buf)54de777a60Sab196087 conv_dwarf_ehe(uint_t flags, Conv_dwarf_ehe_buf_t *dwarf_ehe_buf)
557c478bd9Sstevel@tonic-gate {
56de777a60Sab196087 	char	*buf = dwarf_ehe_buf->buf;
575aefb655Srie 	size_t	ret = 0;
587c478bd9Sstevel@tonic-gate 
59de777a60Sab196087 	(void) strncpy(buf, MSG_ORIG(MSG_GBL_OSQBRKT), FLAGSZ);
607c478bd9Sstevel@tonic-gate 
615aefb655Srie 	if (flags == DW_EH_PE_omit)
62de777a60Sab196087 		ret = strlcat(buf, MSG_ORIG(MSG_DWEHE_OMIT), FLAGSZ);
635aefb655Srie 	else if (flags == DW_EH_PE_absptr)
64de777a60Sab196087 		ret = strlcat(buf, MSG_ORIG(MSG_DWEHE_ABSPTR), FLAGSZ);
655aefb655Srie 
665aefb655Srie 	if (ret >= FLAGSZ)
67de777a60Sab196087 		return (conv_invalid_val(&dwarf_ehe_buf->inv_buf, flags, 0));
685aefb655Srie 
695aefb655Srie 	if ((flags == DW_EH_PE_omit) || (flags == DW_EH_PE_absptr)) {
70de777a60Sab196087 		(void) strlcat(buf, MSG_ORIG(MSG_GBL_CSQBRKT), FLAGSZ);
71de777a60Sab196087 		return (buf);
727c478bd9Sstevel@tonic-gate 	}
737c478bd9Sstevel@tonic-gate 
747c478bd9Sstevel@tonic-gate 	switch (flags & 0x0f) {
757c478bd9Sstevel@tonic-gate 	case DW_EH_PE_uleb128:
76de777a60Sab196087 		ret = strlcat(buf, MSG_ORIG(MSG_DWEHE_ULEB128), FLAGSZ);
777c478bd9Sstevel@tonic-gate 		break;
787c478bd9Sstevel@tonic-gate 	case DW_EH_PE_udata2:
79de777a60Sab196087 		ret = strlcat(buf, MSG_ORIG(MSG_DWEHE_UDATA2), FLAGSZ);
807c478bd9Sstevel@tonic-gate 		break;
817c478bd9Sstevel@tonic-gate 	case DW_EH_PE_udata4:
82de777a60Sab196087 		ret = strlcat(buf, MSG_ORIG(MSG_DWEHE_UDATA4), FLAGSZ);
837c478bd9Sstevel@tonic-gate 		break;
847c478bd9Sstevel@tonic-gate 	case DW_EH_PE_udata8:
85de777a60Sab196087 		ret = strlcat(buf, MSG_ORIG(MSG_DWEHE_UDATA8), FLAGSZ);
867c478bd9Sstevel@tonic-gate 		break;
877c478bd9Sstevel@tonic-gate 	case DW_EH_PE_sleb128:
88de777a60Sab196087 		ret = strlcat(buf, MSG_ORIG(MSG_DWEHE_SLEB128), FLAGSZ);
897c478bd9Sstevel@tonic-gate 		break;
907c478bd9Sstevel@tonic-gate 	case DW_EH_PE_sdata2:
91de777a60Sab196087 		ret = strlcat(buf, MSG_ORIG(MSG_DWEHE_SDATA2), FLAGSZ);
927c478bd9Sstevel@tonic-gate 		break;
937c478bd9Sstevel@tonic-gate 	case DW_EH_PE_sdata4:
94de777a60Sab196087 		ret = strlcat(buf, MSG_ORIG(MSG_DWEHE_SDATA4), FLAGSZ);
957c478bd9Sstevel@tonic-gate 		break;
967c478bd9Sstevel@tonic-gate 	case DW_EH_PE_sdata8:
97de777a60Sab196087 		ret = strlcat(buf, MSG_ORIG(MSG_DWEHE_SDATA8), FLAGSZ);
987c478bd9Sstevel@tonic-gate 		break;
997c478bd9Sstevel@tonic-gate 	}
1005aefb655Srie 	if (ret >= FLAGSZ)
101de777a60Sab196087 		return (conv_invalid_val(&dwarf_ehe_buf->inv_buf, flags, 0));
1027c478bd9Sstevel@tonic-gate 
1037c478bd9Sstevel@tonic-gate 	switch (flags & 0xf0) {
1047c478bd9Sstevel@tonic-gate 	case DW_EH_PE_pcrel:
105de777a60Sab196087 		ret = strlcat(buf, MSG_ORIG(MSG_DWEHE_PCREL), FLAGSZ);
1067c478bd9Sstevel@tonic-gate 		break;
1077c478bd9Sstevel@tonic-gate 	case DW_EH_PE_textrel:
108de777a60Sab196087 		ret = strlcat(buf, MSG_ORIG(MSG_DWEHE_TEXTREL), FLAGSZ);
1097c478bd9Sstevel@tonic-gate 		break;
1107c478bd9Sstevel@tonic-gate 	case DW_EH_PE_datarel:
111de777a60Sab196087 		ret = strlcat(buf, MSG_ORIG(MSG_DWEHE_DATAREL), FLAGSZ);
1127c478bd9Sstevel@tonic-gate 		break;
1137c478bd9Sstevel@tonic-gate 	case DW_EH_PE_funcrel:
114de777a60Sab196087 		ret = strlcat(buf, MSG_ORIG(MSG_DWEHE_FUNCREL), FLAGSZ);
1157c478bd9Sstevel@tonic-gate 		break;
1167c478bd9Sstevel@tonic-gate 	case DW_EH_PE_aligned:
117de777a60Sab196087 		ret = strlcat(buf, MSG_ORIG(MSG_DWEHE_ALIGNED), FLAGSZ);
1187c478bd9Sstevel@tonic-gate 		break;
1197c478bd9Sstevel@tonic-gate 	case DW_EH_PE_indirect:
120de777a60Sab196087 		ret = strlcat(buf, MSG_ORIG(MSG_DWEHE_INDIRECT), FLAGSZ);
1217c478bd9Sstevel@tonic-gate 		break;
1227c478bd9Sstevel@tonic-gate 	}
1235aefb655Srie 	if (ret >= FLAGSZ)
124de777a60Sab196087 		return (conv_invalid_val(&dwarf_ehe_buf->inv_buf, flags, 0));
1257c478bd9Sstevel@tonic-gate 
126de777a60Sab196087 	(void) strlcat(buf, MSG_ORIG(MSG_GBL_CSQBRKT), FLAGSZ);
127de777a60Sab196087 	return (buf);
1287c478bd9Sstevel@tonic-gate }
129