summaryrefslogtreecommitdiff
path: root/dev-util/oprofile/files/binutils-2.34.patch
blob: 6337191a21d47a761267bfc6fa1f59296407cd7b (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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
commit 377610414fb6cd7ac30e4485d9d6482fcf29aca6
Author: William Cohen <wcohen@redhat.com>
Date:   Wed Mar 18 21:19:16 2020 -0400

    Macro wrappers to handle the binutils 2.34 api changes
    
    Changes in binutils 2.34 API prevented oprofile from compiling with
    it.  This patch tests for the changes in the binutils API during
    configuration and selects the appropiate wrappers to allow oprofile to
    compile.  This allows oprofile to compile with both older and newer
    versions of binutils.

diff --git a/configure.ac b/configure.ac
index ac2fd35e..df032a78 100644
--- a/configure.ac
+++ b/configure.ac
@@ -224,6 +224,26 @@ if test "$host_cpu" = "powerpc64le" -o "$host_cpu" = "powerpc64"; then
 fi
 AC_SUBST(PFM_LIB)
 
+HAVE_BINUTILS_234='1'
+AC_MSG_CHECKING([whether binutils 2.34 is being used])
+rm -f test-for-BINUTILS
+AC_LANG_CONFTEST(
+	[AC_LANG_PROGRAM([[#include <bfd.h>]],
+		[[asection * sect;
+		bfd_size_type buildid_sect_size = bfd_section_size(sect);
+		return 0;]])
+	])
+$CC conftest.$ac_ext $CFLAGS $LDFLAGS $LIBS $PERF_EVENT_FLAGS -o test-for-BINUTILS  > /dev/null 2>&1
+if test -f test-for-BINUTILS; then
+	echo "yes"
+	HAVE_BINUTILS_234='1'
+else
+	echo "no"
+	HAVE_BINUTILS_234='0'
+fi
+AC_DEFINE_UNQUOTED(HAVE_BINUTILS_234, $HAVE_BINUTILS_234, [Using binutils 2.34])
+rm -f test-for-BINUTILS*
+
 AC_ARG_WITH(java,
 [  --with-java=java-home        Path to Java home directory (default is "no"; "yes" will use /usr as Java home)],
 JAVA_HOMEDIR=$with_java, [with_java=no])
diff --git a/libutil++/bfd_support.cpp b/libutil++/bfd_support.cpp
index fa904839..cd0f4f71 100644
--- a/libutil++/bfd_support.cpp
+++ b/libutil++/bfd_support.cpp
@@ -19,6 +19,7 @@
 #include "locate_images.h"
 #include "op_libiberty.h"
 #include "op_exception.h"
+#include "op_bfd_wrappers.h"
 
 #include <unistd.h>
 #include <errno.h>
@@ -137,7 +138,7 @@ static bool get_build_id(bfd * ibfd, unsigned char * build_id)
 		}
 	}
 
-	bfd_size_type buildid_sect_size = bfd_section_size(ibfd, sect);
+	bfd_size_type buildid_sect_size = op_bfd_section_size(ibfd, sect);
 	char * contents = (char *) xmalloc(buildid_sect_size);
 	errno = 0;
 	if (!bfd_get_section_contents(ibfd, sect,
@@ -188,7 +189,7 @@ bool get_debug_link_info(bfd * ibfd, string & filename, unsigned long & crc32)
 	if (sect == NULL)
 		return false;
 	
-	bfd_size_type debuglink_size = bfd_section_size(ibfd, sect);  
+	bfd_size_type debuglink_size = op_bfd_section_size(ibfd, sect);
 	char * contents = (char *) xmalloc(debuglink_size);
 	cverb << vbfd
 	      << ".gnu_debuglink section has size " << debuglink_size << endl;
@@ -346,7 +347,7 @@ void fixup_linenr(bfd * abfd, asection * section, asymbol ** syms,
 	// first restrict the search on a sensible range of vma, 16 is
 	// an intuitive value based on epilog code look
 	size_t max_search = 16;
-	size_t section_size = bfd_section_size(abfd, section);
+	size_t section_size = op_bfd_section_size(abfd, section);
 	if (pc + max_search > section_size)
 		max_search = section_size - pc;
 
@@ -819,10 +820,10 @@ find_nearest_line(bfd_info const & b, op_bfd_symbol const & sym,
 	else
 		pc = (sym.value() + offset) - sym.filepos();
 
-	if ((bfd_get_section_flags(abfd, section) & SEC_ALLOC) == 0)
+	if ((op_bfd_get_section_flags(abfd, section) & SEC_ALLOC) == 0)
 		goto fail;
 
-	if (pc >= bfd_section_size(abfd, section))
+	if (pc >= op_bfd_section_size(abfd, section))
 		goto fail;
 
 	ret = bfd_find_nearest_line(abfd, section, syms, pc, &cfilename,
diff --git a/libutil/op_bfd_wrappers.h b/libutil/op_bfd_wrappers.h
new file mode 100644
index 00000000..b229cc12
--- /dev/null
+++ b/libutil/op_bfd_wrappers.h
@@ -0,0 +1,28 @@
+/**
+ * @file op_bfd_wrappers.h
+ * Wrappers to hide API changes in binutils 2.34
+ *
+ * @remark Copyright 2020 OProfile authors
+ * @remark Read the file COPYING
+ *
+ * @author William Cohen
+ */
+
+#ifndef OP_BFD_WRAPPERS_H
+#define OP_BFD_WRAPPERS_H
+
+#if HAVE_BINUTILS_234
+#define op_bfd_section_size(ibfd, sec) bfd_section_size(sec)
+#define op_bfd_get_section_flags(abfd, sec) bfd_section_flags(sec)
+#define op_bfd_set_section_flags(abfd, sec, flags) bfd_set_section_flags(sec, flags)
+#define op_bfd_set_section_vma(abfd, sec, vma) bfd_set_section_vma(sec, vma)
+#define op_bfd_set_section_size(abfd, sec, size) bfd_set_section_size(sec, size)
+#else
+#define op_bfd_section_size(ibfd, sec) bfd_section_size(ibfd, sec)
+#define op_bfd_get_section_flags(abfd, sec) bfd_get_section_flags(abfd, sec)
+#define op_bfd_set_section_flags(abfd, sec, flags) bfd_set_section_flags(abfd, sec, flags)
+#define op_bfd_set_section_vma(abfd, sec, vma) bfd_set_section_vma(abfd, sec, vma)
+#define op_bfd_set_section_size(abfd, sec, size) bfd_set_section_size(abfd, sec, size)
+#endif
+
+#endif /* !OP_BFD_WRAPPERS_H */
diff --git a/opjitconv/create_bfd.c b/opjitconv/create_bfd.c
index 48db143b..da1e6d29 100644
--- a/opjitconv/create_bfd.c
+++ b/opjitconv/create_bfd.c
@@ -16,6 +16,7 @@
 
 #include "opjitconv.h"
 #include "op_libiberty.h"
+#include "op_bfd_wrappers.h"
 
 #include <bfd.h>
 #include <assert.h>
@@ -86,12 +87,12 @@ asection * create_section(bfd * abfd, char const * section_name,
 		bfd_perror("bfd_make_section");
 		goto error;
 	}
-	bfd_set_section_vma(abfd, section, vma);
-	if (bfd_set_section_size(abfd, section, size) == FALSE) {
+	op_bfd_set_section_vma(abfd, section, vma);
+	if (op_bfd_set_section_size(abfd, section, size) == FALSE) {
 		bfd_perror("bfd_set_section_size");
 		goto error;
 	}
-	if (bfd_set_section_flags(abfd, section, flags) == FALSE) {
+	if (op_bfd_set_section_flags(abfd, section, flags) == FALSE) {
 		bfd_perror("bfd_set_section_flags");
 		goto error;
 	}