14
14
#include " arith_tools.h"
15
15
#include " byte_operators.h"
16
16
#include " c_types.h"
17
+ #include " config.h"
17
18
#include " invariant.h"
18
19
#include " namespace.h"
19
20
#include " pointer_expr.h"
@@ -38,14 +39,14 @@ optionalt<mp_integer> member_offset(
38
39
{
39
40
const std::size_t w = to_c_bit_field_type (comp.type ()).get_width ();
40
41
bit_field_bits += w;
41
- result += bit_field_bits / 8 ;
42
- bit_field_bits %= 8 ;
42
+ result += bit_field_bits / config. ansi_c . char_width ;
43
+ bit_field_bits %= config. ansi_c . char_width ;
43
44
}
44
45
else if (comp.type ().id () == ID_bool)
45
46
{
46
47
++bit_field_bits;
47
- result += bit_field_bits / 8 ;
48
- bit_field_bits %= 8 ;
48
+ result += bit_field_bits / config. ansi_c . char_width ;
49
+ bit_field_bits %= config. ansi_c . char_width ;
49
50
}
50
51
else
51
52
{
@@ -92,7 +93,7 @@ pointer_offset_size(const typet &type, const namespacet &ns)
92
93
auto bits = pointer_offset_bits (type, ns);
93
94
94
95
if (bits.has_value ())
95
- return (*bits + 7 ) / 8 ;
96
+ return (*bits + config. ansi_c . char_width - 1 ) / config. ansi_c . char_width ;
96
97
else
97
98
return {};
98
99
}
@@ -249,16 +250,16 @@ optionalt<exprt> member_offset_expr(
249
250
{
250
251
std::size_t w = to_c_bit_field_type (c.type ()).get_width ();
251
252
bit_field_bits += w;
252
- const std::size_t bytes = bit_field_bits / 8 ;
253
- bit_field_bits %= 8 ;
253
+ const std::size_t bytes = bit_field_bits / config. ansi_c . char_width ;
254
+ bit_field_bits %= config. ansi_c . char_width ;
254
255
if (bytes > 0 )
255
256
result = plus_exprt (result, from_integer (bytes, result.type ()));
256
257
}
257
258
else if (c.type ().id () == ID_bool)
258
259
{
259
260
++bit_field_bits;
260
- const std::size_t bytes = bit_field_bits / 8 ;
261
- bit_field_bits %= 8 ;
261
+ const std::size_t bytes = bit_field_bits / config. ansi_c . char_width ;
262
+ bit_field_bits %= config. ansi_c . char_width ;
262
263
if (bytes > 0 )
263
264
result = plus_exprt (result, from_integer (bytes, result.type ()));
264
265
}
@@ -289,7 +290,9 @@ optionalt<exprt> size_of_expr(const typet &type, const namespacet &ns)
289
290
auto bits = pointer_offset_bits (array_type, ns);
290
291
291
292
if (bits.has_value ())
292
- return from_integer ((*bits + 7 ) / 8 , size_type ());
293
+ return from_integer (
294
+ (*bits + config.ansi_c .char_width - 1 ) / config.ansi_c .char_width ,
295
+ size_type ());
293
296
}
294
297
295
298
auto sub = size_of_expr (array_type.element_type (), ns);
@@ -316,7 +319,9 @@ optionalt<exprt> size_of_expr(const typet &type, const namespacet &ns)
316
319
auto bits = pointer_offset_bits (vector_type, ns);
317
320
318
321
if (bits.has_value ())
319
- return from_integer ((*bits + 7 ) / 8 , size_type ());
322
+ return from_integer (
323
+ (*bits + config.ansi_c .char_width - 1 ) / config.ansi_c .char_width ,
324
+ size_type ());
320
325
}
321
326
322
327
auto sub = size_of_expr (vector_type.element_type (), ns);
@@ -355,16 +360,16 @@ optionalt<exprt> size_of_expr(const typet &type, const namespacet &ns)
355
360
{
356
361
std::size_t w = to_c_bit_field_type (c.type ()).get_width ();
357
362
bit_field_bits += w;
358
- const std::size_t bytes = bit_field_bits / 8 ;
359
- bit_field_bits %= 8 ;
363
+ const std::size_t bytes = bit_field_bits / config. ansi_c . char_width ;
364
+ bit_field_bits %= config. ansi_c . char_width ;
360
365
if (bytes > 0 )
361
366
result = plus_exprt (result, from_integer (bytes, result.type ()));
362
367
}
363
368
else if (c.type ().id () == ID_bool)
364
369
{
365
370
++bit_field_bits;
366
- const std::size_t bytes = bit_field_bits / 8 ;
367
- bit_field_bits %= 8 ;
371
+ const std::size_t bytes = bit_field_bits / config. ansi_c . char_width ;
372
+ bit_field_bits %= config. ansi_c . char_width ;
368
373
if (bytes > 0 )
369
374
result = plus_exprt (result, from_integer (bytes, result.type ()));
370
375
}
@@ -415,7 +420,8 @@ optionalt<exprt> size_of_expr(const typet &type, const namespacet &ns)
415
420
}
416
421
else
417
422
{
418
- mp_integer sub_bytes = (*sub_bits + 7 ) / 8 ;
423
+ mp_integer sub_bytes =
424
+ (*sub_bits + config.ansi_c .char_width - 1 ) / config.ansi_c .char_width ;
419
425
420
426
if (max_bytes>=0 )
421
427
{
@@ -449,19 +455,14 @@ optionalt<exprt> size_of_expr(const typet &type, const namespacet &ns)
449
455
type.id ()==ID_c_bit_field)
450
456
{
451
457
std::size_t width=to_bitvector_type (type).get_width ();
452
- std::size_t bytes= width/ 8 ;
453
- if (bytes* 8 != width)
458
+ std::size_t bytes = width / config. ansi_c . char_width ;
459
+ if (bytes * config. ansi_c . char_width != width)
454
460
bytes++;
455
461
return from_integer (bytes, size_type ());
456
462
}
457
463
else if (type.id ()==ID_c_enum)
458
464
{
459
- std::size_t width =
460
- to_bitvector_type (to_c_enum_type (type).underlying_type ()).get_width ();
461
- std::size_t bytes=width/8 ;
462
- if (bytes*8 !=width)
463
- bytes++;
464
- return from_integer (bytes, size_type ());
465
+ return size_of_expr (to_c_enum_type (type).underlying_type (), ns);
465
466
}
466
467
else if (type.id ()==ID_c_enum_tag)
467
468
{
@@ -475,11 +476,11 @@ optionalt<exprt> size_of_expr(const typet &type, const namespacet &ns)
475
476
{
476
477
// the following is an MS extension
477
478
if (type.get_bool (ID_C_ptr32))
478
- return from_integer (4 , size_type ());
479
+ return from_integer (32 / config. ansi_c . char_width , size_type ());
479
480
480
481
std::size_t width=to_bitvector_type (type).get_width ();
481
- std::size_t bytes= width/ 8 ;
482
- if (bytes* 8 != width)
482
+ std::size_t bytes = width / config. ansi_c . char_width ;
483
+ if (bytes * config. ansi_c . char_width != width)
483
484
bytes++;
484
485
return from_integer (bytes, size_type ());
485
486
}
@@ -497,7 +498,7 @@ optionalt<exprt> size_of_expr(const typet &type, const namespacet &ns)
497
498
}
498
499
else if (type.id ()==ID_string)
499
500
{
500
- return from_integer (32 / 8 , size_type ());
501
+ return from_integer (32 / config. ansi_c . char_width , size_type ());
501
502
}
502
503
else
503
504
return {};
@@ -607,12 +608,17 @@ optionalt<exprt> get_subexpression_at_offset(
607
608
// if this member completely contains the target, and this member is
608
609
// byte-aligned, recurse into it
609
610
if (
610
- offset_bytes * 8 >= m_offset_bits && m_offset_bits % 8 == 0 &&
611
- offset_bytes * 8 + *target_size_bits <= m_offset_bits + *m_size_bits)
611
+ offset_bytes * config.ansi_c .char_width >= m_offset_bits &&
612
+ m_offset_bits % config.ansi_c .char_width == 0 &&
613
+ offset_bytes * config.ansi_c .char_width + *target_size_bits <=
614
+ m_offset_bits + *m_size_bits)
612
615
{
613
616
const member_exprt member (expr, component.get_name (), component.type ());
614
617
return get_subexpression_at_offset (
615
- member, offset_bytes - m_offset_bits / 8 , target_type_raw, ns);
618
+ member,
619
+ offset_bytes - m_offset_bits / config.ansi_c .char_width ,
620
+ target_type_raw,
621
+ ns);
616
622
}
617
623
618
624
m_offset_bits += *m_size_bits;
@@ -628,11 +634,14 @@ optionalt<exprt> get_subexpression_at_offset(
628
634
// no arrays of non-byte-aligned, zero-, or unknown-sized objects
629
635
if (
630
636
elem_size_bits.has_value () && *elem_size_bits > 0 &&
631
- *elem_size_bits % 8 == 0 && *target_size_bits <= *elem_size_bits)
637
+ *elem_size_bits % config.ansi_c .char_width == 0 &&
638
+ *target_size_bits <= *elem_size_bits)
632
639
{
633
- const mp_integer elem_size_bytes = *elem_size_bits / 8 ;
640
+ const mp_integer elem_size_bytes =
641
+ *elem_size_bits / config.ansi_c .char_width ;
634
642
const auto offset_inside_elem = offset_bytes % elem_size_bytes;
635
- const auto target_size_bytes = *target_size_bits / 8 ;
643
+ const auto target_size_bytes =
644
+ *target_size_bits / config.ansi_c .char_width ;
636
645
// only recurse if the cell completely contains the target
637
646
if (offset_inside_elem + target_size_bytes <= elem_size_bytes)
638
647
{
@@ -660,7 +669,9 @@ optionalt<exprt> get_subexpression_at_offset(
660
669
continue ;
661
670
662
671
// if this member completely contains the target, recurse into it
663
- if (offset_bytes * 8 + *target_size_bits <= *m_size_bits)
672
+ if (
673
+ offset_bytes * config.ansi_c .char_width + *target_size_bits <=
674
+ *m_size_bits)
664
675
{
665
676
const member_exprt member (expr, component.get_name (), component.type ());
666
677
return get_subexpression_at_offset (
0 commit comments