Main Page   Class Hierarchy   Compound List   File List   Header Files   Compound Members   File Members  

prim.h

This is the verbatim text of the prim.h include file.
/* Sun-$Revision: 23.6 $ */

/* Copyright 1992-9 Sun Microsystems, Inc. and Stanford University.
   See the LICENSE file for license information. */

# pragma interface

// Classify primitives according to kinds of optimizations that can be
// applied.
enum primType {
  InternalPrimitive,       // Prim. only generated by compiler, not visible at
                           // Self level, can't be directly invoked from Self.
                           // Example: SendMessage_stub.
                           // All other primTypes are visible.
  ExternalPrimitive,       // Prim. represented by function that is called, not
                           // inlined. NOT the opposite of InternalPrimitive.
  RestartPrimitive,        // The _Restart prim.
  UnwindProtectPrimitive,  // The _OnNonLocalReturn: prim.
  ClonePrimitive,          // The _Clone prim.
  CloneVectorPrimitive,    // Either cloning obj. vector or byte vector.
  IntComparisonPrimitive,  // Integer comparison prim.
  IntArithmeticPrimitive,  // Integer arithmetic.
  FloatComparisonPrimitive,// FP comparison prim.
  FloatArithmeticPrimitive,// FP arithmetic.
  EQPrimitive,             // The _Eq: prim.
  AtPrimitive,             // The _At: prim.
  AtPutPrimitive,          // The _At:Put: prim.
  SizePrimitive,           // The _Size prim.
  ByteAtPrimitive,         // The _ByteAt: prim.
  ByteAtPutPrimitive,      // The _ByteAt:Put: prim.
  ByteSizePrimitive,       // The _ByteSize prim.
  NotReallyAPrimitive      // Eliminated by the compiler; just here for documentation
  };


// Classify primitives according to the values they return.
// In addition to the return type specified below, all primitives may return
// a failure indicator, e.g. as constructued using ErrorCodes::vmString_prim_error().
enum primExprType {
  UnknownPrimType,         // Nothing assumed about return value. Can return
                           // anything. Always valid classification. 
  NoReturnPrimType,        // Does not return (e.g., aborts)
  ReceiverPrimType,        // Returns the receiver.
  ReceiverMapPrimType,     // Returns object of same type (map) as receiver
  IntegerPrimType,         // Returns integer.
  FloatPrimType,           // Returns float.
  StringPrimType,          // Returns string.
  ObjVectorPrimType,       // Returns object vector.
  ByteVectorPrimType,      // Returns byte vector.
  BooleanPrimType          // Returns trueObj or falseObj.
  };

struct PrimDesc {
  char* _name;              // Name of primitive, does not include initial
                            // "_".
  fntype _fn;               // Pointer to function implementing primitive.
                            // (A transition vector on the PPC mac).
  primType _type;           // Specifies optimizations that can be applied
                            // (see also def. of primType).
  primExprType _etype;      // Return type of prim. (see def. of primExprType).
  bool _canFail;            // Set true if the prim. may fail, e.g. if it can
                            // return a value constructed by ErrorCodes::vmString_prim_error().
  bool _canScavenge;        // Set true if a scavenge can occur while executing
                            // prim (either explicit call to scavenge or e.g. 
                            // doing eval). See also canWalkStack and 
                            // canAbortProcess.
                            // Note: really means that must be able to find all oops in stack
                            // during this primitive. (e.g. need a reg mask) -- dmu 5/99
                            // (motivation: need to save regs in a known place)
  bool _canBeConstantFolded;// If true implies prim. can be constant folded.
  bool _cantBeMovedOrCut;   // If true implies prim can't be eliminated/moved.
  bool _canWalkStack;       // Set true if prim. might do a stack dump or 
                            // otherwise access stack.
                            // If true, then canScavenge must also be true!
  bool _canAbortProcess;    // Set true if prim. may cause a process abort.
                            // If true, then canScavenge must also be true!
  char* _docString;         // documentation string
// public:
  char*         name() { return _name; }
  primType      type() { return _type; }
  fntype        fn() { return _fn; }
  primExprType  etype()                 { return _etype; }
  bool          canFail()               { return _canFail; }
  bool          canScavenge()           { return _canScavenge; }
  bool          canBeConstantFolded()   { return _canBeConstantFolded; }
  bool          cantBeMovedOrCut()      { return _cantBeMovedOrCut; }
  bool          canWalkStack()          { return _canWalkStack; }
  bool          canAbortProcess()       { return _canAbortProcess; }
  bool          needsNLRCode()          { return _canAbortProcess; }
  char*         docString()             { return _docString; }
  inline void   verify();
};

PrimDesc* getPrimDescOfSelector(stringOop selector, bool internal = false);

PrimDesc* getPrimDescOfBytes(char* selector, fint len, bool internal = false);

inline PrimDesc* getPrimDescOfString(char* selector, bool internal = false) {
  return getPrimDescOfBytes(selector, strlen(selector), internal); }

PrimDesc* getPrimDescOfFunction(fntype fn, bool internal = false);

PrimDesc* getPrimDescOfFirstInstruction(char* fn_start, bool internal = false);

char* getPrimName(char* fn_start);

fint getPrimCallEndOffset(char* fn_start);

PrimDesc** primDescTable();


Generated at Tue Jun 27 12:08:57 2000 for SelfVM by doxygen 1.0.0 written by Dimitri van Heesch, © 1997-1999