This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: volatile workaround and how to mark register unused?


> Date: Wed, 20 Mar 2002 14:22:30 +0300
> From: Dmitry <diwil@eis.ru>
> To: gcc@gcc.gnu.org

> volatile int a;
> int __attribute__ ((interrupt)) foo( )
> {
>         return a > 7;
> }

> GCC produces the assembler code

> foo:
>         mov     &a, r12          ;  12  *movhi3/6       [length = 2]
>         cmp     #llo(8), r12     ;  31  cmphi   [length = 1]

>         volatile_ok = 1;

Age old problem, should be fixed.  Hasn't been fixed yet.  Search the
archives for volatile_ok and email from me.  Basically, volatile_ok
should go away, and be replaced by the constant 1.

The right fix, is in your port, do

#define VOLATILE_OK 1

and then in the backend, in all places where volatile_ok is set, put
in an VOLATILE_OK&&, and then in defaults.h, put in a #ifndef
VOLATILE_OK, #define VOLATILE_OK 0, #endif.  recompile, and presto,
everything works.  Be defining this, you, as port maintainer, agree to
never read from any variable more than what is otherwise suggested by
the highlevel operation, and never write to it, more than is otherwise
suggested by the highlevel operation.  If you need to do multiple
reads/writes to perform the operation, then you are responsible for
using an intermediate, or effecting some other solution.  Likewise,
peepholing may need to be audited to ensure that bad things don't
happen.

Please, do this up, submit the work, audit your port for
correctness...


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]