Coverage Report

Created: 2023-08-28 06:30

/src/binutils-gdb/bfd/coff-bfd.c
Line
Count
Source (jump to first uncovered line)
1
/* BFD COFF interfaces used outside of BFD.
2
   Copyright (C) 1990-2023 Free Software Foundation, Inc.
3
   Written by Cygnus Support.
4
5
   This file is part of BFD, the Binary File Descriptor library.
6
7
   This program is free software; you can redistribute it and/or modify
8
   it under the terms of the GNU General Public License as published by
9
   the Free Software Foundation; either version 3 of the License, or
10
   (at your option) any later version.
11
12
   This program is distributed in the hope that it will be useful,
13
   but WITHOUT ANY WARRANTY; without even the implied warranty of
14
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
   GNU General Public License for more details.
16
17
   You should have received a copy of the GNU General Public License
18
   along with this program; if not, write to the Free Software
19
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20
   MA 02110-1301, USA.  */
21
22
#include "sysdep.h"
23
#include "bfd.h"
24
#include "libbfd.h"
25
#include "coff/internal.h"
26
#include "libcoff.h"
27
28
/* Return the COFF syment for a symbol.  */
29
30
bool
31
bfd_coff_get_syment (bfd *abfd,
32
         asymbol *symbol,
33
         struct internal_syment *psyment)
34
1.67k
{
35
1.67k
  coff_symbol_type *csym;
36
37
1.67k
  csym = coff_symbol_from (symbol);
38
1.67k
  if (csym == NULL || csym->native == NULL
39
1.67k
      || ! csym->native->is_sym)
40
0
    {
41
0
      bfd_set_error (bfd_error_invalid_operation);
42
0
      return false;
43
0
    }
44
45
1.67k
  *psyment = csym->native->u.syment;
46
47
1.67k
  if (csym->native->fix_value)
48
0
    {
49
0
      psyment->n_value =
50
0
  ((psyment->n_value - (uintptr_t) obj_raw_syments (abfd))
51
0
   / sizeof (combined_entry_type));
52
0
      csym->native->fix_value = 0;
53
0
    }
54
55
  /* FIXME: We should handle fix_line here.  */
56
57
1.67k
  return true;
58
1.67k
}
59
60
/* Return the COFF auxent for a symbol.  */
61
62
bool
63
bfd_coff_get_auxent (bfd *abfd,
64
         asymbol *symbol,
65
         int indx,
66
         union internal_auxent *pauxent)
67
556
{
68
556
  coff_symbol_type *csym;
69
556
  combined_entry_type *ent;
70
71
556
  csym = coff_symbol_from (symbol);
72
73
556
  if (csym == NULL
74
556
      || csym->native == NULL
75
556
      || ! csym->native->is_sym
76
556
      || indx >= csym->native->u.syment.n_numaux)
77
0
    {
78
0
      bfd_set_error (bfd_error_invalid_operation);
79
0
      return false;
80
0
    }
81
82
556
  ent = csym->native + indx + 1;
83
84
556
  BFD_ASSERT (! ent->is_sym);
85
556
  *pauxent = ent->u.auxent;
86
87
556
  if (ent->fix_tag)
88
49
    {
89
49
      pauxent->x_sym.x_tagndx.u32 =
90
49
  ((combined_entry_type *) pauxent->x_sym.x_tagndx.p
91
49
   - obj_raw_syments (abfd));
92
49
      ent->fix_tag = 0;
93
49
    }
94
95
556
  if (ent->fix_end)
96
0
    {
97
0
      pauxent->x_sym.x_fcnary.x_fcn.x_endndx.u32 =
98
0
  ((combined_entry_type *) pauxent->x_sym.x_fcnary.x_fcn.x_endndx.p
99
0
   - obj_raw_syments (abfd));
100
0
      ent->fix_end = 0;
101
0
    }
102
103
556
  if (ent->fix_scnlen)
104
0
    {
105
0
      pauxent->x_csect.x_scnlen.u64 =
106
0
  ((combined_entry_type *) pauxent->x_csect.x_scnlen.p
107
0
   - obj_raw_syments (abfd));
108
0
      ent->fix_scnlen = 0;
109
0
    }
110
111
556
  return true;
112
556
}