Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(395)

Side by Side Diff: src/stub-cache.cc

Issue 39014: Add a meaningful name when disassembling code. This makes it easier... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 11 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. 1 // Copyright 2006-2008 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 93
94 94
95 Object* StubCache::ComputeLoadField(String* name, 95 Object* StubCache::ComputeLoadField(String* name,
96 JSObject* receiver, 96 JSObject* receiver,
97 JSObject* holder, 97 JSObject* holder,
98 int field_index) { 98 int field_index) {
99 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, FIELD); 99 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, FIELD);
100 Object* code = receiver->map()->FindInCodeCache(name, flags); 100 Object* code = receiver->map()->FindInCodeCache(name, flags);
101 if (code->IsUndefined()) { 101 if (code->IsUndefined()) {
102 LoadStubCompiler compiler; 102 LoadStubCompiler compiler;
103 code = compiler.CompileLoadField(receiver, holder, field_index); 103 code = compiler.CompileLoadField(receiver, holder, field_index, name);
104 if (code->IsFailure()) return code; 104 if (code->IsFailure()) return code;
105 LOG(CodeCreateEvent("LoadIC", Code::cast(code), name)); 105 LOG(CodeCreateEvent("LoadIC", Code::cast(code), name));
106 Object* result = receiver->map()->UpdateCodeCache(name, Code::cast(code)); 106 Object* result = receiver->map()->UpdateCodeCache(name, Code::cast(code));
107 if (result->IsFailure()) return code; 107 if (result->IsFailure()) return code;
108 } 108 }
109 return Set(name, receiver->map(), Code::cast(code)); 109 return Set(name, receiver->map(), Code::cast(code));
110 } 110 }
111 111
112 112
113 Object* StubCache::ComputeLoadCallback(String* name, 113 Object* StubCache::ComputeLoadCallback(String* name,
114 JSObject* receiver, 114 JSObject* receiver,
115 JSObject* holder, 115 JSObject* holder,
116 AccessorInfo* callback) { 116 AccessorInfo* callback) {
117 ASSERT(v8::ToCData<Address>(callback->getter()) != 0); 117 ASSERT(v8::ToCData<Address>(callback->getter()) != 0);
118 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, CALLBACKS); 118 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, CALLBACKS);
119 Object* code = receiver->map()->FindInCodeCache(name, flags); 119 Object* code = receiver->map()->FindInCodeCache(name, flags);
120 if (code->IsUndefined()) { 120 if (code->IsUndefined()) {
121 LoadStubCompiler compiler; 121 LoadStubCompiler compiler;
122 code = compiler.CompileLoadCallback(receiver, holder, callback); 122 code = compiler.CompileLoadCallback(receiver, holder, callback, name);
123 if (code->IsFailure()) return code; 123 if (code->IsFailure()) return code;
124 LOG(CodeCreateEvent("LoadIC", Code::cast(code), name)); 124 LOG(CodeCreateEvent("LoadIC", Code::cast(code), name));
125 Object* result = receiver->map()->UpdateCodeCache(name, Code::cast(code)); 125 Object* result = receiver->map()->UpdateCodeCache(name, Code::cast(code));
126 if (result->IsFailure()) return code; 126 if (result->IsFailure()) return code;
127 } 127 }
128 return Set(name, receiver->map(), Code::cast(code)); 128 return Set(name, receiver->map(), Code::cast(code));
129 } 129 }
130 130
131 131
132 Object* StubCache::ComputeLoadConstant(String* name, 132 Object* StubCache::ComputeLoadConstant(String* name,
133 JSObject* receiver, 133 JSObject* receiver,
134 JSObject* holder, 134 JSObject* holder,
135 Object* value) { 135 Object* value) {
136 Code::Flags flags = 136 Code::Flags flags =
137 Code::ComputeMonomorphicFlags(Code::LOAD_IC, CONSTANT_FUNCTION); 137 Code::ComputeMonomorphicFlags(Code::LOAD_IC, CONSTANT_FUNCTION);
138 Object* code = receiver->map()->FindInCodeCache(name, flags); 138 Object* code = receiver->map()->FindInCodeCache(name, flags);
139 if (code->IsUndefined()) { 139 if (code->IsUndefined()) {
140 LoadStubCompiler compiler; 140 LoadStubCompiler compiler;
141 code = compiler.CompileLoadConstant(receiver, holder, value); 141 code = compiler.CompileLoadConstant(receiver, holder, value, name);
142 if (code->IsFailure()) return code; 142 if (code->IsFailure()) return code;
143 LOG(CodeCreateEvent("LoadIC", Code::cast(code), name)); 143 LOG(CodeCreateEvent("LoadIC", Code::cast(code), name));
144 Object* result = receiver->map()->UpdateCodeCache(name, Code::cast(code)); 144 Object* result = receiver->map()->UpdateCodeCache(name, Code::cast(code));
145 if (result->IsFailure()) return code; 145 if (result->IsFailure()) return code;
146 } 146 }
147 return Set(name, receiver->map(), Code::cast(code)); 147 return Set(name, receiver->map(), Code::cast(code));
148 } 148 }
149 149
150 150
151 Object* StubCache::ComputeLoadInterceptor(String* name, 151 Object* StubCache::ComputeLoadInterceptor(String* name,
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
427 // because they may be represented as immediates without a 427 // because they may be represented as immediates without a
428 // map. Instead, we check against the map in the holder. 428 // map. Instead, we check against the map in the holder.
429 if (object->IsNumber() || object->IsBoolean() || object->IsString()) { 429 if (object->IsNumber() || object->IsBoolean() || object->IsString()) {
430 object = holder; 430 object = holder;
431 } 431 }
432 432
433 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::CALL_IC, FIELD, argc); 433 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::CALL_IC, FIELD, argc);
434 Object* code = map->FindInCodeCache(name, flags); 434 Object* code = map->FindInCodeCache(name, flags);
435 if (code->IsUndefined()) { 435 if (code->IsUndefined()) {
436 CallStubCompiler compiler(argc); 436 CallStubCompiler compiler(argc);
437 code = compiler.CompileCallField(object, holder, index); 437 code = compiler.CompileCallField(object, holder, index, name);
438 if (code->IsFailure()) return code; 438 if (code->IsFailure()) return code;
439 LOG(CodeCreateEvent("CallIC", Code::cast(code), name)); 439 LOG(CodeCreateEvent("CallIC", Code::cast(code), name));
440 Object* result = map->UpdateCodeCache(name, Code::cast(code)); 440 Object* result = map->UpdateCodeCache(name, Code::cast(code));
441 if (result->IsFailure()) return result; 441 if (result->IsFailure()) return result;
442 } 442 }
443 return Set(name, map, Code::cast(code)); 443 return Set(name, map, Code::cast(code));
444 } 444 }
445 445
446 446
447 Object* StubCache::ComputeCallInterceptor(int argc, 447 Object* StubCache::ComputeCallInterceptor(int argc,
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after
781 return Failure::Exception(); 781 return Failure::Exception();
782 } 782 }
783 return *result; 783 return *result;
784 } 784 }
785 785
786 786
787 Object* StubCompiler::CompileCallInitialize(Code::Flags flags) { 787 Object* StubCompiler::CompileCallInitialize(Code::Flags flags) {
788 HandleScope scope; 788 HandleScope scope;
789 int argc = Code::ExtractArgumentsCountFromFlags(flags); 789 int argc = Code::ExtractArgumentsCountFromFlags(flags);
790 CallIC::GenerateInitialize(masm(), argc); 790 CallIC::GenerateInitialize(masm(), argc);
791 Object* result = GetCodeWithFlags(flags); 791 Object* result = GetCodeWithFlags(flags, "CompileCallInitialize");
792 if (!result->IsFailure()) { 792 if (!result->IsFailure()) {
793 Counters::call_initialize_stubs.Increment(); 793 Counters::call_initialize_stubs.Increment();
794 Code* code = Code::cast(result); 794 Code* code = Code::cast(result);
795 USE(code); 795 USE(code);
796 LOG(CodeCreateEvent("CallInitialize", code, code->arguments_count())); 796 LOG(CodeCreateEvent("CallInitialize", code, code->arguments_count()));
797 } 797 }
798 return result; 798 return result;
799 } 799 }
800 800
801 801
802 Object* StubCompiler::CompileCallPreMonomorphic(Code::Flags flags) { 802 Object* StubCompiler::CompileCallPreMonomorphic(Code::Flags flags) {
803 HandleScope scope; 803 HandleScope scope;
804 int argc = Code::ExtractArgumentsCountFromFlags(flags); 804 int argc = Code::ExtractArgumentsCountFromFlags(flags);
805 CallIC::GenerateInitialize(masm(), argc); 805 CallIC::GenerateInitialize(masm(), argc);
806 Object* result = GetCodeWithFlags(flags); 806 Object* result = GetCodeWithFlags(flags, "CompileCallPreMonomorphic");
807 if (!result->IsFailure()) { 807 if (!result->IsFailure()) {
808 Counters::call_premonomorphic_stubs.Increment(); 808 Counters::call_premonomorphic_stubs.Increment();
809 Code* code = Code::cast(result); 809 Code* code = Code::cast(result);
810 USE(code); 810 USE(code);
811 LOG(CodeCreateEvent("CallPreMonomorphic", code, code->arguments_count())); 811 LOG(CodeCreateEvent("CallPreMonomorphic", code, code->arguments_count()));
812 } 812 }
813 return result; 813 return result;
814 } 814 }
815 815
816 816
817 Object* StubCompiler::CompileCallNormal(Code::Flags flags) { 817 Object* StubCompiler::CompileCallNormal(Code::Flags flags) {
818 HandleScope scope; 818 HandleScope scope;
819 int argc = Code::ExtractArgumentsCountFromFlags(flags); 819 int argc = Code::ExtractArgumentsCountFromFlags(flags);
820 CallIC::GenerateNormal(masm(), argc); 820 CallIC::GenerateNormal(masm(), argc);
821 Object* result = GetCodeWithFlags(flags); 821 Object* result = GetCodeWithFlags(flags, "CompileCallNormal");
822 if (!result->IsFailure()) { 822 if (!result->IsFailure()) {
823 Counters::call_normal_stubs.Increment(); 823 Counters::call_normal_stubs.Increment();
824 Code* code = Code::cast(result); 824 Code* code = Code::cast(result);
825 USE(code); 825 USE(code);
826 LOG(CodeCreateEvent("CallNormal", code, code->arguments_count())); 826 LOG(CodeCreateEvent("CallNormal", code, code->arguments_count()));
827 } 827 }
828 return result; 828 return result;
829 } 829 }
830 830
831 831
832 Object* StubCompiler::CompileCallMegamorphic(Code::Flags flags) { 832 Object* StubCompiler::CompileCallMegamorphic(Code::Flags flags) {
833 HandleScope scope; 833 HandleScope scope;
834 int argc = Code::ExtractArgumentsCountFromFlags(flags); 834 int argc = Code::ExtractArgumentsCountFromFlags(flags);
835 CallIC::GenerateMegamorphic(masm(), argc); 835 CallIC::GenerateMegamorphic(masm(), argc);
836 Object* result = GetCodeWithFlags(flags); 836 Object* result = GetCodeWithFlags(flags, "CompileCallMegamorphic");
837 if (!result->IsFailure()) { 837 if (!result->IsFailure()) {
838 Counters::call_megamorphic_stubs.Increment(); 838 Counters::call_megamorphic_stubs.Increment();
839 Code* code = Code::cast(result); 839 Code* code = Code::cast(result);
840 USE(code); 840 USE(code);
841 LOG(CodeCreateEvent("CallMegamorphic", code, code->arguments_count())); 841 LOG(CodeCreateEvent("CallMegamorphic", code, code->arguments_count()));
842 } 842 }
843 return result; 843 return result;
844 } 844 }
845 845
846 846
847 Object* StubCompiler::CompileCallMiss(Code::Flags flags) { 847 Object* StubCompiler::CompileCallMiss(Code::Flags flags) {
848 HandleScope scope; 848 HandleScope scope;
849 int argc = Code::ExtractArgumentsCountFromFlags(flags); 849 int argc = Code::ExtractArgumentsCountFromFlags(flags);
850 CallIC::GenerateMiss(masm(), argc); 850 CallIC::GenerateMiss(masm(), argc);
851 Object* result = GetCodeWithFlags(flags); 851 Object* result = GetCodeWithFlags(flags, "CompileCallMiss");
852 if (!result->IsFailure()) { 852 if (!result->IsFailure()) {
853 Counters::call_megamorphic_stubs.Increment(); 853 Counters::call_megamorphic_stubs.Increment();
854 Code* code = Code::cast(result); 854 Code* code = Code::cast(result);
855 USE(code); 855 USE(code);
856 LOG(CodeCreateEvent("CallMiss", code, code->arguments_count())); 856 LOG(CodeCreateEvent("CallMiss", code, code->arguments_count()));
857 } 857 }
858 return result; 858 return result;
859 } 859 }
860 860
861 861
862 Object* StubCompiler::CompileCallDebugBreak(Code::Flags flags) { 862 Object* StubCompiler::CompileCallDebugBreak(Code::Flags flags) {
863 HandleScope scope; 863 HandleScope scope;
864 Debug::GenerateCallICDebugBreak(masm()); 864 Debug::GenerateCallICDebugBreak(masm());
865 Object* result = GetCodeWithFlags(flags); 865 Object* result = GetCodeWithFlags(flags, "CompileCallDebugBreak");
866 if (!result->IsFailure()) { 866 if (!result->IsFailure()) {
867 Code* code = Code::cast(result); 867 Code* code = Code::cast(result);
868 USE(code); 868 USE(code);
869 LOG(CodeCreateEvent("CallDebugBreak", code, code->arguments_count())); 869 LOG(CodeCreateEvent("CallDebugBreak", code, code->arguments_count()));
870 } 870 }
871 return result; 871 return result;
872 } 872 }
873 873
874 874
875 Object* StubCompiler::CompileCallDebugPrepareStepIn(Code::Flags flags) { 875 Object* StubCompiler::CompileCallDebugPrepareStepIn(Code::Flags flags) {
876 HandleScope scope; 876 HandleScope scope;
877 // Use the same code for the the step in preparations as we do for 877 // Use the same code for the the step in preparations as we do for
878 // the miss case. 878 // the miss case.
879 int argc = Code::ExtractArgumentsCountFromFlags(flags); 879 int argc = Code::ExtractArgumentsCountFromFlags(flags);
880 CallIC::GenerateMiss(masm(), argc); 880 CallIC::GenerateMiss(masm(), argc);
881 Object* result = GetCodeWithFlags(flags); 881 Object* result = GetCodeWithFlags(flags, "CompileCallDebugPrepareStepIn");
882 if (!result->IsFailure()) { 882 if (!result->IsFailure()) {
883 Code* code = Code::cast(result); 883 Code* code = Code::cast(result);
884 USE(code); 884 USE(code);
885 LOG(CodeCreateEvent("CallDebugPrepareStepIn", code, 885 LOG(CodeCreateEvent("CallDebugPrepareStepIn", code,
886 code->arguments_count())); 886 code->arguments_count()));
887 } 887 }
888 return result; 888 return result;
889 } 889 }
890 890
891 891
892 Object* StubCompiler::GetCodeWithFlags(Code::Flags flags) { 892 Object* StubCompiler::GetCodeWithFlags(Code::Flags flags, char* name) {
893 CodeDesc desc; 893 CodeDesc desc;
894 masm_.GetCode(&desc); 894 masm_.GetCode(&desc);
895 Object* result = Heap::CreateCode(desc, NULL, flags, masm_.CodeObject()); 895 Object* result = Heap::CreateCode(desc, NULL, flags, masm_.CodeObject());
896 #ifdef DEBUG 896 #ifdef ENABLE_DISASSEMBLER
897 if (FLAG_print_code_stubs && !result->IsFailure()) { 897 if (FLAG_print_code_stubs && !result->IsFailure()) {
898 Code::cast(result)->Print(); 898 Code::cast(result)->Disassemble(name);
899 } 899 }
900 #endif 900 #endif
901 return result; 901 return result;
902 } 902 }
903 903
904 904
905 Object* LoadStubCompiler::GetCode(PropertyType type) { 905 Object* StubCompiler::GetCodeWithFlags(Code::Flags flags, String* name) {
906 return GetCodeWithFlags(Code::ComputeMonomorphicFlags(Code::LOAD_IC, type)); 906 if (FLAG_print_code_stubs && (name != NULL)) {
907 return GetCodeWithFlags(flags, *name->ToCString());
908 }
909 return GetCodeWithFlags(flags, reinterpret_cast<char*>(NULL));
907 } 910 }
908 911
909 912
910 Object* KeyedLoadStubCompiler::GetCode(PropertyType type) { 913 Object* LoadStubCompiler::GetCode(PropertyType type, String* name) {
911 return GetCodeWithFlags(Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, 914 return GetCodeWithFlags(Code::ComputeMonomorphicFlags(Code::LOAD_IC, type),
Kasper Lund 2009/03/03 15:42:30 Maybe this would look better if you precomputed th
iposva 2009/03/03 16:21:19 Done.
912 type)); 915 name);
913 } 916 }
914 917
915 918
916 Object* StoreStubCompiler::GetCode(PropertyType type) { 919 Object* KeyedLoadStubCompiler::GetCode(PropertyType type, String* name) {
917 return GetCodeWithFlags(Code::ComputeMonomorphicFlags(Code::STORE_IC, type)); 920 return GetCodeWithFlags(Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC,
921 type),
922 name);
918 } 923 }
919 924
920 925
921 Object* KeyedStoreStubCompiler::GetCode(PropertyType type) { 926 Object* StoreStubCompiler::GetCode(PropertyType type, String* name) {
922 return GetCodeWithFlags(Code::ComputeMonomorphicFlags(Code::KEYED_STORE_IC, 927 return GetCodeWithFlags(Code::ComputeMonomorphicFlags(Code::STORE_IC, type),
923 type)); 928 name);
924 } 929 }
925 930
926 931
927 Object* CallStubCompiler::GetCode(PropertyType type) { 932 Object* KeyedStoreStubCompiler::GetCode(PropertyType type, String* name) {
928 int argc = arguments_.immediate(); 933 return GetCodeWithFlags(Code::ComputeMonomorphicFlags(Code::KEYED_STORE_IC,
929 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::CALL_IC, type, argc); 934 type),
930 return GetCodeWithFlags(flags); 935 name);
931 } 936 }
932 937
933 938
939 Object* CallStubCompiler::GetCode(PropertyType type, String* name) {
940 int argc = arguments_.immediate();
941 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::CALL_IC, type, argc);
Kasper Lund 2009/03/03 15:42:30 Yes. Like this.
iposva 2009/03/03 16:21:19 Done.
942 return GetCodeWithFlags(flags, name);
943 }
944
945
934 } } // namespace v8::internal 946 } } // namespace v8::internal
OLDNEW
« src/code-stubs.cc ('K') | « src/stub-cache.h ('k') | src/stub-cache-arm.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698