with Instrument;
use Instrument;

----------------
-- GLOBAL REFERENCE
----------------

-- THIS TEST EVALUATES THE CODE EFFICIENCY OF REFERENCING A GLOBAL VARIA
-- I.E., A REFERENCE TO A VARIABLE THAT IS DECLARED IN THE OUTERMOST
-- DECLARATIVE REGION.

-- THE TEST VERSION INCLUDES THE DATA REFERENCE TO BE EVALUATED BY ASSIG
-- ING THE TEST GLOBAL VARIABLE, GLOBAL_OBJECT.ALL, TO THE SUPPORT GLOBA
-- VARIABLE, GLOBAL (USED IN ALL PERFORMANCE TESTS).  PRIOR TO THIS
-- ASSIGNMENT, CAMOUFLAGED ASSIGNMENTS ARE MADE TO BOTH GLOBAL_OBJECT.AL
-- AND TO GLOBAL.  THE SUPPORT GLOBAL VARIABLE IS USED IN A CONDITIONAL
-- MENT TO GUARD THE TEST ASSIGNMENT FROM OPTIMIZATIONS.  BECAUSE OF THI
-- GUARD, THE TEST VARIABLE MUST BE UPDATED WITH ITS INITIAL VALUE SINCE
-- THE CONDITIONAL EXPRESSION MUST BE DYNAMICALLY EVALUATED.  ADDITIONAL
-- CAMOUFLAGED ASSIGNMENTS ARE MADE TO MAINTAIN THE VALIDITY OF THE
-- CONDITIONAL STATEMENT AND TO PREVENT ELIMINATION OF THE OTHERWISE
-- UNREFERENCED TEST GLOBAL VARIABLE IN THE NOISE VERSION.

-- THE NOISE VERSION IS IDENTICAL TO THE TEST VERSION EXCEPT THAT THE
-- REFERENCE TO THE TEST GLOBAL VARIABLE IS REMOVED SO THAT THE CODE EFF
-- METRICS FOR THE GLOBAL REFERENCE CAN BE DERIVED AS A PART OF THE ASSI
-- MENT.

procedure Gvraa1 is
    package Dr_Cs is new Procs (Integer);
    use Dr_Cs;

begin
    Start ("GVRAA1", "Global Var. Ref., Access type (control)");
    for I in 1 .. 10000 loop

        Let (Global_Access.all, Ident (Init));
        Let (Global, Ident (Init));

        if Global = Init then
            --    GLOBAL := GLOBAL_ACCESS.ALL;  -- COMMENTED OUT IN NOISE VERSION
            Let (Global_Access.all, Ident (Init));
        end if;

        Let (Global, Ident (Global_Access.all));

    end loop;
    Stop;
end Gvraa1;