VM Maker: VMMaker.oscog-eem.679.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

VM Maker: VMMaker.oscog-eem.679.mcz

commits-2
 
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.679.mcz

==================== Summary ====================

Name: VMMaker.oscog-eem.679
Author: eem
Time: 17 April 2014, 3:03:55.029 pm
UUID: 96f3797e-31e4-4c70-bd12-af82bff6fbe5
Ancestors: VMMaker.oscog-djm.678

Slang:
Rescue the SimpleStackBasedCogit by avoiding the conflict
between the object representation's numRegArgs and the
Cogit's numRegArgs by renaming object representation's
numRegArgs to preferredNumRegArgs.

Rescue running the Slang test workspace expressions before
initialization by adding guards in the relevant places.

ThreadedARMFFIPlugin: delete an unused method to nuke
an Undeclared.

=============== Diff against VMMaker.oscog-djm.678 ===============

Item was removed:
- ----- Method: CogObjectRepresentation>>numRegArgs (in category 'calling convention') -----
- numRegArgs
- "Define how many register arguments a StackToRegisterMapngCogit can and should use
- with the receiver.  The value must be 0, 1 or 2.  Note that a SimpleStackBasedCogit always
- has 0 register args (although the receiver is passed in a register)."
- self subclassResponsibility!

Item was added:
+ ----- Method: CogObjectRepresentation>>preferredNumRegArgs (in category 'calling convention') -----
+ preferredNumRegArgs
+ "Define how many register arguments a StackToRegisterMappingCogit can and should use
+ with the receiver.  The value must be 0, 1 or 2.  Note that a SimpleStackBasedCogit always
+ has 0 register args (although the receiver is passed in a register)."
+ self subclassResponsibility!

Item was removed:
- ----- Method: CogObjectRepresentationForSpur>>numRegArgs (in category 'calling convention') -----
- numRegArgs
- "The Spur object representation is simple enough that implementing
- at:put: is straight-forward and hence 2 register args are worth while."
- <api>
- ^2!

Item was added:
+ ----- Method: CogObjectRepresentationForSpur>>preferredNumRegArgs (in category 'calling convention') -----
+ preferredNumRegArgs
+ "Define how many register arguments a StackToRegisterMappingCogit can
+ and should use with the receiver.  The value must be 0, 1 or 2.  Note that a
+ SimpleStackBasedCogit always has 0 register args (although the receiver is
+ passed in a register).  The Spur object representation is simple enough that
+ implementing at:put: is straight-forward and hence 2 register args are worth while."
+ <inline: true>
+ ^2!

Item was removed:
- ----- Method: CogObjectRepresentationForSqueakV3>>numRegArgs (in category 'calling convention') -----
- numRegArgs
- "CogObjectRepresentationForSqueakV3 only implements at most 1-arg primitives, because
- the complexity of the object representation makes it difficult to implement at:put:, the most
- performance-critical 2-argument primitive."
- <api>
- ^1!

Item was added:
+ ----- Method: CogObjectRepresentationForSqueakV3>>preferredNumRegArgs (in category 'calling convention') -----
+ preferredNumRegArgs
+ "Define how many register arguments a StackToRegisterMappingCogit can
+ and should use with the receiver.  The value must be 0, 1 or 2.  Note that a
+ SimpleStackBasedCogit always has 0 register args (although the receiver is
+ passed in a register).  CogObjectRepresentationForSqueakV3 only implements
+ at most 1-arg primitives, because the complexity of the object representation
+ makes it difficult to implement at:put:, the most performance-critical 2-argument
+ primitive."
+ <inline: true>
+ ^1!

Item was changed:
  ----- Method: Cogit class>>declareCVarsIn: (in category 'translation') -----
  declareCVarsIn: aCCodeGenerator
  #( 'coInterpreter' 'objectMemory' 'methodZone' 'objectRepresentation'
  'cogBlockMethodSurrogateClass' 'cogMethodSurrogateClass'
  'threadManager' 'processor' 'lastNInstructions' 'simulatedAddresses'
  'simulatedTrampolines' 'simulatedVariableGetters' 'simulatedVariableSetters'
  'printRegisters' 'printInstructions' 'clickConfirm' 'singleStep') do:
  [:simulationVariableNotNeededForRealVM|
  aCCodeGenerator removeVariable: simulationVariableNotNeededForRealVM].
  NewspeakVM ifFalse:
  [#( 'dynSuperEntry' 'dynSuperEntryAlignment' 'dynamicSuperSendTrampolines'
  'ceImplicitReceiverTrampoline' 'ceExplicitReceiverTrampoline' 'cmDynSuperEntryOffset') do:
  [:variableNotNeededInNormalVM|
  aCCodeGenerator removeVariable: variableNotNeededInNormalVM]].
  aCCodeGenerator removeConstant: #COGMTVM. "this should be defined at compile time"
  aCCodeGenerator
  addHeaderFile:'<stddef.h>'; "for e.g. offsetof"
  addHeaderFile:'"sqCogStackAlignment.h"';
  addHeaderFile:'"cogmethod.h"';
  addHeaderFile:'#if COGMTVM';
  addHeaderFile:'"cointerpmt.h"';
  addHeaderFile:'#else';
  addHeaderFile:'"cointerp.h"';
  addHeaderFile:'#endif';
  addHeaderFile:'"cogit.h"';
  addHeaderFile:'"dispdbg.h"'.
  aCCodeGenerator
  var: #ceGetSP
  declareC: 'unsigned long (*ceGetSP)(void)';
  var: #ceCaptureCStackPointers
  declareC: 'void (*ceCaptureCStackPointers)(void)';
  var: #ceEnterCogCodePopReceiverReg
  declareC: 'void (*ceEnterCogCodePopReceiverReg)(void)';
  var: #realCEEnterCogCodePopReceiverReg
  declareC: 'void (*realCEEnterCogCodePopReceiverReg)(void)';
  var: #ceEnterCogCodePopReceiverAndClassRegs
  declareC: 'void (*ceEnterCogCodePopReceiverAndClassRegs)(void)';
  var: #realCEEnterCogCodePopReceiverAndClassRegs
  declareC: 'void (*realCEEnterCogCodePopReceiverAndClassRegs)(void)';
  var: #ceFlushICache
  declareC: 'static void (*ceFlushICache)(unsigned long from, unsigned long to)';
  var: #ceCheckFeaturesFunction
  declareC: 'static unsigned long (*ceCheckFeaturesFunction)(void)';
  var: #ceTryLockVMOwner
  declareC: 'unsigned long (*ceTryLockVMOwner)(void)';
  var: #ceUnlockVMOwner
  declareC: 'void (*ceUnlockVMOwner)(void)';
  var: #postCompileHook
  declareC: 'void (*postCompileHook)(CogMethod *, void *)';
  var: #openPICList declareC: 'CogMethod *openPICList = 0';
  var: #maxMethodBefore type: #'CogBlockMethod *'.
  aCCodeGenerator
  declareVar: 'aMethodLabel' type: #'AbstractInstruction'; "Has to come lexicographically before backEnd & methodLabel"
  var: #backEnd declareC: 'AbstractInstruction * const backEnd = &aMethodLabel';
  var: #methodLabel declareC: 'AbstractInstruction * const methodLabel = &aMethodLabel';
  var: #primInvokeLabel type: #'AbstractInstruction *'.
  self declareC: #(abstractOpcodes stackCheckLabel
  blockEntryLabel blockEntryNoContextSwitch
  stackOverflowCall sendMissCall entry noCheckEntry dynSuperEntry
  mnuCall interpretCall endCPICCase0 endCPICCase1)
  as: #'AbstractInstruction *'
  in: aCCodeGenerator.
  aCCodeGenerator
  declareVar: #annotations type: #'InstructionAnnotation *';
  declareVar: #blockStarts type: #'BlockStart *';
  declareVar: #fixups type: #'BytecodeFixup *'.
  aCCodeGenerator
  var: #sendTrampolines
  declareC: 'sqInt sendTrampolines[NumSendTrampolines]';
  var: #superSendTrampolines
  declareC: 'sqInt superSendTrampolines[NumSendTrampolines]';
  var: #dynamicSuperSendTrampolines
  declareC: 'sqInt dynamicSuperSendTrampolines[NumSendTrampolines]';
  var: #trampolineAddresses
  declareC: 'static char *trampolineAddresses[NumTrampolines*2]';
  var: #objectReferencesInRuntime
  declareC: 'static sqInt objectReferencesInRuntime[NumObjRefsInRuntime]';
  var: #cePositive32BitIntegerTrampoline
  declareC: 'static sqInt cePositive32BitIntegerTrampoline';
  var: #labelCounter
  type: #int;
  var: #traceFlags
  declareC: 'int traceFlags = 8 /* prim trace log on by default */';
  var: #cStackAlignment
  declareC: 'const int cStackAlignment = STACK_ALIGN_BYTES'.
  aCCodeGenerator
  declareVar: #CFramePointer type: #'void *';
  declareVar: #CStackPointer type: #'void *';
  declareVar: #minValidCallAddress type: #'unsigned long';
  declareVar: #debugPrimCallStackOffset type: #'unsigned long'.
+ aCCodeGenerator vmClass generatorTable ifNotNil:
+ [:generatorTable|
+ aCCodeGenerator
+ var: #generatorTable
+ declareC: 'BytecodeDescriptor generatorTable[', aCCodeGenerator vmClass generatorTable size, ']'
+ , (self tableInitializerFor: aCCodeGenerator vmClass generatorTable
+ in: aCCodeGenerator);
+ var: #primitiveGeneratorTable
+ declareC: 'PrimitiveDescriptor primitiveGeneratorTable[MaxCompiledPrimitiveIndex+1]'
+ , (self tableInitializerFor: aCCodeGenerator vmClass primitiveTable
+ in: aCCodeGenerator)].
- aCCodeGenerator
- var: #generatorTable
- declareC: 'BytecodeDescriptor generatorTable[', aCCodeGenerator vmClass generatorTable size, ']'
- , (self tableInitializerFor: aCCodeGenerator vmClass generatorTable
- in: aCCodeGenerator);
- var: #primitiveGeneratorTable
- declareC: 'PrimitiveDescriptor primitiveGeneratorTable[MaxCompiledPrimitiveIndex+1]'
- , (self tableInitializerFor: aCCodeGenerator vmClass primitiveTable
- in: aCCodeGenerator).
  "In C the abstract opcode names clash with the Smalltak generator syntactic sugar.
  Most of the syntactic sugar is inlined, but alas some remains.  Rename the syntactic
  sugar to avoid the clash."
  (self organization listAtCategoryNamed: #'abstract instructions') do:
  [:s|
  aCCodeGenerator addSelectorTranslation: s to: 'g', (aCCodeGenerator cFunctionNameFor: s)].
  aCCodeGenerator addSelectorTranslation: #halt: to: 'haltmsg'!

Item was changed:
  ----- Method: Cogit class>>tableFunctions (in category 'translation') -----
  tableFunctions
  "self tableFunctions"
  self getVMMaker ifNotNil:
  [:vmMaker| vmMaker cogitClass ~= self ifTrue: [^Set new]].
+ generatorTable ifNil:
+ [^Set new].
  ^Set new
  addAll: (generatorTable object
  collect: [:ea| ea generator]);
  addAll: (generatorTable object
  select: [:ea| ea spanFunction notNil]
  thenCollect: [:ea| ea spanFunction]);
  addAll: (generatorTable object
  select: [:ea| ea needsFrameFunction notNil]
  thenCollect: [:ea| ea needsFrameFunction]);
  addAll: (primitiveTable object
  select: [:ea| ea notNil and: [ea primitiveGenerator notNil]]
  thenCollect: [:ea| ea primitiveGenerator]);
  addAll: (primitiveTable object
  select: [:ea| ea notNil and: [ea enabled notNil]]
  thenCollect: [:ea| ea enabled]);
  asSortedCollection: [:a :b| a caseInsensitiveLessOrEqual: b]!

Item was changed:
  ----- Method: StackToRegisterMappingCogit class>>declareCVarsIn: (in category 'translation') -----
  declareCVarsIn: aCodeGen
  aCodeGen
  var: #methodAbortTrampolines
  declareC: 'sqInt methodAbortTrampolines[4]';
  var: #picAbortTrampolines
  declareC: 'sqInt picAbortTrampolines[4]';
  var: #picMissTrampolines
  declareC: 'sqInt picMissTrampolines[4]';
  var: 'ceEnter0ArgsPIC'
  declareC: 'void (*ceEnter0ArgsPIC)(void)';
  var: 'ceEnter1ArgsPIC'
  declareC: 'void (*ceEnter1ArgsPIC)(void)';
  var: 'ceEnter2ArgsPIC'
  declareC: 'void (*ceEnter2ArgsPIC)(void)';
  var: #ceEnterCogCodePopReceiverArg0Regs
  declareC: 'void (*ceEnterCogCodePopReceiverArg0Regs)(void)';
  var: #realCEEnterCogCodePopReceiverArg0Regs
  declareC: 'void (*realCEEnterCogCodePopReceiverArg0Regs)(void)';
  var: #ceEnterCogCodePopReceiverArg1Arg0Regs
  declareC: 'void (*ceEnterCogCodePopReceiverArg1Arg0Regs)(void)';
  var: #realCEEnterCogCodePopReceiverArg1Arg0Regs
  declareC: 'void (*realCEEnterCogCodePopReceiverArg1Arg0Regs)(void)';
  var: 'simStack'
  declareC: 'CogSimStackEntry simStack[', ((CoInterpreter bindingOf: #LargeContextSize) value * 5 / 4 // BytesPerWord) asString, ']';
  var: 'simSelf'
  type: #CogSimStackEntry;
  var: #optStatus
  type: #CogSSOptStatus;
- var: 'isPushNilFunction'
- declareC: 'sqInt (* const isPushNilFunction)(struct _BytecodeDescriptor *,sqInt,sqInt,sqInt) = ', (aCodeGen cFunctionNameFor: self isPushNilFunction);
- var: 'pushNilSizeFunction'
- declareC: 'sqInt (* const pushNilSizeFunction)(sqInt) = ', (aCodeGen cFunctionNameFor: self pushNilSizeFunction);
  var: 'prevBCDescriptor'
  type: #'BytecodeDescriptor *'.
 
+ self isPushNilFunction ifNotNil:
+ [aCodeGen
+ var: 'isPushNilFunction'
+ declareC: 'sqInt (* const isPushNilFunction)(struct _BytecodeDescriptor *,sqInt,sqInt,sqInt) = ', (aCodeGen cFunctionNameFor: self isPushNilFunction);
+ var: 'pushNilSizeFunction'
+ declareC: 'sqInt (* const pushNilSizeFunction)(sqInt) = ', (aCodeGen cFunctionNameFor: self pushNilSizeFunction)].
+
  aCodeGen
  addSelectorTranslation: #register to: (aCodeGen cFunctionNameFor: 'registerr');
  addSelectorTranslation: #register: to: (aCodeGen cFunctionNameFor: 'registerr:')!

Item was changed:
  ----- Method: StackToRegisterMappingCogit>>numRegArgs (in category 'compile abstract instructions') -----
  numRegArgs
+ <api>
+ ^objectRepresentation preferredNumRegArgs!
- <doNotGenerate>
- ^objectRepresentation numRegArgs!

Item was removed:
- ----- Method: ThreadedARMFFIPlugin class>>numRegArgs (in category 'accessing') -----
- numRegArgs
- ^NumRegArgs!

Item was changed:
  ----- Method: VMClass class>>initializeMiscConstants (in category 'initialization') -----
  initializeMiscConstants
  "Falsify the `what type of VM is this?' flags that are defined in the various interp.h files,
  or in the case of VMBIGENDIAN the various sqConfig.h files.
  Subclass implementations need to include a super initializeMiscConstants"
 
  | omc |
  VMBIGENDIAN class. "Mention this for the benefit of CCodeGenerator>>emitCConstantsOn:"
  self isInterpreterClass ifTrue:
  [STACKVM := COGVM := COGMTVM := false].
 
+ initializationOptions ifNil: [self initializationOptions: Dictionary new].
  omc := initializationOptions at: #ObjectMemory ifAbsent: nil.
  initializationOptions
  at: #SqueakV3ObjectMemory "the good ole default"
  put: (omc
  ifNil: [true]
  ifNotNil: [(Smalltalk at: omc) inheritsFrom: ObjectMemory]);
  at: #SpurObjectMemory "the new condender"
  put: (omc
  ifNil: [false]
  ifNotNil: [(Smalltalk at: omc) inheritsFrom: SpurMemoryManager]).
 
  "Use ifAbsentPut: so that they will get copied back to the
  VMMaker's options and dead code will likely be eliminated."
  NewspeakVM := initializationOptions at: #NewspeakVM ifAbsentPut: [false].
  MULTIPLEBYTECODESETS := initializationOptions at: #MULTIPLEBYTECODESETS ifAbsentPut: [false].
  "N.B.  Not yet implemented."
  IMMUTABILITY := initializationOptions at: #IMMUTABILITY ifAbsentPut: [false].
 
  "These for scripts etc... Usually they should get set by an Interpreter class's initializeMiscConstantsWith:"
  (initializationOptions includesKey: #STACKVM) ifTrue:
  [STACKVM := initializationOptions at: #STACKVM].
  (initializationOptions includesKey: #COGVM) ifTrue:
  [COGVM := initializationOptions at: #COGVM].
  (initializationOptions includesKey: #COGMTVM) ifTrue:
  [COGMTVM := initializationOptions at: #COGMTVM]!