From b5a64451b174bafd73b96805afae2eede9a8c9c6 Mon Sep 17 00:00:00 2001 From: "mstarzinger@chromium.org" Date: Wed, 20 Feb 2013 13:12:26 +0000 Subject: [PATCH] Ensure deopt entries have no relocation information. R=ulan@chromium.org BUG=chromium:176943 Review URL: https://codereview.chromium.org/12314012 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@13698 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/arm/codegen-arm.cc | 1 + src/assembler.cc | 15 +++++++++++++++ src/assembler.h | 6 ++++++ src/deoptimizer.cc | 1 + src/ia32/codegen-ia32.cc | 7 ++++--- src/mips/codegen-mips.cc | 1 + src/x64/codegen-x64.cc | 5 +++-- 7 files changed, 31 insertions(+), 5 deletions(-) diff --git a/src/arm/codegen-arm.cc b/src/arm/codegen-arm.cc index 2ef421b..69a2c9c 100644 --- a/src/arm/codegen-arm.cc +++ b/src/arm/codegen-arm.cc @@ -101,6 +101,7 @@ UnaryMathFunction CreateExpFunction() { CodeDesc desc; masm.GetCode(&desc); + ASSERT(!RelocInfo::RequiresRelocation(desc)); CPU::FlushICache(buffer, actual_size); OS::ProtectCode(buffer, actual_size); diff --git a/src/assembler.cc b/src/assembler.cc index b4958f5..c92c248 100644 --- a/src/assembler.cc +++ b/src/assembler.cc @@ -689,6 +689,21 @@ RelocIterator::RelocIterator(const CodeDesc& desc, int mode_mask) { // Implementation of RelocInfo +#ifdef DEBUG +bool RelocInfo::RequiresRelocation(const CodeDesc& desc) { + // Ensure there are no code targets or embedded objects present in the + // deoptimization entries, they would require relocation after code + // generation. + int mode_mask = RelocInfo::kCodeTargetMask | + RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT) | + RelocInfo::ModeMask(RelocInfo::GLOBAL_PROPERTY_CELL) | + RelocInfo::kApplyMask; + RelocIterator it(desc, mode_mask); + return !it.done(); +} +#endif + + #ifdef ENABLE_DISASSEMBLER const char* RelocInfo::RelocModeName(RelocInfo::Mode rmode) { switch (rmode) { diff --git a/src/assembler.h b/src/assembler.h index 890ef69..9e3c397 100644 --- a/src/assembler.h +++ b/src/assembler.h @@ -409,6 +409,12 @@ class RelocInfo BASE_EMBEDDED { // debugger. INLINE(bool IsPatchedDebugBreakSlotSequence()); +#ifdef DEBUG + // Check whether the given code contains relocation information that + // either is position-relative or movable by the garbage collector. + static bool RequiresRelocation(const CodeDesc& desc); +#endif + #ifdef ENABLE_DISASSEMBLER // Printing static const char* RelocModeName(Mode rmode); diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc index e12f3b6..1b177c2 100644 --- a/src/deoptimizer.cc +++ b/src/deoptimizer.cc @@ -1588,6 +1588,7 @@ void Deoptimizer::EnsureCodeForDeoptimizationEntry(BailoutType type, GenerateDeoptimizationEntries(&masm, entry_count, type); CodeDesc desc; masm.GetCode(&desc); + ASSERT(!RelocInfo::RequiresRelocation(desc)); MemoryChunk* chunk = type == EAGER ? data->eager_deoptimization_entry_code_ diff --git a/src/ia32/codegen-ia32.cc b/src/ia32/codegen-ia32.cc index 22dd66f..5368811 100644 --- a/src/ia32/codegen-ia32.cc +++ b/src/ia32/codegen-ia32.cc @@ -94,7 +94,7 @@ UnaryMathFunction CreateTranscendentalFunction(TranscendentalCache::Type type) { CodeDesc desc; masm.GetCode(&desc); - ASSERT(desc.reloc_size == 0); + ASSERT(!RelocInfo::RequiresRelocation(desc)); CPU::FlushICache(buffer, actual_size); OS::ProtectCode(buffer, actual_size); @@ -132,6 +132,7 @@ UnaryMathFunction CreateExpFunction() { CodeDesc desc; masm.GetCode(&desc); + ASSERT(!RelocInfo::RequiresRelocation(desc)); CPU::FlushICache(buffer, actual_size); OS::ProtectCode(buffer, actual_size); @@ -164,7 +165,7 @@ UnaryMathFunction CreateSqrtFunction() { CodeDesc desc; masm.GetCode(&desc); - ASSERT(desc.reloc_size == 0); + ASSERT(!RelocInfo::RequiresRelocation(desc)); CPU::FlushICache(buffer, actual_size); OS::ProtectCode(buffer, actual_size); @@ -374,7 +375,7 @@ OS::MemCopyFunction CreateMemCopyFunction() { CodeDesc desc; masm.GetCode(&desc); - ASSERT(desc.reloc_size == 0); + ASSERT(!RelocInfo::RequiresRelocation(desc)); CPU::FlushICache(buffer, actual_size); OS::ProtectCode(buffer, actual_size); diff --git a/src/mips/codegen-mips.cc b/src/mips/codegen-mips.cc index 006a34f..d5ab329 100644 --- a/src/mips/codegen-mips.cc +++ b/src/mips/codegen-mips.cc @@ -101,6 +101,7 @@ UnaryMathFunction CreateExpFunction() { CodeDesc desc; masm.GetCode(&desc); + ASSERT(!RelocInfo::RequiresRelocation(desc)); CPU::FlushICache(buffer, actual_size); OS::ProtectCode(buffer, actual_size); diff --git a/src/x64/codegen-x64.cc b/src/x64/codegen-x64.cc index cde7dcb..4798b2a 100644 --- a/src/x64/codegen-x64.cc +++ b/src/x64/codegen-x64.cc @@ -91,7 +91,7 @@ UnaryMathFunction CreateTranscendentalFunction(TranscendentalCache::Type type) { CodeDesc desc; masm.GetCode(&desc); - ASSERT(desc.reloc_size == 0); + ASSERT(!RelocInfo::RequiresRelocation(desc)); CPU::FlushICache(buffer, actual_size); OS::ProtectCode(buffer, actual_size); @@ -122,6 +122,7 @@ UnaryMathFunction CreateExpFunction() { CodeDesc desc; masm.GetCode(&desc); + ASSERT(!RelocInfo::RequiresRelocation(desc)); CPU::FlushICache(buffer, actual_size); OS::ProtectCode(buffer, actual_size); @@ -145,7 +146,7 @@ UnaryMathFunction CreateSqrtFunction() { CodeDesc desc; masm.GetCode(&desc); - ASSERT(desc.reloc_size == 0); + ASSERT(!RelocInfo::RequiresRelocation(desc)); CPU::FlushICache(buffer, actual_size); OS::ProtectCode(buffer, actual_size); -- 2.7.4