1414#include " arith_tools.h"
1515#include " byte_operators.h"
1616#include " c_types.h"
17+ #include " config.h"
1718#include " invariant.h"
1819#include " namespace.h"
1920#include " pointer_expr.h"
@@ -38,14 +39,14 @@ optionalt<mp_integer> member_offset(
3839 {
3940 const std::size_t w = to_c_bit_field_type (comp.type ()).get_width ();
4041 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 ;
4344 }
4445 else if (comp.type ().id () == ID_bool)
4546 {
4647 ++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 ;
4950 }
5051 else
5152 {
@@ -92,7 +93,7 @@ pointer_offset_size(const typet &type, const namespacet &ns)
9293 auto bits = pointer_offset_bits (type, ns);
9394
9495 if (bits.has_value ())
95- return (*bits + 7 ) / 8 ;
96+ return (*bits + config. ansi_c . char_width - 1 ) / config. ansi_c . char_width ;
9697 else
9798 return {};
9899}
@@ -249,16 +250,16 @@ optionalt<exprt> member_offset_expr(
249250 {
250251 std::size_t w = to_c_bit_field_type (c.type ()).get_width ();
251252 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 ;
254255 if (bytes > 0 )
255256 result = plus_exprt (result, from_integer (bytes, result.type ()));
256257 }
257258 else if (c.type ().id () == ID_bool)
258259 {
259260 ++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 ;
262263 if (bytes > 0 )
263264 result = plus_exprt (result, from_integer (bytes, result.type ()));
264265 }
@@ -289,7 +290,9 @@ optionalt<exprt> size_of_expr(const typet &type, const namespacet &ns)
289290 auto bits = pointer_offset_bits (array_type, ns);
290291
291292 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 ());
293296 }
294297
295298 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)
316319 auto bits = pointer_offset_bits (vector_type, ns);
317320
318321 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 ());
320325 }
321326
322327 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)
355360 {
356361 std::size_t w = to_c_bit_field_type (c.type ()).get_width ();
357362 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 ;
360365 if (bytes > 0 )
361366 result = plus_exprt (result, from_integer (bytes, result.type ()));
362367 }
363368 else if (c.type ().id () == ID_bool)
364369 {
365370 ++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 ;
368373 if (bytes > 0 )
369374 result = plus_exprt (result, from_integer (bytes, result.type ()));
370375 }
@@ -415,7 +420,8 @@ optionalt<exprt> size_of_expr(const typet &type, const namespacet &ns)
415420 }
416421 else
417422 {
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 ;
419425
420426 if (max_bytes>=0 )
421427 {
@@ -449,19 +455,14 @@ optionalt<exprt> size_of_expr(const typet &type, const namespacet &ns)
449455 type.id ()==ID_c_bit_field)
450456 {
451457 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)
454460 bytes++;
455461 return from_integer (bytes, size_type ());
456462 }
457463 else if (type.id ()==ID_c_enum)
458464 {
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);
465466 }
466467 else if (type.id ()==ID_c_enum_tag)
467468 {
@@ -475,11 +476,11 @@ optionalt<exprt> size_of_expr(const typet &type, const namespacet &ns)
475476 {
476477 // the following is an MS extension
477478 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 ());
479480
480481 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)
483484 bytes++;
484485 return from_integer (bytes, size_type ());
485486 }
@@ -497,7 +498,7 @@ optionalt<exprt> size_of_expr(const typet &type, const namespacet &ns)
497498 }
498499 else if (type.id ()==ID_string)
499500 {
500- return from_integer (32 / 8 , size_type ());
501+ return from_integer (32 / config. ansi_c . char_width , size_type ());
501502 }
502503 else
503504 return {};
@@ -607,12 +608,17 @@ optionalt<exprt> get_subexpression_at_offset(
607608 // if this member completely contains the target, and this member is
608609 // byte-aligned, recurse into it
609610 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)
612615 {
613616 const member_exprt member (expr, component.get_name (), component.type ());
614617 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);
616622 }
617623
618624 m_offset_bits += *m_size_bits;
@@ -628,11 +634,14 @@ optionalt<exprt> get_subexpression_at_offset(
628634 // no arrays of non-byte-aligned, zero-, or unknown-sized objects
629635 if (
630636 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)
632639 {
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 ;
634642 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 ;
636645 // only recurse if the cell completely contains the target
637646 if (offset_inside_elem + target_size_bytes <= elem_size_bytes)
638647 {
@@ -660,7 +669,9 @@ optionalt<exprt> get_subexpression_at_offset(
660669 continue ;
661670
662671 // 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)
664675 {
665676 const member_exprt member (expr, component.get_name (), component.type ());
666677 return get_subexpression_at_offset (
0 commit comments