Mercurial > hg > xemacs-beta
view dynodump/sparc/_relocate.c @ 853:2b6fa2618f76
[xemacs-hg @ 2002-05-28 08:44:22 by ben]
merge my stderr-proc ws
make-docfile.c: Fix places where we forget to check for EOF.
code-init.el: Don't use CRLF conversion by default on process output. CMD.EXE and
friends work both ways but Cygwin programs don't like the CRs.
code-process.el, multicast.el, process.el: Removed.
Improvements to call-process-internal:
-- allows a buffer to be specified for input and stderr output
-- use it on all systems
-- implement C-g as documented
-- clean up and comment
call-process-region uses new call-process facilities; no temp file.
remove duplicate funs in process.el.
comment exactly how coding systems work and fix various problems.
open-multicast-group now does similar coding-system frobbing to
open-network-stream.
dumped-lisp.el, faces.el, msw-faces.el: Fix some hidden errors due to code not being defined at the right time.
xemacs.mak: Add -DSTRICT.
================================================================
ALLOW SEPARATION OF STDOUT AND STDERR IN PROCESSES
================================================================
Standard output and standard error can be processed separately in
a process. Each can have its own buffer, its own mark in that buffer,
and its filter function. You can specify a separate buffer for stderr
in `start-process' to get things started, or use the new primitives:
set-process-stderr-buffer
process-stderr-buffer
process-stderr-mark
set-process-stderr-filter
process-stderr-filter
Also, process-send-region takes a 4th optional arg, a buffer.
Currently always uses a pipe() under Unix to read the error output.
(#### Would a PTY be better?)
sysdep.h, sysproc.h, unexfreebsd.c, unexsunos4.c, nt.c, emacs.c, callproc.c, symsinit.h, sysdep.c, Makefile.in.in, process-unix.c: Delete callproc.c. Move child_setup() to process-unix.c.
wait_for_termination() now only needed on a few really old systems.
console-msw.h, event-Xt.c, event-msw.c, event-stream.c, event-tty.c, event-unixoid.c, events.h, process-nt.c, process-unix.c, process.c, process.h, procimpl.h: Rewrite the process methods to handle a separate channel for
error input. Create Lstreams for reading in the error channel.
Many process methods need change. In general the changes are
fairly clear as they involve duplicating what's used for reading
the normal stdout and changing for stderr -- although tedious,
as such changes are required throughout the entire process code.
Rewrote the code that reads process output to do two loops, one
for stdout and one for stderr.
gpmevent.c, tooltalk.c: set_process_filter takes an argument for stderr.
================================================================
NEW ERROR-TRAPPING MECHANISM
================================================================
Totally rewrite error trapping code to be unified and support more
features. Basic function is call_trapping_problems(), which lets
you specify, by means of flags, what sorts of problems you want
trapped. these can include
-- quit
-- errors
-- throws past the function
-- creation of "display objects" (e.g. buffers)
-- deletion of already-existing "display objects" (e.g. buffers)
-- modification of already-existing buffers
-- entering the debugger
-- gc
-- errors->warnings (ala suspended errors)
etc. All other error funs rewritten in terms of this one.
Various older mechanisms removed or rewritten.
window.c, insdel.c, console.c, buffer.c, device.c, frame.c: When creating a display object, added call to
note_object_created(), for use with trapping_problems mechanism.
When deleting, call check_allowed_operation() and note_object
deleted().
The trapping-problems code records the objects created since the
call-trapping-problems began. Those objects can be deleted, but
none others (i.e. previously existing ones).
bytecode.c, cmdloop.c: internal_catch takes another arg.
eval.c: Add long comments describing the "five lists" used to maintain
state (backtrace, gcpro, specbind, etc.) in the Lisp engine.
backtrace.h, eval.c: Implement trapping-problems mechanism, eliminate old mechanisms or
redo in terms of new one.
frame.c, gutter.c: Flush out the concept of "critical display section", defined by
the in_display() var. Use an internal_bind() to get it reset,
rather than just doing it at end, because there may be a non-local
exit.
event-msw.c, event-stream.c, console-msw.h, device.c, dialog-msw.c, frame.c, frame.h, intl.c, toolbar.c, menubar-msw.c, redisplay.c, alloc.c, menubar-x.c: Make use of new trapping-errors stuff and rewrite code based on
old mechanisms.
glyphs-widget.c, redisplay.h: Protect calling Lisp in redisplay.
insdel.c: Protect hooks against deleting existing buffers.
frame-msw.c: Use EQ, not EQUAL in hash tables whose keys are just numbers.
Otherwise we run into stickiness in redisplay because
internal_equal() can QUIT.
================================================================
SIGNAL, C-G CHANGES
================================================================
Here we change the way that C-g interacts with event reading. The
idea is that a C-g occurring while we're reading a user event
should be read as C-g, but elsewhere should be a QUIT. The former
code did all sorts of bizarreness -- requiring that no QUIT occurs
anywhere in event-reading code (impossible to enforce given the
stuff called or Lisp code invoked), and having some weird system
involving enqueue/dequeue of a C-g and interaction with Vquit_flag
-- and it didn't work.
Now, we simply enclose all code where we want C-g read as an event
with {begin/end}_dont_check_for_quit(). This completely turns off
the mechanism that checks (and may remove or alter) C-g in the
read-ahead queues, so we just get the C-g normal.
Signal.c documents this very carefully.
cmdloop.c: Correct use of dont_check_for_quit to new scheme, remove old
out-of-date comments.
event-stream.c: Fix C-g handling to actually work.
device-x.c: Disable quit checking when err out.
signal.c: Cleanup. Add large descriptive comment.
process-unix.c, process-nt.c, sysdep.c: Use QUIT instead of REALLY_QUIT.
It's not necessary to use REALLY_QUIT and just confuses the issue.
lisp.h: Comment quit handlers.
================================================================
CONS CHANGES
================================================================
free_cons() now takes a Lisp_Object not the result of XCONS().
car and cdr have been renamed so that they don't get used directly;
go through XCAR(), XCDR() instead.
alloc.c, dired.c, editfns.c, emodules.c, fns.c, glyphs-msw.c, glyphs-x.c, glyphs.c, keymap.c, minibuf.c, search.c, eval.c, lread.c, lisp.h: Correct free_cons calling convention: now takes Lisp_Object,
not Lisp_Cons
chartab.c: Eliminate direct use of ->car, ->cdr, should be black box.
callint.c: Rewrote using EXTERNAL_LIST_LOOP to avoid use of Lisp_Cons.
================================================================
USE INTERNAL-BIND-*
================================================================
eval.c: Cleanups of these funs.
alloc.c, fileio.c, undo.c, specifier.c, text.c, profile.c, lread.c, redisplay.c, menubar-x.c, macros.c: Rewrote to use internal_bind_int() and internal_bind_lisp_object()
in place of whatever varied and cumbersome mechanisms were
formerly there.
================================================================
SPECBIND SANITY
================================================================
backtrace.h: - Improved comments
backtrace.h, bytecode.c, eval.c: Add new mechanism check_specbind_stack_sanity() for sanity
checking code each time the catchlist or specbind stack change.
Removed older prototype of same mechanism.
================================================================
MISC
================================================================
lisp.h, insdel.c, window.c, device.c, console.c, buffer.c: Fleshed out authorship.
device-msw.c: Correct bad Unicode-ization.
print.c: Be more careful when not initialized or in fatal error handling.
search.c: Eliminate running_asynch_code, an FSF holdover.
alloc.c: Added comments about gc-cons-threshold.
dialog-x.c: Use begin_gc_forbidden() around code to build up a widget value
tree, like in menubar-x.c.
gui.c: Use Qunbound not Qnil as the default for
gethash.
lisp-disunion.h, lisp-union.h: Added warnings on use of VOID_TO_LISP().
lisp.h: Use ERROR_CHECK_STRUCTURES to turn on
ERROR_CHECK_TRAPPING_PROBLEMS and ERROR_CHECK_TYPECHECK
lisp.h: Add assert_with_message.
lisp.h: Add macros for gcproing entire arrays. (You could do this before
but it required manual twiddling the gcpro structure.)
lisp.h: Add prototypes for new functions defined elsewhere.
author | ben |
---|---|
date | Tue, 28 May 2002 08:45:36 +0000 |
parents | 3ecd8885ac67 |
children |
line wrap: on
line source
/* * Copyright (c) 1995 by Sun Microsystems, Inc. * All rights reserved. * * This source code is a product of Sun Microsystems, Inc. and is provided * for unrestricted use provided that this legend is included on all tape * media and as a part of the software program in whole or part. Users * may copy or modify this source code without charge, but are not authorized * to license or distribute it to anyone else except as part of a product or * program developed by the user. * * THIS PROGRAM CONTAINS SOURCE CODE COPYRIGHTED BY SUN MICROSYSTEMS, INC. * SUN MICROSYSTEMS, INC., MAKES NO REPRESENTATIONS ABOUT THE SUITABLITY * OF SUCH SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT * EXPRESS OR IMPLIED WARRANTY OF ANY KIND. SUN MICROSYSTEMS, INC. DISCLAIMS * ALL WARRANTIES WITH REGARD TO SUCH SOURCE CODE, INCLUDING ALL IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN * NO EVENT SHALL SUN MICROSYSTEMS, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT, * INCIDENTAL, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM USE OF SUCH SOURCE CODE, REGARDLESS OF THE THEORY OF LIABILITY. * * This source code is provided with no support and without any obligation on * the part of Sun Microsystems, Inc. to assist in its use, correction, * modification or enhancement. * * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS * SOURCE CODE OR ANY PART THEREOF. * * Sun Microsystems, Inc. * 2550 Garcia Avenue * Mountain View, California 94043 */ /* * Update the value of the `_edata' and `_end' symbols. */ #pragma ident "@(#) $Id: _relocate.c,v 1.4 1998/03/31 20:10:55 steve Exp $ - SMI" #include <libelf.h> #include <string.h> #include "machdep.h" #include "_dynodump.h" #define GETbyte(P) ((long)((unsigned long)(P)[0])) #define GEThalf(P) ((long)(((unsigned long)(P)[0] << 8) | \ ((unsigned long)(P)[1]))) #define GETword(P) ((long)(((unsigned long)(P)[0] << 24) | \ ((unsigned long)(P)[1] << 16) | \ ((unsigned long)(P)[2] << 8) | \ (unsigned long)(P)[3])) #define GETdisp30(P) (GETword(P) & 0x3fffffff) #define GETdisp22(P) (GETword(P) & 0x3fffff) #define GETdisp16(P) (((GETword(P) & 0x300000) >> 6) | \ (GETword(P) & 0x3fff)) #define GETdisp19(P) (GETword(P) & 0x7ffff) #define GETimm22(P) (GETword(P) & 0x3fffff) #define GETimm5(P) (GEThalf((P)+2) & 0x1f) #define GETimm6(P) (GEThalf((P)+2) & 0x2f) #define GETimm7(P) (GEThalf((P)+2) & 0x3f) #define GETsimm13(P) (GEThalf((P)+2) & 0x1fff) #define GETsimm10(P) (GEThalf((P)+2) & 0x3ff) #define GETsimm11(P) (GEThalf((P)+2) & 0x7ff) #define GETplt22(P) (GETword((P)+8) & 0x3fffff) #define PUTbyte(V, P) (P)[0] = (V) #define PUThalf(V, P) (P)[0] = ((V) >> 8); \ (P)[1] = ((V)) #define PUTword(V, P) (P)[0] = (unsigned char)((V) >> 24); \ (P)[1] = (unsigned char)((V) >> 16); \ (P)[2] = (unsigned char)((V) >> 8); \ (P)[3] = (unsigned char)(V) #define PUTdisp30(V, P) { \ unsigned long int temp; \ temp = GETword(P) & ~0x3fffffff; \ temp |= ((V) & 0x3fffffff); \ PUTword(temp, P); \ } #define PUTdisp22(V, P) { \ unsigned long int temp; \ temp = GETword(P) & ~0x3fffff; \ temp |= ((V) & 0x3fffff); \ PUTword(temp, P); \ } #define PUTimm22(V, P) { \ unsigned long int temp; \ temp = GETword(P) & ~0x3fffff; \ temp |= ((V) & 0x3fffff); \ PUTword(temp, P); \ } #define PUTimm5(V, P) { \ unsigned long int temp; \ temp = GEThalf(P+2) & ~0x1f; \ temp |= ((V) & 0x1f); \ PUThalf(temp, (P+2)); \ } #define PUTimm6(V, P) { \ unsigned long int temp; \ temp = GEThalf(P+2) & ~0x2f; \ temp |= ((V) & 0x2f); \ PUThalf(temp, (P+2)); \ } #define PUTimm7(V, P) { \ unsigned long int temp; \ temp = GEThalf(P+2) & ~0x3f; \ temp |= ((V) & 0x3f); \ PUThalf(temp, (P+2)); \ } #define PUTsimm13(V, P) { \ unsigned long int temp; \ temp = GEThalf(P+2) & ~0x1fff; \ temp |= ((V) & 0x1fff); \ PUThalf(temp, (P+2)); \ } #define PUTplt22(V, P) { \ unsigned long int temp; \ temp = GETword((P)+8) & ~0x3fffff; \ temp |= ((V) & 0x3fffff); \ PUTword(temp, ((P)+8)); \ } #define PUTsimm10(V, P) { \ unsigned long int temp; \ temp = GEThalf(P+2) & ~0x3ff; \ temp |= ((V) & 0x3ff); \ PUThalf(temp, (P+2)); \ } #define PUTsimm11(V, P) { \ unsigned long int temp; \ temp = GEThalf(P+2) & ~0x7ff; \ temp |= ((V) & 0x7ff); \ PUThalf(temp, (P+2)); \ } #define PUTdisp16(V, P) { \ unsigned long int temp; \ temp = GETword(P) & ~0x303fff; \ temp |= ((V) & 0xc000) << 6; \ temp |= ((V) & 0x3fff); \ PUTword(temp, P); \ } #define PUTdisp19(V, P) { \ unsigned long int temp; \ temp = GETword(P) & ~0x7ffff; \ temp |= ((V) & 0x7ffff); \ PUTword(temp, P); \ } static void move_reloc(unsigned char * iaddr, unsigned char * oaddr, unsigned char type) { switch (type) { case R_SPARC_8: case R_SPARC_DISP8: PUTbyte(GETbyte(iaddr), oaddr); break; case R_SPARC_16: case R_SPARC_DISP16: PUThalf(GEThalf(iaddr), oaddr); break; case R_SPARC_32: case R_SPARC_DISP32: case R_SPARC_GLOB_DAT: case R_SPARC_RELATIVE: case R_SPARC_UA32: PUTword(GETword(iaddr), oaddr); break; case R_SPARC_WDISP30: case R_SPARC_WPLT30: PUTdisp30(GETdisp30(iaddr), oaddr); break; case R_SPARC_WDISP22: case R_SPARC_PC22: PUTdisp22(GETdisp22(iaddr), oaddr); break; case R_SPARC_HI22: case R_SPARC_GOT22: case R_SPARC_22: PUTimm22(GETimm22(iaddr), oaddr); break; case R_SPARC_13: case R_SPARC_GOT13: PUTsimm13(GETsimm13(iaddr), oaddr); break; case R_SPARC_LO10: case R_SPARC_GOT10: case R_SPARC_PC10: #ifdef R_SPARC_10 case R_SPARC_10: #endif PUTsimm10(GETsimm10(iaddr), oaddr); break; #ifdef R_SPARC_11 case R_SPARC_11: PUTsimm11(GETsimm11(iaddr), oaddr); break; #endif #ifdef R_SPARC_WDISP16 case R_SPARC_WDISP16: PUTdisp16(GETdisp16(iaddr), oaddr); break; #endif #ifdef R_SPARC_WDISP19 case R_SPARC_WDISP19: PUTdisp19(GETdisp19(iaddr), oaddr); break; #endif #ifdef R_SPARC_5 case R_SPARC_5: PUTimm5(GETimm5(iaddr), oaddr); break; #endif #ifdef R_SPARC_6 case R_SPARC_6: PUTimm6(GETimm6(iaddr), oaddr); break; #endif #ifdef R_SPARC_7 case R_SPARC_7: PUTimm7(GETimm7(iaddr), oaddr); break; #endif default: break; } } void update_reloc(Cache *ocache, Cache *_ocache, Cache *icache, Cache *_icache, Half shnum) { Shdr *shdr; Rel *rels; int reln, cnt; Cache *orcache, *ircache; /* * Set up to read the output relocation table. */ shdr = _ocache->c_shdr; rels = (Rel *)_ocache->c_data->d_buf; reln = shdr->sh_size / shdr->sh_entsize; /* * Determine the section that is being relocated. */ orcache = &ocache[shdr->sh_info]; shdr = _icache->c_shdr; ircache = &icache[shdr->sh_info]; /* * Loop through the relocation table. */ for (cnt = 0; cnt < reln; cnt++, rels++) { unsigned char *iaddr, *oaddr; Addr off; unsigned char type = ELF_R_TYPE(rels->r_info); /* * Ignore some relocations as these can safely be carried out * twice (they simply override any existing data). In fact, * some relocations like __iob's copy relocation must be carried * out each time the process restarts otherwise stdio blows up. */ if ((type == R_SPARC_COPY) || (type == R_SPARC_JMP_SLOT) || (type == R_SPARC_NONE)) continue; /* * If we are required to restore the relocation location * to its value prior to relocation, then read the * locations original contents from the input image and * copy it to the output image. */ off = rels->r_offset - ircache->c_shdr->sh_addr; iaddr = (unsigned char *)ircache->c_data->d_buf + off; oaddr = (unsigned char *)orcache->c_data->d_buf + off; move_reloc(iaddr, oaddr, type); } }