Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions smalltalksrc/VMMaker/CoInterpreter.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -2978,8 +2978,10 @@ CoInterpreter >> handleUnlinkedSendFor: maybeForwardedSelector to: receiver isSu
methodOperand: (self mnuMethodOrNilFor: receiver)
numArgs: argumentCount).
mnuPIC asUnsignedIntegerPtr > cogit minCogMethodAddress ifTrue: [
| callerReturnAddress |
callerReturnAddress := self stackTop.
cogit
linkSendAt: (stackPages longAt: stackPointer)
linkSendAt: callerReturnAddress
in: (self mframeHomeMethod: framePointer)
to: mnuPIC
offset: (isSuper = 0
Expand Down Expand Up @@ -3009,8 +3011,10 @@ CoInterpreter >> handleUnlinkedSendFor: maybeForwardedSelector to: receiver isSu

cogMethod selector = selector
ifTrue: [
| callerReturnAddress |
callerReturnAddress := self stackTop.
cogit
linkSendAt: (stackPages longAt: stackPointer)
linkSendAt: callerReturnAddress
in: (self mframeHomeMethod: framePointer)
to: cogMethod
offset: (isSuper = 0
Expand Down
8 changes: 2 additions & 6 deletions smalltalksrc/VMMaker/CogIA32Compiler.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -3943,12 +3943,8 @@ CogIA32Compiler >> rewriteInlineCacheAt: callSiteReturnAddress tag: cacheTag tar
<var: #callSiteReturnAddress type: #usqInt>
<var: #callTargetAddress type: #usqInt>
| callDistance |
"self cCode: ''
inSmalltalk: [cogit disassembleFrom: callSiteReturnAddress - 10 to: callSiteReturnAddress - 1]."
false
ifTrue: [self assert: callTargetAddress >= cogit minCallAddress]
ifFalse: [callTargetAddress >= cogit minCallAddress ifFalse:
[self error: 'linking callsite to invalid address']].
callTargetAddress >= cogit minCallAddress
ifFalse: [ self error: 'linking callsite to invalid address' ].
callDistance := (callTargetAddress - callSiteReturnAddress) signedIntToLong.
objectMemory
byteAt: callSiteReturnAddress - 1 put: (callDistance >> 24 bitAnd: 16rFF);
Expand Down
6 changes: 2 additions & 4 deletions smalltalksrc/VMMaker/CogInLineLiteralsARMCompiler.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -170,10 +170,8 @@ CogInLineLiteralsARMCompiler >> rewriteInlineCacheAt: callSiteReturnAddress tag:
<var: #callSiteReturnAddress type: #usqInt>
<var: #callTargetAddress type: #usqInt>
| call callDistance |
false
ifTrue: [self assert: callTargetAddress >= cogit minCallAddress]
ifFalse: [callTargetAddress >= cogit minCallAddress ifFalse:
[self error: 'linking callsite to invalid address']].
callTargetAddress >= cogit minCallAddress
ifFalse: [ self error: 'linking callsite to invalid address' ].
callDistance := (callTargetAddress - (callSiteReturnAddress + 8 "pc offset"- 4 "return offset")) signedIntToLong.
self assert: (self isInImmediateJumpRange: callDistance). "we don't support long call updates here"
call := self bl: callDistance.
Expand Down
4 changes: 2 additions & 2 deletions smalltalksrc/VMMaker/CogOutOfLineLiteralsARMCompiler.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -203,8 +203,8 @@ CogOutOfLineLiteralsARMCompiler >> rewriteInlineCacheAt: callSiteReturnAddress t
<var: #callSiteReturnAddress type: #usqInt>
<var: #callTargetAddress type: #usqInt>
| call callDistance |
callTargetAddress >= cogit minCallAddress ifFalse:
[self error: 'linking callsite to invalid address'].
callTargetAddress >= cogit minCallAddress
ifFalse: [ self error: 'linking callsite to invalid address' ].
callDistance := (callTargetAddress - (callSiteReturnAddress + 8 "pc offset"- 4 "return offset")) signedIntToLong.
self assert: (self isInImmediateJumpRange: callDistance). "we don't support long call updates here"
call := self bl: callDistance.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -371,8 +371,8 @@ CogOutOfLineLiteralsARMv8Compiler >> rewriteInlineCacheAt: callSiteReturnAddress
<var: #callSiteReturnAddress type: #usqInt>
<var: #callTargetAddress type: #usqInt>
| call callDistance |
callTargetAddress >= cogit minCallAddress ifFalse:
[self error: 'linking callsite to invalid address'].
callTargetAddress >= cogit minCallAddress
ifFalse: [ self error: 'linking callsite to invalid address' ].
callDistance := (callTargetAddress - (callSiteReturnAddress - 4 "return offset")).
self assert: (self isInImmediateJumpRange: callDistance). "we don't support long call updates here"
call := self bl: callDistance.
Expand Down
8 changes: 2 additions & 6 deletions smalltalksrc/VMMaker/CogX64Compiler.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -4605,12 +4605,8 @@ CogX64Compiler >> rewriteInlineCacheAt: callSiteReturnAddress tag: cacheTag targ
<var: #callSiteReturnAddress type: #usqInt>
<var: #callTargetAddress type: #usqInt>
| callDistance |
"self cCode: ''
inSmalltalk: [cogit disassembleFrom: callSiteReturnAddress - 12 to: callSiteReturnAddress - 1]."
false
ifTrue: [self assert: callTargetAddress >= cogit minCallAddress]
ifFalse: [callTargetAddress >= cogit minCallAddress ifFalse:
[self error: 'linking callsite to invalid address']].
callTargetAddress >= cogit minCallAddress
ifFalse: [ self error: 'linking callsite to invalid address' ].
callDistance := (callTargetAddress - callSiteReturnAddress) signedIntToLong.
objectMemory
byteAt: callSiteReturnAddress - 1 put: (callDistance >> 24 bitAnd: 16rFF);
Expand Down
10 changes: 5 additions & 5 deletions smalltalksrc/VMMaker/Cogit.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -10091,9 +10091,9 @@ Cogit >> patchToMegamorphicICFor: selector numArgs: numArgs receiver: receiver [
sp=> sender return address"

<api>
| oPIC outerReturn extent |
| oPIC callerReturnAddress extent |
<var: #oPIC type: #'CogMethod *'>
outerReturn := coInterpreter stackTop.
callerReturnAddress := coInterpreter stackTop.

oPIC := methodZone openPICWithSelector: selector.

Expand All @@ -10117,14 +10117,14 @@ Cogit >> patchToMegamorphicICFor: selector numArgs: numArgs receiver: receiver [
"Relink the send site to the pic. Reset the cache tag to the selector, for the
benefit of the cacheTag assert check in checkIfValidOopRef:pc:cogMethod: et al."
extent := backEnd
rewriteInlineCacheAt: outerReturn
rewriteInlineCacheAt: callerReturnAddress
tag: (self inlineCacheValueForSelector: selector
in: coInterpreter mframeHomeMethodExport
at: outerReturn)
at: callerReturnAddress)
target: oPIC asInteger + cmEntryOffset]
flushingCacheWith: [
self
flushICacheFrom: outerReturn asUnsignedInteger - extent to: outerReturn asUnsignedInteger ].
flushICacheFrom: callerReturnAddress asUnsignedInteger - extent to: callerReturnAddress asUnsignedInteger ].

"Jump into the oPIC at its entry"
coInterpreter executeCogMethod: oPIC fromLinkedSendWithReceiver: receiver.
Expand Down