summaryrefslogtreecommitdiff
path: root/dev-util/kcov/files/kcov-40-binutils-2.39.patch
blob: 88029305c90f99e0bcdf6b398ddbd1a126f32ea7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
https://github.com/SimonKagstrom/kcov/commit/fd1a4fd2f02cee49afd74e427e38c61b89154582
https://bugs.gentoo.org/868114

From fd1a4fd2f02cee49afd74e427e38c61b89154582 Mon Sep 17 00:00:00 2001
From: oreo639 <oreo6391@gmail.com>
Date: Wed, 14 Sep 2022 16:02:17 -0700
Subject: [PATCH] Fix build with binutils 2.39

--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -94,6 +94,7 @@ set (DISASSEMBLER_SRCS
 )
 
 set (HAS_LIBBFD "0")
+set (HAS_LIBBFD_DISASM_STYLED "0")
 
 if (CMAKE_TARGET_ARCHITECTURES STREQUAL "i386" OR CMAKE_TARGET_ARCHITECTURES STREQUAL "x86_64")
 	if (LIBBFD_FOUND)
@@ -106,6 +107,23 @@ if (CMAKE_TARGET_ARCHITECTURES STREQUAL "i386" OR CMAKE_TARGET_ARCHITECTURES STR
 			${LIBBFD_BFD_LIBRARY}
 			${LIBBFD_IBERTY_LIBRARY}
 		)
+		include(CheckCSourceCompiles)
+		set(CMAKE_REQUIRED_LIBRARIES ${DISASSEMBLER_LIBRARIES})
+		check_c_source_compiles("
+		#define PACKAGE
+		#define PACKAGE_VERSION
+		#include <stdio.h>
+		#include <dis-asm.h>
+
+		int main(int argc, char **argv){
+			struct disassemble_info info;
+			init_disassemble_info(&info, stdout, NULL, NULL);
+			return 0;
+		}
+		" TEST_LIBBFD_DISASM_STYLED)
+		if (TEST_LIBBFD_DISASM_STYLED)
+			set (HAS_LIBBFD_DISASM_STYLED "1")
+		endif (TEST_LIBBFD_DISASM_STYLED)
 	endif (LIBBFD_FOUND)
 endif (CMAKE_TARGET_ARCHITECTURES STREQUAL "i386" OR CMAKE_TARGET_ARCHITECTURES STREQUAL "x86_64")
 
@@ -284,7 +302,7 @@ set (KCOV_SYSTEM_MODE_SRCS
 
 set (KCOV_LIBRARY_PREFIX "/tmp")
 
-set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -g -Wall -D_GLIBCXX_USE_NANOSLEEP -DKCOV_LIBRARY_PREFIX=${KCOV_LIBRARY_PREFIX} -DKCOV_HAS_LIBBFD=${HAS_LIBBFD}")
+set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -g -Wall -D_GLIBCXX_USE_NANOSLEEP -DKCOV_LIBRARY_PREFIX=${KCOV_LIBRARY_PREFIX} -DKCOV_HAS_LIBBFD=${HAS_LIBBFD} -DKCOV_LIBFD_DISASM_STYLED=${HAS_LIBBFD_DISASM_STYLED}")
 
 include_directories(
 	include/
--- a/src/parsers/bfd-disassembler.cc
+++ b/src/parsers/bfd-disassembler.cc
@@ -75,7 +75,11 @@ class BfdDisassembler : public IDisassembler
 	BfdDisassembler()
 	{
 		memset(&m_info, 0, sizeof(m_info));
+#if KCOV_LIBFD_DISASM_STYLED
+		init_disassemble_info(&m_info, (void *)this, BfdDisassembler::opcodesFprintFuncStatic, BfdDisassembler::opcodesFprintStyledFuncStatic);
+#else
 		init_disassemble_info(&m_info, (void *)this, BfdDisassembler::opcodesFprintFuncStatic);
+#endif
 		m_disassembler = print_insn_i386;
 
 		m_info.arch = bfd_arch_i386;
@@ -407,6 +411,25 @@ class BfdDisassembler : public IDisassembler
 		return out;
 	}
 
+#if KCOV_LIBFD_DISASM_STYLED
+	static int opcodesFprintStyledFuncStatic(void *info, enum disassembler_style style, const char *fmt, ...)
+	{
+		(void)style;
+		BfdDisassembler *pThis = (BfdDisassembler *)info;
+		char str[64];
+		int out;
+
+		va_list args;
+		va_start (args, fmt);
+		out = vsnprintf( str, sizeof(str) - 1, fmt, args );
+		va_end (args);
+
+		pThis->opcodesFprintFunc(str);
+
+		return out;
+	}
+#endif
+
 	typedef std::map<uint64_t, Section *> SectionCache_t;
 	typedef std::unordered_map<uint64_t, Instruction> InstructionAddressMap_t;
 	typedef std::map<uint64_t, Instruction *> InstructionOrderedMap_t;