Author: [email protected]
Date: Tue Apr 21 06:42:12 2009
New Revision: 1754

Modified:
    branches/bleeding_edge/src/assembler-ia32.cc
    branches/bleeding_edge/src/builtins-arm.cc
    branches/bleeding_edge/src/builtins-ia32.cc
    branches/bleeding_edge/src/codegen-arm.cc
    branches/bleeding_edge/src/codegen-ia32.cc
    branches/bleeding_edge/src/debug-arm.cc
    branches/bleeding_edge/src/debug-ia32.cc
    branches/bleeding_edge/src/globals.h
    branches/bleeding_edge/src/ic-arm.cc
    branches/bleeding_edge/src/ic-ia32.cc
    branches/bleeding_edge/src/jump-target-arm.cc
    branches/bleeding_edge/src/jump-target-ia32.cc
    branches/bleeding_edge/src/macro-assembler-arm.h
    branches/bleeding_edge/src/macro-assembler-ia32.h
    branches/bleeding_edge/src/regexp-macro-assembler-ia32.cc
    branches/bleeding_edge/src/simulator-arm.cc
    branches/bleeding_edge/src/stub-cache-arm.cc
    branches/bleeding_edge/src/stub-cache-ia32.cc
    branches/bleeding_edge/src/virtual-frame-arm.cc
    branches/bleeding_edge/src/virtual-frame-ia32.cc

Log:
* Add code to check coverage of generated code on IA32 port.
* Move ARM coverage code to ARM-specific file and add missing
file to cover.
Review URL: http://codereview.chromium.org/88025

Modified: branches/bleeding_edge/src/assembler-ia32.cc
==============================================================================
--- branches/bleeding_edge/src/assembler-ia32.cc        (original)
+++ branches/bleeding_edge/src/assembler-ia32.cc        Tue Apr 21 06:42:12 2009
@@ -283,6 +283,10 @@
    *pc_++ = (x)


+#ifdef GENERATED_CODE_COVERAGE
+static void InitCoverageLog();
+#endif
+
  // spare_buffer_
  static byte* spare_buffer_ = NULL;

@@ -329,6 +333,9 @@
    current_position_ = RelocInfo::kNoPosition;
    written_statement_position_ = current_statement_position_;
    written_position_ = current_position_;
+#ifdef GENERATED_CODE_COVERAGE
+  InitCoverageLog();
+#endif
  }


@@ -2201,5 +2208,31 @@
    uint32_t label_loc =  
reinterpret_cast<uint32_t>(addr_at(bound_label.pos()));
    long_at_put(position, label_loc);
  }
+
+
+#ifdef GENERATED_CODE_COVERAGE
+static FILE* coverage_log = NULL;
+
+
+static void InitCoverageLog() {
+  char* file_name = getenv("V8_GENERATED_CODE_COVERAGE_LOG");
+  if (file_name != NULL) {
+    coverage_log = fopen(file_name, "aw+");
+  }
+}
+
+
+void LogGeneratedCodeCoverage(const char* file_line) {
+  const char* return_address = (&file_line)[-1];
+  char* push_insn = const_cast<char*>(return_address - 12);
+  push_insn[0] = 0xeb;  // Relative branch insn.
+  push_insn[1] = 13;    // Skip over coverage insns.
+  if (coverage_log != NULL) {
+    fprintf(coverage_log, "%s\n", file_line);
+    fflush(coverage_log);
+  }
+}
+
+#endif

  } }  // namespace v8::internal

Modified: branches/bleeding_edge/src/builtins-arm.cc
==============================================================================
--- branches/bleeding_edge/src/builtins-arm.cc  (original)
+++ branches/bleeding_edge/src/builtins-arm.cc  Tue Apr 21 06:42:12 2009
@@ -34,7 +34,7 @@
  namespace v8 { namespace internal {


-#define __ DEFINE_MASM(masm)
+#define __ ACCESS_MASM(masm)


  void Builtins::Generate_Adaptor(MacroAssembler* masm, CFunctionId id) {

Modified: branches/bleeding_edge/src/builtins-ia32.cc
==============================================================================
--- branches/bleeding_edge/src/builtins-ia32.cc (original)
+++ branches/bleeding_edge/src/builtins-ia32.cc Tue Apr 21 06:42:12 2009
@@ -32,7 +32,7 @@
  namespace v8 { namespace internal {


-#define __ masm->
+#define __ ACCESS_MASM(masm)


  void Builtins::Generate_Adaptor(MacroAssembler* masm, CFunctionId id) {

Modified: branches/bleeding_edge/src/codegen-arm.cc
==============================================================================
--- branches/bleeding_edge/src/codegen-arm.cc   (original)
+++ branches/bleeding_edge/src/codegen-arm.cc   Tue Apr 21 06:42:12 2009
@@ -38,7 +38,7 @@

  namespace v8 { namespace internal {

-#define __ DEFINE_MASM(masm_)
+#define __ ACCESS_MASM(masm_)


  //  
-------------------------------------------------------------------------
@@ -4096,7 +4096,7 @@


  #undef __
-#define __ DEFINE_MASM(masm)
+#define __ ACCESS_MASM(masm)


  Handle<String> Reference::GetName() {

Modified: branches/bleeding_edge/src/codegen-ia32.cc
==============================================================================
--- branches/bleeding_edge/src/codegen-ia32.cc  (original)
+++ branches/bleeding_edge/src/codegen-ia32.cc  Tue Apr 21 06:42:12 2009
@@ -37,7 +37,7 @@

  namespace v8 { namespace internal {

-#define __ masm_->
+#define __ ACCESS_MASM(masm_)

  //  
-------------------------------------------------------------------------
  // CodeGenState implementation.
@@ -2009,18 +2009,18 @@

    // Add a label for checking the size of the code used for returning.
    Label check_exit_codesize;
-  __ bind(&check_exit_codesize);
+  masm_->bind(&check_exit_codesize);

    // Leave the frame and return popping the arguments and the
    // receiver.
    frame_->Exit();
-  __ ret((scope_->num_parameters() + 1) * kPointerSize);
+  masm_->ret((scope_->num_parameters() + 1) * kPointerSize);
    DeleteFrame();

    // Check that the size of the code used for returning matches what is
    // expected by the debugger.
    ASSERT_EQ(Debug::kIa32JSReturnSequenceLength,
-            __ SizeOfCodeGeneratedSince(&check_exit_codesize));
+            masm_->SizeOfCodeGeneratedSince(&check_exit_codesize));
  }


@@ -2143,7 +2143,7 @@
                   times_1, 0x0, RelocInfo::INTERNAL_REFERENCE));
    smi_value.Unuse();
    // Calculate address to overwrite later with actual address of table.
-  int32_t jump_table_ref = __ pc_offset() - sizeof(int32_t);
+  int32_t jump_table_ref = masm_->pc_offset() - sizeof(int32_t);
    __ Align(4);
    Label table_start;
    __ bind(&table_start);
@@ -3386,7 +3386,9 @@
      // Loop up the context chain.  There is no frame effect so it is
      // safe to use raw labels here.
      Label next, fast;
-    if (!context.reg().is(tmp.reg())) __ mov(tmp.reg(), context.reg());
+    if (!context.reg().is(tmp.reg())) {
+      __ mov(tmp.reg(), context.reg());
+    }
      __ bind(&next);
      // Terminate at global context.
      __ cmp(FieldOperand(tmp.reg(), HeapObject::kMapOffset),
@@ -5275,8 +5277,11 @@
    // instruction.
    ASSERT(value.is_register() && value.reg().is(eax));
    // The delta from the start of the map-compare instruction to the
-  // test eax instruction.
-  int delta_to_patch_site = __ SizeOfCodeGeneratedSince(patch_site());
+  // test eax instruction.  We use masm_ directly here instead of the
+  // __ macro because the __ macro sometimes uses macro expansion to turn
+  // into something that can't return a value.  This is encountered when
+  // doing generated code coverage tests.
+  int delta_to_patch_site = masm_->SizeOfCodeGeneratedSince(patch_site());
    __ test(value.reg(), Immediate(-delta_to_patch_site));
    __ IncrementCounter(&Counters::keyed_load_inline_miss, 1);

@@ -5291,7 +5296,7 @@


  #undef __
-#define __ masm->
+#define __ ACCESS_MASM(masm)

  Handle<String> Reference::GetName() {
    ASSERT(type_ == NAMED);
@@ -5573,7 +5578,7 @@


  #undef __
-#define __ masm_->
+#define __ ACCESS_MASM(masm_)

  Result DeferredInlineBinaryOperation::GenerateInlineCode(Result* left,
                                                           Result* right) {
@@ -5907,7 +5912,7 @@


  #undef __
-#define __ masm->
+#define __ ACCESS_MASM(masm)

  void GenericBinaryOpStub::GenerateSmiCode(MacroAssembler* masm, Label*  
slow) {
    // Perform fast-case smi code for the operation (eax <op> ebx) and
@@ -6232,7 +6237,9 @@
        }

        // SHR should return uint32 - go to runtime for non-smi/negative  
result.
-      if (op_ == Token::SHR) __ bind(&non_smi_result);
+      if (op_ == Token::SHR) {
+        __ bind(&non_smi_result);
+      }
        __ mov(eax, Operand(esp, 1 * kPointerSize));
        __ mov(edx, Operand(esp, 2 * kPointerSize));
        break;

Modified: branches/bleeding_edge/src/debug-arm.cc
==============================================================================
--- branches/bleeding_edge/src/debug-arm.cc     (original)
+++ branches/bleeding_edge/src/debug-arm.cc     Tue Apr 21 06:42:12 2009
@@ -58,7 +58,7 @@
  }


-#define __ DEFINE_MASM(masm)
+#define __ ACCESS_MASM(masm)


  static void Generate_DebugBreakCallHelper(MacroAssembler* masm,

Modified: branches/bleeding_edge/src/debug-ia32.cc
==============================================================================
--- branches/bleeding_edge/src/debug-ia32.cc    (original)
+++ branches/bleeding_edge/src/debug-ia32.cc    Tue Apr 21 06:42:12 2009
@@ -68,7 +68,7 @@
  }


-#define __ masm->
+#define __ ACCESS_MASM(masm)


  static void Generate_DebugBreakCallHelper(MacroAssembler* masm,

Modified: branches/bleeding_edge/src/globals.h
==============================================================================
--- branches/bleeding_edge/src/globals.h        (original)
+++ branches/bleeding_edge/src/globals.h        Tue Apr 21 06:42:12 2009
@@ -513,16 +513,6 @@
  }


-#ifdef ARM_GENERATED_CODE_COVERAGE
-#define CODE_COVERAGE_STRINGIFY(x) #x
-#define CODE_COVERAGE_TOSTRING(x) CODE_COVERAGE_STRINGIFY(x)
-#define __FILE_LINE__ __FILE__ ":" CODE_COVERAGE_TOSTRING(__LINE__)
-#define DEFINE_MASM(masm) masm->stop(__FILE_LINE__); masm->
-#else
-#define DEFINE_MASM(masm) masm->
-#endif
-
-
  } }  // namespace v8::internal

  #endif  // V8_GLOBALS_H_

Modified: branches/bleeding_edge/src/ic-arm.cc
==============================================================================
--- branches/bleeding_edge/src/ic-arm.cc        (original)
+++ branches/bleeding_edge/src/ic-arm.cc        Tue Apr 21 06:42:12 2009
@@ -39,7 +39,7 @@
  // Static IC stub generators.
  //

-#define __ DEFINE_MASM(masm)
+#define __ ACCESS_MASM(masm)


  // Helper function used from LoadIC/CallIC GenerateNormal.

Modified: branches/bleeding_edge/src/ic-ia32.cc
==============================================================================
--- branches/bleeding_edge/src/ic-ia32.cc       (original)
+++ branches/bleeding_edge/src/ic-ia32.cc       Tue Apr 21 06:42:12 2009
@@ -38,7 +38,7 @@
  // Static IC stub generators.
  //

-#define __ masm->
+#define __ ACCESS_MASM(masm)


  // Helper function used to load a property from a dictionary backing  
storage.
@@ -91,7 +91,9 @@
      // Compute the masked index: (hash + i + i * i) & mask.
      __ mov(r1, FieldOperand(name, String::kLengthOffset));
      __ shr(r1, String::kHashShift);
-    if (i > 0) __ add(Operand(r1),  
Immediate(Dictionary::GetProbeOffset(i)));
+    if (i > 0) {
+      __ add(Operand(r1), Immediate(Dictionary::GetProbeOffset(i)));
+    }
      __ and_(r1, Operand(r2));

      // Scale the index by multiplying by the element size.

Modified: branches/bleeding_edge/src/jump-target-arm.cc
==============================================================================
--- branches/bleeding_edge/src/jump-target-arm.cc       (original)
+++ branches/bleeding_edge/src/jump-target-arm.cc       Tue Apr 21 06:42:12 2009
@@ -35,7 +35,7 @@
  //  
-------------------------------------------------------------------------
  // JumpTarget implementation.

-#define __ masm_->
+#define __ ACCESS_MASM(masm_)

  void JumpTarget::DoJump() {
    ASSERT(cgen_ != NULL);

Modified: branches/bleeding_edge/src/jump-target-ia32.cc
==============================================================================
--- branches/bleeding_edge/src/jump-target-ia32.cc      (original)
+++ branches/bleeding_edge/src/jump-target-ia32.cc      Tue Apr 21 06:42:12 2009
@@ -35,7 +35,7 @@
  //  
-------------------------------------------------------------------------
  // JumpTarget implementation.

-#define __ masm_->
+#define __ ACCESS_MASM(masm_)

  void JumpTarget::DoJump() {
    ASSERT(cgen_ != NULL);

Modified: branches/bleeding_edge/src/macro-assembler-arm.h
==============================================================================
--- branches/bleeding_edge/src/macro-assembler-arm.h    (original)
+++ branches/bleeding_edge/src/macro-assembler-arm.h    Tue Apr 21 06:42:12  
2009
@@ -298,6 +298,15 @@
  }


+#ifdef GENERATED_CODE_COVERAGE
+#define CODE_COVERAGE_STRINGIFY(x) #x
+#define CODE_COVERAGE_TOSTRING(x) CODE_COVERAGE_STRINGIFY(x)
+#define __FILE_LINE__ __FILE__ ":" CODE_COVERAGE_TOSTRING(__LINE__)
+#define ACCESS_MASM(masm) masm->stop(__FILE_LINE__); masm->
+#else
+#define ACCESS_MASM(masm) masm->
+#endif
+

  } }  // namespace v8::internal


Modified: branches/bleeding_edge/src/macro-assembler-ia32.h
==============================================================================
--- branches/bleeding_edge/src/macro-assembler-ia32.h   (original)
+++ branches/bleeding_edge/src/macro-assembler-ia32.h   Tue Apr 21 06:42:12  
2009
@@ -343,6 +343,29 @@
    return Operand(object, index, scale, offset - kHeapObjectTag);
  }

+
+#ifdef GENERATED_CODE_COVERAGE
+extern void LogGeneratedCodeCoverage(const char* file_line);
+#define CODE_COVERAGE_STRINGIFY(x) #x
+#define CODE_COVERAGE_TOSTRING(x) CODE_COVERAGE_STRINGIFY(x)
+#define __FILE_LINE__ __FILE__ ":" CODE_COVERAGE_TOSTRING(__LINE__)
+#define ACCESS_MASM(masm) {                                               \
+    byte* ia32_coverage_function =                                        \
+        reinterpret_cast<byte*>(FUNCTION_ADDR(LogGeneratedCodeCoverage)); \
+    masm->pushfd();                                                       \
+    masm->pushad();                                                       \
+    masm->push(Immediate(reinterpret_cast<int>(&__FILE_LINE__)));         \
+    masm->call(ia32_coverage_function, RelocInfo::RUNTIME_ENTRY);         \
+    masm->pop(eax);                                                       \
+    masm->popad();                                                        \
+    masm->popfd();                                                        \
+  }                                                                       \
+  masm->
+#else
+#define ACCESS_MASM(masm) masm->
+#endif
+
+
  } }  // namespace v8::internal

  #endif  // V8_MACRO_ASSEMBLER_IA32_H_

Modified: branches/bleeding_edge/src/regexp-macro-assembler-ia32.cc
==============================================================================
--- branches/bleeding_edge/src/regexp-macro-assembler-ia32.cc   (original)
+++ branches/bleeding_edge/src/regexp-macro-assembler-ia32.cc   Tue Apr 21  
06:42:12 2009
@@ -86,7 +86,7 @@
   *              byte* stack_area_top)
   */

-#define __ masm_->
+#define __ ACCESS_MASM(masm_)

  RegExpMacroAssemblerIA32::RegExpMacroAssemblerIA32(
      Mode mode,

Modified: branches/bleeding_edge/src/simulator-arm.cc
==============================================================================
--- branches/bleeding_edge/src/simulator-arm.cc (original)
+++ branches/bleeding_edge/src/simulator-arm.cc Tue Apr 21 06:42:12 2009
@@ -91,7 +91,7 @@



-#ifdef ARM_GENERATED_CODE_COVERAGE
+#ifdef GENERATED_CODE_COVERAGE
  static FILE* coverage_log = NULL;


@@ -107,7 +107,7 @@
    char* str = reinterpret_cast<char*>(instr->InstructionBits() &  
0x0fffffff);
    if (strlen(str) > 0) {
      if (coverage_log != NULL) {
-      fprintf(coverage_log, "Simulator hit %s\n", str);
+      fprintf(coverage_log, "%s\n", str);
        fflush(coverage_log);
      }
      instr->SetInstructionBits(0xe1a00000);  // Overwrite with nop.
@@ -115,7 +115,7 @@
    sim_->set_pc(sim_->get_pc() + Instr::kInstrSize);
  }

-#else  // ndef ARM_GENERATED_CODE_COVERAGE
+#else  // ndef GENERATED_CODE_COVERAGE

  static void InitializeCoverage() {
  }

Modified: branches/bleeding_edge/src/stub-cache-arm.cc
==============================================================================
--- branches/bleeding_edge/src/stub-cache-arm.cc        (original)
+++ branches/bleeding_edge/src/stub-cache-arm.cc        Tue Apr 21 06:42:12 2009
@@ -33,7 +33,7 @@

  namespace v8 { namespace internal {

-#define __ DEFINE_MASM(masm)
+#define __ ACCESS_MASM(masm)


  static void ProbeTable(MacroAssembler* masm,
@@ -456,7 +456,7 @@


  #undef __
-#define __ DEFINE_MASM(masm())
+#define __ ACCESS_MASM(masm())


  Object* StubCompiler::CompileLazyCompile(Code::Flags flags) {

Modified: branches/bleeding_edge/src/stub-cache-ia32.cc
==============================================================================
--- branches/bleeding_edge/src/stub-cache-ia32.cc       (original)
+++ branches/bleeding_edge/src/stub-cache-ia32.cc       Tue Apr 21 06:42:12 2009
@@ -33,7 +33,7 @@

  namespace v8 { namespace internal {

-#define __ masm->
+#define __ ACCESS_MASM(masm)


  static void ProbeTable(MacroAssembler* masm,
@@ -256,7 +256,7 @@

    // Check that the maps haven't changed.
    Register reg =
-      __ CheckMaps(object, receiver, holder, scratch1, scratch2,  
miss_label);
+      masm->CheckMaps(object, receiver, holder, scratch1, scratch2,  
miss_label);

    // Get the value from the properties.
    GenerateFastPropertyLoad(masm, eax, reg, holder, index);
@@ -279,7 +279,7 @@

    // Check that the maps haven't changed.
    Register reg =
-      __ CheckMaps(object, receiver, holder, scratch1, scratch2,  
miss_label);
+      masm->CheckMaps(object, receiver, holder, scratch1, scratch2,  
miss_label);

    // Push the arguments on the JS stack of the caller.
    __ pop(scratch2);  // remove return address
@@ -310,7 +310,7 @@

    // Check that the maps haven't changed.
    Register reg =
-      __ CheckMaps(object, receiver, holder, scratch1, scratch2,  
miss_label);
+      masm->CheckMaps(object, receiver, holder, scratch1, scratch2,  
miss_label);

    // Return the constant value.
    __ mov(eax, Handle<Object>(value));
@@ -332,7 +332,7 @@

    // Check that the maps haven't changed.
    Register reg =
-      __ CheckMaps(object, receiver, holder, scratch1, scratch2,  
miss_label);
+      masm->CheckMaps(object, receiver, holder, scratch1, scratch2,  
miss_label);

    // Push the arguments on the JS stack of the caller.
    __ pop(scratch2);  // remove return address
@@ -440,7 +440,7 @@

  #undef __

-#define __ masm()->
+#define __ ACCESS_MASM(masm())


  // TODO(1241006): Avoid having lazy compile stubs specialized by the
@@ -485,7 +485,7 @@

    // Do the right check and compute the holder register.
    Register reg =
-      __ CheckMaps(JSObject::cast(object), edx, holder, ebx, ecx, &miss);
+      masm()->CheckMaps(JSObject::cast(object), edx, holder, ebx, ecx,  
&miss);

    GenerateFastPropertyLoad(masm(), edi, reg, holder, index);

@@ -656,7 +656,7 @@

    // Check that maps have not changed and compute the holder register.
    Register reg =
-      __ CheckMaps(JSObject::cast(object), edx, holder, ebx, ecx, &miss);
+      masm()->CheckMaps(JSObject::cast(object), edx, holder, ebx, ecx,  
&miss);

    // Enter an internal frame.
    __ EnterInternalFrame();

Modified: branches/bleeding_edge/src/virtual-frame-arm.cc
==============================================================================
--- branches/bleeding_edge/src/virtual-frame-arm.cc     (original)
+++ branches/bleeding_edge/src/virtual-frame-arm.cc     Tue Apr 21 06:42:12 2009
@@ -36,7 +36,7 @@
  //  
-------------------------------------------------------------------------
  // VirtualFrame implementation.

-#define __ DEFINE_MASM(masm_)
+#define __ ACCESS_MASM(masm_)


  // On entry to a function, the virtual frame already contains the

Modified: branches/bleeding_edge/src/virtual-frame-ia32.cc
==============================================================================
--- branches/bleeding_edge/src/virtual-frame-ia32.cc    (original)
+++ branches/bleeding_edge/src/virtual-frame-ia32.cc    Tue Apr 21 06:42:12  
2009
@@ -33,7 +33,7 @@

  namespace v8 { namespace internal {

-#define __ masm_->
+#define __ ACCESS_MASM(masm_)

  //  
-------------------------------------------------------------------------
  // VirtualFrame implementation.

--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to