Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8c907c65 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Handle ARM thumb function symbols." into pi-dev

parents 4031e1a4 b70b4a5b
Loading
Loading
Loading
Loading
+13 −0
Original line number Original line Diff line number Diff line
@@ -171,4 +171,17 @@ bool ElfInterfaceArm::StepExidx(uint64_t pc, uint64_t load_bias, Regs* regs, Mem
  return return_value;
  return return_value;
}
}


bool ElfInterfaceArm::GetFunctionName(uint64_t addr, uint64_t load_bias, std::string* name,
                                      uint64_t* offset) {
  // For ARM, thumb function symbols have bit 0 set, but the address passed
  // in here might not have this bit set and result in a failure to find
  // the thumb function names. Adjust the address and offset to account
  // for this possible case.
  if (ElfInterface32::GetFunctionName(addr | 1, load_bias, name, offset)) {
    *offset &= ~1;
    return true;
  }
  return false;
}

}  // namespace unwindstack
}  // namespace unwindstack
+3 −0
Original line number Original line Diff line number Diff line
@@ -76,6 +76,9 @@ class ElfInterfaceArm : public ElfInterface32 {
  bool StepExidx(uint64_t pc, uint64_t load_bias, Regs* regs, Memory* process_memory,
  bool StepExidx(uint64_t pc, uint64_t load_bias, Regs* regs, Memory* process_memory,
                 bool* finished);
                 bool* finished);


  bool GetFunctionName(uint64_t addr, uint64_t load_bias, std::string* name,
                       uint64_t* offset) override;

  uint64_t start_offset() { return start_offset_; }
  uint64_t start_offset() { return start_offset_; }


  size_t total_entries() { return total_entries_; }
  size_t total_entries() { return total_entries_; }
+2 −2
Original line number Original line Diff line number Diff line
@@ -188,7 +188,7 @@ TEST_F(UnwindOfflineTest, pc_straddle_arm) {
  std::string frame_info(DumpFrames(unwinder));
  std::string frame_info(DumpFrames(unwinder));
  ASSERT_EQ(4U, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
  ASSERT_EQ(4U, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
  EXPECT_EQ(
  EXPECT_EQ(
      "  #00 pc 0001a9f8  libc.so (abort+63)\n"
      "  #00 pc 0001a9f8  libc.so (abort+64)\n"
      "  #01 pc 00006a1b  libbase.so (_ZN7android4base14DefaultAborterEPKc+6)\n"
      "  #01 pc 00006a1b  libbase.so (_ZN7android4base14DefaultAborterEPKc+6)\n"
      "  #02 pc 00007441  libbase.so (_ZN7android4base10LogMessageD2Ev+748)\n"
      "  #02 pc 00007441  libbase.so (_ZN7android4base10LogMessageD2Ev+748)\n"
      "  #03 pc 00015147  /does/not/exist/libhidlbase.so\n",
      "  #03 pc 00015147  /does/not/exist/libhidlbase.so\n",
@@ -575,7 +575,7 @@ TEST_F(UnwindOfflineTest, jit_debug_arm) {
  std::string frame_info(DumpFrames(unwinder));
  std::string frame_info(DumpFrames(unwinder));
  ASSERT_EQ(76U, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
  ASSERT_EQ(76U, unwinder.NumFrames()) << "Unwind:\n" << frame_info;
  EXPECT_EQ(
  EXPECT_EQ(
      "  #00 pc 00018a5e  libarttestd.so (Java_Main_unwindInProcess+865)\n"
      "  #00 pc 00018a5e  libarttestd.so (Java_Main_unwindInProcess+866)\n"
      "  #01 pc 0000212d (offset 0x2000)  137-cfi.odex (boolean Main.unwindInProcess(boolean, int, "
      "  #01 pc 0000212d (offset 0x2000)  137-cfi.odex (boolean Main.unwindInProcess(boolean, int, "
      "boolean)+92)\n"
      "boolean)+92)\n"
      "  #02 pc 00011cb1  anonymous:e2796000 (boolean Main.bar(boolean)+72)\n"
      "  #02 pc 00011cb1  anonymous:e2796000 (boolean Main.bar(boolean)+72)\n"
+1 −2
Original line number Original line Diff line number Diff line
@@ -53,8 +53,7 @@ void DumpArm(ElfInterfaceArm* interface) {
      printf("  PC 0x%" PRIx64, addr + load_bias);
      printf("  PC 0x%" PRIx64, addr + load_bias);
      uint64_t func_offset;
      uint64_t func_offset;
      uint64_t pc = addr + load_bias;
      uint64_t pc = addr + load_bias;
      // This might be a thumb function, so set the low bit.
      if (interface->GetFunctionName(pc, load_bias, &name, &func_offset) && !name.empty()) {
      if (interface->GetFunctionName(pc | 1, load_bias, &name, &func_offset) && !name.empty()) {
        printf(" <%s>", name.c_str());
        printf(" <%s>", name.c_str());
      }
      }
      printf("\n");
      printf("\n");