linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Matt Helsley <mhelsley@vmware.com>
To: <linux-kernel@vger.kernel.org>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Sami Tolvanen <samitolvanen@google.com>,
	Julien Thierry <jthierry@redhat.com>,
	Kamalesh Babulal <kamalesh@linux.vnet.ibm.com>,
	Matt Helsley <mhelsley@vmware.com>
Subject: [RFC][PATCH v4 30/32] objtool: mcount: Remove wrapper double-include trick
Date: Tue, 2 Jun 2020 12:50:23 -0700	[thread overview]
Message-ID: <1e7f39d9067324844f99a9609c8e5fa2a7f2f582.1591125127.git.mhelsley@vmware.com> (raw)
In-Reply-To: <cover.1591125127.git.mhelsley@vmware.com>

We no longer need to double-include the recordmcount.h wrapper
All of the types and functions that rely on them have been converted
to using objtool's ELF code. This moves the remaining function to
recordmcount.c and changes the function name to something slightly
more descriptive while dropping the wrapped naming.

Signed-off-by: Matt Helsley <mhelsley@vmware.com>
---
 tools/objtool/recordmcount.c | 122 ++++++++++++++++++++++++++++--
 tools/objtool/recordmcount.h | 142 -----------------------------------
 2 files changed, 116 insertions(+), 148 deletions(-)
 delete mode 100644 tools/objtool/recordmcount.h

diff --git a/tools/objtool/recordmcount.c b/tools/objtool/recordmcount.c
index 096507829b0c..6980c0a8bdc3 100644
--- a/tools/objtool/recordmcount.c
+++ b/tools/objtool/recordmcount.c
@@ -441,10 +441,120 @@ static void sift_rel_mcount(GElf_Addr **mlocpp,
 	*mrelpp = is_rela ? (void *)mrelap : (void *)mrelp;
 }
 
-/* 32 bit and 64 bit are very similar */
-#include "recordmcount.h"
-#define RECORD_MCOUNT_64
-#include "recordmcount.h"
+/* Overall supervision for Elf32 ET_REL file. */
+static int do_mcount(unsigned const reltype, size_t rela_size)
+{
+	/* Upper bound on space: assume all relevant relocs are for mcount. */
+	unsigned       totrelsz;
+
+	void *mrel0;
+	void *mrelp;
+
+	GElf_Addr *mloc0;
+	GElf_Addr *mlocp;
+	GElf_Sxword r_offset; /* Used in the added relocations */
+
+	unsigned int rel_entsize = 0;
+
+	struct section *sec, *mlocs, *mrels;
+	unsigned int const old_shnum = lf->ehdr.e_shnum;
+
+	int result = -1;
+	char const *mc_name;
+	bool is_rela;
+
+	if (find_section_by_name(lf, "__mcount_loc") != NULL)
+		return 0;
+
+	totrelsz = tot_relsize(&rel_entsize);
+	if (totrelsz == 0)
+		return 0;
+
+	mrel0 = malloc(totrelsz);
+	mrelp = mrel0;
+	if (!mrel0)
+		return -1;
+
+	/* 2*sizeof(address) <= sizeof(Elf_Rel) */
+	mloc0 = malloc(totrelsz>>1);
+	mlocp = mloc0;
+	if (!mloc0) {
+		free(mrel0);
+		return -1;
+	}
+
+	is_rela = (rela_size == rel_entsize);
+	mc_name = is_rela
+			? ".rela__mcount_loc"
+			:  ".rel__mcount_loc";
+
+	/* add section: __mcount_loc */
+	mlocs = elf_create_section(lf, mc_name + (is_rela ? 1 : 0) + strlen(".rel"), sizeof(*mloc0), 0);
+	if (!mlocs)
+		goto out;
+
+	mlocs->sh.sh_link = 0;
+	mlocs->sh.sh_info = 0;
+	mlocs->sh.sh_addralign = 8;
+	mlocs->data->d_buf = mloc0;
+	mlocs->data->d_type = ELF_T_ADDR; /* elf_xlatetof() conversion */
+
+	/* add section .rel[a]__mcount_loc */
+	mrels = elf_create_section(lf, mc_name, rel_entsize, 0);
+	if (!mrels)
+		goto out;
+	/* Like elf_create_rela_section() without the name bits */
+	mrels->sh.sh_type = is_rela ? SHT_RELA : SHT_REL;
+	mrels->sh.sh_flags = 0;
+	mrels->sh.sh_link = find_section_by_name(lf, ".symtab")->idx;
+	mrels->sh.sh_info = old_shnum;
+	mrels->sh.sh_addralign = 8;
+	mrels->data->d_buf = mrel0;
+	mrels->data->d_type = is_rela ? ELF_T_RELA : ELF_T_REL; /* elf_xlatetof() conversion */
+
+	list_for_each_entry(sec, &lf->sections, list) {
+		char const *txtname;
+
+		txtname = has_rel_mcount(sec);
+		if (txtname && is_mcounted_section_name(txtname)) {
+			unsigned long recval = 0;
+			unsigned int recsym;
+
+			if (find_section_sym_index(sec->sh.sh_info,
+						txtname, &recval, &recsym))
+				goto out;
+
+			sift_rel_mcount(&mlocp, &r_offset, &mrelp, sec,
+				recsym, recval, reltype, is_rela);
+		} else if (txtname && (warn_on_notrace_sect || make_nop)) {
+			/*
+			 * This section is ignored by ftrace, but still
+			 * has mcount calls. Convert them to nops now.
+			 */
+			if (nop_mcount(sec, txtname) < 0)
+				goto out;
+		}
+	}
+
+	if (mloc0 != mlocp) {
+		/* Update the section size and Elf_Data size */
+		mlocs->sh.sh_size = (void *)mlocp - (void *)mloc0;
+		mlocs->len = mlocs->sh.sh_size;
+		mlocs->data->d_size = mlocs->len;
+
+		mrels->sh.sh_size = mrelp - mrel0;
+		mrels->len = mrels->sh.sh_size;
+		mrels->data->d_size = mrels->len;
+
+		/* overwrite the ELF file */
+		result = elf_write(lf);
+	} else
+		result = 0;
+out:
+	free(mrel0);
+	free(mloc0);
+	return result;
+}
 
 static int arm_is_fake_mcount(struct reloc const *rp)
 {
@@ -574,7 +684,7 @@ static int do_file(char const *const fname)
 			is_fake_mcount = MIPS_is_fake_mcount;
 		}
 		loc_size = 4;
-		rc = do32(reltype, sizeof(Elf32_Rela));
+		rc = do_mcount(reltype, sizeof(Elf32_Rela));
 		break;
 	case ELFCLASS64: {
 		if (lf->ehdr.e_ehsize != sizeof(Elf64_Ehdr)
@@ -592,7 +702,7 @@ static int do_file(char const *const fname)
 			is_fake_mcount = MIPS_is_fake_mcount;
 		}
 		loc_size = 8;
-		rc = do64(reltype, sizeof(Elf64_Rela));
+		rc = do_mcount(reltype, sizeof(Elf64_Rela));
 		break;
 	}
 	}  /* end switch */
diff --git a/tools/objtool/recordmcount.h b/tools/objtool/recordmcount.h
deleted file mode 100644
index 50104d52d9bf..000000000000
--- a/tools/objtool/recordmcount.h
+++ /dev/null
@@ -1,142 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-/*
- * recordmcount.h
- *
- * This code was taken out of recordmcount.c written by
- * Copyright 2009 John F. Reiser <jreiser@BitWagon.com>.  All rights reserved.
- *
- * The original code had the same algorithms for both 32bit
- * and 64bit ELF files, but the code was duplicated to support
- * the difference in structures that were used. This
- * file creates a macro of everything that is different between
- * the 64 and 32 bit code, such that by including this header
- * twice we can create both sets of functions by including this
- * header once with RECORD_MCOUNT_64 undefined, and again with
- * it defined.
- *
- * This conversion to macros was done by:
- * Copyright 2010 Steven Rostedt <srostedt@redhat.com>, Red Hat Inc.
- */
-#undef do_func
-
-#ifdef RECORD_MCOUNT_64
-# define do_func		do64
-#else
-# define do_func		do32
-#endif
-
-
-/* Overall supervision for Elf32 ET_REL file. */
-static int do_func(unsigned const reltype, size_t rela_size)
-{
-	/* Upper bound on space: assume all relevant relocs are for mcount. */
-	unsigned       totrelsz;
-
-	void *mrel0;
-	void *mrelp;
-
-	GElf_Addr *mloc0;
-	GElf_Addr *mlocp;
-	GElf_Sxword r_offset = 0;
-
-	unsigned int rel_entsize = 0;
-
-	struct section *sec, *mlocs, *mrels;
-	unsigned int const old_shnum = lf->ehdr.e_shnum;
-
-	int result = -1;
-	char const *mc_name;
-	bool is_rela;
-
-	if (find_section_by_name(lf, "__mcount_loc") != NULL)
-		return 0;
-
-	totrelsz = tot_relsize(&rel_entsize);
-	if (totrelsz == 0)
-		return 0;
-
-	mrel0 = malloc(totrelsz);
-	mrelp = mrel0;
-	if (!mrel0)
-		return -1;
-
-	/* 2*sizeof(address) <= sizeof(Elf_Rel) */
-	mloc0 = malloc(totrelsz>>1);
-	mlocp = mloc0;
-	if (!mloc0) {
-		free(mrel0);
-		return -1;
-	}
-
-	is_rela = (rela_size == rel_entsize);
-	mc_name = is_rela
-			? ".rela__mcount_loc"
-			:  ".rel__mcount_loc";
-
-	/* add section: __mcount_loc */
-	mlocs = elf_create_section(lf, mc_name + (is_rela ? 1 : 0) + strlen(".rel"), sizeof(*mloc0), 0);
-	if (!mlocs)
-		goto out;
-
-	mlocs->sh.sh_link = 0;
-	mlocs->sh.sh_info = 0;
-	mlocs->sh.sh_addralign = 8;
-	mlocs->data->d_buf = mloc0;
-	mlocs->data->d_type = ELF_T_ADDR; /* elf_xlatetof() conversion */
-
-	/* add section .rel[a]__mcount_loc */
-	mrels = elf_create_section(lf, mc_name, rel_entsize, 0);
-	if (!mrels)
-		goto out;
-	/* Like elf_create_rela_section() without the name bits */
-	mrels->sh.sh_type = is_rela ? SHT_RELA : SHT_REL;
-	mrels->sh.sh_flags = 0;
-	mrels->sh.sh_link = find_section_by_name(lf, ".symtab")->idx;
-	mrels->sh.sh_info = old_shnum;
-	mrels->sh.sh_addralign = 8;
-	mrels->data->d_buf = mrel0;
-	mrels->data->d_type = is_rela ? ELF_T_RELA : ELF_T_REL; /* elf_xlatetof() conversion */
-
-	list_for_each_entry(sec, &lf->sections, list) {
-		char const *txtname;
-
-		txtname = has_rel_mcount(sec);
-		if (txtname && is_mcounted_section_name(txtname)) {
-			unsigned long recval = 0;
-			unsigned int recsym;
-
-			if (find_section_sym_index(sec->sh.sh_info,
-						txtname, &recval, &recsym))
-				goto out;
-
-			sift_rel_mcount(&mlocp, &r_offset, &mrelp, sec,
-				recsym, recval, reltype, is_rela);
-		} else if (txtname && (warn_on_notrace_sect || make_nop)) {
-			/*
-			 * This section is ignored by ftrace, but still
-			 * has mcount calls. Convert them to nops now.
-			 */
-			if (nop_mcount(sec, txtname) < 0)
-				goto out;
-		}
-	}
-
-	if (mloc0 != mlocp) {
-		/* Update the section size and Elf_Data size */
-		mlocs->sh.sh_size = (void *)mlocp - (void *)mloc0;
-		mlocs->len = mlocs->sh.sh_size;
-		mlocs->data->d_size = mlocs->len;
-
-		mrels->sh.sh_size = mrelp - mrel0;
-		mrels->len = mrels->sh.sh_size;
-		mrels->data->d_size = mrels->len;
-
-		/* overwrite the ELF file */
-		result = elf_write(lf);
-	} else
-		result = 0;
-out:
-	free(mrel0);
-	free(mloc0);
-	return result;
-}
-- 
2.20.1


  parent reply	other threads:[~2020-06-02 19:51 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-06-02 19:49 [RFC][PATCH v4 00/32] objtool: Make recordmcount a subcommand Matt Helsley
2020-06-02 19:49 ` [RFC][PATCH v4 01/32] objtool: Prepare to merge recordmcount Matt Helsley
2020-06-09  8:54   ` Julien Thierry
2020-06-09 15:42     ` Matt Helsley
2020-06-09 19:31       ` Julien Thierry
2020-06-02 19:49 ` [RFC][PATCH v4 02/32] objtool: Make recordmcount into mcount subcmd Matt Helsley
2020-06-09  9:00   ` Julien Thierry
2020-06-09 18:39     ` Matt Helsley
2020-06-09 18:52       ` Steven Rostedt
2020-06-09 18:56         ` Matt Helsley
2020-06-09 19:11       ` Julien Thierry
2020-06-02 19:49 ` [RFC][PATCH v4 03/32] objtool: recordmcount: Start using objtool's elf wrapper Matt Helsley
2020-06-02 19:49 ` [RFC][PATCH v4 04/32] objtool: recordmcount: Search for __mcount_loc before walking the sections Matt Helsley
2020-06-02 19:49 ` [RFC][PATCH v4 05/32] objtool: recordmcount: Convert do_func() relhdrs Matt Helsley
2020-06-02 19:49 ` [RFC][PATCH v4 06/32] objtool: mcount: Remove unused fname parameter Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 07/32] objtool: mcount: Use libelf for section header names Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 08/32] objtool: mcount: Walk objtool Elf structs in find_secsym_ndx Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 09/32] objtool: mcount: Use symbol structs to find mcount relocations Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 10/32] objtool: mcount: Walk relocation lists Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 11/32] objtool: mcount: Move get_mcountsym Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 12/32] objtool: mcount: Replace MIPS offset types Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 13/32] objtool: mcount: Move is_fake_mcount() Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 14/32] objtool: mcount: Stop using ehdr in find_section_sym_index Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 15/32] objtool: mcount: Move find_section_sym_index() Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 16/32] objtool: mcount: Restrict using ehdr in append_func() Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 17/32] objtool: mcount: Use objtool ELF to write Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 18/32] objtool: mcount: Move nop_mcount() Matt Helsley
2020-06-12 13:26   ` Peter Zijlstra
2020-06-12 16:05     ` Peter Zijlstra
2020-06-17 17:36       ` Matt Helsley
2020-06-17 18:30         ` Peter Zijlstra
2020-06-13 19:49     ` Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 19/32] objtool: mcount: Move has_rel_mcount() and tot_relsize() Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 20/32] objtool: mcount: Move relocation entry size detection Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 21/32] objtool: mcount: Only keep ELF file size Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 22/32] objtool: mcount: Use ELF header from objtool Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 23/32] objtool: mcount: Remove unused file mapping Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 24/32] objtool: mcount: Reduce usage of _size wrapper Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 25/32] objtool: mcount: Move mcount_adjust out of wrapper Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 26/32] objtool: mcount: Pre-allocate new ELF sections Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 27/32] objtool: mcount: Generic location and relocation table types Matt Helsley
2020-06-09  6:41   ` Kamalesh Babulal
2020-06-09 18:12     ` Matt Helsley
2020-06-10  4:35       ` Kamalesh Babulal
2020-06-02 19:50 ` [RFC][PATCH v4 28/32] objtool: mcount: Move sift_rel_mcount out of wrapper file Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 29/32] objtool: mcount: Remove wrapper for ELF relocation type Matt Helsley
2020-06-02 19:50 ` Matt Helsley [this message]
2020-06-02 19:50 ` [RFC][PATCH v4 31/32] objtool: mcount: Remove endian wrappers Matt Helsley
2020-06-02 19:50 ` [RFC][PATCH v4 32/32] objtool: mcount: Rename Matt Helsley

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1e7f39d9067324844f99a9609c8e5fa2a7f2f582.1591125127.git.mhelsley@vmware.com \
    --to=mhelsley@vmware.com \
    --cc=jpoimboe@redhat.com \
    --cc=jthierry@redhat.com \
    --cc=kamalesh@linux.vnet.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=peterz@infradead.org \
    --cc=rostedt@goodmis.org \
    --cc=samitolvanen@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).