Perhaps turn off optimization and see what the "raw" compiler produces?  That 
may provide a hint to a solution, or it may just leave the function to do what 
you want and you will have accomplished your task.

BTW, why a "static" function?  Could that be affecting the way the compiler 
optimization treats the code?

HTH

Peter

-----Original Message-----
From: IBM Mainframe Discussion List [mailto:IBM-MAIN@LISTSERV.UA.EDU] On Behalf 
Of Bernd Oppolzer
Sent: Thursday, March 27, 2014 11:51 AM
To: IBM-MAIN@LISTSERV.UA.EDU
Subject: Compiler error in z/OS C compiler

Hello mainframe C users,

today I observed an error in the C compiler,
which made me think again about the optimization strategy
of the z/OS C compiler.

I wrote a small C function; the purpose was to translate
pointer values coming from PL/1 modules from NULL() values
- PL/1 builtin NULL() yields 0xFF000000 - to "real" NULLs
- 0x00000000 - or PL/1 SYSNULL.

This is what I did:


/**********************************************************/
/* */
/*   PLI/1 NULL () => SYSNULL ()                          */
/* */
/**********************************************************/

static void *pli_null_to_sysnull (void *ptr)

{
    unsigned int ppli = (unsigned int) ptr;

#ifdef COMPERR
    printf ("Ausgabe in pli_null_to_sysnull "
            "wg. Comp-Fehler: %x\n", ppli);
#endif

    if (ppli == 0xff000000u)
    {
       return NULL;
}
    else
    {
       return ptr;
    }
}


the caller then did something like

ptr = pli_null_to sysnull (ptr);

now:

if the printf inside the function was there (that is,
COMPERR was #defined), all went OK; the ptr was translated
as desired.

but:

if the printf was not there (no #define for COMPERR), the
function was completely thrown away by the optimizer, and
the ptr remained unchanged.

That looks as if the compiler guessed that the condition
(ppli == 0xff000000u) can never be true. But because ppli is
an unsigned int, and int has size 32, of course it can (and
it does, as we can see in the case when printf is present).

What happens here?

I believe that the compiler THINKS that because the value
of ppli comes from a casted pointer and pointers have 31
bits in z/OS, the value of ppli can never have the high order
bit on. But that's just plain wrong, as we see here, if the
pointer comes from a PL/1 module, for example, and contains
NULL(). That's just the case that I want to deal with, here.

We had such problems before, when, for example, pointers coming
from outside into C modules had the high order bit on, and
the C runtime got into serious troubles with this. Is this
a variant of that same old story?

What do you think?

I found a workaround in the meantime, and I asked our compiler
people to send the problem to IBM. But I would like to hear some
opinions from the list, too: do you consider the function valid
in the z/OS context or not? After all, I expect C to help me
even in the systems programming business; I would be very
disappointed if for such easy tasks already I had to use
ASSEMBLER subprograms.

Kind regards

Bernd
--

This message and any attachments are intended only for the use of the addressee 
and may contain information that is privileged and confidential. If the reader 
of the message is not the intended recipient or an authorized representative of 
the intended recipient, you are hereby notified that any dissemination of this 
communication is strictly prohibited. If you have received this communication 
in error, please notify us immediately by e-mail and delete the message and any 
attachments from your system.

----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to lists...@listserv.ua.edu with the message: INFO IBM-MAIN

Reply via email to