Thanks for the suggested fix, Gabriel -- I have added the patch file to my
local CIL installation.

I might have a unique use case for the Question, so this might not be worth
patching for everybody. The way GameTime (my research software package)
runs, it uses CIL to preprocess and simplify a file as much as possible,
before passing it to another program analyzer -- the latter does not seem
to mind global initializers that use floating point values, yet CIL does.


On 25 August 2013 01:51, Gabriel Kerneis <gabr...@kerneis.info> wrote:

> On Sun, Aug 25, 2013 at 01:26:08AM -0700, Jonathan Kotker wrote:
> > Apologies for reviving an old thread, but I'm revisiting this issue,
> trying
> > to see if I can patch a way around it, without having to constant-fold
> > floating point numbers.
> >
> > Looking at the suggested line (line 2656 of src/cil.ml), it does not
> look
> > like that particular code should be throwing the error that I'm seeing,
> > because it checks if the type of the result is either an int or a float
> > (using 'integralType' on line 2650). Indeed, the error that I am seeing
> is
> > the following:
> >
> > C:/../testGlobalInit-gt.c:5: Bug: newTempVar called outside a function
> > C:/../testGlobalInit-gt.c:5: Error: global initializer
> >
> > Are there any suggestions on how to get this to work? Ideally, I guess
> I'm
> > looking for a way for expressions involving floating-point values to just
> > 'go through' without any changes and constant foldings, but it looks like
> > that's already happening.
>
> The problem is that the ternary operator :? is not considered an
> expression in
> CIL (unless you use --useLogicalOperators, in which case it is represented
> by
> Question). So when CIL encounters this operator, it translates it into a
> conditional: {x = a ? b : c} becomes {if(a) x = b else x = c}.
>
> This translation does not work for global variables, because the C syntax
> does
> not allow you to use an if statement outside of a function. CIL tries as
> hard as
> it can to mitigate this issue by performing constant folding, in order to
> eliminate :? when it is safe to do so. When constant-folding fails, it
> falls
> back on the if trick, which requires (in general) a temporary variable,
> which
> cannot be allocated outside of a function, hence the error that you get.
>
> I don't see any way to solve this issue but using Question; it has been
> introduced precisely for those cases.  Now, if you are reluctant to enable
> --useLogicalOperators as a whole, you can enable Question selectively with
> this
> trivial patch:
>
> diff --git a/src/frontc/cabs2cil.ml b/src/frontc/cabs2cil.ml
> index 7d7f3d9..d7fd2d9 100644
> --- a/src/frontc/cabs2cil.ml
> +++ b/src/frontc/cabs2cil.ml
> @@ -4470,7 +4470,7 @@ and doExp (asconst: bool)   (* This expression is
> used as a constant *)
>               | Some e2' ->
>                   finishExp (se1 @@ se2) (snd (castTo t2 tresult e2'))
> tresult
>             end
> -        | CEExp (se1, e1') when !useLogicalOperators && isEmpty se2 &&
> isEmpty se3 ->
> +        | CEExp (se1, e1') when isEmpty se2 && isEmpty se3 ->
>             let e2' = match e2'o with
>                 None -> (* use e1' *)
>                   snd (castTo t2 tresult e1')
>
> One could argue that Question should use regardless of
> --useLogicalOperators
> when constant folding fails. If you anyone feels this is a reasonable
> tweak to
> introduce in the next release, I'm willing to consider it (but it will of
> course change the fact that Question will not be optionnal anymore).
>
> Best regards,
> --
> Gabriel
>
------------------------------------------------------------------------------
October Webinars: Code for Performance
Free Intel webinars can help you accelerate application performance.
Explore tips for MPI, OpenMP, advanced profiling, and more. Get the most from 
the latest Intel processors and coprocessors. See abstracts and register >
http://pubads.g.doubleclick.net/gampad/clk?id=60133471&iu=/4140/ostg.clktrk
_______________________________________________
CIL-users mailing list
CIL-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/cil-users

Reply via email to