C/C++

C/C++

C/C++

Your one-stop destination to learn and collaborate about the latest innovations in IBM C/C++ for z/OS compilers to develop high-performing C/C++ applications and system programs on z/OS while maximizing hardware use and improving application performance.

 View Only
  • 1.  Metal C - Assembler failing when I have my own #pragma prolog/epilog

    Posted Mon July 06, 2020 12:37 AM

    I have a Metal C program where I am trying to add some static data to the global area via an __asm("…" : DS(staticdata)) statement, but I am having some issues with the generated assembler code.

     

    When I use my own prolog and epilog code, I get:

     

    0007E6                00000 009A8  1997 CKKTESTR CSECT ,                                                         000000

    0007E8                             1998 $STATIC  DS    0D                                                        000000

    0007E8 0000000000000000            1999          DC    (336)X'00'                                                000000

    000938                00938 00828  2000          ORG   $STATIC+64                                                000000

    000828 0000000100000030            2001          DC    XL8'0000000100000030'                                     000000

    000830                00830 00830  2002          ORG   $STATIC+72                                                000000

    000830 F2F1C3E2D9C5C3D7            2003          DC    XL8'F2F1C3E2D9C5C3D7'                                     000000

    000838                00838 007F8  2004          ORG   $STATIC+16                                                000000

    0007F8 C5E2C54000000001            2005          DC    XL16'C5E2C540000000010000000100000090'                    000000

    000808 0000009000000020            2006          DC    XL16'0000009000000020C5E2C3C100000001'                    000000

    000818 0000000100000080            2007          DC    XL16'00000001000000800000008000000014'                    000000

    000828                00828 007E8  2008          ORG   $STATIC                                                   000000

    0007E8 00010000                    2009          DC    XL4'00010000'                                             000000

    0007EC                007EC 007EC  2010          ORG   $STATIC+4                                                 000000

    0007EC F2F1C3E200000000            2011          DC    XL12'F2F1C3E2000000007FFFFBAD'                            000000

    0007F8                007F8 00938  2012          ORG   ,                                                         000000

                                       2013          LCLC  &DSMAC                                                    000000

                                       2014          LCLA  &DSSIZE                                                   000000

                                       2015          LCLA  &MSIZE                                                    000000

    000938                00938 00838  2016          ORG   $STATIC+80                                                000000

                          00838        2017 @@LAB@3  EQU   *                                                         000000

    000838                             2018          DS    0D                      Start copyright text on a         000000

                          00838        2019 TheESET  EQU   *                       Address of the ESES               000000

    000838 F2F1C3E2                    2020          DC    CL4'21CSESES'           Control block eyecatcher          000000

                                       2021 *.DC.F'1'.Control block version                                          000000

                                       2022 *.DC.CL8'CKKTESTR'.CSECT name                                            000000

                                       2023 *.DC.CL8'HTES120'.FMID                                                   000000

                                       2024 *.DC.CL8'XXRMIDXX'.RMID                                                  000000

                                       2025 *.DC.CL8'21CS-TS1'.PID                                                   000000

                                       2026 *.DC.CL19'2020-07-04 02:25:21.816513'                                    000000

                                       2027 *.DC.CL5'    '.Pad with blanks                                           000000

                                       2028 *.DC.C'Copyright '.Copyright text                                        000000

                                       2029 *.DC.C'(C) Teracloud S.A. '.Copyright Teracloud S.A.                     000000

                                       2030 *.DC.C'1991,2001'.Insert the year(s)                                     000000

    000840                             2031 EndCKKModId DS 0D                      End of ESES and copyright         000000

                          00008        2032 @@LAB@3L EQU   *-@@LAB@3                                                 000000

                                       2033 &DSMAC   SETC  '@@LAB@3'                                                 000000

                                       2034 &DSSIZE  SETA  256                                                       000000

                                       2035 &MSIZE   SETA  @@LAB@3L                                                  000000

    ** ASMA032E Relocatable value or unresolved symbol found when absolute value required - OPENC/@@LAB@3L                

    ** ASMA435I Record 944 in SSAF.METALC.C.ASM(CKKTESTR) on volume: TSO001                                               

                                       2036          AIF   (&DSSIZE GE &MSIZE).@@OK@3                                000000

                                       2037 .@@OK@3  ANOP                                                            000000

     

    Record 944 is the "&MSIZE   SETA  @@LAB@3L" statement

     

    When I remove the #pragmas for the prologs and epilogs of the various routines in the module, I get very similar code, but it assembles cleanly (I renamed the program for expediency):

     

    0002AA                00000 0044A   850 CKKTESTP CSECT ,                                                         000000

    0002B0                              851 $STATIC  DS    0D                                                        000000

    0002B0 0000000000000000             852          DC    (336)X'00'                                                000000

    000400                00400 002F0   853          ORG   $STATIC+64                                                000000

    0002F0 0000000100000030             854          DC    XL8'0000000100000030'                                     000000

    0002F8                002F8 002F8   855          ORG   $STATIC+72                                                000000

    0002F8 F2F1C3E2D9C5C3D7             856          DC    XL8'F2F1C3E2D9C5C3D7'                                     000000

    000300                00300 002C0   857          ORG   $STATIC+16                                                000000

    0002C0 C5E2C54000000001             858          DC    XL16'C5E2C540000000010000000100000090'                    000000

    0002D0 0000009000000020             859          DC    XL16'0000009000000020C5E2C3C100000001'                    000000

    0002E0 0000000100000080             860          DC    XL16'00000001000000800000008000000014'                    000000

    0002F0                002F0 002B0   861          ORG   $STATIC                                                   000000

    0002B0 00010000                     862          DC    XL4'00010000'                                             000000

    0002B4                002B4 002B4   863          ORG   $STATIC+4                                                 000000

    0002B4 F2F1C3E200000000             864          DC    XL12'F2F1C3E2000000007FFFFBAD'                            000000

    0002C0                002C0 00400   865          ORG   ,                                                         000000

                                        866          LCLC  &DSMAC                                                    000000

                                        867          LCLA  &DSSIZE                                                   000000

                                        868          LCLA  &MSIZE                                                    000000

    000400                00400 00300   869          ORG   $STATIC+80                                                000000

                          00300         870 @@LAB@5  EQU   *                                                         000000

    000300                              871          DS    0D                      Start copyright text on a         000000

                          00300         872 TheESET  EQU   *                       Address of the ESES               000000

    000300 F2F1C3E2                     873          DC    CL4'21CSESES'           Control block eyecatcher          000000

                                        874 *.DC.F'1'.Control block version                                          000000

                                        875 *.DC.CL8'CKKTESTR'.CSECT name                                            000000

                                        876 *.DC.CL8'HTES120'.FMID                                                   000000

                                        877 *.DC.CL8'XXRMIDXX'.RMID                                                  000000

                                        878 *.DC.CL8'21CS-TS1'.PID                                                   000000

                                        879 *.DC.CL19'2020-07-04 02:25:21.816513'                                    000000

                                        880 *.DC.CL5'    '.Pad with blanks                                           000000

                                        881 *.DC.C'Copyright '.Copyright text                                        000000

                                        882 *.DC.C'(C) Teracloud S.A. '.Copyright Teracloud S.A.                     000000

                                        883 *.DC.C'1991,2001'.Insert the year(s)                                     000000

    000308                              884 EndCKKModId DS 0D                      End of ESES and copyright         000000

                          00008         885 @@LAB@5L EQU   *-@@LAB@5                                                 000000

                                        886 &DSMAC   SETC  '@@LAB@5'                                                 000000

                                        887 &DSSIZE  SETA  256                                                       000000

                                        888 &MSIZE   SETA  @@LAB@5L                                                  000000

                                        889          AIF   (&DSSIZE GE &MSIZE).@@OK@5                                000000

                                        890 .@@OK@5  ANOP                                                            000000

     

    In this case, the generated DS uses @@LAB@5 and the "&MSIZE SETA @@LAB@5L" assembles without error here.  Odd, because @@LAB@3L in the first program and @@LAB@5L in the second program evaluate to the same value:

     

                          00008        2032 @@LAB@3L EQU   *-@@LAB@3                                                 000000

    -----------------------------------------------------------------------------------------------------------------------

                          00008         885 @@LAB@5L EQU   *-@@LAB@5                                                 000000

     

    When I compare the two snippets (I removed the hex offsets and sequence information on the right, this is what I get:

     

    ====== CKKTESTR CSECT ,                                                                     

    .OAAAA CKKTESTP CSECT ,                                                                     

    000002 $STATIC  DS    0D                                                                    

    000003          DC    (336)X'00'                                                            

    000004          ORG   $STATIC+64                                                            

    000005          DC    XL8'0000000100000030'                                                 

    000006          ORG   $STATIC+72                                                             

    000007          DC    XL8'F2F1C3E2D9C5C3D7'                                                 

    000008          ORG   $STATIC+16                                                            

    000009          DC    XL16'C5E2C540000000010000000100000090'                                

    000010          DC    XL16'0000009000000020C5E2C3C100000001'                                

    000011          DC    XL16'00000001000000800000008000000014'                                

    000012          ORG   $STATIC                                                               

    000013          DC    XL4'00010000'                                                         

    000014          ORG   $STATIC+4                                                              

    000015          DC    XL12'F2F1C3E2000000007FFFFBAD'                                        

    000016          ORG   ,                                                                     

    000017          LCLC  &DSMAC                                                                 

    000018          LCLA  &DSSIZE                                                               

    000019          LCLA  &MSIZE                                                                

    000020          ORG   $STATIC+80                                                            

    ====== @@LAB@3  EQU   *                                                                     

    .OAAAB @@LAB@5  EQU   *                                                                     

    000022          DS    0D                      Start copyright text on a                     

    000023 TheESET  EQU   *                       Address of the ESES                           

    000024          DC    CL4'21CSESES'           Control block eyecatcher                       

    000025 *.DC.F'1'.Control block version                                                      

    000026 *.DC.CL8'CKKTESTR'.CSECT name                                                        

    000027 *.DC.CL8'HTES120'.FMID                                                                

    000028 *.DC.CL8'XXRMIDXX'.RMID                                                              

    000029 *.DC.CL8'21CS-TS1'.PID                                                               

    000030 *.DC.CL19'2020-07-04 02:25:21.816513'                                                

    000031 *.DC.CL5'    '.Pad with blanks                                                       

    000032 *.DC.C'Copyright '.Copyright text                                                    

    000033 *.DC.C'(C) Teracloud S.A. '.Copyright Teracloud S.A.                                 

    000034 *.DC.C'1991,2001'.Insert the year(s)                                                  

    000035 EndCKKModId DS 0D                      End of ESES and copyright                     

    ====== @@LAB@3L EQU   *-@@LAB@3                                                             

    ====== &DSMAC   SETC  '@@LAB@3'                                                              

    .OAAAC @@LAB@5L EQU   *-@@LAB@5                                                             

    .OAAAD &DSMAC   SETC  '@@LAB@5'                                                             

    000038 &DSSIZE  SETA  256                                                                   

    ====== &MSIZE   SETA  @@LAB@3L                                                              

    ======          AIF   (&DSSIZE GE &MSIZE).@@OK@3                                             

    ====== .@@OK@3  ANOP                                                                        

    .OAAAE &MSIZE   SETA  @@LAB@5L                                                              

    .OAAAF          AIF   (&DSSIZE GE &MSIZE).@@OK@5                                             

    .OAAAG .@@OK@5  ANOP                                                                        

     

    The snippets are exactly the same, except for the labeling difference.

     

    Any thoughts as to what I could have done in either/both of my prologs and epilogs which would perturb the assembler to cause this error.

    Thanks,
    Scott




  • 2.  RE: Metal C - Assembler failing when I have my own #pragma prolog/epilog

    Posted Tue July 07, 2020 08:56 AM
    With a great deal of online help from Steve Smith and Alex Brodsky, they (independently) discovered that "above" the displayed code (generated within my prolog), I had a DS statement that had a variable duplication factor that relied on a value that was "below" (declared by one of the macros in an insert_asm statement). This keeps the assembler from knowing at the time of the failing SETA statement what the location counter is and it fails, even though the results of the statement only needs the relative offsets.

    For clarity, the point of the code being generated by the compiler is to ensure that the data generated within the __asm(...:DS...) statement is less than or equal to the length specified (defaults to 255).

    From a user perspective, the error messages are inscrutable.

    ** ASMA032E Relocatable value or unresolved symbol found when absolute value required - OPENC/@@LAB@3L
    ** ASMA435I Record 944 in SSAF.METALC.C.ASM(CKKTESTR) on volume: TSO001

    I'm guessing that OPENC means "open code," @@LAB@3L is where the failure is occuring, but looking at the output after the assembler is finished doesn't make it obvious that @@LAB@3L was somehow defective when the SETA was being processed.


  • 3.  RE: Metal C - Assembler failing when I have my own #pragma prolog/epilog

    Posted Tue July 21, 2020 01:07 PM
    Hi Scott,
    Thank you for opening a case for this in our official support channel. We will handle from there.

    ------------------------------
    Linda Chui
    Enterprise Products & Compilers
    IBM Canada
    ------------------------------