1 /* encode-1.c -- Test for encoder in libsframe.
3 Copyright (C) 2022-2023 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, {0x8, 0, 0}, 0x3},
37 {0x1, {0x10, 0xf0, 0}, 0x5},
38 {0x4, {0x10, 0xf0, 0}, 0x4},
39 {0x1a, {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, 0x1b, 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, {0x8, 0, 0}, 0x3},
62 {0x1, {0x10, 0xf0, 0}, 0x5},
63 {0x4, {0x10, 0xf0, 0}, 0x4},
64 {0xf, {0x8, 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
, 0xfffff059, 0x10, finfo
, 4);
73 for (i
= 0; i
< 4; i
++)
74 if (sframe_encoder_add_fre (encode
, idx
, fres
+i
) == SFRAME_ERR
)
81 * SFrame info from the following source (2 fdes, 4 fres in each fde):
83 * int foo() { return ++cnt; }
84 * int main() { return foo(); }
89 data_match (char *sframe_buf
, size_t sz
)
97 fp
= fopen (DATA
, "r");
100 if (fstat (fileno (fp
), &st
) < 0)
106 sf_buf
= malloc (st
.st_size
);
112 sf_size
= fread (sf_buf
, 1, st
.st_size
, fp
);
114 if (sf_size
== 0 || sf_buf
== NULL
)
116 fprintf (stderr
, "Encode: Read section failed\n");
122 diffs
= memcmp (sf_buf
, sframe_buf
, sz
);
130 sframe_encoder_ctx
*encode
;
131 sframe_frame_row_entry frep
;
135 unsigned int fde_cnt
= 0;
138 #define TEST(name, cond) \
148 encode
= sframe_encode (SFRAME_VERSION
, 0,
149 SFRAME_ABI_AMD64_ENDIAN_LITTLE
,
150 SFRAME_CFA_FIXED_FP_INVALID
,
151 -8, /* Fixed RA offset for AMD64. */
154 fde_cnt
= sframe_encoder_get_num_fidx (encode
);
155 TEST ("encode-1: Encoder FDE count", fde_cnt
== 0);
157 err
= sframe_encoder_add_fre (encode
, 1, &frep
);
158 TEST ("encode-1: Encoder update workflow", err
== SFRAME_ERR
);
160 err
= add_fde1 (encode
, 0);
161 TEST ("encode-1: Encoder adding FDE1", err
== 0);
163 err
= add_fde2 (encode
, 1);
164 TEST ("encode-1: Encoder adding FDE2", err
== 0);
166 fde_cnt
= sframe_encoder_get_num_fidx (encode
);
167 TEST ("encode-1: Encoder FDE count", fde_cnt
== 2);
169 sframe_buf
= sframe_encoder_write (encode
, &sf_size
, &err
);
170 TEST ("encode-1: Encoder write", err
== 0);
172 match_p
= data_match (sframe_buf
, sf_size
);
173 TEST ("encode-1: Encode buffer match", match_p
== 1);
175 sframe_encoder_free (&encode
);