gdb/
[deliverable/binutils-gdb.git] / gdb / dicos-tdep.c
CommitLineData
4c1d2973
PA
1/* Target-dependent, architecture-independent code for DICOS, for GDB.
2
0b302171 3 Copyright (C) 2009-2012 Free Software Foundation, Inc.
4c1d2973
PA
4
5 This file is part of GDB.
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, see <http://www.gnu.org/licenses/>. */
19
20#include "defs.h"
21#include "osabi.h"
22#include "gdb_string.h"
23#include "solib.h"
24#include "solib-target.h"
25#include "inferior.h"
26#include "dicos-tdep.h"
27
28void
29dicos_init_abi (struct gdbarch *gdbarch)
30{
31 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
32
33 set_solib_ops (gdbarch, &solib_target_so_ops);
34
35 /* Every process, although has its own address space, sees the same
2567c7d9
PA
36 list of shared libraries. There's no "main executable" in DICOS,
37 so this accounts for all code. */
4c1d2973
PA
38 set_gdbarch_has_global_solist (gdbarch, 1);
39
2567c7d9
PA
40 /* The DICOS breakpoint API takes care of magically making
41 breakpoints visible to all inferiors. */
42 set_gdbarch_has_global_breakpoints (gdbarch, 1);
43
4c1d2973
PA
44 /* There's no (standard definition of) entry point or a guaranteed
45 text location with a symbol where to place the call dummy, so we
46 put it on the stack. */
47 set_gdbarch_call_dummy_location (gdbarch, ON_STACK);
48
49 /* DICOS rewinds the PC itself. */
50 set_gdbarch_decr_pc_after_break (gdbarch, 0);
51}
52
53/* Return true if ABFD is a dicos load module. HEADER_SIZE is the
54 expected size of the "header" section in bytes. */
55
56int
57dicos_load_module_p (bfd *abfd, int header_size)
58{
59 long storage_needed;
60 int ret = 0;
61 asymbol **symbol_table = NULL;
62 const char *symname = "Dicos_loadModuleInfo";
63 asection *section;
64
65 /* DICOS files don't have a .note.ABI-tag marker or something
66 similar. We do know there's always a "header" section of
67 HEADER_SIZE bytes (size depends on architecture), and there's
68 always a "Dicos_loadModuleInfo" symbol defined. Look for the
69 section first, as that should be cheaper. */
70
71 section = bfd_get_section_by_name (abfd, "header");
72 if (!section)
73 return 0;
74
75 if (bfd_section_size (abfd, section) != header_size)
76 return 0;
77
78 /* Dicos LMs always have a "Dicos_loadModuleInfo" symbol
79 defined. Look for it. */
80
81 storage_needed = bfd_get_symtab_upper_bound (abfd);
82 if (storage_needed < 0)
83 {
0963b4bd
MS
84 warning (_("Can't read elf symbols from %s: %s"),
85 bfd_get_filename (abfd),
4c1d2973
PA
86 bfd_errmsg (bfd_get_error ()));
87 return 0;
88 }
89
90 if (storage_needed > 0)
91 {
92 long i, symcount;
93
94 symbol_table = xmalloc (storage_needed);
95 symcount = bfd_canonicalize_symtab (abfd, symbol_table);
96
97 if (symcount < 0)
98 warning (_("Can't read elf symbols from %s: %s"),
99 bfd_get_filename (abfd),
100 bfd_errmsg (bfd_get_error ()));
101 else
102 {
103 for (i = 0; i < symcount; i++)
104 {
105 asymbol *sym = symbol_table[i];
106 if (sym->name != NULL
107 && symname[0] == sym->name[0]
108 && strcmp (symname + 1, sym->name + 1) == 0)
109 {
110 ret = 1;
111 break;
112 }
113 }
114 }
115 }
116
117 xfree (symbol_table);
118 return ret;
119}
This page took 0.359949 seconds and 4 git commands to generate.