Comment 1 for bug 730440

Revision history for this message
Jani Monoses (jani) wrote :

Here is a shorter snippet that exhibits the issue, however in this case both -O2 and -O3 fail with the same error
Error: immediate value out of range -- `movt r1,-77'

// Shutdown lock data
union shutdown_data {
        struct {
                SSHORT flag;
                SSHORT delay;
        } data_items;
        SLONG data_long;
};

void notify_shutdown(Database* dbb)
{
        shutdown_data data;

        data.data_items.flag = 1;
        data.data_items.delay = -77;

        LOCK_write_data(dbb->dbb_lock->lck_id, data.data_long);

}

the called function is in another source file and looks like this
SLONG LOCK_write_data(SRQ_PTR request_offset, SLONG data)
{
/**************************************
 *
 * L O C K _ w r i t e _ d a t a
 *
 **************************************
 *
 * Functional description
 * Write a longword into the lock block.
 *
 **************************************/
        LOCK_TRACE(("LOCK_write_data (%ld)\n", request_offset));

        lrq* request = get_request(request_offset);
        acquire(request->lrq_owner);
        ++LOCK_header->lhb_write_data;
        request = (LRQ) SRQ_ABS_PTR(request_offset); /* Re-init after a potential remap */
        lbl* lock = (LBL) SRQ_ABS_PTR(request->lrq_lock);
        remove_que(&lock->lbl_lhb_data);
        if (lock->lbl_data = data)
                insert_data_que(lock);

        if (lock->lbl_series < LCK_MAX_SERIES)
                ++LOCK_header->lhb_operations[lock->lbl_series];
        else
                ++LOCK_header->lhb_operations[0];

        release(request->lrq_owner);

        return data;
}