/[gcl]/gcl/binutils/bfd/cpu-sh.c
ViewVC logotype

Diff of /gcl/binutils/bfd/cpu-sh.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.1.1.1 by camm, Fri Aug 9 05:35:03 2002 UTC revision 1.2 by camm, Fri Sep 9 23:32:08 2005 UTC
# Line 1  Line 1 
1  /* BFD library support routines for the Hitachi-SH architecture.  /* BFD library support routines for the Renesas / SuperH SH architecture.
2     Copyright 1993, 1994, 1997, 1998, 2000, 2001     Copyright 1993, 1994, 1997, 1998, 2000, 2001, 2002, 2003, 2004, 2005
3     Free Software Foundation, Inc.     Free Software Foundation, Inc.
4     Hacked by Steve Chamberlain of Cygnus Support.     Hacked by Steve Chamberlain of Cygnus Support.
5    
6  This file is part of BFD, the Binary File Descriptor library.     This file is part of BFD, the Binary File Descriptor library.
7    
8  This program is free software; you can redistribute it and/or modify     This program is free software; you can redistribute it and/or modify
9  it under the terms of the GNU General Public License as published by     it under the terms of the GNU General Public License as published by
10  the Free Software Foundation; either version 2 of the License, or     the Free Software Foundation; either version 2 of the License, or
11  (at your option) any later version.     (at your option) any later version.
12    
13  This program is distributed in the hope that it will be useful,     This program is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of     but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  GNU General Public License for more details.     GNU General Public License for more details.
17    
18  You should have received a copy of the GNU General Public License     You should have received a copy of the GNU General Public License
19  along with this program; if not, write to the Free Software     along with this program; if not, write to the Free Software
20  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
21    
22  #include "bfd.h"  #include "bfd.h"
23  #include "sysdep.h"  #include "sysdep.h"
24  #include "libbfd.h"  #include "libbfd.h"
25    #include "../opcodes/sh-opc.h"
26    
27  #if 0  #define SH_NEXT                            arch_info_struct + 0
28  /* This routine is provided two arch_infos and returns whether  #define SH2_NEXT                           arch_info_struct + 1
29     they'd be compatible */  #define SH2E_NEXT                          arch_info_struct + 2
30    #define SH_DSP_NEXT                        arch_info_struct + 3
31  static const bfd_arch_info_type *  #define SH3_NEXT                           arch_info_struct + 4
32  compatible (a,b)  #define SH3_NOMMU_NEXT                     arch_info_struct + 5
33       const bfd_arch_info_type *a;  #define SH3_DSP_NEXT                       arch_info_struct + 6
34       const bfd_arch_info_type *b;  #define SH3E_NEXT                          arch_info_struct + 7
35  {  #define SH4_NEXT                           arch_info_struct + 8
36    if (a->arch != b->arch || a->mach != b->mach)  #define SH4A_NEXT                          arch_info_struct + 9
37     return NULL;  #define SH4AL_DSP_NEXT                     arch_info_struct + 10
38    return a;  #define SH4_NOFPU_NEXT                     arch_info_struct + 11
39  }  #define SH4_NOMMU_NOFPU_NEXT               arch_info_struct + 12
40  #endif  #define SH4A_NOFPU_NEXT                    arch_info_struct + 13
41    #define SH2A_NEXT                          arch_info_struct + 14
42  #define SH_NEXT      &arch_info_struct[0]  #define SH2A_NOFPU_NEXT                    arch_info_struct + 15
43  #define SH2_NEXT     &arch_info_struct[1]  #define SH2A_NOFPU_OR_SH4_NOMMU_NOFPU_NEXT arch_info_struct + 16
44  #define SH_DSP_NEXT  &arch_info_struct[2]  #define SH2A_NOFPU_OR_SH3_NOMMU_NEXT       arch_info_struct + 17
45  #define SH3_NEXT     &arch_info_struct[3]  #define SH2A_OR_SH4_NEXT                   arch_info_struct + 18
46  #define SH3_DSP_NEXT &arch_info_struct[4]  #define SH2A_OR_SH3E_NEXT                  arch_info_struct + 19
47  #define SH3E_NEXT    &arch_info_struct[5]  #define SH64_NEXT                          NULL
 #define SH4_NEXT     NULL  
 #undef  SH4_NEXT  
 #define SH4_NEXT     &arch_info_struct[6]  
 #define SH64_NEXT    NULL  
48    
49  static const bfd_arch_info_type arch_info_struct[] =  static const bfd_arch_info_type arch_info_struct[] =
50  {  {
51    {    {
52      32,                         /* 32 bits in a word */      32,                         /* 32 bits in a word.  */
53      32,                         /* 32 bits in an address */      32,                         /* 32 bits in an address.  */
54      8,                          /* 8 bits in a byte */      8,                          /* 8 bits in a byte.  */
55      bfd_arch_sh,      bfd_arch_sh,
56      bfd_mach_sh2,      bfd_mach_sh2,
57      "sh",                       /* arch_name  */      "sh",                       /* Architecture name.  */
58      "sh2",                      /* printable name */      "sh2",                      /* Machine name.  */
59      1,      1,
60      false,                      /* not the default */      FALSE,                      /* Not the default.  */
61      bfd_default_compatible,      bfd_default_compatible,
62      bfd_default_scan,      bfd_default_scan,
63      SH2_NEXT      SH2_NEXT
64    },    },
65    {    {
66      32,                         /* 32 bits in a word */      32,                         /* 32 bits in a word.  */
67      32,                         /* 32 bits in an address */      32,                         /* 32 bits in an address.  */
68      8,                          /* 8 bits in a byte */      8,                          /* 8 bits in a byte.  */
69        bfd_arch_sh,
70        bfd_mach_sh2e,
71        "sh",                       /* Architecture name.  */
72        "sh2e",                     /* Machine name.  */
73        1,
74        FALSE,                      /* Not the default.  */
75        bfd_default_compatible,
76        bfd_default_scan,
77        SH2E_NEXT
78      },
79      {
80        32,                         /* 32 bits in a word.  */
81        32,                         /* 32 bits in an address.  */
82        8,                          /* 8 bits in a byte.  */
83      bfd_arch_sh,      bfd_arch_sh,
84      bfd_mach_sh_dsp,      bfd_mach_sh_dsp,
85      "sh",                       /* arch_name  */      "sh",                       /* Architecture name.   */
86      "sh-dsp",                   /* printable name */      "sh-dsp",                   /* Machine name.  */
87      1,      1,
88      false,                      /* not the default */      FALSE,                      /* Not the default.  */
89      bfd_default_compatible,      bfd_default_compatible,
90      bfd_default_scan,      bfd_default_scan,
91      SH_DSP_NEXT      SH_DSP_NEXT
92    },    },
93    {    {
94      32,                         /* 32 bits in a word */      32,                         /* 32 bits in a word.  */
95      32,                         /* 32 bits in an address */      32,                         /* 32 bits in an address.  */
96      8,                          /* 8 bits in a byte */      8,                          /* 8 bits in a byte.  */
97      bfd_arch_sh,      bfd_arch_sh,
98      bfd_mach_sh3,      bfd_mach_sh3,
99      "sh",                       /* arch_name  */      "sh",                       /* Architecture name.   */
100      "sh3",                      /* printable name */      "sh3",                      /* Machine name.  */
101      1,      1,
102      false,                      /* not the default */      FALSE,                      /* Not the default.  */
103      bfd_default_compatible,      bfd_default_compatible,
104      bfd_default_scan,      bfd_default_scan,
105      SH3_NEXT      SH3_NEXT
106    },    },
107    {    {
108      32,                         /* 32 bits in a word */      32,                         /* 32 bits in a word.  */
109      32,                         /* 32 bits in an address */      32,                         /* 32 bits in an address.  */
110      8,                          /* 8 bits in a byte */      8,                          /* 8 bits in a byte.  */
111        bfd_arch_sh,
112        bfd_mach_sh3_nommu,
113        "sh",                       /* Architecture name.   */
114        "sh3-nommu",                /* Machine name.  */
115        1,
116        FALSE,                      /* Not the default.  */
117        bfd_default_compatible,
118        bfd_default_scan,
119        SH3_NOMMU_NEXT
120      },
121      {
122        32,                         /* 32 bits in a word.  */
123        32,                         /* 32 bits in an address.  */
124        8,                          /* 8 bits in a byte.  */
125      bfd_arch_sh,      bfd_arch_sh,
126      bfd_mach_sh3_dsp,      bfd_mach_sh3_dsp,
127      "sh",                       /* arch_name  */      "sh",                       /* Architecture name.   */
128      "sh3-dsp",                  /* printable name */      "sh3-dsp",                  /* Machine name.  */
129      1,      1,
130      false,                      /* not the default */      FALSE,                      /* Not the default.  */
131      bfd_default_compatible,      bfd_default_compatible,
132      bfd_default_scan,      bfd_default_scan,
133      SH3_DSP_NEXT      SH3_DSP_NEXT
134    },    },
135    {    {
136      32,                         /* 32 bits in a word */      32,                         /* 32 bits in a word.  */
137      32,                         /* 32 bits in an address */      32,                         /* 32 bits in an address.  */
138      8,                          /* 8 bits in a byte */      8,                          /* 8 bits in a byte.  */
139      bfd_arch_sh,      bfd_arch_sh,
140      bfd_mach_sh3e,      bfd_mach_sh3e,
141      "sh",                       /* arch_name  */      "sh",                       /* Architecture name.   */
142      "sh3e",                     /* printable name */      "sh3e",                     /* Machine name.  */
143      1,      1,
144      false,                      /* not the default */      FALSE,                      /* Not the default.  */
145      bfd_default_compatible,      bfd_default_compatible,
146      bfd_default_scan,      bfd_default_scan,
147      SH3E_NEXT      SH3E_NEXT
148    },    },
149    {    {
150      32,                         /* 32 bits in a word */      32,                         /* 32 bits in a word.  */
151      32,                         /* 32 bits in an address */      32,                         /* 32 bits in an address.  */
152      8,                          /* 8 bits in a byte */      8,                          /* 8 bits in a byte.  */
153      bfd_arch_sh,      bfd_arch_sh,
154      bfd_mach_sh4,      bfd_mach_sh4,
155      "sh",                       /* arch_name  */      "sh",                       /* Architecture name.   */
156      "sh4",                      /* printable name */      "sh4",                      /* Machine name.  */
157      1,      1,
158      false,                      /* not the default */      FALSE,                      /* Not the default.  */
159      bfd_default_compatible,      bfd_default_compatible,
160      bfd_default_scan,      bfd_default_scan,
161      SH4_NEXT      SH4_NEXT
162    },    },
163    {    {
164      64,                         /* 64 bits in a word */      32,                         /* 32 bits in a word.  */
165      64,                         /* 64 bits in an address */      32,                         /* 32 bits in an address.  */
166      8,                          /* 8 bits in a byte */      8,                          /* 8 bits in a byte.  */
167        bfd_arch_sh,
168        bfd_mach_sh4a,
169        "sh",                       /* Architecture name.   */
170        "sh4a",                     /* Machine name.  */
171        1,
172        FALSE,                      /* Not the default.  */
173        bfd_default_compatible,
174        bfd_default_scan,
175        SH4A_NEXT
176      },
177      {
178        32,                         /* 32 bits in a word.  */
179        32,                         /* 32 bits in an address.  */
180        8,                          /* 8 bits in a byte.  */
181        bfd_arch_sh,
182        bfd_mach_sh4al_dsp,
183        "sh",                       /* Architecture name.   */
184        "sh4al-dsp",                /* Machine name.  */
185        1,
186        FALSE,                      /* Not the default.  */
187        bfd_default_compatible,
188        bfd_default_scan,
189        SH4AL_DSP_NEXT
190      },
191      {
192        32,                         /* 32 bits in a word.  */
193        32,                         /* 32 bits in an address.  */
194        8,                          /* 8 bits in a byte.  */
195        bfd_arch_sh,
196        bfd_mach_sh4_nofpu,
197        "sh",                       /* Architecture name.   */
198        "sh4-nofpu",                /* Machine name.  */
199        1,
200        FALSE,                      /* Not the default.  */
201        bfd_default_compatible,
202        bfd_default_scan,
203        SH4_NOFPU_NEXT
204      },
205      {
206        32,                         /* 32 bits in a word.  */
207        32,                         /* 32 bits in an address.  */
208        8,                          /* 8 bits in a byte.  */
209        bfd_arch_sh,
210        bfd_mach_sh4_nommu_nofpu,
211        "sh",                       /* Architecture name.   */
212        "sh4-nommu-nofpu",          /* Machine name.  */
213        1,
214        FALSE,                      /* Not the default.  */
215        bfd_default_compatible,
216        bfd_default_scan,
217        SH4_NOMMU_NOFPU_NEXT
218      },
219      {
220        32,                         /* 32 bits in a word.  */
221        32,                         /* 32 bits in an address.  */
222        8,                          /* 8 bits in a byte.  */
223        bfd_arch_sh,
224        bfd_mach_sh4a_nofpu,
225        "sh",                       /* Architecture name.   */
226        "sh4a-nofpu",               /* Machine name.  */
227        1,
228        FALSE,                      /* Not the default.  */
229        bfd_default_compatible,
230        bfd_default_scan,
231        SH4A_NOFPU_NEXT
232      },
233      {
234        32,                         /* 32 bits in a word.  */
235        32,                         /* 32 bits in an address.  */
236        8,                          /* 8 bits in a byte.  */
237        bfd_arch_sh,
238        bfd_mach_sh2a,
239        "sh",                       /* Architecture name.  */
240        "sh2a",                     /* Machine name.  */
241        1,
242        FALSE,                      /* Not the default.  */
243        bfd_default_compatible,
244        bfd_default_scan,
245        SH2A_NEXT
246      },
247      {
248        32,                         /* 32 bits in a word.  */
249        32,                         /* 32 bits in an address.  */
250        8,                          /* 8 bits in a byte.  */
251        bfd_arch_sh,
252        bfd_mach_sh2a_nofpu,
253        "sh",                       /* Architecture name.  */
254        "sh2a-nofpu",               /* Machine name.  */
255        1,
256        FALSE,                      /* Not the default.  */
257        bfd_default_compatible,
258        bfd_default_scan,
259        SH2A_NOFPU_NEXT
260      },
261      {
262        32,                         /* 32 bits in a word.  */
263        32,                         /* 32 bits in an address.  */
264        8,                          /* 8 bits in a byte.  */
265        bfd_arch_sh,
266        bfd_mach_sh2a_nofpu_or_sh4_nommu_nofpu,
267        "sh",                       /* Architecture name.  */
268        "sh2a-nofpu-or-sh4-nommu-nofpu",            /* Machine name.  */
269        1,
270        FALSE,                      /* Not the default.  */
271        bfd_default_compatible,
272        bfd_default_scan,
273        SH2A_NOFPU_OR_SH4_NOMMU_NOFPU_NEXT
274      },
275      {
276        32,                         /* 32 bits in a word.  */
277        32,                         /* 32 bits in an address.  */
278        8,                          /* 8 bits in a byte.  */
279        bfd_arch_sh,
280        bfd_mach_sh2a_nofpu_or_sh3_nommu,
281        "sh",                       /* Architecture name. .  */
282        "sh2a-nofpu-or-sh3-nommu",  /* Machine name.  */
283        1,
284        FALSE,                      /* Not the default.  */
285        bfd_default_compatible,
286        bfd_default_scan,
287        SH2A_NOFPU_OR_SH3_NOMMU_NEXT
288      },
289      {
290        32,                         /* 32 bits in a word.  */
291        32,                         /* 32 bits in an address.  */
292        8,                          /* 8 bits in a byte.  */
293        bfd_arch_sh,
294        bfd_mach_sh2a_or_sh4,
295        "sh",                       /* Architecture name.  */
296        "sh2a-or-sh4",              /* Machine name.  */
297        1,
298        FALSE,                      /* Not the default.  */
299        bfd_default_compatible,
300        bfd_default_scan,
301        SH2A_OR_SH4_NEXT
302      },
303      {
304        32,                         /* 32 bits in a word.  */
305        32,                         /* 32 bits in an address.  */
306        8,                          /* 8 bits in a byte.  */
307        bfd_arch_sh,
308        bfd_mach_sh2a_or_sh3e,
309        "sh",                       /* Architecture name.  */
310        "sh2a-or-sh3e",             /* Machine name.  */
311        1,
312        FALSE,                      /* Not the default.  */
313        bfd_default_compatible,
314        bfd_default_scan,
315        SH2A_OR_SH3E_NEXT
316      },
317      {
318        64,                         /* 64 bits in a word.  */
319        64,                         /* 64 bits in an address.  */
320        8,                          /* 8 bits in a byte.  */
321      bfd_arch_sh,      bfd_arch_sh,
322      bfd_mach_sh5,      bfd_mach_sh5,
323      "sh",                       /* arch_name  */      "sh",                       /* Architecture name.   */
324      "sh5",                      /* printable name */      "sh5",                      /* Machine name.  */
325      1,      1,
326      false,                      /* not the default */      FALSE,                      /* Not the default.  */
327      bfd_default_compatible,      bfd_default_compatible,
328      bfd_default_scan,      bfd_default_scan,
329      SH64_NEXT      SH64_NEXT
# Line 153  static const bfd_arch_info_type arch_inf Line 332  static const bfd_arch_info_type arch_inf
332    
333  const bfd_arch_info_type bfd_sh_arch =  const bfd_arch_info_type bfd_sh_arch =
334  {  {
335    32,                           /* 32 bits in a word */    32,                           /* 32 bits in a word.  */
336    32,                           /* 32 bits in an address */    32,                           /* 32 bits in an address.  */
337    8,                            /* 8 bits in a byte */    8,                            /* 8 bits in a byte.  */
338    bfd_arch_sh,    bfd_arch_sh,
339    bfd_mach_sh,    bfd_mach_sh,
340    "sh",                         /* arch_name  */    "sh",                         /* Architecture name.   */
341    "sh",                         /* printable name */    "sh",                         /* Machine name.  */
342    1,    1,
343    true,                         /* the default machine */    TRUE,                         /* The default machine.  */
344    bfd_default_compatible,    bfd_default_compatible,
345    bfd_default_scan,    bfd_default_scan,
346    SH_NEXT    SH_NEXT
347  };  };
348    
349    
350    /* This table defines the mappings from the BFD internal numbering
351       system to the opcodes internal flags system.
352       It is used by the functions defined below.
353       The prototypes for these SH specific functions are found in
354       sh-opc.h .  */
355    
356    static struct { unsigned long bfd_mach, arch, arch_up; } bfd_to_arch_table[] =
357    {
358      { bfd_mach_sh,              arch_sh1,             arch_sh_up },
359      { bfd_mach_sh2,             arch_sh2,             arch_sh2_up },
360      { bfd_mach_sh2e,            arch_sh2e,            arch_sh2e_up },
361      { bfd_mach_sh_dsp,          arch_sh_dsp,          arch_sh_dsp_up },
362      { bfd_mach_sh2a,            arch_sh2a,            arch_sh2a_up },
363      { bfd_mach_sh2a_nofpu,      arch_sh2a_nofpu,      arch_sh2a_nofpu_up },
364    
365      { bfd_mach_sh2a_nofpu_or_sh4_nommu_nofpu,         arch_sh2a_nofpu_or_sh4_nommu_nofpu,   arch_sh2a_nofpu_or_sh4_nommu_nofpu_up },
366      { bfd_mach_sh2a_nofpu_or_sh3_nommu,               arch_sh2a_nofpu_or_sh3_nommu,         arch_sh2a_nofpu_or_sh3_nommu_up },
367      { bfd_mach_sh2a_or_sh4,     arch_sh2a_or_sh4,     arch_sh2a_or_sh4_up },
368      { bfd_mach_sh2a_or_sh3e,    arch_sh2a_or_sh3e,    arch_sh2a_or_sh3e_up },
369      
370      { bfd_mach_sh3,             arch_sh3,             arch_sh3_up },
371      { bfd_mach_sh3_nommu,       arch_sh3_nommu,       arch_sh3_nommu_up },
372      { bfd_mach_sh3_dsp,         arch_sh3_dsp,         arch_sh3_dsp_up },
373      { bfd_mach_sh3e,            arch_sh3e,            arch_sh3e_up },
374      { bfd_mach_sh4,             arch_sh4,             arch_sh4_up },
375      { bfd_mach_sh4a,            arch_sh4a,            arch_sh4a_up },
376      { bfd_mach_sh4al_dsp,       arch_sh4al_dsp,       arch_sh4al_dsp_up },
377      { bfd_mach_sh4_nofpu,       arch_sh4_nofpu,       arch_sh4_nofpu_up },
378      { bfd_mach_sh4_nommu_nofpu, arch_sh4_nommu_nofpu, arch_sh4_nommu_nofpu_up },
379      { bfd_mach_sh4a_nofpu,      arch_sh4a_nofpu,      arch_sh4a_nofpu_up },
380      { 0, 0, 0 }   /* Terminator.  */
381    };
382    
383    
384    /* Convert a BFD mach number into the right opcodes arch flags
385       using the table above.  */
386    
387    unsigned int
388    sh_get_arch_from_bfd_mach (unsigned long mach)
389    {
390      int i = 0;
391    
392      while (bfd_to_arch_table[i].bfd_mach != 0)
393        if (bfd_to_arch_table[i].bfd_mach == mach)
394          return bfd_to_arch_table[i].arch;
395        else
396          i++;
397    
398      /* Machine not found.   */
399      BFD_FAIL();
400    
401      return SH_ARCH_UNKNOWN_ARCH;
402    }
403    
404    
405    /* Convert a BFD mach number into a set of opcodes arch flags
406       describing all the compatible architectures (i.e. arch_up)
407       using the table above.  */
408    
409    unsigned int
410    sh_get_arch_up_from_bfd_mach (unsigned long mach)
411    {
412      int i = 0;
413    
414      while (bfd_to_arch_table[i].bfd_mach != 0)
415        if (bfd_to_arch_table[i].bfd_mach == mach)
416          return bfd_to_arch_table[i].arch_up;
417        else
418          i++;
419    
420      /* Machine not found.  */
421      BFD_FAIL();
422    
423      return SH_ARCH_UNKNOWN_ARCH;
424    }
425    
426    
427    /* Convert an arbitary arch_set - not necessarily corresponding
428       directly to anything in the table above - to the most generic
429       architecture which supports all the required features, and
430       return the corresponding BFD mach.  */
431    
432    unsigned long
433    sh_get_bfd_mach_from_arch_set (unsigned int arch_set)
434    {
435      unsigned long result = 0;
436      unsigned int best = ~arch_set;
437      unsigned int co_mask = ~0;
438      int i = 0;
439    
440      /* If arch_set permits variants with no coprocessor then do not allow
441         the other irrelevant co-processor bits to influence the choice:
442           e.g. if dsp is disallowed by arch_set, then the algorithm would
443           prefer fpu variants over nofpu variants because they also disallow
444           dsp - even though the nofpu would be the most correct choice.
445         This assumes that EVERY fpu/dsp variant has a no-coprocessor
446         counter-part, or their non-fpu/dsp instructions do not have the
447         no co-processor bit set.  */
448      if (arch_set & arch_sh_no_co)
449        co_mask = ~(arch_sh_sp_fpu | arch_sh_dp_fpu | arch_sh_has_dsp);
450    
451      while (bfd_to_arch_table[i].bfd_mach != 0)
452        {
453          unsigned int try = bfd_to_arch_table[i].arch_up & co_mask;
454    
455          /* Conceptually: Find the architecture with the least number
456             of extra features or, if they have the same number, then
457             the greatest number of required features.  Disregard
458             architectures where the required features alone do
459             not describe a valid architecture.  */
460          if (((try & ~arch_set) < (best & ~arch_set)
461               || ((try & ~arch_set) == (best & ~arch_set)
462                   && (~try & arch_set) < (~best & arch_set)))
463              && SH_MERGE_ARCH_SET_VALID (try, arch_set))
464            {
465              result = bfd_to_arch_table[i].bfd_mach;
466              best = try;
467            }
468    
469          i++;
470        }
471    
472      /* This might happen if a new variant is added to sh-opc.h
473         but no corresponding entry is added to the table above.  */
474      BFD_ASSERT (result != 0);
475    
476      return result;
477    }
478    
479    
480    /* Merge the architecture type of two BFD files, such that the
481       resultant architecture supports all the features required
482       by the two input BFDs.
483       If the input BFDs are multually incompatible - i.e. one uses
484       DSP while the other uses FPU - or there is no known architecture
485       that fits the requirements then an error is emitted.  */
486    
487    bfd_boolean
488    sh_merge_bfd_arch (bfd *ibfd, bfd *obfd)
489    {
490      unsigned int old_arch, new_arch, merged_arch;
491    
492      if (! _bfd_generic_verify_endian_match (ibfd, obfd))
493        return FALSE;
494    
495      old_arch = sh_get_arch_up_from_bfd_mach (bfd_get_mach (obfd));
496      new_arch = sh_get_arch_up_from_bfd_mach (bfd_get_mach (ibfd));
497    
498      merged_arch = SH_MERGE_ARCH_SET (old_arch, new_arch);
499    
500      if (!SH_VALID_CO_ARCH_SET (merged_arch))
501        {
502          (*_bfd_error_handler)
503            ("%B: uses %s instructions while previous modules use %s instructions",
504             ibfd,
505             SH_ARCH_SET_HAS_DSP (new_arch) ? "dsp" : "floating point",
506             SH_ARCH_SET_HAS_DSP (new_arch) ? "floating point" : "dsp");
507          bfd_set_error (bfd_error_bad_value);
508          return FALSE;
509        }
510      else if (!SH_VALID_ARCH_SET (merged_arch))
511        {
512          (*_bfd_error_handler)
513            ("internal error: merge of architecture '%s' with architecture '%s' produced unknown architecture\n",
514             bfd_printable_name (obfd),
515             bfd_printable_name (ibfd));
516          bfd_set_error (bfd_error_bad_value);
517          return FALSE;
518        }
519    
520      bfd_default_set_arch_mach (obfd, bfd_arch_sh,
521                                 sh_get_bfd_mach_from_arch_set (merged_arch));
522      
523      return TRUE;
524    }

Legend:
Removed from v.1.1.1.1  
changed lines
  Added in v.1.2

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26