hotspot/src/share/vm/oops/methodData.hpp
changeset 20709 034be898bf04
parent 20702 bbe0fcde6e13
child 21095 1a04f7b3946e
equal deleted inserted replaced
20708:d150e1293886 20709:034be898bf04
   269 //
   269 //
   270 // A ProfileData object is created to refer to a section of profiling
   270 // A ProfileData object is created to refer to a section of profiling
   271 // data in a structured way.
   271 // data in a structured way.
   272 class ProfileData : public ResourceObj {
   272 class ProfileData : public ResourceObj {
   273   friend class TypeEntries;
   273   friend class TypeEntries;
       
   274   friend class ReturnTypeEntry;
   274   friend class TypeStackSlotEntries;
   275   friend class TypeStackSlotEntries;
   275 private:
   276 private:
   276 #ifndef PRODUCT
   277 #ifndef PRODUCT
   277   enum {
   278   enum {
   278     tab_width_one = 16,
   279     tab_width_one = 16,
   746     stack_slot_entry,
   747     stack_slot_entry,
   747     type_entry,
   748     type_entry,
   748     per_arg_cell_count
   749     per_arg_cell_count
   749   };
   750   };
   750 
   751 
   751   // Start with a header if needed. It stores the number of cells used
       
   752   // for this call type information. Unless we collect only profiling
       
   753   // for a single argument the number of cells is unknown statically.
       
   754   static int header_cell_count() {
       
   755     return (TypeProfileArgsLimit > 1) ? 1 : 0;
       
   756   }
       
   757 
       
   758   static int cell_count_local_offset() {
       
   759      assert(arguments_profiling_enabled() && TypeProfileArgsLimit > 1, "no cell count");
       
   760      return 0;
       
   761    }
       
   762 
       
   763   int cell_count_global_offset() const {
       
   764     return _base_off + cell_count_local_offset();
       
   765   }
       
   766 
       
   767   // offset of cell for stack slot for entry i within ProfileData object
   752   // offset of cell for stack slot for entry i within ProfileData object
   768   int stack_slot_global_offset(int i) const {
   753   int stack_slot_offset(int i) const {
   769     return _base_off + stack_slot_local_offset(i);
   754     return _base_off + stack_slot_local_offset(i);
   770   }
   755   }
   771 
   756 
   772   void check_number_of_arguments(int total) {
       
   773     assert(number_of_arguments() == total, "should be set in DataLayout::initialize");
       
   774   }
       
   775 
       
   776   // number of cells not counting the header
       
   777   int cell_count_no_header() const {
       
   778     return _pd->uint_at(cell_count_global_offset());
       
   779   }
       
   780 
       
   781   static bool arguments_profiling_enabled();
       
   782   static void assert_arguments_profiling_enabled() {
       
   783     assert(arguments_profiling_enabled(), "args profiling should be on");
       
   784   }
       
   785 
       
   786 protected:
   757 protected:
       
   758   const int _number_of_entries;
   787 
   759 
   788   // offset of cell for type for entry i within ProfileData object
   760   // offset of cell for type for entry i within ProfileData object
   789   int type_global_offset(int i) const {
   761   int type_offset(int i) const {
   790     return _base_off + type_local_offset(i);
   762     return _base_off + type_local_offset(i);
   791   }
   763   }
   792 
   764 
   793 public:
   765 public:
   794 
   766 
   795   TypeStackSlotEntries(int base_off)
   767   TypeStackSlotEntries(int base_off, int nb_entries)
   796     : TypeEntries(base_off) {}
   768     : TypeEntries(base_off), _number_of_entries(nb_entries) {}
   797 
   769 
   798   static int compute_cell_count(BytecodeStream* stream);
   770   static int compute_cell_count(Symbol* signature, int max);
   799 
   771 
   800   static void initialize(DataLayout* dl, int base, int cell_count) {
   772   void post_initialize(Symbol* signature, bool has_receiver);
   801     if (TypeProfileArgsLimit > 1) {
       
   802       int off = base + cell_count_local_offset();
       
   803       dl->set_cell_at(off, cell_count - base - header_cell_count());
       
   804     }
       
   805   }
       
   806 
       
   807   void post_initialize(BytecodeStream* stream);
       
   808 
       
   809   int number_of_arguments() const {
       
   810     assert_arguments_profiling_enabled();
       
   811     if (TypeProfileArgsLimit > 1) {
       
   812       int cell_count = cell_count_no_header();
       
   813       int nb = cell_count / TypeStackSlotEntries::per_arg_count();
       
   814       assert(nb > 0 && nb <= TypeProfileArgsLimit , "only when we profile args");
       
   815       return nb;
       
   816     } else {
       
   817       assert(TypeProfileArgsLimit == 1, "at least one arg");
       
   818       return 1;
       
   819     }
       
   820   }
       
   821 
       
   822   int cell_count() const {
       
   823     assert_arguments_profiling_enabled();
       
   824     if (TypeProfileArgsLimit > 1) {
       
   825       return _base_off + header_cell_count() + _pd->int_at_unchecked(cell_count_global_offset());
       
   826     } else {
       
   827       return _base_off + TypeStackSlotEntries::per_arg_count();
       
   828     }
       
   829   }
       
   830 
   773 
   831   // offset of cell for stack slot for entry i within this block of cells for a TypeStackSlotEntries
   774   // offset of cell for stack slot for entry i within this block of cells for a TypeStackSlotEntries
   832   static int stack_slot_local_offset(int i) {
   775   static int stack_slot_local_offset(int i) {
   833     assert_arguments_profiling_enabled();
   776     return i * per_arg_cell_count + stack_slot_entry;
   834     return header_cell_count() + i * per_arg_cell_count + stack_slot_entry;
       
   835   }
   777   }
   836 
   778 
   837   // offset of cell for type for entry i within this block of cells for a TypeStackSlotEntries
   779   // offset of cell for type for entry i within this block of cells for a TypeStackSlotEntries
   838   static int type_local_offset(int i) {
   780   static int type_local_offset(int i) {
   839     return header_cell_count() + i * per_arg_cell_count + type_entry;
   781     return i * per_arg_cell_count + type_entry;
   840   }
   782   }
   841 
   783 
   842   // stack slot for entry i
   784   // stack slot for entry i
   843   uint stack_slot(int i) const {
   785   uint stack_slot(int i) const {
   844     assert(i >= 0 && i < number_of_arguments(), "oob");
   786     assert(i >= 0 && i < _number_of_entries, "oob");
   845     return _pd->uint_at(stack_slot_global_offset(i));
   787     return _pd->uint_at(stack_slot_offset(i));
   846   }
   788   }
   847 
   789 
   848   // set stack slot for entry i
   790   // set stack slot for entry i
   849   void set_stack_slot(int i, uint num) {
   791   void set_stack_slot(int i, uint num) {
   850     assert(i >= 0 && i < number_of_arguments(), "oob");
   792     assert(i >= 0 && i < _number_of_entries, "oob");
   851     _pd->set_uint_at(stack_slot_global_offset(i), num);
   793     _pd->set_uint_at(stack_slot_offset(i), num);
   852   }
   794   }
   853 
   795 
   854   // type for entry i
   796   // type for entry i
   855   intptr_t type(int i) const {
   797   intptr_t type(int i) const {
   856     assert(i >= 0 && i < number_of_arguments(), "oob");
   798     assert(i >= 0 && i < _number_of_entries, "oob");
   857     return _pd->intptr_at(type_global_offset(i));
   799     return _pd->intptr_at(type_offset(i));
   858   }
   800   }
   859 
   801 
   860   // set type for entry i
   802   // set type for entry i
   861   void set_type(int i, intptr_t k) {
   803   void set_type(int i, intptr_t k) {
   862     assert(i >= 0 && i < number_of_arguments(), "oob");
   804     assert(i >= 0 && i < _number_of_entries, "oob");
   863     _pd->set_intptr_at(type_global_offset(i), k);
   805     _pd->set_intptr_at(type_offset(i), k);
   864   }
   806   }
   865 
   807 
   866   static ByteSize per_arg_size() {
   808   static ByteSize per_arg_size() {
   867     return in_ByteSize(per_arg_cell_count * DataLayout::cell_size);
   809     return in_ByteSize(per_arg_cell_count * DataLayout::cell_size);
   868   }
   810   }
   869 
   811 
   870   static int per_arg_count() {
   812   static int per_arg_count() {
   871     return per_arg_cell_count ;
   813     return per_arg_cell_count ;
   872   }
   814   }
   873 
       
   874   // Code generation support
       
   875    static ByteSize cell_count_offset() {
       
   876      return in_ByteSize(cell_count_local_offset() * DataLayout::cell_size);
       
   877    }
       
   878 
       
   879    static ByteSize args_data_offset() {
       
   880      return in_ByteSize(header_cell_count() * DataLayout::cell_size);
       
   881    }
       
   882 
       
   883    static ByteSize stack_slot_offset(int i) {
       
   884      return in_ByteSize(stack_slot_local_offset(i) * DataLayout::cell_size);
       
   885    }
       
   886 
       
   887    static ByteSize type_offset(int i) {
       
   888      return in_ByteSize(type_local_offset(i) * DataLayout::cell_size);
       
   889    }
       
   890 
   815 
   891   // GC support
   816   // GC support
   892   void clean_weak_klass_links(BoolObjectClosure* is_alive_closure);
   817   void clean_weak_klass_links(BoolObjectClosure* is_alive_closure);
   893 
   818 
   894 #ifndef PRODUCT
   819 #ifndef PRODUCT
   895   void print_data_on(outputStream* st) const;
   820   void print_data_on(outputStream* st) const;
   896 #endif
   821 #endif
   897 };
   822 };
   898 
   823 
       
   824 // Type entry used for return from a call. A single cell to record the
       
   825 // type.
       
   826 class ReturnTypeEntry : public TypeEntries {
       
   827 
       
   828 private:
       
   829   enum {
       
   830     cell_count = 1
       
   831   };
       
   832 
       
   833 public:
       
   834   ReturnTypeEntry(int base_off)
       
   835     : TypeEntries(base_off) {}
       
   836 
       
   837   void post_initialize() {
       
   838     set_type(type_none());
       
   839   }
       
   840 
       
   841   intptr_t type() const {
       
   842     return _pd->intptr_at(_base_off);
       
   843   }
       
   844 
       
   845   void set_type(intptr_t k) {
       
   846     _pd->set_intptr_at(_base_off, k);
       
   847   }
       
   848 
       
   849   static int static_cell_count() {
       
   850     return cell_count;
       
   851   }
       
   852 
       
   853   static ByteSize size() {
       
   854     return in_ByteSize(cell_count * DataLayout::cell_size);
       
   855   }
       
   856 
       
   857   ByteSize type_offset() {
       
   858     return DataLayout::cell_offset(_base_off);
       
   859   }
       
   860 
       
   861   // GC support
       
   862   void clean_weak_klass_links(BoolObjectClosure* is_alive_closure);
       
   863 
       
   864 #ifndef PRODUCT
       
   865   void print_data_on(outputStream* st) const;
       
   866 #endif
       
   867 };
       
   868 
       
   869 // Entries to collect type information at a call: contains arguments
       
   870 // (TypeStackSlotEntries), a return type (ReturnTypeEntry) and a
       
   871 // number of cells. Because the number of cells for the return type is
       
   872 // smaller than the number of cells for the type of an arguments, the
       
   873 // number of cells is used to tell how many arguments are profiled and
       
   874 // whether a return value is profiled. See has_arguments() and
       
   875 // has_return().
       
   876 class TypeEntriesAtCall {
       
   877 private:
       
   878   static int stack_slot_local_offset(int i) {
       
   879     return header_cell_count() + TypeStackSlotEntries::stack_slot_local_offset(i);
       
   880   }
       
   881 
       
   882   static int argument_type_local_offset(int i) {
       
   883     return header_cell_count() + TypeStackSlotEntries::type_local_offset(i);;
       
   884   }
       
   885 
       
   886 public:
       
   887 
       
   888   static int header_cell_count() {
       
   889     return 1;
       
   890   }
       
   891 
       
   892   static int cell_count_local_offset() {
       
   893     return 0;
       
   894   }
       
   895 
       
   896   static int compute_cell_count(BytecodeStream* stream);
       
   897 
       
   898   static void initialize(DataLayout* dl, int base, int cell_count) {
       
   899     int off = base + cell_count_local_offset();
       
   900     dl->set_cell_at(off, cell_count - base - header_cell_count());
       
   901   }
       
   902 
       
   903   static bool arguments_profiling_enabled();
       
   904   static bool return_profiling_enabled();
       
   905 
       
   906   // Code generation support
       
   907   static ByteSize cell_count_offset() {
       
   908     return in_ByteSize(cell_count_local_offset() * DataLayout::cell_size);
       
   909   }
       
   910 
       
   911   static ByteSize args_data_offset() {
       
   912     return in_ByteSize(header_cell_count() * DataLayout::cell_size);
       
   913   }
       
   914 
       
   915   static ByteSize stack_slot_offset(int i) {
       
   916     return in_ByteSize(stack_slot_local_offset(i) * DataLayout::cell_size);
       
   917   }
       
   918 
       
   919   static ByteSize argument_type_offset(int i) {
       
   920     return in_ByteSize(argument_type_local_offset(i) * DataLayout::cell_size);
       
   921   }
       
   922 };
       
   923 
   899 // CallTypeData
   924 // CallTypeData
   900 //
   925 //
   901 // A CallTypeData is used to access profiling information about a non
   926 // A CallTypeData is used to access profiling information about a non
   902 // virtual call for which we collect type information about arguments.
   927 // virtual call for which we collect type information about arguments
       
   928 // and return value.
   903 class CallTypeData : public CounterData {
   929 class CallTypeData : public CounterData {
   904 private:
   930 private:
       
   931   // entries for arguments if any
   905   TypeStackSlotEntries _args;
   932   TypeStackSlotEntries _args;
       
   933   // entry for return type if any
       
   934   ReturnTypeEntry _ret;
       
   935 
       
   936   int cell_count_global_offset() const {
       
   937     return CounterData::static_cell_count() + TypeEntriesAtCall::cell_count_local_offset();
       
   938   }
       
   939 
       
   940   // number of cells not counting the header
       
   941   int cell_count_no_header() const {
       
   942     return uint_at(cell_count_global_offset());
       
   943   }
       
   944 
       
   945   void check_number_of_arguments(int total) {
       
   946     assert(number_of_arguments() == total, "should be set in DataLayout::initialize");
       
   947   }
       
   948 
       
   949 protected:
       
   950   // An entry for a return value takes less space than an entry for an
       
   951   // argument so if the number of cells exceeds the number of cells
       
   952   // needed for an argument, this object contains type information for
       
   953   // at least one argument.
       
   954   bool has_arguments() const {
       
   955     bool res = cell_count_no_header() >= TypeStackSlotEntries::per_arg_count();
       
   956     assert (!res || TypeEntriesAtCall::arguments_profiling_enabled(), "no profiling of arguments");
       
   957     return res;
       
   958   }
   906 
   959 
   907 public:
   960 public:
   908   CallTypeData(DataLayout* layout) :
   961   CallTypeData(DataLayout* layout) :
   909     CounterData(layout), _args(CounterData::static_cell_count())  {
   962     CounterData(layout),
       
   963     _args(CounterData::static_cell_count()+TypeEntriesAtCall::header_cell_count(), number_of_arguments()),
       
   964     _ret(cell_count() - ReturnTypeEntry::static_cell_count())
       
   965   {
   910     assert(layout->tag() == DataLayout::call_type_data_tag, "wrong type");
   966     assert(layout->tag() == DataLayout::call_type_data_tag, "wrong type");
   911     // Some compilers (VC++) don't want this passed in member initialization list
   967     // Some compilers (VC++) don't want this passed in member initialization list
   912     _args.set_profile_data(this);
   968     _args.set_profile_data(this);
   913   }
   969     _ret.set_profile_data(this);
   914 
   970   }
   915   const TypeStackSlotEntries* args() const { return &_args; }
   971 
       
   972   const TypeStackSlotEntries* args() const {
       
   973     assert(has_arguments(), "no profiling of arguments");
       
   974     return &_args;
       
   975   }
       
   976 
       
   977   const ReturnTypeEntry* ret() const {
       
   978     assert(has_return(), "no profiling of return value");
       
   979     return &_ret;
       
   980   }
   916 
   981 
   917   virtual bool is_CallTypeData() const { return true; }
   982   virtual bool is_CallTypeData() const { return true; }
   918 
   983 
   919   static int static_cell_count() {
   984   static int static_cell_count() {
   920     return -1;
   985     return -1;
   921   }
   986   }
   922 
   987 
   923   static int compute_cell_count(BytecodeStream* stream) {
   988   static int compute_cell_count(BytecodeStream* stream) {
   924     return CounterData::static_cell_count() + TypeStackSlotEntries::compute_cell_count(stream);
   989     return CounterData::static_cell_count() + TypeEntriesAtCall::compute_cell_count(stream);
   925   }
   990   }
   926 
   991 
   927   static void initialize(DataLayout* dl, int cell_count) {
   992   static void initialize(DataLayout* dl, int cell_count) {
   928     TypeStackSlotEntries::initialize(dl, CounterData::static_cell_count(), cell_count);
   993     TypeEntriesAtCall::initialize(dl, CounterData::static_cell_count(), cell_count);
   929   }
   994   }
   930 
   995 
   931   virtual void post_initialize(BytecodeStream* stream, MethodData* mdo) {
   996   virtual void post_initialize(BytecodeStream* stream, MethodData* mdo);
   932     _args.post_initialize(stream);
       
   933   }
       
   934 
   997 
   935   virtual int cell_count() const {
   998   virtual int cell_count() const {
   936     return _args.cell_count();
   999     return CounterData::static_cell_count() +
   937   }
  1000       TypeEntriesAtCall::header_cell_count() +
   938 
  1001       int_at_unchecked(cell_count_global_offset());
   939   uint number_of_arguments() const {
  1002   }
   940     return args()->number_of_arguments();
  1003 
       
  1004   int number_of_arguments() const {
       
  1005     return cell_count_no_header() / TypeStackSlotEntries::per_arg_count();
   941   }
  1006   }
   942 
  1007 
   943   void set_argument_type(int i, Klass* k) {
  1008   void set_argument_type(int i, Klass* k) {
       
  1009     assert(has_arguments(), "no arguments!");
   944     intptr_t current = _args.type(i);
  1010     intptr_t current = _args.type(i);
   945     _args.set_type(i, TypeEntries::with_status(k, current));
  1011     _args.set_type(i, TypeEntries::with_status(k, current));
   946   }
  1012   }
   947 
  1013 
       
  1014   void set_return_type(Klass* k) {
       
  1015     assert(has_return(), "no return!");
       
  1016     intptr_t current = _ret.type();
       
  1017     _ret.set_type(TypeEntries::with_status(k, current));
       
  1018   }
       
  1019 
       
  1020   // An entry for a return value takes less space than an entry for an
       
  1021   // argument, so if the remainder of the number of cells divided by
       
  1022   // the number of cells for an argument is not null, a return value
       
  1023   // is profiled in this object.
       
  1024   bool has_return() const {
       
  1025     bool res = (cell_count_no_header() % TypeStackSlotEntries::per_arg_count()) != 0;
       
  1026     assert (!res || TypeEntriesAtCall::return_profiling_enabled(), "no profiling of return values");
       
  1027     return res;
       
  1028   }
       
  1029 
   948   // Code generation support
  1030   // Code generation support
   949   static ByteSize args_data_offset() {
  1031   static ByteSize args_data_offset() {
   950     return cell_offset(CounterData::static_cell_count()) + TypeStackSlotEntries::args_data_offset();
  1032     return cell_offset(CounterData::static_cell_count()) + TypeEntriesAtCall::args_data_offset();
   951   }
  1033   }
   952 
  1034 
   953   // GC support
  1035   // GC support
   954   virtual void clean_weak_klass_links(BoolObjectClosure* is_alive_closure) {
  1036   virtual void clean_weak_klass_links(BoolObjectClosure* is_alive_closure) {
   955     _args.clean_weak_klass_links(is_alive_closure);
  1037     if (has_arguments()) {
       
  1038       _args.clean_weak_klass_links(is_alive_closure);
       
  1039     }
       
  1040     if (has_return()) {
       
  1041       _ret.clean_weak_klass_links(is_alive_closure);
       
  1042     }
   956   }
  1043   }
   957 
  1044 
   958 #ifndef PRODUCT
  1045 #ifndef PRODUCT
   959   virtual void print_data_on(outputStream* st) const;
  1046   virtual void print_data_on(outputStream* st) const;
   960 #endif
  1047 #endif
  1103 
  1190 
  1104 // VirtualCallTypeData
  1191 // VirtualCallTypeData
  1105 //
  1192 //
  1106 // A VirtualCallTypeData is used to access profiling information about
  1193 // A VirtualCallTypeData is used to access profiling information about
  1107 // a virtual call for which we collect type information about
  1194 // a virtual call for which we collect type information about
  1108 // arguments.
  1195 // arguments and return value.
  1109 class VirtualCallTypeData : public VirtualCallData {
  1196 class VirtualCallTypeData : public VirtualCallData {
  1110 private:
  1197 private:
       
  1198   // entries for arguments if any
  1111   TypeStackSlotEntries _args;
  1199   TypeStackSlotEntries _args;
       
  1200   // entry for return type if any
       
  1201   ReturnTypeEntry _ret;
       
  1202 
       
  1203   int cell_count_global_offset() const {
       
  1204     return VirtualCallData::static_cell_count() + TypeEntriesAtCall::cell_count_local_offset();
       
  1205   }
       
  1206 
       
  1207   // number of cells not counting the header
       
  1208   int cell_count_no_header() const {
       
  1209     return uint_at(cell_count_global_offset());
       
  1210   }
       
  1211 
       
  1212   void check_number_of_arguments(int total) {
       
  1213     assert(number_of_arguments() == total, "should be set in DataLayout::initialize");
       
  1214   }
       
  1215 
       
  1216 protected:
       
  1217   // An entry for a return value takes less space than an entry for an
       
  1218   // argument so if the number of cells exceeds the number of cells
       
  1219   // needed for an argument, this object contains type information for
       
  1220   // at least one argument.
       
  1221   bool has_arguments() const {
       
  1222     bool res = cell_count_no_header() >= TypeStackSlotEntries::per_arg_count();
       
  1223     assert (!res || TypeEntriesAtCall::arguments_profiling_enabled(), "no profiling of arguments");
       
  1224     return res;
       
  1225   }
  1112 
  1226 
  1113 public:
  1227 public:
  1114   VirtualCallTypeData(DataLayout* layout) :
  1228   VirtualCallTypeData(DataLayout* layout) :
  1115     VirtualCallData(layout), _args(VirtualCallData::static_cell_count())  {
  1229     VirtualCallData(layout),
       
  1230     _args(VirtualCallData::static_cell_count()+TypeEntriesAtCall::header_cell_count(), number_of_arguments()),
       
  1231     _ret(cell_count() - ReturnTypeEntry::static_cell_count())
       
  1232   {
  1116     assert(layout->tag() == DataLayout::virtual_call_type_data_tag, "wrong type");
  1233     assert(layout->tag() == DataLayout::virtual_call_type_data_tag, "wrong type");
  1117     // Some compilers (VC++) don't want this passed in member initialization list
  1234     // Some compilers (VC++) don't want this passed in member initialization list
  1118     _args.set_profile_data(this);
  1235     _args.set_profile_data(this);
  1119   }
  1236     _ret.set_profile_data(this);
  1120 
  1237   }
  1121   const TypeStackSlotEntries* args() const { return &_args; }
  1238 
       
  1239   const TypeStackSlotEntries* args() const {
       
  1240     assert(has_arguments(), "no profiling of arguments");
       
  1241     return &_args;
       
  1242   }
       
  1243 
       
  1244   const ReturnTypeEntry* ret() const {
       
  1245     assert(has_return(), "no profiling of return value");
       
  1246     return &_ret;
       
  1247   }
  1122 
  1248 
  1123   virtual bool is_VirtualCallTypeData() const { return true; }
  1249   virtual bool is_VirtualCallTypeData() const { return true; }
  1124 
  1250 
  1125   static int static_cell_count() {
  1251   static int static_cell_count() {
  1126     return -1;
  1252     return -1;
  1127   }
  1253   }
  1128 
  1254 
  1129   static int compute_cell_count(BytecodeStream* stream) {
  1255   static int compute_cell_count(BytecodeStream* stream) {
  1130     return VirtualCallData::static_cell_count() + TypeStackSlotEntries::compute_cell_count(stream);
  1256     return VirtualCallData::static_cell_count() + TypeEntriesAtCall::compute_cell_count(stream);
  1131   }
  1257   }
  1132 
  1258 
  1133   static void initialize(DataLayout* dl, int cell_count) {
  1259   static void initialize(DataLayout* dl, int cell_count) {
  1134     TypeStackSlotEntries::initialize(dl, VirtualCallData::static_cell_count(), cell_count);
  1260     TypeEntriesAtCall::initialize(dl, VirtualCallData::static_cell_count(), cell_count);
  1135   }
  1261   }
  1136 
  1262 
  1137   virtual void post_initialize(BytecodeStream* stream, MethodData* mdo) {
  1263   virtual void post_initialize(BytecodeStream* stream, MethodData* mdo);
  1138     _args.post_initialize(stream);
       
  1139   }
       
  1140 
  1264 
  1141   virtual int cell_count() const {
  1265   virtual int cell_count() const {
  1142     return _args.cell_count();
  1266     return VirtualCallData::static_cell_count() +
  1143   }
  1267       TypeEntriesAtCall::header_cell_count() +
  1144 
  1268       int_at_unchecked(cell_count_global_offset());
  1145   uint number_of_arguments() const {
  1269   }
  1146     return args()->number_of_arguments();
  1270 
       
  1271   int number_of_arguments() const {
       
  1272     return cell_count_no_header() / TypeStackSlotEntries::per_arg_count();
  1147   }
  1273   }
  1148 
  1274 
  1149   void set_argument_type(int i, Klass* k) {
  1275   void set_argument_type(int i, Klass* k) {
       
  1276     assert(has_arguments(), "no arguments!");
  1150     intptr_t current = _args.type(i);
  1277     intptr_t current = _args.type(i);
  1151     _args.set_type(i, TypeEntries::with_status(k, current));
  1278     _args.set_type(i, TypeEntries::with_status(k, current));
  1152   }
  1279   }
  1153 
  1280 
       
  1281   void set_return_type(Klass* k) {
       
  1282     assert(has_return(), "no return!");
       
  1283     intptr_t current = _ret.type();
       
  1284     _ret.set_type(TypeEntries::with_status(k, current));
       
  1285   }
       
  1286 
       
  1287   // An entry for a return value takes less space than an entry for an
       
  1288   // argument, so if the remainder of the number of cells divided by
       
  1289   // the number of cells for an argument is not null, a return value
       
  1290   // is profiled in this object.
       
  1291   bool has_return() const {
       
  1292     bool res = (cell_count_no_header() % TypeStackSlotEntries::per_arg_count()) != 0;
       
  1293     assert (!res || TypeEntriesAtCall::return_profiling_enabled(), "no profiling of return values");
       
  1294     return res;
       
  1295   }
       
  1296 
  1154   // Code generation support
  1297   // Code generation support
  1155   static ByteSize args_data_offset() {
  1298   static ByteSize args_data_offset() {
  1156     return cell_offset(VirtualCallData::static_cell_count()) + TypeStackSlotEntries::args_data_offset();
  1299     return cell_offset(VirtualCallData::static_cell_count()) + TypeEntriesAtCall::args_data_offset();
  1157   }
  1300   }
  1158 
  1301 
  1159   // GC support
  1302   // GC support
  1160   virtual void clean_weak_klass_links(BoolObjectClosure* is_alive_closure) {
  1303   virtual void clean_weak_klass_links(BoolObjectClosure* is_alive_closure) {
  1161     ReceiverTypeData::clean_weak_klass_links(is_alive_closure);
  1304     ReceiverTypeData::clean_weak_klass_links(is_alive_closure);
  1162     _args.clean_weak_klass_links(is_alive_closure);
  1305     if (has_arguments()) {
       
  1306       _args.clean_weak_klass_links(is_alive_closure);
       
  1307     }
       
  1308     if (has_return()) {
       
  1309       _ret.clean_weak_klass_links(is_alive_closure);
       
  1310     }
  1163   }
  1311   }
  1164 
  1312 
  1165 #ifndef PRODUCT
  1313 #ifndef PRODUCT
  1166   virtual void print_data_on(outputStream* st) const;
  1314   virtual void print_data_on(outputStream* st) const;
  1167 #endif
  1315 #endif
  1689   static bool profile_jsr292(methodHandle m, int bci);
  1837   static bool profile_jsr292(methodHandle m, int bci);
  1690   static int profile_arguments_flag();
  1838   static int profile_arguments_flag();
  1691   static bool profile_arguments_jsr292_only();
  1839   static bool profile_arguments_jsr292_only();
  1692   static bool profile_all_arguments();
  1840   static bool profile_all_arguments();
  1693   static bool profile_arguments_for_invoke(methodHandle m, int bci);
  1841   static bool profile_arguments_for_invoke(methodHandle m, int bci);
       
  1842   static int profile_return_flag();
       
  1843   static bool profile_all_return();
       
  1844   static bool profile_return_for_invoke(methodHandle m, int bci);
  1694 
  1845 
  1695 public:
  1846 public:
  1696   static int header_size() {
  1847   static int header_size() {
  1697     return sizeof(MethodData)/wordSize;
  1848     return sizeof(MethodData)/wordSize;
  1698   }
  1849   }
  1931   // verification
  2082   // verification
  1932   void verify_on(outputStream* st);
  2083   void verify_on(outputStream* st);
  1933   void verify_data_on(outputStream* st);
  2084   void verify_data_on(outputStream* st);
  1934 
  2085 
  1935   static bool profile_arguments();
  2086   static bool profile_arguments();
       
  2087   static bool profile_return();
       
  2088   static bool profile_return_jsr292_only();
  1936 };
  2089 };
  1937 
  2090 
  1938 #endif // SHARE_VM_OOPS_METHODDATAOOP_HPP
  2091 #endif // SHARE_VM_OOPS_METHODDATAOOP_HPP