| OLD | NEW |
| 1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 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 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 289 // ----------------------------------------------------------------------------- | 289 // ----------------------------------------------------------------------------- |
| 290 // Implementation of Assembler. | 290 // Implementation of Assembler. |
| 291 | 291 |
| 292 #ifdef GENERATED_CODE_COVERAGE | 292 #ifdef GENERATED_CODE_COVERAGE |
| 293 static void InitCoverageLog(); | 293 static void InitCoverageLog(); |
| 294 #endif | 294 #endif |
| 295 | 295 |
| 296 byte* Assembler::spare_buffer_ = NULL; | 296 byte* Assembler::spare_buffer_ = NULL; |
| 297 | 297 |
| 298 Assembler::Assembler(void* buffer, int buffer_size) | 298 Assembler::Assembler(void* buffer, int buffer_size) |
| 299 : code_targets_(100) { | 299 : code_targets_(100), positions_recorder_(this) { |
| 300 if (buffer == NULL) { | 300 if (buffer == NULL) { |
| 301 // Do our own buffer management. | 301 // Do our own buffer management. |
| 302 if (buffer_size <= kMinimalBufferSize) { | 302 if (buffer_size <= kMinimalBufferSize) { |
| 303 buffer_size = kMinimalBufferSize; | 303 buffer_size = kMinimalBufferSize; |
| 304 | 304 |
| 305 if (spare_buffer_ != NULL) { | 305 if (spare_buffer_ != NULL) { |
| 306 buffer = spare_buffer_; | 306 buffer = spare_buffer_; |
| 307 spare_buffer_ = NULL; | 307 spare_buffer_ = NULL; |
| 308 } | 308 } |
| 309 } | 309 } |
| (...skipping 20 matching lines...) Expand all Loading... |
| 330 memset(buffer_, 0xCC, buffer_size); // int3 | 330 memset(buffer_, 0xCC, buffer_size); // int3 |
| 331 } | 331 } |
| 332 #endif | 332 #endif |
| 333 | 333 |
| 334 // Setup buffer pointers. | 334 // Setup buffer pointers. |
| 335 ASSERT(buffer_ != NULL); | 335 ASSERT(buffer_ != NULL); |
| 336 pc_ = buffer_; | 336 pc_ = buffer_; |
| 337 reloc_info_writer.Reposition(buffer_ + buffer_size, pc_); | 337 reloc_info_writer.Reposition(buffer_ + buffer_size, pc_); |
| 338 | 338 |
| 339 last_pc_ = NULL; | 339 last_pc_ = NULL; |
| 340 current_statement_position_ = RelocInfo::kNoPosition; | 340 |
| 341 current_position_ = RelocInfo::kNoPosition; | |
| 342 written_statement_position_ = current_statement_position_; | |
| 343 written_position_ = current_position_; | |
| 344 #ifdef GENERATED_CODE_COVERAGE | 341 #ifdef GENERATED_CODE_COVERAGE |
| 345 InitCoverageLog(); | 342 InitCoverageLog(); |
| 346 #endif | 343 #endif |
| 347 } | 344 } |
| 348 | 345 |
| 349 | 346 |
| 350 Assembler::~Assembler() { | 347 Assembler::~Assembler() { |
| 351 if (own_buffer_) { | 348 if (own_buffer_) { |
| 352 if (spare_buffer_ == NULL && buffer_size_ == kMinimalBufferSize) { | 349 if (spare_buffer_ == NULL && buffer_size_ == kMinimalBufferSize) { |
| 353 spare_buffer_ = buffer_; | 350 spare_buffer_ = buffer_; |
| (...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 838 } else { | 835 } else { |
| 839 ASSERT(L->is_unused()); | 836 ASSERT(L->is_unused()); |
| 840 int32_t current = pc_offset(); | 837 int32_t current = pc_offset(); |
| 841 emitl(current); | 838 emitl(current); |
| 842 L->link_to(current); | 839 L->link_to(current); |
| 843 } | 840 } |
| 844 } | 841 } |
| 845 | 842 |
| 846 | 843 |
| 847 void Assembler::call(Handle<Code> target, RelocInfo::Mode rmode) { | 844 void Assembler::call(Handle<Code> target, RelocInfo::Mode rmode) { |
| 848 WriteRecordedPositions(); | 845 positions_recorder()->WriteRecordedPositions(); |
| 849 EnsureSpace ensure_space(this); | 846 EnsureSpace ensure_space(this); |
| 850 last_pc_ = pc_; | 847 last_pc_ = pc_; |
| 851 // 1110 1000 #32-bit disp. | 848 // 1110 1000 #32-bit disp. |
| 852 emit(0xE8); | 849 emit(0xE8); |
| 853 emit_code_target(target, rmode); | 850 emit_code_target(target, rmode); |
| 854 } | 851 } |
| 855 | 852 |
| 856 | 853 |
| 857 void Assembler::call(Register adr) { | 854 void Assembler::call(Register adr) { |
| 858 EnsureSpace ensure_space(this); | 855 EnsureSpace ensure_space(this); |
| (...skipping 2069 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2928 if (rmode == RelocInfo::EXTERNAL_REFERENCE && | 2925 if (rmode == RelocInfo::EXTERNAL_REFERENCE && |
| 2929 !Serializer::enabled() && | 2926 !Serializer::enabled() && |
| 2930 !FLAG_debug_code) { | 2927 !FLAG_debug_code) { |
| 2931 return; | 2928 return; |
| 2932 } | 2929 } |
| 2933 RelocInfo rinfo(pc_, rmode, data); | 2930 RelocInfo rinfo(pc_, rmode, data); |
| 2934 reloc_info_writer.Write(&rinfo); | 2931 reloc_info_writer.Write(&rinfo); |
| 2935 } | 2932 } |
| 2936 | 2933 |
| 2937 void Assembler::RecordJSReturn() { | 2934 void Assembler::RecordJSReturn() { |
| 2938 WriteRecordedPositions(); | 2935 positions_recorder()->WriteRecordedPositions(); |
| 2939 EnsureSpace ensure_space(this); | 2936 EnsureSpace ensure_space(this); |
| 2940 RecordRelocInfo(RelocInfo::JS_RETURN); | 2937 RecordRelocInfo(RelocInfo::JS_RETURN); |
| 2941 } | 2938 } |
| 2942 | 2939 |
| 2943 | 2940 |
| 2944 void Assembler::RecordDebugBreakSlot() { | 2941 void Assembler::RecordDebugBreakSlot() { |
| 2945 WriteRecordedPositions(); | 2942 positions_recorder()->WriteRecordedPositions(); |
| 2946 EnsureSpace ensure_space(this); | 2943 EnsureSpace ensure_space(this); |
| 2947 RecordRelocInfo(RelocInfo::DEBUG_BREAK_SLOT); | 2944 RecordRelocInfo(RelocInfo::DEBUG_BREAK_SLOT); |
| 2948 } | 2945 } |
| 2949 | 2946 |
| 2950 | 2947 |
| 2951 void Assembler::RecordComment(const char* msg) { | 2948 void Assembler::RecordComment(const char* msg) { |
| 2952 if (FLAG_debug_code) { | 2949 if (FLAG_debug_code) { |
| 2953 EnsureSpace ensure_space(this); | 2950 EnsureSpace ensure_space(this); |
| 2954 RecordRelocInfo(RelocInfo::COMMENT, reinterpret_cast<intptr_t>(msg)); | 2951 RecordRelocInfo(RelocInfo::COMMENT, reinterpret_cast<intptr_t>(msg)); |
| 2955 } | 2952 } |
| 2956 } | 2953 } |
| 2957 | 2954 |
| 2958 | 2955 |
| 2959 void Assembler::RecordPosition(int pos) { | |
| 2960 ASSERT(pos != RelocInfo::kNoPosition); | |
| 2961 ASSERT(pos >= 0); | |
| 2962 current_position_ = pos; | |
| 2963 } | |
| 2964 | |
| 2965 | |
| 2966 void Assembler::RecordStatementPosition(int pos) { | |
| 2967 ASSERT(pos != RelocInfo::kNoPosition); | |
| 2968 ASSERT(pos >= 0); | |
| 2969 current_statement_position_ = pos; | |
| 2970 } | |
| 2971 | |
| 2972 | |
| 2973 bool Assembler::WriteRecordedPositions() { | |
| 2974 bool written = false; | |
| 2975 | |
| 2976 // Write the statement position if it is different from what was written last | |
| 2977 // time. | |
| 2978 if (current_statement_position_ != written_statement_position_) { | |
| 2979 EnsureSpace ensure_space(this); | |
| 2980 RecordRelocInfo(RelocInfo::STATEMENT_POSITION, current_statement_position_); | |
| 2981 written_statement_position_ = current_statement_position_; | |
| 2982 written = true; | |
| 2983 } | |
| 2984 | |
| 2985 // Write the position if it is different from what was written last time and | |
| 2986 // also different from the written statement position. | |
| 2987 if (current_position_ != written_position_ && | |
| 2988 current_position_ != written_statement_position_) { | |
| 2989 EnsureSpace ensure_space(this); | |
| 2990 RecordRelocInfo(RelocInfo::POSITION, current_position_); | |
| 2991 written_position_ = current_position_; | |
| 2992 written = true; | |
| 2993 } | |
| 2994 | |
| 2995 // Return whether something was written. | |
| 2996 return written; | |
| 2997 } | |
| 2998 | |
| 2999 | |
| 3000 const int RelocInfo::kApplyMask = RelocInfo::kCodeTargetMask | | 2956 const int RelocInfo::kApplyMask = RelocInfo::kCodeTargetMask | |
| 3001 1 << RelocInfo::INTERNAL_REFERENCE; | 2957 1 << RelocInfo::INTERNAL_REFERENCE; |
| 3002 | 2958 |
| 3003 | 2959 |
| 3004 bool RelocInfo::IsCodedSpecially() { | 2960 bool RelocInfo::IsCodedSpecially() { |
| 3005 // The deserializer needs to know whether a pointer is specially coded. Being | 2961 // The deserializer needs to know whether a pointer is specially coded. Being |
| 3006 // specially coded on x64 means that it is a relative 32 bit address, as used | 2962 // specially coded on x64 means that it is a relative 32 bit address, as used |
| 3007 // by branch instructions. | 2963 // by branch instructions. |
| 3008 return (1 << rmode_) & kApplyMask; | 2964 return (1 << rmode_) & kApplyMask; |
| 3009 } | 2965 } |
| 3010 | 2966 |
| 3011 | 2967 |
| 3012 | 2968 |
| 3013 } } // namespace v8::internal | 2969 } } // namespace v8::internal |
| 3014 | 2970 |
| 3015 #endif // V8_TARGET_ARCH_X64 | 2971 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |