1 /* findfre-1.c -- Test for sframe_find_fre in libsframe.
3 Copyright (C) 2023-2024 Free Software Foundation, Inc.
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>. */
24 #include "sframe-api.h"
26 /* DejaGnu should not use gnulib's vsnprintf replacement here. */
31 add_fde1 (sframe_encoder_ctx
*encode
, int idx
)
34 /* A contiguous block containing 4 FREs. */
35 sframe_frame_row_entry fres
[]
36 = { {0x0, {0x1, 0, 0}, 0x3},
37 {0x1, {0x2, 0xf0, 0}, 0x5},
38 {0x10, {0x3, 0xf0, 0}, 0x4},
39 {0x38, {0x8, 0xf0, 0}, 0x5}
42 unsigned char finfo
= sframe_fde_create_func_info (SFRAME_FRE_TYPE_ADDR1
,
43 SFRAME_FDE_TYPE_PCINC
);
44 err
= sframe_encoder_add_funcdesc (encode
, 0xfffff03e, 0x40, finfo
, 4);
48 for (i
= 0; i
< 4; i
++)
49 if (sframe_encoder_add_fre (encode
, idx
,fres
+i
) == SFRAME_ERR
)
56 add_fde2 (sframe_encoder_ctx
*encode
, int idx
)
59 /* A contiguous block containing 4 FREs. */
60 sframe_frame_row_entry fres
[]
61 = { {0x0, {0x10, 0, 0}, 0x3},
62 {0x10, {0x12, 0xf0, 0}, 0x5},
63 {0x14, {0x14, 0xf0, 0}, 0x4},
64 {0x20, {0x15, 0xf0, 0}, 0x5}
67 unsigned char finfo
= sframe_fde_create_func_info (SFRAME_FRE_TYPE_ADDR1
,
68 SFRAME_FDE_TYPE_PCINC
);
69 err
= sframe_encoder_add_funcdesc (encode
, 0xfffff08e, 0x60, finfo
, 4);
73 for (i
= 0; i
< 4; i
++)
74 if (sframe_encoder_add_fre (encode
, idx
, fres
+i
) == SFRAME_ERR
)
82 sframe_encoder_ctx
*encode
;
83 sframe_decoder_ctx
*dctx
;
84 sframe_frame_row_entry frep
;
88 unsigned int fde_cnt
= 0;
90 #define TEST(name, cond) \
100 encode
= sframe_encode (SFRAME_VERSION
, 0,
101 SFRAME_ABI_AMD64_ENDIAN_LITTLE
,
102 SFRAME_CFA_FIXED_FP_INVALID
,
103 -8, /* Fixed RA offset for AMD64. */
106 err
= add_fde1 (encode
, 0);
107 TEST ("findfre-1: Adding FDE1", err
== 0);
109 err
= add_fde2 (encode
, 1);
110 TEST ("findfre-1: Adding FDE2", err
== 0);
112 fde_cnt
= sframe_encoder_get_num_fidx (encode
);
113 TEST ("findfre-1: Test FDE count", fde_cnt
== 2);
115 sframe_buf
= sframe_encoder_write (encode
, &sf_size
, &err
);
116 TEST ("findfre-1: Encoder write", err
== 0);
118 dctx
= sframe_decode (sframe_buf
, sf_size
, &err
);
119 TEST("findfre-1: Decoder setup", dctx
!= NULL
);
121 /* Find the third FRE in first FDE. */
122 err
= sframe_find_fre (dctx
, (0xfffff03e + 0x15), &frep
);
123 TEST("findfre-1: Find third FRE",
124 ((err
== 0) && (sframe_fre_get_cfa_offset(dctx
, &frep
, &err
) == 0x3)));
126 /* Find an FRE for PC at the end of range covered by FRE. */
127 err
= sframe_find_fre (dctx
, (0xfffff03e + 0x9), &frep
);
128 TEST("findfre-1: Find FRE for last PC covered by FRE",
129 ((err
== 0) && (sframe_fre_get_cfa_offset(dctx
, &frep
, &err
) == 0x2)));
131 /* Find the last FRE in first FDE. */
132 err
= sframe_find_fre (dctx
, (0xfffff03e + 0x39), &frep
);
133 TEST("findfre-1: Find last FRE",
134 ((err
== 0) && (sframe_fre_get_cfa_offset(dctx
, &frep
, &err
) == 0x8)));
136 /* Find the second FRE in second FDE. */
137 err
= sframe_find_fre (dctx
, (0xfffff08e + 0x11), &frep
);
138 TEST("findfre-1: Find second FRE",
139 ((err
== 0) && (sframe_fre_get_cfa_offset(dctx
, &frep
, &err
) == 0x12)));
141 /* Find the first FRE in second FDE. */
142 err
= sframe_find_fre (dctx
, (0xfffff08e + 0x0), &frep
);
143 TEST("findfre-1: Find first FRE",
144 ((err
== 0) && (sframe_fre_get_cfa_offset(dctx
, &frep
, &err
) == 0x10)));
146 /* Find FRE for PC out of range. Expect error code. */
147 err
= sframe_find_fre (dctx
, (0xfffff03e + 0x40), &frep
);
148 TEST("findfre-1: Find FRE for out of range PC",
149 (err
== SFRAME_ERR
));
151 sframe_encoder_free (&encode
);
152 sframe_decoder_free (&dctx
);