Skip to content
Snippets Groups Projects
Forked from cmucl / cmucl
Source project has a limited visibility.
  • gerd's avatar
    88a53c80
    DYNAMIC-EXTENT rest args. Currently for x86 only. Speed must be · 88a53c80
    gerd authored
    	greater than safety for stack-allocation to actually happen, which
    	is what ACL defaults to.  Use boot15.lisp to bootstrap.
    
    	* src/bootfiles/18e/boot15.lisp: New file.
    
    	* src/compiler/node.lisp (leaf): Add slot dynamic-extent.
    
    	* src/compiler/x86/macros.lisp (load-size, inline-allocation)
    	(not-inline-allocation): Extract from function allocation.
    	(stack-allocation): New function.
    	(allocation): Add arg dynamic-extent.  Call stack-allocation
    	if dynamic-extent is true, and speed > safety.
    
    	* src/compiler/x86/call.lisp (listify-rest-args): Add
    	constant third arg, and pass it to allocation.
    
    	* src/code/class.lisp (find-layout): Put part in
    	#-bootstrap-dynamic-extent.
    
    	* src/compiler/ir1tran.lisp (process-dynamic-extent-declaration):
    	New function.
    	(*suppress-dynamic-extent-declaration*): New variable.
    	(process-1-declaration): Call process-dynamic-extent-declaration.
    	(convert-more-entry) [#+x86]: Call %listify-rest-args with
    	third arg dynamic-extent.
    
    	* src/compiler/eval-comp.lisp (%listify-rest-args) [#+x86]:
    	* src/compiler/fndb.lisp (%listify-rest-args) [#+x86]: Add
    	third arg for dynamic-extent.
    
    	Possibly temporary workaround for SBCL build problems caused by a
    	situation like
    
    	  (defvar *foo*)
    	  (declaim (type foo *foo*))
    	  (defstruct foo)
    	  (defun foo ()
    	    (let ((*foo* (some-unknown-function)))
    	       ...))
    
    	When a type check is being generated for the local binding of
    	*foo*, *foo*'s type in the info database is still an unknown-type.
    	The typep transform generates a call to %instance-typep, because
    	it knows that foo is an instance.  The deftransform for
    	%instance-typep does not run, so an actual call to %instance-typep
    	is being generated.  A function %instance-typep doesn't exist at
    	run time, though.
    
    	* src/compiler/ir1tran.lisp (find-free-variable): If the
    	variable's type is an unknown-type, reparse it, and change the
    	type in the info database.
    88a53c80
    History
    DYNAMIC-EXTENT rest args. Currently for x86 only. Speed must be
    gerd authored
    	greater than safety for stack-allocation to actually happen, which
    	is what ACL defaults to.  Use boot15.lisp to bootstrap.
    
    	* src/bootfiles/18e/boot15.lisp: New file.
    
    	* src/compiler/node.lisp (leaf): Add slot dynamic-extent.
    
    	* src/compiler/x86/macros.lisp (load-size, inline-allocation)
    	(not-inline-allocation): Extract from function allocation.
    	(stack-allocation): New function.
    	(allocation): Add arg dynamic-extent.  Call stack-allocation
    	if dynamic-extent is true, and speed > safety.
    
    	* src/compiler/x86/call.lisp (listify-rest-args): Add
    	constant third arg, and pass it to allocation.
    
    	* src/code/class.lisp (find-layout): Put part in
    	#-bootstrap-dynamic-extent.
    
    	* src/compiler/ir1tran.lisp (process-dynamic-extent-declaration):
    	New function.
    	(*suppress-dynamic-extent-declaration*): New variable.
    	(process-1-declaration): Call process-dynamic-extent-declaration.
    	(convert-more-entry) [#+x86]: Call %listify-rest-args with
    	third arg dynamic-extent.
    
    	* src/compiler/eval-comp.lisp (%listify-rest-args) [#+x86]:
    	* src/compiler/fndb.lisp (%listify-rest-args) [#+x86]: Add
    	third arg for dynamic-extent.
    
    	Possibly temporary workaround for SBCL build problems caused by a
    	situation like
    
    	  (defvar *foo*)
    	  (declaim (type foo *foo*))
    	  (defstruct foo)
    	  (defun foo ()
    	    (let ((*foo* (some-unknown-function)))
    	       ...))
    
    	When a type check is being generated for the local binding of
    	*foo*, *foo*'s type in the info database is still an unknown-type.
    	The typep transform generates a call to %instance-typep, because
    	it knows that foo is an instance.  The deftransform for
    	%instance-typep does not run, so an actual call to %instance-typep
    	is being generated.  A function %instance-typep doesn't exist at
    	run time, though.
    
    	* src/compiler/ir1tran.lisp (find-free-variable): If the
    	variable's type is an unknown-type, reparse it, and change the
    	type in the info database.