diff options
| author | Mark Brown <broonie@kernel.org> | 2020-12-11 17:47:55 +0000 | 
|---|---|---|
| committer | Mark Brown <broonie@kernel.org> | 2020-12-11 17:47:55 +0000 | 
| commit | 031616c434db05ce766f76c62865f55698e0924f (patch) | |
| tree | 7f29aa1ff3e7b51a8058cd570fb785c6e769b245 /tools/perf/tests/pe-file-parsing.c | |
| parent | 064841ccfc49b2315dc0b797239862d3a343aa07 (diff) | |
| parent | 85a7555575a0e48f9b73db310d0d762a08a46d63 (diff) | |
Merge remote-tracking branch 'asoc/for-5.10' into asoc-linus
Diffstat (limited to 'tools/perf/tests/pe-file-parsing.c')
| -rw-r--r-- | tools/perf/tests/pe-file-parsing.c | 98 | 
1 files changed, 98 insertions, 0 deletions
diff --git a/tools/perf/tests/pe-file-parsing.c b/tools/perf/tests/pe-file-parsing.c new file mode 100644 index 000000000000..58b90c42eb38 --- /dev/null +++ b/tools/perf/tests/pe-file-parsing.c @@ -0,0 +1,98 @@ +// SPDX-License-Identifier: GPL-2.0 +#include <stdbool.h> +#include <inttypes.h> +#include <stdlib.h> +#include <string.h> +#include <linux/bitops.h> +#include <linux/kernel.h> +#include <linux/types.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include <subcmd/exec-cmd.h> + +#include "debug.h" +#include "util/build-id.h" +#include "util/symbol.h" +#include "util/dso.h" + +#include "tests.h" + +#ifdef HAVE_LIBBFD_SUPPORT + +static int run_dir(const char *d) +{ +	char filename[PATH_MAX]; +	char debugfile[PATH_MAX]; +	struct build_id bid; +	char debuglink[PATH_MAX]; +	char expect_build_id[] = { +		0x5a, 0x0f, 0xd8, 0x82, 0xb5, 0x30, 0x84, 0x22, +		0x4b, 0xa4, 0x7b, 0x62, 0x4c, 0x55, 0xa4, 0x69, +	}; +	char expect_debuglink[PATH_MAX] = "pe-file.exe.debug"; +	struct dso *dso; +	struct symbol *sym; +	int ret; + +	scnprintf(filename, PATH_MAX, "%s/pe-file.exe", d); +	ret = filename__read_build_id(filename, &bid); +	TEST_ASSERT_VAL("Failed to read build_id", +			ret == sizeof(expect_build_id)); +	TEST_ASSERT_VAL("Wrong build_id", !memcmp(bid.data, expect_build_id, +						  sizeof(expect_build_id))); + +	ret = filename__read_debuglink(filename, debuglink, PATH_MAX); +	TEST_ASSERT_VAL("Failed to read debuglink", ret == 0); +	TEST_ASSERT_VAL("Wrong debuglink", +			!strcmp(debuglink, expect_debuglink)); + +	scnprintf(debugfile, PATH_MAX, "%s/%s", d, debuglink); +	ret = filename__read_build_id(debugfile, &bid); +	TEST_ASSERT_VAL("Failed to read debug file build_id", +			ret == sizeof(expect_build_id)); +	TEST_ASSERT_VAL("Wrong build_id", !memcmp(bid.data, expect_build_id, +						  sizeof(expect_build_id))); + +	dso = dso__new(filename); +	TEST_ASSERT_VAL("Failed to get dso", dso); + +	ret = dso__load_bfd_symbols(dso, debugfile); +	TEST_ASSERT_VAL("Failed to load symbols", ret == 0); + +	dso__sort_by_name(dso); +	sym = dso__find_symbol_by_name(dso, "main"); +	TEST_ASSERT_VAL("Failed to find main", sym); +	dso__delete(dso); + +	return TEST_OK; +} + +int test__pe_file_parsing(struct test *test __maybe_unused, +			  int subtest __maybe_unused) +{ +	struct stat st; +	char path_dir[PATH_MAX]; + +	/* First try development tree tests. */ +	if (!lstat("./tests", &st)) +		return run_dir("./tests"); + +	/* Then installed path. */ +	snprintf(path_dir, PATH_MAX, "%s/tests", get_argv_exec_path()); + +	if (!lstat(path_dir, &st)) +		return run_dir(path_dir); + +	return TEST_SKIP; +} + +#else + +int test__pe_file_parsing(struct test *test __maybe_unused, +			  int subtest __maybe_unused) +{ +	return TEST_SKIP; +} + +#endif  | 
