Skip to content

Commit c99f785

Browse files
committed
Fix binary size computation for binary-size=2-4-8
1 parent 480b5fd commit c99f785

File tree

4 files changed

+169
-99
lines changed

4 files changed

+169
-99
lines changed

NEWS

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,18 @@ NEWS - user visible changes -*- outline -*-
3333
patterns where invalid numerical data (e.g, SPACES) encode "absent"
3434
data
3535

36+
** #NNN: dialects without support of single byte binary data
37+
will now generate at least 2 bytes of storage for COMP-5 elements; this
38+
applies to all non-standard dialects but GnuCOBOL (default) and Micro Focus;
39+
that changes the group length of records containing elements with less than
40+
3 digits and also passes different sizes via CALL, which may need program
41+
adjustments.
42+
43+
** -std=acu / -std=acu-strict now generate BINARY and COMP-5 with at least
44+
2 bytes of storage; the comment for #NNN above applies; if you want
45+
to still use the sizes used since GnuCOBOL 2.2 with those dialects:
46+
add -fbinary-size=1-2-4-8 to your compile options
47+
3648
* Important Bugfixes
3749

3850
** #904: MOVE PACKED-DECIMAL unsigned to signed led to bad sign

cobc/ChangeLog

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
11

2+
2024-10-29 Simon Sobisch <[email protected]>
3+
4+
* field.c (validate_elementary_item): only set flag_real_binary for
5+
BINARY-CHAR/BINARY-SHORT/BINARY-LONG/BINARY-DOUBLE
6+
* codegenc (output_attr): generate COB_FLAG_REAL_BINARY also for COMP-5
7+
28
2024-10-02 Simon Sobisch <[email protected]>
39

410
* pplex.l (output_line_directive): extracted from other places and

cobc/codegen.c

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1630,27 +1630,28 @@ output_attr (const cb_tree x)
16301630
if (f->flag_binary_swap) {
16311631
flags |= COB_FLAG_BINARY_SWAP;
16321632
}
1633-
if (f->flag_real_binary) {
1633+
if (f->flag_real_binary
1634+
|| f->usage == CB_USAGE_COMP_5) {
16341635
flags |= COB_FLAG_REAL_BINARY;
16351636
}
16361637
if (f->flag_is_pointer) {
16371638
flags |= COB_FLAG_IS_POINTER;
16381639
}
1639-
if (cb_binary_truncate &&
1640-
f->usage == CB_USAGE_BINARY &&
1641-
!f->flag_real_binary) {
1640+
if (cb_binary_truncate
1641+
&& f->usage == CB_USAGE_BINARY
1642+
&& !f->flag_real_binary) {
16421643
flags |= COB_FLAG_BINARY_TRUNC;
16431644
}
16441645

1645-
if (type == COB_TYPE_NUMERIC_BINARY
1646-
&& f->usage == CB_USAGE_INDEX) {
1647-
flags |= COB_FLAG_REAL_BINARY;
1648-
type = COB_TYPE_NUMERIC_COMP5;
1649-
} else
1650-
if (type == COB_TYPE_NUMERIC_BINARY
1651-
&& (f->flag_binary_swap || f->flag_real_binary)
1652-
&& (f->flag_indexed_by || f->index_type || f->flag_internal_register)) {
1653-
type = COB_TYPE_NUMERIC_COMP5;
1646+
if (type == COB_TYPE_NUMERIC_BINARY) {
1647+
if (f->usage == CB_USAGE_INDEX) {
1648+
flags |= COB_FLAG_REAL_BINARY;
1649+
type = COB_TYPE_NUMERIC_COMP5;
1650+
} else
1651+
if ((f->flag_binary_swap || f->flag_real_binary)
1652+
&& (f->flag_indexed_by || f->index_type || f->flag_internal_register)) {
1653+
type = COB_TYPE_NUMERIC_COMP5;
1654+
}
16541655
}
16551656
switch (f->usage) {
16561657
case CB_USAGE_COMP_6:

tests/testsuite.src/data_binary.at

Lines changed: 137 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -2267,6 +2267,57 @@ AT_CHECK([$COBCRUN_DIRECT ./prog], [0], [], [])
22672267
AT_CLEANUP
22682268

22692269

2270+
AT_SETUP([Fixed BINARY size])
2271+
AT_KEYWORDS([binary])
2272+
2273+
AT_DATA([prog.cob], [
2274+
IDENTIFICATION DIVISION.
2275+
PROGRAM-ID. prog.
2276+
2277+
DATA DIVISION.
2278+
WORKING-STORAGE SECTION.
2279+
01 WS-BCS BINARY-CHAR SIGNED.
2280+
01 WS-BCU BINARY-CHAR UNSIGNED.
2281+
01 WS-BSS BINARY-SHORT SIGNED.
2282+
01 WS-BSU BINARY-SHORT UNSIGNED.
2283+
01 WS-BLS BINARY-LONG SIGNED.
2284+
01 WS-BLU BINARY-LONG UNSIGNED.
2285+
01 WS-BDS BINARY-DOUBLE SIGNED.
2286+
01 WS-BDU BINARY-DOUBLE UNSIGNED.
2287+
2288+
PROCEDURE DIVISION.
2289+
MAIN.
2290+
IF BYTE-LENGTH(WS-BCS) <> 1
2291+
DISPLAY "BAD BINARY-CHAR SIGNED".
2292+
IF BYTE-LENGTH(WS-BCU) <> 1
2293+
DISPLAY "BAD BINARY-CHAR UNSIGNED".
2294+
IF BYTE-LENGTH(WS-BSS) <> 2
2295+
DISPLAY "BAD BINARY-SHORT SIGNED".
2296+
IF BYTE-LENGTH(WS-BSU) <> 2
2297+
DISPLAY "BAD BINARY-SHORT UNSIGNED".
2298+
IF BYTE-LENGTH(WS-BLS) <> 4
2299+
DISPLAY "BAD BINARY-LONG SIGNED".
2300+
IF BYTE-LENGTH(WS-BLU) <> 4
2301+
DISPLAY "BAD BINARY-LONG UNSIGNED".
2302+
IF BYTE-LENGTH(WS-BDS) <> 8
2303+
DISPLAY "BAD BINARY-DOUBLE SIGNED".
2304+
IF BYTE-LENGTH(WS-BDU) <> 8
2305+
DISPLAY "BAD BINARY-DOUBLE UNSIGNED".
2306+
STOP RUN.
2307+
])
2308+
2309+
AT_CHECK([$COMPILE -fintrinsics=ALL -Wno-constant-expression -fbinary-size=1-2-4-8 prog.cob], [0], [], [])
2310+
AT_CHECK([$COBCRUN_DIRECT ./prog], [0], [], [])
2311+
2312+
AT_CHECK([$COMPILE -fintrinsics=ALL -Wno-constant-expression -fbinary-size=2-4-8 prog.cob], [0], [], [])
2313+
AT_CHECK([$COBCRUN_DIRECT ./prog], [0], [], [])
2314+
2315+
AT_CHECK([$COMPILE -fintrinsics=ALL -Wno-constant-expression -fbinary-size=1--8 prog.cob], [0], [], [])
2316+
AT_CHECK([$COBCRUN_DIRECT ./prog], [0], [], [])
2317+
2318+
AT_CLEANUP
2319+
2320+
22702321
AT_SETUP([COMP-5 binary size])
22712322
AT_KEYWORDS([binary])
22722323

@@ -2355,86 +2406,86 @@ AT_DATA([prog.cob], [
23552406

23562407
PROCEDURE DIVISION.
23572408
MAIN.
2358-
DISPLAY "V9(1): " FUNCTION BYTE-LENGTH (WS-1).
2359-
DISPLAY "V9(2): " FUNCTION BYTE-LENGTH (WS-2).
2360-
DISPLAY "V9(3): " FUNCTION BYTE-LENGTH (WS-3).
2361-
DISPLAY "V9(4): " FUNCTION BYTE-LENGTH (WS-4).
2362-
DISPLAY "V9(5): " FUNCTION BYTE-LENGTH (WS-5).
2363-
DISPLAY "V9(6): " FUNCTION BYTE-LENGTH (WS-6).
2364-
DISPLAY "V9(7): " FUNCTION BYTE-LENGTH (WS-7).
2365-
DISPLAY "V9(8): " FUNCTION BYTE-LENGTH (WS-8).
2366-
DISPLAY "V9(9): " FUNCTION BYTE-LENGTH (WS-9).
2367-
DISPLAY "V9(10): " FUNCTION BYTE-LENGTH (WS-10).
2368-
DISPLAY "V9(11): " FUNCTION BYTE-LENGTH (WS-11).
2369-
DISPLAY "V9(12): " FUNCTION BYTE-LENGTH (WS-12).
2370-
DISPLAY "V9(13): " FUNCTION BYTE-LENGTH (WS-13).
2371-
DISPLAY "V9(14): " FUNCTION BYTE-LENGTH (WS-14).
2372-
DISPLAY "V9(15): " FUNCTION BYTE-LENGTH (WS-15).
2373-
DISPLAY "V9(16): " FUNCTION BYTE-LENGTH (WS-16).
2374-
DISPLAY "V9(17): " FUNCTION BYTE-LENGTH (WS-17).
2375-
DISPLAY "V9(18): " FUNCTION BYTE-LENGTH (WS-18).
2376-
2377-
DISPLAY "VPP9(1): " FUNCTION BYTE-LENGTH (WS-P1).
2378-
DISPLAY "VPP9(2): " FUNCTION BYTE-LENGTH (WS-P2).
2379-
DISPLAY "VPP9(3): " FUNCTION BYTE-LENGTH (WS-P3).
2380-
DISPLAY "VPP9(4): " FUNCTION BYTE-LENGTH (WS-P4).
2381-
DISPLAY "VPP9(5): " FUNCTION BYTE-LENGTH (WS-P5).
2382-
DISPLAY "VPP9(6): " FUNCTION BYTE-LENGTH (WS-P6).
2383-
DISPLAY "VPP9(7): " FUNCTION BYTE-LENGTH (WS-P7).
2384-
DISPLAY "VPP9(8): " FUNCTION BYTE-LENGTH (WS-P8).
2385-
DISPLAY "VPP9(9): " FUNCTION BYTE-LENGTH (WS-P9).
2386-
DISPLAY "VPP9(10): " FUNCTION BYTE-LENGTH (WS-P10).
2387-
DISPLAY "VPP9(11): " FUNCTION BYTE-LENGTH (WS-P11).
2388-
DISPLAY "VPP9(12): " FUNCTION BYTE-LENGTH (WS-P12).
2389-
DISPLAY "VPP9(13): " FUNCTION BYTE-LENGTH (WS-P13).
2390-
DISPLAY "VPP9(14): " FUNCTION BYTE-LENGTH (WS-P14).
2391-
DISPLAY "VPP9(15): " FUNCTION BYTE-LENGTH (WS-P15).
2392-
DISPLAY "VPP9(16): " FUNCTION BYTE-LENGTH (WS-P16).
2393-
DISPLAY "VPP9(17): " FUNCTION BYTE-LENGTH (WS-P17).
2394-
DISPLAY "VPP9(18): " FUNCTION BYTE-LENGTH (WS-P18).
2395-
2396-
DISPLAY "SV9(1): " FUNCTION BYTE-LENGTH (WS-S1).
2397-
DISPLAY "SV9(2): " FUNCTION BYTE-LENGTH (WS-S2).
2398-
DISPLAY "SV9(3): " FUNCTION BYTE-LENGTH (WS-S3).
2399-
DISPLAY "SV9(4): " FUNCTION BYTE-LENGTH (WS-S4).
2400-
DISPLAY "SV9(5): " FUNCTION BYTE-LENGTH (WS-S5).
2401-
DISPLAY "SV9(6): " FUNCTION BYTE-LENGTH (WS-S6).
2402-
DISPLAY "SV9(7): " FUNCTION BYTE-LENGTH (WS-S7).
2403-
DISPLAY "SV9(8): " FUNCTION BYTE-LENGTH (WS-S8).
2404-
DISPLAY "SV9(9): " FUNCTION BYTE-LENGTH (WS-S9).
2405-
DISPLAY "SV9(10): " FUNCTION BYTE-LENGTH (WS-S10).
2406-
DISPLAY "SV9(11): " FUNCTION BYTE-LENGTH (WS-S11).
2407-
DISPLAY "SV9(12): " FUNCTION BYTE-LENGTH (WS-S12).
2408-
DISPLAY "SV9(13): " FUNCTION BYTE-LENGTH (WS-S13).
2409-
DISPLAY "SV9(14): " FUNCTION BYTE-LENGTH (WS-S14).
2410-
DISPLAY "SV9(15): " FUNCTION BYTE-LENGTH (WS-S15).
2411-
DISPLAY "SV9(16): " FUNCTION BYTE-LENGTH (WS-S16).
2412-
DISPLAY "SV9(17): " FUNCTION BYTE-LENGTH (WS-S17).
2413-
DISPLAY "SV9(18): " FUNCTION BYTE-LENGTH (WS-S18).
2414-
2415-
DISPLAY "SVPP9(1): " FUNCTION BYTE-LENGTH (WS-SP1).
2416-
DISPLAY "SVPP9(2): " FUNCTION BYTE-LENGTH (WS-SP2).
2417-
DISPLAY "SVPP9(3): " FUNCTION BYTE-LENGTH (WS-SP3).
2418-
DISPLAY "SVPP9(4): " FUNCTION BYTE-LENGTH (WS-SP4).
2419-
DISPLAY "SVPP9(5): " FUNCTION BYTE-LENGTH (WS-SP5).
2420-
DISPLAY "SVPP9(6): " FUNCTION BYTE-LENGTH (WS-SP6).
2421-
DISPLAY "SVPP9(7): " FUNCTION BYTE-LENGTH (WS-SP7).
2422-
DISPLAY "SVPP9(8): " FUNCTION BYTE-LENGTH (WS-SP8).
2423-
DISPLAY "SVPP9(9): " FUNCTION BYTE-LENGTH (WS-SP9).
2424-
DISPLAY "SVPP9(10): " FUNCTION BYTE-LENGTH (WS-SP10).
2425-
DISPLAY "SVPP9(11): " FUNCTION BYTE-LENGTH (WS-SP11).
2426-
DISPLAY "SVPP9(12): " FUNCTION BYTE-LENGTH (WS-SP12).
2427-
DISPLAY "SVPP9(13): " FUNCTION BYTE-LENGTH (WS-SP13).
2428-
DISPLAY "SVPP9(14): " FUNCTION BYTE-LENGTH (WS-SP14).
2429-
DISPLAY "SVPP9(15): " FUNCTION BYTE-LENGTH (WS-SP15).
2430-
DISPLAY "SVPP9(16): " FUNCTION BYTE-LENGTH (WS-SP16).
2431-
DISPLAY "SVPP9(17): " FUNCTION BYTE-LENGTH (WS-SP17).
2432-
DISPLAY "SVPP9(18): " FUNCTION BYTE-LENGTH (WS-SP18).
2409+
DISPLAY "V9(1): " BYTE-LENGTH (WS-1).
2410+
DISPLAY "V9(2): " BYTE-LENGTH (WS-2).
2411+
DISPLAY "V9(3): " BYTE-LENGTH (WS-3).
2412+
DISPLAY "V9(4): " BYTE-LENGTH (WS-4).
2413+
DISPLAY "V9(5): " BYTE-LENGTH (WS-5).
2414+
DISPLAY "V9(6): " BYTE-LENGTH (WS-6).
2415+
DISPLAY "V9(7): " BYTE-LENGTH (WS-7).
2416+
DISPLAY "V9(8): " BYTE-LENGTH (WS-8).
2417+
DISPLAY "V9(9): " BYTE-LENGTH (WS-9).
2418+
DISPLAY "V9(10): " BYTE-LENGTH (WS-10).
2419+
DISPLAY "V9(11): " BYTE-LENGTH (WS-11).
2420+
DISPLAY "V9(12): " BYTE-LENGTH (WS-12).
2421+
DISPLAY "V9(13): " BYTE-LENGTH (WS-13).
2422+
DISPLAY "V9(14): " BYTE-LENGTH (WS-14).
2423+
DISPLAY "V9(15): " BYTE-LENGTH (WS-15).
2424+
DISPLAY "V9(16): " BYTE-LENGTH (WS-16).
2425+
DISPLAY "V9(17): " BYTE-LENGTH (WS-17).
2426+
DISPLAY "V9(18): " BYTE-LENGTH (WS-18).
2427+
2428+
DISPLAY "VPP9(1): " BYTE-LENGTH (WS-P1).
2429+
DISPLAY "VPP9(2): " BYTE-LENGTH (WS-P2).
2430+
DISPLAY "VPP9(3): " BYTE-LENGTH (WS-P3).
2431+
DISPLAY "VPP9(4): " BYTE-LENGTH (WS-P4).
2432+
DISPLAY "VPP9(5): " BYTE-LENGTH (WS-P5).
2433+
DISPLAY "VPP9(6): " BYTE-LENGTH (WS-P6).
2434+
DISPLAY "VPP9(7): " BYTE-LENGTH (WS-P7).
2435+
DISPLAY "VPP9(8): " BYTE-LENGTH (WS-P8).
2436+
DISPLAY "VPP9(9): " BYTE-LENGTH (WS-P9).
2437+
DISPLAY "VPP9(10): " BYTE-LENGTH (WS-P10).
2438+
DISPLAY "VPP9(11): " BYTE-LENGTH (WS-P11).
2439+
DISPLAY "VPP9(12): " BYTE-LENGTH (WS-P12).
2440+
DISPLAY "VPP9(13): " BYTE-LENGTH (WS-P13).
2441+
DISPLAY "VPP9(14): " BYTE-LENGTH (WS-P14).
2442+
DISPLAY "VPP9(15): " BYTE-LENGTH (WS-P15).
2443+
DISPLAY "VPP9(16): " BYTE-LENGTH (WS-P16).
2444+
DISPLAY "VPP9(17): " BYTE-LENGTH (WS-P17).
2445+
DISPLAY "VPP9(18): " BYTE-LENGTH (WS-P18).
2446+
2447+
DISPLAY "SV9(1): " BYTE-LENGTH (WS-S1).
2448+
DISPLAY "SV9(2): " BYTE-LENGTH (WS-S2).
2449+
DISPLAY "SV9(3): " BYTE-LENGTH (WS-S3).
2450+
DISPLAY "SV9(4): " BYTE-LENGTH (WS-S4).
2451+
DISPLAY "SV9(5): " BYTE-LENGTH (WS-S5).
2452+
DISPLAY "SV9(6): " BYTE-LENGTH (WS-S6).
2453+
DISPLAY "SV9(7): " BYTE-LENGTH (WS-S7).
2454+
DISPLAY "SV9(8): " BYTE-LENGTH (WS-S8).
2455+
DISPLAY "SV9(9): " BYTE-LENGTH (WS-S9).
2456+
DISPLAY "SV9(10): " BYTE-LENGTH (WS-S10).
2457+
DISPLAY "SV9(11): " BYTE-LENGTH (WS-S11).
2458+
DISPLAY "SV9(12): " BYTE-LENGTH (WS-S12).
2459+
DISPLAY "SV9(13): " BYTE-LENGTH (WS-S13).
2460+
DISPLAY "SV9(14): " BYTE-LENGTH (WS-S14).
2461+
DISPLAY "SV9(15): " BYTE-LENGTH (WS-S15).
2462+
DISPLAY "SV9(16): " BYTE-LENGTH (WS-S16).
2463+
DISPLAY "SV9(17): " BYTE-LENGTH (WS-S17).
2464+
DISPLAY "SV9(18): " BYTE-LENGTH (WS-S18).
2465+
2466+
DISPLAY "SVPP9(1): " BYTE-LENGTH (WS-SP1).
2467+
DISPLAY "SVPP9(2): " BYTE-LENGTH (WS-SP2).
2468+
DISPLAY "SVPP9(3): " BYTE-LENGTH (WS-SP3).
2469+
DISPLAY "SVPP9(4): " BYTE-LENGTH (WS-SP4).
2470+
DISPLAY "SVPP9(5): " BYTE-LENGTH (WS-SP5).
2471+
DISPLAY "SVPP9(6): " BYTE-LENGTH (WS-SP6).
2472+
DISPLAY "SVPP9(7): " BYTE-LENGTH (WS-SP7).
2473+
DISPLAY "SVPP9(8): " BYTE-LENGTH (WS-SP8).
2474+
DISPLAY "SVPP9(9): " BYTE-LENGTH (WS-SP9).
2475+
DISPLAY "SVPP9(10): " BYTE-LENGTH (WS-SP10).
2476+
DISPLAY "SVPP9(11): " BYTE-LENGTH (WS-SP11).
2477+
DISPLAY "SVPP9(12): " BYTE-LENGTH (WS-SP12).
2478+
DISPLAY "SVPP9(13): " BYTE-LENGTH (WS-SP13).
2479+
DISPLAY "SVPP9(14): " BYTE-LENGTH (WS-SP14).
2480+
DISPLAY "SVPP9(15): " BYTE-LENGTH (WS-SP15).
2481+
DISPLAY "SVPP9(16): " BYTE-LENGTH (WS-SP16).
2482+
DISPLAY "SVPP9(17): " BYTE-LENGTH (WS-SP17).
2483+
DISPLAY "SVPP9(18): " BYTE-LENGTH (WS-SP18).
24332484

24342485
STOP RUN.
24352486
])
24362487

2437-
AT_CHECK([$COMPILE -fbinary-size=1-2-4-8 prog.cob], [0], [], [])
2488+
AT_CHECK([$COMPILE -fintrinsics=ALL -fbinary-size=1-2-4-8 prog.cob], [0], [], [])
24382489
AT_CHECK([$COBCRUN_DIRECT ./prog], [0],
24392490
[V9(1): 1
24402491
V9(2): 1
@@ -2510,10 +2561,10 @@ SVPP9(17): 8
25102561
SVPP9(18): 8
25112562
], [])
25122563

2513-
AT_CHECK([$COMPILE -fbinary-size=2-4-8 prog.cob], [0], [], [])
2564+
AT_CHECK([$COMPILE -fintrinsics=ALL -fbinary-size=2-4-8 prog.cob], [0], [], [])
25142565
AT_CHECK([$COBCRUN_DIRECT ./prog], [0],
2515-
[V9(1): 1
2516-
V9(2): 1
2566+
[V9(1): 2
2567+
V9(2): 2
25172568
V9(3): 2
25182569
V9(4): 2
25192570
V9(5): 4
@@ -2530,8 +2581,8 @@ V9(15): 8
25302581
V9(16): 8
25312582
V9(17): 8
25322583
V9(18): 8
2533-
VPP9(1): 1
2534-
VPP9(2): 1
2584+
VPP9(1): 2
2585+
VPP9(2): 2
25352586
VPP9(3): 2
25362587
VPP9(4): 2
25372588
VPP9(5): 4
@@ -2548,8 +2599,8 @@ VPP9(15): 8
25482599
VPP9(16): 8
25492600
VPP9(17): 8
25502601
VPP9(18): 8
2551-
SV9(1): 1
2552-
SV9(2): 1
2602+
SV9(1): 2
2603+
SV9(2): 2
25532604
SV9(3): 2
25542605
SV9(4): 2
25552606
SV9(5): 4
@@ -2566,8 +2617,8 @@ SV9(15): 8
25662617
SV9(16): 8
25672618
SV9(17): 8
25682619
SV9(18): 8
2569-
SVPP9(1): 1
2570-
SVPP9(2): 1
2620+
SVPP9(1): 2
2621+
SVPP9(2): 2
25712622
SVPP9(3): 2
25722623
SVPP9(4): 2
25732624
SVPP9(5): 4
@@ -2586,7 +2637,7 @@ SVPP9(17): 8
25862637
SVPP9(18): 8
25872638
], [])
25882639

2589-
AT_CHECK([$COMPILE -fbinary-size=1--8 prog.cob], [0], [], [])
2640+
AT_CHECK([$COMPILE -fintrinsics=ALL -fbinary-size=1--8 prog.cob], [0], [], [])
25902641
AT_CHECK([$COBCRUN_DIRECT ./prog], [0],
25912642
[V9(1): 1
25922643
V9(2): 1

0 commit comments

Comments
 (0)