This is the mail archive of the
systemtap@sourceware.org
mailing list for the systemtap project.
[PATCH 1/3] ppc64le: Store correct function entry address in symbol_table
- From: Ravi Bangoria <ravi dot bangoria at linux dot vnet dot ibm dot com>
- To: systemtap at sourceware dot org
- Cc: hemant at linux dot vnet dot ibm dot com, mjw at redhat dot com, atrajeev at linux dot vnet dot ibm dot com, Ravi Bangoria <ravi dot bangoria at linux dot vnet dot ibm dot com>
- Date: Thu, 21 Jul 2016 18:47:14 +0530
- Subject: [PATCH 1/3] ppc64le: Store correct function entry address in symbol_table
- Authentication-results: sourceware.org; auth=none
- References: <1469107036-4239-1-git-send-email-ravi.bangoria@linux.vnet.ibm.com>
symbol_table::get_from_elf() calculates Local Entry Point and stores it
in symbol_table for ppc64le. LEP is required only at a time of probing
and not elsewhere. So no need to store it in symbol table.
No need to prioritize symbol table as well because debuginfo and symbol
table both will contain Global Entry Point.
Signed-off-by: Ravi Bangoria <ravi.bangoria@linux.vnet.ibm.com>
---
tapsets.cxx | 62 +------------------------------------------------------------
1 file changed, 1 insertion(+), 61 deletions(-)
diff --git a/tapsets.cxx b/tapsets.cxx
index 6d82069..e7be711 100644
--- a/tapsets.cxx
+++ b/tapsets.cxx
@@ -2142,18 +2142,6 @@ query_dwarf_inline_instance (Dwarf_Die * die, dwarf_query * q)
}
}
-static bool
-is_filtered_func_exists (func_info_map_t const& filtered, func_info *fi)
-{
- for (unsigned i = 0; i < filtered.size(); i++)
- {
- if ((filtered[i].entrypc == fi->entrypc) && (filtered[i].name == fi->name))
- return true;
- }
-
- return false;
-}
-
static int
query_dwarf_func (Dwarf_Die * func, dwarf_query * q)
{
@@ -2206,37 +2194,7 @@ query_dwarf_func (Dwarf_Die * func, dwarf_query * q)
q->dw.function_line (&func.decl_line);
Dwarf_Addr entrypc;
-
- func.entrypc = 0;
- Dwarf_Addr bias;
- Dwfl_Module *mod = q->dw.module;
- Elf* elf = (dwarf_getelf (dwfl_module_getdwarf (mod, &bias))
- ?: dwfl_module_getelf (mod, &bias));
-
- GElf_Ehdr ehdr_mem;
- GElf_Ehdr* em = gelf_getehdr (elf, &ehdr_mem);
- if (em == NULL) throw SEMANTIC_ERROR (_("Couldn't get elf header"));
-
- /* Giving priority to sym_table for ppc64*/
- if ((em->e_machine == EM_PPC64) && ((em->e_flags & EF_PPC64_ABI) == 2)
- && (q->dw.mod_info->sym_table))
- {
- /* The linkage name is the best match for the symbol table. */
- const string& linkage_name = dwarf_linkage_name(&func.die)
- ?: dwarf_diename(&func.die) ?: (string)func.name;
-
- const auto& fis = q->dw.mod_info->sym_table->lookup_symbol(linkage_name);
- for (auto it=fis.begin(); it!=fis.end() ; ++it)
- {
- func.entrypc = (*it)->entrypc;
- if (is_filtered_func_exists(q->filtered_functions, &func))
- continue;
- q->filtered_functions.push_back(func);
- }
- }
-
- /* If not ppc64 or not found in sym_table, try it directly. */
- if (!func.entrypc && q->dw.function_entrypc (&entrypc))
+ if (q->dw.function_entrypc (&entrypc))
{
func.entrypc = entrypc;
q->filtered_functions.push_back (func);
@@ -8462,13 +8420,6 @@ symbol_table::get_from_elf()
int syments = dwfl_module_getsymtab(mod);
assert(syments);
prepare_section_rejection(mod);
- Dwarf_Addr bias;
- Elf* elf = (dwarf_getelf (dwfl_module_getdwarf (mod, &bias))
- ?: dwfl_module_getelf (mod, &bias));
-
- GElf_Ehdr ehdr_mem;
- GElf_Ehdr* em = gelf_getehdr (elf, &ehdr_mem);
- if (em == NULL) throw SEMANTIC_ERROR (_("Couldn't get elf header"));
for (int i = 1; i < syments; ++i)
{
@@ -8501,18 +8452,7 @@ symbol_table::get_from_elf()
continue;
interned_string name = n;
- /*
- * For ELF ABI v2 on PPC64 LE, we need to adjust sym.st_value corresponding
- * to the bits of sym.st_other. These bits will tell us what's the offset
- * of the local entry point from the global entry point.
- *
- * st_other field is currently only used with ABIv2 on ppc64
- */
Dwarf_Addr entrypc = addr;
- if ((em->e_machine == EM_PPC64) && ((em->e_flags & EF_PPC64_ABI) == 2)
- && (GELF_ST_TYPE(sym.st_info) == STT_FUNC) && sym.st_other)
- entrypc += PPC64_LOCAL_ENTRY_OFFSET(sym.st_other);
-
if (GELF_ST_TYPE(sym.st_info) == STT_FUNC)
add_symbol(name, (GELF_ST_BIND(sym.st_info) == STB_WEAK),
reject, addr, entrypc);
--
2.1.4