/contrib/toolchain/binutils/Makefile |
---|
0,0 → 1,27 |
export CC = kos32-gcc |
export AR = kos32-ar |
export LD = kos32-ld |
export STRIP = kos32-strip |
export SDK_DIR:= $(abspath ../../sdk) |
CFLAGS_OPT = -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32 -U_MSC_VER -O2 |
CFLAGS_OPT+= -fomit-frame-pointer -fno-ident -mno-ms-bitfields |
CFLAGS_OPT+= -W -Wall -Wwrite-strings -Wc++-compat -Wstrict-prototypes -pedantic |
CFLAGS = -c $(CFLAGS_OPT) |
LDFLAGS = -nostdlib -shared -s --image-base 0 -T ../newlib/dll.lds -e _DllStartup |
LDFLAGS+= --out-implib |
SUBDIRS = libiberty |
# targets |
all: |
@echo $(SDK_DIR); \ |
for i in $(SUBDIRS); do \ |
$(MAKE) -C $$i; \ |
done |
/contrib/toolchain/binutils/include/COPYING |
---|
0,0 → 1,340 |
GNU GENERAL PUBLIC LICENSE |
Version 2, June 1991 |
Copyright (C) 1989, 1991 Free Software Foundation, Inc. |
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
Everyone is permitted to copy and distribute verbatim copies |
of this license document, but changing it is not allowed. |
Preamble |
The licenses for most software are designed to take away your |
freedom to share and change it. By contrast, the GNU General Public |
License is intended to guarantee your freedom to share and change free |
software--to make sure the software is free for all its users. This |
General Public License applies to most of the Free Software |
Foundation's software and to any other program whose authors commit to |
using it. (Some other Free Software Foundation software is covered by |
the GNU Library General Public License instead.) You can apply it to |
your programs, too. |
When we speak of free software, we are referring to freedom, not |
price. Our General Public Licenses are designed to make sure that you |
have the freedom to distribute copies of free software (and charge for |
this service if you wish), that you receive source code or can get it |
if you want it, that you can change the software or use pieces of it |
in new free programs; and that you know you can do these things. |
To protect your rights, we need to make restrictions that forbid |
anyone to deny you these rights or to ask you to surrender the rights. |
These restrictions translate to certain responsibilities for you if you |
distribute copies of the software, or if you modify it. |
For example, if you distribute copies of such a program, whether |
gratis or for a fee, you must give the recipients all the rights that |
you have. You must make sure that they, too, receive or can get the |
source code. And you must show them these terms so they know their |
rights. |
We protect your rights with two steps: (1) copyright the software, and |
(2) offer you this license which gives you legal permission to copy, |
distribute and/or modify the software. |
Also, for each author's protection and ours, we want to make certain |
that everyone understands that there is no warranty for this free |
software. If the software is modified by someone else and passed on, we |
want its recipients to know that what they have is not the original, so |
that any problems introduced by others will not reflect on the original |
authors' reputations. |
Finally, any free program is threatened constantly by software |
patents. We wish to avoid the danger that redistributors of a free |
program will individually obtain patent licenses, in effect making the |
program proprietary. To prevent this, we have made it clear that any |
patent must be licensed for everyone's free use or not licensed at all. |
The precise terms and conditions for copying, distribution and |
modification follow. |
GNU GENERAL PUBLIC LICENSE |
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION |
0. This License applies to any program or other work which contains |
a notice placed by the copyright holder saying it may be distributed |
under the terms of this General Public License. The "Program", below, |
refers to any such program or work, and a "work based on the Program" |
means either the Program or any derivative work under copyright law: |
that is to say, a work containing the Program or a portion of it, |
either verbatim or with modifications and/or translated into another |
language. (Hereinafter, translation is included without limitation in |
the term "modification".) Each licensee is addressed as "you". |
Activities other than copying, distribution and modification are not |
covered by this License; they are outside its scope. The act of |
running the Program is not restricted, and the output from the Program |
is covered only if its contents constitute a work based on the |
Program (independent of having been made by running the Program). |
Whether that is true depends on what the Program does. |
1. You may copy and distribute verbatim copies of the Program's |
source code as you receive it, in any medium, provided that you |
conspicuously and appropriately publish on each copy an appropriate |
copyright notice and disclaimer of warranty; keep intact all the |
notices that refer to this License and to the absence of any warranty; |
and give any other recipients of the Program a copy of this License |
along with the Program. |
You may charge a fee for the physical act of transferring a copy, and |
you may at your option offer warranty protection in exchange for a fee. |
2. You may modify your copy or copies of the Program or any portion |
of it, thus forming a work based on the Program, and copy and |
distribute such modifications or work under the terms of Section 1 |
above, provided that you also meet all of these conditions: |
a) You must cause the modified files to carry prominent notices |
stating that you changed the files and the date of any change. |
b) You must cause any work that you distribute or publish, that in |
whole or in part contains or is derived from the Program or any |
part thereof, to be licensed as a whole at no charge to all third |
parties under the terms of this License. |
c) If the modified program normally reads commands interactively |
when run, you must cause it, when started running for such |
interactive use in the most ordinary way, to print or display an |
announcement including an appropriate copyright notice and a |
notice that there is no warranty (or else, saying that you provide |
a warranty) and that users may redistribute the program under |
these conditions, and telling the user how to view a copy of this |
License. (Exception: if the Program itself is interactive but |
does not normally print such an announcement, your work based on |
the Program is not required to print an announcement.) |
These requirements apply to the modified work as a whole. If |
identifiable sections of that work are not derived from the Program, |
and can be reasonably considered independent and separate works in |
themselves, then this License, and its terms, do not apply to those |
sections when you distribute them as separate works. But when you |
distribute the same sections as part of a whole which is a work based |
on the Program, the distribution of the whole must be on the terms of |
this License, whose permissions for other licensees extend to the |
entire whole, and thus to each and every part regardless of who wrote it. |
Thus, it is not the intent of this section to claim rights or contest |
your rights to work written entirely by you; rather, the intent is to |
exercise the right to control the distribution of derivative or |
collective works based on the Program. |
In addition, mere aggregation of another work not based on the Program |
with the Program (or with a work based on the Program) on a volume of |
a storage or distribution medium does not bring the other work under |
the scope of this License. |
3. You may copy and distribute the Program (or a work based on it, |
under Section 2) in object code or executable form under the terms of |
Sections 1 and 2 above provided that you also do one of the following: |
a) Accompany it with the complete corresponding machine-readable |
source code, which must be distributed under the terms of Sections |
1 and 2 above on a medium customarily used for software interchange; or, |
b) Accompany it with a written offer, valid for at least three |
years, to give any third party, for a charge no more than your |
cost of physically performing source distribution, a complete |
machine-readable copy of the corresponding source code, to be |
distributed under the terms of Sections 1 and 2 above on a medium |
customarily used for software interchange; or, |
c) Accompany it with the information you received as to the offer |
to distribute corresponding source code. (This alternative is |
allowed only for noncommercial distribution and only if you |
received the program in object code or executable form with such |
an offer, in accord with Subsection b above.) |
The source code for a work means the preferred form of the work for |
making modifications to it. For an executable work, complete source |
code means all the source code for all modules it contains, plus any |
associated interface definition files, plus the scripts used to |
control compilation and installation of the executable. However, as a |
special exception, the source code distributed need not include |
anything that is normally distributed (in either source or binary |
form) with the major components (compiler, kernel, and so on) of the |
operating system on which the executable runs, unless that component |
itself accompanies the executable. |
If distribution of executable or object code is made by offering |
access to copy from a designated place, then offering equivalent |
access to copy the source code from the same place counts as |
distribution of the source code, even though third parties are not |
compelled to copy the source along with the object code. |
4. You may not copy, modify, sublicense, or distribute the Program |
except as expressly provided under this License. Any attempt |
otherwise to copy, modify, sublicense or distribute the Program is |
void, and will automatically terminate your rights under this License. |
However, parties who have received copies, or rights, from you under |
this License will not have their licenses terminated so long as such |
parties remain in full compliance. |
5. You are not required to accept this License, since you have not |
signed it. However, nothing else grants you permission to modify or |
distribute the Program or its derivative works. These actions are |
prohibited by law if you do not accept this License. Therefore, by |
modifying or distributing the Program (or any work based on the |
Program), you indicate your acceptance of this License to do so, and |
all its terms and conditions for copying, distributing or modifying |
the Program or works based on it. |
6. Each time you redistribute the Program (or any work based on the |
Program), the recipient automatically receives a license from the |
original licensor to copy, distribute or modify the Program subject to |
these terms and conditions. You may not impose any further |
restrictions on the recipients' exercise of the rights granted herein. |
You are not responsible for enforcing compliance by third parties to |
this License. |
7. If, as a consequence of a court judgment or allegation of patent |
infringement or for any other reason (not limited to patent issues), |
conditions are imposed on you (whether by court order, agreement or |
otherwise) that contradict the conditions of this License, they do not |
excuse you from the conditions of this License. If you cannot |
distribute so as to satisfy simultaneously your obligations under this |
License and any other pertinent obligations, then as a consequence you |
may not distribute the Program at all. For example, if a patent |
license would not permit royalty-free redistribution of the Program by |
all those who receive copies directly or indirectly through you, then |
the only way you could satisfy both it and this License would be to |
refrain entirely from distribution of the Program. |
If any portion of this section is held invalid or unenforceable under |
any particular circumstance, the balance of the section is intended to |
apply and the section as a whole is intended to apply in other |
circumstances. |
It is not the purpose of this section to induce you to infringe any |
patents or other property right claims or to contest validity of any |
such claims; this section has the sole purpose of protecting the |
integrity of the free software distribution system, which is |
implemented by public license practices. Many people have made |
generous contributions to the wide range of software distributed |
through that system in reliance on consistent application of that |
system; it is up to the author/donor to decide if he or she is willing |
to distribute software through any other system and a licensee cannot |
impose that choice. |
This section is intended to make thoroughly clear what is believed to |
be a consequence of the rest of this License. |
8. If the distribution and/or use of the Program is restricted in |
certain countries either by patents or by copyrighted interfaces, the |
original copyright holder who places the Program under this License |
may add an explicit geographical distribution limitation excluding |
those countries, so that distribution is permitted only in or among |
countries not thus excluded. In such case, this License incorporates |
the limitation as if written in the body of this License. |
9. The Free Software Foundation may publish revised and/or new versions |
of the General Public License from time to time. Such new versions will |
be similar in spirit to the present version, but may differ in detail to |
address new problems or concerns. |
Each version is given a distinguishing version number. If the Program |
specifies a version number of this License which applies to it and "any |
later version", you have the option of following the terms and conditions |
either of that version or of any later version published by the Free |
Software Foundation. If the Program does not specify a version number of |
this License, you may choose any version ever published by the Free Software |
Foundation. |
10. If you wish to incorporate parts of the Program into other free |
programs whose distribution conditions are different, write to the author |
to ask for permission. For software which is copyrighted by the Free |
Software Foundation, write to the Free Software Foundation; we sometimes |
make exceptions for this. Our decision will be guided by the two goals |
of preserving the free status of all derivatives of our free software and |
of promoting the sharing and reuse of software generally. |
NO WARRANTY |
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY |
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN |
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES |
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED |
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS |
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE |
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, |
REPAIR OR CORRECTION. |
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING |
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR |
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, |
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING |
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED |
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY |
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER |
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE |
POSSIBILITY OF SUCH DAMAGES. |
END OF TERMS AND CONDITIONS |
How to Apply These Terms to Your New Programs |
If you develop a new program, and you want it to be of the greatest |
possible use to the public, the best way to achieve this is to make it |
free software which everyone can redistribute and change under these terms. |
To do so, attach the following notices to the program. It is safest |
to attach them to the start of each source file to most effectively |
convey the exclusion of warranty; and each file should have at least |
the "copyright" line and a pointer to where the full notice is found. |
<one line to give the program's name and a brief idea of what it does.> |
Copyright (C) <year> <name of author> |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
Also add information on how to contact you by electronic and paper mail. |
If the program is interactive, make it output a short notice like this |
when it starts in an interactive mode: |
Gnomovision version 69, Copyright (C) year name of author |
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. |
This is free software, and you are welcome to redistribute it |
under certain conditions; type `show c' for details. |
The hypothetical commands `show w' and `show c' should show the appropriate |
parts of the General Public License. Of course, the commands you use may |
be called something other than `show w' and `show c'; they could even be |
mouse-clicks or menu items--whatever suits your program. |
You should also get your employer (if you work as a programmer) or your |
school, if any, to sign a "copyright disclaimer" for the program, if |
necessary. Here is a sample; alter the names: |
Yoyodyne, Inc., hereby disclaims all copyright interest in the program |
`Gnomovision' (which makes passes at compilers) written by James Hacker. |
<signature of Ty Coon>, 1 April 1989 |
Ty Coon, President of Vice |
This General Public License does not permit incorporating your program into |
proprietary programs. If your program is a subroutine library, you may |
consider it more useful to permit linking proprietary applications with the |
library. If this is what you want to do, use the GNU Library General |
Public License instead of this License. |
/contrib/toolchain/binutils/include/COPYING3 |
---|
0,0 → 1,674 |
GNU GENERAL PUBLIC LICENSE |
Version 3, 29 June 2007 |
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> |
Everyone is permitted to copy and distribute verbatim copies |
of this license document, but changing it is not allowed. |
Preamble |
The GNU General Public License is a free, copyleft license for |
software and other kinds of works. |
The licenses for most software and other practical works are designed |
to take away your freedom to share and change the works. By contrast, |
the GNU General Public License is intended to guarantee your freedom to |
share and change all versions of a program--to make sure it remains free |
software for all its users. We, the Free Software Foundation, use the |
GNU General Public License for most of our software; it applies also to |
any other work released this way by its authors. You can apply it to |
your programs, too. |
When we speak of free software, we are referring to freedom, not |
price. Our General Public Licenses are designed to make sure that you |
have the freedom to distribute copies of free software (and charge for |
them if you wish), that you receive source code or can get it if you |
want it, that you can change the software or use pieces of it in new |
free programs, and that you know you can do these things. |
To protect your rights, we need to prevent others from denying you |
these rights or asking you to surrender the rights. Therefore, you have |
certain responsibilities if you distribute copies of the software, or if |
you modify it: responsibilities to respect the freedom of others. |
For example, if you distribute copies of such a program, whether |
gratis or for a fee, you must pass on to the recipients the same |
freedoms that you received. You must make sure that they, too, receive |
or can get the source code. And you must show them these terms so they |
know their rights. |
Developers that use the GNU GPL protect your rights with two steps: |
(1) assert copyright on the software, and (2) offer you this License |
giving you legal permission to copy, distribute and/or modify it. |
For the developers' and authors' protection, the GPL clearly explains |
that there is no warranty for this free software. For both users' and |
authors' sake, the GPL requires that modified versions be marked as |
changed, so that their problems will not be attributed erroneously to |
authors of previous versions. |
Some devices are designed to deny users access to install or run |
modified versions of the software inside them, although the manufacturer |
can do so. This is fundamentally incompatible with the aim of |
protecting users' freedom to change the software. The systematic |
pattern of such abuse occurs in the area of products for individuals to |
use, which is precisely where it is most unacceptable. Therefore, we |
have designed this version of the GPL to prohibit the practice for those |
products. If such problems arise substantially in other domains, we |
stand ready to extend this provision to those domains in future versions |
of the GPL, as needed to protect the freedom of users. |
Finally, every program is threatened constantly by software patents. |
States should not allow patents to restrict development and use of |
software on general-purpose computers, but in those that do, we wish to |
avoid the special danger that patents applied to a free program could |
make it effectively proprietary. To prevent this, the GPL assures that |
patents cannot be used to render the program non-free. |
The precise terms and conditions for copying, distribution and |
modification follow. |
TERMS AND CONDITIONS |
0. Definitions. |
"This License" refers to version 3 of the GNU General Public License. |
"Copyright" also means copyright-like laws that apply to other kinds of |
works, such as semiconductor masks. |
"The Program" refers to any copyrightable work licensed under this |
License. Each licensee is addressed as "you". "Licensees" and |
"recipients" may be individuals or organizations. |
To "modify" a work means to copy from or adapt all or part of the work |
in a fashion requiring copyright permission, other than the making of an |
exact copy. The resulting work is called a "modified version" of the |
earlier work or a work "based on" the earlier work. |
A "covered work" means either the unmodified Program or a work based |
on the Program. |
To "propagate" a work means to do anything with it that, without |
permission, would make you directly or secondarily liable for |
infringement under applicable copyright law, except executing it on a |
computer or modifying a private copy. Propagation includes copying, |
distribution (with or without modification), making available to the |
public, and in some countries other activities as well. |
To "convey" a work means any kind of propagation that enables other |
parties to make or receive copies. Mere interaction with a user through |
a computer network, with no transfer of a copy, is not conveying. |
An interactive user interface displays "Appropriate Legal Notices" |
to the extent that it includes a convenient and prominently visible |
feature that (1) displays an appropriate copyright notice, and (2) |
tells the user that there is no warranty for the work (except to the |
extent that warranties are provided), that licensees may convey the |
work under this License, and how to view a copy of this License. If |
the interface presents a list of user commands or options, such as a |
menu, a prominent item in the list meets this criterion. |
1. Source Code. |
The "source code" for a work means the preferred form of the work |
for making modifications to it. "Object code" means any non-source |
form of a work. |
A "Standard Interface" means an interface that either is an official |
standard defined by a recognized standards body, or, in the case of |
interfaces specified for a particular programming language, one that |
is widely used among developers working in that language. |
The "System Libraries" of an executable work include anything, other |
than the work as a whole, that (a) is included in the normal form of |
packaging a Major Component, but which is not part of that Major |
Component, and (b) serves only to enable use of the work with that |
Major Component, or to implement a Standard Interface for which an |
implementation is available to the public in source code form. A |
"Major Component", in this context, means a major essential component |
(kernel, window system, and so on) of the specific operating system |
(if any) on which the executable work runs, or a compiler used to |
produce the work, or an object code interpreter used to run it. |
The "Corresponding Source" for a work in object code form means all |
the source code needed to generate, install, and (for an executable |
work) run the object code and to modify the work, including scripts to |
control those activities. However, it does not include the work's |
System Libraries, or general-purpose tools or generally available free |
programs which are used unmodified in performing those activities but |
which are not part of the work. For example, Corresponding Source |
includes interface definition files associated with source files for |
the work, and the source code for shared libraries and dynamically |
linked subprograms that the work is specifically designed to require, |
such as by intimate data communication or control flow between those |
subprograms and other parts of the work. |
The Corresponding Source need not include anything that users |
can regenerate automatically from other parts of the Corresponding |
Source. |
The Corresponding Source for a work in source code form is that |
same work. |
2. Basic Permissions. |
All rights granted under this License are granted for the term of |
copyright on the Program, and are irrevocable provided the stated |
conditions are met. This License explicitly affirms your unlimited |
permission to run the unmodified Program. The output from running a |
covered work is covered by this License only if the output, given its |
content, constitutes a covered work. This License acknowledges your |
rights of fair use or other equivalent, as provided by copyright law. |
You may make, run and propagate covered works that you do not |
convey, without conditions so long as your license otherwise remains |
in force. You may convey covered works to others for the sole purpose |
of having them make modifications exclusively for you, or provide you |
with facilities for running those works, provided that you comply with |
the terms of this License in conveying all material for which you do |
not control copyright. Those thus making or running the covered works |
for you must do so exclusively on your behalf, under your direction |
and control, on terms that prohibit them from making any copies of |
your copyrighted material outside their relationship with you. |
Conveying under any other circumstances is permitted solely under |
the conditions stated below. Sublicensing is not allowed; section 10 |
makes it unnecessary. |
3. Protecting Users' Legal Rights From Anti-Circumvention Law. |
No covered work shall be deemed part of an effective technological |
measure under any applicable law fulfilling obligations under article |
11 of the WIPO copyright treaty adopted on 20 December 1996, or |
similar laws prohibiting or restricting circumvention of such |
measures. |
When you convey a covered work, you waive any legal power to forbid |
circumvention of technological measures to the extent such circumvention |
is effected by exercising rights under this License with respect to |
the covered work, and you disclaim any intention to limit operation or |
modification of the work as a means of enforcing, against the work's |
users, your or third parties' legal rights to forbid circumvention of |
technological measures. |
4. Conveying Verbatim Copies. |
You may convey verbatim copies of the Program's source code as you |
receive it, in any medium, provided that you conspicuously and |
appropriately publish on each copy an appropriate copyright notice; |
keep intact all notices stating that this License and any |
non-permissive terms added in accord with section 7 apply to the code; |
keep intact all notices of the absence of any warranty; and give all |
recipients a copy of this License along with the Program. |
You may charge any price or no price for each copy that you convey, |
and you may offer support or warranty protection for a fee. |
5. Conveying Modified Source Versions. |
You may convey a work based on the Program, or the modifications to |
produce it from the Program, in the form of source code under the |
terms of section 4, provided that you also meet all of these conditions: |
a) The work must carry prominent notices stating that you modified |
it, and giving a relevant date. |
b) The work must carry prominent notices stating that it is |
released under this License and any conditions added under section |
7. This requirement modifies the requirement in section 4 to |
"keep intact all notices". |
c) You must license the entire work, as a whole, under this |
License to anyone who comes into possession of a copy. This |
License will therefore apply, along with any applicable section 7 |
additional terms, to the whole of the work, and all its parts, |
regardless of how they are packaged. This License gives no |
permission to license the work in any other way, but it does not |
invalidate such permission if you have separately received it. |
d) If the work has interactive user interfaces, each must display |
Appropriate Legal Notices; however, if the Program has interactive |
interfaces that do not display Appropriate Legal Notices, your |
work need not make them do so. |
A compilation of a covered work with other separate and independent |
works, which are not by their nature extensions of the covered work, |
and which are not combined with it such as to form a larger program, |
in or on a volume of a storage or distribution medium, is called an |
"aggregate" if the compilation and its resulting copyright are not |
used to limit the access or legal rights of the compilation's users |
beyond what the individual works permit. Inclusion of a covered work |
in an aggregate does not cause this License to apply to the other |
parts of the aggregate. |
6. Conveying Non-Source Forms. |
You may convey a covered work in object code form under the terms |
of sections 4 and 5, provided that you also convey the |
machine-readable Corresponding Source under the terms of this License, |
in one of these ways: |
a) Convey the object code in, or embodied in, a physical product |
(including a physical distribution medium), accompanied by the |
Corresponding Source fixed on a durable physical medium |
customarily used for software interchange. |
b) Convey the object code in, or embodied in, a physical product |
(including a physical distribution medium), accompanied by a |
written offer, valid for at least three years and valid for as |
long as you offer spare parts or customer support for that product |
model, to give anyone who possesses the object code either (1) a |
copy of the Corresponding Source for all the software in the |
product that is covered by this License, on a durable physical |
medium customarily used for software interchange, for a price no |
more than your reasonable cost of physically performing this |
conveying of source, or (2) access to copy the |
Corresponding Source from a network server at no charge. |
c) Convey individual copies of the object code with a copy of the |
written offer to provide the Corresponding Source. This |
alternative is allowed only occasionally and noncommercially, and |
only if you received the object code with such an offer, in accord |
with subsection 6b. |
d) Convey the object code by offering access from a designated |
place (gratis or for a charge), and offer equivalent access to the |
Corresponding Source in the same way through the same place at no |
further charge. You need not require recipients to copy the |
Corresponding Source along with the object code. If the place to |
copy the object code is a network server, the Corresponding Source |
may be on a different server (operated by you or a third party) |
that supports equivalent copying facilities, provided you maintain |
clear directions next to the object code saying where to find the |
Corresponding Source. Regardless of what server hosts the |
Corresponding Source, you remain obligated to ensure that it is |
available for as long as needed to satisfy these requirements. |
e) Convey the object code using peer-to-peer transmission, provided |
you inform other peers where the object code and Corresponding |
Source of the work are being offered to the general public at no |
charge under subsection 6d. |
A separable portion of the object code, whose source code is excluded |
from the Corresponding Source as a System Library, need not be |
included in conveying the object code work. |
A "User Product" is either (1) a "consumer product", which means any |
tangible personal property which is normally used for personal, family, |
or household purposes, or (2) anything designed or sold for incorporation |
into a dwelling. In determining whether a product is a consumer product, |
doubtful cases shall be resolved in favor of coverage. For a particular |
product received by a particular user, "normally used" refers to a |
typical or common use of that class of product, regardless of the status |
of the particular user or of the way in which the particular user |
actually uses, or expects or is expected to use, the product. A product |
is a consumer product regardless of whether the product has substantial |
commercial, industrial or non-consumer uses, unless such uses represent |
the only significant mode of use of the product. |
"Installation Information" for a User Product means any methods, |
procedures, authorization keys, or other information required to install |
and execute modified versions of a covered work in that User Product from |
a modified version of its Corresponding Source. The information must |
suffice to ensure that the continued functioning of the modified object |
code is in no case prevented or interfered with solely because |
modification has been made. |
If you convey an object code work under this section in, or with, or |
specifically for use in, a User Product, and the conveying occurs as |
part of a transaction in which the right of possession and use of the |
User Product is transferred to the recipient in perpetuity or for a |
fixed term (regardless of how the transaction is characterized), the |
Corresponding Source conveyed under this section must be accompanied |
by the Installation Information. But this requirement does not apply |
if neither you nor any third party retains the ability to install |
modified object code on the User Product (for example, the work has |
been installed in ROM). |
The requirement to provide Installation Information does not include a |
requirement to continue to provide support service, warranty, or updates |
for a work that has been modified or installed by the recipient, or for |
the User Product in which it has been modified or installed. Access to a |
network may be denied when the modification itself materially and |
adversely affects the operation of the network or violates the rules and |
protocols for communication across the network. |
Corresponding Source conveyed, and Installation Information provided, |
in accord with this section must be in a format that is publicly |
documented (and with an implementation available to the public in |
source code form), and must require no special password or key for |
unpacking, reading or copying. |
7. Additional Terms. |
"Additional permissions" are terms that supplement the terms of this |
License by making exceptions from one or more of its conditions. |
Additional permissions that are applicable to the entire Program shall |
be treated as though they were included in this License, to the extent |
that they are valid under applicable law. If additional permissions |
apply only to part of the Program, that part may be used separately |
under those permissions, but the entire Program remains governed by |
this License without regard to the additional permissions. |
When you convey a copy of a covered work, you may at your option |
remove any additional permissions from that copy, or from any part of |
it. (Additional permissions may be written to require their own |
removal in certain cases when you modify the work.) You may place |
additional permissions on material, added by you to a covered work, |
for which you have or can give appropriate copyright permission. |
Notwithstanding any other provision of this License, for material you |
add to a covered work, you may (if authorized by the copyright holders of |
that material) supplement the terms of this License with terms: |
a) Disclaiming warranty or limiting liability differently from the |
terms of sections 15 and 16 of this License; or |
b) Requiring preservation of specified reasonable legal notices or |
author attributions in that material or in the Appropriate Legal |
Notices displayed by works containing it; or |
c) Prohibiting misrepresentation of the origin of that material, or |
requiring that modified versions of such material be marked in |
reasonable ways as different from the original version; or |
d) Limiting the use for publicity purposes of names of licensors or |
authors of the material; or |
e) Declining to grant rights under trademark law for use of some |
trade names, trademarks, or service marks; or |
f) Requiring indemnification of licensors and authors of that |
material by anyone who conveys the material (or modified versions of |
it) with contractual assumptions of liability to the recipient, for |
any liability that these contractual assumptions directly impose on |
those licensors and authors. |
All other non-permissive additional terms are considered "further |
restrictions" within the meaning of section 10. If the Program as you |
received it, or any part of it, contains a notice stating that it is |
governed by this License along with a term that is a further |
restriction, you may remove that term. If a license document contains |
a further restriction but permits relicensing or conveying under this |
License, you may add to a covered work material governed by the terms |
of that license document, provided that the further restriction does |
not survive such relicensing or conveying. |
If you add terms to a covered work in accord with this section, you |
must place, in the relevant source files, a statement of the |
additional terms that apply to those files, or a notice indicating |
where to find the applicable terms. |
Additional terms, permissive or non-permissive, may be stated in the |
form of a separately written license, or stated as exceptions; |
the above requirements apply either way. |
8. Termination. |
You may not propagate or modify a covered work except as expressly |
provided under this License. Any attempt otherwise to propagate or |
modify it is void, and will automatically terminate your rights under |
this License (including any patent licenses granted under the third |
paragraph of section 11). |
However, if you cease all violation of this License, then your |
license from a particular copyright holder is reinstated (a) |
provisionally, unless and until the copyright holder explicitly and |
finally terminates your license, and (b) permanently, if the copyright |
holder fails to notify you of the violation by some reasonable means |
prior to 60 days after the cessation. |
Moreover, your license from a particular copyright holder is |
reinstated permanently if the copyright holder notifies you of the |
violation by some reasonable means, this is the first time you have |
received notice of violation of this License (for any work) from that |
copyright holder, and you cure the violation prior to 30 days after |
your receipt of the notice. |
Termination of your rights under this section does not terminate the |
licenses of parties who have received copies or rights from you under |
this License. If your rights have been terminated and not permanently |
reinstated, you do not qualify to receive new licenses for the same |
material under section 10. |
9. Acceptance Not Required for Having Copies. |
You are not required to accept this License in order to receive or |
run a copy of the Program. Ancillary propagation of a covered work |
occurring solely as a consequence of using peer-to-peer transmission |
to receive a copy likewise does not require acceptance. However, |
nothing other than this License grants you permission to propagate or |
modify any covered work. These actions infringe copyright if you do |
not accept this License. Therefore, by modifying or propagating a |
covered work, you indicate your acceptance of this License to do so. |
10. Automatic Licensing of Downstream Recipients. |
Each time you convey a covered work, the recipient automatically |
receives a license from the original licensors, to run, modify and |
propagate that work, subject to this License. You are not responsible |
for enforcing compliance by third parties with this License. |
An "entity transaction" is a transaction transferring control of an |
organization, or substantially all assets of one, or subdividing an |
organization, or merging organizations. If propagation of a covered |
work results from an entity transaction, each party to that |
transaction who receives a copy of the work also receives whatever |
licenses to the work the party's predecessor in interest had or could |
give under the previous paragraph, plus a right to possession of the |
Corresponding Source of the work from the predecessor in interest, if |
the predecessor has it or can get it with reasonable efforts. |
You may not impose any further restrictions on the exercise of the |
rights granted or affirmed under this License. For example, you may |
not impose a license fee, royalty, or other charge for exercise of |
rights granted under this License, and you may not initiate litigation |
(including a cross-claim or counterclaim in a lawsuit) alleging that |
any patent claim is infringed by making, using, selling, offering for |
sale, or importing the Program or any portion of it. |
11. Patents. |
A "contributor" is a copyright holder who authorizes use under this |
License of the Program or a work on which the Program is based. The |
work thus licensed is called the contributor's "contributor version". |
A contributor's "essential patent claims" are all patent claims |
owned or controlled by the contributor, whether already acquired or |
hereafter acquired, that would be infringed by some manner, permitted |
by this License, of making, using, or selling its contributor version, |
but do not include claims that would be infringed only as a |
consequence of further modification of the contributor version. For |
purposes of this definition, "control" includes the right to grant |
patent sublicenses in a manner consistent with the requirements of |
this License. |
Each contributor grants you a non-exclusive, worldwide, royalty-free |
patent license under the contributor's essential patent claims, to |
make, use, sell, offer for sale, import and otherwise run, modify and |
propagate the contents of its contributor version. |
In the following three paragraphs, a "patent license" is any express |
agreement or commitment, however denominated, not to enforce a patent |
(such as an express permission to practice a patent or covenant not to |
sue for patent infringement). To "grant" such a patent license to a |
party means to make such an agreement or commitment not to enforce a |
patent against the party. |
If you convey a covered work, knowingly relying on a patent license, |
and the Corresponding Source of the work is not available for anyone |
to copy, free of charge and under the terms of this License, through a |
publicly available network server or other readily accessible means, |
then you must either (1) cause the Corresponding Source to be so |
available, or (2) arrange to deprive yourself of the benefit of the |
patent license for this particular work, or (3) arrange, in a manner |
consistent with the requirements of this License, to extend the patent |
license to downstream recipients. "Knowingly relying" means you have |
actual knowledge that, but for the patent license, your conveying the |
covered work in a country, or your recipient's use of the covered work |
in a country, would infringe one or more identifiable patents in that |
country that you have reason to believe are valid. |
If, pursuant to or in connection with a single transaction or |
arrangement, you convey, or propagate by procuring conveyance of, a |
covered work, and grant a patent license to some of the parties |
receiving the covered work authorizing them to use, propagate, modify |
or convey a specific copy of the covered work, then the patent license |
you grant is automatically extended to all recipients of the covered |
work and works based on it. |
A patent license is "discriminatory" if it does not include within |
the scope of its coverage, prohibits the exercise of, or is |
conditioned on the non-exercise of one or more of the rights that are |
specifically granted under this License. You may not convey a covered |
work if you are a party to an arrangement with a third party that is |
in the business of distributing software, under which you make payment |
to the third party based on the extent of your activity of conveying |
the work, and under which the third party grants, to any of the |
parties who would receive the covered work from you, a discriminatory |
patent license (a) in connection with copies of the covered work |
conveyed by you (or copies made from those copies), or (b) primarily |
for and in connection with specific products or compilations that |
contain the covered work, unless you entered into that arrangement, |
or that patent license was granted, prior to 28 March 2007. |
Nothing in this License shall be construed as excluding or limiting |
any implied license or other defenses to infringement that may |
otherwise be available to you under applicable patent law. |
12. No Surrender of Others' Freedom. |
If conditions are imposed on you (whether by court order, agreement or |
otherwise) that contradict the conditions of this License, they do not |
excuse you from the conditions of this License. If you cannot convey a |
covered work so as to satisfy simultaneously your obligations under this |
License and any other pertinent obligations, then as a consequence you may |
not convey it at all. For example, if you agree to terms that obligate you |
to collect a royalty for further conveying from those to whom you convey |
the Program, the only way you could satisfy both those terms and this |
License would be to refrain entirely from conveying the Program. |
13. Use with the GNU Affero General Public License. |
Notwithstanding any other provision of this License, you have |
permission to link or combine any covered work with a work licensed |
under version 3 of the GNU Affero General Public License into a single |
combined work, and to convey the resulting work. The terms of this |
License will continue to apply to the part which is the covered work, |
but the special requirements of the GNU Affero General Public License, |
section 13, concerning interaction through a network will apply to the |
combination as such. |
14. Revised Versions of this License. |
The Free Software Foundation may publish revised and/or new versions of |
the GNU General Public License from time to time. Such new versions will |
be similar in spirit to the present version, but may differ in detail to |
address new problems or concerns. |
Each version is given a distinguishing version number. If the |
Program specifies that a certain numbered version of the GNU General |
Public License "or any later version" applies to it, you have the |
option of following the terms and conditions either of that numbered |
version or of any later version published by the Free Software |
Foundation. If the Program does not specify a version number of the |
GNU General Public License, you may choose any version ever published |
by the Free Software Foundation. |
If the Program specifies that a proxy can decide which future |
versions of the GNU General Public License can be used, that proxy's |
public statement of acceptance of a version permanently authorizes you |
to choose that version for the Program. |
Later license versions may give you additional or different |
permissions. However, no additional obligations are imposed on any |
author or copyright holder as a result of your choosing to follow a |
later version. |
15. Disclaimer of Warranty. |
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY |
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT |
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY |
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, |
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM |
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF |
ALL NECESSARY SERVICING, REPAIR OR CORRECTION. |
16. Limitation of Liability. |
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING |
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS |
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY |
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE |
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF |
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD |
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), |
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF |
SUCH DAMAGES. |
17. Interpretation of Sections 15 and 16. |
If the disclaimer of warranty and limitation of liability provided |
above cannot be given local legal effect according to their terms, |
reviewing courts shall apply local law that most closely approximates |
an absolute waiver of all civil liability in connection with the |
Program, unless a warranty or assumption of liability accompanies a |
copy of the Program in return for a fee. |
END OF TERMS AND CONDITIONS |
How to Apply These Terms to Your New Programs |
If you develop a new program, and you want it to be of the greatest |
possible use to the public, the best way to achieve this is to make it |
free software which everyone can redistribute and change under these terms. |
To do so, attach the following notices to the program. It is safest |
to attach them to the start of each source file to most effectively |
state the exclusion of warranty; and each file should have at least |
the "copyright" line and a pointer to where the full notice is found. |
<one line to give the program's name and a brief idea of what it does.> |
Copyright (C) <year> <name of author> |
This program is free software: you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation, either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program. If not, see <http://www.gnu.org/licenses/>. |
Also add information on how to contact you by electronic and paper mail. |
If the program does terminal interaction, make it output a short |
notice like this when it starts in an interactive mode: |
<program> Copyright (C) <year> <name of author> |
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. |
This is free software, and you are welcome to redistribute it |
under certain conditions; type `show c' for details. |
The hypothetical commands `show w' and `show c' should show the appropriate |
parts of the General Public License. Of course, your program's commands |
might be different; for a GUI interface, you would use an "about box". |
You should also get your employer (if you work as a programmer) or school, |
if any, to sign a "copyright disclaimer" for the program, if necessary. |
For more information on this, and how to apply and follow the GNU GPL, see |
<http://www.gnu.org/licenses/>. |
The GNU General Public License does not permit incorporating your program |
into proprietary programs. If your program is a subroutine library, you |
may consider it more useful to permit linking proprietary applications with |
the library. If this is what you want to do, use the GNU Lesser General |
Public License instead of this License. But first, please read |
<http://www.gnu.org/philosophy/why-not-lgpl.html>. |
/contrib/toolchain/binutils/include/ChangeLog |
---|
0,0 → 1,1969 |
2013-08-20 Alan Modra <amodra@gmail.com> |
* floatformat.h (floatformat_ibm_long_double): Delete. |
(floatformat_ibm_long_double_big): Declare. |
(floatformat_ibm_long_double_little): Declare. |
2013-08-19 Dehao Chen <dehao@google.com> |
* dwarf2.def (DW_AT_GNU_discriminator): New attribute. |
2013-08-02 Caroline Tice <cmtice@google.com> |
* vtv-change-permission.h: New file. |
2013-08-05 Eric Botcazou <ebotcazou@adacore.com> |
Konrad Eisele <konrad@gaisler.com> |
* opcode/sparc.h (sparc_opcode_arch_val): Add SPARC_OPCODE_ARCH_LEON. |
2013-06-08 Catherine Moore <clm@codesourcery.com> |
* opcode/mips.h (mips_opcode): Add ase field. |
(INSN_ASE_MASK): Delete. |
(INSN_DSP): Rename to ASE_DSP. Provide new value. |
(INSN_DSPR2): Rename to ASE_DSPR2. Provide new value. |
(INSN_MCU): Rename to ASE_MCU. Provide new value. |
(INSN_MDMX): Rename to ASE_MDMX. Provide new value. |
(INSN_MIPS3d): Rename to ASE_MIPS3D. Provide new value. |
(INSN_MT): Rename to ASE_MT. Provide new value. |
(INSN_SMARTMIPS): Rename to ASE_SMARTMIPS. Provide new value. |
(INSN_VIRT): Rename to ASE_VIRT. Provide new value. |
(INSN_VIRT64): Rename to ASE_VIRT64. Provide new value. |
(opcode_is_member): Add ase argument. Check ase. |
2013-05-06 Paul Brook <paul@codesourcery.com> |
include/elf/ |
* mips.h (R_MIPS_PC32): Update comment. |
2013-04-03 Jason Merrill <jason@redhat.com> |
Demangle C++11 ref-qualifier. |
* demangle.h (enum demangle_component_type): Add |
DEMANGLE_COMPONENT_REFERENCE_THIS, |
DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS. |
2013-03-12 Sebastian Huber <sebastian.huber@embedded-brains.de> |
* opcode/nios2.h: Edit comment. |
2013-03-11 Sebastian Huber <sebastian.huber@embedded-brains.de> |
* opcode/nios2.h (OPX_WRPRS): New define. |
(OP_MATCH_WRPRS): Likewise. |
2013-03-11 Sebastian Huber <sebastian.huber@embedded-brains.de> |
* opcode/nios2.h (OP_RDPRS): New define. |
(OP_MATCH_RDPRS): Likewise. |
2013-03-01 Cary Coutant <ccoutant@google.com> |
* dwarf2.h (enum dwarf_sect): New enum type. |
2013-02-19 Alan Modra <amodra@gmail.com> |
* bfdlink.h (struct bfd_link_info): Delete emit_note_gnu_build_id. |
2013-02-11 Sriraman Tallam <tmsriram@google.com> |
* plugin-api.h (enum ld_plugin_level): Assign integers |
explicitly for all values. |
2013-02-06 Sandra Loosemore <sandra@codesourcery.com> |
Andrew Jenner <andrew@codesourcery.com> |
Based on patches from Altera Corporation. |
* dis-asm.h (print_insn_big_nios2): Declare. |
(print_insn_little_nios2): Declare. |
2013-01-30 Kai Tietz <ktietz@redhat.com> |
PR other/54620 |
PR target/39064 |
* md5.h (md5_uintptr, md5_uint32): Define as uintptr_t/uint32_t if |
stdint.h and sys/types.h headers are present. |
* sha1.h (sha1_uintptr, sha1_uint32): Likewise. |
2013-01-10 Will Newton <will.newton@imgtec.com> |
* dis-asm.h (print_insn_metag): New declaration. |
2012-12-18 Aldy Hernandez <aldyh@redhat.com> |
PR other/54324 |
* ansidecl.h (ATTRIBUTE_UNUSED): Do not set __attribute__ for GCC |
< 3.4. |
2012-12-17 Nick Clifton <nickc@redhat.com> |
* MAINTAINERS: Add copyright notice. |
* alloca-conf.h: Likewise. |
* fopen-bin.h: Likewise. |
* fopen-same.h: Likewise. |
* fopen-vms.h: Likewise. |
* aout/hppa.h: Likewise. |
* opcode/tahoe.h: Likewise. |
2012-12-11 Edgar E. Iglesias <edgar.iglesias@gmail.com> |
* elf/microblaze.h: Add TLS relocs to START_RELOC_NUMBERS |
2012-11-09 Jason Merrill <jason@redhat.com> |
* demangle.h (enum demangle_component_type): Add |
DEMANGLE_COMPONENT_TAGGED_NAME. |
2012-10-29 Sterling Augustine <saugustine@google.com> |
Cary Coutant <ccoutant@google.com> |
* dwarf2.h (dwarf_location_list_entry_type): New enum with fields |
DW_LLE_GNU_end_of_list_entry, DW_LLE_GNU_base_address_selection_entry, |
DW_LLE_GNU_start_end_entry and DW_LLE_GNU_start_length_entry. |
2012-10-26 Shinichiro Hamaji <shinichiro.hamaji@gmail.com> |
* dwarf2.h (DW_AT_APPLE_optimized, DW_AT_APPLE_flags) |
(DW_AT_APPLE_isa, DW_AT_APPLE_block) |
(DW_AT_APPLE_major_runtime_vers, DW_AT_APPLE_runtime_class) |
(DW_AT_APPLE_omit_frame_ptr, DW_AT_APPLE_property_name) |
(DW_AT_APPLE_property_getter, DW_AT_APPLE_property_setter) |
(DW_AT_APPLE_property_attribute, DW_AT_APPLE_objc_complete_type) |
(DW_AT_APPLE_property, DW_OP_GNU_entry_value): New macros. |
2012-10-24 H.J. Lu <hongjiu.lu@intel.com> |
* bfdlink.h (bfd_link_info): Add |
disable_target_specific_optimizations. |
2012-10-23 Nathan Sidwell <nathan@codesourcery.com> |
* bfdlink.h (struct bfd_link_info): Add stacksize option. |
2012-10-22 Jan Beich <jbeich@tormail.org> |
PR ld/14426 |
* bfdlink.h (bfd_link_info): Add ignore_hash. |
2012-10-08 Jason Merrill <jason@redhat.com> |
* demangle.h (enum demangle_component_type): Add |
DEMANGLE_COMPONENT_TLS_INIT and DEMANGLE_COMPONENT_TLS_WRAPPER. |
2012-09-18 Florian Weimer <fweimer@redhat.com> |
PR other/54411 |
* objalloc.h (objalloc_alloc): Do not use fast path on wraparound. |
2012-09-27 Anthony Green <green@moxielogic.com> |
* opcode/moxie.h (MOXIE_BAD): New define. |
2012-09-12 Chris Schlumberger-Socha <chris.schlumberger-socha@arm.com> |
* elf/aarch64.h (R_AARCH64_GOT_LD_PREL19): New reloc. |
2012-09-06 Cary Coutant <ccoutant@google.com> |
* dwarf2.def: Edit comment. |
2012-08-24 Sriraman Tallam <tmsriram@google.com> |
* plugin-api.h (ld_plugin_allow_unique_segment_for_sections): |
New interface. |
(ld_plugin_unique_segment_for_sections): New interface. |
(LDPT_ALLOW_UNIQUE_SEGMENT_FOR_SECTIONS): New enum val. |
(LDPT_UNIQUE_SEGMENT_FOR_SECTIONS): New enum val. |
(tv_allow_unique_segment_for_sections): New member. |
(tv_unique_segment_for_sections): New member. |
2012-08-24 Matthew Gretton-Dann <matthew.gretton-dann@arm.com> |
* opcode/arm.h (ARM_CPU_IS_ANY): New define. |
2012-08-24 Matthew Gretton-Dann <matthew.gretton-dann@arm.com> |
* elf/arm.h (TAG_CPU_ARCH_V8): New define. |
(MAX_TAG_CPU_ARCH): Update. |
* opcode/arm.h (ARM_EXT_V8): New define. |
(FPU_VFP_EXT_ARMV8): Likewise. |
(FPU_NEON_EXT_ARMV8): Likewise. |
(FPU_CRYPTO_EXT_ARMV8): Likewise. |
(ARM_AEXT_V8A): Likewise. |
(FPU_VFP_ARMV8): Likwise. |
(FPU_NEON_ARMV8): Likewise. |
(FPU_CRYPTO_ARMV8): Likewise. |
(FPU_ARCH_VFP_ARMV8): Likewise. |
(FPU_ARCH_NEON_VFP_ARMV8): Likewise. |
(FPU_ARCH_CRYPTO_NEON_VFP_ARMV8): Likewise. |
(ARM_ARCH_V8A): Likwise. |
(ARM_ARCH_V8A_FP): Likewise. |
(ARM_ARCH_V8A_SIMD): Likewise. |
(ARM_ARCH_V8A_CRYPTO): Likewise. |
2012-08-13 Ian Bolton <ian.bolton@arm.com> |
Laurent Desnogues <laurent.desnogues@arm.com> |
Jim MacArthur <jim.macarthur@arm.com> |
Marcus Shawcroft <marcus.shawcroft@arm.com> |
Nigel Stephens <nigel.stephens@arm.com> |
Ramana Radhakrishnan <ramana.radhakrishnan@arm.com> |
Richard Earnshaw <rearnsha@arm.com> |
Sofiane Naci <sofiane.naci@arm.com> |
Tejas Belagod <tejas.belagod@arm.com> |
Yufeng Zhang <yufeng.zhang@arm.com> |
* dis-asm.h (print_insn_aarch64): New declaration. |
(print_aarch64_disassembler_options): New declaration. |
(aarch64_symbol_is_valid): New declaration. |
2012-08-02 Sean Keys <skeys@ipdatasys.com> |
* elf/m68hc11.h: #define E_M68HC11_NO_BANK_WARNING 0x000000200 |
2012-07-24 Stephan McCamant <smcc@cs.berkeley.edu> |
Dr David Alan Gilbert <dave@treblig.org> |
PR binutils/13135 |
* dis-asm.h (fprintf_ftype): Add ATTRIBUTE_FPTR_PRINTF_2. |
2012-07-13 Doug Evans <dje@google.com> |
* filenames.h: #include "hashtab.h". |
(filename_hash, filename_eq): Declare. |
2012-07-13 Andreas Krebbel <Andreas.Krebbel@de.ibm.com> |
* elf/s390.h (START_RELOC_NUMBERS): Define R_390_IRELATIVE reloc. |
2012-07-05 Sean Keys <skeys@ipdatasys.com> |
* opcode/xgate.h: Changed the format string for mode |
XGATE_OP_DYA_MON. |
2012-06-18 Doug Evans <dje@google.com> |
* dwarf2.def (DW_OP): Add DW_OP_GNU_const_index. |
2012-06-12 Rafael Ávila de Espíndola <respindola@mozilla.com> |
* plugin-api.h (ld_plugin_output_file_type): Add LDPO_PIE. |
2012-06-08 Jakub Jelinek <jakub@redhat.com> |
* dwarf2.def (DW_FORM_GNU_ref_alt, DW_FORM_GNU_strp_alt): New |
forms. |
* dwarf2.h (enum dwarf_macro_record_type): Add |
DW_MACRO_GNU_define_indirect_alt, DW_MACRO_GNU_undef_indirect_alt |
and DW_MACRO_GNU_transparent_include_alt. |
2012-05-23 Doug Evans <dje@google.com> |
* leb128.h: #include stdint.h, inttypes.h. |
(read_uleb128_to_uint64): Renamed from read_uleb128_to_ull. |
Change to take a uint64_t * argument instead of unsigned long long. |
(read_sleb128_to_uint64): Renamed from read_sleb128_to_ll. |
Change to take an int64_t * argument instead of long long. |
2012-05-22 Doug Evans <dje@google.com> |
* leb128.h: New file. |
2012-05-19 Gary Funck <gary@intrepid.com> |
* dwarf2.def: Update comment re: UPC extensions to reference |
DWARF4 specification. |
2012-05-15 James Murray <jsm@jsm-net.demon.co.uk> |
* dis-asm.h (print_insn_m9s12x): Prototype. |
(print_insn_m9s12xg): Prototype. |
2012-05-03 Sean Keys <skeys@ipdatasys.com> |
* dis-asm.h (print_insn_xgate): Define. |
(print_insn_xgate): Ditto. |
Added new files for XGATE port. |
2012-05-02 Cary Coutant <ccoutant@google.com> |
* dwarf2.def: Remove DW_FORM_GNU_ref_index, |
replace DW_AT_GNU_ref_base with DW_AT_GNU_ranges_base. |
2012-04-28 Doug Evans <dje@google.com> |
* dwarf2.def (DW_OP): Add DW_OP_GNU_addr_index. |
2012-04-27 Tom Tromey <tromey@redhat.com> |
* dwarf2.h: Wrap function declarations in extern "C". |
2012-04-27 Tom Tromey <tromey@redhat.com> |
* dwarf2.h (enum dwarf_tag, enum dwarf_form, enum dwarf_attribute) |
(enum dwarf_location_atom, enum dwarf_type, enum |
dwarf_call_frame_info): Remove. |
(DW_TAG, DW_TAG_DUP, DW_FORM, DW_AT, DW_AT_DUP, DW_OP) |
(DW_OP_DUP, DW_ATE, DW_ATE_DUP, DW_CFA): New macros. |
Include dwarf2.def. |
(get_DW_TAG_name, get_DW_AT_name, get_DW_FORM_name) |
(get_DW_OP_name, get_DW_ATE_name): Declare. |
* dwarf2.def: New file, from dwarf2.h. |
2012-04-12 David S. Miller <davem@davemloft.net> |
* elf/sparc.h (R_SPARC_WDISP10): New reloc. |
* opcode/sparc.h: Define '=' as generating R_SPARC_WDISP10. |
2012-04-10 Tristan Gingold <gingold@adacore.com> |
* splay-tree.h: Conditionnaly includes stdint.h and inttypes.h |
(libi_uhostptr_t, libi_shostptr_t): Remove, replaced by uintptr_t. |
2012-04-09 Roland McGrath <mcgrathr@google.com> |
* bfdlink.h (struct bfd_link_info): Add new member user_phdrs. |
2012-03-15 Alan Modra <amodra@gmail.com> |
* dis-asm.h (disassemble_init_powerpc): Declare. |
2009-11-06 Jonas Maebe <jonas.maebe@elis.ugent.be> |
Add DWARF attribute value for the "Borland fastcall" calling |
convention. |
* elf/dwarf2.h: Add DW_CC_GNU_borland_fastcall_i386 constant. |
2012-01-31 H.J. Lu <hongjiu.lu@intel.com> |
PR ld/13616 |
* bfdlink.h (bfd_link_order): Update comments on data size. |
2012-01-26 Cary Coutant <ccoutant@google.com> |
* dwarf2.h (enum dwarf_form): Add Fission extensions. |
(enum dwarf_attribute): Likewise. |
2012-01-06 Jason Merrill <jason@redhat.com> |
PR c++/6057 |
PR c++/48051 |
PR c++/50855 |
PR c++/51322 |
* demangle.h (enum demangle_component_type): Add |
DEMANGLE_COMPONENT_INITIALIZER_LIST, DEMANGLE_COMPONENT_NULLARY. |
2011-12-14 Iain Sandoe <iains@gcc.gnu.org> |
* mach-o/loader.h (bfd_mach_o_section_type): define |
BFD_MACH_O_S_ATTR_NONE to 0. |
2011-11-07 Richard Henderson <rth@redhat.com> |
Merged from transactional-memory. |
* demangle.h (enum gnu_v3_ctor_kinds): Add gnu_v3_object_ctor_group. |
(enum gnu_v3_dtor_kinds): Add gnu_v3_object_dtor_group. |
(DEMANGLE_COMPONENT_TRANSACTION_CLONE): New. |
(DEMANGLE_COMPONENT_NONTRANSACTION_CLONE): New. |
2011-11-01 DJ Delorie <dj@redhat.com> |
* dis-asm.h (print_insn_rl78): Declare. |
2011-10-25 Joern Rennecke <joern.rennecke@embecosm.com> |
* dis-asm.h (print_insn_epiphany): Declare. |
2011-10-21 Ulrich Drepper <drepper@gmail.com> |
* obstack.h [!GNUC] (obstack_free): Avoid cast to int. |
2011-10-21 Marc Glisse <marc.glisse@inria.fr> |
* ansidecl.h (ENUM_BITFIELD): Always use enum in C++ |
2011-10-19 Alan Modra <amodra@gmail.com> |
PR ld/13254 |
* bfdlink.h (struct bfd_link_info): Add error_textrel. |
2011-09-28 Doug Evans <dje@google.com> |
* timeval-utils.h: New file. |
* libiberty.h (countargv): Declare. |
2011-09-26 Cary Coutant <ccoutant@google.com> |
gcc PR lto/47247 |
* plugin-api.h (enum ld_plugin_symbol_resolution): Add |
LDPR_PREVAILING_DEF_IRONLY_EXP. |
(enum ld_plugin_tag): Add LDPT_GET_SYMBOLS_V2. |
2011-09-23 Cary Coutant <ccoutant@google.com> |
PR 40831 |
* demangle.h (enum demangle_component_type): Add |
DEMANGLE_COMPONENT_CLONE. |
2011-09-15 H.J. Lu <hongjiu.lu@intel.com> |
PR ld/12975 |
* bfdlink.h (bfd_link_info): Add version_info. |
2011-07-25 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> |
* xregex.h (regoff_t): Define. |
2011-07-22 Jakub Jelinek <jakub@redhat.com> |
* dwarf2.h (DW_AT_GNU_macros): New. |
(enum dwarf_macro_record_type): New enum. Add DW_MACRO_GNU_*. |
PR c++/49756 |
* libiberty.h (stack_limit_increase): New prototype. |
2011-07-13 Sriraman Tallam <tmsriram@google.com> |
* plugin-api.h |
(ld_plugin_section): New struct. |
(ld_plugin_get_section_count): New typedef. |
(ld_plugin_get_section_type): New typedef. |
(ld_plugin_get_section_name): New typedef. |
(ld_plugin_get_section_contents): New typedef. |
(ld_plugin_update_section_order): New typedef. |
(ld_plugin_allow_section_ordering): New typedef. |
(LDPT_GET_SECTION_COUNT): New enum value. |
(LDPT_GET_SECTION_TYPE): New enum value. |
(LDPT_GET_SECTION_NAME): New enum value. |
(LDPT_GET_SECTION_CONTENTS): New enum value. |
(LDPT_UPDATE_SECTION_ORDER): New enum value. |
(LDPT_ALLOW_SECTION_ORDERING): New enum value. |
(tv_get_section_count): New struct members. |
(tv_get_section_type): New struct members. |
(tv_get_section_name): New struct members. |
(tv_get_section_contents): New struct members. |
(tv_update_section_order): New struct members. |
(tv_allow_section_ordering): New struct members. |
2011-07-15 Alan Modra <amodra@gmail.com> |
* bfdlink.h (struct bfd_link_info): Use ENUM_BITFIELD for strip, |
discard, common_skip_ar_symbols, unresolved_syms_in_objects, and |
unresolved_syms_in_shared_libs fields. Move emit_note_gnu_build_id |
out of bitfields. Reorder bitfields. |
2011-07-13 Sriraman Tallam <tmsriram@google.com> |
* plugin-api.h (ld_plugin_section): New struct. |
(ld_plugin_get_section_count): New typedef. |
(ld_plugin_get_section_type): New typedef. |
(ld_plugin_get_section_name): New typedef. |
(ld_plugin_get_section_contents): New typedef. |
(ld_plugin_update_section_order): New typedef. |
(ld_plugin_allow_section_ordering): New typedef. |
(LDPT_GET_SECTION_COUNT): New enum value. |
(LDPT_GET_SECTION_TYPE): New enum value. |
(LDPT_GET_SECTION_NAME): New enum value. |
(LDPT_GET_SECTION_CONTENTS): New enum value. |
(LDPT_UPDATE_SECTION_ORDER): New enum value. |
(LDPT_ALLOW_SECTION_ORDERING): New enum value. |
(tv_get_section_count): New struct members. |
(tv_get_section_type): New struct members. |
(tv_get_section_name): New struct members. |
(tv_get_section_contents): New struct members. |
(tv_update_section_order): New struct members. |
(tv_allow_section_ordering): New struct members. |
2011-07-11 Catherine Moore <clm@codesourcery.com> |
* bfdlink.h (flag_type): New enumeration. |
(flag_info_list): New structure. |
(flag_info): New structure. |
2011-07-09 H.J. Lu <hongjiu.lu@intel.com> |
PR ld/12942 |
* bfdlink.h (bfd_link_info): Add loading_lto_outputs. |
2011-07-01 Joel Brobecker <brobecker@adacore.com> |
* filenames.h (HAVE_CASE_INSENSITIVE_FILE_SYSTEM): Define |
on Darwin, as well as on the systems that use a DOS-like |
filesystem. |
2011-06-22 Jakub Jelinek <jakub@redhat.com> |
PR debug/47858 |
* dwarf2.h (enum dwarf_location_atom): Add DW_OP_GNU_parameter_ref. |
2011-06-22 Jakub Jelinek <jakub@redhat.com> |
* dwarf2.h (enum dwarf_location_atom): Add DW_OP_GNU_parameter_ref. |
2011-06-20 Jakub Jelinek <jakub@redhat.com> |
PR ld/12570 |
* bfdlink.h (struct bfd_link_info): Add no_ld_generated_unwind_info |
option. |
2011-06-13 Jan Kratochvil <jan.kratochvil@redhat.com> |
* demangle.h (DMGL_RET_POSTFIX): Extend the comment. |
(DMGL_RET_DROP): New. |
2011-06-13 Walter Lee <walt@tilera.com> |
* dis-asm.h (print_insn_tilegx): Declare. |
(print_insn_tilepro): Likewise. |
2011-05-17 Alan Modra <amodra@gmail.com> |
PR ld/12760 |
* bfdlink.h (struct bfd_link_callbacks <notice>): Add "flags" and |
"string" param. |
2011-05-16 Alan Modra <amodra@gmail.com> |
* bfdlink.h (struct bfd_link_hash_entry): Remove u.undef.weak field. |
2011-04-30 Jakub Jelinek <jakub@redhat.com> |
* dwarf2.h (DW_OP_GNU_const_type, DW_OP_GNU_regval_type, |
DW_OP_GNU_deref_type, DW_OP_GNU_convert, DW_OP_GNU_reinterpret): New. |
2011-04-25 Jan Kratochvil <jan.kratochvil@redhat.com> |
* bfdlink.h (ENUM_BITFIELD): Remove. |
2011-04-25 Jan Kratochvil <jan.kratochvil@redhat.com> |
* ansidecl.h (ENUM_BITFIELD): New, from gcc/system.h. |
2011-04-24 Alan Modra <amodra@gmail.com> |
PR ld/12365 |
PR ld/12696 |
* bfdlink.h (ENUM_BITFIELD): Define. |
(struct bfd_link_hash_entry): Make "type" a bitfield. Add "non_ir_ref". |
(struct bfd_link_callbacks <notice>): Pass bfd_link_hash_entry pointer |
rather than "name". |
2011-04-20 Alan Modra <amodra@gmail.com> |
PR ld/12365 |
* bfdlink.h (struct bfd_link_callbacks): Modify multiple_definition |
and multiple_common parameters to pass in a bfd_link_hash_entry |
pointer rather than name,bfd etc. found in the hash entry. |
2011-03-31 Tristan Gingold <gingold@adacore.com> |
* dwarf2.h (dwarf_line_number_hp_sfc_ops): New enum. |
2011-03-24 Mark Wielaard <mjw@redhat.com> |
* dwarf2.h (dwarf_form): Remove deprecated DW_FORM_sig8 define. |
2010-03-23 Rafael Ávila de Espíndola <respindola@mozilla.com> |
* plugin-api.h (ld_plugin_get_view): New. |
(ld_plugin_tag): Add LDPT_GET_VIEW. |
(ld_plugin_tv): Add tv_get_view. |
2011-03-16 Jakub Jelinek <jakub@redhat.com> |
* dwarf2.h (DW_TAG_GNU_call_site, DW_TAG_GNU_call_site_parameter, |
DW_AT_GNU_call_site_value, DW_AT_GNU_call_site_data_value, |
DW_AT_GNU_call_site_target, DW_AT_GNU_call_site_target_clobbered, |
DW_AT_GNU_tail_call, DW_AT_GNU_all_tail_call_sites, |
DW_AT_GNU_all_call_sites,, DW_AT_GNU_all_source_call_sites, |
DW_OP_GNU_entry_value): New. |
2011-02-28 Kai Tietz <kai.tietz@onevision.com> |
* filenames.h (filename_ncmp): New prototype. |
2011-02-23 Kai Tietz <kai.tietz@onevision.com> |
* dwarf2.h (_ELF_DWARF2_H): Renamed to |
_DWARF2_H. |
(DWARF2_External_LineInfo, DWARF2_Internal_LineInfo, |
DWARF2_External_PubNames, DWARF2_Internal_PubNames, |
DWARF2_External_CompUnit, DWARF2_Internal_CompUnit, |
DWARF2_External_ARange, DWARF2_Internal_ARange): Removed. |
2011-02-08 Ulrich Weigand <uweigand@de.ibm.com> |
* dwarf2.h (enum dwarf_calling_convention): Add DW_CC_GDB_IBM_OpenCL. |
2011-01-12 Iain Sandoe <iains@gcc.gnu.org> |
* dwarf2.h: Update value for DW_AT_hi_user. |
2010-11-16 Ian Lance Taylor <iant@google.com> |
* simple-object.h (simple_object_attributes_merge): Declare, |
replacing simple_object_attributes_compare. |
2010-11-04 Ian Lance Taylor <iant@google.com> |
* dwarf2.h (enum dwarf_source_language): Add DW_LANG_Go. |
2010-11-02 Ian Lance Taylor <iant@google.com> |
* simple-object.h: New file. |
2010-10-15 Dave Korn <dave.korn.cygwin@gmail.com> |
Sync LD plugin patch series (part 1/6) with src/include/. |
* plugin-api.h (LDPT_GNU_LD_VERSION): New ld_plugin_tag enum member. |
2010-10-14 Dave Korn <dave.korn.cygwin@gmail.com> |
Apply LD plugin patch series (part 6/6). |
* bfdlink.h (struct_bfd_link_callbacks): Document new argument |
to add_archive_element callback used to return a replacement bfd which |
is to be added to the hash table in place of the original element. |
2010-10-14 Dave Korn <dave.korn.cygwin@gmail.com> |
Apply LD plugin patch series (part 1/6). |
* plugin-api.h (LDPT_GNU_LD_VERSION): New ld_plugin_tag enum member. |
2010-10-06 Andi Kleen <ak@linux.intel.com> |
* libiberty.h (setproctitle): Add prototype. |
2010-09-29 Bernd Schmidt <bernds@codesourcery.com> |
* opcode/tic6x-control-registers.h (tscl): Now read_write. |
2010-09-27 Andreas Krebbel <Andreas.Krebbel@de.ibm.com> |
* opcode/s390.h: Add S390_OPCODE_Z196 to enum s390_opcode_cpu_val. |
2010-09-23 Matthew Gretton-Dann <matthew.gretton-dann@arm.com> |
* arm.h (ARM_EXT_V6Z): Remove. |
(ARM_EXT_SEC): New define. |
(ARM_AEXT_V6Z): Use Security Extensions. |
(ARM_AEXT_V6ZK): Likeiwse. |
(ARM_AEXT_V6ZT2): Likewise. |
(ARM_AEXT_V6ZKT2): Likewise. |
(ARM_AEXT_V7_ARM): Base v7 does not have Security Extensions. |
(ARM_ARCH_V7A_SEC): New define. |
(ARM_ARCH_V7A_MP): Rename... |
(ARM_ARCH_V7A_MP_SEC): ...to this and add Security Extensions. |
2010-09-09 Jakub Jelinek <jakub@redhat.com> |
* dwarf2.h (DW_OP_GNU_implicit_pointer): New. |
2010-07-06 Ken Werner <ken.werner@de.ibm.com> |
* floatformat.h (floatformat_ieee_half_big): Add declaration. |
(floatformat_ieee_half_little): Likewise. |
2010-06-29 Alan Modra <amodra@gmail.com> |
* dis-asm.h: Remove references to maxq. |
2010-06-21 Rafael Espindola <espindola@google.com> |
* plugin-api.h (ld_plugin_set_extra_library_path): New. |
(ld_plugin_tag): Add LDPT_SET_EXTRA_LIBRARY_PATH. |
(ld_plugin_tv): Add tv_set_extra_library_path. |
2010-06-21 Jakub Jelinek <jakub@redhat.com> |
* dwarf2.h (enum dwarf_type): Add DW_ATE_UTF. |
2010-06-18 Rafael Espindola <espindola@google.com> |
* plugin.h (ld_plugin_add_input_file, ld_plugin_add_input_library): |
Make argument const. |
2010-06-08 Laurynas Biveinis <laurynas.biveinis@gmail.com> |
* splay-tree.h: Update copyright years. |
(splay_tree_s): Document fields. |
(splay_tree_new_typed_alloc): New. |
* hashtab.h: Update copyright years. |
(htab_create_typed_alloc): New. |
2010-06-10 Tristan Gingold <gingold@adacore.com> |
* dwarf2.h (enum dwarf_tag): Add DW_TAG_HP_Bliss_field and |
DW_TAG_HP_Bliss_field_set. |
(enum dwarf_attribute): Add DW_AT_HP_prologue, DW_AT_HP_epilogue, |
DW_AT_HP_unit_name, DW_AT_HP_unit_size, DW_AT_HP_widened_byte_size, |
DW_AT_HP_definition_points, DW_AT_HP_default_location and |
DW_AT_HP_is_result_param. |
(enum dwarf_type): Add DW_ATE_HP_VAX_float, DW_ATE_HP_VAX_float_d, |
DW_ATE_HP_packed_decimal, DW_ATE_HP_zoned_decimal, DW_ATE_HP_edited, |
DW_ATE_HP_signed_fixed, DW_ATE_HP_unsigned_fixed, |
DW_ATE_HP_VAX_complex_float and DW_ATE_HP_VAX_complex_float_d. |
(enum dwarf_line_number_x_ops): Add |
DW_LNE_HP_source_file_correlation. |
(enum dwarf_source_language): Add DW_LANG_HP_Bliss, |
DW_LANG_HP_Basic91, DW_LANG_HP_Pascal91, DW_LANG_HP_IMacro, |
DW_LANG_HP_Assembler. |
2010-06-01 Rafael Espindola <espindola@google.com> |
* plugin-api.h (ld_plugin_tag): Add LDPT_OUTPUT_NAME. |
2010-04-26 Pedro Alves <pedro@codesourcery.com> |
* filenames.h (PATH_SEPARATOR): Delete. |
2010-04-23 Pedro Alves <pedro@codesourcery.com> |
* filenames.h (IS_DIR_SEPARATOR_1): Rename from IS_DIR_SEPARATOR, |
always define it independently of host, add `dos_based' parameter, |
and handle it. |
(PATH_SEPARATOR): Define. |
(HAS_DRIVE_SPEC_1): Rename from HAS_DRIVE_SPEC, always define it |
independently of host, add `dos_based' parameter, and handle it. |
(IS_ABSOLUTE_PATH_1): Rename from IS_ABSOLUTE_PATH, always define |
it independently of host, add `dos_based' parameter, and handle |
it. |
(IS_DOS_DIR_SEPARATOR, IS_DOS_ABSOLUTE_PATH) |
(IS_UNIX_DIR_SEPARATOR, IS_UNIX_ABSOLUTE_PATH) |
(HAS_DOS_DRIVE_SPEC): New. |
(HAS_DRIVE_SPEC): Reimplement on top of HAS_DRIVE_SPEC_1. |
(IS_DIR_SEPARATOR): Reimplement on top of IS_DIR_SEPARATOR_1. |
(IS_ABSOLUTE_PATH): Reimplement on top of IS_ABSOLUTE_PATH_1. |
* libiberty.h (dos_lbasename, unix_lbasename): Declare. |
2009-05-31 Ian Lance Taylor <iant@google.com> |
* ansidecl.h: Add extern "C" when compiling with C++. Treat C++ |
the way we treat an ISO C compiler. Don't define inline as a |
macro when compiling with C++. |
* dyn-string.h: Add header guard DYN_STRING_H. Add extern "C" |
when compiling with C++. |
* fibheap.h: Add extern "C" when compiling with C++. |
2010-04-23 Pedro Alves <pedro@codesourcery.com> |
* filenames.h (IS_DIR_SEPARATOR_1): Rename from IS_DIR_SEPARATOR, |
always define it independently of host, add `dos_based' parameter, |
and handle it. |
(HAS_DRIVE_SPEC_1): Rename from HAS_DRIVE_SPEC, always define it |
independently of host, add `dos_based' parameter, and handle it. |
(IS_ABSOLUTE_PATH_1): Rename from IS_ABSOLUTE_PATH, always define |
it independently of host, add `dos_based' parameter, and handle |
it. |
(IS_DOS_DIR_SEPARATOR, IS_DOS_ABSOLUTE_PATH) |
(IS_UNIX_DIR_SEPARATOR, IS_UNIX_ABSOLUTE_PATH) |
(HAS_DOS_DRIVE_SPEC): New. |
(HAS_DRIVE_SPEC): Reimplement on top of HAS_DRIVE_SPEC_1. |
(IS_DIR_SEPARATOR): Reimplement on top of IS_DIR_SEPARATOR_1. |
(IS_ABSOLUTE_PATH): Reimplement on top of IS_ABSOLUTE_PATH_1. |
* libiberty.h (dos_lbasename, unix_lbasename): Declare. |
2010-04-20 Nick Clifton <nickc@redhat.com> |
* sha1.h: Update copyright notice to use GPLv3. |
2010-04-15 Nick Clifton <nickc@redhat.com> |
* bout.h: Update copyright notice to use GPLv3. |
* hp-symtab.h: Likewise. |
* oasys.h: Likewise. |
* progress.h: Likewise. |
* sha1.h: Likewise. |
* xtensa-isa-internal.h: Likewise. |
* xtensa-isa.h: Likewise. |
2010-04-14 Doug Evans <dje@google.com> |
* filenames.h (HAS_DRIVE_SPEC, STRIP_DRIVE_SPEC): New macros. |
2010-04-05 Jakub Jelinek <jakub@redhat.com> |
* dwarf2.h (DWARF2_Internal_LineInfo): Add li_max_ops_per_insn |
field. |
2010-03-25 Joseph Myers <joseph@codesourcery.com> |
* dis-asm.h (print_insn_tic6x): Declare. |
2010-03-23 Joseph Myers <joseph@codesourcery.com> |
* symcat.h (CONCAT5, CONCAT6, XCONCAT5, XCONCAT6): Define. |
2010-01-13 Joel Brobecker <brobecker@adacore.com> |
Add new DW_AT_use_GNAT_descriptive_type CU attribute. |
* dwarf2.h (dwarf_attribute): Add DW_AT_use_GNAT_descriptive_type. |
2010-01-11 Tristan Gingold <gingold@adacore.com> |
* demangle.h (ada_demangle): Add prototype. |
2010-01-05 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> |
PR bootstrap/41771 |
* ansidecl.h: Fix inline test for C99 and Sun Studio cc. |
2009-12-29 Joel Brobecker <brobecker@adacore.com> |
* dwarf2.h (enum dwarf_attribute): Add DW_AT_GNAT_descriptive_type. |
2009-12-14 Doug Kwan <dougkwan@google.com> |
* bfdlink.h (struct bfd_link_callbacks): Rename function parameters |
to avoid shadowed variable warnings. |
* dis-asm.h (struct disassemble_info): Ditto. |
(disassemble_init_for_target): Ditto. |
(init_disassemble_info): Ditto. |
2009-11-18 Alan Modra <amodra@bigpond.net.au> |
* alloca-conf.h: Clarify comment. |
2009-11-06 Jonas Maebe <jonas.maebe@elis.ugent.be> |
Add DWARF attribute value for the "Borland fastcall" calling |
convention. |
* dwarf2.h: Add DW_CC_GNU_borland_fastcall_i386 constant. |
2009-10-23 Kai Tietz <kai.tietz@onevision.com> |
* splay-tree.h (libi_uhostptr_t): Add gcc specific |
__extension__ for long long type case to silent cX9. |
(libi_shostptr_t): Likewise. |
2009-10-19 Rafael Avila de Espindola <espindola@google.com> |
PR40790 |
* plugin-api.h: Don't include stdint.h unconditionally. |
2009-10-15 Jakub Jelinek <jakub@redhat.com> |
* include/dwarf2.h (DW_LANG_Python): Add comment that it is |
a DWARF 4 addition. |
2009-10-14 Alan Modra <amodra@bigpond.net.au> |
* bfdlink.h (enum bfd_link_common_skip_ar_symbols): Rename from |
bfd_link_common_skip_ar_aymbols. |
(struct bfd_link_info): Here too. |
2009-10-09 Rafael Espindola <espindola@google.com> |
* plugin-api.h (ld_plugin_add_input_library): Change argument name to |
libname. |
2008-10-03 Rafael Espindola <espindola@google.com> |
* plugin-api.h: New. |
* lto-symtab.h: New. |
2009-10-05 Rafael Espindola <espindola@google.com> |
* plugin-api.h (ld_plugin_status): Add LDPS_BAD_HANDLE. |
(ld_plugin_get_input_file): New. |
(ld_plugin_release_input_file): New. |
(ld_plugin_add_input_library): New. |
(ld_plugin_message): Mark format const. |
(ld_plugin_level): Add LDPT_GET_INPUT_FILE, LDPT_RELEASE_INPUT_FILE and |
LDPT_ADD_INPUT_LIBRARY. |
(ld_plugin_tv): Add tv_get_input_file, tv_release_input_file and |
tv_add_input_library. |
2009-10-04 Jerry Quinn <jlquinn@optonline.net> |
* plugin-api.h: Fix compile. |
2009-09-29 Jason Merrill <jason@redhat.com> |
* demangle.h (enum demangle_component_type): Add |
DEMANGLE_COMPONENT_LAMBDA, DEMANGLE_COMPONENT_DEFAULT_ARG, |
DEMANGLE_COMPONENT_UNNAMED_TYPE. |
(struct demangle_component): Add s_unary_num. |
2009-09-29 DJ Delorie <dj@redhat.com> |
* dis-asm.h: Add prototype for print_insn_rx. |
2009-09-25 Dodji Seketeli <dodji@redhat.com> |
* dwarf2.h (enum dwarf_tag): Rename DW_TAG_template_parameter_pack and |
DW_TAG_formal_parameter_pack into DW_TAG_GNU_template_parameter_pack |
and DW_TAG_formal_parameter_pack until DWARF 5 is out. |
2009-09-25 Cary Coutant <ccoutant@google.com> |
Add rest of new values from DWARF Version 4. |
* dwarf2.h (DW_TAG_rvalue_reference_type, DW_TAG_template_alias): |
New tags. |
(DW_FORM_ref_sig8): New name for DW_FORM_sig8. |
(DW_AT_main_subprogram, DW_AT_data_bit_offset, DW_AT_const_expr, |
DW_AT_enum_class, DW_AT_linkage_name, DW_AT_GNU_guarded_by, |
DW_AT_GNU_pt_guarded_by, DW_AT_GNU_guarded, DW_AT_GNU_pt_guarded, |
DW_AT_GNU_locks_excluded, DW_AT_GNU_exclusive_locks_required, |
DW_AT_GNU_shared_locks_required, DW_AT_GNU_odr_signature): New |
attributes. |
(DW_LANG_Python): New language. |
2009-09-24 Cary Coutant <ccoutant@google.com> |
* dwarf2.h (DW_TAG_rvalue_reference_type, DW_TAG_template_alias): |
New tags. |
(DW_FORM_ref_sig8): New name for DW_FORM_sig8. |
(DW_AT_main_subprogram, DW_AT_data_bit_offset, DW_AT_const_expr, |
DW_AT_enum_class, DW_AT_linkage_name, DW_AT_GNU_guarded_by, |
DW_AT_GNU_pt_guarded_by, DW_AT_GNU_guarded, DW_AT_GNU_pt_guarded, |
DW_AT_GNU_locks_excluded, DW_AT_GNU_exclusive_locks_required, |
DW_AT_GNU_shared_locks_required, DW_AT_GNU_odr_signature): New |
attributes. |
(DW_LANG_Python): New language. |
2009-09-22 Dodji Seketeli <dodji@redhat.com> |
* dwarf2.h (enum dwarf_tag): Add |
DW_TAG_template_parameter_pack and DW_TAG_formal_parameter_pack. |
2009-09-09 Martin Thuresson <martin@mtme.org> |
* bfdlink.h (struct bfd_link_hash_common_entry): Move to top |
level. |
2009-09-04 Jie Zhang <jie.zhang@analog.com> |
* opcode/bfin.h (PseudoDbg_Assert): Add bits_grp and mask_grp. |
(PseudoDbg_Assert_grp_bits, PseudoDbg_Assert_grp_mask): Define. |
(PseudoDbg_Assert_dbgop_bits, PseudoDbg_Assert_dbgop_mask, |
PseudoDbg_Assert_dontcare_bits, PseudoDbg_Assert_dontcare_mask): |
Adjust accordingly. |
(init_PseudoDbg_Assert): Add PseudoDbg_Assert_grp_bits and |
PseudoDbg_Assert_grp_mask. |
2009-08-06 Michael Eager <eager@eagercon.com> |
* dis-asm.h: Decl print_insn_microblaze(). |
2009-07-24 Ian Lance Taylor <iant@google.com> |
* libiberty.h (crc32): Declare. |
2009-07-20 Cary Coutant <ccoutant@google.com> |
Doug Evans <dje@google.com> |
Add some dwarf4 values. |
* dwarf2.h (enum dwarf_tag): Add DW_TAG_type_unit. |
(enum dwarf_form): Add DW_FORM_sec_offset, DW_FORM_exprloc, |
DW_FORM_flag_present, DW_FORM_sig8. |
(enum dwarf_attribute): Add DW_AT_signature. |
2009-07-17 Jan Kratochvil <jan.kratochvil@redhat.com> |
* demangle.h |
(enum demangle_component_type <DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS>) |
(enum demangle_component_type <DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS>): |
New. |
2009-07-10 Tom Tromey <tromey@redhat.com> |
* dwarf2.h: New file, moved from elf/. |
2009-07-09 Jakub Jelinek <jakub@redhat.com> |
* dwarf2.h (enum dwarf_location_atom): Add DW_OP_implicit_value |
and DW_OP_stack_value. |
2009-07-09 Tom Tromey <tromey@redhat.com> |
* elf/dwarf2.h: Remove, renaming to... |
* dwarf2.h: ... this. |
2009-06-29 Tom Tromey <tromey@redhat.com> |
* elf/dwarf2.h: New file. Merged with gdb. |
2009-06-18 Nick Clifton <nickc@redhat.com> |
* dis-asm.h (USER_SPECIFIED_MACHINE_TYPE): New value for the flags |
field of struct disassemble_info. |
2009-06-09 Ian Lance Taylor <ian@airs.com> |
* ansidecl.h (ATTRIBUTE_UNUSED_LABEL): Define for C++. |
2009-06-15 Nick Clifton <nickc@redhat.com> |
* dis-asm.h (DISASSEMBLE_DATA): New value for the flags field of |
struct disassemble_info. |
2009-06-02 Ian Lance Taylor <iant@google.com> |
* ansidecl.h (EXPORTED_CONST): Define. |
2009-05-31 Ian Lance Taylor <iant@google.com> |
* ansidecl.h: Add extern "C" when compiling with C++. Treat C++ |
the way we treat an ISO C compiler. Don't define inline as a |
macdro when compiling with C++. |
* dyn-string.h: Add header guard DYN_STRING_H. Add extern "C" |
when compiling with C++. |
* fibheap.h: Add extern "C" when compiling with C++. |
2009-05-25 Tristan Gingold <gingold@adacore.com> |
* fopen-vms.h (FOPEN_RB, FOPEN_WB, FOPEN_AB, FOPEN_RUB, FOPEN_WUB, |
FOPEN_AUB): Use "rfm=udf,rat=none" attribute. |
2009-04-22 Taras Glek <tglek@mozilla.com> |
* hashtab.h: Update GTY annotations to new syntax. |
* splay-tree.h: Likewise. |
2009-04-08 H.J. Lu <hongjiu.lu@intel.com> |
* bfdlink.h (bfd_link_info): Add warn_alternate_em. |
2009-03-18 Alan Modra <amodra@bigpond.net.au> |
* alloca-conf.h: Revise based on autoconf-2.61, autoconf-2.13 |
documentation. |
2009-03-17 Jason Merrill <jason@redhat.com> |
* demangle.h (enum demangle_component_type): Add |
DEMANGLE_COMPONENT_FUNCTION_PARAM. |
2008-12-01 Cary Coutant <ccoutant@google.com> |
* plugin-api.h (LDPS_BAD_HANDLE): New constant. |
(ld_plugin_get_input_file): New typedef. |
(ld_plugin_release_input_file): New typedef. |
(LDPT_GET_INPUT_FILE, LDPT_RELEASE_INPUT_FILE): New constants. |
(struct ld_plugin_tv): Add two new fields. |
2008-12-23 Jon Beniston <jon@beniston.com> |
* dis-asm.h: Add LM32 disassembler function prototype. |
2008-12-10 Jason Merrill <jason@redhat.com> |
* demangle.h (enum demangle_component_type): Add |
DEMANGLE_COMPONENT_FIXED_TYPE. |
2008-12-01 Cary Coutant <ccoutant@google.com> |
* plugin-api.h (ld_plugin_message): Change format parameter to const. |
2008-12-01 Cary Coutant <ccoutant@google.com> |
* plugin-api.h: Fix syntax error when compiling with C++. |
2008-11-26 Alan Modra <amodra@bigpond.net.au> |
PR 7047 |
* bfdlink.h (struct bfd_elf_version_expr): Delete "symbol". |
Add "literal". |
2008-11-21 Sterling Augustine <sterling@tensilica.com> |
* xtensa-isa-internal.h (XTENSA_STATE_IS_SHARED_OR): New flag. |
* xtensa-isa.h (xtensa_state_is_shared_or): New prototype. |
2008-11-19 Bob Wilson <bob.wilson@acm.org> |
* xtensa-config.h (XCHAL_HAVE_MUL16, XCHAL_HAVE_MUL32, XCHAL_HAVE_DIV32) |
(XCHAL_HAVE_MINMAX, XCHAL_HAVE_SEXT, XCHAL_HAVE_THREADPTR) |
(XCHAL_HAVE_RELEASE_SYNC, XCHAL_HAVE_S32C1I): Change to 1. |
(XCHAL_NUM_AREGS): Change to 32. |
(XCHAL_ICACHE_SIZE, XCHAL_DCACHE_SIZE): Change to 16K. |
(XCHAL_ICACHE_LINESIZE, XCHAL_DCACHE_LINESIZE): Change to 32. |
(XCHAL_ICACHE_LINEWIDTH, XCHAL_DCACHE_LINEWIDTH): Change to 5. |
(XCHAL_DCACHE_IS_WRITEBACK): Change to 1. |
(XCHAL_DEBUGLEVEL): Change to 6. |
2008-11-14 Tristan Gingold <gingold@adacore.com> |
* fopen-vms.h (FOPEN_RB): Use a single string to match the |
standard prototype. |
(FOPEN_WB): Ditto. |
(FOPEN_AB): Ditto. |
(FOPEN_RUB): Ditto. |
(FOPEN_WUB): Ditto. |
(FOPEN_AUB): Ditto. |
2008-10-21 Alan Modra <amodra@bigpond.net.au> |
* obstack.h (obstack_finish <!__GNUC__>): Cast result to void *. |
2008-10-06 Jason Merrill <jason@redhat.com> |
* demangle.h (enum demangle_component_type): Add |
DEMANGLE_COMPONENT_PACK_EXPANSION. |
2008-09-24 Richard Henderson <rth@redhat.com> |
* elf/dwarf2.h (DW_OP_GNU_encoded_addr): New. |
2008-09-22 Rafael Espindola <espindola@google.com> |
* plugin-api.h (ld_plugin_status): Remove comma from the last item. |
Use C style comment. |
(ld_plugin_api_version, ld_plugin_output_file_type, |
ld_plugin_symbol_kind, ld_plugin_symbol_visibility, |
ld_plugin_symbol_resolution, ld_plugin_level, ld_plugin_tag): Remove |
comma from the last item. |
2008-09-18 Cary Coutant <ccoutant@google.com> |
Add plugin functionality for link-time optimization (LTO). |
* plugin-api.h: New file. |
2008-09-09 Jason Merrill <jason@redhat.com> |
* demangle.h (enum demangle_component_type): Add |
DEMANGLE_COMPONENT_DECLTYPE. |
2008-08-25 Alan Modra <amodra@bigpond.net.au> |
* binary-io.h: New file, imported from gnulib, but don't |
#include <fcntl.h> or <stdio.h>. |
2008-08-17 Alan Modra <amodra@bigpond.net.au> |
* bfdlink.h (bfd_generic_link_read_symbols): Declare. |
2008-08-08 Anatoly Sokolov <aesok@post.ru> |
* elf/avr.h (E_AVR_MACH_AVR25, E_AVR_MACH_AVR31, |
E_AVR_MACH_AVR35, E_AVR_MACH_AVR51): Define. |
(EF_AVR_MACH): Redefine to 0x7F. |
* opcode/avr.h (AVR_ISA_TINY3, AVR_ISA_ALL, AVR_ISA_USB162): Remove. |
(AVR_ISA_AVR3): Redefine. |
(AVR_ISA_AVR1, AVR_ISA_AVR2, AVR_ISA_AVR31, AVR_ISA_AVR35, |
AVR_ISA_AVR3_ALL, AVR_ISA_AVR4, AVR_ISA_AVR5, AVR_ISA_AVR51, |
AVR_ISA_AVR6): Define. |
2008-07-12 Jie Zhang <jie.zhang@analog.com> |
Revert |
2008-07-12 Jie Zhang <jie.zhang@analog.com> |
* bfdlink.h (struct bfd_link_info): Add sep_code member |
variable. |
* elf/bfin.h (EF_BFIN_CODE_IN_L1): Define. |
(EF_BFIN_DATA_IN_L1): Define. |
2008-07-12 Jie Zhang <jie.zhang@analog.com> |
* bfdlink.h (struct bfd_link_info): Add sep_code member |
variable. |
* elf/bfin.h (EF_BFIN_CODE_IN_L1): Define. |
(EF_BFIN_DATA_IN_L1): Define. |
2008-07-07 Stan Shebs <stan@codesourcery.com> |
* dis-asm.h (struct disassemble_info): Add endian_code field. |
2008-07-07 Joel Brobecker <brobecker@adacore.com> |
* safe-ctype.h: Add #include of ctype.h before redefining |
the ctype.h macros. |
2008-07-04 Joel Brobecker <brobecker@adacore.com> |
* safe-ctype.h: Remove #error when detecting that ctype.h has been |
included. Redefine the various macros provided by ctype.h as |
undefined variables. |
2008-06-23 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* libiberty.h (XALLOCA, XDUP, XALLOCAVEC, XDUPVEC, XALLOCAVAR, |
XDUPVAR, XOBNEWVEC, XOBNEWVAR): New. |
2008-06-06 Alan Modra <amodra@bigpond.net.au> |
* bfdlink.h (struct bfd_link_info): Add "path_separator". |
2008-04-10 Andreas Krebbel <krebbel1@de.ibm.com> |
* dis-asm.h (print_s390_disassembler_options): |
Prototype added. |
2008-03-24 Ian Lance Taylor <iant@google.com> |
* sha1.h: New file, from gnulib. |
* md5.h: Add extern "C" when compiled with C++. |
2008-03-24 Ian Lance Taylor <iant@google.com> |
* md5.h: Add extern "C" when compiled with C++. |
2008-03-21 Ian Lance Taylor <iant@google.com> |
* filenames.h: Add extern "C" when compiled with C++. |
2008-02-15 Alan Modra <amodra@bigpond.net.au> |
* bfdlink.h (struct bfd_link_hash_table): Delete creator field. |
(struct bfd_link_info): Add output_bfd. |
2008-02-11 Bob Wilson <bob.wilson@acm.org> |
* xtensa-config.h (XCHAL_HAVE_THREADPTR): Redefine to zero. |
(XCHAL_NUM_AREGS, XCHAL_MAX_INSTRUCTION_SIZE): New. |
2008-01-26 David Daney <ddaney@avtrex.com> |
* demangle.h (demangle_component_type): Add |
DEMANGLE_COMPONENT_JAVA_RESOURCE, |
DEMANGLE_COMPONENT_COMPOUND_NAME, and |
DEMANGLE_COMPONENT_CHARACTER as new enum values. |
(demangle_component): Add struct s_character to union u. |
2007-11-07 Joseph Myers <joseph@codesourcery.com> |
Daniel Jacobowitz <dan@codesourcery.com> |
* floatformat.h (struct floatformat): Add split_half field. |
(floatformat_ibm_long_double): New. |
2007-09-06 Tom Tromey <tromey@redhat.com> |
* libiberty.h (pex_free): Document process killing. |
2007-08-31 Douglas Gregor <doug.gregor@gmail.com> |
* demangle.h (enum demangle_component_type): Add |
DEMANGLE_COMPONENT_RVALUE_REFERENCE. |
2007-07-25 Ben Elliston <bje@au.ibm.com> |
* ternary.h: Remove. |
2007-07-18 Bob Wilson <bob.wilson@acm.org> |
* xtensa-config.h (XCHAL_HAVE_THREADPTR): New. |
(XCHAL_HAVE_RELEASE_SYNC, XCHAL_HAVE_S32C1I): New. |
2007-07-17 Nick Clifton <nickc@redhat.com> |
* COPYING3: New file. Contains version 3 of the GNU General |
Public License. |
2007-07-12 Kai Tietz <kai.tietz@onevision.com> |
* splay-tree.h (libi_uhostptr_t, libi_shostptr_t): Adjust types |
work-a-round whitespace problem in gcc gengtype. |
* splay-tree.h (libi_uhostptr_t, libi_shostptr_t): New types, |
needed for WIN64 when a long is not wide enough for a pointer. |
(splay_tree_key, splay_tree_value): Use the new types. |
2007-07-09 Roland McGrath <roland@redhat.com> |
* bfdlink.h (struct bfd_link_info): Add member emit_note_gnu_build_id. |
2007-07-06 Nick Clifton <nickc@redhat.com> |
* bfdlink.h: Update copyright notice to refer to GPLv3. |
2007-06-29 M R Swami Reddy <MR.Swami.Reddy@nsc.com> |
* dis-asm.h (print_insn_cr16): New prototype. |
2007-06-01 Noah Misch <noah@cs.caltech.edu> |
Alan Modra <amodra@bigpond.net.au> |
* bfdlink.h (struct bfd_link_info): Add input_bfds_tail. |
2007-05-07 Nathan Froyd <froydnj@codesourcery.com> |
* libiberty.h (writeargv): Declare. |
2007-04-30 Alan Modra <amodra@bigpond.net.au> |
* bfdlink.h (struct bfd_link_info): Add "info" and "minfo". |
2007-04-25 Mark Mitchell <mark@codesourcery.com> |
* demangle.h: Change license to LGPL + exception. |
2007-04-10 Richard Henderson <rth@redhat.com> |
* bfdlink.h (struct bfd_link_info): Add relax_trip. |
2007-03-29 Joel Brobecker <brobecker@adacore.com> |
* filenames.h (FILENAME_CMP): Adjust define to call filename_cmp |
regardless of the type of file system. |
2007-03-06 Jan Hubicka <jh@suse.cz> |
* ansidecl.h (ATTRIBUTE_COLD, ATTRIBUTE_HOT): New. |
2007-02-21 Nick Clifton <nickc@redhat.com> |
* bfdlink.h (struct bfd_link_callbacks): Add |
override_segment_assignment field. |
2007-02-17 Mark Mitchell <mark@codesourcery.com> |
Nathan Sidwell <nathan@codesourcery.com> |
Vladimir Prus <vladimir@codesourcery.com |
Joseph Myers <joseph@codesourcery.com> |
* bin-bugs.h: Remove. |
2007-02-09 Joseph S. Myers <joseph@codesourcery.com> |
* libiberty.h (pex_write_input): Remove prototype. |
2007-02-05 Dave Brolley <brolley@redhat.com> |
* Contribute the following changes: |
2001-03-26 Ben Elliston <bje@redhat.com> |
* dis-asm.h (print_insn_mep): Declare. |
2007-02-02 H.J. Lu <hongjiu.lu@intel.com> |
* dis-asm.h (print_i386_disassembler_options): New. |
2007-01-31 Vladimir Prus <vladimir@codesourcery.com> |
* libiberty.h (PEX_STDERR_TO_PIPE): New define. |
(PEX_BINARY_ERROR): New define. |
(pex_read_err): New function. |
2007-01-29 Simon Baldwin <simonb@google.com> |
* demangle.h: New cplus_demangle_print_callback, |
cplus_demangle_v3_callback, and java_demangle_v3_callback function |
prototypes, and demangle_callbackref type definition. |
2007-01-16 H.J. Lu <hongjiu.lu@intel.com> |
PR ld/3831 |
* bfdlink.h (bfd_link_info): Rename dynamic to dynamic_list. |
Add dynamic and dynamic_data. |
2006-12-05 Michael Tautschnig <tautschn@model.in.tum.de> |
Nick Clifton <nickc@redhat.com> |
* ansidecl.h (ATTRIBUTE_PACKED): Define. |
2006-11-30 Andrew Stubbs <andrew.stubbs@st.com> |
J"orn Rennecke <joern.rennecke@st.com> |
PR driver/29931 |
* libiberty.h (make_relative_prefix_ignore_links): Declare. |
2006-11-27 Bob Wilson <bob.wilson@acm.org> |
* xtensa-config.h (XSHAL_ABI): New. |
(XTHAL_ABI_WINDOWED, XTHAL_ABI_CALL0): New. |
2006-11-27 Bob Wilson <bob.wilson@acm.org> |
* xtensa-isa.h (STATIC_LIBISA): Delete. |
2006-10-30 Paul Brook <paul@codesourcery.com> |
* dis-asm.h (disassemble_info): Add symtab, symtab_pos and |
symtab_size. |
2006-10-30 H.J. Lu <hongjiu.lu@intel.com> |
PR ld/3111 |
* bfdlink.h (bfd_link_info): Add reduce_memory_overheads. |
2006-10-25 Trevor Smigiel <Trevor_Smigiel@playstation.sony.com> |
Yukishige Shibata <shibata@rd.scei.sony.co.jp> |
Nobuhisa Fujinami <fnami@rd.scei.sony.co.jp> |
Takeaki Fukuoka <fukuoka@rd.scei.sony.co.jp> |
Alan Modra <amodra@bigpond.net.au> |
* dis-asm.h (print_insn_spu): Declare. |
2006-09-17 Mei Ligang <ligang@sunnorth.com.cn> |
* dis-asm.h: Add prototypes for Score disassembler routines. |
2006-09-07 H.J. Lu <hongjiu.lu@intel.com> |
* bfdlink.h (bfd_elf_dynamic_list): New. |
(bfd_link_info): Add a dynamic field. |
2006-08-04 Marcelo Tosatti <marcelo@kvack.org> |
* bfdlink.h (struct bfd_link_info): New field: print_gc_sections. |
2006-07-10 Jakub Jelinek <jakub@redhat.com> |
* bfdlink.h (struct bfd_link_info): Add emit_hash and |
emit_gnu_hash bitfields. |
2006-04-11 Jim Blandy <jimb@codesourcery.com> |
* libiberty.h (pex_input_file, pex_input_pipe): New declarations. |
2006-04-06 H.J. Lu <hongjiu.lu@intel.com> |
* bfdlink.h (bfd_link_info): Replace need_relax_finalize with |
relax_pass. |
2006-02-17 Shrirang Khisti <shrirangk@kpitcummins.com> |
Anil Paranjape <anilp1@kpitcummins.com> |
Shilin Shakti <shilins@kpitcummins.com> |
* dis-asm.h (print_insn_xc16c): New prototype. |
2006-01-18 DJ Delorie <dj@redhat.com> |
* md5.h: Include ansidecl.h |
2006-01-17 Andreas Schwab <schwab@suse.de> |
PR binutils/1486 |
* dis-asm.h (struct disassemble_info): Add |
disassembler_needs_relocs. |
2006-01-09 Bob Wilson <bob.wilson@acm.org> |
* xtensa-config.h (XCHAL_HAVE_MUL32_HIGH): Define. |
2005-12-30 Bob Wilson <bob.wilson@acm.org> |
* xtensa-config.h (XCHAL_HAVE_WIDE_BRANCHES): New. |
2005-12-16 Nathan Sidwell <nathan@codesourcery.com> |
Second part of ms1 to mt renaming. |
* dis-asm.h (print_insn_mt): Renamed. |
2005-12-10 Terry Laurenzo <tlaurenzo@gmail.com> |
PR java/9861 |
* demangle.h : Add DMGL_RET_POSTFIX define to enable alternative |
output format for return types |
2005-11-03 Alan Modra <amodra@bigpond.net.au> |
* bfdlink.h (struct bfd_link_order): Tweak comment. |
2005-10-31 Mark Kettenis <kettenis@gnu.org> |
* floatformat.h (enum floatformat_byteorders): Add |
floatformat_vax. |
(floatformat_vax_aingle, floatformat_vax_double): Declare. |
2005-10-28 Dave Brolley <brolley@redhat.com> |
Contribute the following changes: |
2003-09-29 Dave Brolley <brolley@redhat.com> |
* dis-asm.h (disassemble_info): insn_sets now (void *) to allow for |
more exotic underlying types to be used. |
2005-10-25 Arnold Metselaar <arnold.metselaar@planet.nl> |
disasm.h: Add declaration for print_insn_z80 |
2005-09-30 Catherine Moore <clm@cm00re.com> |
* dis-asm.h (print_insn_bfin): Declare. |
2005-09-26 Mark Mitchell <mark@codesourcery.com> |
* libiberty.h (expandargv): New function. |
2005-08-18 Alan Modra <amodra@bigpond.net.au> |
* bfdlink.h: Remove mention of a29k. |
* dis-asm.h: Remove a29k support. |
2005-08-17 Mark Kettenis <kettenis@gnu.org> |
* floatformat.h (struct floatformat): Change type of large |
argument for is_valid member to `const void *'. |
(floatformat_to_double): Change type of second argument to `const |
void *'. |
(floatformat_from_double): Change type of last argument to `void |
*'. |
(floatformat_is_valid): Change type of last argument to `const |
void *'. |
2005-07-14 Jim Blandy <jimb@redhat.com> |
* dis-asm.h (print_insn_m32c): New declaration. |
2005-07-12 Ben Elliston <bje@au.ibm.com> |
* xregex2.h (regexec): Qualify this prototype with __extension__ |
when compiling with GNU C. |
2005-07-07 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* dis-asm.h (fprintf_ftype): Add format attribute. |
2005-07-03 Steve Ellcey <sje@cup.hp.com> |
PR other/13906 |
* ansidecl.h (ATTRIBUTE_ALIGNED_ALIGNOF): New. |
* md5.h (md5_uintptr): New. |
(md5_ctx): Align buffer field. |
2005-06-30 Daniel Berlin <dberlin@dberlin.org> |
* hashtab.h (HTAB_DELETED_ENTRY): New macro. |
(HTAB_EMPTY_ENTRY): New macro. |
2005-06-20 Geoffrey Keating <geoffk@apple.com> |
* libiberty.h (strverscmp): Prototype. |
2005-06-17 Jakub Jelinek <jakub@redhat.com> |
* elf/external.h (GRP_ENTRY_SIZE): Define. |
2005-06-08 Zack Weinberg <zack@codesourcery.com> |
* dis-asm.h (get_arm_regnames): Update prototype. |
2005-06-07 Aldy Hernandez <aldyh@redhat.com> |
Michael Snyder <msnyder@redhat.com> |
Stan Cox <scox@redhat.com> |
* dis-asm.h: Externalize print_insn_ms1. |
2005-06-06 Gabriel Dos Reis <gdr@integrable-solutions.net> |
* libiberty.h (XOBFINISH): New. |
2005-06-03 Alan Modra <amodra@bigpond.net.au> |
* bfdlink.h (struct bfd_link_callbacks): Add einfo. |
2005-06-01 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* libiberty.h (vsnprintf): Add format attribute. |
2005-05-29 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* ansidecl.h: Add ATTRIBUTE_FPTR_PRINTF. |
2005-05-28 Eli Zaretskii <eliz@gnu.org> |
* libiberty.h: (snprintf) [!HAVE_DECL_SNPRINTF]: Declare if |
needed. |
(vsnprintf) [!HAVE_DECL_VSNPRINTF]: Declare if needed. |
2005-05-25 Richard Henderson <rth@redhat.com> |
* demangle.h (DEMANGLE_COMPONENT_HIDDEN_ALIAS): New. |
2005-05-24 Gabriel Dos Reis <gdr@integrable-solutions.net> |
* libiberty.h (ACONCAT): Properly cast value of alloca(). |
* ansidecl.h (ATTRIBUTE_UNUSED_LABEL): Don't define if |
__cplusplus. |
2005-05-12 Steve Ellcey <sje@cup.hp.com> |
libiberty.h: Do not define empty basename prototype. |
2005-05-10 Nick Clifton <nickc@redhat.com> |
* Update the address and phone number of the FSF organization in |
the GPL notices in the following files: |
COPYING, ansidecl.h, bfdlink.h, bout.h, demangle.h, dis-asm.h, |
dyn-string.h, fibheap.h, filenames.h, floatformat.h, |
fnmatch.h, gdbm.h, getopt.h, hashtab.h, hp-symtab.h, ieee.h, |
libiberty.h, md5.h, oasys.h, objalloc.h, obstack.h, os9k.h, |
partition.h, progress.h, safe-ctype.h, sort.h, splay-tree.h, |
symcat.h, ternary.h, xregex2.h, xtensa-config.h, |
xtensa-isa-internal.h, xtensa-isa.h |
2005-04-25 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* libiberty.h (unlock_std_streams): New. |
2005-04-19 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* hashtab.h, libiberty.h, objalloc.h, splay-tree.h, ternary.h: |
Don't use the PTR macro. |
* sort.h: Don't use the PARAMS macro. |
2005-04-16 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* libiberty.h (unlock_stream): New. |
2005-04-13 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* libiberty.h (fopen_unlocked, fdopen_unlocked, freopen_unlocked): |
Remove parameter names. |
2005-04-11 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* libiberty.h (fopen_unlocked, fdopen_unlocked, freopen_unlocked): |
Provide prototypes for new functions. |
2005-03-29 Ian Lance Taylor <ian@airs.com> |
* libiberty.h: Fix indentation. |
2005-03-28 Ian Lance Taylor <ian@airs.com> |
* libiberty.h: Include <stdio.h>. |
(PEX_RECORD_TIMES, PEX_USE_PIPES, PEX_SAVE_TEMPS): Define. |
(PEX_LAST, PEX_SEARCH, PEX_SUFFIX, PEX_STDERR_TO_STDOUT): Define. |
(PEX_BINARY_INPUT, PEX_BINARY_OUTPUT): Define. |
(pex_init, pex_run, pex_read_output): Declare. |
(pex_get_status, pex_get_times, pex_free, pex_one): Declare. |
(struct pex_time): Define. |
2005-03-28 Mark Mitchell <mark@codesourcery.com> |
* libiberty.h (ffs): Declare, if necessary. |
2005-03-27 Gabriel Dos Reis <gdr@integreable-solutions.net> |
* ternary.h: Don't use PARAMS anymore. |
2005-03-27 Gabriel Dos Reis <gdr@integrable-solutions.net> |
* md5.h: Remove definition and uses of __P. |
* dyn-string.h: Remove uses of PARAMS. |
* fibheap.h: Likewise. |
* floatformat.h: Likewise. |
* hashtab.h: Likewise. |
2005-03-26 Gabriel Dos Reis <gdr@integrable-solutions.net> |
* demangle.h: Remove uses of PARAMS. |
* libiberty.h (ANSI_PROTOTYPES): Remove guard since |
ANSI_PROTOTYPES is always assumed. |
Remove uses of PARAMS throughout. |
2005-03-24 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* libiberty.h (xstrndup): Declare. |
2005-03-22 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* libiberty.h (make_relative_prefix): Add ATTRIBUTE_MALLOC. |
2005-03-22 Bob Wilson <bob.wilson@acm.org> |
* xtensa-isa.h: Update a comment and whitespace. |
2005-03-16 H.J. Lu <hongjiu.lu@intel.com> |
* bfdlink.h (bfd_link_info): Add gc_sections. |
2005-03-09 Mark Mitchell <mark@codesourcery.com> |
* libiberty.h (gettimeofday): Declare. |
2005-03-01 Jan Beulich <jbeulich@novell.com> |
* libiberty.h: Declare unlink_if_ordinary. |
2005-02-21 Alan Modra <amodra@bigpond.net.au> |
* xtensa-isa-internal.h (xtensa_length_decode_fn): Warning fix. |
* xtensa-isa.h (xtensa_insnbuf_to_chars): Likewise. |
(xtensa_insnbuf_from_chars, xtensa_isa_length_from_chars): Likewise. |
2005-02-14 Paolo Bonzini <bonzini@gnu.org> |
PR bootstrap/19818 |
* ansidecl.h (PARAMS): Guard from redefinition. |
2005-02-03 Alan Modra <amodra@bigpond.net.au> |
* bfdlink.h (struct bfd_link_hash_entry): Add u.undef.weak. |
2005-02-01 Alan Modra <amodra@bigpond.net.au> |
* bfdlink.h (bfd_link_repair_undef_list): Declare. |
2005-01-10 Andreas Schwab <schwab@suse.de> |
* dis-asm.h (struct disassemble_info): Add skip_zeroes and |
skip_zeroes_at_end. |
2004-12-11 Ben Elliston <bje@au.ibm.com> |
* fibheap.h (struct fibnode): Only use unsigned long bitfields |
when __GNUC__ is defined and ints are less than 32-bits wide. |
2004-11-04 Paul Brook <paul@codesourcery.com> |
* bfdlink.h (bfd_link_info): Add default_imported_symver. |
2004-11-12 Bob Wilson <bob.wilson@acm.org> |
* xtensa-isa-internal.h (xtensa_interface_internal): Add class_id. |
* xtensa-isa.h (xtensa_interface_class_id): New prototype. |
2004-11-08 Inderpreet Singh <inderpreetb@nioda.hcltech.com> |
Vineet Sharma <vineets@noida.hcltech.com> |
* dis-asm.h: Add prototype for print_insn_maxq_little. |
2004-10-26 Paul Brook <paul@codesourcery.com> |
* bfdlink.h (struct bfd_link_info): Add create_default_symver. |
2004-10-21 H.J. Lu <hongjiu.lu@intel.com> |
PR 463 |
* bfdlink.h (bfd_link_callbacks): Add a pointer to struct |
bfd_link_hash_entry to reloc_overflow. |
2004-10-07 Bob Wilson <bob.wilson@acm.org> |
* xtensa-config.h (XSHAL_USE_ABSOLUTE_LITERALS, |
XCHAL_HAVE_PREDICTED_BRANCHES, XCHAL_INST_FETCH_WIDTH): New. |
(XCHAL_EXTRA_SA_SIZE, XCHAL_EXTRA_SA_ALIGN): Delete. |
* xtensa-isa-internal.h (ISA_INTERFACE_VERSION): Delete. |
(config_sturct struct): Delete. |
(XTENSA_OPERAND_IS_REGISTER, XTENSA_OPERAND_IS_PCRELATIVE, |
XTENSA_OPERAND_IS_INVISIBLE, XTENSA_OPERAND_IS_UNKNOWN, |
XTENSA_OPCODE_IS_BRANCH, XTENSA_OPCODE_IS_JUMP, |
XTENSA_OPCODE_IS_LOOP, XTENSA_OPCODE_IS_CALL, |
XTENSA_STATE_IS_EXPORTED, XTENSA_INTERFACE_HAS_SIDE_EFFECT): Define. |
(xtensa_format_encode_fn, xtensa_get_slot_fn, xtensa_set_slot_fn): New. |
(xtensa_insn_decode_fn): Rename to ... |
(xtensa_opcode_decode_fn): ... this. |
(xtensa_immed_decode_fn, xtensa_immed_encode_fn, xtensa_do_reloc_fn, |
xtensa_undo_reloc_fn): Update. |
(xtensa_encoding_template_fn): Delete. |
(xtensa_opcode_encode_fn, xtensa_format_decode_fn, |
xtensa_length_decode_fn): New. |
(xtensa_format_internal, xtensa_slot_internal): New types. |
(xtensa_operand_internal): Delete operand_kind, inout, isPCRelative, |
get_field, and set_field fields. Add name, field_id, regfile, |
num_regs, and flags fields. |
(xtensa_arg_internal): New type. |
(xtensa_iclass_internal): Change operands field to array of |
xtensa_arg_internal. Add num_stateOperands, stateOperands, |
num_interfaceOperands, and interfaceOperands fields. |
(xtensa_opcode_internal): Delete length, template, and iclass fields. |
Add iclass_id, flags, encode_fns, num_funcUnit_uses, and funcUnit_uses. |
(opname_lookup_entry): Delete. |
(xtensa_regfile_internal, xtensa_interface_internal, |
xtensa_funcUnit_internal, xtensa_state_internal, |
xtensa_sysreg_internal, xtensa_lookup_entry): New. |
(xtensa_isa_internal): Replace opcode_table field with opcodes field. |
Change type of opname_lookup_table. Delete num_modules, |
module_opcode_base, module_decode_fn, config, and has_density fields. |
Add num_formats, formats, format_decode_fn, length_decode_fn, |
num_slots, slots, num_fields, num_operands, operands, num_iclasses, |
iclasses, num_regfiles, regfiles, num_states, states, |
state_lookup_table, num_sysregs, sysregs, sysreg_lookup_table, |
max_sysreg_num, sysreg_table, num_interfaces, interfaces, |
interface_lookup_table, num_funcUnits, funcUnits and |
funcUnit_lookup_table fields. |
(xtensa_isa_module, xtensa_isa_modules): Delete. |
(xtensa_isa_name_compare): New prototype. |
(xtisa_errno, xtisa_error_msg): New. |
* xtensa-isa.h (XTENSA_ISA_VERSION): Define. |
(xtensa_isa): Change type. |
(xtensa_operand): Delete. |
(xtensa_format, xtensa_regfile, xtensa_state, xtensa_sysreg, |
xtensa_interface, xtensa_funcUnit, xtensa_isa_status, |
xtensa_funcUnit_use): New types. |
(libisa_module_specifier): Delete. |
(xtensa_isa_errno, xtensa_isa_error_msg): New prototypes. |
(xtensa_insnbuf_free, xtensa_insnbuf_to_chars, |
xtensa_insnbuf_from_chars): Update prototypes. |
(xtensa_load_isa, xtensa_extend_isa, xtensa_default_isa, |
xtensa_insn_maxlength, xtensa_num_opcodes, xtensa_decode_insn, |
xtensa_encode_insn, xtensa_insn_length, |
xtensa_insn_length_from_first_byte, xtensa_num_operands, |
xtensa_operand_kind, xtensa_encode_result, |
xtensa_operand_isPCRelative): Delete. |
(xtensa_isa_init, xtensa_operand_inout, xtensa_operand_get_field, |
xtensa_operand_set_field, xtensa_operand_encode, |
xtensa_operand_decode, xtensa_operand_do_reloc, |
xtensa_operand_undo_reloc): Update prototypes. |
(xtensa_isa_maxlength, xtensa_isa_length_from_chars, |
xtensa_isa_num_pipe_stages, xtensa_isa_num_formats, |
xtensa_isa_num_opcodes, xtensa_isa_num_regfiles, xtensa_isa_num_states, |
xtensa_isa_num_sysregs, xtensa_isa_num_interfaces, |
xtensa_isa_num_funcUnits, xtensa_format_name, xtensa_format_lookup, |
xtensa_format_decode, xtensa_format_encode, xtensa_format_length, |
xtensa_format_num_slots, xtensa_format_slot_nop_opcode, |
xtensa_format_get_slot, xtensa_format_set_slot, xtensa_opcode_decode, |
xtensa_opcode_encode, xtensa_opcode_is_branch, xtensa_opcode_is_jump, |
xtensa_opcode_is_loop, xtensa_opcode_is_call, |
xtensa_opcode_num_operands, xtensa_opcode_num_stateOperands, |
xtensa_opcode_num_interfaceOperands, xtensa_opcode_num_funcUnit_uses, |
xtensa_opcode_funcUnit_use, xtensa_operand_name, |
xtensa_operand_is_visible, xtensa_operand_is_register, |
xtensa_operand_regfile, xtensa_operand_num_regs, |
xtensa_operand_is_known_reg, xtensa_operand_is_PCrelative, |
xtensa_stateOperand_state, xtensa_stateOperand_inout, |
xtensa_interfaceOperand_interface, xtensa_regfile_lookup, |
xtensa_regfile_lookup_shortname, xtensa_regfile_name, |
xtensa_regfile_shortname, xtensa_regfile_view_parent, |
xtensa_regfile_num_bits, xtensa_regfile_num_entries, |
xtensa_state_lookup, xtensa_state_name, xtensa_state_num_bits, |
xtensa_state_is_exported, xtensa_sysreg_lookup, |
xtensa_sysreg_lookup_name, xtensa_sysreg_name, xtensa_sysreg_number, |
xtensa_sysreg_is_user, xtensa_interface_lookup, xtensa_interface_name, |
xtensa_interface_num_bits, xtensa_interface_inout, |
xtensa_interface_has_side_effect, xtensa_funcUnit_lookup, |
xtensa_funcUnit_name, xtensa_funcUnit_num_copies): New prototypes. |
2004-10-07 Jeff Baker <jbaker@qnx.com> |
* bfdlink.h (bfd_link_info): Add bitfield: warn_shared_textrel. |
2004-09-17 Alan Modra <amodra@bigpond.net.au> |
* bfdlink.h (struct bfd_link_hash_entry): Move und_next into elements |
of union. |
2004-09-13 Aaron W. LaFramboise <aaronavay62@aaronwl.com> |
* libiberty.h (basename): Prototype for __MINGW32__. |
2004-09-04 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* ansidecl.h (ATTRIBUTE_SENTINEL): Define. |
* libiberty.h (concat, reconcat, concat_length, concat_copy, |
concat_copy2): Use ATTRIBUTE_SENTINEL. |
2004-08-13 Alan Modra <amodra@bigpond.net.au> |
* bfdlink.h (struct bfd_link_callbacks): Remove "error_handler". |
(LD_DEFINITION_IN_DISCARDED_SECTION): Delete. |
2004-08-02 Gabriel Dos Reis <gdr@integrable-solutions.net> |
* libiberty.h (XDELETE, XDELETEVEC, XRESIZEVEC): Remove any |
const-qualification before disposal. |
2004-07-24 Bernardo Innocenti <bernie@develer.com> |
* ansidecl.h (ARG_UNUSED): New Macro. |
2004-07-23 H.J. Lu <hongjiu.lu@intel.com> |
* bin-bugs.h (REPORT_BUGS_TO): Set to |
"<URL:http://www.sourceware.org/bugzilla/>". |
2004-07-21 Paolo Bonzini <bonzini@gnu.org> |
* ansidecl.h (ATTRIBUTE_PURE): New. |
2004-07-13 Bernardo Innocenti <bernie@develer.com> |
* libiberty.h (XNEW, XCNEW, XNEWVEC, XCNEWVEC, XOBNEW): Move here from |
libcpp/internal.h. |
(XDELETE, XRESIZEVEC, XDELETEVEC, XNEWVAR, XCNEWVAR, XRESIZEVAR): New |
macros. |
2004-07-13 Bernardo Innocenti <bernie@develer.com> |
* libiberty.h (ASTRDUP): Add casts required for stricter |
type conversion rules of C++. |
* obstack.h (obstack_free): Likewise. |
2004-07-07 Tomer Levi <Tomer.Levi@nsc.com> |
* dis-asm.h (print_insn_crx): Declare. |
2004-06-24 Alan Modra <amodra@bigpond.net.au> |
* bfdlink.h (struct bfd_link_order): Update comment. |
2004-05-11 Jakub Jelinek <jakub@redhat.com> |
* bfdlink.h (struct bfd_link_info): Add relro, relro_start and |
relro_end fields. |
2004-05-04 Andreas Jaeger <aj@suse.de> |
* demangle.h: Do not use C++ reserved keyword typename as |
parameter for cplus_demangle_fill_builtin_type. |
2004-04-22 Richard Henderson <rth@redhat.com> |
* hashtab.h (struct htab): Add size_prime_index. |
2004-04-13 Jeff Law <law@redhat.com> |
* hashtab.h (htab_remove_elt_with_hash): Prototype new function. |
2004-03-30 Zack Weinberg <zack@codesourcery.com> |
* hashtab.h, splay-tree.h: Use new shorter form of GTY markers. |
2004-03-25 Stan Shebs <shebs@apple.com> |
* mpw/: Remove subdirectory and everything in it. |
2004-03-23 Alan Modra <amodra@bigpond.net.au> |
PR 51. |
* bfdlink.h (struct bfd_link_info): Add wrap_char. |
2004-03-20 H.J. Lu <hongjiu.lu@intel.com> |
* bfdlink.h (bfd_link_info): Correct comments for the |
unresolved_syms_in_objects field. |
2004-02-24 Ian Lance Taylor <ian@wasabisystems.com> |
* dyn-string.h: Update copyright date. |
2004-02-23 Ian Lance Taylor <ian@wasabisystems.com> |
* dyn-string.h: Remove test of IN_LIBGCC2 and IN_GLIBCPP_V3 and |
the associated #defines. |
2004-01-12 Ian Lance Taylor <ian@wasabisystems.com> |
* demangle.h: Instead of checking ANSI_PROTOTYPES, just include |
"libiberty.h". |
* demangle.h: If ANSI_PROTOTYPES is defined, include <stddef.h>. |
* demangle.h (enum demangle_component_type): Define. |
(struct demangle_operator_info): Declare. |
(struct demangle_builtin_type_info): Declare. |
(struct demangle_component): Define. |
(cplus_demangle_fill_component): Declare. |
(cplus_demangle_fill_name): Declare. |
(cplus_demangle_fill_builtin_type): Declare. |
(cplus_demangle_fill_operator): Declare. |
(cplus_demangle_fill_extended_operator): Declare. |
(cplus_demangle_fill_ctor, cplus_demangle_fill_dtor): Declare. |
(cplus_demangle_v3_components): Declare. |
(cplus_demangle_print): Declare. |
For older changes see ChangeLog-9103 |
Copyright (C) 2004-2012 Free Software Foundation, Inc. |
Copying and distribution of this file, with or without modification, |
are permitted in any medium without royalty provided the copyright |
notice and this notice are preserved. |
Local Variables: |
mode: change-log |
left-margin: 8 |
fill-column: 74 |
version-control: never |
End: |
/contrib/toolchain/binutils/include/ChangeLog-9103 |
---|
0,0 → 1,2688 |
2003-12-19 Andreas Tobler <a.tobler@schweiz.ch> |
* include/fibheap.h (fibnode): Use __extension__ for |
bit-fields mark and degree if __GNUC__. |
2003-12-18 Kazu Hirata <kazu@cs.umass.edu> |
* include/fibheap.h (fibnode): Use unsigned long int for |
bit-fields if __GNUC__ is defined. |
2003-12-19 Andreas Tobler <a.tobler@schweiz.ch> |
* fibheap.h (fibnode): Use __extension__ for |
bit-fields mark and degree if __GNUC__. |
2003-12-18 Kazu Hirata <kazu@cs.umass.edu> |
* fibheap.h (fibnode): Use unsigned long int for |
bit-fields if __GNUC__ is defined. |
2003-12-04 H.J. Lu <hongjiu.lu@intel.com> |
* bfdlink.h (bfd_link_info): Change relax_finalizing to |
need_relax_finalize. |
2003-12-03 Alan Modra <amodra@bigpond.net.au> |
* bfdlink.h (struct bfd_link_hash_entry): Rename "next" to "und_next". |
2003-12-02 Alan Modra <amodra@bigpond.net.au> |
* bfdlink.h (struct bfd_link_info): Remove mpc860c0 field. |
2003-11-14 Nick Clifton <nickc@redhat.com> |
* dis-asm.h (struct disassemble_info): Add new field |
'symbol_is_valid' which is a function which can tell the |
disassembler to skip certain symbols as they should not be |
displayed to the user. |
(arm_symbol_is_valid): New prototype. This is the ARM |
specific function for the symbol_is_valid field. |
(generic_symbol_is_valid): New prototype. This is the default |
function pointed to by the symbol_is_valid field. |
2003-11-06 Bruno Rohee <bruno@rohee.com> |
* hp-symtab.h: Fix "the the" typo. |
2003-10-24 H.J. Lu <hongjiu.lu@intel.com> |
* bfdlink.h (bfd_elf_version_expr): Add "symbol" and remove |
"wildcard". |
2003-10-22 Joseph S. Myers <jsm@polyomino.org.uk> |
* obstack.h: Merge the following change from gnulib: |
2003-10-21 Paul Eggert <eggert@twinsun.com> |
* obstack.h (obstack_1grow_fast): Properly parenthesize arg. |
(obstack_ptr_grow_fast, obstack_int_grow_fast): |
Don't use lvalue casts, as GCC plans to remove support for them |
in GCC 3.5. Reported by Joseph S. Myers. This bug |
was also present in the non-GCC version, indicating that this |
code had always been buggy and had never been widely used. |
(obstack_1grow, obstack_ptr_grow, obstack_int_grow, obstack_blank): |
Use the fast variant of each macro, rather than copying the |
definiens of the fast variant; that way, we'll be more likely to |
catch future bugs in the fast variants. |
2003-10-22 Jakub Jelinek <jakub@redhat.com> |
* bfdlink.h (struct bfd_elf_version_expr): Remove match field. |
Add wildcard and mask fields. |
(BFD_ELF_VERSION_C_TYPE): Define. |
(BFD_ELF_VERSION_CXX_TYPE): Likewise. |
(BFD_ELF_VERSION_JAVA_TYPE): Likewise. |
(struct bfd_elf_version_expr_head): New. |
(struct bfd_elf_version_tree): Add match field. |
Change type of globals and locals fields |
to struct bfd_elf_version_expr_head. |
2003-09-22 Andrew Cagney <cagney@redhat.com> |
* floatformat.h (struct floatformat): Add field "is_valid". |
2003-09-15 Andrew Cagney <cagney@redhat.com> |
* floatformat.h (floatformat_to_double): Make input buffer constant. |
(floatformat_from_double, floatformat_is_valid): Ditto. |
2003-09-15 Andrew Cagney <cagney@redhat.com> |
* floatformat.h (struct floatformat): Make "exp_bias" signed. |
2003-09-15 Daniel Jacobowitz <drow@mvista.com> |
* floatformat.h (floatformat_is_valid): Add prototype. |
2003-08-27 Andrew Cagney <cagney@redhat.com> |
* dis-asm.h (init_disassemble_info): Declare. |
(INIT_DISASSEMBLE_INFO): Redefine as a call to |
init_disassemble_info. |
(INIT_DISASSEMBLE_INFO_NO_ARCH): Ditto. |
2003-08-20 Nick Clifton <nickc@redhat.com> |
* bfdlink.h (enum report_method): New enum. Describes how to |
report something. |
(struct bfd_link_info): Delete fields 'no_undefined' and |
'allow_shlib_undefined'. Replace with |
'unresolved_symbols_in_objects' and |
'unresolved_symbols_in_shared_libs'. |
2003-08-07 Alan Modra <amodra@bigpond.net.au> |
* bfdlink.h: Remove PARAMS macro. Replace PTR with void *. |
* dis-asm.h: Likewise. |
2003-07-09 Bob Wilson <bob.wilson@acm.org> |
* xtensa-config.h: Undef all macros before defining them. |
2003-07-06 H.J. Lu <hongjiu.lu@intel.com> |
* demangle.h: Support C++. |
2003-07-01 Zack Weinberg <zack@codesourcery.com> |
* filenames.h: New file imported from binutils. |
2003-06-30 Bob Wilson <bob.wilson@acm.org> |
* xtensa-config.h: New file imported from binutils. |
2003-06-30 Bob Wilson <bob.wilson@acm.org> |
* xtensa-config.h (XCHAL_HAVE_CONST16, XCHAL_HAVE_ABS, |
XCHAL_HAVE_ADDX, XCHAL_HAVE_L32R): Define. |
2003-06-25 Alan Modra <amodra@bigpond.net.au> |
* bfdlink.h: Correct spelling of "relocatable". |
2003-06-22 Zack Weinberg <zack@codesourcery.com> |
* safe-ctype.h (HC_UNKNOWN, HC_ASCII, HC_EBCDIC): Rename to |
HOST_CHARSET_UNKNOWN, HOST_CHARSET_ASCII, HOST_CHARSET_EBCDIC |
respectively. |
2003-06-21 Zack Weinberg <zack@codesourcery.com> |
* safe-ctype.h (HC_UNKNOWN, HC_ASCII, HC_EBCDIC, HOST_CHARSET): |
New #defines. |
2003-06-17 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* ansidecl.h: Delete HAVE_LONG_DOUBLE GCC bootstrap support. |
2003-05-23 Jakub Jelinek <jakub@redhat.com> |
* bfdlink.h (struct bfd_link_info): Add execstack and noexecstack. |
2003-06-03 H.J. Lu <hongjiu.lu@intel.com> |
* bfdlink.h (LD_DEFINITION_IN_DISCARDED_SECTION): New. |
2003-05-30 Ulrich Drepper <drepper@redhat.com> |
Jakub Jelinek <jakub@redhat.com> |
* bfdlink.h (struct bfd_link_info): Add pie and executable |
bits. |
2003-05-21 Nick Clifton <nickc@redhat.com> |
* bfdlink.h (struct bfd_link_hash_table): Fix typo in comment. |
2003-05-15 Jim Blandy <jimb@redhat.com> |
* libiberty.h (hex_value): Make the value an unsigned int, to |
avoid unexpected sign-extension when cast to unsigned types larger |
than int --- like bfd_vma, on some platforms. |
(_hex_value): Update declaration. |
2003-05-09 Alan Modra <amodra@bigpond.net.au> |
* xtensa-isa-internal.h (xtensa_isa_module_struct): Remove const on |
gen_num_opcodes_fn return type. |
2003-05-07 Jason Merrill <jason@redhat.com> |
* hashtab.h (iterative_hash): Prototype. |
(iterative_hash_object): New macro. |
2003-04-28 H.J. Lu <hjl@gnu.org> |
* bfdlink.h (bfd_link_info): Add relax_finalizing. |
2003-04-23 H.J. Lu <hjl@gnu.org> |
* bfdlink.h (bfd_link_callbacks): Add error_handler. |
2003-04-02 Bob Wilson <bob.wilson@acm.org> |
* xtensa-config.h: Remove comment indicating that this is a |
generated file. |
2003-04-01 Bob Wilson <bob.wilson@acm.org> |
* dis-asm.h (print_insn_xtensa): Declare. |
* xtensa-config.h: New file. |
* xtensa-isa-internal.h: Likewise. |
* xtensa-isa.h: Likewise. |
2003-03-17 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* ansidecl.h (ATTRIBUTE_NONNULL, ATTRIBUTE_NULL_PRINTF, |
ATTRIBUTE_NULL_PRINTF_1, ATTRIBUTE_NULL_PRINTF_2, |
ATTRIBUTE_NULL_PRINTF_3, ATTRIBUTE_NULL_PRINTF_4, |
ATTRIBUTE_NULL_PRINTF_5): New. |
(ATTRIBUTE_PRINTF): Add ATTRIBUTE_NONNULL. |
2003-03-17 Jan Hubicka <jh@suse.cz> |
* hashtab.h (htab_traverse_noresize): Declare. |
2003-02-27 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* libiberty.h: Document return value of physmem routines. |
2003-02-20 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* libiberty.h (physmem_total, physmem_available): Prototype. |
2003-02-20 Daniel Jacobowitz <drow@mvista.com> |
* libiberty.h (lrealpath): Add declaration. |
2003-01-31 Grant Grundler <grundler@dsl2.external.hp.com> |
* hppa.h (ldwa, ldda): Add ordered opcodes. |
2003-01-26 Daniel Jacobowitz <drow@mvista.com> |
* hashtab.h (htab_alloc_with_arg, htab_free_with_arg): Add new types. |
(struct htab): Add alloc_arg, alloc_with_arg_f, free_with_arg_f. |
(htab_create_alloc_ex): New prototype. |
(htab_set_functions_ex): New prototype. |
2002-07-17 Geoffrey Keating <geoffk@redhat.com> |
* splay-tree.h (GTY): Define if undefined. |
(splay_tree_allocate_fn): Return PTR for compatibility, not void *. |
(struct splay_tree_node_s): Support gengtype. |
(struct splay_tree_s): Likewise. Make allocate_data a PTR, |
not a void *. |
2002-01-02 Ben Elliston <bje@redhat.com> |
* dis-asm.h (print_insn_iq2000): Declare. |
2002-12-24 Dmitry Diky <diwil@mail.ru> |
* dis-asm.h: Add msp430 disassembler prototype. |
2002-12-27 Chris Demetriou <cgd@broadcom.com> |
* dis-asm.h (print_mips_disassembler_options): Prototype. |
2002-12-23 Alan Modra <amodra@bigpond.net.au> |
* bfdlink.h (struct bfd_link_info): Add "strip_discarded". |
2002-12-20 Alan Modra <amodra@bigpond.net.au> |
* bfdlink.h (struct bfd_link_info): Replace bfd_boolean fields with |
bit-fields. Rearrange to put all like types together. |
2002-11-30 Alan Modra <amodra@bigpond.net.au> |
* bfdlink.h: Replace boolean with bfd_boolean. Formatting. |
2002-11-23 Simon Burge <simonb@wasabisystems.com> |
* libiberty.h (basename): Add NetBSD to the list. |
2002-11-22 Daniel Jacobowitz <drow@mvista.com> |
* libiberty.h (make_relative_prefix): Add prototype. |
2002-11-14 Egor Duda <deo@logos-m.ru> |
* bfdlink.h (struct bfd_link_info): Add new boolean |
field pei386_runtime_pseudo_reloc. |
2002-10-26 Roger Sayle <roger@eyesopen.com> |
* partition.h: Close the extern "C" scope when compiling with C++. |
2002-10-26 Roger Sayle <roger@eyesopen.com> |
DJ Delorie <dj@redhat.com> |
PR bootstrap/8351 |
* getopt.h: Avoid prototyping getopt with no arguments in C++. |
2002-10-24 Nathan Tallent <eraxxon@alumni.rice.edu> |
* ansidecl.h (__STDC__): Add (__alpha && __cplusplus) to the |
list of platform compilers that may look, smell and act |
like __STDC__ but that may not define it. |
2002-10-11 David O'Brien <obrien@FreeBSD.org> |
* getopt.h: getopt is in unistd.h (based on SUSv2). |
2002-09-26 Andrew Cagney <ac131313@redhat.com> |
* regs/: Delete directory. |
2002-09-19 Alexandre Oliva <aoliva@redhat.com> |
* libiberty.h (asprintf, vasprintf): Don't declare them if the |
corresponding HAVE_DECL_ macro is 1. |
2002-09-19 Nathan Tallent <eraxxon@alumni.rice.edu> |
* dis-asm.h: Remove (errant) trailing semicolon (;) from the |
extern "C" { } declaration. |
2002-09-04 Nick Clifton <nickc@redhat.com> |
* dis-asm.h (print_ppc_disassembler_options): Prototype. |
2002-08-28 Michael Hayes <m.hayes@elec.canterbury.ac.nz> |
* dis-asm.h: Add standard disassembler for tic4x. |
2002-08-07 H.J. Lu <hjl@gnu.org> |
* bfdlink.h (bfd_link_info): Add allow_undefined_version. |
(bfd_elf_version_expr): Add symver and script. |
2002-07-31 Ian Dall <ian@sibyl.beware.dropbear.id.au> |
* bfdlink.h (bfd_link_common_skip_ar_symbols): New enum. |
(struct bfd_link_info): Add new field 'common_skip_ar_symbols'. |
2002-07-19 Denis Chertykov <denisc@overta.ru> |
Matthew Green <mrg@redhat.com> |
* dis-asm.h (print_insn_ip2k): Declare. |
2002-07-01 Alan Modra <amodra@bigpond.net.au> |
* bfdlink.h (struct bfd_sym_chain): Declare. |
(struct bfd_link_info): Add gc_sym_list. Formatting fixes. |
2002-06-25 Alan Modra <amodra@bigpond.net.au> |
* demangle.h: #include "ansidecl.h" rather than #include <ansidecl.h>. |
* fibheap.h: Likewise. |
* hashtab.h: Likewise. |
* partition.h: Likewise. |
* sort.h: Likewise. |
* splay-tree.h: Likewise. |
2002-06-24 Alan Modra <amodra@bigpond.net.au> |
* libiberty.h (basename): Don't declare if HAVE_DECL_BASENAME. |
* getopt.h (getopt): Don't declare if HAVE_DECL_GETOPT. |
2002-06-18 Dave Brolley <brolley@redhat.com> |
From Catherine Moore: |
* dis-asm.h (print_insn_frv): New prototype. |
2002-06-09 Andrew Cagney <cagney@redhat.com> |
* remote-sim.h: Move to directory gdb/. |
* callback.h: Move to directory gdb/. |
2002-06-07 Charles Wilson <cwilson@ece.gatech.edu> |
* bfdlink.h (struct bfd_link_info): Change type of |
pei386_auto_import field to int so that -1 can mean enabled by |
default and 1 can mean enabled by command line switch. |
2002-06-06 DJ Delorie <dj@redhat.com> |
* hashtab.h (htab): Rearrange new members for backward |
compatibility. |
(htab_create): Don't use a macro that requires other headers. |
2002-06-05 Geoffrey Keating <geoffk@redhat.com> |
* hashtab.h (htab_create): Restore prototype for backward |
compatibility. |
(htab_try_create): Likewise. |
2002-05-22 Geoffrey Keating <geoffk@redhat.com> |
* hashtab.h (struct htab): Update for change to length specifier. |
2002-05-10 Geoffrey Keating <geoffk@redhat.com> |
* hashtab.h (GTY): Define if undefined. |
(htab_alloc): New typedef. |
(htab_free): New typedef. |
(struct htab): Support gengtype; allow user-specified memory |
allocation. |
(htab_create_alloc): New. |
(htab_create): Replace with #define. |
(htab_try_create): Delete. |
2002-05-28 Kuang Hwa Lin <kuang@sbcglobal.net> |
* dis-asm.h: Prototype print_insn_dlx. |
2002-05-23 Andrew Cagney <ac131313@redhat.com> |
* sim-d10v.h: Delete file. Moved to include/gdb/. |
2002-05-21 H.J. Lu (hjl@gnu.org) |
* bfdlink.h (bfd_link_info): Add allow_multiple_definition. |
2002-05-17 J"orn Rennecke <joern.rennecke@superh.com> |
* dis-asm.h (print_insn_shl, print_insn_sh64l): Remove prototype. |
2002-04-16 David S. Miller <davem@redhat.com> |
* xregex2.h (__restrict_arr): Define to __restrict on GCC |
3.1 and later. Do not redefine. |
2002-04-01 Phil Edwards <pme@gcc.gnu.org> |
* dyn-string.h: Also allow IN_GLIBCPP_V3 to redefine names. |
2002-03-10 Daniel Jacobowitz <drow@mvista.com> |
* gdb: New directory. |
2002-03-06 Andrew Cagney <ac131313@redhat.com> |
* floatformat.h (floatformat_arm_ext): Delete declaration. |
2002-02-21 Jim Blandy <jimb@redhat.com> |
Allow the user to specify functions for allocating memory for |
splay tree roots and nodes. |
* splay-tree.h (splay_tree_allocate_fn, splay_tree_deallocate_fn): |
New types. |
(splay_tree): New fields: `allocate', `deallocate', and |
`allocate_data'. |
(splay_tree_new_with_allocator): New function declaration. |
2002-02-15 Alan Modra <amodra@bigpond.net.au> |
Support arbitrary length fill patterns. |
* bfdlink.h (enum bfd_link_order_type): Remove bfd_fill_link_order. |
(struct bfd_link_order): Remove fill. Add data.size. |
2002-02-08 Alexandre Oliva <aoliva@redhat.com> |
Contribute sh64-elf. |
2000-11-25 Hans-Peter Nilsson <hpn@cygnus.com> |
* dis-asm.h (print_insn_sh64): New prototype. |
(print_insn_sh64l): New prototype. |
(print_insn_sh64x_media): New prototype. |
2002-02-05 Frank Ch. Eigler <fche@redhat.com> |
* dis-asm.h (disassemble_info): New field `insn_sets'. |
(INIT_DISASSEMBLE_INFO): Clear it. |
2002-02-05 Jason Merrill <jason@redhat.com> |
* demangle.h (cplus_demangle_v3): Add "options" parm. |
(cplus_demangle_v3_type): Remove prototype. |
(DMGL_VERBOSE): New macro. |
(DMGL_TYPES): New macro. |
2002-02-02 H.J. Lu (hjl@gnu.org) |
* demangle.h (cplus_demangle_v3_type): New prototype. |
2002-01-31 Ivan Guzvinec <ivang@opencores.org> |
* dis-asm.h : Add support for or32 targets |
2002-01-28 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* libiberty.h (C_alloca): Add ATTRIBUTE_MALLOC. |
2002-01-27 David O'Brien <obrien@FreeBSD.org> |
* cgen.h (BFD_VERSION): Use BFD_VERSION_DATE instead. |
2001-12-14 Nick Clifton <nickc@cambridge.redhat.com> |
* dis-asm.h (INIT_DISASSEMBLE_INFO_NO_ARCH): Initialise the |
disassembler_options field (to NULL). |
2001-12-13 Jakub Jelinek <jakub@redhat.com> |
* bfdlink.h (struct bfd_link_info): Add eh_frame_hdr field. |
2001-12-07 Geoffrey Keating <geoffk@redhat.com> |
* dis-asm.h (print_insn_xstormy16): Declare. |
2001-12-06 Richard Henderson <rth@redhat.com> |
* demangle.h (no_demangling): New. |
(NO_DEMANGLING_STYLE_STRING): New. |
2001-11-14 Alan Modra <amodra@bigpond.net.au> |
* dis-asm.h (print_insn_i386): Declare. |
2001-11-11 Timothy Wall <twall@alum.mit.edu> |
* dis-asm.h: Fix comment to refer to octets rather than bytes. |
2001-10-30 Hans-Peter Nilsson <hp@bitrange.com> |
* dis-asm.h (print_insn_mmix): Add prototype. |
2001-10-24 Neil Booth <neil@daikokuya.demon.co.uk> |
* safe-ctype.h (_sch_isbasic, IS_ISOBASIC): New. |
2001-10-22 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* libiberty.h (hex_init): Revert delete. |
* libiberty.h (_hex_value): Const-ify. |
(hex_init): Delete. |
2001-10-16 Christopher Faylor <cgf@redhat.com> |
* filenames.h: Add cygwin to the list of dosish style path systems. |
2001-10-07 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* demangle.h (demangler_engine): Const-ify. |
* libiberty.h (buildargv): Likewise. |
2001-10-03 Vassili Karpov <malc@pulsesoft.com> |
* bfdlink.h (struct bfd_link_info): Add nocopyreloc field. |
2001-09-24 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* libiberty.h (reconcat): New function. |
2001-09-18 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* libiberty.h (concat, concat_length, concat_copy, concat_copy2, |
ACONCAT): Improve comments. |
2001-09-18 Alan Modra <amodra@bigpond.net.au> |
* objalloc.h (OBJALLOC_ALIGN): Define using offsetof. |
2001-09-17 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* libiberty.h (concat_length, concat_copy, concat_copy2, |
libiberty_concat_ptr, ACONCAT): New. |
* libiberty.h (ASTRDUP): New macro. |
libiberty_optr, libiberty_nptr, libiberty_len): Declare. |
2001-08-29 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* ansidecl.h: Update comments reflecting previous change. |
2001-08-27 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* ansidecl.h (VA_OPEN, VA_CLOSE): Allow multiple uses. |
2001-08-25 Nick Clifton <nickc@cambridge.redhat.com> |
* bfdlink.h (struct bfd_link_info): Change 'spare_dynamic_tags' to |
unsigned to remove a compile time warning message. |
2001-08-24 H.J. Lu <hjl@gnu.org> |
* bfdlink.h (bfd_link_hash_table_type): New. The linker hash |
table type, bfd_link_generic_hash_table and |
bfd_link_elf_hash_table. |
(bfd_link_hash_table): Add a new field, type, for the linker |
hash table type. |
2001-08-23 Jakub Jelinek <jakub@redhat.com> |
* bfdlink.h (struct bfd_link_info): Add combreloc and |
spare_dynamic_tags fields. |
2001-08-23 Lars Brinkhoff <lars@nocrew.org> |
* dyn-string.h, fibheap.h, partition.h, sort.h, splay-tree.h: |
replace "GNU CC" with "GCC". |
2001-08-21 Richard Henderson <rth@redhat.com> |
* fibheap.h: Tidy formatting. |
(fibnode_t): Limit degree to 31 bits to avoid warning. |
2001-08-20 Daniel Berlin <dan@cgsoftware.com> |
* fibheap.h: New file. Fibonacci heap. |
2001-08-20 Andrew Cagney <ac131313@redhat.com> |
* floatformat.h (floatformat_arm_ext): Document as deprecated. |
(floatformat_arm_ext_big, floatformat_arm_ext_littlebyte_bigword) |
(floatformat_ia64_spill_little, floatformat_ia64_quad_little) |
(floatformat_ia64_spill_big, floatformat_ia64_quad_big) |
(floatformat_m88110_harris_ext): Declare. |
2001-08-18 Zack Weinberg <zackw@panix.com> |
* ansidecl.h: Reorganize for readability, remove documentation |
of obsolete macros, document PARAMS and VPARAMS. Add new |
macros VA_OPEN, VA_CLOSE, and VA_FIXEDARG for nicer variadic |
function implementation. |
2001-08-16 Richard Henderson <rth@redhat.com> |
* hashtab.h (htab_hash_string): Declare. |
2001-08-10 Andrew Cagney <ac131313@redhat.com> |
* libiberty.h (lbasename): Change function declaration to return a |
const char pointer. |
2001-08-02 Mark Kettenis <kettenis@gnu.org> |
* xregex.h (_REGEX_RE_COMP): Define. |
(re_comp): Define to xre_comp. |
(re_exec): Define to xre_exec. |
2001-08-02 Charles Wilson <cwilson@ece.gatech.edu> |
* bfdlink.h (struct bfd_link_info): add new boolean |
field pei386_auto_import. |
2001-07-18 Andreas Jaeger <aj@suse.de> |
* xregex2.h: Place under LGPL version 2.1. |
2001-07-10 Jeff Johnston <jjohnstn@redhat.com> |
* xregex.h: New file to support libiberty regex. |
* xregex2.h: Ditto. |
2001-06-15 Hans-Peter Nilsson <hp@axis.com> |
* bfdlink.h (struct bfd_link_info): New member export_dynamic. |
2001-05-16 Matt Kraai <kraai@alumni.carnegiemellon.edu> |
* partition.h: Fix misspelling of `implementation'. |
2001-05-10 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* ansidecl.h (NULL_PTR): Delete. |
2001-05-07 Zack Weinberg <zackw@stanford.edu> |
* demangle.h: Use PARAMS for all prototypes. |
* ternary.h: Use PARAMS for all prototypes. Use PTR, not void *. |
Make arguments constant where possible. |
2001-05-07 Mark Mitchell <mark@codesourcery.com> |
* splay-tree.h (splay_tree_max): New function. |
(splay_tree_min): Likewise. |
2001-04-27 Johan Rydberg <jrydberg@opencores.org> |
* dis-asm.h (print_insn_openrisc): Add prototype. |
2001-04-15 Daniel Berlin <dan@cgsoftware.com> |
* ternary.h: New file - Ternary search tree header. |
2001-04-13 Jakub Jelinek <jakub@redhat.com> |
* bfdlink.h (bfd_link_discard): Add discard_sec_merge. |
2001-04-03 Zack Weinberg <zackw@stanford.edu> |
* ansidecl.h: All logic from gcc/gansidecl.h moved here. |
2001-03-31 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* libiberty.h (alloca): Handle setting C_ALLOCA. |
2001-03-20 Jim Blandy <jimb@redhat.com> |
* demangle.h (enum gnu_v3_constructor_kinds, |
is_gnu_v3_mangled_ctor, enum gnu_v3_destructor_kinds, |
is_gnu_v3_mangled_dtor): New declarations. |
2001-03-14 Nick Clifton <nickc@redhat.com> |
* ansidecl.h: Fix copyright dates. |
* demangle.h: Fix copyright dates. |
* floatformat.h: Fix copyright dates. |
* fnmatch.h: Fix copyright dates. |
* getopt.h: Fix copyright dates. |
* libiberty.h: Add FSF copyright notice. |
* md5.h: Fix copyright dates. |
* obstack.h: Fix copyright dates. |
* splay-tree.h: Fix copyright dates. |
2001-03-10 Neil Booth <neil@daikokuya.demon.co.uk> |
John David Anglin <dave@hiauly1.hia.nrc.ca> |
* libiberty.h: Add lbasename. |
2001-03-06 Zack Weinberg <zackw@stanford.edu> |
* libiberty.h: Prototype C_alloca; define alloca to either |
__builtin_alloca or C_alloca as appropriate. |
2001-03-01 John David Anglin <dave@hiauly1.hia.nrc.ca> |
* safe-ctype.h (_sch_test): Cast enum bit to unsigned short int for pcc |
compatibility. |
2001-02-18 lars brinkhoff <lars@nocrew.org> |
* dis-asm.h: Add PDP-11 target. |
2001-02-09 Martin Schwidefsky <schwidefsky@de.ibm.com> |
* dis-asm.h: Add linux target for S/390. |
2001-01-11 Peter Targett <peter.targett@arccores.com> |
* dis-asm.h (arc_get_disassembler): Correct declaration. |
2001-01-09 Philip Blundell <philb@gnu.org> |
* bin-bugs.h (REPORT_BUGS_TO): Set to `bug-binutils@gnu.org'. |
2000-12-18 Joseph S. Myers <jsm28@cam.ac.uk> |
* COPYING: Update to current |
ftp://ftp.gnu.org/pub/gnu/Licenses/COPYING-2.0 (fixes references |
to 19yy as example year in copyright notice). |
2000-12-19 Hans-Peter Nilsson <hp@bitrange.com> |
* dis-asm.h (struct disassemble_info): New member "section". |
(INIT_DISASSEMBLE_INFO_NO_ARCH): Initialize private_data member. |
Initialize section member. |
2000-12-16 Herman A.J. ten Brugge <Haj.Ten.Brugge@net.HCC.nl> |
* safe-ctype.h: Make code work on all targets and not just on |
targets where a char is 8 bits. |
2000-12-10 Fred Fish <fnf@be.com> |
* bfdlink.h (struct bfd_link_info): Add new allow_shlib_undefined |
member to struct for systems where it is normal to have undefined |
symbols in shared libraries at runtime and the runtime linker |
takes care of redirecting them. |
2000-12-07 Zack Weinberg <zack@wolery.stanford.edu> |
* safe-ctype.h: New file. |
2000-12-06 Rodney Brown <RodneyBrown@mynd.com> |
* getopt.h obstack.h: Standarize copyright statement. |
2000-12-04 Richard Henderson <rth@redhat.com> |
* demangle.h: Change "new_abi" to "v3" everywhere. |
2000-11-22 Zack Weinberg <zack@wolery.stanford.edu> |
* libiberty.h: Move #includes to top. Prototype xmalloc_failed. |
2000-11-15 Kenneth Block <kenneth.block@compaq.com> |
* demangle.h: Add gnat and java demangle styles. |
2000-11-04 Hans-Peter Nilsson <hp@bitrange.com> |
* hashtab.h (struct htab): Add member return_allocation_failure. |
(htab_try_create): New prototype. Mention which functions may |
return NULL when this is used. |
2000-11-03 Hans-Peter Nilsson <hp@bitrange.com> |
* hashtab.h: Change void * to PTR where necessary. |
2000-10-11 Mark Mitchell <mark@codesourcery.com> |
* splay-tree.h (splay_tree_predecessor): Declare. |
2000-09-29 Hans-Peter Nilsson <hp@axis.com> |
* dis-asm.h: Declare cris_get_disassembler, not print_insn_cris. |
Fix typo in comment. |
2000-09-28 John David Anglin <dave@hiauly1.hia.nrc.ca> |
* alloca-conf.h: New file (copied from libiberty). |
2000-09-05 John David Anglin <dave@hiauly1.hia.nrc.ca> |
* md5.h (md5_uint32): Choose via INT_MAX instead of UINT_MAX. |
2000-09-04 Alex Samuel <samuel@codesourcery.com> |
* dyn-string.h: Adjust formatting. |
(dyn_string_insert_char): New macro. New declaration. |
2000-08-28 Jason Merrill <jason@redhat.com> |
* md5.h: New file. |
2000-08-24 Greg McGary <greg@mcgary.org> |
* libiberty.h (ARRAY_SIZE): New macro. |
2000-07-29 Nick Clifton <nickc@cygnus.com> |
* os9k.h: Add copyright notice. |
Fix formatting. |
2000-07-22 Jason Eckhardt <jle@cygnus.com> |
* dis-asm.h (print_insn_i860): Add prototype. |
2000-07-20 H.J. Lu <hjl@gnu.org> |
* bfdlink.h (bfd_link_info): Add new_dtags. |
2000-07-20 Hans-Peter Nilsson <hp@axis.com> |
* dis-asm.h (print_insn_cris): Declare. |
2000-07-19 H.J. Lu (hjl@gnu.org) |
* bfdlink.h (bfd_link_info): Add flags and flags_1. |
2000-06-05 DJ Delorie <dj@redhat.com> |
* MAINTAINERS: new |
2000-06-21 Alex Samuel <samuel@codesourcery.com> |
* dyn-string.h (dyn_string_init, dyn_string_new, |
dyn_string_delete, dyn_string_release, dyn_string_resize, |
dyn_string_clear, dyn_string_copy, dyn_string_copy_cstr, |
dyn_string_prepend, dyn_string_prepend_cstr, dyn_string_insert, |
dyn_string_insert_cstr, dyn_string_append, dyn_string_append_cstr, |
dyn_string_append_char, dyn_string_substring_dyn_string_eq): |
Define as same name with __cxa_ prepended, if IN_LIBGCC2. |
(dyn_string_init, dyn_string_copy, dyn_string_copy_cstr, |
dyn_string_prepend, dyn_string_prepend_cstr, dyn_string_insert, |
dyn_string_insert_cstr, dyn_string_append, dyn_string_append_cstr, |
dyn_string_append_char, dyn_string_substring): Change return type |
to int. |
2000-06-18 Stephane Carrez <stcarrez@worldnet.fr> |
* dis-asm.h (print_insn_m68hc12): Define. |
(print_insn_m68hc11): Likewise. |
2000-06-18 Nick Clifton <nickc@redhat.com> |
* os9k.h: Change values of MODSYNC and CRCCON due to bug report |
from Russ Magee <rmagee@home.com>. |
2000-06-07 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* demangle.h (demangling_styles): Remove trailing comma in enum. |
* dyn-string.h (dyn_string_append_char): Change parameter from |
char to int. |
2000-06-04 Alex Samuel <samuel@codesourcery.com> |
* dyn-string.h: Move here from gcc/dyn-string.h. Add new functions. |
* demangle.h (DMGL_GNU_NEW_ABI): New macro. |
(DMGL_STYLE_MASK): Or in DMGL_GNU_NEW_ABI. |
(current_demangling_style): Add gnu_new_abi_demangling. |
(GNU_NEW_ABI_DEMANGLING_STYLE_STRING): New macro. |
(GNU_NEW_ABI_DEMANGLING): Likewise. |
(cplus_demangle_new_abi): New declaration. |
Tue May 30 16:53:34 2000 Andrew Cagney <cagney@b1.cygnus.com> |
* floatformat.h (struct floatformat): Add field name. |
2000-05-26 Eli Zaretskii <eliz@is.elta.co.il> |
* filenames.h: New file. |
(HAVE_DOS_BASED_FILE_SYSTEM, IS_DIR_SEPARATOR) |
(IS_ABSOLUTE_PATH, FILENAME_CMP): New macros. |
2000-05-23 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* getopt.h (getopt): Also check HAVE_DECL_* when prototyping. |
* libiberty.h (basename): Likewise. |
2000-05-17 S. Bharadwaj Yadavalli <sby@scrugs.lkg.dec.com> |
Rick Gorton <gorton@scrugs.lkg.dec.com> |
* bfdlink.h (struct bfd_link_info): Add emitrelocations flag. |
2000-05-08 Alan Modra <alan@linuxcare.com.au> |
* dis-asm.h (print_insn_tic54x): Declare. |
2000-05-06 Zack Weinberg <zack@wolery.cumb.org> |
* ansidecl.h: #define __extension__ to nothing if |
GCC_VERSION < 2008. |
2000-05-04 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* demangle.h (demangler_engine): Constify. |
Thu May 4 17:15:26 2000 Philippe De Muyter <phdm@macqel.be> |
* sort.h (sys/types.h): File included unconditionnaly. |
(stddef.h): File include only #ifdef __STDC__. |
2000-05-03 Zack Weinberg <zack@wolery.cumb.org> |
* symcat.h: Remove #endif label. |
2000-04-28 Kenneth Block <block@zk3.dec.com> |
Jason Merrill <jason@casey.cygnus.com> |
* demangle.h (libiberty_demanglers): new table for different styles. |
(cplus_demangle_set_style): New function for setting style. |
(cplus_demangle_name_to_style): New function to translate name. |
2000-04-24 Mark Mitchell <mark@codesourcery.com> |
* hashtab.h (hash_pointer): Declare. |
(eq_pointer): Likewise. |
2000-04-23 Mark Mitchell <mark@codesourcery.com> |
* sort.h: New file. |
Fri Apr 21 13:20:53 2000 Richard Henderson <rth@cygnus.com> |
David Mosberger <davidm@hpl.hp.com> |
* dis-asm.h (print_insn_ia64): Declare. |
Tue Apr 18 16:22:30 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> |
* hashtab.h (enum insert_option): New type. |
(htab_find_slot, htab_find_slot_with_hash): Use it. |
2000-04-17 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* symcat.h: Honor autoconf macro HAVE_STRINGIZE. Add |
comments/caveats with regard to traditional C behavior. |
2000-04-05 Richard Henderson <rth@cygnus.com> |
* splay-tree.h (splay_tree_remove): Declare. |
2000-04-04 Alan Modra <alan@linuxcare.com.au> |
* bin-bugs.h (REPORT_BUGS_TO): Remove translated part. |
2000-04-03 Alan Modra <alan@linuxcare.com.au> |
* bin-bugs.h: New file. |
2000-03-30 Mark Mitchell <mark@codesourcery.com> |
* hashtab.h (hashval_t): New type. |
(htab_find_with_hash): Use it as an argument. |
(htab_find_slot_with_hash): Likewise. |
2000-03-27 Denis Chertykov <denisc@overta.ru> |
* dis-asm.h (print_insn_avr): Declare. |
2000-03-14 Bernd Schmidt <bernds@cygnus.co.uk> |
* hashtab.h (htab_trav): Modify type so that first arg is of type |
void **. |
(htab_find_with_hash, htab_find_slot_with_hash): Declare new |
functions. |
2000-03-09 Alex Samuel <samuel@codesourcery.com> |
* partition.h: New file. |
2000-03-09 Zack Weinberg <zack@wolery.cumb.org> |
* hashtab.h (struct htab): Add del_f. |
(htab_del): New type. |
(htab_create): Add fourth argument. |
2000-03-08 Zack Weinberg <zack@wolery.cumb.org> |
* hashtab.h (hash_table_t): Rename to htab_t. |
(struct hash_table): Rename to struct htab. Shorten element |
names. Reorder elements by size. |
(htab_hash, htab_eq, htab_trav): New typedefs for the callback |
function pointers. |
(hash_table_entry_t): Discard; just use void * for element |
type. |
2000-03-01 H.J. Lu <hjl@gnu.org> |
* bfdlink.h (bfd_link_callbacks): Add a boolean arg to |
the undefined_symbol callback. |
2000-02-23 Linas Vepstas <linas@linas.org> |
* dis-asm.h (print_insn_i370): Declare. |
Tue Feb 22 15:19:54 2000 Andrew Cagney <cagney@b1.cygnus.com> |
* remote-sim.h (sim_trace): Document return values. |
(sim_set_trace): Declare. Deprecate. |
2000-02-21 Alan Modra <alan@spri.levels.unisa.edu.au> |
* dis-asm.h (struct disassemble_info): Change `length' param of |
read_memory_func to unsigned. Change type of `buffer_length' and |
`octets_per_byte' to unsigned. |
(buffer_read_memory): Change `length' param to unsigned. |
2000-02-16 Nick Clifton <nickc@cygnus.com> |
* dis-asm.h: Add prototypes for ARM register name functions. |
Wed Feb 9 18:45:49 2000 Andrew Cagney <cagney@b1.cygnus.com> |
* wait.h: Delete. No longer used by GDB. |
Tue Feb 8 17:01:13 2000 Andrew Cagney <cagney@b1.cygnus.com> |
* remote-sim.h (sim_resume): Clarify use of SIGGNAL. |
(sim_stop_reason): Clarify meaning of sim_signalled. |
2000-02-03 Timothy Wall <twall@redhat.com> |
* dis-asm.h (struct disassemble_info): Added octets_per_byte |
field and initialize it to one (1). |
2000-01-27 Nick Clifton <nickc@redhat.com> |
* dis-asm.h: Add prototype for disassembler_usage(). |
Add prototype for arm_disassembler_options(). |
Remove prototype for arm_toggle_regnames(). |
Add prototype for parse_arm_disassembler_option(). |
Sat Jan 1 19:06:52 2000 Hans-Peter Nilsson <hp@bitrange.com> |
* symcat.h (STRINGX) [!__STDC__ || ALMOST_STDC]: Change "?" to "s" |
to stringify argument s. |
Wed Dec 15 11:22:56 1999 Jeffrey A Law (law@cygnus.com) |
* hp-symtab.h (HP_LANGUAGE_FORTRAN): New enumeration constant. |
(HP_LANGUAGE_F77): Define using HP_LANGUAGE_FORTRAN. |
1999-12-15 Doug Evans <dje@transmeta.com> |
* dis-asm.h: Enclose in extern "C" ifdef __cplusplus. |
1999-12-05 Mark Mitchell <mark@codesourcery.com> |
* splay-tree.h (struct splay_tree_node): Rename to ... |
(struct splay_tree_node_s): ... this. |
(struct splay_tree): Rename to ... |
(struct splay_tree_s): ... this. |
1999-11-30 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* ansidecl.h (ATTRIBUTE_MALLOC): New macro. |
* libiberty.h (buildargv, dupargv, concat, choose_temp_base, |
make_temp_file, xmalloc, xcalloc, xstrdup, xmemdup): Add |
ATTRIBUTE_MALLOC. |
(xatexit): Remove __GNUC__ check, add ATTRIBUTE_NORETURN. |
1999-11-28 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* libiberty.h: Include stdarg.h when ANSI_PROTOTYPES is defined. |
(asprintf, vasprintf): Provide declarations. |
Wed Nov 10 12:43:21 1999 Philippe De Muyter <phdm@macqel.be> |
Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* ansidecl.h: Define and test `GCC_VERSION', not `HAVE_GCC_VERSION'. |
1999-11-04 Jimmy Guo <guo@cup.hp.com> |
* hp-symtab.h (dntt_type_fparam): Add doc_ranges, misc_kind |
fields, change location type to CORE_ADDR from int. |
(dntt_type_const): Name the 5th field location_type. |
Sun Oct 24 19:11:32 1999 Andrew Cagney <cagney@b1.cygnus.com> |
* sim-d10v.h (SIM_D10V_TS2_DMAP_REGNUM): Define. |
1999-10-23 08:51 -0700 Zack Weinberg <zack@bitmover.com> |
* hashtab.h: Give hash_table_t a struct tag. Add prototypes |
for clear_hash_table_slot and traverse_hash_table. Correct |
prototype of all_hash_table_collisions. |
Sat Oct 23 19:00:13 1999 Andrew Cagney <cagney@b1.cygnus.com> |
* sim-d10v.h: New file. |
Fri Oct 15 01:47:51 1999 Vladimir Makarov <vmakarov@loony.cygnus.com> |
* hashtab.h: New file. |
1999-10-10 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* ansidecl.h (HAVE_GCC_VERSION): New macro. Use it instead of |
explicitly testing __GNUC__ and __GNUC_MINOR__. |
(ATTRIBUTE_PRINTF): Use `__format__', not `format'. |
1999-09-25 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* libiberty.h (make_temp_file): Add a prototype. |
Tue Sep 14 00:35:02 1999 Marc Espie <espie@cvs.openbsd.org> |
* libiberty.h (basename): OpenBSD has a correct prototype. |
(xrealloc): Remove outdated comment. |
1999-09-07 Jeff Garzik <jgarzik@pobox.com> |
* libiberty.h (xmemdup): Add prototype for new function. |
1999-09-04 Steve Chamberlain <sac@pobox.com> |
* dis-asm.h (print_insn_pj): Declare. |
1999-09-01 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* obstack.h (obstack_grow, obstack_grow0): Move (char*) casts |
in calls to `_obstack_memcpy' from here ... |
(_obstack_memcpy): ... to here, except in the __STDC__ case which |
doesn't need it. |
1999-08-30 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* libiberty.h (getpwd): Prototype. |
1999-08-01 Mark Mitchell <mark@codesourcery.com> |
* splay-tree.h (splay_tree_insert): Return the new node. |
1999-07-11 Ian Lance Taylor <ian@zembu.com> |
* ansidecl.h: Copy attribute support macros from egcs. |
1999-06-22 Mark Mitchell <mark@codesourcery.com> |
* bfdlink.h (struct bfd_link_hash_entry): Add init_function and |
fini_function. |
1999-06-20 Mark Mitchell <mark@codesourcery.com> |
* mips.h (Elf32_Internal_Msym): New structure. |
(Elf32_External_Msym): Likewise. |
(ELF32_MS_REL_INDEX): New macro. |
(ELF32_MS_FLAGS): Likewise. |
(ELF32_MS_INFO): Likewise. |
1999-06-14 Nick Clifton <nickc@cygnus.com> |
* dis-asm.h (arm_toggle_regnames): New prototype. |
(struct diassemble_info): New field: disassembler_options. |
1999-04-11 Richard Henderson <rth@cygnus.com> |
* bfdlink.h (bfd_elf_version_expr): Rename `match' to `pattern'. |
Add `match' callback function. |
1999-04-10 Richard Henderson <rth@cygnus.com> |
* bfdlink.h (bfd_link_info): Add no_undefined. |
1999-04-08 Nick Clifton <nickc@cygnus.com> |
* dis-asm.h: Add prototype for print_insn_mcore. |
1999-04-02 Mark Mitchell <mark@codesourcery.com> |
* splay-tree.h (splay_tree_compare_pointers): Declare. |
1999-03-30 Mark Mitchell <mark@codesourcery.com> |
* splay-tree.h (splay_tree_compare_ints): Declare. |
Wed Mar 24 12:46:29 1999 Andrew Cagney <cagney@amy.cygnus.com> |
* libiberty.h (basename): Cygwin{,32} should have the prototype. |
1999-02-22 Jim Lemke <jlemke@cygnus.com> |
* bfdlink.h (bfd_link_info): add field "mpc860c0". |
Mon Feb 1 21:05:46 1999 Catherine Moore <clm@cygnus.com> |
* dis-asm.h (print_insn_i386_att): Declare. |
(print_insn_i386_intel): Declare. |
1998-12-30 Michael Meissner <meissner@cygnus.com> |
* dis-asm.h (INIT_DISASSEMBLE_INFO_NO_ARCH): Cast STREAM and |
FPRINTF_FUNC to avoid compiler warnings. |
Wed Dec 30 16:07:14 1998 David Taylor <taylor@texas.cygnus.com> |
* dis-asm.h: change void * to PTR (two places). |
Mon Dec 14 09:53:31 1998 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* demangle.h: Don't check IN_GCC anymore. |
* splay-tree.h: Likewise. |
Tue Dec 8 00:30:31 1998 Elena Zannoni <ezannoni@kwikemart.cygnus.com> |
The following changes were made by Elena Zannoni |
<ezannoni@kwikemart.cygnus.com> and Edith Epstein |
<eepstein@sophia.cygnus.com> as part of a project to merge in |
changes made by HP; HP did not create ChangeLog entries. |
* dis-asm.h (struct disassemble_info): change the type of stream |
from FILE* to void*, for use with gdb's new type GDB_FILE. |
(fprintf_ftype): change FILE* parameter type to void*. |
* demangle.h: (DMGL_EDG): new macro for Kuck and Associates |
(DMGL_STYLE_MASK): modify to include Kuck and Assoc style |
(demangling_styles): add new edg_demangling style |
(EDG_DEMANGLING_STYLE_STRING): new macro |
(EDG_DEMANGLING): new macro |
(DMGL_HP): new macro, for HP/aCC compiler. |
(DMGL_STYLE_MASK): modify to include new HP's style. |
(demangling_styles): add new hp_demangling value. |
(HP_DEMANGLING_STYLE_STRING): new macro. |
(ARM_DEMANGLING): coerce to int. |
(HP_DEMANGLING): new macro. |
* hp-symtab.h: rewritten, from HP. |
(quick_procedure): change type of language field to unsigned int |
(quick_module): change type of language field to unsigned int |
(struct dntt_type_svar): add field thread_specific. |
(hp_language): add languages modcal and dmpascal. |
Fri Nov 20 13:14:00 1998 Andrew Cagney <cagney@b1.cygnus.com> |
* libiberty.h (basename): Add prototype for FreeBSD. |
Fri Nov 13 19:19:11 1998 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* libiberty.h: Prototype xcalloc. |
Sun Nov 8 17:42:25 1998 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* ansidecl.h: Wrap problematic macros with !IN_GCC. |
* demangle.h: Never define PARAMS(). |
* splay-tree.h: Likewise. |
Sat Nov 7 18:30:20 1998 Peter Schauer <peter.schauer@regent.e-technik.tu-muenchen.de> |
* dis-asm.h (print_insn_vax): Declare. |
Sat Nov 7 16:04:03 1998 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* demangle.h: Don't include gansidecl.h. |
* splay-tree.h: Likewise. |
1998-10-26 16:03 Ulrich Drepper <drepper@cygnus.com> |
* bfdlink.h (struct bfd_link_info): Add new field optimize. |
Thu Oct 22 19:58:00 1998 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> |
* splay-tree.h: Wrap function pointer parameter declarations in |
PARAMS() macro. |
1998-10-21 Mark Mitchell <mark@markmitchell.com> |
* splay-tree.h: New file. |
Fri Oct 9 00:02:03 1998 Jeffrey A Law (law@cygnus.com) |
* Merge devo and egcs include directories. |
Sat Sep 5 12:16:33 1998 Jeffrey A Law (law@cygnus.com) |
* getopt.h, obstack.h: Updated from gcc. |
1998-08-03 Jason Molenda (jsm@bugshack.cygnus.com) |
* libiberty.h (xexit): Change decl to use modern GCC attribute |
to indicate exit does not return. |
Mon Jun 1 13:48:32 1998 Jason Molenda (crash@bugshack.cygnus.com) |
* obstack.h: Update to latest FSF version. |
Tue Feb 24 13:05:02 1998 Doug Evans <devans@canuck.cygnus.com> |
* dis-asm.h (disassemble_info): Member `symbol' renamed to `symbols' |
and made an "asymbol **". New member num_symbols. |
(INIT_DISASSEMBLE_INFO_NO_ARCH): Update. |
Tue Feb 17 12:32:18 1998 Andrew Cagney <cagney@b1.cygnus.com> |
* remote-sim.h (sim_fetch_register, sim_store_register): Add |
register length parameter. Functions return actual length of |
register. |
Thu Feb 12 16:29:01 1998 Ian Lance Taylor <ian@cygnus.com> |
* getopt.h: Update to latest FSF version. |
Wed Feb 11 16:56:06 1998 Doug Evans <devans@canuck.cygnus.com> |
* symcat.h: New file. |
Mon Feb 2 17:13:31 1998 Steve Haworth <steve@pm.cse.rmit.EDU.AU> |
* dis-asm.h (print_insn_tic30): Declare. |
Thu Jan 22 16:23:59 1998 Fred Fish <fnf@cygnus.com> |
* dis-asm.h: Add flag INSN_HAS_RELOC to tell disassembly |
function there is a reloc on this line. |
Mon Dec 8 11:22:23 1997 Nick Clifton <nickc@cygnus.com> |
* dis-asm.h: Remove prototype of disasm_symaddr() as this function |
no longer exists. |
Tue Dec 2 10:20:53 1997 Nick Clifton <nickc@cygnus.com> |
* dis-asm.h (disasm_symaddr): New prototype. |
Mon Dec 1 11:29:35 1997 Doug Evans <devans@canuck.cygnus.com> |
* callback.h (CB_SYSCALL): Comment out arg names in prototypes. |
Wed Nov 26 16:47:58 1997 Michael Meissner <meissner@cygnus.com> |
* callback.h (CB_SYSCALL): Consistantly use names for prototype |
arguments. |
Wed Nov 26 11:39:30 1997 Doug Evans <devans@canuck.cygnus.com> |
* callback.h (CB_SYSCALL): Change byte count arguments to |
{read,write}_mem to `int'. New member `magic'. |
(CB_SYSCALL_MAGIC,CB_SYSCALL_INIT): New macros. |
Tue Nov 25 01:35:52 1997 Doug Evans <devans@seba.cygnus.com> |
* callback.h (struct stat): Move forward decl up. |
(host_callback): Pass stat struct pointer to stat,fstat. |
(CB_SYS_nnn): Reorganize. |
(CB_SYSCALL): New members p1,p2. |
(cb_host_to_target_stat): Delete fourth arg. |
Sat Nov 22 23:34:15 1997 Andrew Cagney <cagney@b1.cygnus.com> |
* remote-sim.h (sim_stop_reason): Clarify sim_signalled SIGRC |
argument. |
Mon Nov 17 14:00:51 1997 Doug Evans <devans@seba.cygnus.com> |
* callback.h (CB_TARGET_DEFS_MAP): Renamed from target_defs_map. |
(host_callback): Add stat, fstat, syscall_map, errno_map, open_map, |
signal_map, stat_map. |
(errn_map,open_map): Renamed to cb_init_foo_map. |
(cb_host_to_target_errno,cb_target_to_host_open): Renamed from |
host_to_target_errno,target_to_host_open. |
(cb_read_target_syscall_maps): Add prototype. |
(cb_target_to_host_syscall): Likewise. |
(cb_host_to_target_stat): Likewise. |
(cb_syscall): Likewise. |
(CB_SYS_{exit,open,close,read,write,lseek,unlink,getpid,kill,fstat, |
argvlen,argv,chdir,stat,chmod,utime,time}): Define. |
(CB_SYSCALL): New type. |
(CB_RC): New enum. |
Fri Nov 7 10:34:09 1997 Rob Savoye <rob@darkstar.cygnus.com> |
* libiberty.h: Add extern "C" { so it can be used with C++ |
programs. |
* remote-sim.h: Add extern "C" { so it can be used with C++ |
programs. |
Tue Oct 14 16:07:51 1997 Nick Clifton <nickc@cygnus.com> |
* dis-asm.h (struct disassemble_info): New field |
'symbol_at_address_func'. |
(INIT_DISASSEMBLE_INFO_NO_ARCH): Initialise new field with |
generic_symbol_at_address. |
Mon Oct 13 10:17:15 1997 Andrew Cagney <cagney@b1.cygnus.com> |
* remote-sim.h: Clarify sim_read, sim_write MEM argument. |
Wed Sep 24 18:03:10 1997 Stu Grossman <grossman@babylon-5.cygnus.com> |
* remote-sim.h (SIM_RC): Add a bunch of new return codes for |
breakpoint stuff. |
* Add functions to tell the simulator to set/clear/enable/disable |
intrinsic breakpoints. |
Thu Aug 28 19:41:42 1997 Andrew Cagney <cagney@b1.cygnus.com> |
* libiberty.h (dupargv): Add prototype. |
Tue Aug 26 12:25:49 1997 Andrew Cagney <cagney@b1.cygnus.com> |
* remote-sim.h (sim_create_inferior): Add ABFD arg. Document. |
Mon Aug 25 10:50:51 1997 Andrew Cagney <cagney@b1.cygnus.com> |
* remote-sim.h (sim_open): Add ABFD arg. Document. |
Fri Aug 8 16:43:56 1997 Doug Evans <dje@canuck.cygnus.com> |
* dis-asm.h (arc_get_disassembler): Declare. |
Wed Jul 30 11:39:50 1997 Per Bothner <bothner@deneb.cygnus.com> |
* demangle.h (DMGL_JAVA): New option to request Java demangling. |
Tue Jul 22 17:59:54 1997 Ian Lance Taylor <ian@cygnus.com> |
* libiberty.h (PEXECUTE_*): Define. |
(pexecute, pwait): Declare. |
Fri Jun 6 13:02:33 1997 Andrew Cagney <cagney@b1.cygnus.com> |
* remote-sim.h (sim_kill): Mark as depreciated. |
Fri May 23 13:43:41 1997 Fred Fish <fnf@cygnus.com> |
* bfdlink.h (struct bfd_link_info): Add task_link member. |
Thu May 22 11:32:49 1997 Andrew Cagney <cagney@b1.cygnus.com> |
* remote-sim.h: Review documentation. Clarify restrictions on |
when functions can be called. |
Wed May 21 16:47:53 1997 Andrew Cagney <cagney@b1.cygnus.com> |
* remote-sim.h (sim_set_profile_size): Add prototype, document as |
depreciated. |
Tue May 20 09:32:22 1997 Andrew Cagney <cagney@b1.cygnus.com> |
* remote-sim.h (sim_open): Add callback struct. |
(sim_set_callbacks): Drop SIM_DESC argument. Document. |
(sim_size): Remove recently added SIM_DESC argument. Document. |
Mon May 19 19:14:44 1997 Andrew Cagney <cagney@b1.cygnus.com> |
* remote-sim.h: Pass SD into sim_size. |
Thu May 15 01:24:16 1997 Mark Alexander <marka@cygnus.com> |
* obstack.h (obstack_specify_allocation_with_arg, obstack_chunkfun, |
obstack_freefun): Eliminate compile warnings in gdb. |
Tue Apr 22 10:24:34 1997 Fred Fish <fnf@cygnus.com> |
* floatformat.h (floatformat_byteorders): Add comments for previous |
formats and add floatformat_littlebyte_bigword, primarily for ARM. |
Add declaration for floatformat_ieee_double_littlebyte_bigword. |
Fri Apr 18 13:04:49 1997 Andrew Cagney <cagney@b1.cygnus.com> |
* remote-sim.h (sim_stop): New interface - asynchronous |
notification of a request to stop / suspend the running |
simulation. |
* remote-sim.h (enum sim_stop): Add sim_running and sim_polling as |
states for use internal to simulators. |
* callback.h (struct host_callback_strut): Put a magic number at |
the end of the struct to allow basic checking. |
(struct host_callback_struct ): Add poll_quit - so |
that the console etc can be polled at regular intervals. |
Thu Apr 17 02:17:12 1997 Doug Evans <dje@canuck.cygnus.com> |
* remote-sim.h (struct _bfd): Declare. |
(sim_load): Return SIM_RC. New arg `abfd'. |
(sim_create_inferior): Return SIM_RC. Delete arg `start_address'. |
Wed Apr 2 17:09:12 1997 Andrew Cagney <cagney@kremvax.cygnus.com> |
* remote-sim.h (sim_trace, sim_size): Make these global. They |
will go away shortly. |
Wed Apr 2 15:23:49 1997 Doug Evans <dje@canuck.cygnus.com> |
* remote-sim.h (SIM_OPEN_KIND, SIM_RC): New enums. |
(sim_open): New argument `kind'. |
Wed Apr 2 14:45:51 1997 Ian Lance Taylor <ian@cygnus.com> |
* COPYING: Update FSF address. |
Fri Mar 28 15:29:54 1997 Mike Meissner <meissner@cygnus.com> |
* callback.h (top level): Include stdarg.h or varargs.h if |
va_start is not defined. |
(host_callback_struct): Make {,e}vprintf_filtered take a va_list |
instead of void *, since va_list might be an array or structure |
type. |
Fri Mar 28 15:44:41 1997 H.J. Lu <hjl@gnu.ai.mit.edu> |
* libiberty.h (basename): Add prototype for glibc and linux. |
Mon Mar 17 19:22:12 1997 Ian Lance Taylor <ian@cygnus.com> |
* objalloc.h: New file. |
Mon Mar 17 14:57:55 1997 Andrew Cagney <cagney@kremvax.cygnus.com> |
* remote-sim.h: New file, copied in from gdb/remote-sim.h. One |
day this will be placed in a directory of its own. |
Sat Mar 15 19:00:14 1997 Ian Lance Taylor <ian@cygnus.com> |
* obstack.h: Update to current FSF version. |
Thu Mar 6 15:46:59 1997 Andrew Cagney <cagney@kremvax.cygnus.com> |
* callback.h (struct host_callback_struct): Add callbacks - |
flush_stdout, write_stderr, flush_stderr, vprintf_filtered, |
evprintf_filtered. Delete redundant callbacks - printf_filtered. |
Thu Feb 27 23:18:27 1997 Ian Lance Taylor <ian@cygnus.com> |
* bfdlink.h (struct bfd_link_info): Remove lprefix and lprefix_len |
fields. |
Tue Feb 25 00:10:49 1997 Ian Lance Taylor <ian@cygnus.com> |
* dis-asm.h (INIT_DISASSEMBLE_INFO_NO_ARCH): Initialize |
bytes_per_chunk and display_endian. |
Mon Feb 24 17:47:02 1997 Ian Lance Taylor <ian@cygnus.com> |
From Eric Youngdale <eric@andante.jic.com>: |
* bfdlink.h (struct bfd_elf_version_expr): Define. |
(struct bfd_elf_version_deps): Define. |
(struct bfd_elf_version_tree): Define. |
Thu Feb 6 14:20:01 1997 Martin M. Hunt <hunt@pizza.cygnus.com> |
* dis-asm.h: (disassemble_info): Add new fields |
bytes_per_chunk and display_endian to control the |
display of raw instructions. |
Fri Dec 27 22:17:37 1996 Fred Fish <fnf@cygnus.com> |
* dis-asm.h (print_insn_tic80): Declare. |
Sun Dec 8 17:11:12 1996 Doug Evans <dje@canuck.cygnus.com> |
* callback.h (host_callback): New member `error'. |
Wed Nov 20 00:40:23 1996 Doug Evans <dje@canuck.cygnus.com> |
* callback.h: New file, moved here from gdb. |
Mon Nov 18 16:34:00 1996 Dawn Perchik <dawn@critters.cygnus.com> |
* libiberty.h: Checkin again; last checkin failed due to sticky tag. |
Wed Nov 13 08:22:00 1996 Dawn Perchik <dawn@critters.cygnus.com> |
* libiberty.h: Revert last commit due to conflicts with hpux |
system headers. |
Tue Nov 12 16:31:00 1996 Dawn Perchik <dawn@critters.cygnus.com> |
* libiberty.h: Move prototypes from argv.c here. |
Thu Oct 31 14:56:18 1996 Doug Evans <dje@canuck.cygnus.com> |
* ansidecl.h (VPARAMS,VA_START): Define. |
Fri Oct 25 12:08:04 1996 Ian Lance Taylor <ian@cygnus.com> |
* dis-asm.h (disassemble_info): Add bytes_per_line field. |
(INIT_DISASSEMBLE_INFO_NO_ARCH): Initialize bytes_per_line field. |
Thu Oct 24 17:10:01 1996 Ian Lance Taylor <ian@cygnus.com> |
* dis-asm.h (disassemble_info): Add symbol field. |
(INIT_DISASSEMBLE_INFO_NO_ARCH): Initialize symbol field. |
Thu Oct 17 11:17:40 1996 Doug Evans <dje@canuck.cygnus.com> |
* dis-asm.h (print_insn_m32r): Declare. |
Mon Oct 14 23:56:52 1996 Ian Lance Taylor <ian@cygnus.com> |
* libiberty.h: Declare parameter types for xmalloc and xrealloc. |
Thu Oct 3 13:45:27 1996 Ian Lance Taylor <ian@cygnus.com> |
* fnmatch.h: New file. |
Thu Oct 3 10:33:14 1996 Jeffrey A Law (law@cygnus.com) |
* dis-asm.h (print_insn_mn10x00): Delete declaration. |
(print_insn_mn10200, print_insn_mn10300): Declare. |
Wed Oct 2 21:24:43 1996 Jeffrey A Law (law@cygnus.com) |
* dis-asm.h (print_insn_mn10x00): Declare. |
Mon Sep 30 13:56:11 1996 Fred Fish <fnf@cygnus.com> |
* libiberty.h: Remove #ifndef PRIVATE_XMALLOC. |
Sat Aug 31 13:27:06 1996 Jeffrey A Law (law@cygnus.com) |
* dis-asm.h (print_insn_v850): Declare. |
Tue Aug 13 16:10:30 1996 Stu Grossman (grossman@critters.cygnus.com) |
* obstack.h: Change bcopy to memcpy. Works better on Posix |
systems, which generally lack bcopy. |
Mon Aug 12 17:03:18 1996 Stu Grossman (grossman@critters.cygnus.com) |
* ansidecl.h: Change WIN32 to _WIN32. |
Fri Jul 26 13:58:18 1996 Ian Lance Taylor <ian@cygnus.com> |
* dis-asm.h: Add flavour field. |
(print_insn_alpha): Declare. |
(print_insn_alpha_osf, print_insn_alpha_vms): Don't declare. |
(INIT_DISASSEMBLE_INFO): Initialize flavour field. |
Tue Jul 23 17:37:58 1996 Fred Fish <fnf@cygnus.com> |
* libiberty.h (PRIVATE_XMALLOC): Enclose xmalloc/xrealloc |
definitions inside #ifndef so that programs that want to |
can define PRIVATE_XMALLOC and then define xmalloc and |
xrealloc anyway they want. |
(basename): Document in source that we can't declare the |
parameter type because it is declared inconsistently across |
different systems. |
Mon Jul 22 13:16:13 1996 Richard Henderson <rth@tamu.edu> |
* dis-asm.h (print_insn_alpha): Don't declare. |
(print_insn_alpha_osf, print_insn_alpha_vms): Declare. |
Wed Jul 17 14:45:12 1996 Martin M. Hunt <hunt@pizza.cygnus.com> |
* dis-asm.h: (print_insn_d10v): Declare. |
Mon Jul 15 16:55:38 1996 Stu Grossman (grossman@critters.cygnus.com) |
* dis-asm.h: Get rid of decls for print_insn_i8086, |
print_insn_sparc64 and print_insn_sparclite. |
* (INIT_DISASSEMBLE_INFO): Split into two pieces. One, |
INIT_DISASSEMBLE_INFO_NO_ARCH inits everything except for endian, |
mach, and arch. |
Fri Jul 12 10:19:27 1996 Stu Grossman (grossman@critters.cygnus.com) |
* dis-asm.h (print_insn_i8086): Declare. |
Wed Jul 3 16:02:39 1996 Stu Grossman (grossman@critters.cygnus.com) |
* dis-asm.h (print_insn_sparclite): Declare. |
Tue Jun 18 16:02:46 1996 Jeffrey A. Law <law@rtl.cygnus.com> |
* dis-asm.h (print_insn_h8300s): Declare. |
Tue Jun 18 15:11:33 1996 Klaus Kaempf <kkaempf@progis.de> |
* fopen-vms.h: New file. |
Tue Jun 4 18:58:16 1996 Ian Lance Taylor <ian@cygnus.com> |
* bfdlink.h (struct bfd_link_info): Add notice_all field. |
Fri Apr 26 10:33:12 1996 Doug Evans <dje@canuck.cygnus.com> |
* demangle.h (#ifdef IN_GCC): #include "gansidecl.h". |
(PROTO,PTR,const): Delete. |
Mon Apr 22 17:27:42 1996 Ian Lance Taylor <ian@cygnus.com> |
* bfdlink.h (struct bfd_link_info): Add traditional_format field. |
Mon Apr 15 15:16:56 1996 Doug Evans <dje@canuck.cygnus.com> |
* libiberty.h (choose_temp_base): Add prototype. |
Tue Mar 12 17:29:46 1996 Ian Lance Taylor <ian@cygnus.com> |
* bfdlink.h (bfd_wrapped_link_hash_lookup): Declare. |
(struct bfd_link_info): Add wrap_hash field. |
Wed Feb 14 16:49:17 1996 Martin Anantharaman <martin@mail.imech.uni-duisburg.de> |
* ieee.h (ieee_record_enum_type): Define |
ieee_external_reference_info_enum. |
Fri Feb 2 17:09:25 1996 Doug Evans <dje@charmed.cygnus.com> |
* dis-asm.h (DISASM_RAW_INSN): Delete. |
Tue Jan 23 09:21:47 1996 Doug Evans <dje@charmed.cygnus.com> |
* dis-asm.h (INIT_DISASSEMBLE_INFO): Set endian to BFD_ENDIAN_UNKNOWN. |
New argument FPRINTF_FUNC. |
Mon Jan 22 16:37:59 1996 Doug Evans <dje@charmed.cygnus.com> |
* dis-asm.h (disassemble_info): New members arch, mach, endian. |
(INIT_DISASSEMBLE_INFO): Initialize them. |
(DISASM_RAW_INSN{,FLAG}): Define. |
Thu Jan 18 11:32:38 1996 Ian Lance Taylor <ian@cygnus.com> |
* demangle.h (cplus_demangle_opname): Change opname parameter to |
const char *. |
(cplus_mangle_opname): Change return type and opname parameter to |
const char *. |
Fri Jan 5 00:01:22 1996 Ian Lance Taylor <ian@cygnus.com> |
* ieee.h (enum ieee_record): Add ieee_asn_record_enum, |
ieee_at_record_enum, ieee_ty_record_enum, ieee_atn_record_enum, |
ieee_bb_record_enum, and ieee_be_record_enum. |
Wed Jan 3 13:12:09 1996 Fred Fish <fnf@cygnus.com> |
* obstack.h: Update copyright to 1996. |
(_obstack_memory_used): Declare. |
(obstack_memory_used): Define macro. |
Thu Dec 28 11:42:12 1995 Ian Lance Taylor <ian@cygnus.com> |
* libiberty.h (xstrdup): Declare. |
Thu Dec 21 14:47:17 1995 Michael Meissner <meissner@tiktok.cygnus.com> |
* wait.h: Protect all macros with #ifndef. |
Tue Oct 24 21:45:40 1995 Ian Lance Taylor <ian@cygnus.com> |
* bfdlink.h (struct bfd_link_info): Add static_link field. |
Tue Sep 12 16:28:04 1995 Ian Lance Taylor <ian@cygnus.com> |
* bfdlink.h (struct bfd_link_callbacks): Add symbol parameter to |
warning callback. |
Fri Sep 1 13:11:51 1995 Ian Lance Taylor <ian@cygnus.com> |
* bfdlink.h (struct bfd_link_callbacks): Change warning callback |
to take BFD, section, and address arguments. |
Thu Aug 31 16:45:12 1995 steve chamberlain <sac@slash.cygnus.com> |
* bfdlink.h (struct bfd_link_info): Remove PE stuff. |
Tue Aug 22 03:18:23 1995 Ken Raeburn <raeburn@kr-laptop.cygnus.com> |
* libiberty.h: Declare xstrerror. From Pat Rankin. |
Mon Aug 21 18:11:36 1995 steve chamberlain <sac@slash.cygnus.com> |
* bfdlink.h (struct bfd_link_info): Remove PE stuff. |
Wed Aug 2 08:14:12 1995 Doug Evans <dje@canuck.cygnus.com> |
* dis-asm.h (print_insn_sparc64): Declare. |
Mon Jul 10 13:26:49 1995 Eric Youngdale <eric@aib.com> |
* bfdlink.h (struct bfd_link_info): Add new field symbolic. |
Sun Jul 2 17:48:40 1995 Ian Lance Taylor <ian@cygnus.com> |
* bfdlink.h (struct bfd_link_info): Change type of base_file to |
PTR. |
Thu Jun 29 00:02:45 1995 Steve Chamberlain <sac@slash.cygnus.com> |
* bfdlink.h (struct bfd_link_info): Added base_file member. |
Tue Jun 20 16:40:04 1995 Steve Chamberlain <sac@slash.cygnus.com> |
* ansidecl.h: win32s is ANSI enough. |
Thu May 18 04:25:50 1995 Ken Raeburn <raeburn@kr-laptop.cygnus.com> |
Wed May 10 14:28:16 1995 Richard Earnshaw (rearnsha@armltd.co.uk) |
* dis-asm.h (print_insn_arm): Delete declaration. |
(print_insn_{little,big}_arm): New declarations. |
* floatformat.h (floatformat_arm_ext): Declare. |
Sat May 13 10:14:08 1995 Steve Chamberlain <sac@slash.cygnus.com> |
* bfdlink.h (subsytem, stack_heap_parameters): New. |
Thu May 4 14:36:42 1995 Jason Merrill <jason@phydeaux.cygnus.com> |
* demangle.h: Don't include ansidecl.h if IN_GCC. |
Tue Feb 21 00:37:28 1995 Jeff Law (law@snake.cs.utah.edu) |
* hp-symtab.h: Don't use bitfield enumerations, the HP C compiler |
does not handle them correctly. |
Thu Feb 9 14:20:27 1995 Ian Lance Taylor <ian@cygnus.com> |
* libiberty.h (basename): Don't declare parameter type; some |
systems have this in their header files. |
Wed Feb 8 17:35:38 1995 Ian Lance Taylor <ian@cygnus.com> |
* bfdlink.h (struct bfd_link_hash_entry): Change format of common |
symbol information, to remove restrictions on maximum size and |
alignment power, by using a pointer to a structure instead. |
Mon Feb 6 14:55:32 1995 Ian Lance Taylor <ian@cygnus.com> |
* bfdlink.h (enum bfd_link_hash_type): Rename bfd_link_hash_weak |
to bfd_link_hash_undefweak. Add bfd_link_hash_defweak. |
Mon Jan 16 21:00:23 1995 Stan Shebs <shebs@andros.cygnus.com> |
* dis-asm.h (GDB_INIT_DISASSEMBLE_INFO, etc): Remove all |
GDB-specific definitions. |
Sun Jan 15 18:39:35 1995 Steve Chamberlain <sac@splat> |
* dis-asm.h (print_insn_w65): Declare. |
Thu Jan 12 17:51:17 1995 Ken Raeburn <raeburn@cujo.cygnus.com> |
* libiberty.h (hex_p): Fix sense of test. |
Wed Jan 11 22:36:40 1995 Ken Raeburn <raeburn@cujo.cygnus.com> |
* libiberty.h (_hex_array_size, _hex_bad, _hex_value, hex_init, |
hex_p, hex_value): New macros and declarations, for hex.c. |
Fri Jan 6 17:44:14 1995 Ian Lance Taylor <ian@sanguine.cygnus.com> |
* dis-asm.h: Make idempotent. |
Wed Dec 14 13:08:43 1994 Stan Shebs <shebs@andros.cygnus.com> |
* progress.h: New file, empty definitions for progress macros. |
Fri Nov 25 00:14:05 1994 Jeff Law (law@snake.cs.utah.edu) |
* hp-symtab.h: New file describing the debug symbols emitted |
by the HP C compilers. |
Fri Nov 11 15:48:37 1994 Ian Lance Taylor <ian@sanguine.cygnus.com> |
* bfdlink.h (struct bfd_link_hash_entry): Change u.c.size from 24 |
to 26 bits, and change u.c.alignment_power from 8 to 6 bits. 6 |
bit in the alignment power is enough for a 64 bit address space. |
Mon Oct 31 13:02:51 1994 Stan Shebs (shebs@andros.cygnus.com) |
* demangle.h (cplus_mangle_opname): Declare. |
Tue Oct 25 11:38:02 1994 Ian Lance Taylor <ian@sanguine.cygnus.com> |
* bfdlink.h (struct bfd_link_callbacks): Fix comments for |
multiple_common field. |
Sun Sep 04 17:58:10 1994 Richard Earnshaw (rwe@pegasus.esprit.ec.org) |
* dis-asm.h: Add support for the ARM. |
Wed Aug 10 12:51:41 1994 Doug Evans (dje@canuck.cygnus.com) |
* libiberty.h (strsignal): Document its existence even if we |
can't declare it. |
Tue Aug 2 14:40:03 1994 Jim Kingdon (kingdon@lioth.cygnus.com) |
* os9k.h: Remove u_int16, u_int32, and owner_id typedefs and |
expand their uses. Those names conflict with Mach headers. |
Fri Jul 22 14:17:12 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) |
* bfdlink.h (struct bfd_link_hash_entry): Change u.c.size into a |
bitfield. Add field u.c.alignment_power. |
Sun Jul 10 00:26:39 1994 Ian Dall (dall@hfrd.dsto.gov.au) |
* dis-asm.h: Add print_insn_ns32k declaration. |
Mon Jun 20 17:13:29 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) |
* bfdlink.h (bfd_link_hash_table): Make creator a const pointer. |
Sat Jun 18 16:09:32 1994 Stan Shebs (shebs@andros.cygnus.com) |
* demangle.h (cplus_demangle_opname): Declare. |
Thu Jun 16 15:19:03 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* bfdlink.h (struct bfd_link_info): Add new field shared. |
Mon Jun 6 14:39:44 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* bfdlink.h (struct bfd_link_hash_entry): Remove written field: |
not needed for all backends. |
Thu Apr 28 19:06:50 1994 Ken Raeburn (raeburn@cujo.cygnus.com) |
* dis-asm.h (disassembler): Declare. |
Fri Apr 1 00:38:17 1994 Jim Wilson (wilson@mole.gnu.ai.mit.edu) |
* obstack.h: Delete use of IN_GCC to control whether |
stddef.h or gstddef.h is included. |
Tue Mar 22 13:06:02 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* bfdlink.h (enum bfd_link_order_type): Add bfd_data_link_order. |
(struct bfd_link_order): Add data field to union. |
Mon Mar 21 18:45:26 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* bfdlink.h (struct bfd_link_callbacks): Change bitsize argument |
to add_to_set to reloc. Remove bitsize argument from constructor. |
Comment that reloc_overflow, reloc_dangerous and unattached_reloc |
must handle NULL pointers for reloc location. |
(enum bfd_link_order_type): Add bfd_section_reloc_link_order and |
bfd_symbol_reloc_link_order. |
(struct bfd_link_order): Add reloc field to union. |
(struct bfd_link_order_reloc): Define. |
Mon Mar 14 12:27:50 1994 Ian Lance Taylor (ian@cygnus.com) |
* ieee-float.h: Removed; no longer used. |
Tue Mar 1 18:10:49 1994 Kung Hsu (kung@mexican.cygnus.com) |
* os9k.h: os9000 target specific header file, the header of the |
object file is used now. |
Sun Feb 27 21:52:26 1994 Jim Kingdon (kingdon@deneb.cygnus.com) |
* floatformat.h: New file, intended to replace ieee-float.h. |
Sun Feb 20 17:15:42 1994 Ian Lance Taylor (ian@lisa.cygnus.com) |
* ansidecl.h (ANSI_PROTOTYPES): Define if using ANSI prototypes. |
Wed Feb 16 01:07:12 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* libiberty.h: Don't declare strsignal, to avoid conflicts with |
Solaris system header files. |
Sat Feb 12 22:11:32 1994 Jeffrey A. Law (law@snake.cs.utah.edu) |
* libiberty.h (xexit): Use __volatile__ to avoid losing if |
compiling with gcc -traditional. |
Thu Feb 10 14:05:41 1994 Ian Lance Taylor (ian@cygnus.com) |
* libiberty.h: New file. Declares functions provided by |
libiberty. |
Tue Feb 8 05:19:52 1994 David J. Mackenzie (djm@thepub.cygnus.com) |
Handle obstack_chunk_alloc returning NULL. This allows |
obstacks to be used by libraries, without forcing them |
to call exit or longjmp. |
* obstack.h (struct obstack): Add alloc_failed flag. |
_obstack_begin, _obstack_begin_1): Declare to return int, not void. |
(obstack_finish): If alloc_failed, return NULL. |
(obstack_base, obstack_next_free, objstack_object_size): |
If alloc_failed, return 0. |
(obstack_grow, obstack_grow0, obstack_1grow, obstack_ptr_grow, |
obstack_int_grow, obstack_blank): If alloc_failed, do nothing that |
could corrupt the obstack. |
Mon Jan 24 15:06:05 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* bfdlink.h (struct bfd_link_callbacks): Add name, reloc_name and |
addend argments to reloc_overflow callback. |
Fri Jan 21 19:13:12 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* dis-asm.h (print_insn_big_powerpc, print_insn_little_powerpc, |
print_insn_rs6000): Declare. |
Thu Jan 6 14:15:55 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* bfdlink.h (struct bfd_link_callbacks): Add bitsize argument to |
add_to_set field. Add new callback named constructor. |
Thu Dec 30 10:44:06 1993 Ian Lance Taylor (ian@rtl.cygnus.com) |
* bfdlink.h: New file for new BFD linker backend routines. |
Mon Nov 29 10:43:57 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* dis-asm.h (enum dis_insn_tyupe): Remove non-ANSI trailing comma. |
Sat Oct 2 20:42:26 1993 Jim Kingdon (kingdon@lioth.cygnus.com) |
* dis-asm.h: Move comment to right place. |
Mon Aug 9 19:03:35 1993 David J. Mackenzie (djm@thepub.cygnus.com) |
* obstack.h (obstack_chunkfun, obstack_freefun): Add defns from |
previous version. Are these Cygnus local changes? |
Fri Aug 6 17:05:47 1993 David J. Mackenzie (djm@thepub.cygnus.com) |
* getopt.h, obstack.h: Update to latest FSF version. |
Mon Aug 2 14:45:29 1993 John Gilmore (gnu@cygnus.com) |
* dis-asm.h: Move enum outside of struct defn to avoid warnings. |
Mon Aug 2 08:49:30 1993 Stu Grossman (grossman at cygnus.com) |
* wait.h (WEXITSTATUS, WSTOPSIG): Mask down to 8 bits. This is |
for systems that store stuff into the high 16 bits of a wait |
status. |
Fri Jul 30 18:38:02 1993 John Gilmore (gnu@cygnus.com) |
* dis-asm.h: Add new fields insn_info_valid, branch_delay_insns, |
data_size, insn_type, target, target2. These are used to return |
information from the instruction decoders back to the calling |
program. Add comments, make more readable. |
Mon Jul 19 22:14:14 1993 Fred Fish (fnf@deneb.cygnus.com) |
* nlm: New directory containing NLM/NetWare includes. |
Thu Jul 15 12:10:04 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) |
* dis-asm.h (struct disassemble_info): New field application_data. |
Thu Jul 15 12:41:15 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* dis-asm.h: Added declaration of print_insn_m88k. |
Fri Jul 2 10:31:59 1993 Ian Lance Taylor (ian@cygnus.com) |
* ansidecl.h: Use ANSI macros if __mips and _SYSTYPE_SVR4 are |
defined, since RISC/OS cc handles ANSI declarations in SVR4 mode |
but does not define __STDC__. |
Sun Jun 20 18:27:52 1993 Ken Raeburn (raeburn@poseidon.cygnus.com) |
* dis-asm.h: Don't need to include ansidecl.h any more. |
Fri Jun 18 03:22:10 1993 John Gilmore (gnu@cygnus.com) |
* oasys.h: Eliminate "int8_type", "int16_type", "int32_type", and |
their variants. These changes are coordinated with corresponding |
changes in ../bfd/oasys.c. |
Wed Jun 16 10:43:08 1993 Fred Fish (fnf@cygnus.com) |
* bfd.h: Note that it has been removed. |
Tue Jun 8 12:16:03 1993 Steve Chamberlain (sac@phydeaux.cygnus.com) |
Support for H8/300-H |
* dis-asm.h (print_insn_h8300, print_insn_h8300h): Declare it. |
Tue Jun 1 07:35:03 1993 Ken Raeburn (raeburn@kr-pc.cygnus.com) |
* ansidecl.h (const): Don't define it if it's already defined. |
Thu May 27 18:19:51 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) |
* dis-asm.h (print_insn_hppa): Declare it. |
* bfd.h: Moved to bfd directory. Small stub here includes it |
without requiring "-I../bfd". |
Thu Apr 29 12:06:13 1993 Ken Raeburn (raeburn@deneb.cygnus.com) |
* bfd.h: Updated with BSF_FUNCTION. |
Mon Apr 26 18:15:50 1993 Steve Chamberlain (sac@thepub.cygnus.com) |
* bfd.h, dis-asm.h: Updated with Hitachi SH. |
Fri Apr 23 18:41:38 1993 Steve Chamberlain (sac@thepub.cygnus.com) |
* bfd.h: Updated with alpha changes. |
* dis-asm.h: Added alpha. |
Fri Apr 16 17:35:30 1993 Jim Kingdon (kingdon@cygnus.com) |
* bfd.h: Update for signed bfd_*get_*. |
Thu Apr 15 09:24:21 1993 Jim Kingdon (kingdon@cygnus.com) |
* bfd.h: Updated for file_truncated error. |
Thu Apr 8 10:53:47 1993 Ian Lance Taylor (ian@cygnus.com) |
* ansidecl.h: If no ANSI, define const to be empty. |
Thu Apr 1 09:00:10 1993 Jim Kingdon (kingdon@cygnus.com) |
* dis-asm.h: Declare a29k and i960 print_insn_*. |
* dis-asm.h: Add print_address_func and related stuff. |
* dis-asm.h (dis_asm_read_memory): Fix prototype. |
Wed Mar 31 17:40:16 1993 Jim Kingdon (kingdon@lioth.cygnus.com) |
* dis-asm.h: Add print_insn_sparc. |
Wed Mar 31 17:51:42 1993 Ian Lance Taylor (ian@cygnus.com) |
* bfd.h: Updated for BFD_RELOC_MIPS_GPREL and bfd_[gs]et_gp_size |
prototypes. |
Wed Mar 31 16:35:12 1993 Stu Grossman (grossman@cygnus.com) |
* dis-asm.h: (disassemble_info): Fix typo in prototype of |
dis_asm_memory_error(). |
Tue Mar 30 19:09:23 1993 Jim Kingdon (kingdon@lioth.cygnus.com) |
* dis-asm.h (disassembler_info): Add read_memory_func, |
memory_error_func, buffer, and length. |
({GDB_,}INIT_DISASSEMBLE_INFO): Set them. |
print_insn_*: Remove second argument. |
Tue Mar 30 14:48:55 1993 Steve Chamberlain (sac@thepub.cygnus.com) |
* bfd.h: Update for lma field of section. |
Tue Mar 30 12:22:55 1993 Jim Kingdon (kingdon@cygnus.com) |
* ansidecl.h: Use ANSI versions on AIX regardless of __STDC__. |
Fri Mar 19 14:49:49 1993 Steve Chamberlain (sac@thepub.cygnus.com) |
* dis-asm.h: Add h8500. |
Thu Mar 18 13:49:09 1993 Per Bothner (bothner@rtl.cygnus.com) |
* ieee-float.h: Moved from ../gdb. |
* dis-asm.h: New file. Interface to dis-assembler. |
Thu Mar 11 10:52:57 1993 Fred Fish (fnf@cygnus.com) |
* demangle.h (DMGL_NO_OPTS): Add define (set to 0) to use |
in place of bare 0, for readability reasons. |
Tue Mar 2 17:50:11 1993 Fred Fish (fnf@cygnus.com) |
* demangle.h: Replace all references to cfront with ARM. |
Tue Feb 23 12:21:14 1993 Ian Lance Taylor (ian@cygnus.com) |
* bfd.h: Update for new elements in JUMP_TABLE. |
Tue Feb 16 00:51:30 1993 John Gilmore (gnu@cygnus.com) |
* bfd.h: Update for BFD_VERSION 2.1. |
Tue Jan 26 11:49:20 1993 Ian Lance Taylor (ian@cygnus.com) |
* bfd.h: Update for SEC_IS_COMMON flag. |
Tue Jan 19 12:25:12 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* bfd.h: Update for bfd_asymbol_value bug fix. |
Fri Jan 8 16:37:18 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* bfd.h: Update to include ECOFF tdata and target_flavour. |
Sun Dec 27 17:52:30 1992 Fred Fish (fnf@cygnus.com) |
* bfd.h: Add declaration for bfd_get_size(). |
Tue Dec 22 22:42:46 1992 Fred Fish (fnf@cygnus.com) |
* demangle.h: Protect file from multiple inclusions with |
#if !defined(DEMANGLE_H)...#define DEMANGLE_H...#endif. |
Mon Dec 21 21:25:50 1992 Stu Grossman (grossman at cygnus.com) |
* bfd.h: Update to get hppa_core_struct from bfd.c. |
Thu Dec 17 00:42:35 1992 John Gilmore (gnu@cygnus.com) |
* bfd.h: Update to get tekhex tdata name change from bfd. |
Mon Nov 9 23:55:42 1992 John Gilmore (gnu@cygnus.com) |
* ansidecl.h: Update comments to discourage use of EXFUN. |
Thu Nov 5 16:35:44 1992 Ian Lance Taylor (ian@cygnus.com) |
* bfd.h: Update to bring in SEC_SHARED_LIBRARY. |
Thu Nov 5 03:21:32 1992 John Gilmore (gnu@cygnus.com) |
* bfd.h: Update to match EXFUN, bfd_seclet_struct, and SDEF |
cleanups in bfd. |
Wed Nov 4 07:28:05 1992 Ken Raeburn (raeburn@cygnus.com) |
* bout.h (N_CALLNAME, N_BALNAME): Define as char-type values, so |
widening works consistently. |
Fri Oct 16 03:17:08 1992 John Gilmore (gnu@cygnus.com) |
* getopt.h: Update to Revised Standard FSF Version. |
Thu Oct 15 21:43:22 1992 K. Richard Pixley (rich@sendai.cygnus.com) |
* getopt.h (struct option): use the provided enum for has_arg. |
* demangle.h (AUTO_DEMANGLING, GNU_DEMANGLING, |
LUCID_DEMANGLING): ultrix compilers require enums to be |
enums and ints to be ints and casts where they meet. cast some |
enums into ints. |
Thu Oct 15 04:35:51 1992 John Gilmore (gnu@cygnus.com) |
* bfd.h: Update after comment changes. |
Thu Oct 8 09:03:02 1992 Steve Chamberlain (sac@thepub.cygnus.com) |
* bfd.h (bfd_get_symbol_leading_char): new macro for getting in xvec |
Thu Sep 3 09:10:50 1992 Stu Grossman (grossman at cygnus.com) |
* bfd.h (struct reloc_howto_struct): size needs to be signed if |
it's going to hold negative values. |
Sun Aug 30 17:50:27 1992 Per Bothner (bothner@rtl.cygnus.com) |
* demangle.h: New file, moved from ../gdb. Made independent |
of gdb. Allow demangling style option to be passed as a |
parameter to cplus_demangle(), but using the |
current_demangling_style global as the default. |
Sat Aug 29 10:07:55 1992 Fred Fish (fnf@cygnus.com) |
* obstack.h: Merge comment change from current FSF version. |
Thu Aug 27 12:59:29 1992 Brendan Kehoe (brendan@cygnus.com) |
* bfd.h: add we32k |
Tue Aug 25 15:07:47 1992 Steve Chamberlain (sac@thepub.cygnus.com) |
* bfd.h: new after Z8000 stuff |
Mon Aug 17 09:01:23 1992 Ken Raeburn (raeburn@cygnus.com) |
* bfd.h: Regenerated after page/segment size changes. |
Sat Aug 1 13:46:31 1992 Fred Fish (fnf@cygnus.com) |
* obstack.h: Merge changes from current FSF version. |
Mon Jul 20 21:06:23 1992 Fred Fish (fnf@cygnus.com) |
* obstack.h (area_id, flags): Remove, replace with extra_arg, |
use_extra_arg, and maybe_empty_object. |
* obstack.h (OBSTACK_MAYBE_EMPTY_OBJECT, OBSTACK_MMALLOC_LIKE): |
Remove, replaced by maybe_empty_object and use_extra_arg bitfields. |
* obstack.h (obstack_full_begin, _obstack_begin): Remove area_id |
and flags arguments. |
* obstack.h (obstack_alloc_arg): New macro to set extra_arg. |
Thu Jul 16 08:12:44 1992 Steve Chamberlain (sac@thepub.cygnus.com) |
* bfd.h: new after adding BFD_IS_RELAXABLE |
Sat Jul 4 03:22:23 1992 John Gilmore (gnu at cygnus.com) |
* bfd.h: Regen after adding BSF_FILE. |
Mon Jun 29 14:18:36 1992 Fred Fish (fnf at sunfish) |
* obstack.h: Convert bcopy() use to memcpy(), which is more |
portable, more standard, and can take advantage of gcc's builtin |
functions for increased performance. |
Thu Jun 25 04:46:08 1992 John Gilmore (gnu at cygnus.com) |
* ansidecl.h (PARAMS): Incorporate this macro from gdb's defs.h. |
It's a cleaner way to forward-declare function prototypes. |
Fri Jun 19 15:46:32 1992 Stu Grossman (grossman at cygnus.com) |
* bfd.h: HPPA merge. |
Tue Jun 16 21:30:56 1992 K. Richard Pixley (rich@cygnus.com) |
* getopt.h: gratuitous white space changes merged from other prep |
releases. |
Thu Jun 11 01:10:55 1992 John Gilmore (gnu at cygnus.com) |
* bfd.h: Regen'd from bfd.c after removing elf_core_tdata_struct. |
Mon May 18 17:29:03 1992 K. Richard Pixley (rich@cygnus.com) |
* getopt.h: merged changes from make-3.62.11. |
* getopt.h: merged changes from grep-1.6 (alpha). |
Fri May 8 14:53:32 1992 K. Richard Pixley (rich@cygnus.com) |
* getopt.h: merged changes from bison-1.18. |
Sat Mar 14 17:25:20 1992 Fred Fish (fnf@cygnus.com) |
* obstack.h: Add "area_id" and "flags" members to obstack |
structure. Add obstack_chunkfun() and obstack_freefun() to |
set functions explicitly. Convert maybe_empty_object to |
a bit in "flags". |
Thu Feb 27 22:01:02 1992 Per Bothner (bothner@cygnus.com) |
* wait.h (WIFSTOPPED): Add IBM rs6000-specific version. |
Fri Feb 21 20:49:20 1992 John Gilmore (gnu at cygnus.com) |
* obstack.h: Add obstack_full_begin. |
* bfd.h, obstack.h: Protolint. |
Thu Jan 30 01:18:42 1992 John Gilmore (gnu at cygnus.com) |
* bfd.h: Remove comma from enum declaration. |
Mon Jan 27 22:01:13 1992 Steve Chamberlain (sac at cygnus.com) |
* bfd.h : new target entr, bfd_relax_section |
Wed Dec 18 17:19:44 1991 Stu Grossman (grossman at cygnus.com) |
* bfd.h, ieee.h: ANSIfy enums. |
Thu Dec 12 20:59:56 1991 John Gilmore (gnu at cygnus.com) |
* fopen-same.h, fopen-bin.h: New files for configuring |
whether fopen distinguishes binary files or not. For use |
by host-dependent config files. |
Sat Nov 30 20:46:43 1991 Steve Chamberlain (sac at rtl.cygnus.com) |
* bfd.h: change the documentation format. |
* created coff, elf and opcode and aout directories. Moved: |
aout64.h ==> aout/aout64.h |
ar.h ==> aout/ar.h |
a.out.encap.h ==> aout/encap.h |
a.out.host.h ==> aout/host.h |
a.out.hp.h ==> aout/hp.h |
a.out.sun4.h ==> aout/sun4.h |
ranlib.h ==> aout/ranlib.h |
reloc.h ==> aout/reloc.h |
stab.def ==> aout/stab.def |
stab.gnu.h ==> aout/stab_gnu.h |
coff-a29k.h ==> coff/a29k.h |
coff-h8300.h ==> coff/h8300.h |
coff-i386.h ==> coff/i386.h |
coff-i960.h ==> coff/i960.h |
internalcoff.h ==> coff/internal.h |
coff-m68k.h ==> coff/m68k.h |
coff-m88k.h ==> coff/m88k.h |
coff-mips.h ==> coff/mips.h |
coff-rs6000.h ==> coff/rs6000.h |
elf-common.h ==> elf/common.h |
dwarf.h ==> elf/dwarf.h |
elf-external.h ==> elf/external.h |
elf-internal.h ==> elf/internal.h |
a29k-opcode.h ==> opcode/a29k.h |
arm-opcode.h ==> opcode/arm.h |
h8300-opcode.h ==> opcode/h8300.h |
i386-opcode.h ==> opcode/i386.h |
i860-opcode.h ==> opcode/i860.h |
i960-opcode.h ==> opcode/i960.h |
m68k-opcode.h ==> opcode/m68k.h |
m88k-opcode.h ==> opcode/m88k.h |
mips-opcode.h ==> opcode/mips.h |
np1-opcode.h ==> opcode/np1.h |
ns32k-opcode.h ==> opcode/ns32k.h |
pn-opcode.h ==> opcode/pn.h |
pyr-opcode.h ==> opcode/pyr.h |
sparc-opcode.h ==> opcode/sparc.h |
tahoe-opcode.h ==> opcode/tahoe.h |
vax-opcode.h ==> opcode/vax.h |
Wed Nov 27 10:38:31 1991 Steve Chamberlain (sac at rtl.cygnus.com) |
* internalcoff.h: (internal_scnhdr) took out #def dependency, now |
s_nreloc and s_nlnno are always long. (internal_reloc): allways |
has an offset field now. |
Fri Nov 22 08:12:58 1991 John Gilmore (gnu at cygnus.com) |
* coff-rs6000.h: Lint; use unsigned chars for external fields. |
* internalcoff.h: Lint; cast storage classes to signed char. |
Thu Nov 21 21:01:05 1991 Per Bothner (bothner at cygnus.com) |
* stab.def: Remove the GNU extended type codes (e.g. N_SETT). |
* aout64.h: The heuristic for distinguishing between |
sunos-style and bsd-style ZMAGIC files (wrt. where the |
text segment starts) is moved into (the default definition of) |
the macro N_HEADER_IN_TEXT. This definition is only used |
if no other definition is used - e.g. bfd/newsos3.c defines |
N_HEADER_IN_TEXT(x) to be always 0 (as before). |
Thu Nov 21 11:53:03 1991 John Gilmore (gnu at cygnus.com) |
* aout64.h (N_TXTADDR, N_TXTOFF, N_TXTSIZE): New definitions |
that should handle all uses. LOGICAL_ versions deleted. |
Eliminate N_HEADER_IN_TEXT, using a_entry to determine which |
kind of zmagic a.out file we are looking at. |
* coff-rs6000.h: Typo. |
Tue Nov 19 18:43:37 1991 Per Bothner (bothner at cygnus.com) |
(Note: This is a revised entry, as was aout64.h.) |
* aout64.h: Some cleanups of N_TXTADDR and N_TXTOFF: |
Will now work for both old- and new-style ZMAGIC files, |
depending on N_HEADER_IN_TEXT macro. |
Add LOGICAL_TXTADDR, LOICAL_TXTOFF and LOGICAL_TXTSIZE |
that don't count the exec header as part |
of the text segment, to be consistent with bfd. |
* a.out.sun4.h: Simplified/fixed for previous change. |
Mon Nov 18 00:02:06 1991 Fred Fish (fnf at cygnus.com) |
* dwarf.h: Update to DWARF draft 5 version from gcc2. |
Thu Nov 14 19:44:59 1991 Per Bothner (bothner at cygnus.com) |
* stab.def: Added defs for extended GNU symbol types, |
such as N_SETT. These are normally ifdef'd out (because |
of conflicts with a.out.gnu.h), but are used by bfb_stab_name(). |
Thu Nov 14 19:17:03 1991 Fred Fish (fnf at cygnus.com) |
* elf-common.h: Add defines to support ELF symbol table code. |
Mon Nov 11 19:01:06 1991 Fred Fish (fnf at cygnus.com) |
* elf-internal.h, elf-external.h, elf-common.h: Add support for |
note sections, which are used in ELF core files to hold copies |
of various /proc structures. |
Thu Nov 7 08:58:26 1991 Steve Chamberlain (sac at cygnus.com) |
* internalcoff.h: took out the M88 dependency in the lineno |
struct. |
* coff-m88k.h: defines GET_LINENO_LNNO and PUT_LINENO_LNNO to use |
32bit linno entries. |
* a29k-opcode.h: fixed encoding of mtacc |
Sun Nov 3 11:54:22 1991 Per Bothner (bothner at cygnus.com) |
* bfd.h: Updated from ../bfd/bfd-in.h (q.v). |
Fri Nov 1 11:13:53 1991 John Gilmore (gnu at cygnus.com) |
* internalcoff.h: Add x_csect defines. |
Fri Oct 25 03:18:20 1991 John Gilmore (gnu at cygnus.com) |
* Rename COFF-related files in `coff-ARCH.h' form. |
coff-a29k.h, coff-i386.h, coff-i960.h, coff-m68k.h, coff-m88k.h, |
coff-mips.h, coff-rs6000.h to be exact. |
Thu Oct 24 22:11:11 1991 John Gilmore (gnu at cygnus.com) |
RS/6000 support, by Metin G. Ozisik, Mimi Phûông-Thåo Võ, and |
John Gilmore. |
* a.out.gnu.h: Update slightly. |
* bfd.h: Add new error code, fix doc, add bfd_arch_rs6000. |
* internalcoff.h: Add more F_ codes for filehdr. Add |
rs/6000-dependent fields to aouthdr. Add storage classes |
to syments. Add 6000-specific auxent. Add r_size in reloc. |
* rs6000coff.c: New file. |
Thu Oct 24 04:13:20 1991 Fred Fish (fnf at cygnus.com) |
* dwarf.h: New file for dwarf support. Copied from gcc2 |
distribution. |
Wed Oct 16 13:31:45 1991 John Gilmore (gnu at cygnus.com) |
* aout64.h: Remove PAGE_SIZE defines; they are target-dependent. |
Add N_FN_SEQ for N_FN symbol type used on Sequent machines. |
* stab.def: Include N_FN_SEQ in table. |
* bout.h: External formats of structures use unsigned chars. |
Fri Oct 11 12:40:43 1991 Steve Chamberlain (steve at cygnus.com) |
* bfd.h:upgrade from bfd.c |
* internalcoff.h: add n_name, n_zeroes and n_offset macros |
* amdcoff.h: Define OMAGIC and AOUTHDRSZ. |
Fri Oct 11 10:58:06 1991 Per Bothner (bothner at cygnus.com) |
* a.out.host.h: Change SEGMENT_SIZE to 0x1000 for Sony. |
* bfd.h (align_power): Add (actually move) comment. |
Tue Oct 8 15:29:32 1991 Per Bothner (bothner at cygnus.com) |
* sys/h-rtbsd.h: Define MISSING_VFPRINT (for binutils/bucomm.c). |
Sun Oct 6 19:24:39 1991 John Gilmore (gnu at cygnus.com) |
* aout64.h: Move struct internal_exec to ../bfd/libaout.h so |
it can be shared by all `a.out-family' code. Rename |
EXTERNAL_LIST_SIZE to EXTERNAL_NLIST_SIZE. Use basic types |
for nlist members, and make strx integral rather than pointer. |
More commentary on n_type values. |
* bout.h: Provide a struct external_exec rather than an |
internal_exec. |
* m68kcoff.h: Remove `tagentries' which snuck in from the i960 |
COFF port. |
Fri Oct 4 01:25:59 1991 John Gilmore (gnu at cygnus.com) |
* h8300-opcode.h: Remove `_enum' from the typedef for an enum. |
* bfd.h: Update to match bfd changes. |
* sys/h-i386mach.h, sysdep.h: Add 386 Mach host support. |
Tue Oct 1 04:58:42 1991 John Gilmore (gnu at cygnus.com) |
* bfd.h, elf-common.h, elf-external.h, elf-internal.h: |
Add preliminary ELF support, sufficient for GDB, from Fred Fish. |
* sysdep.h, sys/h-amix.h: Support Amiga SVR4. |
* sys/h-vaxult.h: Make it work. (David Taylor <taylor@think.com>) |
* a.out.vax.h: Remove unused and confusing file. |
Mon Sep 30 12:52:35 1991 Per Bothner (bothner at cygnus.com) |
* sysdep.h: Define NEWSOS3_SYS, and use it. |
Fri Sep 20 13:38:21 1991 John Gilmore (gnu at cygnus.com) |
* a.out.gnu.h (N_FN): Its value *really is* 0x1F. |
Fix it, and add comments warning about or-ing N_EXT with it |
and/or N_WARNING. |
* aout64.h (N_FN): Fix value, add comments about N_EXT. |
* stab.def (table at end): Update to show all the type |
values <0x20, including low order bits. Move N_FN to |
its rightful place. |
Tue Sep 17 17:41:37 1991 Stu Grossman (grossman at cygnus.com) |
* sys/h-irix3.h: sgi/irix support. |
Tue Sep 17 07:52:59 1991 John Gilmore (gnu at cygint.cygnus.com) |
* stab.def (N_DEFD): Add GNU Modula-2 debug stab, from Andrew |
Beers. |
Thu Sep 12 14:12:59 1991 John Gilmore (gnu at cygint.cygnus.com) |
* internalcoff.h (SYMNMLEN, FILNMLEN, DIMNUM): Define these |
for internalcoff, separately from the various external coff's. |
* amdcoff.h, bcs88kcoff.h, i386coff.h, intel-coff.h, m68kcoff.h, |
m88k-bcs.h: Prefix SYMNMLEN, FILNMLEN, and DIMNUM with E_'s for |
the external struct definitions. |
* ecoff.h: Remove these #define's, kludge no longer needed. |
* sys/h-ultra3.h: Add new Ultracomputer host. |
* sysdep.h: Add ULTRA3_SYM1_SYS and use it. |
Tue Sep 10 10:11:46 1991 John Gilmore (gnu at cygint.cygnus.com) |
* i386coff.h (LINESZ): Always 6, not based on sizeof(). |
(Fix from Peter Schauer <pes@regent.e-technik.tu-muenchen.de>.) |
Wed Sep 4 08:58:37 1991 John Gilmore (gnu at cygint.cygnus.com) |
* a.out.gnu.h, aout64.h: Add N_WARNING. Change N_FN to 0x0E, |
to match SunOS and BSD. Add N_COMM as 0x12 for SunOS shared lib |
support. |
* stab.def: Add N_COMM to table, fix overlap comment. |
Tue Sep 3 06:29:20 1991 John Gilmore (gnu at cygint.cygnus.com) |
Merge with latest FSF versions of these files. |
* stab.gnu.h: Add LAST_UNUSED_STAB_CODE. |
* stab.def: Update to GPL2. Move N_WARNING out, since not a |
debug symbol. Change comments, and reorder table to numeric |
order. Update final table comment. |
(N_DSLINE, N_BSLINE): Renumber from 0x66 and 0x68, to 0x46 and 0x48. |
* obstack.h: GPL2. Merge. |
Fri Aug 23 01:54:23 1991 John Gilmore (gnu at cygint.cygnus.com) |
* a.out.gnu.h, a.out.sun4.h: Make SEGMENT_SIZE able to depend |
on the particular a.out being examined. |
* a.out.sun4.h: Define segment sizes for Sun-3's and Sun-4's. |
* FIXME: a.out.gnu.h is almost obsolete. |
* FIXME: a.out.sun4.h should be renamed a.out.sun.h now. |
Wed Aug 21 20:32:13 1991 John Gilmore (gnu at cygint.cygnus.com) |
* Start a ChangeLog for the includes directory. |
* a.out.gnu.h (N_FN): Fix value -- was 15, should be 0x1E. |
* stab.def: Update allocation table in comments at end, |
to reflect reality as I know it. |
Copyright (C) 1993-2003 Free Software Foundation, Inc. |
Copying and distribution of this file, with or without modification, |
are permitted in any medium without royalty provided the copyright |
notice and this notice are preserved. |
Local Variables: |
mode: change-log |
left-margin: 8 |
fill-column: 74 |
version-control: never |
End: |
/contrib/toolchain/binutils/include/MAINTAINERS |
---|
0,0 → 1,7 |
See ../binutils/MAINTAINERS |
Copyright (C) 2012 Free Software Foundation, Inc. |
Copying and distribution of this file, with or without modification, |
are permitted in any medium without royalty provided the copyright |
notice and this notice are preserved. |
/contrib/toolchain/binutils/include/alloca-conf.h |
---|
0,0 → 1,60 |
/* Copyright 2012 Free Software Foundation, Inc. |
This program is free software: you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
#include "config.h" |
/* This is a merge of code recommended in the autoconf-2.61 documentation |
with that recommended in the autoconf-2.13 documentation, with added |
tweaks to heed C_ALLOCA. */ |
#if defined HAVE_ALLOCA_H && !defined C_ALLOCA |
# include <alloca.h> |
#else |
# if defined __GNUC__ && !defined C_ALLOCA |
# if !defined alloca |
# define alloca __builtin_alloca |
# endif |
# else |
# if defined _AIX |
/* Indented so that pre-ansi C compilers will ignore it, rather than |
choke on it. Some versions of AIX require this to be the first |
thing seen by the compiler except for comments and preprocessor |
directives. */ |
#pragma alloca |
# else |
# if defined _MSC_VER && !defined C_ALLOCA |
# include <malloc.h> |
# define alloca _alloca |
# else |
# if !defined alloca |
# if defined __STDC__ || defined __hpux |
# if defined HAVE_STDDEF_H |
# include <stddef.h> |
# if defined __cplusplus |
extern "C" void *alloca (size_t); |
# else |
extern void *alloca (size_t); |
# endif |
# else |
extern void *alloca (); |
# endif |
# else |
extern char *alloca (); |
# endif |
# endif |
# endif |
# endif |
# endif |
#endif |
/contrib/toolchain/binutils/include/ansidecl.h |
---|
0,0 → 1,441 |
/* ANSI and traditional C compatability macros |
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, |
2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010 |
Free Software Foundation, Inc. |
This file is part of the GNU C Library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
/* ANSI and traditional C compatibility macros |
ANSI C is assumed if __STDC__ is #defined. |
Macro ANSI C definition Traditional C definition |
----- ---- - ---------- ----------- - ---------- |
ANSI_PROTOTYPES 1 not defined |
PTR `void *' `char *' |
PTRCONST `void *const' `char *' |
LONG_DOUBLE `long double' `double' |
const not defined `' |
volatile not defined `' |
signed not defined `' |
VA_START(ap, var) va_start(ap, var) va_start(ap) |
Note that it is safe to write "void foo();" indicating a function |
with no return value, in all K+R compilers we have been able to test. |
For declaring functions with prototypes, we also provide these: |
PARAMS ((prototype)) |
-- for functions which take a fixed number of arguments. Use this |
when declaring the function. When defining the function, write a |
K+R style argument list. For example: |
char *strcpy PARAMS ((char *dest, char *source)); |
... |
char * |
strcpy (dest, source) |
char *dest; |
char *source; |
{ ... } |
VPARAMS ((prototype, ...)) |
-- for functions which take a variable number of arguments. Use |
PARAMS to declare the function, VPARAMS to define it. For example: |
int printf PARAMS ((const char *format, ...)); |
... |
int |
printf VPARAMS ((const char *format, ...)) |
{ |
... |
} |
For writing functions which take variable numbers of arguments, we |
also provide the VA_OPEN, VA_CLOSE, and VA_FIXEDARG macros. These |
hide the differences between K+R <varargs.h> and C89 <stdarg.h> more |
thoroughly than the simple VA_START() macro mentioned above. |
VA_OPEN and VA_CLOSE are used *instead of* va_start and va_end. |
Immediately after VA_OPEN, put a sequence of VA_FIXEDARG calls |
corresponding to the list of fixed arguments. Then use va_arg |
normally to get the variable arguments, or pass your va_list object |
around. You do not declare the va_list yourself; VA_OPEN does it |
for you. |
Here is a complete example: |
int |
printf VPARAMS ((const char *format, ...)) |
{ |
int result; |
VA_OPEN (ap, format); |
VA_FIXEDARG (ap, const char *, format); |
result = vfprintf (stdout, format, ap); |
VA_CLOSE (ap); |
return result; |
} |
You can declare variables either before or after the VA_OPEN, |
VA_FIXEDARG sequence. Also, VA_OPEN and VA_CLOSE are the beginning |
and end of a block. They must appear at the same nesting level, |
and any variables declared after VA_OPEN go out of scope at |
VA_CLOSE. Unfortunately, with a K+R compiler, that includes the |
argument list. You can have multiple instances of VA_OPEN/VA_CLOSE |
pairs in a single function in case you need to traverse the |
argument list more than once. |
For ease of writing code which uses GCC extensions but needs to be |
portable to other compilers, we provide the GCC_VERSION macro that |
simplifies testing __GNUC__ and __GNUC_MINOR__ together, and various |
wrappers around __attribute__. Also, __extension__ will be #defined |
to nothing if it doesn't work. See below. |
This header also defines a lot of obsolete macros: |
CONST, VOLATILE, SIGNED, PROTO, EXFUN, DEFUN, DEFUN_VOID, |
AND, DOTS, NOARGS. Don't use them. */ |
#ifndef _ANSIDECL_H |
#define _ANSIDECL_H 1 |
#ifdef __cplusplus |
extern "C" { |
#endif |
/* Every source file includes this file, |
so they will all get the switch for lint. */ |
/* LINTLIBRARY */ |
/* Using MACRO(x,y) in cpp #if conditionals does not work with some |
older preprocessors. Thus we can't define something like this: |
#define HAVE_GCC_VERSION(MAJOR, MINOR) \ |
(__GNUC__ > (MAJOR) || (__GNUC__ == (MAJOR) && __GNUC_MINOR__ >= (MINOR))) |
and then test "#if HAVE_GCC_VERSION(2,7)". |
So instead we use the macro below and test it against specific values. */ |
/* This macro simplifies testing whether we are using gcc, and if it |
is of a particular minimum version. (Both major & minor numbers are |
significant.) This macro will evaluate to 0 if we are not using |
gcc at all. */ |
#ifndef GCC_VERSION |
#define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__) |
#endif /* GCC_VERSION */ |
#if defined (__STDC__) || defined(__cplusplus) || defined (_AIX) || (defined (__mips) && defined (_SYSTYPE_SVR4)) || defined(_WIN32) |
/* All known AIX compilers implement these things (but don't always |
define __STDC__). The RISC/OS MIPS compiler defines these things |
in SVR4 mode, but does not define __STDC__. */ |
/* eraxxon@alumni.rice.edu: The Compaq C++ compiler, unlike many other |
C++ compilers, does not define __STDC__, though it acts as if this |
was so. (Verified versions: 5.7, 6.2, 6.3, 6.5) */ |
#define ANSI_PROTOTYPES 1 |
#define PTR void * |
#define PTRCONST void *const |
#define LONG_DOUBLE long double |
/* PARAMS is often defined elsewhere (e.g. by libintl.h), so wrap it in |
a #ifndef. */ |
#ifndef PARAMS |
#define PARAMS(ARGS) ARGS |
#endif |
#define VPARAMS(ARGS) ARGS |
#define VA_START(VA_LIST, VAR) va_start(VA_LIST, VAR) |
/* variadic function helper macros */ |
/* "struct Qdmy" swallows the semicolon after VA_OPEN/VA_FIXEDARG's |
use without inhibiting further decls and without declaring an |
actual variable. */ |
#define VA_OPEN(AP, VAR) { va_list AP; va_start(AP, VAR); { struct Qdmy |
#define VA_CLOSE(AP) } va_end(AP); } |
#define VA_FIXEDARG(AP, T, N) struct Qdmy |
#undef const |
#undef volatile |
#undef signed |
/* inline requires special treatment; it's in C99, and GCC >=2.7 supports |
it too, but it's not in C89. */ |
#undef inline |
#if __STDC_VERSION__ >= 199901L || defined(__cplusplus) || (defined(__SUNPRO_C) && defined(__C99FEATURES__)) |
/* it's a keyword */ |
#else |
# if GCC_VERSION >= 2007 |
# define inline __inline__ /* __inline__ prevents -pedantic warnings */ |
# else |
# define inline /* nothing */ |
# endif |
#endif |
/* These are obsolete. Do not use. */ |
#ifndef IN_GCC |
#define CONST const |
#define VOLATILE volatile |
#define SIGNED signed |
#define PROTO(type, name, arglist) type name arglist |
#define EXFUN(name, proto) name proto |
#define DEFUN(name, arglist, args) name(args) |
#define DEFUN_VOID(name) name(void) |
#define AND , |
#define DOTS , ... |
#define NOARGS void |
#endif /* ! IN_GCC */ |
#else /* Not ANSI C. */ |
#undef ANSI_PROTOTYPES |
#define PTR char * |
#define PTRCONST PTR |
#define LONG_DOUBLE double |
#define PARAMS(args) () |
#define VPARAMS(args) (va_alist) va_dcl |
#define VA_START(va_list, var) va_start(va_list) |
#define VA_OPEN(AP, VAR) { va_list AP; va_start(AP); { struct Qdmy |
#define VA_CLOSE(AP) } va_end(AP); } |
#define VA_FIXEDARG(AP, TYPE, NAME) TYPE NAME = va_arg(AP, TYPE) |
/* some systems define these in header files for non-ansi mode */ |
#undef const |
#undef volatile |
#undef signed |
#undef inline |
#define const |
#define volatile |
#define signed |
#define inline |
#ifndef IN_GCC |
#define CONST |
#define VOLATILE |
#define SIGNED |
#define PROTO(type, name, arglist) type name () |
#define EXFUN(name, proto) name() |
#define DEFUN(name, arglist, args) name arglist args; |
#define DEFUN_VOID(name) name() |
#define AND ; |
#define DOTS |
#define NOARGS |
#endif /* ! IN_GCC */ |
#endif /* ANSI C. */ |
/* Define macros for some gcc attributes. This permits us to use the |
macros freely, and know that they will come into play for the |
version of gcc in which they are supported. */ |
#if (GCC_VERSION < 2007) |
# define __attribute__(x) |
#endif |
/* Attribute __malloc__ on functions was valid as of gcc 2.96. */ |
#ifndef ATTRIBUTE_MALLOC |
# if (GCC_VERSION >= 2096) |
# define ATTRIBUTE_MALLOC __attribute__ ((__malloc__)) |
# else |
# define ATTRIBUTE_MALLOC |
# endif /* GNUC >= 2.96 */ |
#endif /* ATTRIBUTE_MALLOC */ |
/* Attributes on labels were valid as of gcc 2.93 and g++ 4.5. For |
g++ an attribute on a label must be followed by a semicolon. */ |
#ifndef ATTRIBUTE_UNUSED_LABEL |
# ifndef __cplusplus |
# if GCC_VERSION >= 2093 |
# define ATTRIBUTE_UNUSED_LABEL ATTRIBUTE_UNUSED |
# else |
# define ATTRIBUTE_UNUSED_LABEL |
# endif |
# else |
# if GCC_VERSION >= 4005 |
# define ATTRIBUTE_UNUSED_LABEL ATTRIBUTE_UNUSED ; |
# else |
# define ATTRIBUTE_UNUSED_LABEL |
# endif |
# endif |
#endif |
/* Similarly to ARG_UNUSED below. Prior to GCC 3.4, the C++ frontend |
couldn't parse attributes placed after the identifier name, and now |
the entire compiler is built with C++. */ |
#ifndef ATTRIBUTE_UNUSED |
#if GCC_VERSION >= 3004 |
# define ATTRIBUTE_UNUSED __attribute__ ((__unused__)) |
#else |
#define ATTRIBUTE_UNUSED |
#endif |
#endif /* ATTRIBUTE_UNUSED */ |
/* Before GCC 3.4, the C++ frontend couldn't parse attributes placed after the |
identifier name. */ |
#if ! defined(__cplusplus) || (GCC_VERSION >= 3004) |
# define ARG_UNUSED(NAME) NAME ATTRIBUTE_UNUSED |
#else /* !__cplusplus || GNUC >= 3.4 */ |
# define ARG_UNUSED(NAME) NAME |
#endif /* !__cplusplus || GNUC >= 3.4 */ |
#ifndef ATTRIBUTE_NORETURN |
#define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__)) |
#endif /* ATTRIBUTE_NORETURN */ |
/* Attribute `nonnull' was valid as of gcc 3.3. */ |
#ifndef ATTRIBUTE_NONNULL |
# if (GCC_VERSION >= 3003) |
# define ATTRIBUTE_NONNULL(m) __attribute__ ((__nonnull__ (m))) |
# else |
# define ATTRIBUTE_NONNULL(m) |
# endif /* GNUC >= 3.3 */ |
#endif /* ATTRIBUTE_NONNULL */ |
/* Attribute `pure' was valid as of gcc 3.0. */ |
#ifndef ATTRIBUTE_PURE |
# if (GCC_VERSION >= 3000) |
# define ATTRIBUTE_PURE __attribute__ ((__pure__)) |
# else |
# define ATTRIBUTE_PURE |
# endif /* GNUC >= 3.0 */ |
#endif /* ATTRIBUTE_PURE */ |
/* Use ATTRIBUTE_PRINTF when the format specifier must not be NULL. |
This was the case for the `printf' format attribute by itself |
before GCC 3.3, but as of 3.3 we need to add the `nonnull' |
attribute to retain this behavior. */ |
#ifndef ATTRIBUTE_PRINTF |
#define ATTRIBUTE_PRINTF(m, n) __attribute__ ((__format__ (__printf__, m, n))) ATTRIBUTE_NONNULL(m) |
#define ATTRIBUTE_PRINTF_1 ATTRIBUTE_PRINTF(1, 2) |
#define ATTRIBUTE_PRINTF_2 ATTRIBUTE_PRINTF(2, 3) |
#define ATTRIBUTE_PRINTF_3 ATTRIBUTE_PRINTF(3, 4) |
#define ATTRIBUTE_PRINTF_4 ATTRIBUTE_PRINTF(4, 5) |
#define ATTRIBUTE_PRINTF_5 ATTRIBUTE_PRINTF(5, 6) |
#endif /* ATTRIBUTE_PRINTF */ |
/* Use ATTRIBUTE_FPTR_PRINTF when the format attribute is to be set on |
a function pointer. Format attributes were allowed on function |
pointers as of gcc 3.1. */ |
#ifndef ATTRIBUTE_FPTR_PRINTF |
# if (GCC_VERSION >= 3001) |
# define ATTRIBUTE_FPTR_PRINTF(m, n) ATTRIBUTE_PRINTF(m, n) |
# else |
# define ATTRIBUTE_FPTR_PRINTF(m, n) |
# endif /* GNUC >= 3.1 */ |
# define ATTRIBUTE_FPTR_PRINTF_1 ATTRIBUTE_FPTR_PRINTF(1, 2) |
# define ATTRIBUTE_FPTR_PRINTF_2 ATTRIBUTE_FPTR_PRINTF(2, 3) |
# define ATTRIBUTE_FPTR_PRINTF_3 ATTRIBUTE_FPTR_PRINTF(3, 4) |
# define ATTRIBUTE_FPTR_PRINTF_4 ATTRIBUTE_FPTR_PRINTF(4, 5) |
# define ATTRIBUTE_FPTR_PRINTF_5 ATTRIBUTE_FPTR_PRINTF(5, 6) |
#endif /* ATTRIBUTE_FPTR_PRINTF */ |
/* Use ATTRIBUTE_NULL_PRINTF when the format specifier may be NULL. A |
NULL format specifier was allowed as of gcc 3.3. */ |
#ifndef ATTRIBUTE_NULL_PRINTF |
# if (GCC_VERSION >= 3003) |
# define ATTRIBUTE_NULL_PRINTF(m, n) __attribute__ ((__format__ (__printf__, m, n))) |
# else |
# define ATTRIBUTE_NULL_PRINTF(m, n) |
# endif /* GNUC >= 3.3 */ |
# define ATTRIBUTE_NULL_PRINTF_1 ATTRIBUTE_NULL_PRINTF(1, 2) |
# define ATTRIBUTE_NULL_PRINTF_2 ATTRIBUTE_NULL_PRINTF(2, 3) |
# define ATTRIBUTE_NULL_PRINTF_3 ATTRIBUTE_NULL_PRINTF(3, 4) |
# define ATTRIBUTE_NULL_PRINTF_4 ATTRIBUTE_NULL_PRINTF(4, 5) |
# define ATTRIBUTE_NULL_PRINTF_5 ATTRIBUTE_NULL_PRINTF(5, 6) |
#endif /* ATTRIBUTE_NULL_PRINTF */ |
/* Attribute `sentinel' was valid as of gcc 3.5. */ |
#ifndef ATTRIBUTE_SENTINEL |
# if (GCC_VERSION >= 3005) |
# define ATTRIBUTE_SENTINEL __attribute__ ((__sentinel__)) |
# else |
# define ATTRIBUTE_SENTINEL |
# endif /* GNUC >= 3.5 */ |
#endif /* ATTRIBUTE_SENTINEL */ |
#ifndef ATTRIBUTE_ALIGNED_ALIGNOF |
# if (GCC_VERSION >= 3000) |
# define ATTRIBUTE_ALIGNED_ALIGNOF(m) __attribute__ ((__aligned__ (__alignof__ (m)))) |
# else |
# define ATTRIBUTE_ALIGNED_ALIGNOF(m) |
# endif /* GNUC >= 3.0 */ |
#endif /* ATTRIBUTE_ALIGNED_ALIGNOF */ |
/* Useful for structures whose layout must much some binary specification |
regardless of the alignment and padding qualities of the compiler. */ |
#ifndef ATTRIBUTE_PACKED |
# define ATTRIBUTE_PACKED __attribute__ ((packed)) |
#endif |
/* Attribute `hot' and `cold' was valid as of gcc 4.3. */ |
#ifndef ATTRIBUTE_COLD |
# if (GCC_VERSION >= 4003) |
# define ATTRIBUTE_COLD __attribute__ ((__cold__)) |
# else |
# define ATTRIBUTE_COLD |
# endif /* GNUC >= 4.3 */ |
#endif /* ATTRIBUTE_COLD */ |
#ifndef ATTRIBUTE_HOT |
# if (GCC_VERSION >= 4003) |
# define ATTRIBUTE_HOT __attribute__ ((__hot__)) |
# else |
# define ATTRIBUTE_HOT |
# endif /* GNUC >= 4.3 */ |
#endif /* ATTRIBUTE_HOT */ |
/* We use __extension__ in some places to suppress -pedantic warnings |
about GCC extensions. This feature didn't work properly before |
gcc 2.8. */ |
#if GCC_VERSION < 2008 |
#define __extension__ |
#endif |
/* This is used to declare a const variable which should be visible |
outside of the current compilation unit. Use it as |
EXPORTED_CONST int i = 1; |
This is because the semantics of const are different in C and C++. |
"extern const" is permitted in C but it looks strange, and gcc |
warns about it when -Wc++-compat is not used. */ |
#ifdef __cplusplus |
#define EXPORTED_CONST extern const |
#else |
#define EXPORTED_CONST const |
#endif |
/* Be conservative and only use enum bitfields with C++ or GCC. |
FIXME: provide a complete autoconf test for buggy enum bitfields. */ |
#ifdef __cplusplus |
#define ENUM_BITFIELD(TYPE) enum TYPE |
#elif (GCC_VERSION > 2000) |
#define ENUM_BITFIELD(TYPE) __extension__ enum TYPE |
#else |
#define ENUM_BITFIELD(TYPE) unsigned int |
#endif |
#ifdef __cplusplus |
} |
#endif |
#endif /* ansidecl.h */ |
/contrib/toolchain/binutils/include/aout/ChangeLog |
---|
0,0 → 1,262 |
2010-04-15 Nick Clifton <nickc@redhat.com> |
* adobe.h: Update copyright notice to use GPLv3. |
* aout64.h: Likewise. |
* ar.h: Likewise. |
* dynix3.h: Likewise. |
* encap.h: Likewise. |
* host.h: Likewise. |
* hp.h: Likewise. |
* hp300hpux.h: Likewise. |
* ranlib.h: Likewise. |
* reloc.h: Likewise. |
* stab.def: Likewise. |
* stab_gnu.h: Likewise. |
* sun4.h: Likewise. |
2009-10-02 Alan Modra <amodra@bigpond.net.au> |
* aout64.h (N_SHARED_LIB): Define as zero if not already defined. |
* sun4.h (N_SHARED_LIB): Define. |
* hp300hpux.h (N_SHARED_LIB): Don't define. |
2008-08-28 Tristan Gingold <gingold@adacore.com> |
* stab.def: Add BNSYM, ENSYM, OSO for darwin. |
2008-03-27 Cary Coutant <ccoutant@google.com> |
* ar.h (ARMAGT): New magic string for thin archives. |
2005-08-18 Alan Modra <amodra@bigpond.net.au> |
* encap.h: Remove a29k support. |
2005-05-10 Nick Clifton <nickc@redhat.com> |
* Update the address and phone number of the FSF organization in |
the GPL notices in the following files: |
adobe.h, aout64.h, ar.h, dynix3.h, encap.h, host.h, hp.h, |
ranlib.h, reloc.h, stab.def, stab_gnu.h, sun4.h |
2004-01-06 Mark Kettenis <kettenis@gnu.org> |
* stab.def: Add N_PATCH to DO definition. |
2003-03-06 Elias Athanasopoulos <elathan@phys.uoa.gr> |
* aout64.h (BYTES_IN_WORD): Define if necessary. |
2001-09-18 Alan Modra <amodra@bigpond.net.au> |
* aout64.h: Formatting fixes. |
(N_TXTADDR): Evaluate to a bfd_vma. |
(N_DATADDR): Avoid negative unsigned warning. |
* hp300hpux.h: Formatting fixes. |
(N_DATADDR): Avoid negative unsigned warning. |
2000-04-03 Hans-Peter Nilsson <hp@axis.com> |
* aout64.h (RELOC_EXT_BITS_EXTERN_BIG): Wrap definition in #ifndef. |
(RELOC_EXT_BITS_EXTERN_LITTLE): Ditto. |
(RELOC_EXT_BITS_TYPE_BIG): Ditto. |
(RELOC_EXT_BITS_TYPE_SH_BIG): Ditto. |
(RELOC_EXT_BITS_TYPE_LITTLE): Ditto. |
(RELOC_EXT_BITS_TYPE_SH_LITTLE): Ditto. |
1999-07-12 Ian Lance Taylor <ian@zembu.com> |
* aout64.h (N_SHARED_LIB): Define as 0 if TEXT_START_ADDR is |
defined as 0. |
1998-06-28 Peter Schauer <pes@regent.e-technik.tu-muenchen.de> |
* stab.def: Add N_ALIAS from SunPro F77. |
1996-03-11 Ian Lance Taylor <ian@cygnus.com> |
* stab.def: Use __define_stab_duplicate rather than __define_stab |
for duplicate entries N_BROWS and N_MOD2. |
* stab_gnu.h (__define_stab_duplicate): Define before including |
stab.def. |
1995-10-27 Niklas Hallqvist <niklas@appli.se> |
* aout64.h, host.h, hp300hpux.h, sun4.h: Changed PAGE_SIZE to |
TARGET_PAGE_SIZE. |
1995-09-12 Ian Lance Taylor <ian@cygnus.com> |
* sun4.h (struct internal_sun4_dynamic_link): Change all fields |
from long to unsigned long. |
1995-07-12 Ken Raeburn <raeburn@kr-pc.cygnus.com> |
* sun4.h (PAGE_SIZE): Undefine before defining. |
1994-09-04 Richard Earnshaw (rwe@pegasus.esprit.ec.org) |
* aout64.h: Only define QMAGIC if it isn't already defined. |
1994-06-16 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* aout64.h (BMAGIC): Define. |
1994-06-11 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
Add weak symbols as an extension to a.out. |
* aout64.h (N_WEAKU, N_WEAKA, N_WEAKT, N_WEAKD, N_WEAKB): Define. |
* stab.def: Update symbol value table. |
1994-06-02 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* sun4.h (EXTERNAL_SUN4_DYNAMIC_DEBUGGER_SIZE): Correct from 28 to |
24. Fix up ld_got comment. |
1994-03-30 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) |
* dynix3.h: Cleanup, adapt to current bfd version. |
1994-02-26 Ian Lance Taylor (ian@cygnus.com) |
* aout64.h: Add casts to avoid warnings from SVR4 cc. |
1994-02-11 Stan Shebs (shebs@andros.cygnus.com) |
* ar.h (ARMAG, ARMAGB, ARFMAG): Change '\n' to '\012', for greater |
portability. |
1994-01-21 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* sun4.h: Added information about SunOS shared libraries. |
1994-01-07 Jim Kingdon (kingdon@deneb.cygnus.com) |
* aout64.h (N_TXTADDR): Add comment regarding OMAGIC and NMAGIC. |
1993-12-25 Jim Kingdon (kingdon@lioth.cygnus.com) |
* aout64.h (N_DATOFF): Don't pad (revert change of 8 Jul 1993). |
1993-11-16 Jim Kingdon (kingdon@lioth.cygnus.com) |
* aout64.h: New macros ZMAGIC_DISK_BLOCK_SIZE and N_DISK_BLOCK_SIZE |
for Linux ZMAGIC. |
(N_TXTOFF, N_DATOFF): Use them. |
1993-11-04 Ken Raeburn (raeburn@kr-pc.cygnus.com) |
* aout64.h (RELOC_STD_BITS_RELATIVE_LITTLE): Fixed value to match |
sun3 system; used to overlap other fields. |
(RELOC_STD_BITS_JMPTABLE_LITTLE): Likewise. |
1993-11-03 David J. Mackenzie (djm@thepub.cygnus.com) |
* aout64.h (RELOC_STD_BITS_BASEREL_LITTLE): Make it 0x10 (Ken's |
suggestion) to avoid conflict with RELOC_STD_BITS_EXTERN_LITTLE. |
1993-10-29 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* hp300hpux.h (N_SHARED_LIB): Define to be 0. |
1993-09-13 John Gilmore (gnu@cygnus.com) |
* ar.h (ARMAP_TIME_OFFSET): Add and describe. |
Mon Aug 23 Sean Fagan (sef@cygnus.com) |
* aout64.h [ARCH_SIZE != 64]: Allow N_BADMAG to be overridden. |
1993-08-16 Jim Kingdon (kingdon@lioth.cygnus.com) |
* stab_gnu.h: Include aout/stab.def not just stab.def. |
1993-07-18 Jim Kingdon (kingdon@rtl.cygnus.com) |
* dynix3.h: New, for symmetry running dynix. |
1993-07-08 Jim Kingdon (kingdon@lioth.cygnus.com) |
* aout64.h (N_BADMAG): Recognize QMAGIC. |
N_TXTOFF, N_TXTADDR, N_TXTSIZE: Special code for QMAGIC. |
N_DATOFF: Pad text size if we need to. |
1993-06-18 Jim Kingdon (kingdon@lioth.cygnus.com) |
* stab.def (N_ECOML): Fix comment. |
1993-05-31 Jim Kingdon (kingdon@cygnus.com) |
* stab.def: Remove Solaris information on N_FUN stabstring grammar; |
I've transferred it to gdb/doc/stabs.texinfo, where it belongs. |
1993-05-10 Ken Raeburn (raeburn@kr-pc.cygnus.com) |
* hp300hpux.h: Patch from Glenn Engel for linker problem and |
compatibility fix: |
(OMAGIC, NMAGIC): New definitions. |
(SHAREMAGIC): Deleted. |
(HPUX_DOT_O_MAGIC): New macro. |
(_N_BADMAG): Adjusted. |
(N_HEADER_IN_TEXT, N_DATADDR): New macros. |
1993-04-29 Ken Raeburn (raeburn@deneb.cygnus.com) |
* hp300hpux.h: New file from Glenn Engel, glenne@lsid.hp.com. |
1993-04-27 Ken Raeburn (raeburn@kr-pc.cygnus.com) |
* aout64.h (struct external_exec, *MAGIC, N_BADMAG): Don't define |
if `external_exec' is already defined as a macro. |
(N_DATOFF, N_TRELOFF, N_DRELOFF, N_SYMOFF, N_STROFF): Don't define |
if already defined. |
(struct external_nlist, EXTERNAL_NLIST_SIZE): Don't define if |
`external_nlist' is already defined as a macro. |
1992-08-15 John Gilmore (gnu@cygnus.com) |
* adobe.h: Add description of a.out.adobe format. |
1992-07-03 John Gilmore (gnu at cygnus.com) |
* stab.def: Update more Solaris definitions. |
* stab_gnu.h: Add N_SO language types, and Solaris basic float types. |
1992-06-14 John Gilmore (gnu at cygnus.com) |
* stab.def: Update descriptions of Solaris-2 stabs; add N_UNDF. |
1992-06-11 John Gilmore (gnu at cygnus.com) |
* stab.def: Add N_OBJ and N_OPT from Solaris-2. |
1992-01-30 John Gilmore (gnu at cygnus.com) |
* aout64.h: N_TXTSIZE needs some more parentheses. |
I don't trust C precedence. |
1991-12-18 Per Bothner (bothner at cygnus.com) |
* aout64.h: Move common sunos-specific test |
to recognize shared libraries into new macro N_SHARED_LIB. |
Use it to simplify & reformat N_TXTADDR, N_TXTOFF, N_TXTSIZE. |
1991-11-30 Steve Chamberlain (sac at rtl.cygnus.com) |
* aout64.h, ar.h, encap.h, host.h, hp.h, ranlib.h, reloc.h, |
stab.def, stab_gnu.h, sun4.h: All moved from the devo/include |
directory. |
Copyright (C) 1991-2012 Free Software Foundation, Inc. |
Copying and distribution of this file, with or without modification, |
are permitted in any medium without royalty provided the copyright |
notice and this notice are preserved. |
Local Variables: |
mode: change-log |
left-margin: 8 |
fill-column: 74 |
version-control: never |
End: |
/contrib/toolchain/binutils/include/aout/adobe.h |
---|
0,0 → 1,314 |
/* `a.out.adobe' differences from standard a.out files |
Copyright 2001, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef __A_OUT_ADOBE_H__ |
#define __A_OUT_ADOBE_H__ |
#define BYTES_IN_WORD 4 |
/* Struct external_exec is the same. */ |
/* This is the layout on disk of the 32-bit or 64-bit exec header. */ |
struct external_exec |
{ |
bfd_byte e_info[4]; /* magic number and stuff */ |
bfd_byte e_text[BYTES_IN_WORD]; /* length of text section in bytes */ |
bfd_byte e_data[BYTES_IN_WORD]; /* length of data section in bytes */ |
bfd_byte e_bss[BYTES_IN_WORD]; /* length of bss area in bytes */ |
bfd_byte e_syms[BYTES_IN_WORD]; /* length of symbol table in bytes */ |
bfd_byte e_entry[BYTES_IN_WORD]; /* start address */ |
bfd_byte e_trsize[BYTES_IN_WORD]; /* length of text relocation info */ |
bfd_byte e_drsize[BYTES_IN_WORD]; /* length of data relocation info */ |
}; |
#define EXEC_BYTES_SIZE (4 + BYTES_IN_WORD * 7) |
/* Magic numbers for a.out files */ |
#undef ZMAGIC |
#define ZMAGIC 0xAD0BE /* Cute, eh? */ |
#undef OMAGIC |
#undef NMAGIC |
#define N_BADMAG(x) ((x).a_info != ZMAGIC) |
/* By default, segment size is constant. But some machines override this |
to be a function of the a.out header (e.g. machine type). */ |
#ifndef N_SEGSIZE |
#define N_SEGSIZE(x) SEGMENT_SIZE |
#endif |
#undef N_SEGSIZE /* FIXMEXXXX */ |
/* Segment information for the a.out.Adobe format is specified after the |
file header. It contains N segment descriptors, followed by one with |
a type of zero. |
The actual text of the segments starts at N_TXTOFF in the file, |
regardless of how many or how few segment headers there are. */ |
struct external_segdesc { |
unsigned char e_type[1]; |
unsigned char e_size[3]; |
unsigned char e_virtbase[4]; |
unsigned char e_filebase[4]; |
}; |
struct internal_segdesc { |
unsigned int a_type:8; /* Segment type N_TEXT, N_DATA, 0 */ |
unsigned int a_size:24; /* Segment size */ |
bfd_vma a_virtbase; /* Virtual address */ |
unsigned int a_filebase; /* Base address in object file */ |
}; |
#define N_TXTADDR(x) \ |
/* This is documented to be at 1024, but appears to really be at 2048. |
FIXME?! */ |
#define N_TXTOFF(x) 2048 |
#define N_TXTSIZE(x) ((x).a_text) |
#define N_DATADDR(x) |
#define N_BSSADDR(x) |
/* Offsets of the various portions of the file after the text segment. */ |
#define N_DATOFF(x) ( N_TXTOFF(x) + N_TXTSIZE(x) ) |
#define N_TRELOFF(x) ( N_DATOFF(x) + (x).a_data ) |
#define N_DRELOFF(x) ( N_TRELOFF(x) + (x).a_trsize ) |
#define N_SYMOFF(x) ( N_DRELOFF(x) + (x).a_drsize ) |
#define N_STROFF(x) ( N_SYMOFF(x) + (x).a_syms ) |
/* Symbols */ |
struct external_nlist { |
bfd_byte e_strx[BYTES_IN_WORD]; /* index into string table of name */ |
bfd_byte e_type[1]; /* type of symbol */ |
bfd_byte e_other[1]; /* misc info (usually empty) */ |
bfd_byte e_desc[2]; /* description field */ |
bfd_byte e_value[BYTES_IN_WORD]; /* value of symbol */ |
}; |
#define EXTERNAL_NLIST_SIZE (BYTES_IN_WORD+4+BYTES_IN_WORD) |
struct internal_nlist { |
unsigned long n_strx; /* index into string table of name */ |
unsigned char n_type; /* type of symbol */ |
unsigned char n_other; /* misc info (usually empty) */ |
unsigned short n_desc; /* description field */ |
bfd_vma n_value; /* value of symbol */ |
}; |
/* The n_type field is the symbol type, containing: */ |
#define N_UNDF 0 /* Undefined symbol */ |
#define N_ABS 2 /* Absolute symbol -- defined at particular addr */ |
#define N_TEXT 4 /* Text sym -- defined at offset in text seg */ |
#define N_DATA 6 /* Data sym -- defined at offset in data seg */ |
#define N_BSS 8 /* BSS sym -- defined at offset in zero'd seg */ |
#define N_COMM 0x12 /* Common symbol (visible after shared lib dynlink) */ |
#define N_FN 0x1f /* File name of .o file */ |
#define N_FN_SEQ 0x0C /* N_FN from Sequent compilers (sigh) */ |
/* Note: N_EXT can only be usefully OR-ed with N_UNDF, N_ABS, N_TEXT, |
N_DATA, or N_BSS. When the low-order bit of other types is set, |
(e.g. N_WARNING versus N_FN), they are two different types. */ |
#define N_EXT 1 /* External symbol (as opposed to local-to-this-file) */ |
#define N_TYPE 0x1e |
#define N_STAB 0xe0 /* If any of these bits are on, it's a debug symbol */ |
#define N_INDR 0x0a |
/* The following symbols refer to set elements. |
All the N_SET[ATDB] symbols with the same name form one set. |
Space is allocated for the set in the text section, and each set |
elements value is stored into one word of the space. |
The first word of the space is the length of the set (number of elements). |
The address of the set is made into an N_SETV symbol |
whose name is the same as the name of the set. |
This symbol acts like a N_DATA global symbol |
in that it can satisfy undefined external references. */ |
/* These appear as input to LD, in a .o file. */ |
#define N_SETA 0x14 /* Absolute set element symbol */ |
#define N_SETT 0x16 /* Text set element symbol */ |
#define N_SETD 0x18 /* Data set element symbol */ |
#define N_SETB 0x1A /* Bss set element symbol */ |
/* This is output from LD. */ |
#define N_SETV 0x1C /* Pointer to set vector in data area. */ |
/* Warning symbol. The text gives a warning message, the next symbol |
in the table will be undefined. When the symbol is referenced, the |
message is printed. */ |
#define N_WARNING 0x1e |
/* Relocations |
There are two types of relocation flavours for a.out systems, |
standard and extended. The standard form is used on systems where the |
instruction has room for all the bits of an offset to the operand, whilst |
the extended form is used when an address operand has to be split over n |
instructions. Eg, on the 68k, each move instruction can reference |
the target with a displacement of 16 or 32 bits. On the sparc, move |
instructions use an offset of 14 bits, so the offset is stored in |
the reloc field, and the data in the section is ignored. |
*/ |
/* This structure describes a single relocation to be performed. |
The text-relocation section of the file is a vector of these structures, |
all of which apply to the text section. |
Likewise, the data-relocation section applies to the data section. */ |
struct reloc_std_external { |
bfd_byte r_address[BYTES_IN_WORD]; /* offset of of data to relocate */ |
bfd_byte r_index[3]; /* symbol table index of symbol */ |
bfd_byte r_type[1]; /* relocation type */ |
}; |
#define RELOC_STD_BITS_PCREL_BIG 0x80 |
#define RELOC_STD_BITS_PCREL_LITTLE 0x01 |
#define RELOC_STD_BITS_LENGTH_BIG 0x60 |
#define RELOC_STD_BITS_LENGTH_SH_BIG 5 /* To shift to units place */ |
#define RELOC_STD_BITS_LENGTH_LITTLE 0x06 |
#define RELOC_STD_BITS_LENGTH_SH_LITTLE 1 |
#define RELOC_STD_BITS_EXTERN_BIG 0x10 |
#define RELOC_STD_BITS_EXTERN_LITTLE 0x08 |
#define RELOC_STD_BITS_BASEREL_BIG 0x08 |
#define RELOC_STD_BITS_BASEREL_LITTLE 0x08 |
#define RELOC_STD_BITS_JMPTABLE_BIG 0x04 |
#define RELOC_STD_BITS_JMPTABLE_LITTLE 0x04 |
#define RELOC_STD_BITS_RELATIVE_BIG 0x02 |
#define RELOC_STD_BITS_RELATIVE_LITTLE 0x02 |
#define RELOC_STD_SIZE (BYTES_IN_WORD + 3 + 1) /* Bytes per relocation entry */ |
struct reloc_std_internal |
{ |
bfd_vma r_address; /* Address (within segment) to be relocated. */ |
/* The meaning of r_symbolnum depends on r_extern. */ |
unsigned int r_symbolnum:24; |
/* Nonzero means value is a pc-relative offset |
and it should be relocated for changes in its own address |
as well as for changes in the symbol or section specified. */ |
unsigned int r_pcrel:1; |
/* Length (as exponent of 2) of the field to be relocated. |
Thus, a value of 2 indicates 1<<2 bytes. */ |
unsigned int r_length:2; |
/* 1 => relocate with value of symbol. |
r_symbolnum is the index of the symbol |
in files the symbol table. |
0 => relocate with the address of a segment. |
r_symbolnum is N_TEXT, N_DATA, N_BSS or N_ABS |
(the N_EXT bit may be set also, but signifies nothing). */ |
unsigned int r_extern:1; |
/* The next three bits are for SunOS shared libraries, and seem to |
be undocumented. */ |
unsigned int r_baserel:1; /* Linkage table relative */ |
unsigned int r_jmptable:1; /* pc-relative to jump table */ |
unsigned int r_relative:1; /* "relative relocation" */ |
/* unused */ |
unsigned int r_pad:1; /* Padding -- set to zero */ |
}; |
/* EXTENDED RELOCS */ |
struct reloc_ext_external { |
bfd_byte r_address[BYTES_IN_WORD]; /* offset of of data to relocate */ |
bfd_byte r_index[3]; /* symbol table index of symbol */ |
bfd_byte r_type[1]; /* relocation type */ |
bfd_byte r_addend[BYTES_IN_WORD]; /* datum addend */ |
}; |
#define RELOC_EXT_BITS_EXTERN_BIG 0x80 |
#define RELOC_EXT_BITS_EXTERN_LITTLE 0x01 |
#define RELOC_EXT_BITS_TYPE_BIG 0x1F |
#define RELOC_EXT_BITS_TYPE_SH_BIG 0 |
#define RELOC_EXT_BITS_TYPE_LITTLE 0xF8 |
#define RELOC_EXT_BITS_TYPE_SH_LITTLE 3 |
/* Bytes per relocation entry */ |
#define RELOC_EXT_SIZE (BYTES_IN_WORD + 3 + 1 + BYTES_IN_WORD) |
enum reloc_type |
{ |
/* simple relocations */ |
RELOC_8, /* data[0:7] = addend + sv */ |
RELOC_16, /* data[0:15] = addend + sv */ |
RELOC_32, /* data[0:31] = addend + sv */ |
/* pc-rel displacement */ |
RELOC_DISP8, /* data[0:7] = addend - pc + sv */ |
RELOC_DISP16, /* data[0:15] = addend - pc + sv */ |
RELOC_DISP32, /* data[0:31] = addend - pc + sv */ |
/* Special */ |
RELOC_WDISP30, /* data[0:29] = (addend + sv - pc)>>2 */ |
RELOC_WDISP22, /* data[0:21] = (addend + sv - pc)>>2 */ |
RELOC_HI22, /* data[0:21] = (addend + sv)>>10 */ |
RELOC_22, /* data[0:21] = (addend + sv) */ |
RELOC_13, /* data[0:12] = (addend + sv) */ |
RELOC_LO10, /* data[0:9] = (addend + sv) */ |
RELOC_SFA_BASE, |
RELOC_SFA_OFF13, |
/* P.I.C. (base-relative) */ |
RELOC_BASE10, /* Not sure - maybe we can do this the */ |
RELOC_BASE13, /* right way now */ |
RELOC_BASE22, |
/* for some sort of pc-rel P.I.C. (?) */ |
RELOC_PC10, |
RELOC_PC22, |
/* P.I.C. jump table */ |
RELOC_JMP_TBL, |
/* reputedly for shared libraries somehow */ |
RELOC_SEGOFF16, |
RELOC_GLOB_DAT, |
RELOC_JMP_SLOT, |
RELOC_RELATIVE, |
RELOC_11, |
RELOC_WDISP2_14, |
RELOC_WDISP19, |
RELOC_HHI22, /* data[0:21] = (addend + sv) >> 42 */ |
RELOC_HLO10, /* data[0:9] = (addend + sv) >> 32 */ |
/* 29K relocation types */ |
RELOC_JUMPTARG, |
RELOC_CONST, |
RELOC_CONSTH, |
NO_RELOC |
}; |
struct reloc_internal { |
bfd_vma r_address; /* offset of of data to relocate */ |
long r_index; /* symbol table index of symbol */ |
enum reloc_type r_type; /* relocation type */ |
bfd_vma r_addend; /* datum addend */ |
}; |
#endif /* __A_OUT_ADOBE_H__ */ |
/contrib/toolchain/binutils/include/aout/aout64.h |
---|
0,0 → 1,516 |
/* `a.out' object-file definitions, including extensions to 64-bit fields |
Copyright 1999, 2000, 2001, 2003, 2009, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef __A_OUT_64_H__ |
#define __A_OUT_64_H__ |
#ifndef BYTES_IN_WORD |
#define BYTES_IN_WORD 4 |
#endif |
/* This is the layout on disk of the 32-bit or 64-bit exec header. */ |
#ifndef external_exec |
struct external_exec |
{ |
bfd_byte e_info[4]; /* Magic number and stuff. */ |
bfd_byte e_text[BYTES_IN_WORD]; /* Length of text section in bytes. */ |
bfd_byte e_data[BYTES_IN_WORD]; /* Length of data section in bytes. */ |
bfd_byte e_bss[BYTES_IN_WORD]; /* Length of bss area in bytes. */ |
bfd_byte e_syms[BYTES_IN_WORD]; /* Length of symbol table in bytes. */ |
bfd_byte e_entry[BYTES_IN_WORD]; /* Start address. */ |
bfd_byte e_trsize[BYTES_IN_WORD]; /* Length of text relocation info. */ |
bfd_byte e_drsize[BYTES_IN_WORD]; /* Length of data relocation info. */ |
}; |
#define EXEC_BYTES_SIZE (4 + BYTES_IN_WORD * 7) |
/* Magic numbers for a.out files. */ |
#if ARCH_SIZE==64 |
#define OMAGIC 0x1001 /* Code indicating object file. */ |
#define ZMAGIC 0x1002 /* Code indicating demand-paged executable. */ |
#define NMAGIC 0x1003 /* Code indicating pure executable. */ |
/* There is no 64-bit QMAGIC as far as I know. */ |
#define N_BADMAG(x) (N_MAGIC(x) != OMAGIC \ |
&& N_MAGIC(x) != NMAGIC \ |
&& N_MAGIC(x) != ZMAGIC) |
#else |
#define OMAGIC 0407 /* Object file or impure executable. */ |
#define NMAGIC 0410 /* Code indicating pure executable. */ |
#define ZMAGIC 0413 /* Code indicating demand-paged executable. */ |
#define BMAGIC 0415 /* Used by a b.out object. */ |
/* This indicates a demand-paged executable with the header in the text. |
It is used by 386BSD (and variants) and Linux, at least. */ |
#ifndef QMAGIC |
#define QMAGIC 0314 |
#endif |
# ifndef N_BADMAG |
# define N_BADMAG(x) (N_MAGIC(x) != OMAGIC \ |
&& N_MAGIC(x) != NMAGIC \ |
&& N_MAGIC(x) != ZMAGIC \ |
&& N_MAGIC(x) != QMAGIC) |
# endif /* N_BADMAG */ |
#endif |
#endif |
#ifdef QMAGIC |
#define N_IS_QMAGIC(x) (N_MAGIC (x) == QMAGIC) |
#else |
#define N_IS_QMAGIC(x) (0) |
#endif |
/* The difference between TARGET_PAGE_SIZE and N_SEGSIZE is that TARGET_PAGE_SIZE is |
the finest granularity at which you can page something, thus it |
controls the padding (if any) before the text segment of a ZMAGIC |
file. N_SEGSIZE is the resolution at which things can be marked as |
read-only versus read/write, so it controls the padding between the |
text segment and the data segment (in memory; on disk the padding |
between them is TARGET_PAGE_SIZE). TARGET_PAGE_SIZE and N_SEGSIZE are the same |
for most machines, but different for sun3. */ |
/* By default, segment size is constant. But some machines override this |
to be a function of the a.out header (e.g. machine type). */ |
#ifndef N_SEGSIZE |
#define N_SEGSIZE(x) SEGMENT_SIZE |
#endif |
/* Virtual memory address of the text section. |
This is getting very complicated. A good reason to discard a.out format |
for something that specifies these fields explicitly. But til then... |
* OMAGIC and NMAGIC files: |
(object files: text for "relocatable addr 0" right after the header) |
start at 0, offset is EXEC_BYTES_SIZE, size as stated. |
* The text address, offset, and size of ZMAGIC files depend |
on the entry point of the file: |
* entry point below TEXT_START_ADDR: |
(hack for SunOS shared libraries) |
start at 0, offset is 0, size as stated. |
* If N_HEADER_IN_TEXT(x) is true (which defaults to being the |
case when the entry point is EXEC_BYTES_SIZE or further into a page): |
no padding is needed; text can start after exec header. Sun |
considers the text segment of such files to include the exec header; |
for BFD's purposes, we don't, which makes more work for us. |
start at TEXT_START_ADDR + EXEC_BYTES_SIZE, offset is EXEC_BYTES_SIZE, |
size as stated minus EXEC_BYTES_SIZE. |
* If N_HEADER_IN_TEXT(x) is false (which defaults to being the case when |
the entry point is less than EXEC_BYTES_SIZE into a page (e.g. page |
aligned)): (padding is needed so that text can start at a page boundary) |
start at TEXT_START_ADDR, offset TARGET_PAGE_SIZE, size as stated. |
Specific configurations may want to hardwire N_HEADER_IN_TEXT, |
for efficiency or to allow people to play games with the entry point. |
In that case, you would #define N_HEADER_IN_TEXT(x) as 1 for sunos, |
and as 0 for most other hosts (Sony News, Vax Ultrix, etc). |
(Do this in the appropriate bfd target file.) |
(The default is a heuristic that will break if people try changing |
the entry point, perhaps with the ld -e flag.) |
* QMAGIC is always like a ZMAGIC for which N_HEADER_IN_TEXT is true, |
and for which the starting address is TARGET_PAGE_SIZE (or should this be |
SEGMENT_SIZE?) (TEXT_START_ADDR only applies to ZMAGIC, not to QMAGIC). */ |
/* This macro is only relevant for ZMAGIC files; QMAGIC always has the header |
in the text. */ |
#ifndef N_HEADER_IN_TEXT |
#define N_HEADER_IN_TEXT(x) \ |
(((x).a_entry & (TARGET_PAGE_SIZE-1)) >= EXEC_BYTES_SIZE) |
#endif |
/* Sun shared libraries, not linux. This macro is only relevant for ZMAGIC |
files. */ |
#ifndef N_SHARED_LIB |
#define N_SHARED_LIB(x) (0) |
#endif |
/* Returning 0 not TEXT_START_ADDR for OMAGIC and NMAGIC is based on |
the assumption that we are dealing with a .o file, not an |
executable. This is necessary for OMAGIC (but means we don't work |
right on the output from ld -N); more questionable for NMAGIC. */ |
#ifndef N_TXTADDR |
#define N_TXTADDR(x) \ |
(/* The address of a QMAGIC file is always one page in, \ |
with the header in the text. */ \ |
N_IS_QMAGIC (x) \ |
? (bfd_vma) TARGET_PAGE_SIZE + EXEC_BYTES_SIZE \ |
: (N_MAGIC (x) != ZMAGIC \ |
? (bfd_vma) 0 /* Object file or NMAGIC. */ \ |
: (N_SHARED_LIB (x) \ |
? (bfd_vma) 0 \ |
: (N_HEADER_IN_TEXT (x) \ |
? (bfd_vma) TEXT_START_ADDR + EXEC_BYTES_SIZE \ |
: (bfd_vma) TEXT_START_ADDR)))) |
#endif |
/* If N_HEADER_IN_TEXT is not true for ZMAGIC, there is some padding |
to make the text segment start at a certain boundary. For most |
systems, this boundary is TARGET_PAGE_SIZE. But for Linux, in the |
time-honored tradition of crazy ZMAGIC hacks, it is 1024 which is |
not what TARGET_PAGE_SIZE needs to be for QMAGIC. */ |
#ifndef ZMAGIC_DISK_BLOCK_SIZE |
#define ZMAGIC_DISK_BLOCK_SIZE TARGET_PAGE_SIZE |
#endif |
#define N_DISK_BLOCK_SIZE(x) \ |
(N_MAGIC(x) == ZMAGIC ? ZMAGIC_DISK_BLOCK_SIZE : TARGET_PAGE_SIZE) |
/* Offset in an a.out of the start of the text section. */ |
#ifndef N_TXTOFF |
#define N_TXTOFF(x) \ |
(/* For {O,N,Q}MAGIC, no padding. */ \ |
N_MAGIC (x) != ZMAGIC \ |
? EXEC_BYTES_SIZE \ |
: (N_SHARED_LIB (x) \ |
? 0 \ |
: (N_HEADER_IN_TEXT (x) \ |
? EXEC_BYTES_SIZE /* No padding. */ \ |
: ZMAGIC_DISK_BLOCK_SIZE /* A page of padding. */))) |
#endif |
/* Size of the text section. It's always as stated, except that we |
offset it to `undo' the adjustment to N_TXTADDR and N_TXTOFF |
for ZMAGIC files that nominally include the exec header |
as part of the first page of text. (BFD doesn't consider the |
exec header to be part of the text segment.) */ |
#ifndef N_TXTSIZE |
#define N_TXTSIZE(x) \ |
(/* For QMAGIC, we don't consider the header part of the text section. */\ |
N_IS_QMAGIC (x) \ |
? (x).a_text - EXEC_BYTES_SIZE \ |
: ((N_MAGIC (x) != ZMAGIC || N_SHARED_LIB (x)) \ |
? (x).a_text \ |
: (N_HEADER_IN_TEXT (x) \ |
? (x).a_text - EXEC_BYTES_SIZE /* No padding. */ \ |
: (x).a_text /* A page of padding. */ ))) |
#endif |
/* The address of the data segment in virtual memory. |
It is the text segment address, plus text segment size, rounded |
up to a N_SEGSIZE boundary for pure or pageable files. */ |
#ifndef N_DATADDR |
#define N_DATADDR(x) \ |
(N_MAGIC (x) == OMAGIC \ |
? (N_TXTADDR (x) + N_TXTSIZE (x)) \ |
: (N_SEGSIZE (x) + ((N_TXTADDR (x) + N_TXTSIZE (x) - 1) \ |
& ~ (bfd_vma) (N_SEGSIZE (x) - 1)))) |
#endif |
/* The address of the BSS segment -- immediately after the data segment. */ |
#define N_BSSADDR(x) (N_DATADDR (x) + (x).a_data) |
/* Offsets of the various portions of the file after the text segment. */ |
/* For {Q,Z}MAGIC, there is padding to make the data segment start on |
a page boundary. Most of the time the a_text field (and thus |
N_TXTSIZE) already contains this padding. It is possible that for |
BSDI and/or 386BSD it sometimes doesn't contain the padding, and |
perhaps we should be adding it here. But this seems kind of |
questionable and probably should be BSDI/386BSD-specific if we do |
do it. |
For NMAGIC (at least for hp300 BSD, probably others), there is |
padding in memory only, not on disk, so we must *not* ever pad here |
for NMAGIC. */ |
#ifndef N_DATOFF |
#define N_DATOFF(x) (N_TXTOFF (x) + N_TXTSIZE (x)) |
#endif |
#ifndef N_TRELOFF |
#define N_TRELOFF(x) (N_DATOFF (x) + (x).a_data) |
#endif |
#ifndef N_DRELOFF |
#define N_DRELOFF(x) (N_TRELOFF (x) + (x).a_trsize) |
#endif |
#ifndef N_SYMOFF |
#define N_SYMOFF(x) (N_DRELOFF (x) + (x).a_drsize) |
#endif |
#ifndef N_STROFF |
#define N_STROFF(x) (N_SYMOFF (x) + (x).a_syms) |
#endif |
/* Symbols */ |
#ifndef external_nlist |
struct external_nlist |
{ |
bfd_byte e_strx[BYTES_IN_WORD]; /* Index into string table of name. */ |
bfd_byte e_type[1]; /* Type of symbol. */ |
bfd_byte e_other[1]; /* Misc info (usually empty). */ |
bfd_byte e_desc[2]; /* Description field. */ |
bfd_byte e_value[BYTES_IN_WORD]; /* Value of symbol. */ |
}; |
#define EXTERNAL_NLIST_SIZE (BYTES_IN_WORD+4+BYTES_IN_WORD) |
#endif |
struct internal_nlist |
{ |
unsigned long n_strx; /* Index into string table of name. */ |
unsigned char n_type; /* Type of symbol. */ |
unsigned char n_other; /* Misc info (usually empty). */ |
unsigned short n_desc; /* Description field. */ |
bfd_vma n_value; /* Value of symbol. */ |
}; |
/* The n_type field is the symbol type, containing: */ |
#define N_UNDF 0 /* Undefined symbol. */ |
#define N_ABS 2 /* Absolute symbol -- defined at particular addr. */ |
#define N_TEXT 4 /* Text sym -- defined at offset in text seg. */ |
#define N_DATA 6 /* Data sym -- defined at offset in data seg. */ |
#define N_BSS 8 /* BSS sym -- defined at offset in zero'd seg. */ |
#define N_COMM 0x12 /* Common symbol (visible after shared lib dynlink). */ |
#define N_FN 0x1f /* File name of .o file. */ |
#define N_FN_SEQ 0x0C /* N_FN from Sequent compilers (sigh). */ |
/* Note: N_EXT can only be usefully OR-ed with N_UNDF, N_ABS, N_TEXT, |
N_DATA, or N_BSS. When the low-order bit of other types is set, |
(e.g. N_WARNING versus N_FN), they are two different types. */ |
#define N_EXT 1 /* External symbol (as opposed to local-to-this-file). */ |
#define N_TYPE 0x1e |
#define N_STAB 0xe0 /* If any of these bits are on, it's a debug symbol. */ |
#define N_INDR 0x0a |
/* The following symbols refer to set elements. |
All the N_SET[ATDB] symbols with the same name form one set. |
Space is allocated for the set in the text section, and each set |
elements value is stored into one word of the space. |
The first word of the space is the length of the set (number of elements). |
The address of the set is made into an N_SETV symbol |
whose name is the same as the name of the set. |
This symbol acts like a N_DATA global symbol |
in that it can satisfy undefined external references. */ |
/* These appear as input to LD, in a .o file. */ |
#define N_SETA 0x14 /* Absolute set element symbol. */ |
#define N_SETT 0x16 /* Text set element symbol. */ |
#define N_SETD 0x18 /* Data set element symbol. */ |
#define N_SETB 0x1A /* Bss set element symbol. */ |
/* This is output from LD. */ |
#define N_SETV 0x1C /* Pointer to set vector in data area. */ |
/* Warning symbol. The text gives a warning message, the next symbol |
in the table will be undefined. When the symbol is referenced, the |
message is printed. */ |
#define N_WARNING 0x1e |
/* Weak symbols. These are a GNU extension to the a.out format. The |
semantics are those of ELF weak symbols. Weak symbols are always |
externally visible. The N_WEAK? values are squeezed into the |
available slots. The value of a N_WEAKU symbol is 0. The values |
of the other types are the definitions. */ |
#define N_WEAKU 0x0d /* Weak undefined symbol. */ |
#define N_WEAKA 0x0e /* Weak absolute symbol. */ |
#define N_WEAKT 0x0f /* Weak text symbol. */ |
#define N_WEAKD 0x10 /* Weak data symbol. */ |
#define N_WEAKB 0x11 /* Weak bss symbol. */ |
/* Relocations |
There are two types of relocation flavours for a.out systems, |
standard and extended. The standard form is used on systems where the |
instruction has room for all the bits of an offset to the operand, whilst |
the extended form is used when an address operand has to be split over n |
instructions. Eg, on the 68k, each move instruction can reference |
the target with a displacement of 16 or 32 bits. On the sparc, move |
instructions use an offset of 14 bits, so the offset is stored in |
the reloc field, and the data in the section is ignored. */ |
/* This structure describes a single relocation to be performed. |
The text-relocation section of the file is a vector of these structures, |
all of which apply to the text section. |
Likewise, the data-relocation section applies to the data section. */ |
struct reloc_std_external |
{ |
bfd_byte r_address[BYTES_IN_WORD]; /* Offset of of data to relocate. */ |
bfd_byte r_index[3]; /* Symbol table index of symbol. */ |
bfd_byte r_type[1]; /* Relocation type. */ |
}; |
#define RELOC_STD_BITS_PCREL_BIG ((unsigned int) 0x80) |
#define RELOC_STD_BITS_PCREL_LITTLE ((unsigned int) 0x01) |
#define RELOC_STD_BITS_LENGTH_BIG ((unsigned int) 0x60) |
#define RELOC_STD_BITS_LENGTH_SH_BIG 5 |
#define RELOC_STD_BITS_LENGTH_LITTLE ((unsigned int) 0x06) |
#define RELOC_STD_BITS_LENGTH_SH_LITTLE 1 |
#define RELOC_STD_BITS_EXTERN_BIG ((unsigned int) 0x10) |
#define RELOC_STD_BITS_EXTERN_LITTLE ((unsigned int) 0x08) |
#define RELOC_STD_BITS_BASEREL_BIG ((unsigned int) 0x08) |
#define RELOC_STD_BITS_BASEREL_LITTLE ((unsigned int) 0x10) |
#define RELOC_STD_BITS_JMPTABLE_BIG ((unsigned int) 0x04) |
#define RELOC_STD_BITS_JMPTABLE_LITTLE ((unsigned int) 0x20) |
#define RELOC_STD_BITS_RELATIVE_BIG ((unsigned int) 0x02) |
#define RELOC_STD_BITS_RELATIVE_LITTLE ((unsigned int) 0x40) |
#define RELOC_STD_SIZE (BYTES_IN_WORD + 3 + 1) /* Bytes per relocation entry. */ |
struct reloc_std_internal |
{ |
bfd_vma r_address; /* Address (within segment) to be relocated. */ |
/* The meaning of r_symbolnum depends on r_extern. */ |
unsigned int r_symbolnum:24; |
/* Nonzero means value is a pc-relative offset |
and it should be relocated for changes in its own address |
as well as for changes in the symbol or section specified. */ |
unsigned int r_pcrel:1; |
/* Length (as exponent of 2) of the field to be relocated. |
Thus, a value of 2 indicates 1<<2 bytes. */ |
unsigned int r_length:2; |
/* 1 => relocate with value of symbol. |
r_symbolnum is the index of the symbol |
in files the symbol table. |
0 => relocate with the address of a segment. |
r_symbolnum is N_TEXT, N_DATA, N_BSS or N_ABS |
(the N_EXT bit may be set also, but signifies nothing). */ |
unsigned int r_extern:1; |
/* The next three bits are for SunOS shared libraries, and seem to |
be undocumented. */ |
unsigned int r_baserel:1; /* Linkage table relative. */ |
unsigned int r_jmptable:1; /* pc-relative to jump table. */ |
unsigned int r_relative:1; /* "relative relocation". */ |
/* unused */ |
unsigned int r_pad:1; /* Padding -- set to zero. */ |
}; |
/* EXTENDED RELOCS. */ |
struct reloc_ext_external |
{ |
bfd_byte r_address[BYTES_IN_WORD]; /* Offset of of data to relocate. */ |
bfd_byte r_index[3]; /* Symbol table index of symbol. */ |
bfd_byte r_type[1]; /* Relocation type. */ |
bfd_byte r_addend[BYTES_IN_WORD]; /* Datum addend. */ |
}; |
#ifndef RELOC_EXT_BITS_EXTERN_BIG |
#define RELOC_EXT_BITS_EXTERN_BIG ((unsigned int) 0x80) |
#endif |
#ifndef RELOC_EXT_BITS_EXTERN_LITTLE |
#define RELOC_EXT_BITS_EXTERN_LITTLE ((unsigned int) 0x01) |
#endif |
#ifndef RELOC_EXT_BITS_TYPE_BIG |
#define RELOC_EXT_BITS_TYPE_BIG ((unsigned int) 0x1F) |
#endif |
#ifndef RELOC_EXT_BITS_TYPE_SH_BIG |
#define RELOC_EXT_BITS_TYPE_SH_BIG 0 |
#endif |
#ifndef RELOC_EXT_BITS_TYPE_LITTLE |
#define RELOC_EXT_BITS_TYPE_LITTLE ((unsigned int) 0xF8) |
#endif |
#ifndef RELOC_EXT_BITS_TYPE_SH_LITTLE |
#define RELOC_EXT_BITS_TYPE_SH_LITTLE 3 |
#endif |
/* Bytes per relocation entry. */ |
#define RELOC_EXT_SIZE (BYTES_IN_WORD + 3 + 1 + BYTES_IN_WORD) |
enum reloc_type |
{ |
/* Simple relocations. */ |
RELOC_8, /* data[0:7] = addend + sv */ |
RELOC_16, /* data[0:15] = addend + sv */ |
RELOC_32, /* data[0:31] = addend + sv */ |
/* PC-rel displacement. */ |
RELOC_DISP8, /* data[0:7] = addend - pc + sv */ |
RELOC_DISP16, /* data[0:15] = addend - pc + sv */ |
RELOC_DISP32, /* data[0:31] = addend - pc + sv */ |
/* Special. */ |
RELOC_WDISP30, /* data[0:29] = (addend + sv - pc)>>2 */ |
RELOC_WDISP22, /* data[0:21] = (addend + sv - pc)>>2 */ |
RELOC_HI22, /* data[0:21] = (addend + sv)>>10 */ |
RELOC_22, /* data[0:21] = (addend + sv) */ |
RELOC_13, /* data[0:12] = (addend + sv) */ |
RELOC_LO10, /* data[0:9] = (addend + sv) */ |
RELOC_SFA_BASE, |
RELOC_SFA_OFF13, |
/* P.I.C. (base-relative). */ |
RELOC_BASE10, /* Not sure - maybe we can do this the */ |
RELOC_BASE13, /* right way now */ |
RELOC_BASE22, |
/* For some sort of pc-rel P.I.C. (?) */ |
RELOC_PC10, |
RELOC_PC22, |
/* P.I.C. jump table. */ |
RELOC_JMP_TBL, |
/* Reputedly for shared libraries somehow. */ |
RELOC_SEGOFF16, |
RELOC_GLOB_DAT, |
RELOC_JMP_SLOT, |
RELOC_RELATIVE, |
RELOC_11, |
RELOC_WDISP2_14, |
RELOC_WDISP19, |
RELOC_HHI22, /* data[0:21] = (addend + sv) >> 42 */ |
RELOC_HLO10, /* data[0:9] = (addend + sv) >> 32 */ |
/* 29K relocation types. */ |
RELOC_JUMPTARG, |
RELOC_CONST, |
RELOC_CONSTH, |
/* All the new ones I can think of, for sparc v9. */ |
RELOC_64, /* data[0:63] = addend + sv */ |
RELOC_DISP64, /* data[0:63] = addend - pc + sv */ |
RELOC_WDISP21, /* data[0:20] = (addend + sv - pc)>>2 */ |
RELOC_DISP21, /* data[0:20] = addend - pc + sv */ |
RELOC_DISP14, /* data[0:13] = addend - pc + sv */ |
/* Q . |
What are the other ones, |
Since this is a clean slate, can we throw away the ones we dont |
understand ? Should we sort the values ? What about using a |
microcode format like the 68k ? */ |
NO_RELOC |
}; |
struct reloc_internal |
{ |
bfd_vma r_address; /* Offset of of data to relocate. */ |
long r_index; /* Symbol table index of symbol. */ |
enum reloc_type r_type; /* Relocation type. */ |
bfd_vma r_addend; /* Datum addend. */ |
}; |
/* Q. |
Should the length of the string table be 4 bytes or 8 bytes ? |
Q. |
What about archive indexes ? */ |
#endif /* __A_OUT_64_H__ */ |
/contrib/toolchain/binutils/include/aout/ar.h |
---|
0,0 → 1,55 |
/* archive file definition for GNU software |
Copyright 2001, 2008, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* So far this is correct for BSDish archives. Don't forget that |
files must begin on an even byte boundary. */ |
#ifndef __GNU_AR_H__ |
#define __GNU_AR_H__ |
/* Note that the usual '\n' in magic strings may translate to different |
characters, as allowed by ANSI. '\012' has a fixed value, and remains |
compatible with existing BSDish archives. */ |
#define ARMAG "!<arch>\012" /* For COFF and a.out archives. */ |
#define ARMAGB "!<bout>\012" /* For b.out archives. */ |
#define ARMAGT "!<thin>\012" /* For thin archives. */ |
#define SARMAG 8 |
#define ARFMAG "`\012" |
/* The ar_date field of the armap (__.SYMDEF) member of an archive |
must be greater than the modified date of the entire file, or |
BSD-derived linkers complain. We originally write the ar_date with |
this offset from the real file's mod-time. After finishing the |
file, we rewrite ar_date if it's not still greater than the mod date. */ |
#define ARMAP_TIME_OFFSET 60 |
struct ar_hdr |
{ |
char ar_name[16]; /* Name of this member. */ |
char ar_date[12]; /* File mtime. */ |
char ar_uid[6]; /* Owner uid; printed as decimal. */ |
char ar_gid[6]; /* Owner gid; printed as decimal. */ |
char ar_mode[8]; /* File mode, printed as octal. */ |
char ar_size[10]; /* File size, printed as decimal. */ |
char ar_fmag[2]; /* Should contain ARFMAG. */ |
}; |
#endif /* __GNU_AR_H__ */ |
/contrib/toolchain/binutils/include/aout/dynix3.h |
---|
0,0 → 1,87 |
/* a.out specifics for Sequent Symmetry running Dynix 3.x |
Copyright 2001, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef A_OUT_DYNIX3_H |
#define A_OUT_DYNIX3_H |
#define external_exec dynix_external_exec |
/* struct exec for Dynix 3 |
a_gdtbl and a_bootstrap are only for standalone binaries. |
Shared data fields are not supported by the kernel as of Dynix 3.1, |
but are supported by Dynix compiler programs. */ |
struct dynix_external_exec |
{ |
unsigned char e_info[4]; |
unsigned char e_text[4]; |
unsigned char e_data[4]; |
unsigned char e_bss[4]; |
unsigned char e_syms[4]; |
unsigned char e_entry[4]; |
unsigned char e_trsize[4]; |
unsigned char e_drsize[4]; |
unsigned char e_g_code[8]; |
unsigned char e_g_data[8]; |
unsigned char e_g_desc[8]; |
unsigned char e_shdata[4]; |
unsigned char e_shbss[4]; |
unsigned char e_shdrsize[4]; |
unsigned char e_bootstrap[44]; |
unsigned char e_reserved[12]; |
unsigned char e_version[4]; |
}; |
#define EXEC_BYTES_SIZE (128) |
/* All executables under Dynix are demand paged with read-only text, |
Thus no NMAGIC. |
ZMAGIC has a page of 0s at virtual 0, |
XMAGIC has an invalid page at virtual 0. */ |
#define OMAGIC 0x12eb /* .o */ |
#define ZMAGIC 0x22eb /* zero @ 0, demand load */ |
#define XMAGIC 0x32eb /* invalid @ 0, demand load */ |
#define SMAGIC 0x42eb /* standalone, not supported here */ |
#define N_BADMAG(x) ((OMAGIC != N_MAGIC(x)) && \ |
(ZMAGIC != N_MAGIC(x)) && \ |
(XMAGIC != N_MAGIC(x)) && \ |
(SMAGIC != N_MAGIC(x))) |
#define N_ADDRADJ(x) ((ZMAGIC == N_MAGIC(x) || XMAGIC == N_MAGIC(x)) ? 0x1000 : 0) |
#define N_TXTOFF(x) (EXEC_BYTES_SIZE) |
#define N_DATOFF(x) (N_TXTOFF(x) + N_TXTSIZE(x)) |
#define N_SHDATOFF(x) (N_DATOFF(x) + (x).a_data) |
#define N_TRELOFF(x) (N_SHDATOFF(x) + (x).a_shdata) |
#define N_DRELOFF(x) (N_TRELOFF(x) + (x).a_trsize) |
#define N_SHDRELOFF(x) (N_DRELOFF(x) + (x).a_drsize) |
#define N_SYMOFF(x) (N_SHDRELOFF(x) + (x).a_shdrsize) |
#define N_STROFF(x) (N_SYMOFF(x) + (x).a_syms) |
#define N_TXTADDR(x) \ |
(((OMAGIC == N_MAGIC(x)) || (SMAGIC == N_MAGIC(x))) ? 0 \ |
: TEXT_START_ADDR + EXEC_BYTES_SIZE) |
#define N_TXTSIZE(x) \ |
(((OMAGIC == N_MAGIC(x)) || (SMAGIC == N_MAGIC(x))) ? ((x).a_text) \ |
: ((x).a_text - N_ADDRADJ(x) - EXEC_BYTES_SIZE)) |
#endif /* A_OUT_DYNIX3_H */ |
/contrib/toolchain/binutils/include/aout/encap.h |
---|
0,0 → 1,135 |
/* Yet Another Try at encapsulating bfd object files in coff. |
Copyright 1988, 1989, 1991, 2010 Free Software Foundation, Inc. |
Written by Pace Willisson 12/9/88 |
This file is obsolete. It needs to be converted to just define a bunch |
of stuff that BFD can use to do coff-encapsulated files. --gnu@cygnus.com |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* |
* We only use the coff headers to tell the kernel |
* how to exec the file. Therefore, the only fields that need to |
* be filled in are the scnptr and vaddr for the text and data |
* sections, and the vaddr for the bss. As far as coff is concerned, |
* there is no symbol table, relocation, or line numbers. |
* |
* A normal bsd header (struct exec) is placed after the coff headers, |
* and before the real text. I defined a the new fields 'a_machtype' |
* and a_flags. If a_machtype is M_386, and a_flags & A_ENCAP is |
* true, then the bsd header is preceeded by a coff header. Macros |
* like N_TXTOFF and N_TXTADDR use this field to find the bsd header. |
* |
* The only problem is to track down the bsd exec header. The |
* macros HEADER_OFFSET, etc do this. |
*/ |
#define N_FLAGS_COFF_ENCAPSULATE 0x20 /* coff header precedes bsd header */ |
/* Describe the COFF header used for encapsulation. */ |
struct coffheader |
{ |
/* filehdr */ |
unsigned short f_magic; |
unsigned short f_nscns; |
long f_timdat; |
long f_symptr; |
long f_nsyms; |
unsigned short f_opthdr; |
unsigned short f_flags; |
/* aouthdr */ |
short magic; |
short vstamp; |
long tsize; |
long dsize; |
long bsize; |
long entry; |
long text_start; |
long data_start; |
struct coffscn |
{ |
char s_name[8]; |
long s_paddr; |
long s_vaddr; |
long s_size; |
long s_scnptr; |
long s_relptr; |
long s_lnnoptr; |
unsigned short s_nreloc; |
unsigned short s_nlnno; |
long s_flags; |
} scns[3]; |
}; |
/* Describe some of the parameters of the encapsulation, |
including how to find the encapsulated BSD header. */ |
/* FIXME, this is dumb. The same tools can't handle a.outs for different |
architectures, just because COFF_MAGIC is different; so you need a |
separate GNU nm for every architecture!!? Unfortunately, it needs to |
be this way, since the COFF_MAGIC value is determined by the kernel |
we're trying to fool here. */ |
#define COFF_MAGIC_I386 0514 /* I386MAGIC */ |
#define COFF_MAGIC_M68K 0520 /* MC68MAGIC */ |
#ifdef COFF_MAGIC |
short __header_offset_temp; |
#define HEADER_OFFSET(f) \ |
(__header_offset_temp = 0, \ |
fread ((char *)&__header_offset_temp, sizeof (short), 1, (f)), \ |
fseek ((f), -sizeof (short), 1), \ |
__header_offset_temp==COFF_MAGIC ? sizeof(struct coffheader) : 0) |
#else |
#define HEADER_OFFSET(f) 0 |
#endif |
#define HEADER_SEEK(f) (fseek ((f), HEADER_OFFSET((f)), 1)) |
/* Describe the characteristics of the BSD header |
that appears inside the encapsulation. */ |
/* Encapsulated coff files that are linked ZMAGIC have a text segment |
offset just past the header (and a matching TXTADDR), excluding |
the headers from the text segment proper but keeping the physical |
layout and the virtual memory layout page-aligned. |
Non-encapsulated a.out files that are linked ZMAGIC have a text |
segment that starts at 0 and an N_TXTADR similarly offset to 0. |
They too are page-aligned with each other, but they include the |
a.out header as part of the text. |
The _N_HDROFF gets sizeof struct exec added to it, so we have |
to compensate here. See <a.out.gnu.h>. */ |
#undef _N_HDROFF |
#undef N_TXTADDR |
#undef N_DATADDR |
#define _N_HDROFF(x) ((N_FLAGS(x) & N_FLAGS_COFF_ENCAPSULATE) ? \ |
sizeof (struct coffheader) : 0) |
/* Address of text segment in memory after it is loaded. */ |
#define N_TXTADDR(x) \ |
((N_FLAGS(x) & N_FLAGS_COFF_ENCAPSULATE) ? \ |
sizeof (struct coffheader) + sizeof (struct exec) : 0) |
#define SEGMENT_SIZE 0x400000 |
#define N_DATADDR(x) \ |
((N_FLAGS(x) & N_FLAGS_COFF_ENCAPSULATE) ? \ |
(SEGMENT_SIZE + ((N_TXTADDR(x)+(x).a_text-1) & ~(SEGMENT_SIZE-1))) : \ |
(N_TXTADDR(x)+(x).a_text)) |
/contrib/toolchain/binutils/include/aout/host.h |
---|
0,0 → 1,43 |
/* host.h - Parameters about the a.out format, based on the host system |
on which the program is compiled. |
Copyright 2001, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* Address of data segment in memory after it is loaded. |
It is up to you to define SEGMENT_SIZE on machines not listed here. */ |
#ifndef SEGMENT_SIZE |
#if defined(hp300) || defined(pyr) |
#define SEGMENT_SIZE page_size |
#endif |
#ifdef sony |
#define SEGMENT_SIZE 0x1000 |
#endif /* Sony. */ |
#ifdef is68k |
#define SEGMENT_SIZE 0x20000 |
#endif |
#if defined(m68k) && defined(PORTAR) |
#define TARGET_PAGE_SIZE 0x400 |
#define SEGMENT_SIZE TARGET_PAGE_SIZE |
#endif |
#endif /*!defined(SEGMENT_SIZE)*/ |
/contrib/toolchain/binutils/include/aout/hp.h |
---|
0,0 → 1,83 |
/* Special version of <a.out.h> for use under HP-UX. |
Copyright 1988, 1991, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* THIS FILE IS OBSOLETE. It needs to be revised as a variant "external" |
a.out format for use with BFD. */ |
/* The `exec' structure and overall layout must be close to HP's when |
we are running on an HP system, otherwise we will not be able to |
execute the resulting file. */ |
/* Allow this file to be included twice. */ |
#ifndef __GNU_EXEC_MACROS__ |
struct exec |
{ |
unsigned short a_machtype; /* machine type */ |
unsigned short a_magic; /* magic number */ |
unsigned long a_spare1; |
unsigned long a_spare2; |
unsigned long a_text; /* length of text, in bytes */ |
unsigned long a_data; /* length of data, in bytes */ |
unsigned long a_bss; /* length of uninitialized data area for file, in bytes */ |
unsigned long a_trsize; /* length of relocation info for text, in bytes */ |
unsigned long a_drsize; /* length of relocation info for data, in bytes */ |
unsigned long a_spare3; /* HP = pascal interface size */ |
unsigned long a_spare4; /* HP = symbol table size */ |
unsigned long a_spare5; /* HP = debug name table size */ |
unsigned long a_entry; /* start address */ |
unsigned long a_spare6; /* HP = source line table size */ |
unsigned long a_spare7; /* HP = value table size */ |
unsigned long a_syms; /* length of symbol table data in file, in bytes */ |
unsigned long a_spare8; |
}; |
/* Tell a.out.gnu.h not to define `struct exec'. */ |
#define __STRUCT_EXEC_OVERRIDE__ |
#include "../a.out.gnu.h" |
#undef N_MAGIC |
#undef N_MACHTYPE |
#undef N_FLAGS |
#undef N_SET_INFO |
#undef N_SET_MAGIC |
#undef N_SET_MACHTYPE |
#undef N_SET_FLAGS |
#define N_MAGIC(exec) ((exec) . a_magic) |
#define N_MACHTYPE(exec) ((exec) . a_machtype) |
#define N_SET_MAGIC(exec, magic) (((exec) . a_magic) = (magic)) |
#define N_SET_MACHTYPE(exec, machtype) (((exec) . a_machtype) = (machtype)) |
#undef N_BADMAG |
#define N_BADMAG(x) ((_N_BADMAG (x)) || (_N_BADMACH (x))) |
#define _N_BADMACH(x) \ |
(((N_MACHTYPE (x)) != HP9000S200_ID) && \ |
((N_MACHTYPE (x)) != HP98x6_ID)) |
#define HP98x6_ID 0x20A |
#define HP9000S200_ID 0x20C |
#undef _N_HDROFF |
#define _N_HDROFF(x) (SEGMENT_SIZE - (sizeof (struct exec))) |
#define SEGMENT_SIZE 0x1000 |
#endif /* __GNU_EXEC_MACROS__ */ |
/contrib/toolchain/binutils/include/aout/hp300hpux.h |
---|
0,0 → 1,132 |
/* Special version of <a.out.h> for use under HP-UX. |
Copyright 1988, 1993, 1995, 2001, 2009, 2010 |
Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
struct hp300hpux_exec_bytes |
{ |
unsigned char e_info[4]; /* a_machtype/a_magic */ |
unsigned char e_spare1[4]; |
unsigned char e_spare2[4]; |
unsigned char e_text[4]; /* length of text, in bytes */ |
unsigned char e_data[4]; /* length of data, in bytes */ |
unsigned char e_bss[4]; /* length of uninitialized data area , in bytes */ |
unsigned char e_trsize[4]; /* length of relocation info for text, in bytes*/ |
unsigned char e_drsize[4]; /* length of relocation info for data, in bytes*/ |
unsigned char e_passize[4];/* HP = pascal interface size */ |
unsigned char e_syms[4]; /* HP = symbol table size */ |
unsigned char e_spare5[4]; /* HP = debug name table size */ |
unsigned char e_entry[4]; /* start address */ |
unsigned char e_spare6[4]; /* HP = source line table size */ |
unsigned char e_supsize[4];/* HP = value table size */ |
unsigned char e_drelocs[4]; |
unsigned char e_extension[4]; /* file offset of extension */ |
}; |
#define EXEC_BYTES_SIZE 64 |
struct hp300hpux_nlist_bytes |
{ |
unsigned char e_value[4]; |
unsigned char e_type[1]; |
unsigned char e_length[1]; /* length of ascii symbol name */ |
unsigned char e_almod[2]; /* alignment mod */ |
unsigned char e_shlib[2]; /* info about dynamic linking */ |
}; |
#define EXTERNAL_NLIST_SIZE 10 |
struct hp300hpux_reloc |
{ |
unsigned char r_address[4];/* offset of of data to relocate */ |
unsigned char r_index[2]; /* symbol table index of symbol */ |
unsigned char r_type[1]; /* relocation type */ |
unsigned char r_length[1]; /* length of item to reloc */ |
}; |
struct hp300hpux_header_extension |
{ |
unsigned char e_syms[4]; |
unsigned char unique_headers[12*4]; |
unsigned char e_header[2]; /* type of header */ |
unsigned char e_version[2]; /* version */ |
unsigned char e_size[4]; /* bytes following*/ |
unsigned char e_extension[4];/* file offset of next extension */ |
}; |
#define EXTERNAL_EXTENSION_HEADER_SIZE (16*4) |
/* hpux separates object files (0x106) and impure executables (0x107) */ |
/* but the bfd code does not distinguish between them. Since we want to*/ |
/* read hpux .o files, we add an special define and use it below in */ |
/* offset and address calculations. */ |
#define HPUX_DOT_O_MAGIC 0x106 |
#define OMAGIC 0x107 /* object file or impure executable. */ |
#define NMAGIC 0x108 /* Code indicating pure executable. */ |
#define ZMAGIC 0x10B /* demand-paged executable. */ |
#define N_HEADER_IN_TEXT(x) 0 |
#if 0 /* libaout.h only uses the lower 8 bits */ |
#define HP98x6_ID 0x20A |
#define HP9000S200_ID 0x20C |
#endif |
#define HP98x6_ID 0x0A |
#define HP9000S200_ID 0x0C |
#define N_BADMAG(x) ((_N_BADMAG (x)) || (_N_BADMACH (x))) |
#define N_DATADDR(x) \ |
((N_MAGIC (x) == OMAGIC || N_MAGIC (x) == HPUX_DOT_O_MAGIC) \ |
? (N_TXTADDR (x) + N_TXTSIZE (x)) \ |
: (N_SEGSIZE (x) + ((N_TXTADDR (x) + N_TXTSIZE (x) - 1) \ |
& ~ (bfd_vma) (N_SEGSIZE (x) - 1)))) |
#define _N_BADMACH(x) \ |
(((N_MACHTYPE (x)) != HP9000S200_ID) && ((N_MACHTYPE (x)) != HP98x6_ID)) |
#define _N_BADMAG(x) (N_MAGIC(x) != HPUX_DOT_O_MAGIC \ |
&& N_MAGIC(x) != OMAGIC \ |
&& N_MAGIC(x) != NMAGIC \ |
&& N_MAGIC(x) != ZMAGIC ) |
#undef _N_HDROFF |
#define _N_HDROFF(x) (SEGMENT_SIZE - (sizeof (struct exec))) |
#undef N_DATOFF |
#undef N_PASOFF |
#undef N_SYMOFF |
#undef N_SUPOFF |
#undef N_TRELOFF |
#undef N_DRELOFF |
#undef N_STROFF |
#define N_DATOFF(x) ( N_TXTOFF(x) + N_TXTSIZE(x) ) |
#define N_PASOFF(x) ( N_DATOFF(x) + (x).a_data) |
#define N_SYMOFF(x) ( N_PASOFF(x) /* + (x).a_passize*/ ) |
#define N_SUPOFF(x) ( N_SYMOFF(x) + (x).a_syms ) |
#define N_TRELOFF(x) ( N_SUPOFF(x) /* + 0 (x).a_supsize*/ ) |
#define N_DRELOFF(x) ( N_TRELOFF(x) + (x).a_trsize ) |
#define N_EXTHOFF(x) ( N_DRELOFF(x) /* + 0 (x).a_drsize */) |
#define N_STROFF(x) ( 0 /* no string table */ ) |
/* use these when the file has gnu symbol tables */ |
#define N_GNU_TRELOFF(x) (N_DATOFF(x) + (x).a_data) |
#define N_GNU_DRELOFF(x) (N_GNU_TRELOFF(x) + (x).a_trsize) |
#define N_GNU_SYMOFF(x) (N_GNU_DRELOFF(x) + (x).a_drsize) |
#define TARGET_PAGE_SIZE 0x1000 |
#define SEGMENT_SIZE 0x1000 |
#define TEXT_START_ADDR 0 |
/contrib/toolchain/binutils/include/aout/hppa.h |
---|
0,0 → 1,22 |
/* Copyright 2012 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#include "filehdr.h" |
#include "aouthdr.h" |
#include "scnhdr.h" |
#include "spacehdr.h" |
#include "syms.h" |
/contrib/toolchain/binutils/include/aout/ranlib.h |
---|
0,0 → 1,63 |
/* ranlib.h -- archive library index member definition for GNU. |
Copyright 1990, 1991, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* The Symdef member of an archive contains two things: |
a table that maps symbol-string offsets to file offsets, |
and a symbol-string table. All the symbol names are |
run together (each with trailing null) in the symbol-string |
table. There is a single longword bytecount on the front |
of each of these tables. Thus if we have two symbols, |
"foo" and "_bar", that are in archive members at offsets |
200 and 900, it would look like this: |
16 ; byte count of index table |
0 ; offset of "foo" in string table |
200 ; offset of foo-module in file |
4 ; offset of "bar" in string table |
900 ; offset of bar-module in file |
9 ; byte count of string table |
"foo\0_bar\0" ; string table */ |
#define RANLIBMAG "__.SYMDEF" /* Archive file name containing index */ |
#define RANLIBSKEW 3 /* Creation time offset */ |
/* Format of __.SYMDEF: |
First, a longword containing the size of the 'symdef' data that follows. |
Second, zero or more 'symdef' structures. |
Third, a longword containing the length of symbol name strings. |
Fourth, zero or more symbol name strings (each followed by a null). */ |
struct symdef |
{ |
union |
{ |
unsigned long string_offset; /* In the file */ |
char *name; /* In memory, sometimes */ |
} s; |
/* this points to the front of the file header (AKA member header -- |
a struct ar_hdr), not to the front of the file or into the file). |
in other words it only tells you which file to read */ |
unsigned long file_offset; |
}; |
/* Compatability with BSD code */ |
#define ranlib symdef |
#define ran_un s |
#define ran_strx string_offset |
#define ran_name name |
#define ran_off file_offset |
/contrib/toolchain/binutils/include/aout/reloc.h |
---|
0,0 → 1,67 |
/* reloc.h -- Header file for relocation information. |
Copyright 1989, 1990, 1991, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* Relocation types for a.out files using reloc_info_extended |
(SPARC and AMD 29000). */ |
#ifndef _RELOC_H_READ_ |
#define _RELOC_H_READ_ 1 |
enum reloc_type |
{ |
RELOC_8, RELOC_16, RELOC_32, /* simple relocations */ |
RELOC_DISP8, RELOC_DISP16, RELOC_DISP32, /* pc-rel displacement */ |
RELOC_WDISP30, RELOC_WDISP22, |
RELOC_HI22, RELOC_22, |
RELOC_13, RELOC_LO10, |
RELOC_SFA_BASE, RELOC_SFA_OFF13, |
RELOC_BASE10, RELOC_BASE13, RELOC_BASE22, /* P.I.C. (base-relative) */ |
RELOC_PC10, RELOC_PC22, /* for some sort of pc-rel P.I.C. (?) */ |
RELOC_JMP_TBL, /* P.I.C. jump table */ |
RELOC_SEGOFF16, /* reputedly for shared libraries somehow */ |
RELOC_GLOB_DAT, RELOC_JMP_SLOT, RELOC_RELATIVE, |
RELOC_11, |
RELOC_WDISP2_14, |
RELOC_WDISP19, |
RELOC_HHI22, |
RELOC_HLO10, |
/* 29K relocation types */ |
RELOC_JUMPTARG, RELOC_CONST, RELOC_CONSTH, |
RELOC_WDISP14, RELOC_WDISP21, |
NO_RELOC |
}; |
#define RELOC_TYPE_NAMES \ |
"8", "16", "32", "DISP8", \ |
"DISP16", "DISP32", "WDISP30", "WDISP22", \ |
"HI22", "22", "13", "LO10", \ |
"SFA_BASE", "SFAOFF13", "BASE10", "BASE13", \ |
"BASE22", "PC10", "PC22", "JMP_TBL", \ |
"SEGOFF16", "GLOB_DAT", "JMP_SLOT", "RELATIVE", \ |
"11", "WDISP2_14", "WDISP19", "HHI22", \ |
"HLO10", \ |
"JUMPTARG", "CONST", "CONSTH", "WDISP14", \ |
"WDISP21", \ |
"NO_RELOC" |
#endif /* _RELOC_H_READ_ */ |
/* end of reloc.h */ |
/contrib/toolchain/binutils/include/aout/stab.def |
---|
0,0 → 1,283 |
/* Table of DBX symbol codes for the GNU system. |
Copyright 1988, 1991, 1992, 1993, 1994, 1996, 1998, 2004, 2010 |
Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or |
modify it under the terms of the GNU General Public License as |
published by the Free Software Foundation; either version 3 of the |
License, or (at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* New stab from Solaris 2. This uses an n_type of 0, which in a.out files |
overlaps the N_UNDF used for ordinary symbols. In ELF files, the |
debug information is in a different file section, so there is no conflict. |
This symbol's n_value gives the size of the string section associated |
with this file. The symbol's n_strx (relative to the just-updated |
string section start address) gives the name of the source file, |
e.g. "foo.c", without any path information. The symbol's n_desc gives |
the count of upcoming symbols associated with this file (not including |
this one). */ |
/* __define_stab (N_UNDF, 0x00, "UNDF") */ |
/* Global variable. Only the name is significant. |
To find the address, look in the corresponding external symbol. */ |
__define_stab (N_GSYM, 0x20, "GSYM") |
/* Function name for BSD Fortran. Only the name is significant. |
To find the address, look in the corresponding external symbol. */ |
__define_stab (N_FNAME, 0x22, "FNAME") |
/* Function name or text-segment variable for C. Value is its address. |
Desc is supposedly starting line number, but GCC doesn't set it |
and DBX seems not to miss it. */ |
__define_stab (N_FUN, 0x24, "FUN") |
/* Data-segment variable with internal linkage. Value is its address. |
"Static Sym". */ |
__define_stab (N_STSYM, 0x26, "STSYM") |
/* BSS-segment variable with internal linkage. Value is its address. */ |
__define_stab (N_LCSYM, 0x28, "LCSYM") |
/* Name of main routine. Only the name is significant. */ |
__define_stab (N_MAIN, 0x2a, "MAIN") |
/* Solaris2: Read-only data symbols. */ |
__define_stab (N_ROSYM, 0x2c, "ROSYM") |
/* MacOS X: |
The beginning of a relocatable function block - including stabs. */ |
__define_stab (N_BNSYM, 0x2e, "BNSYM") |
/* Global symbol in Pascal. |
Supposedly the value is its line number; I'm skeptical. */ |
__define_stab (N_PC, 0x30, "PC") |
/* Number of symbols: 0, files,,funcs,lines according to Ultrix V4.0. */ |
__define_stab (N_NSYMS, 0x32, "NSYMS") |
/* "No DST map for sym: name, ,0,type,ignored" according to Ultrix V4.0. */ |
__define_stab (N_NOMAP, 0x34, "NOMAP") |
/* New stab from Solaris 2. Like N_SO, but for the object file. Two in |
a row provide the build directory and the relative path of the .o from it. |
Solaris2 uses this to avoid putting the stabs info into the linked |
executable; this stab goes into the ".stab.index" section, and the debugger |
reads the real stabs directly from the .o files instead. */ |
__define_stab (N_OBJ, 0x38, "OBJ") |
/* New stab from Solaris 2. Options for the debugger, related to the |
source language for this module. E.g. whether to use ANSI |
integral promotions or traditional integral promotions. */ |
__define_stab (N_OPT, 0x3c, "OPT") |
/* Register variable. Value is number of register. */ |
__define_stab (N_RSYM, 0x40, "RSYM") |
/* Modula-2 compilation unit. Can someone say what info it contains? */ |
__define_stab (N_M2C, 0x42, "M2C") |
/* Line number in text segment. Desc is the line number; |
value is corresponding address. On Solaris2, the line number is |
relative to the start of the current function. */ |
__define_stab (N_SLINE, 0x44, "SLINE") |
/* Similar, for data segment. */ |
__define_stab (N_DSLINE, 0x46, "DSLINE") |
/* Similar, for bss segment. */ |
__define_stab (N_BSLINE, 0x48, "BSLINE") |
/* Sun's source-code browser stabs. ?? Don't know what the fields are. |
Supposedly the field is "path to associated .cb file". THIS VALUE |
OVERLAPS WITH N_BSLINE! */ |
__define_stab_duplicate (N_BROWS, 0x48, "BROWS") |
/* GNU Modula-2 definition module dependency. Value is the modification time |
of the definition file. Other is non-zero if it is imported with the |
GNU M2 keyword %INITIALIZE. Perhaps N_M2C can be used if there |
are enough empty fields? */ |
__define_stab(N_DEFD, 0x4a, "DEFD") |
/* New in Solaris2. Function start/body/end line numbers. */ |
__define_stab(N_FLINE, 0x4C, "FLINE") |
/* MacOS X: This tells the end of a relocatable function + debugging info. */ |
__define_stab(N_ENSYM, 0x4E, "ENSYM") |
/* THE FOLLOWING TWO STAB VALUES CONFLICT. Happily, one is for Modula-2 |
and one is for C++. Still,... */ |
/* GNU C++ exception variable. Name is variable name. */ |
__define_stab (N_EHDECL, 0x50, "EHDECL") |
/* Modula2 info "for imc": name,,0,0,0 according to Ultrix V4.0. */ |
__define_stab_duplicate (N_MOD2, 0x50, "MOD2") |
/* GNU C++ `catch' clause. Value is its address. Desc is nonzero if |
this entry is immediately followed by a CAUGHT stab saying what exception |
was caught. Multiple CAUGHT stabs means that multiple exceptions |
can be caught here. If Desc is 0, it means all exceptions are caught |
here. */ |
__define_stab (N_CATCH, 0x54, "CATCH") |
/* Structure or union element. Value is offset in the structure. */ |
__define_stab (N_SSYM, 0x60, "SSYM") |
/* Solaris2: Last stab emitted for module. */ |
__define_stab (N_ENDM, 0x62, "ENDM") |
/* Name of main source file. |
Value is starting text address of the compilation. |
If multiple N_SO's appear, the first to contain a trailing / is the |
compilation directory. The first to not contain a trailing / is the |
source file name, relative to the compilation directory. Others (perhaps |
resulting from cfront) are ignored. |
On Solaris2, value is undefined, but desc is a source-language code. */ |
__define_stab (N_SO, 0x64, "SO") |
/* Apple: This is the stab that associated the .o file with the |
N_SO stab, in the case where debug info is mostly stored in the .o file. */ |
__define_stab (N_OSO, 0x66, "OSO") |
/* SunPro F77: Name of alias. */ |
__define_stab (N_ALIAS, 0x6c, "ALIAS") |
/* Automatic variable in the stack. Value is offset from frame pointer. |
Also used for type descriptions. */ |
__define_stab (N_LSYM, 0x80, "LSYM") |
/* Beginning of an include file. Only Sun uses this. |
In an object file, only the name is significant. |
The Sun linker puts data into some of the other fields. */ |
__define_stab (N_BINCL, 0x82, "BINCL") |
/* Name of sub-source file (#include file). |
Value is starting text address of the compilation. */ |
__define_stab (N_SOL, 0x84, "SOL") |
/* Parameter variable. Value is offset from argument pointer. |
(On most machines the argument pointer is the same as the frame pointer. */ |
__define_stab (N_PSYM, 0xa0, "PSYM") |
/* End of an include file. No name. |
This and N_BINCL act as brackets around the file's output. |
In an object file, there is no significant data in this entry. |
The Sun linker puts data into some of the fields. */ |
__define_stab (N_EINCL, 0xa2, "EINCL") |
/* Alternate entry point. Value is its address. */ |
__define_stab (N_ENTRY, 0xa4, "ENTRY") |
/* Beginning of lexical block. |
The desc is the nesting level in lexical blocks. |
The value is the address of the start of the text for the block. |
The variables declared inside the block *precede* the N_LBRAC symbol. |
On Solaris2, the value is relative to the start of the current function. */ |
__define_stab (N_LBRAC, 0xc0, "LBRAC") |
/* Place holder for deleted include file. Replaces a N_BINCL and everything |
up to the corresponding N_EINCL. The Sun linker generates these when |
it finds multiple identical copies of the symbols from an include file. |
This appears only in output from the Sun linker. */ |
__define_stab (N_EXCL, 0xc2, "EXCL") |
/* Modula-2 scope information. Can someone say what info it contains? */ |
__define_stab (N_SCOPE, 0xc4, "SCOPE") |
/* Solaris2: Patch Run Time Checker. */ |
__define_stab (N_PATCH, 0xd0, "PATCH") |
/* End of a lexical block. Desc matches the N_LBRAC's desc. |
The value is the address of the end of the text for the block. |
On Solaris2, the value is relative to the start of the current function. */ |
__define_stab (N_RBRAC, 0xe0, "RBRAC") |
/* Begin named common block. Only the name is significant. */ |
__define_stab (N_BCOMM, 0xe2, "BCOMM") |
/* End named common block. Only the name is significant |
(and it should match the N_BCOMM). */ |
__define_stab (N_ECOMM, 0xe4, "ECOMM") |
/* Member of a common block; value is offset within the common block. |
This should occur within a BCOMM/ECOMM pair. */ |
__define_stab (N_ECOML, 0xe8, "ECOML") |
/* Solaris2: Pascal "with" statement: type,,0,0,offset */ |
__define_stab (N_WITH, 0xea, "WITH") |
/* These STAB's are used on Gould systems for Non-Base register symbols |
or something like that. FIXME. I have assigned the values at random |
since I don't have a Gould here. Fixups from Gould folk welcome... */ |
__define_stab (N_NBTEXT, 0xF0, "NBTEXT") |
__define_stab (N_NBDATA, 0xF2, "NBDATA") |
__define_stab (N_NBBSS, 0xF4, "NBBSS") |
__define_stab (N_NBSTS, 0xF6, "NBSTS") |
__define_stab (N_NBLCS, 0xF8, "NBLCS") |
/* Second symbol entry containing a length-value for the preceding entry. |
The value is the length. */ |
__define_stab (N_LENG, 0xfe, "LENG") |
/* The above information, in matrix format. |
STAB MATRIX |
_________________________________________________ |
| 00 - 1F are not dbx stab symbols | |
| In most cases, the low bit is the EXTernal bit| |
| 00 UNDEF | 02 ABS | 04 TEXT | 06 DATA | |
| 01 |EXT | 03 |EXT | 05 |EXT | 07 |EXT | |
| 08 BSS | 0A INDR | 0C FN_SEQ | 0E WEAKA | |
| 09 |EXT | 0B | 0D WEAKU | 0F WEAKT | |
| 10 WEAKD | 12 COMM | 14 SETA | 16 SETT | |
| 11 WEAKB | 13 | 15 | 17 | |
| 18 SETD | 1A SETB | 1C SETV | 1E WARNING| |
| 19 | 1B | 1D | 1F FN | |
|_______________________________________________| |
| Debug entries with bit 01 set are unused. | |
| 20 GSYM | 22 FNAME | 24 FUN | 26 STSYM | |
| 28 LCSYM | 2A MAIN | 2C ROSYM | 2E | |
| 30 PC | 32 NSYMS | 34 NOMAP | 36 | |
| 38 OBJ | 3A | 3C OPT | 3E | |
| 40 RSYM | 42 M2C | 44 SLINE | 46 DSLINE | |
| 48 BSLINE*| 4A DEFD | 4C FLINE | 4E | |
| 50 EHDECL*| 52 | 54 CATCH | 56 | |
| 58 | 5A | 5C | 5E | |
| 60 SSYM | 62 ENDM | 64 SO | 66 | |
| 68 | 6A | 6C ALIAS | 6E | |
| 70 | 72 | 74 | 76 | |
| 78 | 7A | 7C | 7E | |
| 80 LSYM | 82 BINCL | 84 SOL | 86 | |
| 88 | 8A | 8C | 8E | |
| 90 | 92 | 94 | 96 | |
| 98 | 9A | 9C | 9E | |
| A0 PSYM | A2 EINCL | A4 ENTRY | A6 | |
| A8 | AA | AC | AE | |
| B0 | B2 | B4 | B6 | |
| B8 | BA | BC | BE | |
| C0 LBRAC | C2 EXCL | C4 SCOPE | C6 | |
| C8 | CA | CC | CE | |
| D0 PATCH | D2 | D4 | D6 | |
| D8 | DA | DC | DE | |
| E0 RBRAC | E2 BCOMM | E4 ECOMM | E6 | |
| E8 ECOML | EA WITH | EC | EE | |
| F0 | F2 | F4 | F6 | |
| F8 | FA | FC | FE LENG | |
+-----------------------------------------------+ |
* 50 EHDECL is also MOD2. |
* 48 BSLINE is also BROWS. |
*/ |
/contrib/toolchain/binutils/include/aout/stab_gnu.h |
---|
0,0 → 1,55 |
/* gnu_stab.h Definitions for GNU extensions to STABS |
Copyright 2001, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef __GNU_STAB__ |
/* Indicate the GNU stab.h is in use. */ |
#define __GNU_STAB__ |
#define __define_stab(NAME, CODE, STRING) NAME=CODE, |
#define __define_stab_duplicate(NAME, CODE, STRING) NAME=CODE, |
enum __stab_debug_code |
{ |
#include "aout/stab.def" |
LAST_UNUSED_STAB_CODE |
}; |
#undef __define_stab |
/* Definitions of "desc" field for N_SO stabs in Solaris2. */ |
#define N_SO_AS 1 |
#define N_SO_C 2 |
#define N_SO_ANSI_C 3 |
#define N_SO_CC 4 /* C++ */ |
#define N_SO_FORTRAN 5 |
#define N_SO_PASCAL 6 |
/* Solaris2: Floating point type values in basic types. */ |
#define NF_NONE 0 |
#define NF_SINGLE 1 /* IEEE 32-bit */ |
#define NF_DOUBLE 2 /* IEEE 64-bit */ |
#define NF_COMPLEX 3 /* Fortran complex */ |
#define NF_COMPLEX16 4 /* Fortran double complex */ |
#define NF_COMPLEX32 5 /* Fortran complex*16 */ |
#define NF_LDOUBLE 6 /* Long double (whatever that is) */ |
#endif /* __GNU_STAB_ */ |
/contrib/toolchain/binutils/include/aout/sun4.h |
---|
0,0 → 1,239 |
/* SPARC-specific values for a.out files |
Copyright 2001, 2009, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* Some systems, e.g., AIX, may have defined this in header files already |
included. */ |
#undef TARGET_PAGE_SIZE |
#define TARGET_PAGE_SIZE 0x2000 /* 8K. aka NBPG in <sys/param.h> */ |
/* Note that some SPARCs have 4K pages, some 8K, some others. */ |
#define SEG_SIZE_SPARC TARGET_PAGE_SIZE |
#define SEG_SIZE_SUN3 0x20000 /* Resolution of r/w protection hw */ |
#define TEXT_START_ADDR TARGET_PAGE_SIZE /* Location 0 is not accessible */ |
#define N_HEADER_IN_TEXT(x) 1 |
/* Non-default definitions of the accessor macros... */ |
/* Segment size varies on Sun-3 versus Sun-4. */ |
#define N_SEGSIZE(x) (N_MACHTYPE(x) == M_SPARC? SEG_SIZE_SPARC: \ |
N_MACHTYPE(x) == M_68020? SEG_SIZE_SUN3: \ |
/* Guess? */ TARGET_PAGE_SIZE) |
/* Virtual Address of text segment from the a.out file. For OMAGIC, |
(almost always "unlinked .o's" these days), should be zero. |
Sun added a kludge so that shared libraries linked ZMAGIC get |
an address of zero if a_entry (!!!) is lower than the otherwise |
expected text address. These kludges have gotta go! |
For linked files, should reflect reality if we know it. */ |
#define N_SHARED_LIB(x) ((x).a_entry < TEXT_START_ADDR \ |
&& (x).a_text >= EXEC_BYTES_SIZE) |
/* This differs from the version in aout64.h (which we override by defining |
it here) only for NMAGIC (we return TEXT_START_ADDR+EXEC_BYTES_SIZE; |
they return 0). */ |
#define N_TXTADDR(x) \ |
(N_MAGIC(x)==OMAGIC? 0 \ |
: (N_MAGIC(x) == ZMAGIC && (x).a_entry < TEXT_START_ADDR)? 0 \ |
: TEXT_START_ADDR+EXEC_BYTES_SIZE) |
/* When a file is linked against a shared library on SunOS 4, the |
dynamic bit in the exec header is set, and the first symbol in the |
symbol table is __DYNAMIC. Its value is the address of the |
following structure. */ |
struct external_sun4_dynamic |
{ |
/* The version number of the structure. SunOS 4.1.x creates files |
with version number 3, which is what this structure is based on. |
According to gdb, version 2 is similar. I believe that version 2 |
used a different type of procedure linkage table, and there may |
have been other differences. */ |
bfd_byte ld_version[4]; |
/* The virtual address of a 28 byte structure used in debugging. |
The contents are filled in at run time by ld.so. */ |
bfd_byte ldd[4]; |
/* The virtual address of another structure with information about |
how to relocate the executable at run time. */ |
bfd_byte ld[4]; |
}; |
/* The size of the debugging structure pointed to by the debugger |
field of __DYNAMIC. */ |
#define EXTERNAL_SUN4_DYNAMIC_DEBUGGER_SIZE (24) |
/* The structure pointed to by the linker field of __DYNAMIC. As far |
as I can tell, most of the addresses in this structure are offsets |
within the file, but some are actually virtual addresses. */ |
struct internal_sun4_dynamic_link |
{ |
/* Linked list of loaded objects. This is filled in at runtime by |
ld.so and probably by dlopen. */ |
unsigned long ld_loaded; |
/* The address of the list of names of shared objects which must be |
included at runtime. Each entry in the list is 16 bytes: the 4 |
byte address of the string naming the object (e.g., for -lc this |
is "c"); 4 bytes of flags--the high bit is whether to search for |
the object using the library path; the 2 byte major version |
number; the 2 byte minor version number; the 4 byte address of |
the next entry in the list (zero if this is the last entry). The |
version numbers seem to only be non-zero when doing library |
searching. */ |
unsigned long ld_need; |
/* The address of the path to search for the shared objects which |
must be included. This points to a string in PATH format which |
is generated from the -L arguments to the linker. According to |
the man page, ld.so implicitly adds ${LD_LIBRARY_PATH} to the |
beginning of this string and /lib:/usr/lib:/usr/local/lib to the |
end. The string is terminated by a null byte. This field is |
zero if there is no additional path. */ |
unsigned long ld_rules; |
/* The address of the global offset table. This appears to be a |
virtual address, not a file offset. The first entry in the |
global offset table seems to be the virtual address of the |
sun4_dynamic structure (the same value as the __DYNAMIC symbol). |
The global offset table is used for PIC code to hold the |
addresses of variables. A dynamically linked file which does not |
itself contain PIC code has a four byte global offset table. */ |
unsigned long ld_got; |
/* The address of the procedure linkage table. This appears to be a |
virtual address, not a file offset. |
On a SPARC, the table is composed of 12 byte entries, each of |
which consists of three instructions. The first entry is |
sethi %hi(0),%g1 |
jmp %g1 |
nop |
These instructions are changed by ld.so into a jump directly into |
ld.so itself. Each subsequent entry is |
save %sp, -96, %sp |
call <address of first entry in procedure linkage table> |
<reloc_number | 0x01000000> |
The reloc_number is the number of the reloc to use to resolve |
this entry. The reloc will be a JMP_SLOT reloc against some |
symbol that is not defined in this object file but should be |
defined in a shared object (if it is not, ld.so will report a |
runtime error and exit). The constant 0x010000000 turns the |
reloc number into a sethi of %g0, which does nothing since %g0 is |
hardwired to zero. |
When one of these entries is executed, it winds up calling into |
ld.so. ld.so looks at the reloc number, available via the return |
address, to determine which entry this is. It then looks at the |
reloc and patches up the entry in the table into a sethi and jmp |
to the real address followed by a nop. This means that the reloc |
lookup only has to happen once, and it also means that the |
relocation only needs to be done if the function is actually |
called. The relocation is expensive because ld.so must look up |
the symbol by name. |
The size of the procedure linkage table is given by the ld_plt_sz |
field. */ |
unsigned long ld_plt; |
/* The address of the relocs. These are in the same format as |
ordinary relocs. Symbol index numbers refer to the symbols |
pointed to by ld_stab. I think the only way to determine the |
number of relocs is to assume that all the bytes from ld_rel to |
ld_hash contain reloc entries. */ |
unsigned long ld_rel; |
/* The address of a hash table of symbols. The hash table has |
roughly the same number of entries as there are dynamic symbols; |
I think the only way to get the exact size is to assume that |
every byte from ld_hash to ld_stab is devoted to the hash table. |
Each entry in the hash table is eight bytes. The first four |
bytes are a symbol index into the dynamic symbols. The second |
four bytes are the index of the next hash table entry in the |
bucket. The ld_buckets field gives the number of buckets, say B. |
The first B entries in the hash table each start a bucket which |
is chained through the second four bytes of each entry. A value |
of zero ends the chain. |
The hash function is simply |
h = 0; |
while (*string != '\0') |
h = (h << 1) + *string++; |
h &= 0x7fffffff; |
To look up a symbol, compute the hash value of the name. Take |
the modulos of hash value and the number of buckets. Start at |
that entry in the hash table. See if the symbol (from the first |
four bytes of the hash table entry) has the name you are looking |
for. If not, use the chain field (the second four bytes of the |
hash table entry) to move on to the next entry in this bucket. |
If the chain field is zero you have reached the end of the |
bucket, and the symbol is not in the hash table. */ |
unsigned long ld_hash; |
/* The address of the symbol table. This is a list of |
external_nlist structures. The string indices are relative to |
the ld_symbols field. I think the only way to determine the |
number of symbols is to assume that all the bytes between ld_stab |
and ld_symbols are external_nlist structures. */ |
unsigned long ld_stab; |
/* I don't know what this is for. It seems to always be zero. */ |
unsigned long ld_stab_hash; |
/* The number of buckets in the hash table. */ |
unsigned long ld_buckets; |
/* The address of the symbol string table. The first string in this |
string table need not be the empty string. */ |
unsigned long ld_symbols; |
/* The size in bytes of the symbol string table. */ |
unsigned long ld_symb_size; |
/* The size in bytes of the text segment. */ |
unsigned long ld_text; |
/* The size in bytes of the procedure linkage table. */ |
unsigned long ld_plt_sz; |
}; |
/* The external form of the structure. */ |
struct external_sun4_dynamic_link |
{ |
bfd_byte ld_loaded[4]; |
bfd_byte ld_need[4]; |
bfd_byte ld_rules[4]; |
bfd_byte ld_got[4]; |
bfd_byte ld_plt[4]; |
bfd_byte ld_rel[4]; |
bfd_byte ld_hash[4]; |
bfd_byte ld_stab[4]; |
bfd_byte ld_stab_hash[4]; |
bfd_byte ld_buckets[4]; |
bfd_byte ld_symbols[4]; |
bfd_byte ld_symb_size[4]; |
bfd_byte ld_text[4]; |
bfd_byte ld_plt_sz[4]; |
}; |
/contrib/toolchain/binutils/include/bfdlink.h |
---|
0,0 → 1,842 |
/* bfdlink.h -- header file for BFD link routines |
Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, |
2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 |
Free Software Foundation, Inc. |
Written by Steve Chamberlain and Ian Lance Taylor, Cygnus Support. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef BFDLINK_H |
#define BFDLINK_H |
/* Which symbols to strip during a link. */ |
enum bfd_link_strip |
{ |
strip_none, /* Don't strip any symbols. */ |
strip_debugger, /* Strip debugging symbols. */ |
strip_some, /* keep_hash is the list of symbols to keep. */ |
strip_all /* Strip all symbols. */ |
}; |
/* Which local symbols to discard during a link. This is irrelevant |
if strip_all is used. */ |
enum bfd_link_discard |
{ |
discard_sec_merge, /* Discard local temporary symbols in SEC_MERGE |
sections. */ |
discard_none, /* Don't discard any locals. */ |
discard_l, /* Discard local temporary symbols. */ |
discard_all /* Discard all locals. */ |
}; |
/* Describes the type of hash table entry structure being used. |
Different hash table structure have different fields and so |
support different linking features. */ |
enum bfd_link_hash_table_type |
{ |
bfd_link_generic_hash_table, |
bfd_link_elf_hash_table |
}; |
/* These are the possible types of an entry in the BFD link hash |
table. */ |
enum bfd_link_hash_type |
{ |
bfd_link_hash_new, /* Symbol is new. */ |
bfd_link_hash_undefined, /* Symbol seen before, but undefined. */ |
bfd_link_hash_undefweak, /* Symbol is weak and undefined. */ |
bfd_link_hash_defined, /* Symbol is defined. */ |
bfd_link_hash_defweak, /* Symbol is weak and defined. */ |
bfd_link_hash_common, /* Symbol is common. */ |
bfd_link_hash_indirect, /* Symbol is an indirect link. */ |
bfd_link_hash_warning /* Like indirect, but warn if referenced. */ |
}; |
enum bfd_link_common_skip_ar_symbols |
{ |
bfd_link_common_skip_none, |
bfd_link_common_skip_text, |
bfd_link_common_skip_data, |
bfd_link_common_skip_all |
}; |
struct bfd_link_hash_common_entry |
{ |
unsigned int alignment_power; /* Alignment. */ |
asection *section; /* Symbol section. */ |
}; |
/* The linking routines use a hash table which uses this structure for |
its elements. */ |
struct bfd_link_hash_entry |
{ |
/* Base hash table entry structure. */ |
struct bfd_hash_entry root; |
/* Type of this entry. */ |
ENUM_BITFIELD (bfd_link_hash_type) type : 8; |
unsigned int non_ir_ref : 1; |
/* A union of information depending upon the type. */ |
union |
{ |
/* Nothing is kept for bfd_hash_new. */ |
/* bfd_link_hash_undefined, bfd_link_hash_undefweak. */ |
struct |
{ |
/* Undefined and common symbols are kept in a linked list through |
this field. This field is present in all of the union element |
so that we don't need to remove entries from the list when we |
change their type. Removing entries would either require the |
list to be doubly linked, which would waste more memory, or |
require a traversal. When an undefined or common symbol is |
created, it should be added to this list, the head of which is in |
the link hash table itself. As symbols are defined, they need |
not be removed from the list; anything which reads the list must |
doublecheck the symbol type. |
Weak symbols are not kept on this list. |
Defined and defweak symbols use this field as a reference marker. |
If the field is not NULL, or this structure is the tail of the |
undefined symbol list, the symbol has been referenced. If the |
symbol is undefined and becomes defined, this field will |
automatically be non-NULL since the symbol will have been on the |
undefined symbol list. */ |
struct bfd_link_hash_entry *next; |
bfd *abfd; /* BFD symbol was found in. */ |
} undef; |
/* bfd_link_hash_defined, bfd_link_hash_defweak. */ |
struct |
{ |
struct bfd_link_hash_entry *next; |
asection *section; /* Symbol section. */ |
bfd_vma value; /* Symbol value. */ |
} def; |
/* bfd_link_hash_indirect, bfd_link_hash_warning. */ |
struct |
{ |
struct bfd_link_hash_entry *next; |
struct bfd_link_hash_entry *link; /* Real symbol. */ |
const char *warning; /* Warning (bfd_link_hash_warning only). */ |
} i; |
/* bfd_link_hash_common. */ |
struct |
{ |
struct bfd_link_hash_entry *next; |
/* The linker needs to know three things about common |
symbols: the size, the alignment, and the section in |
which the symbol should be placed. We store the size |
here, and we allocate a small structure to hold the |
section and the alignment. The alignment is stored as a |
power of two. We don't store all the information |
directly because we don't want to increase the size of |
the union; this structure is a major space user in the |
linker. */ |
struct bfd_link_hash_common_entry *p; |
bfd_size_type size; /* Common symbol size. */ |
} c; |
} u; |
}; |
/* This is the link hash table. It is a derived class of |
bfd_hash_table. */ |
struct bfd_link_hash_table |
{ |
/* The hash table itself. */ |
struct bfd_hash_table table; |
/* A linked list of undefined and common symbols, linked through the |
next field in the bfd_link_hash_entry structure. */ |
struct bfd_link_hash_entry *undefs; |
/* Entries are added to the tail of the undefs list. */ |
struct bfd_link_hash_entry *undefs_tail; |
/* The type of the link hash table. */ |
enum bfd_link_hash_table_type type; |
}; |
/* Look up an entry in a link hash table. If FOLLOW is TRUE, this |
follows bfd_link_hash_indirect and bfd_link_hash_warning links to |
the real symbol. */ |
extern struct bfd_link_hash_entry *bfd_link_hash_lookup |
(struct bfd_link_hash_table *, const char *, bfd_boolean create, |
bfd_boolean copy, bfd_boolean follow); |
/* Look up an entry in the main linker hash table if the symbol might |
be wrapped. This should only be used for references to an |
undefined symbol, not for definitions of a symbol. */ |
extern struct bfd_link_hash_entry *bfd_wrapped_link_hash_lookup |
(bfd *, struct bfd_link_info *, const char *, bfd_boolean, |
bfd_boolean, bfd_boolean); |
/* Traverse a link hash table. */ |
extern void bfd_link_hash_traverse |
(struct bfd_link_hash_table *, |
bfd_boolean (*) (struct bfd_link_hash_entry *, void *), |
void *); |
/* Add an entry to the undefs list. */ |
extern void bfd_link_add_undef |
(struct bfd_link_hash_table *, struct bfd_link_hash_entry *); |
/* Remove symbols from the undefs list that don't belong there. */ |
extern void bfd_link_repair_undef_list |
(struct bfd_link_hash_table *table); |
/* Read symbols and cache symbol pointer array in outsymbols. */ |
extern bfd_boolean bfd_generic_link_read_symbols (bfd *); |
struct bfd_sym_chain |
{ |
struct bfd_sym_chain *next; |
const char *name; |
}; |
/* How to handle unresolved symbols. |
There are four possibilities which are enumerated below: */ |
enum report_method |
{ |
/* This is the initial value when then link_info structure is created. |
It allows the various stages of the linker to determine whether they |
allowed to set the value. */ |
RM_NOT_YET_SET = 0, |
RM_IGNORE, |
RM_GENERATE_WARNING, |
RM_GENERATE_ERROR |
}; |
typedef enum {with_flags, without_flags} flag_type; |
/* A section flag list. */ |
struct flag_info_list |
{ |
flag_type with; |
const char *name; |
bfd_boolean valid; |
struct flag_info_list *next; |
}; |
/* Section flag info. */ |
struct flag_info |
{ |
flagword only_with_flags; |
flagword not_with_flags; |
struct flag_info_list *flag_list; |
bfd_boolean flags_initialized; |
}; |
struct bfd_elf_dynamic_list; |
struct bfd_elf_version_tree; |
/* This structure holds all the information needed to communicate |
between BFD and the linker when doing a link. */ |
struct bfd_link_info |
{ |
/* TRUE if BFD should generate a shared object (or a pie). */ |
unsigned int shared: 1; |
/* TRUE if generating an executable, position independent or not. */ |
unsigned int executable : 1; |
/* TRUE if generating a position independent executable. */ |
unsigned int pie: 1; |
/* TRUE if BFD should generate a relocatable object file. */ |
unsigned int relocatable: 1; |
/* TRUE if BFD should pre-bind symbols in a shared object. */ |
unsigned int symbolic: 1; |
/* TRUE if executable should not contain copy relocs. |
Setting this true may result in a non-sharable text segment. */ |
unsigned int nocopyreloc: 1; |
/* TRUE if BFD should export all symbols in the dynamic symbol table |
of an executable, rather than only those used. */ |
unsigned int export_dynamic: 1; |
/* TRUE if a default symbol version should be created and used for |
exported symbols. */ |
unsigned int create_default_symver: 1; |
/* TRUE if unreferenced sections should be removed. */ |
unsigned int gc_sections: 1; |
/* TRUE if every symbol should be reported back via the notice |
callback. */ |
unsigned int notice_all: 1; |
/* TRUE if we are loading LTO outputs. */ |
unsigned int loading_lto_outputs: 1; |
/* TRUE if global symbols in discarded sections should be stripped. */ |
unsigned int strip_discarded: 1; |
/* TRUE if all data symbols should be dynamic. */ |
unsigned int dynamic_data: 1; |
/* Which symbols to strip. */ |
ENUM_BITFIELD (bfd_link_strip) strip : 2; |
/* Which local symbols to discard. */ |
ENUM_BITFIELD (bfd_link_discard) discard : 2; |
/* Criteria for skipping symbols when determining |
whether to include an object from an archive. */ |
ENUM_BITFIELD (bfd_link_common_skip_ar_symbols) common_skip_ar_symbols : 2; |
/* What to do with unresolved symbols in an object file. |
When producing executables the default is GENERATE_ERROR. |
When producing shared libraries the default is IGNORE. The |
assumption with shared libraries is that the reference will be |
resolved at load/execution time. */ |
ENUM_BITFIELD (report_method) unresolved_syms_in_objects : 2; |
/* What to do with unresolved symbols in a shared library. |
The same defaults apply. */ |
ENUM_BITFIELD (report_method) unresolved_syms_in_shared_libs : 2; |
/* TRUE if shared objects should be linked directly, not shared. */ |
unsigned int static_link: 1; |
/* TRUE if symbols should be retained in memory, FALSE if they |
should be freed and reread. */ |
unsigned int keep_memory: 1; |
/* TRUE if BFD should generate relocation information in the final |
executable. */ |
unsigned int emitrelocations: 1; |
/* TRUE if PT_GNU_RELRO segment should be created. */ |
unsigned int relro: 1; |
/* TRUE if .eh_frame_hdr section and PT_GNU_EH_FRAME ELF segment |
should be created. */ |
unsigned int eh_frame_hdr: 1; |
/* TRUE if we should warn when adding a DT_TEXTREL to a shared object. */ |
unsigned int warn_shared_textrel: 1; |
/* TRUE if we should error when adding a DT_TEXTREL. */ |
unsigned int error_textrel: 1; |
/* TRUE if .hash section should be created. */ |
unsigned int emit_hash: 1; |
/* TRUE if .gnu.hash section should be created. */ |
unsigned int emit_gnu_hash: 1; |
/* If TRUE reduce memory overheads, at the expense of speed. This will |
cause map file generation to use an O(N^2) algorithm and disable |
caching ELF symbol buffer. */ |
unsigned int reduce_memory_overheads: 1; |
/* TRUE if the output file should be in a traditional format. This |
is equivalent to the setting of the BFD_TRADITIONAL_FORMAT flag |
on the output file, but may be checked when reading the input |
files. */ |
unsigned int traditional_format: 1; |
/* TRUE if non-PLT relocs should be merged into one reloc section |
and sorted so that relocs against the same symbol come together. */ |
unsigned int combreloc: 1; |
/* TRUE if a default symbol version should be created and used for |
imported symbols. */ |
unsigned int default_imported_symver: 1; |
/* TRUE if the new ELF dynamic tags are enabled. */ |
unsigned int new_dtags: 1; |
/* FALSE if .eh_frame unwind info should be generated for PLT and other |
linker created sections, TRUE if it should be omitted. */ |
unsigned int no_ld_generated_unwind_info: 1; |
/* TRUE if BFD should generate a "task linked" object file, |
similar to relocatable but also with globals converted to |
statics. */ |
unsigned int task_link: 1; |
/* TRUE if ok to have multiple definition. */ |
unsigned int allow_multiple_definition: 1; |
/* TRUE if ok to have version with no definition. */ |
unsigned int allow_undefined_version: 1; |
/* TRUE if some symbols have to be dynamic, controlled by |
--dynamic-list command line options. */ |
unsigned int dynamic: 1; |
/* TRUE if PT_GNU_STACK segment should be created with PF_R|PF_W|PF_X |
flags. */ |
unsigned int execstack: 1; |
/* TRUE if PT_GNU_STACK segment should be created with PF_R|PF_W |
flags. */ |
unsigned int noexecstack: 1; |
/* TRUE if we want to produced optimized output files. This might |
need much more time and therefore must be explicitly selected. */ |
unsigned int optimize: 1; |
/* TRUE if user should be informed of removed unreferenced sections. */ |
unsigned int print_gc_sections: 1; |
/* TRUE if we should warn alternate ELF machine code. */ |
unsigned int warn_alternate_em: 1; |
/* TRUE if the linker script contained an explicit PHDRS command. */ |
unsigned int user_phdrs: 1; |
/* Char that may appear as the first char of a symbol, but should be |
skipped (like symbol_leading_char) when looking up symbols in |
wrap_hash. Used by PowerPC Linux for 'dot' symbols. */ |
char wrap_char; |
/* Separator between archive and filename in linker script filespecs. */ |
char path_separator; |
/* Default stack size. Zero means default (often zero itself), -1 |
means explicitly zero-sized. */ |
bfd_signed_vma stacksize; |
/* Enable or disable target specific optimizations. |
Not all targets have optimizations to enable. |
Normally these optimizations are disabled by default but some targets |
prefer to enable them by default. So this field is a tri-state variable. |
The values are: |
zero: Enable the optimizations (either from --relax being specified on |
the command line or the backend's before_allocation emulation function. |
positive: The user has requested that these optimizations be disabled. |
(Via the --no-relax command line option). |
negative: The optimizations are disabled. (Set when initializing the |
args_type structure in ldmain.c:main. */ |
signed int disable_target_specific_optimizations; |
/* Function callbacks. */ |
const struct bfd_link_callbacks *callbacks; |
/* Hash table handled by BFD. */ |
struct bfd_link_hash_table *hash; |
/* Hash table of symbols to keep. This is NULL unless strip is |
strip_some. */ |
struct bfd_hash_table *keep_hash; |
/* Hash table of symbols to report back via the notice callback. If |
this is NULL, and notice_all is FALSE, then no symbols are |
reported back. */ |
struct bfd_hash_table *notice_hash; |
/* Hash table of symbols which are being wrapped (the --wrap linker |
option). If this is NULL, no symbols are being wrapped. */ |
struct bfd_hash_table *wrap_hash; |
/* Hash table of symbols which may be left unresolved during |
a link. If this is NULL, no symbols can be left unresolved. */ |
struct bfd_hash_table *ignore_hash; |
/* The output BFD. */ |
bfd *output_bfd; |
/* The list of input BFD's involved in the link. These are chained |
together via the link_next field. */ |
bfd *input_bfds; |
bfd **input_bfds_tail; |
/* If a symbol should be created for each input BFD, this is section |
where those symbols should be placed. It must be a section in |
the output BFD. It may be NULL, in which case no such symbols |
will be created. This is to support CREATE_OBJECT_SYMBOLS in the |
linker command language. */ |
asection *create_object_symbols_section; |
/* List of global symbol names that are starting points for marking |
sections against garbage collection. */ |
struct bfd_sym_chain *gc_sym_list; |
/* If a base output file is wanted, then this points to it */ |
void *base_file; |
/* The function to call when the executable or shared object is |
loaded. */ |
const char *init_function; |
/* The function to call when the executable or shared object is |
unloaded. */ |
const char *fini_function; |
/* Number of relaxation passes. Usually only one relaxation pass |
is needed. But a backend can have as many relaxation passes as |
necessary. During bfd_relax_section call, it is set to the |
current pass, starting from 0. */ |
int relax_pass; |
/* Number of relaxation trips. This number is incremented every |
time the relaxation pass is restarted due to a previous |
relaxation returning true in *AGAIN. */ |
int relax_trip; |
/* Non-zero if auto-import thunks for DATA items in pei386 DLLs |
should be generated/linked against. Set to 1 if this feature |
is explicitly requested by the user, -1 if enabled by default. */ |
int pei386_auto_import; |
/* Non-zero if runtime relocs for DATA items with non-zero addends |
in pei386 DLLs should be generated. Set to 1 if this feature |
is explicitly requested by the user, -1 if enabled by default. */ |
int pei386_runtime_pseudo_reloc; |
/* How many spare .dynamic DT_NULL entries should be added? */ |
unsigned int spare_dynamic_tags; |
/* May be used to set DT_FLAGS for ELF. */ |
bfd_vma flags; |
/* May be used to set DT_FLAGS_1 for ELF. */ |
bfd_vma flags_1; |
/* Start and end of RELRO region. */ |
bfd_vma relro_start, relro_end; |
/* List of symbols should be dynamic. */ |
struct bfd_elf_dynamic_list *dynamic_list; |
/* The version information. */ |
struct bfd_elf_version_tree *version_info; |
}; |
/* This structures holds a set of callback functions. These are called |
by the BFD linker routines. Except for the info functions, the first |
argument to each callback function is the bfd_link_info structure |
being used and each function returns a boolean value. If the |
function returns FALSE, then the BFD function which called it should |
return with a failure indication. */ |
struct bfd_link_callbacks |
{ |
/* A function which is called when an object is added from an |
archive. ABFD is the archive element being added. NAME is the |
name of the symbol which caused the archive element to be pulled |
in. This function may set *SUBSBFD to point to an alternative |
BFD from which symbols should in fact be added in place of the |
original BFD's symbols. */ |
bfd_boolean (*add_archive_element) |
(struct bfd_link_info *, bfd *abfd, const char *name, bfd **subsbfd); |
/* A function which is called when a symbol is found with multiple |
definitions. H is the symbol which is defined multiple times. |
NBFD is the new BFD, NSEC is the new section, and NVAL is the new |
value. NSEC may be bfd_com_section or bfd_ind_section. */ |
bfd_boolean (*multiple_definition) |
(struct bfd_link_info *, struct bfd_link_hash_entry *h, |
bfd *nbfd, asection *nsec, bfd_vma nval); |
/* A function which is called when a common symbol is defined |
multiple times. H is the symbol appearing multiple times. |
NBFD is the BFD of the new symbol. NTYPE is the type of the new |
symbol, one of bfd_link_hash_defined, bfd_link_hash_common, or |
bfd_link_hash_indirect. If NTYPE is bfd_link_hash_common, NSIZE |
is the size of the new symbol. */ |
bfd_boolean (*multiple_common) |
(struct bfd_link_info *, struct bfd_link_hash_entry *h, |
bfd *nbfd, enum bfd_link_hash_type ntype, bfd_vma nsize); |
/* A function which is called to add a symbol to a set. ENTRY is |
the link hash table entry for the set itself (e.g., |
__CTOR_LIST__). RELOC is the relocation to use for an entry in |
the set when generating a relocatable file, and is also used to |
get the size of the entry when generating an executable file. |
ABFD, SEC and VALUE identify the value to add to the set. */ |
bfd_boolean (*add_to_set) |
(struct bfd_link_info *, struct bfd_link_hash_entry *entry, |
bfd_reloc_code_real_type reloc, bfd *abfd, asection *sec, bfd_vma value); |
/* A function which is called when the name of a g++ constructor or |
destructor is found. This is only called by some object file |
formats. CONSTRUCTOR is TRUE for a constructor, FALSE for a |
destructor. This will use BFD_RELOC_CTOR when generating a |
relocatable file. NAME is the name of the symbol found. ABFD, |
SECTION and VALUE are the value of the symbol. */ |
bfd_boolean (*constructor) |
(struct bfd_link_info *, bfd_boolean constructor, const char *name, |
bfd *abfd, asection *sec, bfd_vma value); |
/* A function which is called to issue a linker warning. For |
example, this is called when there is a reference to a warning |
symbol. WARNING is the warning to be issued. SYMBOL is the name |
of the symbol which triggered the warning; it may be NULL if |
there is none. ABFD, SECTION and ADDRESS identify the location |
which trigerred the warning; either ABFD or SECTION or both may |
be NULL if the location is not known. */ |
bfd_boolean (*warning) |
(struct bfd_link_info *, const char *warning, const char *symbol, |
bfd *abfd, asection *section, bfd_vma address); |
/* A function which is called when a relocation is attempted against |
an undefined symbol. NAME is the symbol which is undefined. |
ABFD, SECTION and ADDRESS identify the location from which the |
reference is made. IS_FATAL indicates whether an undefined symbol is |
a fatal error or not. In some cases SECTION may be NULL. */ |
bfd_boolean (*undefined_symbol) |
(struct bfd_link_info *, const char *name, bfd *abfd, |
asection *section, bfd_vma address, bfd_boolean is_fatal); |
/* A function which is called when a reloc overflow occurs. ENTRY is |
the link hash table entry for the symbol the reloc is against. |
NAME is the name of the local symbol or section the reloc is |
against, RELOC_NAME is the name of the relocation, and ADDEND is |
any addend that is used. ABFD, SECTION and ADDRESS identify the |
location at which the overflow occurs; if this is the result of a |
bfd_section_reloc_link_order or bfd_symbol_reloc_link_order, then |
ABFD will be NULL. */ |
bfd_boolean (*reloc_overflow) |
(struct bfd_link_info *, struct bfd_link_hash_entry *entry, |
const char *name, const char *reloc_name, bfd_vma addend, |
bfd *abfd, asection *section, bfd_vma address); |
/* A function which is called when a dangerous reloc is performed. |
MESSAGE is an appropriate message. |
ABFD, SECTION and ADDRESS identify the location at which the |
problem occurred; if this is the result of a |
bfd_section_reloc_link_order or bfd_symbol_reloc_link_order, then |
ABFD will be NULL. */ |
bfd_boolean (*reloc_dangerous) |
(struct bfd_link_info *, const char *message, |
bfd *abfd, asection *section, bfd_vma address); |
/* A function which is called when a reloc is found to be attached |
to a symbol which is not being written out. NAME is the name of |
the symbol. ABFD, SECTION and ADDRESS identify the location of |
the reloc; if this is the result of a |
bfd_section_reloc_link_order or bfd_symbol_reloc_link_order, then |
ABFD will be NULL. */ |
bfd_boolean (*unattached_reloc) |
(struct bfd_link_info *, const char *name, |
bfd *abfd, asection *section, bfd_vma address); |
/* A function which is called when a symbol in notice_hash is |
defined or referenced. H is the symbol. ABFD, SECTION and |
ADDRESS are the (new) value of the symbol. If SECTION is |
bfd_und_section, this is a reference. FLAGS are the symbol |
BSF_* flags. STRING is the name of the symbol to indirect to if |
the sym is indirect, or the warning string if a warning sym. */ |
bfd_boolean (*notice) |
(struct bfd_link_info *, struct bfd_link_hash_entry *h, |
bfd *abfd, asection *section, bfd_vma address, flagword flags, |
const char *string); |
/* Error or warning link info message. */ |
void (*einfo) |
(const char *fmt, ...); |
/* General link info message. */ |
void (*info) |
(const char *fmt, ...); |
/* Message to be printed in linker map file. */ |
void (*minfo) |
(const char *fmt, ...); |
/* This callback provides a chance for users of the BFD library to |
override its decision about whether to place two adjacent sections |
into the same segment. */ |
bfd_boolean (*override_segment_assignment) |
(struct bfd_link_info *, bfd * abfd, |
asection * current_section, asection * previous_section, |
bfd_boolean new_segment); |
}; |
/* The linker builds link_order structures which tell the code how to |
include input data in the output file. */ |
/* These are the types of link_order structures. */ |
enum bfd_link_order_type |
{ |
bfd_undefined_link_order, /* Undefined. */ |
bfd_indirect_link_order, /* Built from a section. */ |
bfd_data_link_order, /* Set to explicit data. */ |
bfd_section_reloc_link_order, /* Relocate against a section. */ |
bfd_symbol_reloc_link_order /* Relocate against a symbol. */ |
}; |
/* This is the link_order structure itself. These form a chain |
attached to the output section whose contents they are describing. */ |
struct bfd_link_order |
{ |
/* Next link_order in chain. */ |
struct bfd_link_order *next; |
/* Type of link_order. */ |
enum bfd_link_order_type type; |
/* Offset within output section. */ |
bfd_vma offset; |
/* Size within output section. */ |
bfd_size_type size; |
/* Type specific information. */ |
union |
{ |
struct |
{ |
/* Section to include. If this is used, then |
section->output_section must be the section the |
link_order is attached to, section->output_offset must |
equal the link_order offset field, and section->size |
must equal the link_order size field. Maybe these |
restrictions should be relaxed someday. */ |
asection *section; |
} indirect; |
struct |
{ |
/* Size of contents, or zero when contents should be filled by |
the architecture-dependent fill function. |
A non-zero value allows filling of the output section |
with an arbitrary repeated pattern. */ |
unsigned int size; |
/* Data to put into file. */ |
bfd_byte *contents; |
} data; |
struct |
{ |
/* Description of reloc to generate. Used for |
bfd_section_reloc_link_order and |
bfd_symbol_reloc_link_order. */ |
struct bfd_link_order_reloc *p; |
} reloc; |
} u; |
}; |
/* A linker order of type bfd_section_reloc_link_order or |
bfd_symbol_reloc_link_order means to create a reloc against a |
section or symbol, respectively. This is used to implement -Ur to |
generate relocs for the constructor tables. The |
bfd_link_order_reloc structure describes the reloc that BFD should |
create. It is similar to a arelent, but I didn't use arelent |
because the linker does not know anything about most symbols, and |
any asymbol structure it creates will be partially meaningless. |
This information could logically be in the bfd_link_order struct, |
but I didn't want to waste the space since these types of relocs |
are relatively rare. */ |
struct bfd_link_order_reloc |
{ |
/* Reloc type. */ |
bfd_reloc_code_real_type reloc; |
union |
{ |
/* For type bfd_section_reloc_link_order, this is the section |
the reloc should be against. This must be a section in the |
output BFD, not any of the input BFDs. */ |
asection *section; |
/* For type bfd_symbol_reloc_link_order, this is the name of the |
symbol the reloc should be against. */ |
const char *name; |
} u; |
/* Addend to use. The object file should contain zero. The BFD |
backend is responsible for filling in the contents of the object |
file correctly. For some object file formats (e.g., COFF) the |
addend must be stored into in the object file, and for some |
(e.g., SPARC a.out) it is kept in the reloc. */ |
bfd_vma addend; |
}; |
/* Allocate a new link_order for a section. */ |
extern struct bfd_link_order *bfd_new_link_order (bfd *, asection *); |
/* These structures are used to describe version information for the |
ELF linker. These structures could be manipulated entirely inside |
BFD, but it would be a pain. Instead, the regular linker sets up |
these structures, and then passes them into BFD. */ |
/* Glob pattern for a version. */ |
struct bfd_elf_version_expr |
{ |
/* Next glob pattern for this version. */ |
struct bfd_elf_version_expr *next; |
/* Glob pattern. */ |
const char *pattern; |
/* Set if pattern is not a glob. */ |
unsigned int literal : 1; |
/* Defined by ".symver". */ |
unsigned int symver : 1; |
/* Defined by version script. */ |
unsigned int script : 1; |
/* Pattern type. */ |
#define BFD_ELF_VERSION_C_TYPE 1 |
#define BFD_ELF_VERSION_CXX_TYPE 2 |
#define BFD_ELF_VERSION_JAVA_TYPE 4 |
unsigned int mask : 3; |
}; |
struct bfd_elf_version_expr_head |
{ |
/* List of all patterns, both wildcards and non-wildcards. */ |
struct bfd_elf_version_expr *list; |
/* Hash table for non-wildcards. */ |
void *htab; |
/* Remaining patterns. */ |
struct bfd_elf_version_expr *remaining; |
/* What kind of pattern types are present in list (bitmask). */ |
unsigned int mask; |
}; |
/* Version dependencies. */ |
struct bfd_elf_version_deps |
{ |
/* Next dependency for this version. */ |
struct bfd_elf_version_deps *next; |
/* The version which this version depends upon. */ |
struct bfd_elf_version_tree *version_needed; |
}; |
/* A node in the version tree. */ |
struct bfd_elf_version_tree |
{ |
/* Next version. */ |
struct bfd_elf_version_tree *next; |
/* Name of this version. */ |
const char *name; |
/* Version number. */ |
unsigned int vernum; |
/* Regular expressions for global symbols in this version. */ |
struct bfd_elf_version_expr_head globals; |
/* Regular expressions for local symbols in this version. */ |
struct bfd_elf_version_expr_head locals; |
/* List of versions which this version depends upon. */ |
struct bfd_elf_version_deps *deps; |
/* Index of the version name. This is used within BFD. */ |
unsigned int name_indx; |
/* Whether this version tree was used. This is used within BFD. */ |
int used; |
/* Matching hook. */ |
struct bfd_elf_version_expr *(*match) |
(struct bfd_elf_version_expr_head *head, |
struct bfd_elf_version_expr *prev, const char *sym); |
}; |
struct bfd_elf_dynamic_list |
{ |
struct bfd_elf_version_expr_head head; |
struct bfd_elf_version_expr *(*match) |
(struct bfd_elf_version_expr_head *head, |
struct bfd_elf_version_expr *prev, const char *sym); |
}; |
#endif |
/contrib/toolchain/binutils/include/binary-io.h |
---|
0,0 → 1,62 |
/* Binary mode I/O. |
Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc. |
This program is free software: you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
#ifndef _BINARY_H |
#define _BINARY_H |
/* Include this header after <fcntl.h> and <stdio.h>, because |
systems that distinguish between text and binary I/O usually |
define O_BINARY in <fcntl.h>, and the MSVC7 <stdio.h> doesn't |
like to be included after '#define fileno ...' |
We don't include <fcntl.h> here because not all systems have |
that header. */ |
#if !defined O_BINARY && defined _O_BINARY |
/* For MSC-compatible compilers. */ |
# define O_BINARY _O_BINARY |
# define O_TEXT _O_TEXT |
#endif |
#ifdef __BEOS__ |
/* BeOS 5 has O_BINARY and O_TEXT, but they have no effect. */ |
# undef O_BINARY |
# undef O_TEXT |
#endif |
#if O_BINARY |
# if defined __EMX__ || defined __DJGPP__ || defined __CYGWIN__ |
# include <io.h> /* declares setmode() */ |
# else |
# define setmode _setmode |
# undef fileno |
# define fileno _fileno |
# endif |
# ifdef __DJGPP__ |
# include <unistd.h> /* declares isatty() */ |
# /* Avoid putting stdin/stdout in binary mode if it is connected to the |
# console, because that would make it impossible for the user to |
# interrupt the program through Ctrl-C or Ctrl-Break. */ |
# define SET_BINARY(fd) (!isatty (fd) ? (setmode (fd, O_BINARY), 0) : 0) |
# else |
# define SET_BINARY(fd) setmode (fd, O_BINARY) |
# endif |
#else |
/* On reasonable systems, binary I/O is the default. */ |
# undef O_BINARY |
# define O_BINARY 0 |
# define SET_BINARY(fd) /* nothing */ |
#endif |
#endif /* _BINARY_H */ |
/contrib/toolchain/binutils/include/bout.h |
---|
0,0 → 1,192 |
/* This file is a modified version of 'a.out.h'. It is to be used in all |
GNU tools modified to support the i80960 (or tools that operate on |
object files created by such tools). |
Copyright 2001, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* All i80960 development is done in a CROSS-DEVELOPMENT environment. I.e., |
object code is generated on, and executed under the direction of a symbolic |
debugger running on, a host system. We do not want to be subject to the |
vagaries of which host it is or whether it supports COFF or a.out format, |
or anything else. We DO want to: |
o always generate the same format object files, regardless of host. |
o have an 'a.out' header that we can modify for our own purposes |
(the 80960 is typically an embedded processor and may require |
enhanced linker support that the normal a.out.h header can't |
accommodate). |
As for byte-ordering, the following rules apply: |
o Text and data that is actually downloaded to the target is always |
in i80960 (little-endian) order. |
o All other numbers (in the header, symbols, relocation directives) |
are in host byte-order: object files CANNOT be lifted from a |
little-end host and used on a big-endian (or vice versa) without |
modification. |
==> THIS IS NO LONGER TRUE USING BFD. WE CAN GENERATE ANY BYTE ORDER |
FOR THE HEADER, AND READ ANY BYTE ORDER. PREFERENCE WOULD BE TO |
USE LITTLE-ENDIAN BYTE ORDER THROUGHOUT, REGARDLESS OF HOST. <== |
o The downloader ('comm960') takes care to generate a pseudo-header |
with correct (i80960) byte-ordering before shipping text and data |
off to the NINDY monitor in the target systems. Symbols and |
relocation info are never sent to the target. */ |
#define BMAGIC 0415 |
/* We don't accept the following (see N_BADMAG macro). |
They're just here so GNU code will compile. */ |
#define OMAGIC 0407 /* old impure format */ |
#define NMAGIC 0410 /* read-only text */ |
#define ZMAGIC 0413 /* demand load format */ |
/* FILE HEADER |
All 'lengths' are given as a number of bytes. |
All 'alignments' are for relinkable files only; an alignment of |
'n' indicates the corresponding segment must begin at an |
address that is a multiple of (2**n). */ |
struct external_exec |
{ |
/* Standard stuff */ |
unsigned char e_info[4]; /* Identifies this as a b.out file */ |
unsigned char e_text[4]; /* Length of text */ |
unsigned char e_data[4]; /* Length of data */ |
unsigned char e_bss[4]; /* Length of uninitialized data area */ |
unsigned char e_syms[4]; /* Length of symbol table */ |
unsigned char e_entry[4]; /* Runtime start address */ |
unsigned char e_trsize[4]; /* Length of text relocation info */ |
unsigned char e_drsize[4]; /* Length of data relocation info */ |
/* Added for i960 */ |
unsigned char e_tload[4]; /* Text runtime load address */ |
unsigned char e_dload[4]; /* Data runtime load address */ |
unsigned char e_talign[1]; /* Alignment of text segment */ |
unsigned char e_dalign[1]; /* Alignment of data segment */ |
unsigned char e_balign[1]; /* Alignment of bss segment */ |
unsigned char e_relaxable[1];/* Assembled with enough info to allow linker to relax */ |
}; |
#define EXEC_BYTES_SIZE (sizeof (struct external_exec)) |
/* These macros use the a_xxx field names, since they operate on the exec |
structure after it's been byte-swapped and realigned on the host machine. */ |
#define N_BADMAG(x) (((x).a_info)!=BMAGIC) |
#define N_TXTOFF(x) EXEC_BYTES_SIZE |
#define N_DATOFF(x) ( N_TXTOFF(x) + (x).a_text ) |
#define N_TROFF(x) ( N_DATOFF(x) + (x).a_data ) |
#define N_TRELOFF N_TROFF |
#define N_DROFF(x) ( N_TROFF(x) + (x).a_trsize ) |
#define N_DRELOFF N_DROFF |
#define N_SYMOFF(x) ( N_DROFF(x) + (x).a_drsize ) |
#define N_STROFF(x) ( N_SYMOFF(x) + (x).a_syms ) |
#define N_DATADDR(x) ( (x).a_dload ) |
/* Address of text segment in memory after it is loaded. */ |
#if !defined (N_TXTADDR) |
#define N_TXTADDR(x) 0 |
#endif |
/* A single entry in the symbol table. */ |
struct nlist |
{ |
union |
{ |
char* n_name; |
struct nlist * n_next; |
long n_strx; /* Index into string table */ |
} n_un; |
unsigned char n_type; /* See below */ |
char n_other; /* Used in i80960 support -- see below */ |
short n_desc; |
unsigned long n_value; |
}; |
/* Legal values of n_type. */ |
#define N_UNDF 0 /* Undefined symbol */ |
#define N_ABS 2 /* Absolute symbol */ |
#define N_TEXT 4 /* Text symbol */ |
#define N_DATA 6 /* Data symbol */ |
#define N_BSS 8 /* BSS symbol */ |
#define N_FN 31 /* Filename symbol */ |
#define N_EXT 1 /* External symbol (OR'd in with one of above) */ |
#define N_TYPE 036 /* Mask for all the type bits */ |
#define N_STAB 0340 /* Mask for all bits used for SDB entries */ |
/* MEANING OF 'n_other' |
If non-zero, the 'n_other' fields indicates either a leaf procedure or |
a system procedure, as follows: |
1 <= n_other <= 32 : |
The symbol is the entry point to a system procedure. |
'n_value' is the address of the entry, as for any other |
procedure. The system procedure number (which can be used in |
a 'calls' instruction) is (n_other-1). These entries come from |
'.sysproc' directives. |
n_other == N_CALLNAME |
the symbol is the 'call' entry point to a leaf procedure. |
The *next* symbol in the symbol table must be the corresponding |
'bal' entry point to the procedure (see following). These |
entries come from '.leafproc' directives in which two different |
symbols are specified (the first one is represented here). |
n_other == N_BALNAME |
the symbol is the 'bal' entry point to a leaf procedure. |
These entries result from '.leafproc' directives in which only |
one symbol is specified, or in which the same symbol is |
specified twice. |
Note that an N_CALLNAME entry *must* have a corresponding N_BALNAME entry, |
but not every N_BALNAME entry must have an N_CALLNAME entry. */ |
#define N_CALLNAME ((char)-1) |
#define N_BALNAME ((char)-2) |
#define IS_CALLNAME(x) (N_CALLNAME == (x)) |
#define IS_BALNAME(x) (N_BALNAME == (x)) |
#define IS_OTHER(x) ((x)>0 && (x) <=32) |
#define b_out_relocation_info relocation_info |
struct relocation_info |
{ |
int r_address; /* File address of item to be relocated. */ |
unsigned |
#define r_index r_symbolnum |
r_symbolnum:24, /* Index of symbol on which relocation is based, |
if r_extern is set. Otherwise set to |
either N_TEXT, N_DATA, or N_BSS to |
indicate section on which relocation is |
based. */ |
r_pcrel:1, /* 1 => relocate PC-relative; else absolute |
On i960, pc-relative implies 24-bit |
address, absolute implies 32-bit. */ |
r_length:2, /* Number of bytes to relocate: |
0 => 1 byte |
1 => 2 bytes -- used for 13 bit pcrel |
2 => 4 bytes. */ |
r_extern:1, |
r_bsr:1, /* Something for the GNU NS32K assembler. */ |
r_disp:1, /* Something for the GNU NS32K assembler. */ |
r_callj:1, /* 1 if relocation target is an i960 'callj'. */ |
r_relaxable:1; /* 1 if enough info is left to relax the data. */ |
}; |
/contrib/toolchain/binutils/include/cgen/ChangeLog |
---|
0,0 → 1,32 |
2013-07-18 Andrew Neitsch <andrew@neitsch.ca> |
PR binutils/15728 |
* basic-ops.h: (SUBWORDSIQI) Make declaration static. |
* (SUBWORDSIHI): Likewise. |
* (SUBWORDDIQI): Likewise. |
* (SUBWORDDIHI): Likewise. |
* (SUBWORDDISI): Likewise. |
2010-01-05 Doug Evans <dje@sebabeach.org> |
* basic-modes.h (MAKEDI): New macro. |
2009-10-23 Doug Evans <dje@sebabeach.org> |
* basic-modes.h: New file. Moved here from opcodes/cgen-types.h. |
* basic-ops.h: New file. Moved here from opcodes/cgen-ops.h. |
* bitset.h: New file. Moved here from ../opcode/cgen-bitset.h. |
Update license to GPL v3. |
Copyright (C) 2009-2012 Free Software Foundation, Inc. |
Copying and distribution of this file, with or without modification, |
are permitted in any medium without royalty provided the copyright |
notice and this notice are preserved. |
Local Variables: |
mode: change-log |
left-margin: 8 |
fill-column: 74 |
version-control: never |
End: |
/contrib/toolchain/binutils/include/cgen/basic-modes.h |
---|
0,0 → 1,52 |
/* Basic CGEN modes. |
Copyright 2005, 2007, 2009 Free Software Foundation, Inc. |
Contributed by Red Hat. |
This file is part of the GNU opcodes library. |
This library is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3, or (at your option) |
any later version. |
It is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this library; see the file COPYING3. If not, write to the |
Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA |
02110-1301, USA. */ |
#ifndef CGEN_BASIC_MODES_H |
#define CGEN_BASIC_MODES_H |
/* This file doesn't contain all modes, |
just the basic/portable ones. |
It also provides access to stdint.h (*1) so the includer doesn't have |
to deal with the portability issues. |
(*1): To the extent that bfd_stdint.h does for now. */ |
/* IWBN to avoid unnecessary dependencies on bfd-anything. */ |
#include "bfd_stdint.h" |
typedef int8_t QI; |
typedef uint8_t UQI; |
typedef int16_t HI; |
typedef uint16_t UHI; |
typedef int32_t SI; |
typedef uint32_t USI; |
typedef int64_t DI; |
typedef uint64_t UDI; |
typedef int INT; |
typedef unsigned int UINT; |
/* Cover macro to create a 64-bit integer. */ |
#define MAKEDI(hi, lo) ((((DI) (SI) (hi)) << 32) | ((UDI) (USI) (lo))) |
#endif /* CGEN_BASIC_MODES_H */ |
/contrib/toolchain/binutils/include/cgen/basic-ops.h |
---|
0,0 → 1,347 |
/* Basic semantics ops support for CGEN. |
Copyright 2005-2013 Free Software Foundation, Inc. |
Contributed by Red Hat. |
This file is part of the GNU opcodes library. |
This library is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3, or (at your option) |
any later version. |
It is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this library; see the file COPYING3. If not, write to the |
Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA |
02110-1301, USA. */ |
#ifndef CGEN_BASIC_OPS_H |
#define CGEN_BASIC_OPS_H |
#include <assert.h> |
#if defined (__GNUC__) && ! defined (SEMOPS_DEFINE_INLINE) |
#define SEMOPS_DEFINE_INLINE |
#define SEMOPS_INLINE extern inline |
#else |
#define SEMOPS_INLINE |
#endif |
/* These don't really have a mode. */ |
#define ANDIF(x, y) ((x) && (y)) |
#define ORIF(x, y) ((x) || (y)) |
#define SUBBI(x, y) ((x) - (y)) |
#define ANDBI(x, y) ((x) & (y)) |
#define ORBI(x, y) ((x) | (y)) |
#define XORBI(x, y) ((x) ^ (y)) |
#define NEGBI(x) (- (x)) |
#define NOTBI(x) (! (BI) (x)) |
#define INVBI(x) (~ (x)) |
#define EQBI(x, y) ((BI) (x) == (BI) (y)) |
#define NEBI(x, y) ((BI) (x) != (BI) (y)) |
#define LTBI(x, y) ((BI) (x) < (BI) (y)) |
#define LEBI(x, y) ((BI) (x) <= (BI) (y)) |
#define GTBI(x, y) ((BI) (x) > (BI) (y)) |
#define GEBI(x, y) ((BI) (x) >= (BI) (y)) |
#define LTUBI(x, y) ((BI) (x) < (BI) (y)) |
#define LEUBI(x, y) ((BI) (x) <= (BI) (y)) |
#define GTUBI(x, y) ((BI) (x) > (BI) (y)) |
#define GEUBI(x, y) ((BI) (x) >= (BI) (y)) |
#define ADDQI(x, y) ((x) + (y)) |
#define SUBQI(x, y) ((x) - (y)) |
#define MULQI(x, y) ((x) * (y)) |
#define DIVQI(x, y) ((QI) (x) / (QI) (y)) |
#define UDIVQI(x, y) ((UQI) (x) / (UQI) (y)) |
#define MODQI(x, y) ((QI) (x) % (QI) (y)) |
#define UMODQI(x, y) ((UQI) (x) % (UQI) (y)) |
#define SRAQI(x, y) ((QI) (x) >> (y)) |
#define SRLQI(x, y) ((UQI) (x) >> (y)) |
#define SLLQI(x, y) ((UQI) (x) << (y)) |
extern QI RORQI (QI, int); |
extern QI ROLQI (QI, int); |
#define ANDQI(x, y) ((x) & (y)) |
#define ORQI(x, y) ((x) | (y)) |
#define XORQI(x, y) ((x) ^ (y)) |
#define NEGQI(x) (- (x)) |
#define NOTQI(x) (! (QI) (x)) |
#define INVQI(x) (~ (x)) |
#define ABSQI(x) ((x) < 0 ? -(x) : (x)) |
#define EQQI(x, y) ((QI) (x) == (QI) (y)) |
#define NEQI(x, y) ((QI) (x) != (QI) (y)) |
#define LTQI(x, y) ((QI) (x) < (QI) (y)) |
#define LEQI(x, y) ((QI) (x) <= (QI) (y)) |
#define GTQI(x, y) ((QI) (x) > (QI) (y)) |
#define GEQI(x, y) ((QI) (x) >= (QI) (y)) |
#define LTUQI(x, y) ((UQI) (x) < (UQI) (y)) |
#define LEUQI(x, y) ((UQI) (x) <= (UQI) (y)) |
#define GTUQI(x, y) ((UQI) (x) > (UQI) (y)) |
#define GEUQI(x, y) ((UQI) (x) >= (UQI) (y)) |
#define ADDHI(x, y) ((x) + (y)) |
#define SUBHI(x, y) ((x) - (y)) |
#define MULHI(x, y) ((x) * (y)) |
#define DIVHI(x, y) ((HI) (x) / (HI) (y)) |
#define UDIVHI(x, y) ((UHI) (x) / (UHI) (y)) |
#define MODHI(x, y) ((HI) (x) % (HI) (y)) |
#define UMODHI(x, y) ((UHI) (x) % (UHI) (y)) |
#define SRAHI(x, y) ((HI) (x) >> (y)) |
#define SRLHI(x, y) ((UHI) (x) >> (y)) |
#define SLLHI(x, y) ((UHI) (x) << (y)) |
extern HI RORHI (HI, int); |
extern HI ROLHI (HI, int); |
#define ANDHI(x, y) ((x) & (y)) |
#define ORHI(x, y) ((x) | (y)) |
#define XORHI(x, y) ((x) ^ (y)) |
#define NEGHI(x) (- (x)) |
#define NOTHI(x) (! (HI) (x)) |
#define INVHI(x) (~ (x)) |
#define ABSHI(x) ((x) < 0 ? -(x) : (x)) |
#define EQHI(x, y) ((HI) (x) == (HI) (y)) |
#define NEHI(x, y) ((HI) (x) != (HI) (y)) |
#define LTHI(x, y) ((HI) (x) < (HI) (y)) |
#define LEHI(x, y) ((HI) (x) <= (HI) (y)) |
#define GTHI(x, y) ((HI) (x) > (HI) (y)) |
#define GEHI(x, y) ((HI) (x) >= (HI) (y)) |
#define LTUHI(x, y) ((UHI) (x) < (UHI) (y)) |
#define LEUHI(x, y) ((UHI) (x) <= (UHI) (y)) |
#define GTUHI(x, y) ((UHI) (x) > (UHI) (y)) |
#define GEUHI(x, y) ((UHI) (x) >= (UHI) (y)) |
#define ADDSI(x, y) ((x) + (y)) |
#define SUBSI(x, y) ((x) - (y)) |
#define MULSI(x, y) ((x) * (y)) |
#define DIVSI(x, y) ((SI) (x) / (SI) (y)) |
#define UDIVSI(x, y) ((USI) (x) / (USI) (y)) |
#define MODSI(x, y) ((SI) (x) % (SI) (y)) |
#define UMODSI(x, y) ((USI) (x) % (USI) (y)) |
#define SRASI(x, y) ((SI) (x) >> (y)) |
#define SRLSI(x, y) ((USI) (x) >> (y)) |
#define SLLSI(x, y) ((USI) (x) << (y)) |
extern SI RORSI (SI, int); |
extern SI ROLSI (SI, int); |
#define ANDSI(x, y) ((x) & (y)) |
#define ORSI(x, y) ((x) | (y)) |
#define XORSI(x, y) ((x) ^ (y)) |
#define NEGSI(x) (- (x)) |
#define NOTSI(x) (! (SI) (x)) |
#define INVSI(x) (~ (x)) |
#define ABSSI(x) ((x) < 0 ? -(x) : (x)) |
#define EQSI(x, y) ((SI) (x) == (SI) (y)) |
#define NESI(x, y) ((SI) (x) != (SI) (y)) |
#define LTSI(x, y) ((SI) (x) < (SI) (y)) |
#define LESI(x, y) ((SI) (x) <= (SI) (y)) |
#define GTSI(x, y) ((SI) (x) > (SI) (y)) |
#define GESI(x, y) ((SI) (x) >= (SI) (y)) |
#define LTUSI(x, y) ((USI) (x) < (USI) (y)) |
#define LEUSI(x, y) ((USI) (x) <= (USI) (y)) |
#define GTUSI(x, y) ((USI) (x) > (USI) (y)) |
#define GEUSI(x, y) ((USI) (x) >= (USI) (y)) |
#ifdef DI_FN_SUPPORT |
extern DI ADDDI (DI, DI); |
extern DI SUBDI (DI, DI); |
extern DI MULDI (DI, DI); |
extern DI DIVDI (DI, DI); |
extern DI UDIVDI (DI, DI); |
extern DI MODDI (DI, DI); |
extern DI UMODDI (DI, DI); |
extern DI SRADI (DI, int); |
extern UDI SRLDI (UDI, int); |
extern UDI SLLDI (UDI, int); |
extern DI RORDI (DI, int); |
extern DI ROLDI (DI, int); |
extern DI ANDDI (DI, DI); |
extern DI ORDI (DI, DI); |
extern DI XORDI (DI, DI); |
extern DI NEGDI (DI); |
extern int NOTDI (DI); |
extern DI INVDI (DI); |
extern int EQDI (DI, DI); |
extern int NEDI (DI, DI); |
extern int LTDI (DI, DI); |
extern int LEDI (DI, DI); |
extern int GTDI (DI, DI); |
extern int GEDI (DI, DI); |
extern int LTUDI (UDI, UDI); |
extern int LEUDI (UDI, UDI); |
extern int GTUDI (UDI, UDI); |
extern int GEUDI (UDI, UDI); |
#else /* ! DI_FN_SUPPORT */ |
#define ADDDI(x, y) ((x) + (y)) |
#define SUBDI(x, y) ((x) - (y)) |
#define MULDI(x, y) ((x) * (y)) |
#define DIVDI(x, y) ((DI) (x) / (DI) (y)) |
#define UDIVDI(x, y) ((UDI) (x) / (UDI) (y)) |
#define MODDI(x, y) ((DI) (x) % (DI) (y)) |
#define UMODDI(x, y) ((UDI) (x) % (UDI) (y)) |
#define SRADI(x, y) ((DI) (x) >> (y)) |
#define SRLDI(x, y) ((UDI) (x) >> (y)) |
#define SLLDI(x, y) ((UDI) (x) << (y)) |
extern DI RORDI (DI, int); |
extern DI ROLDI (DI, int); |
#define ANDDI(x, y) ((x) & (y)) |
#define ORDI(x, y) ((x) | (y)) |
#define XORDI(x, y) ((x) ^ (y)) |
#define NEGDI(x) (- (x)) |
#define NOTDI(x) (! (DI) (x)) |
#define INVDI(x) (~ (x)) |
#define ABSDI(x) ((x) < 0 ? -(x) : (x)) |
#define EQDI(x, y) ((DI) (x) == (DI) (y)) |
#define NEDI(x, y) ((DI) (x) != (DI) (y)) |
#define LTDI(x, y) ((DI) (x) < (DI) (y)) |
#define LEDI(x, y) ((DI) (x) <= (DI) (y)) |
#define GTDI(x, y) ((DI) (x) > (DI) (y)) |
#define GEDI(x, y) ((DI) (x) >= (DI) (y)) |
#define LTUDI(x, y) ((UDI) (x) < (UDI) (y)) |
#define LEUDI(x, y) ((UDI) (x) <= (UDI) (y)) |
#define GTUDI(x, y) ((UDI) (x) > (UDI) (y)) |
#define GEUDI(x, y) ((UDI) (x) >= (UDI) (y)) |
#endif /* DI_FN_SUPPORT */ |
#define EXTBIQI(x) ((QI) (BI) (x)) |
#define EXTBIHI(x) ((HI) (BI) (x)) |
#define EXTBISI(x) ((SI) (BI) (x)) |
#if defined (DI_FN_SUPPORT) |
extern DI EXTBIDI (BI); |
#else |
#define EXTBIDI(x) ((DI) (BI) (x)) |
#endif |
#define EXTQIHI(x) ((HI) (QI) (x)) |
#define EXTQISI(x) ((SI) (QI) (x)) |
#if defined (DI_FN_SUPPORT) |
extern DI EXTQIDI (QI); |
#else |
#define EXTQIDI(x) ((DI) (QI) (x)) |
#endif |
#define EXTHIHI(x) ((HI) (HI) (x)) |
#define EXTHISI(x) ((SI) (HI) (x)) |
#define EXTSISI(x) ((SI) (SI) (x)) |
#if defined (DI_FN_SUPPORT) |
extern DI EXTHIDI (HI); |
#else |
#define EXTHIDI(x) ((DI) (HI) (x)) |
#endif |
#if defined (DI_FN_SUPPORT) |
extern DI EXTSIDI (SI); |
#else |
#define EXTSIDI(x) ((DI) (SI) (x)) |
#endif |
#define ZEXTBIQI(x) ((QI) (BI) (x)) |
#define ZEXTBIHI(x) ((HI) (BI) (x)) |
#define ZEXTBISI(x) ((SI) (BI) (x)) |
#if defined (DI_FN_SUPPORT) |
extern DI ZEXTBIDI (BI); |
#else |
#define ZEXTBIDI(x) ((DI) (BI) (x)) |
#endif |
#define ZEXTQIHI(x) ((HI) (UQI) (x)) |
#define ZEXTQISI(x) ((SI) (UQI) (x)) |
#if defined (DI_FN_SUPPORT) |
extern DI ZEXTQIDI (QI); |
#else |
#define ZEXTQIDI(x) ((DI) (UQI) (x)) |
#endif |
#define ZEXTHISI(x) ((SI) (UHI) (x)) |
#define ZEXTHIHI(x) ((HI) (UHI) (x)) |
#define ZEXTSISI(x) ((SI) (USI) (x)) |
#if defined (DI_FN_SUPPORT) |
extern DI ZEXTHIDI (HI); |
#else |
#define ZEXTHIDI(x) ((DI) (UHI) (x)) |
#endif |
#if defined (DI_FN_SUPPORT) |
extern DI ZEXTSIDI (SI); |
#else |
#define ZEXTSIDI(x) ((DI) (USI) (x)) |
#endif |
#define TRUNCQIBI(x) ((BI) (QI) (x)) |
#define TRUNCHIBI(x) ((BI) (HI) (x)) |
#define TRUNCHIQI(x) ((QI) (HI) (x)) |
#define TRUNCSIBI(x) ((BI) (SI) (x)) |
#define TRUNCSIQI(x) ((QI) (SI) (x)) |
#define TRUNCSIHI(x) ((HI) (SI) (x)) |
#define TRUNCSISI(x) ((SI) (SI) (x)) |
#if defined (DI_FN_SUPPORT) |
extern BI TRUNCDIBI (DI); |
#else |
#define TRUNCDIBI(x) ((BI) (DI) (x)) |
#endif |
#if defined (DI_FN_SUPPORT) |
extern QI TRUNCDIQI (DI); |
#else |
#define TRUNCDIQI(x) ((QI) (DI) (x)) |
#endif |
#if defined (DI_FN_SUPPORT) |
extern HI TRUNCDIHI (DI); |
#else |
#define TRUNCDIHI(x) ((HI) (DI) (x)) |
#endif |
#if defined (DI_FN_SUPPORT) |
extern SI TRUNCDISI (DI); |
#else |
#define TRUNCDISI(x) ((SI) (DI) (x)) |
#endif |
/* Composing/decomposing the various types. |
Word ordering is endian-independent. Words are specified most to least |
significant and word number 0 is the most significant word. |
??? May also wish an endian-dependent version. Later. */ |
static QI SUBWORDSIQI (SI, int); |
static HI SUBWORDSIHI (SI, int); |
static QI SUBWORDDIQI (DI, int); |
static HI SUBWORDDIHI (DI, int); |
static SI SUBWORDDISI (DI, int); |
#ifdef SEMOPS_DEFINE_INLINE |
SEMOPS_INLINE QI |
SUBWORDSIQI (SI in, int byte) |
{ |
assert (byte >= 0 && byte <= 3); |
return (UQI) (in >> (8 * (3 - byte))) & 0xFF; |
} |
SEMOPS_INLINE HI |
SUBWORDSIHI (SI in, int word) |
{ |
if (word == 0) |
return (USI) in >> 16; |
else |
return in; |
} |
SEMOPS_INLINE QI |
SUBWORDDIQI (DI in, int byte) |
{ |
assert (byte >= 0 && byte <= 7); |
return (UQI) (in >> (8 * (7 - byte))) & 0xFF; |
} |
SEMOPS_INLINE HI |
SUBWORDDIHI (DI in, int word) |
{ |
assert (word >= 0 && word <= 3); |
return (UHI) (in >> (16 * (3 - word))) & 0xFFFF; |
} |
SEMOPS_INLINE SI |
SUBWORDDISI (DI in, int word) |
{ |
if (word == 0) |
return (UDI) in >> 32; |
else |
return in; |
} |
#endif /* SUBWORD,JOIN */ |
#endif /* CGEN_BASIC_OPS_H */ |
/contrib/toolchain/binutils/include/cgen/bitset.h |
---|
0,0 → 1,56 |
/* Header file the type CGEN_BITSET. |
Copyright 2002, 2005, 2009 Free Software Foundation, Inc. |
This file is part of the GNU opcodes library. |
This library is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3, or (at your option) |
any later version. |
It is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this library; see the file COPYING3. If not, write to the |
Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA |
02110-1301, USA. */ |
#ifndef CGEN_BITSET_H |
#define CGEN_BITSET_H |
#ifdef __cplusplus |
extern "C" { |
#endif |
/* A bitmask represented as a string. |
Each member of the set is represented as a bit |
in the string. Bytes are indexed from left to right in the string and |
bits from most significant to least within each byte. |
For example, the bit representing member number 6 is (set->bits[0] & 0x02). |
*/ |
typedef struct cgen_bitset |
{ |
unsigned length; |
char *bits; |
} CGEN_BITSET; |
extern CGEN_BITSET *cgen_bitset_create PARAMS ((unsigned)); |
extern void cgen_bitset_init PARAMS ((CGEN_BITSET *, unsigned)); |
extern void cgen_bitset_clear PARAMS ((CGEN_BITSET *)); |
extern void cgen_bitset_add PARAMS ((CGEN_BITSET *, unsigned)); |
extern void cgen_bitset_set PARAMS ((CGEN_BITSET *, unsigned)); |
extern int cgen_bitset_compare PARAMS ((CGEN_BITSET *, CGEN_BITSET *)); |
extern void cgen_bitset_union PARAMS ((CGEN_BITSET *, CGEN_BITSET *, CGEN_BITSET *)); |
extern int cgen_bitset_intersect_p PARAMS ((CGEN_BITSET *, CGEN_BITSET *)); |
extern int cgen_bitset_contains PARAMS ((CGEN_BITSET *, unsigned)); |
extern CGEN_BITSET *cgen_bitset_copy PARAMS ((CGEN_BITSET *)); |
#ifdef __cplusplus |
} // extern "C" |
#endif |
#endif |
/contrib/toolchain/binutils/include/coff/ChangeLog |
---|
0,0 → 1,373 |
2013-07-10 Tristan Gingold <gingold@adacore.com> |
* rs6000.h (external_core_dumpx): New structure. |
(external_ld_info32): Ditto. |
2013-07-02 Tristan Gingold <gingold@adacore.com> |
* internal.h (C_STTLS, C_GTLS): Define. |
* xcoff.h (XMC_TL, XMC_TU, XMC_TE): Define. |
2013-02-04 Alan Modra <amodra@gmail.com> |
* ti.h (SWAP_OUT_RELOC_EXTRA): Define. |
2013-01-02 Martin Storsjo <martin@martin.st> |
* arm.h (ARMV7PEMAGIC): Define. |
(ARMBADMAG): Update. |
2011-06-02 Nick Clifton <nickc@redhat.com> |
* i860.h: Fix spelling mistake in comment. |
2011-05-04 Tristan Gingold <gingold@adacore.com> |
* rs6000.h (union external_auxent): Add x_ftype field. |
* rs6k64.h: (struct external_auxent): Remap x_file field. |
2011-05-04 Tristan Gingold <gingold@adacore.com> |
* rs6000.h (struct external_exceptab): New struct. |
(EXCEPTSZ): New macro. |
* rs6k64.h: (struct external_exceptab): New struct. |
(EXCEPTSZ): New macro. |
2011-05-03 Tristan Gingold <gingold@adacore.com> |
* rs6000.h (struct external_ldsym): Use E_SYMNMLEN instead of |
SYMNMLEN. |
2011-04-27 Tristan Gingold <gingold@adacore.com> |
* xcoff.h (F_FDPR_PROF, F_FDPR_OPTI, F_DSA, F_VARPG) |
(STYP_DWARF, SSUBTYP_DWINFO) |
(SSUBTYP_DWLINE, SSUBTYP_DWPBNMS, SSUBTYP_DWPBTYP) |
(SSUBTYP_DWARNGE, SSUBTYP_DWABREV, SSUBTYP_DWSTR) |
(SSUBTYP_DWRNGES, STYP_TDATA, STYP_TBSS, R_TLS, R_TLS_IE) |
(R_TLS_LD, R_TLS_LE, R_TLSM, R_TLSML, R_TOCU, R_TOCL, C_DWARF): |
New macros. |
2011-03-31 Tristan Gingold <gingold@adacore.com> |
* internal.h (C_NULL_VALUE): Define. |
2010-06-29 Alan Modra <amodra@gmail.com> |
* maxq.h: Delete file. |
2010-04-15 Nick Clifton <nickc@redhat.com> |
* alpha.h: Update copyright notice to use GPLv3. |
* apollo.h: Likewise. |
* arm.h: Likewise. |
* aux-coff.h: Likewise. |
* ecoff.h: Likewise. |
* external.h: Likewise. |
* go32exe.h: Likewise. |
* h8300.h: Likewise. |
* h8500.h: Likewise. |
* i386.h: Likewise. |
* i860.h: Likewise. |
* i960.h: Likewise. |
* ia64.h: Likewise. |
* internal.h: Likewise. |
* m68k.h: Likewise. |
* m88k.h: Likewise. |
* maxq.h: Likewise. |
* mcore.h: Likewise. |
* mips.h: Likewise. |
* mipspe.h: Likewise. |
* or32.h: Likewise. |
* pe.h: Likewise. |
* powerpc.h: Likewise. |
* rs6000.h: Likewise. |
* rs6k64.h: Likewise. |
* sh.h: Likewise. |
* sparc.h: Likewise. |
* ti.h: Likewise. |
* tic30.h: Likewise. |
* tic4x.h: Likewise. |
* tic54x.h: Likewise. |
* tic80.h: Likewise. |
* w65.h: Likewise. |
* we32k.h: Likewise. |
* x86_64.h: Likewise. |
* xcoff.h: Likewise. |
* z80.h: Likewise. |
* z8k.h: Likewise. |
2009-12-02 Jerker Bäck <jerker.back@gmail.com> |
PR binutils/11017 |
* i386lh (COFF_PAGE_SIZE): Define. |
* x86_64.h (COFF_PAGE_SIZE): Define. |
2009-10-17 Arnold Metselaar <arnold.metselaar@planet.nl> |
* z80.h: Store alignment requirement in section header, to allow |
ld to preserve alignment. Some code was copied from ti.h. |
2009-09-05 Martin Thuresson <martin@mtme.org> |
* ti.h (GET_LNSZ_SIZE, PUT_LNSZ_SIZE): Updated name of class |
variable to in_class to match changes in function that use this |
macro. |
2009-08-10 Jan Kratochvil <jan.kratochvil@redhat.com> |
Fix references past allocated memory for i386-*-go32. |
* ti.h (COFF_ADJUST_FILEHDR_IN_POST, COFF_ADJUST_FILEHDR_OUT_POST): |
Reference F_TARGET_ID only when !COFF0_P. |
2009-08-10 Jan Kratochvil <jan.kratochvil@redhat.com> |
Stop using bfd_usrdata in libbfd. |
* go32exe.h (struct external_filehdr_go32_exe <stub>, FILHSZ): Replace |
STUBSIZE by GO32_STUBSIZE. |
(STUBSIZE): Move the definition ... |
* internal.h (GO32_STUBSIZE): ... here and rename it. |
(struct internal_filehdr <go32stub>, F_GO32STUB): New. |
2009-06-03 Ulrich Weigand <uweigand@de.ibm.com> |
* symconst.h (btLong64, btULong64, btLongLong64, btULongLong64, |
btAdr64, btInt64, btUInt64): New defines. |
2009-04-21 Kai Tietz <kai.tietz@onevision.com> |
* pe.h (pex64_runtime_function): New structure. |
(external_pex64_runtime_function): Likewise. |
(pex64_unwind_code): Likewise. |
(external_pex64_unwind_code): Likewise. |
(pex64_unwind_info): Likewise. |
(external_pex64_unwind_info): Likewise. |
(external_pex64_scope): Likewise. |
(pex64_scope): Likewise. |
(pex64_scope_entry): Likewise. |
(external_pex64_scope_entry): Likewise. |
(PEX64_IS_RUNTIME_FUNCTION_CHAINED): New macro. |
(PEX64_GET_UNWINDDATA_UNIFIED_RVA): Likewise. |
(PEX64_UNWCODE_CODE): Likewise. |
(PEX64_UNWCODE_INFO): Likewise. |
(UWOP_...): Add defines for unwind code. |
(UNW_FLAG_...): Add defined for unwind info flags. |
(PEX64_SCOPE_ENTRY_SIZE): New macro. |
(PEX64_UWI_VERSION): Likewise. |
(PEX64_UWI_FLAGS): Likewise. |
(PEX64_UWI_FRAMEREG): Likewise. |
(PEX64_UWI_FRAMEOFF): Likewise. |
(PEX64_UWI_SIZEOF_UWCODE_ARRAY): Likewise. |
(PEX64_OFFSET_TO_UNWIND_CODE): Likewise. |
(PEX64_OFFSET_TO_HANDLER_RVA): Likewise. |
(PEX64_OFFSET_TO_SCOPE_COUNT): Likewise. |
(PEX64_SCOPE_ENTRY): Likewise. |
2009-04-17 H.J. Lu <hongjiu.lu@intel.com> |
* pe.h (IMAGE_SUBSYSTEM_EFI_ROM): Renamed to ... |
(IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER): This. |
2009-04-01 Richard Sandiford <r.sandiford@uk.ibm.com> |
* xcoff.h (xcoff_link_hash_table): Move to bfd/xcofflink.c. |
2009-03-14 Richard Sandiford <r.sandiford@uk.ibm.com> |
* xcoff.h (XCOFF_EXPALL, XCOFF_EXPFULL): New flags. |
(xcoff_loader_info): Add auto_export_flags. |
2009-03-14 Richard Sandiford <r.sandiford@uk.ibm.com> |
* internal.h (C_AIX_WEAKEXT): New macro. |
(C_WEAKEXT): Use the GNU definition in the generic part of the file, |
and conditionally reset it to C_AIX_WEAKEXT in the XCOFF part of |
the file. |
(CSECT_SYM_P): New macro. |
* xcoff.h (L_WEAK): Define. |
(EXTERN_SYM_P): New macro. |
2009-03-14 Richard Sandiford <r.sandiford@uk.ibm.com> |
* xcoff.h (XCOFF_ALLOCATED): New flag. |
2009-03-14 Richard Sandiford <r.sandiford@uk.ibm.com> |
* xcoff.h (XCOFF_CALLED, XCOFF_IMPORT): Update comments. |
(XCOFF_WAS_UNDEFINED): New flag. |
(xcoff_link_hash_table): Add an "rtld" field. |
2009-03-14 Dave Korn <dave.korn.cygwin@gmail.com> |
* internal.h (struct internal_extra_pe_aouthdr): Correct type |
of DllCharacteristics flags field to unsigned. |
* pe.h (IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE, |
IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE, |
IMAGE_DLL_CHARACTERISTICS_NX_COMPAT, |
IMAGE_DLLCHARACTERISTICS_NO_ISOLATION, |
IMAGE_DLLCHARACTERISTICS_NO_SEH, |
IMAGE_DLLCHARACTERISTICS_NO_BIND, |
IMAGE_DLLCHARACTERISTICS_WDM_DRIVER, |
IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE): New macros to |
define flag bit values for DllCharacteristics field of PEAOUTHDR, |
PEPAOUTHDR. |
2008-12-23 Johan Olmutz Nielsen <jnielsen@ddci.com> |
* ti.h (COFF_ADJUST_SCNHDR_OUT_PRE): Define. |
2008-06-17 Nick Clifton <nickc@redhat.com> |
* ti.h (GET_SCNHDR_NLNNO): Provide an alternative version of this |
macro which does not trigger an array bounds warning in gcc. |
(PUT_SCNHDR_NLNNO): Likewise. |
(GET_SCNHDR_FLAGS): Likewise. |
(PUT_SCNHDR_FLAGS): Likewise. |
(GET_SCNHDR_PAGE): Likewise. |
(PUT_SCNHDR_PAGE): Likewise. |
2007-11-05 Danny Smith <dannysmith@users.sourceforge.net> |
* pe.h (COFF_ENCODE_ALIGNMENT) Define. |
2007-08-02 H.J. Lu <hongjiu.lu@intel.com> |
* pe.h (IMAGE_SCN_ALIGN_POWER_BIT_POS): New. |
(IMAGE_SCN_ALIGN_POWER_BIT_MASK): Likewise. |
(IMAGE_SCN_ALIGN_POWER_NUM): Likewise. |
(IMAGE_SCN_ALIGN_POWER_CONST): Likewise. |
(IMAGE_SCN_ALIGN_128BYTES): Likewise. |
(IMAGE_SCN_ALIGN_256BYTES): Likewise. |
(IMAGE_SCN_ALIGN_512BYTES): Likewise. |
(IMAGE_SCN_ALIGN_1024BYTES): Likewise. |
(IMAGE_SCN_ALIGN_2048BYTES): Likewise. |
(IMAGE_SCN_ALIGN_4096BYTES): Likewise. |
(IMAGE_SCN_ALIGN_8192BYTES): Likewise. |
(IMAGE_SCN_ALIGN_1BYTES): Redefined with |
IMAGE_SCN_ALIGN_POWER_CONST. |
(IMAGE_SCN_ALIGN_2BYTES): Likewise. |
(IMAGE_SCN_ALIGN_4BYTES): Likewise. |
(IMAGE_SCN_ALIGN_8BYTES): Likewise. |
(IMAGE_SCN_ALIGN_16BYTES): Likewise. |
(IMAGE_SCN_ALIGN_32BYTES): Likewise. |
(IMAGE_SCN_ALIGN_64BYTES): Likewise. |
2007-07-12 Kai Tietz <kai.tietz@onevision.com> |
* internal.h (struct internal_syment): Use bfd_hostptr_t for |
_n_zeroes and _n_offset fields. |
2007-04-27 Alan Modra <amodra@bigpond.net.au> |
* rs6000.h: Write Mimi's name in ASCII. |
2007-03-19 H.J. Lu <hongjiu.lu@intel.com> |
* internal.h (internal_extra_pe_aouthdr): Add Magic, |
MajorLinkerVersion, MinorLinkerVersion, SizeOfCode, |
SizeOfInitializedData, SizeOfUninitializedData, |
AddressOfEntryPoint, BaseOfCode and BaseOfData. |
2006-12-05 Michael Tautschnig <tautschn@model.in.tum.de> |
Nick Clifton <nickc@redhat.com> |
* external.h (struct external_aouthdr): Add ATTRIBUTE_PACKED. |
(struct external_syment): Likewise. |
(union external_auxent): Likewise. |
2006-11-14 Phil Lello <phil.lello@homecall.co.uk> |
* pe.h: Added defines for IMAGE_SUBSYSTEM_EFI_ROM and |
IMAGE_SUBSYSTEM_XBOX. |
* internal.h: Added defines for PE directory entry types. |
NB: in internal.h because IMAGE_NUMBEROF_DIRECTORY_ENTRYIES is in |
pe.h |
2006-09-20 Kai Tietz <Kai.Tietz@onevision.com> |
* external.h: Add proper external_aouthdr64 structure (without |
data_start member). |
(AOUTHDRSZ64): Set according structure size. |
(AOUTHDR64): As typedef of external_aouthdr64 structure. |
* internal.h: Add relocation identifiers for coff. |
* pe.h: Add define IMAGE_FILE_MACHINE_AMD64 the coff signature. |
(PEPAOUTHDR): Adjust structure to have proper size (using AOUTHDR64). |
(PEPAOUTSZ): Calculated size of 240. |
* x86_64.h: Coff information for x86_64 (AMD64). |
2006-02-05 Arnold Metselaar <arnold.metselaar@planet.nl> |
* internal.h: Add relocation number R_IMM24 for Z80. |
2005-10-25 Arnold Metselaar <arnold.metselaar@planet.nl> |
* internal.h: Add relocation number for Z80 |
* z80.h: New file. |
2005-08-18 Alan Modra <amodra@bigpond.net.au> |
* a29k.h: Delete. |
2005-07-14 Daniel Marques <marques@cs.cornell.edu> |
* alpha.h (ALPHA_ECOFF_COMPRESSEDMAG): Define. |
* ecoff.h (ALPHA_MAGIC_COMPRESSED): Define. |
2005-05-10 Nick Clifton <nickc@redhat.com> |
* Update the address and phone number of the FSF organization in |
the GPL notices in the following files: |
a29k.h, alpha.h, apollo.h, arm.h, aux-coff.h, ecoff.h, external.h, |
go32exe.h, h8300.h, h8500.h, i386.h, i860.h, i960.h, ia64.h, |
internal.h, m68k.h, m88k.h, maxq.h, mcore.h, mips.h, mipspe.h, |
or32.h, pe.h, powerpc.h, rs6k64.h, sh.h, sparc.h, ti.h, tic30.h, |
tic4x.h, tic54x.h, tic80.h, w65.h, we32k.h, xcoff.h, z8k.h |
2005-02-21 Alan Modra <amodra@bigpond.net.au> |
* xcoff.h (struct xcoff_loader_info): Warning fix. |
2005-01-10 Inderpreet Singh <inderpreetb@noida.hcltech.com> |
* maxq.h (F_MAXQ10, F_MAXQ20): Define. |
2004-11-08 Inderpreet Singh <inderpreetb@nioda.hcltech.com> |
Vineet Sharma <vineets@noida.hcltech.com> |
* maxq.h: New file: Defintions for the maxq port. |
2004-11-08 Aaron W. LaFramboise <aaron98wiridge9@aaronwl.com> |
* pe.h (IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY): Define. |
(IMAGE_WEAK_EXTERN_SEARCH_LIBRARY): Same. |
(IMAGE_WEAK_EXTERN_SEARCH_ALIAS): Same. |
2004-08-13 Mark Kettenis <kettenis@gnu.org> |
* symconst.h (langMax): Fix typo in comment. |
2004-04-23 Chris Demetriou <cgd@broadcom.com> |
* mips.h (MIPS_R_RELHI, MIPS_R_RELLO, MIPS_R_SWITCH): Remove |
(MIPS_R_PCREL16): Update comment. |
* ecoff.h (struct ecoff_value_adjust): Remove structure. |
(struct ecoff_debug_info): Remove 'adjust' member. |
2004-04-20 DJ Delorie <dj@redhat.com> |
* internal.h (R_SECREL32): Add. |
For older changes see ChangeLog-9103 |
Copyright (C) 2004-2012 Free Software Foundation, Inc. |
Copying and distribution of this file, with or without modification, |
are permitted in any medium without royalty provided the copyright |
notice and this notice are preserved. |
Local Variables: |
mode: change-log |
left-margin: 8 |
fill-column: 74 |
version-control: never |
End: |
/contrib/toolchain/binutils/include/coff/ChangeLog-9103 |
---|
0,0 → 1,1186 |
2005-04-13 H.J. Lu <hongjiu.lu@intel.com> |
Moved from ../ChangeLog |
2003-04-04 Svein E. Seldal <Svein.Seldal@solidas.com> |
* tic4x.h: Namespace cleanup. Replace s/c4x/tic4x |
and s/c3x/tic3x/ |
2003-01-20 Svein E. Seldal <Svein.Seldal@solidas.com> |
* tic4x.h (TICOFF_TARGET_MACHINE_GET): Fixed define bug |
* ti.h (TICOFF_TARGET_MACHINE_GET): Added macros |
2002-08-28 Michael Hayes <m.hayes@elec.canterbury.ac.nz> |
* internal.h: Add new relocation types. |
* ti.h: Add file-header flags for tic4x code. |
* tic4x.h: New file |
2003-12-02 Graham Reed <grahamr@algorithmics.com> |
* internal.h (C_WEAKEXT): Add alternative value for AIX 5.2 |
based targets. |
2003-08-23 Jason Eckhardt <jle@rice.edu> |
* coff/i860.h (COFF860_R_PAIR, COFF860_R_LOW0, COFF860_R_LOW1, |
COFF860_R_LOW2, COFF860_R_LOW3, COFF860_R_LOW4, COFF860_R_SPLIT0, |
COFF860_R_SPLIT1, COFF860_R_SPLIT2, COFF860_R_HIGHADJ, |
COFF860_R_BRADDR): Define new relocation constants and document. |
Minor formatting adjustments. |
2003-08-07 Alan Modra <amodra@bigpond.net.au> |
* ti.h (GET_SCNHDR_NRELOC): Rename PTR param to LOC. |
(PUT_SCNHDR_NRELOC, GET_SCNHDR_NLNNO, PUT_SCNHDR_NLNNO): Likewise. |
(GET_SCNHDR_FLAGS, PUT_SCNHDR_FLAGS): Likewise. |
(GET_SCNHDR_PAGE, PUT_SCNHDR_PAGE): Likewise. |
2003-07-17 Jeff Muizelaar <muizelaar@rogers.com> |
* pe.h: (IMAGE_FILE_NET_RUN_FROM_SWAP): Define. |
(IMAGE_FILE_MACHINE_WCEMIPSV2): Define. |
(IMAGE_FILE_MACHINE_SH3DSP): Define. |
(IMAGE_FILE_MACHINE_SH3E): Define. |
(IMAGE_FILE_MACHINE_SH5): Define. |
(IMAGE_FILE_MACHINE_AM33): Define. |
(IMAGE_FILE_MACHINE_POWERPCFP): Define. |
(IMAGE_FILE_MACHINE_AXP64): Define. |
(IMAGE_FILE_MACHINE_TRICORE): Define. |
(IMAGE_FILE_MACHINE_CEF): Define. |
(IMAGE_FILE_MACHINE_EBC): Define. |
(IMAGE_FILE_MACHINE_AMD64): Define. |
(IMAGE_FILE_MACHINE_M32R): Define. |
(IMAGE_FILE_MACHINE_CEE): Define. |
2003-07-14 Christian Groessler <chris@groessler.org> |
* i860.h (AOUTSZ): Define for i860 coff. |
2003-06-29 Andreas Jaeger <aj@suse.de> |
* xcoff.h (struct __rtinit ): Convert to ISO C90 prototypes. |
* ecoff.h: Convert to ISO C90 prototypes. Replace PTR by void *. |
2003-04-24 Dhananjay Deshpande <dhananjayd@kpitcummins.com> |
* coff/h8300.h (H8300HNMAGIC, H8300SNMAGIC): New. |
(H8300HNBADMAG, H8300SNBADMAG): New. |
2003-04-15 Rohit Kumar Srivastava <rohits@kpitcummins.com> |
* sh.h: Replace occurrances of 'Hitachi' with 'Renesas'. |
* h8300.h: Likewise. |
* h8500.h: Likewise. |
2003-03-25 Stan Cox <scox@redhat.com> |
Nick Clifton <nickc@redhat.com> |
Contribute support for Intel's iWMMXt chip - an ARM variant: |
* arm.h (ARM_NOTE_SECTION): Define. |
2002-11-30 Alan Modra <amodra@bigpond.net.au> |
* ecoff.h: Replace boolean with bfd_boolean. |
* xcoff.h: Likewise. |
2002-03-18 Tom Rix <trix@redhat.com> |
* rs6k64.h: Add U64_TOCMAGIC, AIX 5 64 bit magic number. |
2002-02-01 Tom Rix <trix@redhat.com> |
* xcoff.h: Conditionally support <aiaff> for pre AIX 4.3. |
2002-01-31 Ivan Guzvinec <ivang@opencores.org> |
* or32.h: New file. |
2001-12-24 Tom Rix <trix@redhat.com> |
* xcoff.h (xcoff_big_format_p): Make <bigaf> the default archive |
format. |
(XCOFFARMAG_ELEMENT_SIZE, XCOFFARMAGBIG_ELEMENT_SIZE): Define for |
archive header ascii elements. |
2001-12-17 Tom Rix <trix@redhat.com> |
* xcoff.h : Add .except and .typchk section string and styp flags. |
Fix xcoff_big_format_p macro. |
2001-12-16 Tom Rix <trix@redhat.com> |
* xcoff.h : Clean up formatting. |
2002-01-15 Richard Earnshaw <rearnsha@arm.com> |
* arm.h (F_VFP_FLOAT): Define. |
2001-11-11 Timothy Wall <twall@alum.mit.edu> |
* ti.h: Move arch-specific stuff from here... |
(COFF_ADJUST_SYM_IN/OUT): Optionally put page flag into symbol |
value. |
* tic54x.h: ...to here. |
2001-10-26 Christian Groessler <cpg@aladdin.de> |
* external.h (GET_LINENO_LNNO): Fix usage of H_GET_32/16. |
(PUT_LINENO_LNNO): Likewise with H_PUT_32/16. |
2001-09-21 Nick Clifton <nickc@cambridge.redhat.com> |
* ti.h (GET_SCNHDR_PAGE): Fix compile time warning. |
2001-09-18 Alan Modra <amodra@bigpond.net.au> |
* external.h (GET_LINENO_LNNO): Use H_GET_32/16. |
(PUT_LINENO_LNNO): Use H_PUT_32/16. |
* m88k.h (GET_LNSZ_SIZE, GET_LNSZ_LNNO, GET_SCN_NRELOC, |
GET_SCN_NLINNO): Use H_GET_32. |
(PUT_LNSZ_LNNO, PUT_LNSZ_SIZE, PUT_SCN_NRELOC, PUT_SCN_NLINNO): |
Use H_PUT_32. |
* ti.h: Formatting fixes. Make use of H_GET_* and H_PUT_* throughout. |
* xcoff.h: White space changes. |
2001-09-05 Tom Rix <trix@redhat.com> |
* xcoff.h : Add XCOFF_SYSCALL32 and XCOFF_SYSCALL64 hash table flags. |
2001-08-27 Andreas Jaeger <aj@suse.de> |
* xcoff.h (struct __rtinit): Make proper prototype for rtl. |
Fri Aug 24 01:18:51 2001 J"orn Rennecke <amylaar@redhat.com> |
* internal.h (R_JMP2, R_JMPL2, R_MOVL2): Comment spelling fix. |
2001-04-05 Tom Rix <trix@redhat.com> |
* rs6000.h : move xcoff32 external structures from xcofflink. |
* rs6k64.h : move xcoff64 external structures from xcofflink. |
* internal.h : promote 32 bit structure elements to 64 bit |
for xcoff64 support |
* xcoff.h : New file. |
2001-03-23 Nick Clifton <nickc@redhat.com> |
* a29k.h: Fix compile time warning. |
* external.h: Fix compile time warning. |
* m88k.h: Fix compile time warning. |
2001-03-13 Nick Clifton <nickc@redhat.com> |
* external.h: New file. Common structure definitions found in |
other COFF header files. |
* a29k.h: Use external.h. |
* apollo.h: Use external.h. |
* arm.h: Use external.h. |
* h8300.h: Use external.h. |
* h8500.h: Use external.h. |
* i386.h: Use external.h. |
* i860.h: Use external.h. |
* ia64.h: Use external.h. |
* m68k.h: Use external.h. |
* m88k.h: Use external.h. |
* mcore.h: Use external.h. |
* mips.h: Use external.h. |
* mipspe.h: Use external.h. |
* powerpc.h: Use external.h. |
* rs6000.h: Use external.h. |
* rs6k64.h: Use external.h. |
* sh.h: Use external.h. |
* sparc.h: Use external.h. |
* tic30.h: Use external.h. |
* tic80.h: Use external.h. |
* w65.h: Use external.h. |
* we32k.h: Use external.h. |
* z8k.h: Use external.h. |
2001-02-09 David Mosberger <davidm@hpl.hp.com> |
* pe.h (PEPAOUTSZ): Rename from PEP64AOUTSZ. |
Rename from PEPAOUTHDR. |
2001-01-23 H.J. Lu <hjl@gnu.org> |
* pe.h (struct external_PEI_DOS_hdr): New. |
(struct external_PEI_IMAGE_hdr): New. |
2000-12-11 Alan Modra <alan@linuxcare.com.au> |
* ti.h (OCTETS_PER_BYTE_POWER): Change #warning to #error. |
2000-12-08 Alan Modra <alan@linuxcare.com.au> |
* ti.h (OCTETS_PER_BYTE_POWER): Change #warn to #warning. |
2000-06-30 DJ Delorie <dj@cygnus.com> |
* pe.h: Clarify a comment. |
2000-05-05 Clinton Popetz <cpopetz@cygnus.com> |
* rs6k64.h (U802TOC64MAGIC): Change to U803XTOCMAGIC. |
2000-04-24 Clinton Popetz <cpopetz@cygnus.com> |
* rs6k64.h: New file. |
2000-04-17 Timothy Wall <twall@cygnus.com> |
* ti.h: Load page cleanup. |
* intental.h: Add load page field. |
Mon Apr 17 16:44:01 2000 David Mosberger <davidm@hpl.hp.com> |
* pe.h (PEP64AOUTHDR): New header for PE+. |
(PEP64AOUTSZ): New macro. |
(IMAGE_SUBSYSTEM_UNKNOWN): New macro. |
(IMAGE_SUBSYSTEM_NATIVE): Ditto. |
(IMAGE_SUBSYSTEM_WINDOWS_GUI): Ditto. |
(IMAGE_SUBSYSTEM_WINDOWS_CUI): Ditto. |
(IMAGE_SUBSYSTEM_POSIX_CUI): Ditto. |
(IMAGE_SUBSYSTEM_WINDOWS_CE_GUI): Ditto. |
(IMAGE_SUBSYSTEM_EFI_APPLICATION): Ditto. |
(IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER): Ditto. |
(IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER): Ditto. |
* internal.h (PE_DEF_FILE_ALIGNMENT): Define only if not defined |
already. |
* ia64.h: New file. |
2000-04-13 Alan Modra <alan@linuxcare.com.au> |
* ti.h (ADDR_MASK): Don't use ul suffix on constants. |
(PG_MASK): Ditto. |
2000-04-11 Timothy Wall <twall@cygnus.com> |
* ti.h: Remove load page references until load pages are |
reimplemented. |
* tic54x.h: Ditto. |
2000-04-07 Timothy Wall <twall@cygnus.com> |
* internal.h: Fix some comments related to TI COFF (instead of tic80). |
* ti.h: New. |
* tic54x.h: New. |
Wed Apr 5 22:08:41 2000 J"orn Rennecke <amylaar@cygnus.co.uk> |
* sh.h (R_SH_LOOP_START, R_SH_LOOP_END): Define. |
2000-03-15 Kazu Hirata <kazu@hxi.com> |
* internal.h: Fix a typo in the comment for R_MOVL2. |
2000-02-28 Nick Clifton <nickc@cygnus.com> |
* mipspe.h (MIPS_PE_MAGIC): Define. |
* sh.h (SH_PE_MAGIC): Define. |
2000-02-22 Nick Clifton <nickc@cygnus.com> DJ Delorie <dj@cygnus.com> |
* sh.h: Add Windows CE definitions. |
* arm.h: Add Windows CE definitions. |
* mipspe.h: New file: Windows CE definitions for MIPS. |
* pe.h: Add constants for ILF support. |
2000-01-05 Nick Clifton <nickc@cygnus.com> |
* pe.h: Fix formatting of comments. |
(IMAGE_FILE_AGGRESSIVE_WS_TRIM): Define. |
(IMAGE_FILE_LARGE_ADDRESS_AWARE): Define. |
(IMAGE_FILE_16BIT_MACHINE): Define. |
(IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP): Define. |
(IMAGE_FILE_UP_SYSTEM_ONLY): Define. |
(IMAGE_FILE_MACHINE_UNKNOWN): Define. |
(IMAGE_FILE_MACHINE_ALPHA): Define. |
(IMAGE_FILE_MACHINE_ALPHA64): Define. |
(IMAGE_FILE_MACHINE_I386): Define. |
(IMAGE_FILE_MACHINE_IA64): Define. |
(IMAGE_FILE_MACHINE_M68K): Define. |
(IMAGE_FILE_MACHINE_MIPS16): Define. |
(IMAGE_FILE_MACHINE_MIPSFPU): Define. |
(IMAGE_FILE_MACHINE_MIPSFPU16): Define. |
(IMAGE_FILE_MACHINE_POWERPC): Define. |
(IMAGE_FILE_MACHINE_R3000): Define. |
(IMAGE_FILE_MACHINE_R4000): Define. |
(IMAGE_FILE_MACHINE_R10000): Define. |
(IMAGE_FILE_MACHINE_SH3): Define. |
(IMAGE_FILE_MACHINE_SH4): Define. |
(IMAGE_FILE_MACHINE_THUMB): Define. |
1999-09-20 Alan Modra <alan@spri.levels.unisa.edu.au> |
* internal.h: Delete bogus R_PCLONG, duplicate R_RELBYTE and |
R_RELWORD, and rewrite some R_* as decimal. |
1999-09-06 Donn Terry <donn@interix.com> |
* internal.h (DTYPE): Define. |
* pe.h (struct external_PEI_filehdr): Rename from |
external_PE_filehdr. Define even if COFF_IMAGE_WITH_PE is not |
defined. |
1999-07-17 Nick Clifton <nickc@cygnus.com> |
* arm.h (F_SOFT_FLOAT): Rename from F_SOFTFLOAT. |
1999-06-21 Philip Blundell <pb@nexus.co.uk> |
* arm.h (F_SOFTFLOAT): Define. |
1999-07-05 Nick Clifton <nickc@cygnus.com> |
* arm.h (F_ARM_5): Define. |
Wed Jun 2 18:08:18 1999 Richard Henderson <rth@cygnus.com> |
* internal.h (BEOS_EXE_IMAGE_BASE, BEOS_DLL_IMAGE_BASE): New. |
Mon May 17 13:35:35 1999 Stan Cox <scox@cygnus.com> |
* arm.h (F_PIC, F_ARM_2, F_ARM_2a, F_ARM_3, F_ARM_3M, |
F_ARM_4, F_ARM_4T, F_APCS26): Changed values to distinguish |
F_ARM_2a, F_ARM_3M, F_ARM_4T. |
1999-05-15 Nick Clifton <nickc@cygnus.com> |
* mcore.h (IMAGE_REL_MCORE_RVA): Define. |
1999-04-21 Nick Clifton <nickc@cygnus.com> |
* mcore.h (GET_LINENO_LNNO): New macro. |
(PUT_LINENO_LNNO): New macro. |
1999-04-08 Nick Clifton <nickc@cygnus.com> |
* mcore.h: New header file. Defines for Motorola's MCore |
processor. |
Sun Dec 6 21:36:37 1998 Mark Elbrecht <snowball3@usa.net> |
* internal.h (C_WEAKEXT): Define. |
Wed Jan 27 13:35:35 1999 Stan Cox <scox@cygnus.com> |
* arm.h (F_PIC_INT, F_ARM_2, F_ARM_3, F_ARM_4, F_APCS26): |
Changed values to avoid clashing with IMAGE_FILE_* coff header |
flag values. |
Wed Apr 1 16:06:15 1998 Nick Clifton <nickc@cygnus.com> |
* internal.h: Document numbers associated with Thumb symbol |
types. |
Fri Mar 27 17:16:57 1998 Ian Lance Taylor <ian@cygnus.com> |
* internal.h (ISPTR, ISFCN, ISARY): Add casts to unsigned long. |
Mon Feb 2 17:10:38 1998 Steve Haworth <steve@pm.cse.rmit.EDU.AU> |
* tic30.h: New file. |
Fri Dec 12 11:49:07 1997 Fred Fish <fnf@cygnus.com> |
* tic80.h (R_MPPCR15W): New relocation type, for 15 bit PC relative |
offsets. |
Tue Dec 2 10:21:40 1997 Nick Clifton <nickc@cygnus.com> |
* arm.h (COFFARM): New define. |
Mon Dec 1 20:24:18 1997 J"orn Rennecke <amylaar@cygnus.co.uk> |
* sh.h (R_SH_SWITCH8): New. |
Sat Nov 22 15:10:14 1997 Nick Clifton <nickc@cygnus.com> |
* internal.h (C_THUMBEXTFUNC, C_THUMBSTATFUNC): Constants to |
define static and external functions. |
* arm.h: Add bits to support PIC and APCS-FLOAT type binaries, |
when implemented. |
Fri Oct 3 14:25:17 1997 Fred Fish <fnf@cygnus.com> |
* tic80.h (R_PPL16B): Make constant uppercase for consistency. |
Tue Jul 22 18:18:58 1997 Robert Hoehne <robert.hoehne@Mathematik.TU-Chemnitz.DE> |
* go32exe.h: New file. |
Tue Jul 8 12:23:55 1997 Fred Fish <fnf@cygnus.com> |
* tic80.h (TIC80_TARGET_ID): Add define. |
* internal.h (struct internal_filehdr): Add f_target_id field. |
Tue Jun 3 16:44:18 1997 Nick Clifton <nickc@cygnus.com> |
* internal.h: Add storage classes for Thumb symbols |
Mon May 26 14:07:55 1997 Ian Lance Taylor <ian@cygnus.com> |
* tic80.h (R_PPL16B): Correct value. |
Tue May 13 10:21:14 1997 Nick Clifton <nickc@cygnus.com> |
* arm.h (constants): Added new flag bits F_APCS_26 and |
F_APCS_SET for the f_flags field of the filehdr structure. Added new |
flags: F_APCS26, F_ARM_2, F_ARM_3, F_ARM_7, F_ARM_7T to store |
information in the flags field of the internal_f structure used by BFD |
routines. |
Sat May 3 08:24:59 1997 Fred Fish <fnf@cygnus.com> |
* internal.h (C_UEXT, C_STATLAB, C_EXTLAB, C_SYSTEM): |
New storage classes for TIc80. |
Fri Apr 18 11:52:55 1997 Niklas Hallqvist <niklas@appli.se> |
* alpha.h (ALPHA_ECOFF_BADMAG): Recognize *BSD/alpha magic too. |
(ALPHA_R_LITERALSLEAZY): Define. |
* ecoff.h (ALPHA_MAGIC_BSD): Define. |
Wed Jan 29 11:31:51 1997 Ian Lance Taylor <ian@cygnus.com> |
* i960.h (R_IPR13, R_ALIGN): Define. |
Mon Jan 27 13:34:30 1997 Ian Lance Taylor <ian@cygnus.com> |
* internal.h (R_IPRMED, R_OPTCALL, R_OPTCALLX): Move definitions |
from here... |
* i960.h (R_IPRMED, R_OPTCALL, R_OPTCALLX): ...to here. |
Wed Jan 22 20:10:47 1997 Fred Fish <fnf@cygnus.com> |
* tic80.h (TIC80MAGIC): Renamed to TIC80_AOUTHDR_MAGIC. |
Fri Dec 27 22:05:45 1996 Fred Fish <fnf@cygnus.com> |
* tic80.h: New file for TIc80 support. |
Thu Dec 19 16:18:11 1996 Ian Lance Taylor <ian@cygnus.com> |
* arm.h (_LIT): Define. |
Fri Jun 28 12:54:38 1996 Ian Lance Taylor <ian@cygnus.com> |
* pe.h (FILHSZ): Define. |
Wed Jun 26 16:24:26 1996 Ian Lance Taylor <ian@cygnus.com> |
* All files: Define FILHSZ, AOUTSZ, AOUTHDRSZ, SCNHSZ, SYMESZ, |
AUXESZ, LINESZ, RELSZ as numeric constants rather than uses of |
sizeof. Define AOUTHDRSZ in all files. |
* pe.h (AOUTSZ): Define by adding to AOUTHDRSZ. |
Fri Jun 21 11:17:46 1996 Richard Henderson <rth@tamu.edu> |
* alpha.h: Add declarations for relocation types added for Alpha |
OSF/1 3.0. |
Tue Jun 18 16:04:29 1996 Jeffrey A. Law <law@rtl.cygnus.com> |
* h8300.h (H8300SMAGIC): Define. |
(H8300SBADMAG): Define. |
Mon Jun 10 11:53:28 1996 Jeffrey A Law (law@cygnus.com) |
* internal.h (R_BCC_INV, R_JMP_DEL): New relocations for |
relaxing in the H8/300 series. |
Thu May 16 15:49:22 1996 Ian Lance Taylor <ian@cygnus.com> |
* sh.h (R_SH_CODE, R_SH_DATA, R_SH_LABEL): Define. |
Tue May 7 00:36:39 1996 Jeffrey A Law (law@cygnus.com) |
* internal.h (R_JMPL2): Renamed from R_JMPL_B8 to be |
consistent with other similar relocs. |
* internal.h (H8/300 specific relocs): Add comments better |
explaining what each reloc is used for. |
(R_MOV16B1, R_MOV16B2): Renamed from R_MOVB1 and R_MOVB2. |
(R_MOV24B1, R_MOV24B2): Renamed from R_MOVLB1 and R_MOVLB2. |
(R_MOVL1, R_MOVL2): New relocs. |
Fri May 3 13:01:12 1996 Jeffrey A Law (law@cygnus.com) |
* internal.h (R_PCRWORD_B): Define for the h8300 relaxing |
linker. |
Wed May 1 19:21:03 1996 Ian Lance Taylor <ian@cygnus.com> |
* internal.h (SCNNMLEN): Define. |
(struct internal_scnhdr): Use SCNNMLEN for s_name field. |
Fri Mar 29 13:41:25 1996 Ian Lance Taylor <ian@cygnus.com> |
* pe.h: Define IMAGE_COMDAT codes. |
Wed Mar 27 17:29:42 1996 Ian Lance Taylor <ian@cygnus.com> |
* arm.h (union external_auxent): Add x_checksum, x_associated, and |
x_comdat fields to x_scn struct. |
* i386.h (union external_auxent): Likewise. |
* powerpc.h (union external_auxent): Likewise. |
* internal.h (union internal_auxent): Likewise. |
Thu Mar 21 16:25:57 1996 David Mosberger-Tang <davidm@azstarnet.com> |
* ecoff.h (struct ecoff_find_line): Add caching fields. |
Thu Mar 14 15:22:44 1996 Jeffrey A Law (law@cygnus.com) |
* internal.h (R_MEM_INDIRECT): New reloc for the h8300. |
Fri Feb 9 10:44:11 1996 Ian Lance Taylor <ian@cygnus.com> |
* aux-coff.h: Rename from aux.h, to avoid problems on hapless DOS |
systems which think that aux is a com port. |
Mon Feb 5 18:35:00 1996 Ian Lance Taylor <ian@cygnus.com> |
* i960.h (F_I960HX): Define. |
Wed Jan 31 13:11:54 1996 Richard Henderson <rth@tamu.edu> |
* aux.h: New file. |
* internal.h, m68k.h: Protect against multiple inclusion. |
Wed Nov 22 13:48:39 1995 Ian Lance Taylor <ian@cygnus.com> |
* ecoff.h (_RCONST, STYP_RCONST, RELOC_SECTION_RCONST): Define. |
(NUM_RELOC_SECTIONS): Update. |
* symconst.h (scRConst): Define. |
Tue Nov 14 18:54:29 1995 Ian Lance Taylor <ian@cygnus.com> |
* internal.h (C_NT_WEAK): Define. |
Thu Nov 9 14:08:30 1995 Ian Lance Taylor <ian@cygnus.com> |
* rs6000.h (STYP_OVRFLO): Define. |
Tue Nov 7 14:38:45 1995 Kim Knuttila <krk@cygnus.com> |
* powerpc.h (IMAGE_NT_OPTIONAL_HDR_MAGIC): Added define. |
* pe.h: Added defines for file level flags |
Mon Nov 6 17:28:01 1995 Harry Dolan <dolan@ssd.intel.com> |
* i860.h: New file, based on i386.h. |
Wed Nov 1 15:25:18 1995 Manfred Hollstein KS/EF4A 60/1F/110 #40283 <manfred@lts.sel.alcatel.de> |
* m68k.h (PAGEMAGICEXECSWAPPED): Define. |
(PAGEMAGICPEXECSWAPPED): Define. |
(PAGEMAGICPEXECTSHLIB): Define. |
(PAGEMAGICPEXECPAGED): Define. |
(_COMMENT): DEFINE. |
* m88k.h (_COMMENT): Define. |
Wed Oct 18 18:36:19 1995 Geoffrey Noer <noer@cygnus.com> |
* sym.h: #if 0'd out runtime_pdr struct because it chokes |
Visual C++ and there aren't any references to it elsewhere in gdb. |
Mon Oct 16 11:12:24 1995 Ian Lance Taylor <ian@cygnus.com> |
* rs6000.h (SMALL_AOUTSZ): Define. |
* internal.h (XMC_TD): Define. |
Tue Oct 10 18:41:03 1995 Ian Lance Taylor <ian@cygnus.com> |
* internal.h (struct internal_aouthdr): Add o_cputype field. |
* rs6000.h (AOUTHDR): Rename o_resv1 to o_cputype. |
Mon Oct 9 14:45:46 1995 Ian Lance Taylor <ian@cygnus.com> |
* rs6000.h (AOUTHDR): Add o_maxdata field. Add comments. |
(_PAD, _LOADER): Define. |
(STYP_LOADER): Define. |
* internal.h (struct internal_aouthdr): Add o_maxdata field. |
Thu Oct 5 10:02:57 1995 Ian Lance Taylor <ian@cygnus.com> |
* ecoff.h: Define section name macros and STYP macros for various |
Alpha sections: .got, .hash, .dynsym, .dynstr, .rel.dyn, .conflic, |
.comment, .liblist, .dynamic. |
Wed Oct 4 10:56:35 1995 Kim Knuttila <krk@cygnus.com> |
* pe.h: Moved DOSMAGIC and NT_SIGNATURE defines here |
* powerpc.h: removed DOSMAGIC, NT_SIGNATURE, and DEFAULT_* defines |
Also removed other unused defines (various MAGIC ones) |
* i386.h: removed DOSMAGIC, NT_SIGNATURE, and DEFAULT_* defines |
* arm.h: removed DOSMAGIC, NT_SIGNATURE, and DEFAULT_* defines |
* apollo.h: removed unused DEFAULT_* defines |
* alpha.h: removed unused DEFAULT_* defines |
* h8500.h: removed unused DEFAULT_* defines |
* h8300.h: removed unused DEFAULT_* defines |
* i960.h: removed unused DEFAULT_* defines |
* m88k.h: removed unused DEFAULT_* defines |
* we32k.h: removed unused DEFAULT_* defines |
* rs6000.h: removed unused DEFAULT_* defines |
* mips.h: removed unused DEFAULT_* defines |
* m68k.h: removed unused DEFAULT_* defines |
* z8k.h: removed unused DEFAULT_* defines |
* w65.h: removed unused DEFAULT_* defines |
* sparc.h: removed unused DEFAULT_* defines |
* sh.h: removed unused DEFAULT_* defines |
Fri Sep 29 08:40:08 1995 Kim Knuttila <krk@cygnus.com> |
* powerpc.h: Reformatted to GNU coding conventions. |
Wed Sep 27 06:50:50 1995 Kim Knuttila <krk@nellie> |
* pe.h: added defines for more section characteristics |
* powerpc.h (new file): base coff definitions for ppc PE |
Tue Sep 12 12:08:20 1995 Ian Lance Taylor <ian@cygnus.com> |
* internal.h (struct internal_syment): Change n_numaux field from |
char to unsigned char. |
Fri Sep 1 15:39:36 1995 Kazumoto Kojima <kkojima@info.kanagawa-u.ac.jp> |
* mips.h (struct rpdr_ext): Define. |
Thu Aug 31 16:51:50 1995 steve chamberlain <sac@slash.cygnus.com> |
* internal.h (internal_aouthdr, internal_filehdr): |
don't indirect the pe stuff. |
Tue Aug 29 14:16:07 1995 steve chamberlain <sac@slash.cygnus.com> |
* i386.h (NT_DEF_RESERVE, NT_DEF_COMMIT): Make the same |
as 'the other' compiler. |
* internal.h (NT_IMAGE_BASE): Deleted. |
(NT_EXE_IMAGE_BASE, NT_DLL_IMAGE_BASE): New. |
(PE_DEF_SECTION_ALIGNMENT, PE_DEF_FILE_ALIGNMENT): New. |
(R_IMAGEBASE): New. |
Mon Aug 21 18:12:19 1995 steve chamberlain <sac@slash.cygnus.com> |
* internal.h: (internal_filehdr): Moved PE stuff into |
internal_extra_pe_filehdr. |
(internal_aouthdr): Moved PE stuff into |
interanl_extra_pe_aouthdr. |
Mon Jul 24 14:05:39 1995 Ian Lance Taylor <ian@cygnus.com> |
* internal.h: Move R_SH_* relocs from here... |
* sh.h: ...to here. |
(R_SH_SWITCH16, R_SH_SWITCH32): Define. |
(R_SH_USES, R_SH_COUNT, R_SH_ALIGN): Define. |
Thu Jun 29 00:04:25 1995 Steve Chamberlain <sac@slash.cygnus.com> |
* internal.h (NT_DEF_RESERVE, NT_DEF_COMMIT): Increase a lot. |
Tue May 16 15:08:20 1995 Ken Raeburn <raeburn@cujo.cygnus.com> |
* internal.h (NT_subsystem, NT_stack_heap): Delete |
Tue May 16 15:08:20 1995 Ken Raeburn <raeburn@cujo.cygnus.com> |
* internal.h (NT_subsystem, NT_stack_heap): Now extern. |
Sat May 13 10:14:08 1995 Steve Chamberlain <sac@slash.cygnus.com> |
* pe.h: New file. |
* i386.h (NT_SECTION_ALIGNMENT, NT_FILE_ALIGNMENT, |
NT_DEF_RESERVE, NT_DEF_COMMIT): New. |
* internal.h (internal_filehdr): New fields for PE. |
(IMAGE_DATA_DIRECTORY): New. |
(internal_aouthdr): New fields for PE. |
Tue Feb 14 17:59:37 1995 Ian Lance Taylor <ian@cygnus.com> |
* ecoff.h (struct ecoff_fdrtab_entry): Define. |
(struct ecoff_find_line): Define. |
Sat Feb 4 14:38:03 1995 David Mosberger-Tang <davidm@piston.cs.arizona.edu> |
* sym.h (struct pdr): field "prof" added. |
* alpha.h (PDR_BITS1_PROF_*): added, macros for PDR_BITS*_RESERVED_* |
updated accordingly. |
Sun Jan 15 18:38:33 1995 Steve Chamberlain <sac@splat> |
* w65.h: New file. |
Wed Nov 23 22:43:38 1994 Steve Chamberlain (sac@jonny.cygnus.com) |
* sh.h (SH_ARCH_MAGIC_BIG, SH_ARCH_MAGIC_LITTLE): New. |
(SHBADMAG): Changed to suit. |
Tue Jul 26 17:46:08 1994 Ken Raeburn (raeburn@cujo.cygnus.com) |
* i960.h (F_I960JX): New macro. |
Wed Jul 6 00:48:57 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) |
* alpha.h: Add definitions for alpha file header flags, encoding |
the object type of the file. |
Mon Jun 20 13:47:01 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) |
* ecoff.h (ecoff_swap_tir_in): Remove declaration. |
(ecoff_swap_tir_out): Likewise. |
(ecoff_swap_rndx_in, ecoff_swap_rndx_out): Likewise. |
(struct ecoff_debug_swap): Add new fields: swap_tir_in, |
swap_rndx_in, swap_tir_out, swap_rndx_out, read_debug_info. |
Sun Jun 12 03:51:52 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) |
* symconst.h: Pick up SGI define for stIndirect. |
Fri Apr 22 13:05:28 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* ecoff.h (REGINFO): Don't define. |
(struct ecoff_reginfo): Don't define. |
* sh.h (SH_ARCH_MAGIC): Rename from SHMAGIC. SHMAGIC is used by |
several targets to mean a shared library. |
(SHBADMAG): Corresponding change. |
Thu Apr 14 13:00:53 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* mips.h (RELOC_BITS3_TYPE_BIG): Changed from 0x1e to 0x3e. |
(RELOC_BITS3_TYPEHI_LITTLE): Define. |
(RELOC_BITS3_TYPEHI_SH_LITTLE): Define. |
(MIPS_R_PCREL16): Change value from 8 to 12 to match Irix 4. |
(MIPS_R_RELHI): Define. |
(MIPS_R_RELLO): Define. |
(MIPS_R_SWITCH): Change value from 9 to 22. |
Thu Apr 7 14:19:35 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* mips.h (MIPS_R_SWITCH): Define. |
Thu Mar 31 19:28:33 1994 Ken Raeburn (raeburn@cujo.cygnus.com) |
* internal.h (internal_aouthdr): Added comments for Apollo fields. |
Thu Mar 31 16:28:02 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* ecoff.h (STYP_ECOFF_LIB): Define as used on Irix 4. |
Fri Mar 25 17:16:55 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* ecoff.h (struct ecoff_debug_info): Add adjust field. |
(struct ecoff_value_adjust): Define. |
Tue Mar 22 13:22:47 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* mips.h (MIPS_R_PCREL16): Define. |
Sat Feb 26 10:26:38 1994 Ian Lance Taylor (ian@cygnus.com) |
* ecoff.h: Add casts to avoid warnings from SVR4 cc. |
Mon Feb 21 09:48:46 1994 Ian Lance Taylor (ian@lisa.cygnus.com) |
* sym.h (struct runtime_pdr): Make field adr bfd_vma, not unsigned |
long. |
(SYMR): Make field value bfd_vma, not long. |
Fri Feb 4 23:35:53 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* rs6000.h (STYP_DEBUG): Define. |
Wed Feb 2 14:31:37 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* internal.h (union internal_auxent): Change x_csect.x_scnlen into |
a union of a long and a pointer to a symbol. XCOFF sometimes uses |
this field as a symbol index. |
Mon Jan 10 23:54:25 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* ecoff.h (ecoff_debug_info): Remove fields line_end, |
external_dnr_end, external_pdr_end, external_sym_end, |
external_opt_end, external_aux_end, ss_end, external_fdr_end. |
Replace ifdbase with ifdmap. |
Wed Jan 5 17:05:36 1994 Ken Raeburn (raeburn@deneb.cygnus.com) |
* ecoff.h (STYP_EXTENDESC, STYP_COMMENT, STYP_XDATA, STYP_PDATA): |
Define. |
Wed Jan 5 16:58:24 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* ecoff.h (NUM_RELOC_SECTIONS): Define. |
Tue Dec 21 09:24:56 1993 Ken Raeburn (raeburn@rtl.cygnus.com) |
* sparc.h (struct external_reloc): Rename field r_addend to |
r_offset. |
Sat Dec 11 16:12:32 1993 Steve Chamberlain (sac@thepub.cygnus.com) |
* internal.h (R_DISP7, R_SH_IMM16): New reloc types. |
Tue Nov 23 14:23:19 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* ecoff.h (struct ecoff_debug_swap): Added *_end fields for all |
the symbolic information pointers. |
* sym.h: Named the EXTR structure ecoff_extr. |
Fri Nov 19 08:21:18 1993 Ken Raeburn (raeburn@rover.cygnus.com) |
* sparc.h (RELSZ): Use correct size. |
Wed Nov 17 17:18:16 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* mips.h (struct ecoff_debug_info): Define. |
Tue Nov 2 17:56:57 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* ecoff.h (struct ecoff_debug_swap): Define. |
Thu Oct 28 17:07:50 1993 Stan Shebs (shebs@rtl.cygnus.com) |
* i386.h (I386LYNXMAGIC): Rename to LYNXCOFFMAGIC. |
* m68k.h (LYNXCOFFMAGIC): Define. |
* sparc.h: New file. |
Tue Oct 19 15:34:50 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* alpha.h (external_aouthdr): Split four byte padding field into |
two byte bldrev field and two byte padding field. |
* ecoff.h (_LITA, _PDATA, _XDATA, STYP_LITA): Defined. |
Wed Oct 13 15:52:34 1993 Ken Raeburn (raeburn@cygnus.com) |
Sun Oct 10 17:27:10 1993 Troy Rollo (troy@cbme.unsw.edu.au) |
* internal.h: Added o_sri, o_inlib and o_vid for Apollos as well |
as R_DIR16. |
* apollo.h: New file |
Mon Oct 11 17:16:48 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* ecoff.h (REGINFO, struct ecoff_reginfo): Define. |
Tue Oct 5 10:52:53 1993 Jim Kingdon (kingdon@lioth.cygnus.com) |
* rs6000.h: Change non-ASCII characters in comment to octal |
escapes. |
Tue Sep 28 03:27:04 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) |
* ecoff.h (_FINI, STYP_ECOFF_FINI): Add to support .fini section. |
Fri Sep 24 11:53:53 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* mips.h (BADMAG): Recognize MIPS_MAGIC_LITTLE3 and MIPS_MAGIC_BIG3. |
* ecoff.h: Define MIPS_MAGIC_LITTLE3 and MIPS_MAGIC_BIG3. |
Thu Sep 23 21:07:14 1993 Jim Kingdon (kingdon@lioth.cygnus.com) |
* mips.h (BADMAG): Recognize MIPS_MAGIC_LITTLE2 and MIPS_MAGIC_BIG2. |
* ecoff.h: Define MIPS_MAGIC_LITTLE2 and MIPS_MAGIC_BIG2. |
Thu Sep 16 20:27:21 1993 Jim Kingdon (kingdon@cirdan.cygnus.com) |
* sym.h, symconst.h: Add comment stating these files are not part |
of GDB, GAS, etc. In 1991, when we asked rms whether we could |
include these files in GDB (although they are copyrighted by |
someone besides the FSF), he said it was OK if they were not |
considered part of GDB. |
Fri Sep 10 17:40:35 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* ecoff.h (AUX_PUT_ANY): Cast val argument to bfd_vma. |
* alpha.c (external_aouthdr): Need four bytes of padding between |
vstamp and tsize. |
Tue Sep 7 14:20:43 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* ecoff.h (AUX_GET_ANY, AUX_PUT_ANY): Changed to reflect further |
change in bfd swapping routine names. |
Tue Sep 7 10:15:17 1993 Jim Kingdon (kingdon@lioth.cygnus.com) |
* ecoff.h (AUX_GET_ANY): Change name of _do_getb32 to reflect bfd |
changes. |
Fri Aug 13 14:30:32 1993 Ian Lance Taylor (ian@cygnus.com) |
* ecoff.h (RELOC_SECTION_NONE): Define. |
Thu Aug 12 11:24:42 1993 Ian Lance Taylor (ian@cygnus.com) |
* alpha.h (struct external_reloc): Add r_symndx field. |
(RELSZ): Correct. |
(RELOC_BITS*): Correct. |
(ALPHA_R_*): Define. |
* ecoff.h (RELOC_SECTION_{XDATA,PDATA,FINI,LITA,ABS}): Define. |
(r_extern): Undefine. |
* internal.h (struct internal_reloc): Make r_vaddr bfd_vma rather |
than long. Add r_extern field. |
* alpha.h (PDR_BITS*): Define. |
* sym.h (PDR): Give correct names to new fields. |
* ecoff.h: Moved MIPS reloc definitions from here... |
* mips.h: to here. |
Mon Aug 2 16:37:14 1993 Stu Grossman (grossman at cygnus.com) |
* i386.h: Add Lynx magic number. |
Tue Aug 3 11:17:53 1993 Ian Lance Taylor (ian@cygnus.com) |
* alpha.h: Corrected external symbolic debugging structures to |
match actual usage. |
* internal.h (internal_filehdr, internal_aouthdr, |
internal_scnhdr): Changed type of some fields to bfd_vma so they |
can hold 64 bits. |
* sym.h (HDRR, FDR, PDR, EXTR): Likewise. |
(PDR): Added new fields found on Alpha. |
* symconst.h (magicSym2): Define; new value found on Alpha. |
* ecoff.h: New file. |
* alpha.h, mips.h: Moved common information into ecoff.h. Moved |
external structure definitions in from ecoff-ext.h. |
* ecoff-ext.h: Removed; information now in alpha.h and mips.h. |
Sun Jul 18 21:43:59 1993 Jim Kingdon (kingdon@rtl.cygnus.com) |
* i386.h: Recognize I386PTXMAGIC. |
Fri Jul 16 09:54:35 1993 Ian Lance Taylor (ian@cygnus.com) |
* mips.h (MIPS_AOUT_{OZ}MAGIC): Renamed from {OZ}MAGIC. |
Thu Jul 15 12:23:55 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* m88k.h (union external_auxent): Move x_fcn back inside x_fcnary. |
({GET,PUT}_FCN_{LNNOPTR,ENDNDX}): Adjust accordingly. |
Sun Jul 11 18:00:18 1993 Jim Kingdon (kingdon@lioth.cygnus.com) |
* m68k.h: Define MC68KBCSMAGIC. |
Thu Jun 10 11:46:28 1993 Ian Lance Taylor (ian@cygnus.com) |
* mips.h (_INIT, STYP_MIPS_INIT): Define (used on Irix4). |
(STYP_OTHER_LOAD): Define as STYP_MIPS_INIT. |
Wed Jun 9 15:09:09 1993 Ian Lance Taylor (ian@cygnus.com) |
* mips.h (OMAGIC): Define. |
Tue Jun 8 12:16:03 1993 Steve Chamberlain (sac@phydeaux.cygnus.com) |
Support for H8/300-H |
* h8300.h: New magic number. |
* internal.h: New relocations. |
Mon Apr 26 18:04:47 1993 Steve Chamberlain (sac@thepub.cygnus.com) |
* internal.h, sh.h: Support for SH. |
Sat Apr 24 21:34:59 1993 Jim Kingdon (kingdon@cygnus.com) |
* a29k.h: Define _LIT. |
Fri Apr 23 18:41:23 1993 Steve Chamberlain (sac@thepub.cygnus.com) |
* alpha.h: New file. |
Thu Apr 8 12:36:34 1993 Ian Lance Taylor (ian@cygnus.com) |
* internal.h (C_SHADOW, C_VERSION): Copied in from m88k.h. |
* m88k.h, i386.h, we32k.h: Don't define all the storage classes; |
they're already in internal.h. |
Wed Apr 7 11:51:24 1993 Jim Kingdon (kingdon@cygnus.com) |
* internal.h: Change n_sclass to unsigned char. |
Change C_EFCN to 0xff, change RS/6000 dbx symbols |
to no longer be signed. |
Fri Mar 19 14:52:56 1993 Steve Chamberlain (sac@thepub.cygnus.com) |
* internal.h: Add H8/500 reloc types. |
Wed Mar 17 09:46:03 1993 Ian Lance Taylor (ian@cygnus.com) |
* ecoff-ext.h (AUX_PUT_ANY): Don't use void values in branches of |
conditional expression. |
Thu Mar 4 14:12:06 1993 Ian Lance Taylor (ian@cygnus.com) |
* ecoff-ext.h (AUX_GET_*): Rewrote to use new macro AUX_GET_ANY. |
(AUX_PUT_*): New macros corresponding to the AUX_GET macros. |
(ecoff_swap_tir_out): Added prototype. |
* mips.h (N_BTMASK, N_TMASK, N_BTSHFT, N_TSHIFT): Define; these |
are needed to interpret gcc debugging output. |
Tue Feb 9 07:43:27 1993 Ian Lance Taylor (ian@cygnus.com) |
* we32k.h (BTYPE, ISPTR, ISFCN, ISARY, DECREF): Removed |
more definitions duplicated in internal.h. |
Wed Feb 3 09:18:24 1993 Ian Lance Taylor (ian@cygnus.com) |
* mips.h (RELOC_BITS3_TYPE_*): Correct for big endian machines. |
Mon Jan 25 11:35:51 1993 Ian Lance Taylor (ian@cygnus.com) |
* internal.h (internal_aouthdr): Added additional fields used only |
by MIPS ECOFF. |
Thu Jan 21 10:28:38 1993 Ian Lance Taylor (ian@cygnus.com) |
* mips.h (AOUTHDR): Added additional fields used by ECOFF. |
Tue Jan 19 12:21:19 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* i386.h, we32k.h (N_*, T_*, DT_*): Removed still more definitions |
duplicated in internal.h. |
* mips.h (RELOC_SECTION_*, ECOFF_R_*): Defined constants for ECOFF |
relocs. |
Fri Jan 15 18:17:00 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* ecoff-ext.h: Added prototypes for new ECOFF swapping functions. |
(opt_ext): New structure. |
* mips.h (ZMAGIC): Defined to be 0413. |
(_LIB): Defined to be ".lib" |
(external_reloc): MIPS ECOFF relocs are only 8 bytes. Added |
macros to aid in swapping. |
Fri Jan 8 16:19:26 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* ecoff-ext.h: Added prototypes for ECOFF swapping functions. |
* internal.h (internal_scnhdr): Always provide s_align field, not |
just on i960. |
(internal_reloc): Always provide r_size field, not just on |
RS/6000. |
* mips.h (_RDATA, _SDATA, _SBSS, _LIT4, _LIT8, STYP_RDATA, |
STYP_SDATA, STYP_SBSS, STYP_LIT4, STYP_LIT8): Defined. |
(CODE_MASK, MIPS_IS_STAB, MIPS_MARK_STAB, MIPS_UNMARK_STAB, |
STABS_SYMBOL): Moved in from gdb/mipsread.c. |
Wed Jan 6 14:01:46 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* i386.h, we32k.h: removed STYP_* defines, since they duplicated |
those in internal.h. |
Tue Dec 29 15:40:07 1992 Ian Lance Taylor (ian@cygnus.com) |
* i386.h: define I386AIXMAGIC for Danbury AIX PS/2 compiler. |
Sat Dec 12 16:07:57 1992 Ian Lance Taylor (ian@cygnus.com) |
* i386.h: don't define BTYPE, ISPTR, ISFCN, ISARY, DECREF: they |
are defined in internal.h. |
Thu Nov 12 09:52:01 1992 Steve Chamberlain (sac@thepub.cygnus.com) |
* internal.h: (internal_reloc): r_offset is now a long. |
* z8k.h: slight comment enhancement |
Wed Sep 30 07:46:08 1992 Steve Chamberlain (sac@thepub.cygnus.com) |
* internal.h: changed z8k reloc types |
Fri Aug 28 10:16:31 1992 Brendan Kehoe (brendan@cygnus.com) |
* we32k.h: new file |
Thu Aug 27 13:00:01 1992 Brendan Kehoe (brendan@cygnus.com) |
* symconst.h: comment out cruft at the end of #endif |
Tue Aug 25 15:06:49 1992 Steve Chamberlain (sac@thepub.cygnus.com) |
* internal.h: added #define for STYP_LIT, removed from a29k and |
h8300. |
* z8k.h: added z8000 support |
Thu Jul 16 16:32:00 1992 Steve Chamberlain (sac@thepub.cygnus.com) |
* internal.h: added R_RELLONG_NEG reloc type |
Fri Jun 12 20:11:04 1992 John Gilmore (gnu at cygnus.com) |
* symconst.h: Fix unterminated comment. |
Wed Jun 10 07:57:49 1992 Steve Chamberlain (sac@thepub.cygnus.com) |
* i386.h: a.out magic numbers from |
mohring@informatik.tu-muenchen.de |
Mon Jun 8 20:13:33 1992 John Gilmore (gnu at cygnus.com) |
* ecoff-ext.h, mips.h: Use unsigned chars everywhere. |
(Suggested by Antti Miettinen.) |
Tue Apr 14 15:18:44 1992 John Gilmore (gnu at cygnus.com) |
* sym.h: Add comments. |
* symconst.h: Merge with Fred's changes. |
Tue Apr 14 14:30:05 1992 Fred Fish (fnf@cygnus.com) |
* symconst.h: Pick up SGI defines for stStruct, stUnion, stEnum, |
langCplusplus, and langCplusplusV2. |
Thu Apr 2 19:47:43 1992 John Gilmore (gnu at cygnus.com) |
* sym.h, symconst.h: MIPS has provided redistributable versions |
of these files. Thanks! |
* ecoff-ext.h: Add weakext bit to match new sym.h. |
Fri Mar 6 00:10:46 1992 John Gilmore (gnu at cygnus.com) |
* ecoff-ext.h: Add relative file descriptors. |
Thu Feb 27 11:53:04 1992 John Gilmore (gnu at cygnus.com) |
* ecoff-ext.h: New file for external (in-file) form of ecoff |
symbol structures. |
Thu Feb 6 11:33:32 1992 Steve Chamberlain (sac at rtl.cygnus.com) |
* h8300.h: made the external_lineno l_lnno field 4 bytes wide. |
andded GET/PUT_LINENO_LNNO macros |
Sat Nov 30 20:38:35 1991 Steve Chamberlain (sac at rtl.cygnus.com) |
* a29k.h, h8300.h, i386.h, i960.h, internal.h, m68k.h, m88k.h, |
mips.h, rs6000.h: Move from above coff-<foo>.h. |
Copyright (C) 1991-2003 Free Software Foundation, Inc. |
Copying and distribution of this file, with or without modification, |
are permitted in any medium without royalty provided the copyright |
notice and this notice are preserved. |
Local Variables: |
mode: change-log |
left-margin: 8 |
fill-column: 74 |
version-control: never |
End: |
/contrib/toolchain/binutils/include/coff/alpha.h |
---|
0,0 → 1,386 |
/* ECOFF support on Alpha machines. |
coff/ecoff.h must be included before this file. |
Copyright 2001, 2005, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/********************** FILE HEADER **********************/ |
struct external_filehdr |
{ |
unsigned char f_magic[2]; /* magic number */ |
unsigned char f_nscns[2]; /* number of sections */ |
unsigned char f_timdat[4]; /* time & date stamp */ |
unsigned char f_symptr[8]; /* file pointer to symtab */ |
unsigned char f_nsyms[4]; /* number of symtab entries */ |
unsigned char f_opthdr[2]; /* sizeof(optional hdr) */ |
unsigned char f_flags[2]; /* flags */ |
}; |
/* Magic numbers are defined in coff/ecoff.h. */ |
#define ALPHA_ECOFF_BADMAG(x) \ |
((x).f_magic != ALPHA_MAGIC && (x).f_magic != ALPHA_MAGIC_BSD) |
#define ALPHA_ECOFF_COMPRESSEDMAG(x) \ |
((x).f_magic == ALPHA_MAGIC_COMPRESSED) |
/* The object type is encoded in the f_flags. */ |
#define F_ALPHA_OBJECT_TYPE_MASK 0x3000 |
#define F_ALPHA_NO_SHARED 0x1000 |
#define F_ALPHA_SHARABLE 0x2000 |
#define F_ALPHA_CALL_SHARED 0x3000 |
#define FILHDR struct external_filehdr |
#define FILHSZ 24 |
/********************** AOUT "OPTIONAL HEADER" **********************/ |
typedef struct external_aouthdr |
{ |
unsigned char magic[2]; /* type of file */ |
unsigned char vstamp[2]; /* version stamp */ |
unsigned char bldrev[2]; /* ?? */ |
unsigned char padding[2]; /* pad to quadword boundary */ |
unsigned char tsize[8]; /* text size in bytes */ |
unsigned char dsize[8]; /* initialized data " " */ |
unsigned char bsize[8]; /* uninitialized data " " */ |
unsigned char entry[8]; /* entry pt. */ |
unsigned char text_start[8]; /* base of text used for this file */ |
unsigned char data_start[8]; /* base of data used for this file */ |
unsigned char bss_start[8]; /* base of bss used for this file */ |
unsigned char gprmask[4]; /* bitmask of general registers used */ |
unsigned char fprmask[4]; /* bitmask of floating point registers used */ |
unsigned char gp_value[8]; /* value for gp register */ |
} AOUTHDR; |
/* compute size of a header */ |
#define AOUTSZ 80 |
#define AOUTHDRSZ 80 |
/********************** SECTION HEADER **********************/ |
struct external_scnhdr |
{ |
unsigned char s_name[8]; /* section name */ |
unsigned char s_paddr[8]; /* physical address, aliased s_nlib */ |
unsigned char s_vaddr[8]; /* virtual address */ |
unsigned char s_size[8]; /* section size */ |
unsigned char s_scnptr[8]; /* file ptr to raw data for section */ |
unsigned char s_relptr[8]; /* file ptr to relocation */ |
unsigned char s_lnnoptr[8]; /* file ptr to line numbers */ |
unsigned char s_nreloc[2]; /* number of relocation entries */ |
unsigned char s_nlnno[2]; /* number of line number entries*/ |
unsigned char s_flags[4]; /* flags */ |
}; |
#define SCNHDR struct external_scnhdr |
#define SCNHSZ 64 |
/********************** RELOCATION DIRECTIVES **********************/ |
struct external_reloc |
{ |
unsigned char r_vaddr[8]; |
unsigned char r_symndx[4]; |
unsigned char r_bits[4]; |
}; |
#define RELOC struct external_reloc |
#define RELSZ 16 |
/* Constants to unpack the r_bits field. The Alpha seems to always be |
little endian, so I haven't bothered to define big endian variants |
of these. */ |
#define RELOC_BITS0_TYPE_LITTLE 0xff |
#define RELOC_BITS0_TYPE_SH_LITTLE 0 |
#define RELOC_BITS1_EXTERN_LITTLE 0x01 |
#define RELOC_BITS1_OFFSET_LITTLE 0x7e |
#define RELOC_BITS1_OFFSET_SH_LITTLE 1 |
#define RELOC_BITS1_RESERVED_LITTLE 0x80 |
#define RELOC_BITS1_RESERVED_SH_LITTLE 7 |
#define RELOC_BITS2_RESERVED_LITTLE 0xff |
#define RELOC_BITS2_RESERVED_SH_LEFT_LITTLE 1 |
#define RELOC_BITS3_RESERVED_LITTLE 0x03 |
#define RELOC_BITS3_RESERVED_SH_LEFT_LITTLE 9 |
#define RELOC_BITS3_SIZE_LITTLE 0xfc |
#define RELOC_BITS3_SIZE_SH_LITTLE 2 |
/* The r_type field in a reloc is one of the following values. */ |
#define ALPHA_R_IGNORE 0 |
#define ALPHA_R_REFLONG 1 |
#define ALPHA_R_REFQUAD 2 |
#define ALPHA_R_GPREL32 3 |
#define ALPHA_R_LITERAL 4 |
#define ALPHA_R_LITUSE 5 |
#define ALPHA_R_GPDISP 6 |
#define ALPHA_R_BRADDR 7 |
#define ALPHA_R_HINT 8 |
#define ALPHA_R_SREL16 9 |
#define ALPHA_R_SREL32 10 |
#define ALPHA_R_SREL64 11 |
#define ALPHA_R_OP_PUSH 12 |
#define ALPHA_R_OP_STORE 13 |
#define ALPHA_R_OP_PSUB 14 |
#define ALPHA_R_OP_PRSHIFT 15 |
#define ALPHA_R_GPVALUE 16 |
#define ALPHA_R_GPRELHIGH 17 |
#define ALPHA_R_GPRELLOW 18 |
#define ALPHA_R_IMMED 19 |
/* Overloaded reloc value used by Net- and OpenBSD. */ |
#define ALPHA_R_LITERALSLEAZY 17 |
/* With ALPHA_R_LITUSE, the r_size field is one of the following values. */ |
#define ALPHA_R_LU_BASE 1 |
#define ALPHA_R_LU_BYTOFF 2 |
#define ALPHA_R_LU_JSR 3 |
/* With ALPHA_R_IMMED, the r_size field is one of the following values. */ |
#define ALPHA_R_IMMED_GP_16 1 |
#define ALPHA_R_IMMED_GP_HI32 2 |
#define ALPHA_R_IMMED_SCN_HI32 3 |
#define ALPHA_R_IMMED_BR_HI32 4 |
#define ALPHA_R_IMMED_LO32 5 |
/********************** SYMBOLIC INFORMATION **********************/ |
/* Written by John Gilmore. */ |
/* ECOFF uses COFF-like section structures, but its own symbol format. |
This file defines the symbol format in fields whose size and alignment |
will not vary on different host systems. */ |
/* File header as a set of bytes */ |
struct hdr_ext |
{ |
unsigned char h_magic[2]; |
unsigned char h_vstamp[2]; |
unsigned char h_ilineMax[4]; |
unsigned char h_idnMax[4]; |
unsigned char h_ipdMax[4]; |
unsigned char h_isymMax[4]; |
unsigned char h_ioptMax[4]; |
unsigned char h_iauxMax[4]; |
unsigned char h_issMax[4]; |
unsigned char h_issExtMax[4]; |
unsigned char h_ifdMax[4]; |
unsigned char h_crfd[4]; |
unsigned char h_iextMax[4]; |
unsigned char h_cbLine[8]; |
unsigned char h_cbLineOffset[8]; |
unsigned char h_cbDnOffset[8]; |
unsigned char h_cbPdOffset[8]; |
unsigned char h_cbSymOffset[8]; |
unsigned char h_cbOptOffset[8]; |
unsigned char h_cbAuxOffset[8]; |
unsigned char h_cbSsOffset[8]; |
unsigned char h_cbSsExtOffset[8]; |
unsigned char h_cbFdOffset[8]; |
unsigned char h_cbRfdOffset[8]; |
unsigned char h_cbExtOffset[8]; |
}; |
/* File descriptor external record */ |
struct fdr_ext |
{ |
unsigned char f_adr[8]; |
unsigned char f_cbLineOffset[8]; |
unsigned char f_cbLine[8]; |
unsigned char f_cbSs[8]; |
unsigned char f_rss[4]; |
unsigned char f_issBase[4]; |
unsigned char f_isymBase[4]; |
unsigned char f_csym[4]; |
unsigned char f_ilineBase[4]; |
unsigned char f_cline[4]; |
unsigned char f_ioptBase[4]; |
unsigned char f_copt[4]; |
unsigned char f_ipdFirst[4]; |
unsigned char f_cpd[4]; |
unsigned char f_iauxBase[4]; |
unsigned char f_caux[4]; |
unsigned char f_rfdBase[4]; |
unsigned char f_crfd[4]; |
unsigned char f_bits1[1]; |
unsigned char f_bits2[3]; |
unsigned char f_padding[4]; |
}; |
#define FDR_BITS1_LANG_BIG 0xF8 |
#define FDR_BITS1_LANG_SH_BIG 3 |
#define FDR_BITS1_LANG_LITTLE 0x1F |
#define FDR_BITS1_LANG_SH_LITTLE 0 |
#define FDR_BITS1_FMERGE_BIG 0x04 |
#define FDR_BITS1_FMERGE_LITTLE 0x20 |
#define FDR_BITS1_FREADIN_BIG 0x02 |
#define FDR_BITS1_FREADIN_LITTLE 0x40 |
#define FDR_BITS1_FBIGENDIAN_BIG 0x01 |
#define FDR_BITS1_FBIGENDIAN_LITTLE 0x80 |
#define FDR_BITS2_GLEVEL_BIG 0xC0 |
#define FDR_BITS2_GLEVEL_SH_BIG 6 |
#define FDR_BITS2_GLEVEL_LITTLE 0x03 |
#define FDR_BITS2_GLEVEL_SH_LITTLE 0 |
/* We ignore the `reserved' field in bits2. */ |
/* Procedure descriptor external record */ |
struct pdr_ext { |
unsigned char p_adr[8]; |
unsigned char p_cbLineOffset[8]; |
unsigned char p_isym[4]; |
unsigned char p_iline[4]; |
unsigned char p_regmask[4]; |
unsigned char p_regoffset[4]; |
unsigned char p_iopt[4]; |
unsigned char p_fregmask[4]; |
unsigned char p_fregoffset[4]; |
unsigned char p_frameoffset[4]; |
unsigned char p_lnLow[4]; |
unsigned char p_lnHigh[4]; |
unsigned char p_gp_prologue[1]; |
unsigned char p_bits1[1]; |
unsigned char p_bits2[1]; |
unsigned char p_localoff[1]; |
unsigned char p_framereg[2]; |
unsigned char p_pcreg[2]; |
}; |
#define PDR_BITS1_GP_USED_BIG 0x80 |
#define PDR_BITS1_REG_FRAME_BIG 0x40 |
#define PDR_BITS1_PROF_BIG 0x20 |
#define PDR_BITS1_RESERVED_BIG 0x1f |
#define PDR_BITS1_RESERVED_SH_LEFT_BIG 8 |
#define PDR_BITS2_RESERVED_BIG 0xff |
#define PDR_BITS2_RESERVED_SH_BIG 0 |
#define PDR_BITS1_GP_USED_LITTLE 0x01 |
#define PDR_BITS1_REG_FRAME_LITTLE 0x02 |
#define PDR_BITS1_PROF_LITTLE 0x04 |
#define PDR_BITS1_RESERVED_LITTLE 0xf8 |
#define PDR_BITS1_RESERVED_SH_LITTLE 3 |
#define PDR_BITS2_RESERVED_LITTLE 0xff |
#define PDR_BITS2_RESERVED_SH_LEFT_LITTLE 5 |
/* Line numbers */ |
struct line_ext { |
unsigned char l_line[4]; |
}; |
/* Symbol external record */ |
struct sym_ext { |
unsigned char s_value[8]; |
unsigned char s_iss[4]; |
unsigned char s_bits1[1]; |
unsigned char s_bits2[1]; |
unsigned char s_bits3[1]; |
unsigned char s_bits4[1]; |
}; |
#define SYM_BITS1_ST_BIG 0xFC |
#define SYM_BITS1_ST_SH_BIG 2 |
#define SYM_BITS1_ST_LITTLE 0x3F |
#define SYM_BITS1_ST_SH_LITTLE 0 |
#define SYM_BITS1_SC_BIG 0x03 |
#define SYM_BITS1_SC_SH_LEFT_BIG 3 |
#define SYM_BITS1_SC_LITTLE 0xC0 |
#define SYM_BITS1_SC_SH_LITTLE 6 |
#define SYM_BITS2_SC_BIG 0xE0 |
#define SYM_BITS2_SC_SH_BIG 5 |
#define SYM_BITS2_SC_LITTLE 0x07 |
#define SYM_BITS2_SC_SH_LEFT_LITTLE 2 |
#define SYM_BITS2_RESERVED_BIG 0x10 |
#define SYM_BITS2_RESERVED_LITTLE 0x08 |
#define SYM_BITS2_INDEX_BIG 0x0F |
#define SYM_BITS2_INDEX_SH_LEFT_BIG 16 |
#define SYM_BITS2_INDEX_LITTLE 0xF0 |
#define SYM_BITS2_INDEX_SH_LITTLE 4 |
#define SYM_BITS3_INDEX_SH_LEFT_BIG 8 |
#define SYM_BITS3_INDEX_SH_LEFT_LITTLE 4 |
#define SYM_BITS4_INDEX_SH_LEFT_BIG 0 |
#define SYM_BITS4_INDEX_SH_LEFT_LITTLE 12 |
/* External symbol external record */ |
struct ext_ext { |
struct sym_ext es_asym; |
unsigned char es_bits1[1]; |
unsigned char es_bits2[3]; |
unsigned char es_ifd[4]; |
}; |
#define EXT_BITS1_JMPTBL_BIG 0x80 |
#define EXT_BITS1_JMPTBL_LITTLE 0x01 |
#define EXT_BITS1_COBOL_MAIN_BIG 0x40 |
#define EXT_BITS1_COBOL_MAIN_LITTLE 0x02 |
#define EXT_BITS1_WEAKEXT_BIG 0x20 |
#define EXT_BITS1_WEAKEXT_LITTLE 0x04 |
/* Dense numbers external record */ |
struct dnr_ext { |
unsigned char d_rfd[4]; |
unsigned char d_index[4]; |
}; |
/* Relative file descriptor */ |
struct rfd_ext { |
unsigned char rfd[4]; |
}; |
/* Optimizer symbol external record */ |
struct opt_ext { |
unsigned char o_bits1[1]; |
unsigned char o_bits2[1]; |
unsigned char o_bits3[1]; |
unsigned char o_bits4[1]; |
struct rndx_ext o_rndx; |
unsigned char o_offset[4]; |
}; |
#define OPT_BITS2_VALUE_SH_LEFT_BIG 16 |
#define OPT_BITS2_VALUE_SH_LEFT_LITTLE 0 |
#define OPT_BITS3_VALUE_SH_LEFT_BIG 8 |
#define OPT_BITS3_VALUE_SH_LEFT_LITTLE 8 |
#define OPT_BITS4_VALUE_SH_LEFT_BIG 0 |
#define OPT_BITS4_VALUE_SH_LEFT_LITTLE 16 |
/contrib/toolchain/binutils/include/coff/apollo.h |
---|
0,0 → 1,125 |
/* coff information for Apollo M68K |
Copyright 2001, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#define DO_NOT_DEFINE_AOUTHDR |
#define L_LNNO_SIZE 2 |
#include "coff/external.h" |
/* Motorola 68000/68008/68010/68020 */ |
#define MC68MAGIC 0520 |
#define MC68KWRMAGIC 0520 /* writeable text segments */ |
#define MC68TVMAGIC 0521 |
#define MC68KROMAGIC 0521 /* readonly shareable text segments */ |
#define MC68KPGMAGIC 0522 /* demand paged text segments */ |
#define M68MAGIC 0210 |
#define M68TVMAGIC 0211 |
/* Apollo 68000-based machines have a different magic number. This comes |
* from /usr/include/apollo/filehdr.h |
*/ |
#define APOLLOM68KMAGIC 0627 |
#define OMAGIC M68MAGIC |
#define M68KBADMAG(x) (((x).f_magic!=MC68MAGIC) && ((x).f_magic!=MC68KWRMAGIC) && ((x).f_magic!=MC68TVMAGIC) && \ |
((x).f_magic!=MC68KROMAGIC) && ((x).f_magic!=MC68KPGMAGIC) && ((x).f_magic!=M68MAGIC) && ((x).f_magic!=M68TVMAGIC) && \ |
((x).f_magic!=APOLLOM68KMAGIC) ) |
/********************** AOUT "OPTIONAL HEADER" **********************/ |
typedef struct |
{ |
char magic[2]; /* type of file */ |
char vstamp[2]; /* version stamp */ |
char tsize[4]; /* text size in bytes, padded to FW bdry*/ |
char dsize[4]; /* initialized data " " */ |
char bsize[4]; /* uninitialized data " " */ |
char entry[4]; /* entry pt. */ |
char text_start[4]; /* base of text used for this file */ |
char data_start[4]; /* base of data used for this file */ |
char o_sri[4]; /* Apollo specific - .sri data pointer */ |
char o_inlib[4]; /* Apollo specific - .inlib data pointer */ |
char vid[8]; /* Apollo specific - 64 bit version ID */ |
} |
AOUTHDR; |
#define APOLLO_COFF_VERSION_NUMBER 1 /* the value of the aouthdr magic */ |
#define AOUTHDRSZ 44 |
#define AOUTSZ 44 |
/* Apollo allowa for larger section names by allowing |
them to be in the string table. */ |
/* If s_zeores is all zeroes, s_offset gives the real |
location of the name in the string table. */ |
#define s_zeroes section_name.s_name |
#define s_offset (section_name.s_name+4) |
/* More names of "special" sections. */ |
#define _TV ".tv" |
#define _INIT ".init" |
#define _FINI ".fini" |
#define _LINES ".lines" |
#define _BLOCKS ".blocks" |
#define _SRI ".sri" /* Static Resource Information (systype, |
et al.) */ |
#define _MIR ".mir" /* Module Information Records */ |
#define _APTV ".aptv" /* Apollo-style transfer vectors. */ |
#define _INLIB ".inlib" /* Shared Library information */ |
#define _RWDI ".rwdi" /* Read/write data initialization directives for |
compressed sections */ |
#define _UNWIND ".unwind" /* Stack unwind information */ |
/********************** RELOCATION DIRECTIVES **********************/ |
struct external_reloc |
{ |
char r_vaddr[4]; |
char r_symndx[4]; |
char r_type[2]; |
#ifdef M68K_COFF_OFFSET |
char r_offset[4]; |
#endif |
}; |
#define RELOC struct external_reloc |
#ifdef M68K_COFF_OFFSET |
#define RELSZ 14 |
#else |
#define RELSZ 10 |
#endif |
/* Apollo specific STYP flags */ |
#define STYP_RELOCATED_NOT_LOADED 0x00010000 /* Section is relocated normally during linking, but need |
not be loaded during program execution */ |
#define STYP_DEBUG 0x00020000 /* debug section */ |
#define STYP_OVERLAY 0x00040000 /* Section is overlayed */ |
#define STYP_INSTRUCTION 0x00200000 /* Section contains executable code */ |
#define STYP_ZERO 0x00800000 /* Section is initialized to zero */ |
#define STYP_INSTALLED 0x02000000 /* Section should be installable in KGT */ |
#define STYP_LOOK_INSTALLED 0x04000000 /* Look for section in KGT */ |
#define STYP_SECALIGN1 0x08000000 /* Specially aligned section */ |
#define STYP_SECALIGN2 0x10000000 /* " " " */ |
#define STYP_COMPRESSED 0x20000000 /* No section data per se (s_scnptr = 0), but there are |
initialization directives for it in .rwdi section |
(used in conjunction with STYP_BSS) */ |
/contrib/toolchain/binutils/include/coff/arm.h |
---|
0,0 → 1,130 |
/* ARM COFF support for BFD. |
Copyright 1998, 1999, 2000, 2002, 2003, 2010, 2013 |
Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#define COFFARM 1 |
#define L_LNNO_SIZE 2 |
#define INCLUDE_COMDAT_FIELDS_IN_AUXENT |
#include "coff/external.h" |
/* Bits for f_flags: |
F_RELFLG relocation info stripped from file |
F_EXEC file is executable (no unresolved external references) |
F_LNNO line numbers stripped from file |
F_LSYMS local symbols stripped from file |
F_INTERWORK file supports switching between ARM and Thumb instruction sets |
F_INTERWORK_SET the F_INTERWORK bit is valid |
F_APCS_FLOAT code passes float arguments in float registers |
F_PIC code is reentrant/position-independent |
F_AR32WR file has byte ordering of an AR32WR machine (e.g. vax) |
F_APCS_26 file uses 26 bit ARM Procedure Calling Standard |
F_APCS_SET the F_APCS_26, F_APCS_FLOAT and F_PIC bits have been initialised |
F_SOFT_FLOAT code does not use floating point instructions. */ |
#define F_RELFLG (0x0001) |
#define F_EXEC (0x0002) |
#define F_LNNO (0x0004) |
#define F_LSYMS (0x0008) |
#define F_INTERWORK (0x0010) |
#define F_INTERWORK_SET (0x0020) |
#define F_APCS_FLOAT (0x0040) |
#undef F_AR16WR |
#define F_PIC (0x0080) |
#define F_AR32WR (0x0100) |
#define F_APCS_26 (0x0400) |
#define F_APCS_SET (0x0800) |
#define F_SOFT_FLOAT (0x2000) |
#define F_VFP_FLOAT (0x4000) |
/* Bits stored in flags field of the internal_f structure */ |
#define F_INTERWORK (0x0010) |
#define F_APCS_FLOAT (0x0040) |
#define F_PIC (0x0080) |
#define F_APCS26 (0x1000) |
#define F_ARM_ARCHITECTURE_MASK (0x4000+0x0800+0x0400) |
#define F_ARM_2 (0x0400) |
#define F_ARM_2a (0x0800) |
#define F_ARM_3 (0x0c00) |
#define F_ARM_3M (0x4000) |
#define F_ARM_4 (0x4400) |
#define F_ARM_4T (0x4800) |
#define F_ARM_5 (0x4c00) |
/* |
ARMMAGIC ought to encoded the procesor type, |
but it is too late to change it now, instead |
the flags field of the internal_f structure |
is used as shown above. |
XXX - NC 5/6/97. */ |
#define ARMMAGIC 0xa00 /* I just made this up */ |
#define ARMBADMAG(x) (((x).f_magic != ARMMAGIC)) |
#define ARMPEMAGIC 0x1c0 |
#define THUMBPEMAGIC 0x1c2 |
#define ARMV7PEMAGIC 0x1c4 |
#undef ARMBADMAG |
#define ARMBADMAG(x) (((x).f_magic != ARMMAGIC) && ((x).f_magic != ARMPEMAGIC) && ((x).f_magic != THUMBPEMAGIC) && ((x).f_magic != ARMV7PEMAGIC)) |
#define OMAGIC 0404 /* object files, eg as output */ |
#define ZMAGIC 0413 /* demand load format, eg normal ld output */ |
#define STMAGIC 0401 /* target shlib */ |
#define SHMAGIC 0443 /* host shlib */ |
/* define some NT default values */ |
/* #define NT_IMAGE_BASE 0x400000 moved to internal.h */ |
#define NT_SECTION_ALIGNMENT 0x1000 |
#define NT_FILE_ALIGNMENT 0x200 |
#define NT_DEF_RESERVE 0x100000 |
#define NT_DEF_COMMIT 0x1000 |
/* We use the .rdata section to hold read only data. */ |
#define _LIT ".rdata" |
/********************** RELOCATION DIRECTIVES **********************/ |
#ifdef ARM_WINCE |
struct external_reloc |
{ |
char r_vaddr[4]; |
char r_symndx[4]; |
char r_type[2]; |
}; |
#define RELOC struct external_reloc |
#define RELSZ 10 |
#else |
struct external_reloc |
{ |
char r_vaddr[4]; |
char r_symndx[4]; |
char r_type[2]; |
char r_offset[4]; |
}; |
#define RELOC struct external_reloc |
#define RELSZ 14 |
#endif |
#define ARM_NOTE_SECTION ".note" |
/contrib/toolchain/binutils/include/coff/aux-coff.h |
---|
0,0 → 1,49 |
/* Modifications of internal.h and m68k.h needed by A/UX |
Copyright 2001, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. |
Suggested by Ian Lance Taylor <ian@cygnus.com> */ |
#ifndef GNU_COFF_AUX_H |
#define GNU_COFF_AUX_H 1 |
#include "coff/internal.h" |
#include "coff/m68k.h" |
/* Section contains 64-byte padded pathnames of shared libraries */ |
#undef STYP_LIB |
#define STYP_LIB 0x200 |
/* Section contains shared library initialization code */ |
#undef STYP_INIT |
#define STYP_INIT 0x400 |
/* Section contains .ident information */ |
#undef STYP_IDENT |
#define STYP_IDENT 0x800 |
/* Section types used by bfd and gas not defined (directly) by A/UX */ |
#undef STYP_OVER |
#define STYP_OVER 0 |
#undef STYP_INFO |
#define STYP_INFO STYP_IDENT |
/* Traditional name of the section tagged with STYP_LIB */ |
#define _LIB ".lib" |
#endif /* GNU_COFF_AUX_H */ |
/contrib/toolchain/binutils/include/coff/ecoff.h |
---|
0,0 → 1,411 |
/* Generic ECOFF support. |
This does not include symbol information, found in sym.h and |
symconst.h. |
Copyright 2001, 2002, 2003, 2004, 2005, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef ECOFF_H |
#define ECOFF_H |
/* Mips magic numbers used in filehdr. MIPS_MAGIC_LITTLE is used on |
little endian machines. MIPS_MAGIC_BIG is used on big endian |
machines. Where is MIPS_MAGIC_1 from? */ |
#define MIPS_MAGIC_1 0x0180 |
#define MIPS_MAGIC_LITTLE 0x0162 |
#define MIPS_MAGIC_BIG 0x0160 |
/* These are the magic numbers used for MIPS code compiled at ISA |
level 2. */ |
#define MIPS_MAGIC_LITTLE2 0x0166 |
#define MIPS_MAGIC_BIG2 0x0163 |
/* These are the magic numbers used for MIPS code compiled at ISA |
level 3. */ |
#define MIPS_MAGIC_LITTLE3 0x142 |
#define MIPS_MAGIC_BIG3 0x140 |
/* Alpha magic numbers used in filehdr. */ |
#define ALPHA_MAGIC 0x183 |
#define ALPHA_MAGIC_BSD 0x185 |
/* A compressed version of an ALPHA_MAGIC file created by DEC's tools. */ |
#define ALPHA_MAGIC_COMPRESSED 0x188 |
/* Magic numbers used in a.out header. */ |
#define ECOFF_AOUT_OMAGIC 0407 /* not demand paged (ld -N). */ |
#define ECOFF_AOUT_ZMAGIC 0413 /* demand load format, eg normal ld output */ |
/* Names of special sections. */ |
#define _TEXT ".text" |
#define _DATA ".data" |
#define _BSS ".bss" |
#define _RDATA ".rdata" |
#define _SDATA ".sdata" |
#define _SBSS ".sbss" |
#define _LITA ".lita" |
#define _LIT4 ".lit4" |
#define _LIT8 ".lit8" |
#define _LIB ".lib" |
#define _INIT ".init" |
#define _FINI ".fini" |
#define _PDATA ".pdata" |
#define _XDATA ".xdata" |
#define _GOT ".got" |
#define _HASH ".hash" |
#define _DYNSYM ".dynsym" |
#define _DYNSTR ".dynstr" |
#define _RELDYN ".rel.dyn" |
#define _CONFLIC ".conflic" |
#define _COMMENT ".comment" |
#define _LIBLIST ".liblist" |
#define _DYNAMIC ".dynamic" |
#define _RCONST ".rconst" |
/* ECOFF uses some additional section flags. */ |
#define STYP_RDATA 0x100 |
#define STYP_SDATA 0x200 |
#define STYP_SBSS 0x400 |
#define STYP_GOT 0x1000 |
#define STYP_DYNAMIC 0x2000 |
#define STYP_DYNSYM 0x4000 |
#define STYP_RELDYN 0x8000 |
#define STYP_DYNSTR 0x10000 |
#define STYP_HASH 0x20000 |
#define STYP_LIBLIST 0x40000 |
#define STYP_CONFLIC 0x100000 |
#define STYP_ECOFF_FINI 0x1000000 |
#define STYP_EXTENDESC 0x2000000 /* 0x02FFF000 bits => scn type, rest clr */ |
#define STYP_LITA 0x4000000 |
#define STYP_LIT8 0x8000000 |
#define STYP_LIT4 0x10000000 |
#define STYP_ECOFF_LIB 0x40000000 |
#define STYP_ECOFF_INIT 0x80000000 |
#define STYP_OTHER_LOAD (STYP_ECOFF_INIT | STYP_ECOFF_FINI) |
/* extended section types */ |
#define STYP_COMMENT 0x2100000 |
#define STYP_RCONST 0x2200000 |
#define STYP_XDATA 0x2400000 |
#define STYP_PDATA 0x2800000 |
/* The linker needs a section to hold small common variables while |
linking. There is no convenient way to create it when the linker |
needs it, so we always create one for each BFD. We then avoid |
writing it out. */ |
#define SCOMMON ".scommon" |
/* If the extern bit in a reloc is 1, then r_symndx is an index into |
the external symbol table. If the extern bit is 0, then r_symndx |
indicates a section, and is one of the following values. */ |
#define RELOC_SECTION_NONE 0 |
#define RELOC_SECTION_TEXT 1 |
#define RELOC_SECTION_RDATA 2 |
#define RELOC_SECTION_DATA 3 |
#define RELOC_SECTION_SDATA 4 |
#define RELOC_SECTION_SBSS 5 |
#define RELOC_SECTION_BSS 6 |
#define RELOC_SECTION_INIT 7 |
#define RELOC_SECTION_LIT8 8 |
#define RELOC_SECTION_LIT4 9 |
#define RELOC_SECTION_XDATA 10 |
#define RELOC_SECTION_PDATA 11 |
#define RELOC_SECTION_FINI 12 |
#define RELOC_SECTION_LITA 13 |
#define RELOC_SECTION_ABS 14 |
#define RELOC_SECTION_RCONST 15 |
#define NUM_RELOC_SECTIONS 16 |
/********************** STABS **********************/ |
/* gcc uses mips-tfile to output type information in special stabs |
entries. These must match the corresponding definition in |
gcc/config/mips.h. At some point, these should probably go into a |
shared include file, but currently gcc and gdb do not share any |
directories. */ |
#define CODE_MASK 0x8F300 |
#define ECOFF_IS_STAB(sym) (((sym)->index & 0xFFF00) == CODE_MASK) |
#define ECOFF_MARK_STAB(code) ((code)+CODE_MASK) |
#define ECOFF_UNMARK_STAB(code) ((code)-CODE_MASK) |
#define STABS_SYMBOL "@stabs" |
/********************** COFF **********************/ |
/* gcc also uses mips-tfile to output COFF debugging information. |
These are the values it uses when outputting the .type directive. |
These should also be in a shared include file. */ |
#define N_BTMASK (017) |
#define N_TMASK (060) |
#define N_BTSHFT (4) |
#define N_TSHIFT (2) |
/********************** AUX **********************/ |
/* The auxiliary type information is the same on all known ECOFF |
targets. I can't see any reason that it would ever change, so I am |
going to gamble and define the external structures here, in the |
target independent ECOFF header file. The internal forms are |
defined in coff/sym.h, which was originally donated by MIPS |
Computer Systems. */ |
/* Type information external record */ |
struct tir_ext { |
unsigned char t_bits1[1]; |
unsigned char t_tq45[1]; |
unsigned char t_tq01[1]; |
unsigned char t_tq23[1]; |
}; |
#define TIR_BITS1_FBITFIELD_BIG ((unsigned int) 0x80) |
#define TIR_BITS1_FBITFIELD_LITTLE ((unsigned int) 0x01) |
#define TIR_BITS1_CONTINUED_BIG ((unsigned int) 0x40) |
#define TIR_BITS1_CONTINUED_LITTLE ((unsigned int) 0x02) |
#define TIR_BITS1_BT_BIG ((unsigned int) 0x3F) |
#define TIR_BITS1_BT_SH_BIG 0 |
#define TIR_BITS1_BT_LITTLE ((unsigned int) 0xFC) |
#define TIR_BITS1_BT_SH_LITTLE 2 |
#define TIR_BITS_TQ4_BIG ((unsigned int) 0xF0) |
#define TIR_BITS_TQ4_SH_BIG 4 |
#define TIR_BITS_TQ5_BIG ((unsigned int) 0x0F) |
#define TIR_BITS_TQ5_SH_BIG 0 |
#define TIR_BITS_TQ4_LITTLE ((unsigned int) 0x0F) |
#define TIR_BITS_TQ4_SH_LITTLE 0 |
#define TIR_BITS_TQ5_LITTLE ((unsigned int) 0xF0) |
#define TIR_BITS_TQ5_SH_LITTLE 4 |
#define TIR_BITS_TQ0_BIG ((unsigned int) 0xF0) |
#define TIR_BITS_TQ0_SH_BIG 4 |
#define TIR_BITS_TQ1_BIG ((unsigned int) 0x0F) |
#define TIR_BITS_TQ1_SH_BIG 0 |
#define TIR_BITS_TQ0_LITTLE ((unsigned int) 0x0F) |
#define TIR_BITS_TQ0_SH_LITTLE 0 |
#define TIR_BITS_TQ1_LITTLE ((unsigned int) 0xF0) |
#define TIR_BITS_TQ1_SH_LITTLE 4 |
#define TIR_BITS_TQ2_BIG ((unsigned int) 0xF0) |
#define TIR_BITS_TQ2_SH_BIG 4 |
#define TIR_BITS_TQ3_BIG ((unsigned int) 0x0F) |
#define TIR_BITS_TQ3_SH_BIG 0 |
#define TIR_BITS_TQ2_LITTLE ((unsigned int) 0x0F) |
#define TIR_BITS_TQ2_SH_LITTLE 0 |
#define TIR_BITS_TQ3_LITTLE ((unsigned int) 0xF0) |
#define TIR_BITS_TQ3_SH_LITTLE 4 |
/* Relative symbol external record */ |
struct rndx_ext { |
unsigned char r_bits[4]; |
}; |
#define RNDX_BITS0_RFD_SH_LEFT_BIG 4 |
#define RNDX_BITS1_RFD_BIG ((unsigned int) 0xF0) |
#define RNDX_BITS1_RFD_SH_BIG 4 |
#define RNDX_BITS0_RFD_SH_LEFT_LITTLE 0 |
#define RNDX_BITS1_RFD_LITTLE ((unsigned int) 0x0F) |
#define RNDX_BITS1_RFD_SH_LEFT_LITTLE 8 |
#define RNDX_BITS1_INDEX_BIG ((unsigned int) 0x0F) |
#define RNDX_BITS1_INDEX_SH_LEFT_BIG 16 |
#define RNDX_BITS2_INDEX_SH_LEFT_BIG 8 |
#define RNDX_BITS3_INDEX_SH_LEFT_BIG 0 |
#define RNDX_BITS1_INDEX_LITTLE ((unsigned int) 0xF0) |
#define RNDX_BITS1_INDEX_SH_LITTLE 4 |
#define RNDX_BITS2_INDEX_SH_LEFT_LITTLE 4 |
#define RNDX_BITS3_INDEX_SH_LEFT_LITTLE 12 |
/* Auxiliary symbol information external record */ |
union aux_ext { |
struct tir_ext a_ti; |
struct rndx_ext a_rndx; |
unsigned char a_dnLow[4]; |
unsigned char a_dnHigh[4]; |
unsigned char a_isym[4]; |
unsigned char a_iss[4]; |
unsigned char a_width[4]; |
unsigned char a_count[4]; |
}; |
#define AUX_GET_ANY(bigend, ax, field) \ |
((bigend) ? bfd_getb32 ((ax)->field) : bfd_getl32 ((ax)->field)) |
#define AUX_GET_DNLOW(bigend, ax) AUX_GET_ANY ((bigend), (ax), a_dnLow) |
#define AUX_GET_DNHIGH(bigend, ax) AUX_GET_ANY ((bigend), (ax), a_dnHigh) |
#define AUX_GET_ISYM(bigend, ax) AUX_GET_ANY ((bigend), (ax), a_isym) |
#define AUX_GET_ISS(bigend, ax) AUX_GET_ANY ((bigend), (ax), a_iss) |
#define AUX_GET_WIDTH(bigend, ax) AUX_GET_ANY ((bigend), (ax), a_width) |
#define AUX_GET_COUNT(bigend, ax) AUX_GET_ANY ((bigend), (ax), a_count) |
#define AUX_PUT_ANY(bigend, val, ax, field) \ |
((bigend) \ |
? (bfd_putb32 ((bfd_vma) (val), (ax)->field), 0) \ |
: (bfd_putl32 ((bfd_vma) (val), (ax)->field), 0)) |
#define AUX_PUT_DNLOW(bigend, val, ax) \ |
AUX_PUT_ANY ((bigend), (val), (ax), a_dnLow) |
#define AUX_PUT_DNHIGH(bigend, val, ax) \ |
AUX_PUT_ANY ((bigend), (val), (ax), a_dnHigh) |
#define AUX_PUT_ISYM(bigend, val, ax) \ |
AUX_PUT_ANY ((bigend), (val), (ax), a_isym) |
#define AUX_PUT_ISS(bigend, val, ax) \ |
AUX_PUT_ANY ((bigend), (val), (ax), a_iss) |
#define AUX_PUT_WIDTH(bigend, val, ax) \ |
AUX_PUT_ANY ((bigend), (val), (ax), a_width) |
#define AUX_PUT_COUNT(bigend, val, ax) \ |
AUX_PUT_ANY ((bigend), (val), (ax), a_count) |
/********************** SYMBOLS **********************/ |
/* For efficiency, gdb deals directly with the unswapped symbolic |
information (that way it only takes the time to swap information |
that it really needs to read). gdb originally retrieved the |
information directly from the BFD backend information, but that |
strategy, besides being sort of ugly, does not work for MIPS ELF, |
which also uses ECOFF debugging information. This structure holds |
pointers to the (mostly) unswapped symbolic information. */ |
struct ecoff_debug_info |
{ |
/* The swapped ECOFF symbolic header. */ |
HDRR symbolic_header; |
/* Pointers to the unswapped symbolic information. Note that the |
pointers to external structures point to different sorts of |
information on different ECOFF targets. The ecoff_debug_swap |
structure provides the sizes of the structures and the functions |
needed to swap the information in and out. These pointers are |
all pointers to arrays, not single structures. They will be NULL |
if there are no instances of the relevant structure. These |
fields are also used by the assembler to output ECOFF debugging |
information. */ |
unsigned char *line; |
void *external_dnr; /* struct dnr_ext */ |
void *external_pdr; /* struct pdr_ext */ |
void *external_sym; /* struct sym_ext */ |
void *external_opt; /* struct opt_ext */ |
union aux_ext *external_aux; |
char *ss; |
char *ssext; |
void *external_fdr; /* struct fdr_ext */ |
void *external_rfd; /* struct rfd_ext */ |
void *external_ext; /* struct ext_ext */ |
/* These fields are used when linking. They may disappear at some |
point. */ |
char *ssext_end; |
void *external_ext_end; |
/* When linking, this field holds a mapping from the input FDR |
numbers to the output numbers, and is used when writing out the |
external symbols. It is NULL if no mapping is required. */ |
RFDT *ifdmap; |
/* The swapped FDR information. Currently this is never NULL, but |
code using this structure should probably double-check in case |
this changes in the future. This is a pointer to an array, not a |
single structure. */ |
FDR *fdr; |
}; |
/* These structures are used by the ECOFF find_nearest_line function. */ |
struct ecoff_fdrtab_entry |
{ |
/* Base address in .text of this FDR. */ |
bfd_vma base_addr; |
FDR *fdr; |
}; |
struct ecoff_find_line |
{ |
/* Allocated memory to hold function and file names. */ |
char *find_buffer; |
/* FDR table, sorted by address: */ |
long fdrtab_len; |
struct ecoff_fdrtab_entry *fdrtab; |
/* Cache entry for most recently found line information. The sect |
field is NULL if this cache does not contain valid information. */ |
struct |
{ |
asection *sect; |
bfd_vma start; |
bfd_vma stop; |
const char *filename; |
const char *functionname; |
unsigned int line_num; |
} cache; |
}; |
/********************** SWAPPING **********************/ |
/* The generic ECOFF code needs to be able to swap debugging |
information in and out in the specific format used by a particular |
ECOFF implementation. This structure provides the information |
needed to do this. */ |
struct ecoff_debug_swap |
{ |
/* Symbol table magic number. */ |
int sym_magic; |
/* Alignment of debugging information. E.g., 4. */ |
bfd_size_type debug_align; |
/* Sizes of external symbolic information. */ |
bfd_size_type external_hdr_size; |
bfd_size_type external_dnr_size; |
bfd_size_type external_pdr_size; |
bfd_size_type external_sym_size; |
bfd_size_type external_opt_size; |
bfd_size_type external_fdr_size; |
bfd_size_type external_rfd_size; |
bfd_size_type external_ext_size; |
/* Functions to swap in external symbolic data. */ |
void (*swap_hdr_in) (bfd *, void *, HDRR *); |
void (*swap_dnr_in) (bfd *, void *, DNR *); |
void (*swap_pdr_in) (bfd *, void *, PDR *); |
void (*swap_sym_in) (bfd *, void *, SYMR *); |
void (*swap_opt_in) (bfd *, void *, OPTR *); |
void (*swap_fdr_in) (bfd *, void *, FDR *); |
void (*swap_rfd_in) (bfd *, void *, RFDT *); |
void (*swap_ext_in) (bfd *, void *, EXTR *); |
void (*swap_tir_in) (int, const struct tir_ext *, TIR *); |
void (*swap_rndx_in) (int, const struct rndx_ext *, RNDXR *); |
/* Functions to swap out external symbolic data. */ |
void (*swap_hdr_out) (bfd *, const HDRR *, void *); |
void (*swap_dnr_out) (bfd *, const DNR *, void *); |
void (*swap_pdr_out) (bfd *, const PDR *, void *); |
void (*swap_sym_out) (bfd *, const SYMR *, void *); |
void (*swap_opt_out) (bfd *, const OPTR *, void *); |
void (*swap_fdr_out) (bfd *, const FDR *, void *); |
void (*swap_rfd_out) (bfd *, const RFDT *, void *); |
void (*swap_ext_out) (bfd *, const EXTR *, void *); |
void (*swap_tir_out) (int, const TIR *, struct tir_ext *); |
void (*swap_rndx_out) (int, const RNDXR *, struct rndx_ext *); |
/* Function to read symbol data and set up pointers in |
ecoff_debug_info structure. The section argument is used for |
ELF, not straight ECOFF. */ |
bfd_boolean (*read_debug_info) (bfd *, asection *, struct ecoff_debug_info *); |
}; |
#endif /* ! defined (ECOFF_H) */ |
/contrib/toolchain/binutils/include/coff/external.h |
---|
0,0 → 1,269 |
/* external.h -- External COFF structures |
Copyright 2001, 2006, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef COFF_EXTERNAL_H |
#define COFF_EXTERNAL_H |
#ifndef DO_NOT_DEFINE_FILHDR |
/********************** FILE HEADER **********************/ |
struct external_filehdr |
{ |
char f_magic[2]; /* magic number */ |
char f_nscns[2]; /* number of sections */ |
char f_timdat[4]; /* time & date stamp */ |
char f_symptr[4]; /* file pointer to symtab */ |
char f_nsyms[4]; /* number of symtab entries */ |
char f_opthdr[2]; /* sizeof(optional hdr) */ |
char f_flags[2]; /* flags */ |
}; |
#define FILHDR struct external_filehdr |
#define FILHSZ 20 |
#endif |
#ifndef DO_NOT_DEFINE_AOUTHDR |
/********************** AOUT "OPTIONAL HEADER" **********************/ |
typedef struct external_aouthdr |
{ |
char magic[2]; /* type of file */ |
char vstamp[2]; /* version stamp */ |
char tsize[4]; /* text size in bytes, padded to FW bdry*/ |
char dsize[4]; /* initialized data " " */ |
char bsize[4]; /* uninitialized data " " */ |
char entry[4]; /* entry pt. */ |
char text_start[4]; /* base of text used for this file */ |
char data_start[4]; /* base of data used for this file */ |
} ATTRIBUTE_PACKED |
AOUTHDR; |
#define AOUTHDRSZ 28 |
#define AOUTSZ 28 |
typedef struct external_aouthdr64 |
{ |
char magic[2]; /* Type of file. */ |
char vstamp[2]; /* Version stamp. */ |
char tsize[4]; /* Text size in bytes, padded to FW bdry*/ |
char dsize[4]; /* Initialized data " ". */ |
char bsize[4]; /* Uninitialized data " ". */ |
char entry[4]; /* Entry pt. */ |
char text_start[4]; /* Base of text used for this file. */ |
} |
AOUTHDR64; |
#define AOUTHDRSZ64 24 |
#endif /* not DO_NOT_DEFINE_AOUTHDR */ |
#ifndef DO_NOT_DEFINE_SCNHDR |
/********************** SECTION HEADER **********************/ |
struct external_scnhdr |
{ |
char s_name[8]; /* section name */ |
char s_paddr[4]; /* physical address, aliased s_nlib */ |
char s_vaddr[4]; /* virtual address */ |
char s_size[4]; /* section size */ |
char s_scnptr[4]; /* file ptr to raw data for section */ |
char s_relptr[4]; /* file ptr to relocation */ |
char s_lnnoptr[4]; /* file ptr to line numbers */ |
char s_nreloc[2]; /* number of relocation entries */ |
char s_nlnno[2]; /* number of line number entries */ |
char s_flags[4]; /* flags */ |
}; |
#define SCNHDR struct external_scnhdr |
#define SCNHSZ 40 |
/* Names of "special" sections. */ |
#define _TEXT ".text" |
#define _DATA ".data" |
#define _BSS ".bss" |
#define _COMMENT ".comment" |
#define _LIB ".lib" |
#endif /* not DO_NOT_DEFINE_SCNHDR */ |
#ifndef DO_NOT_DEFINE_LINENO |
/********************** LINE NUMBERS **********************/ |
#ifndef L_LNNO_SIZE |
#error L_LNNO_SIZE needs to be defined |
#endif |
/* 1 line number entry for every "breakpointable" source line in a section. |
Line numbers are grouped on a per function basis; first entry in a function |
grouping will have l_lnno = 0 and in place of physical address will be the |
symbol table index of the function name. */ |
struct external_lineno |
{ |
union |
{ |
char l_symndx[4]; /* function name symbol index, iff l_lnno == 0*/ |
char l_paddr[4]; /* (physical) address of line number */ |
} l_addr; |
char l_lnno[L_LNNO_SIZE]; /* line number */ |
}; |
#define LINENO struct external_lineno |
#define LINESZ (4 + L_LNNO_SIZE) |
#if L_LNNO_SIZE == 4 |
#define GET_LINENO_LNNO(abfd, ext) H_GET_32 (abfd, (ext->l_lnno)) |
#define PUT_LINENO_LNNO(abfd, val, ext) H_PUT_32 (abfd, val, (ext->l_lnno)) |
#endif |
#if L_LNNO_SIZE == 2 |
#define GET_LINENO_LNNO(abfd, ext) H_GET_16 (abfd, (ext->l_lnno)) |
#define PUT_LINENO_LNNO(abfd, val, ext) H_PUT_16 (abfd, val, (ext->l_lnno)) |
#endif |
#endif /* not DO_NOT_DEFINE_LINENO */ |
#ifndef DO_NOT_DEFINE_SYMENT |
/********************** SYMBOLS **********************/ |
#define E_SYMNMLEN 8 /* # characters in a symbol name */ |
#ifndef E_FILNMLEN |
#define E_FILNMLEN 14 |
#endif |
#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ |
struct external_syment |
{ |
union |
{ |
char e_name[E_SYMNMLEN]; |
struct |
{ |
char e_zeroes[4]; |
char e_offset[4]; |
} e; |
} e; |
char e_value[4]; |
char e_scnum[2]; |
char e_type[2]; |
char e_sclass[1]; |
char e_numaux[1]; |
} ATTRIBUTE_PACKED ; |
#define SYMENT struct external_syment |
#define SYMESZ 18 |
#ifndef N_BTMASK |
#define N_BTMASK 0xf |
#endif |
#ifndef N_TMASK |
#define N_TMASK 0x30 |
#endif |
#ifndef N_BTSHFT |
#define N_BTSHFT 4 |
#endif |
#ifndef N_TSHIFT |
#define N_TSHIFT 2 |
#endif |
#endif /* not DO_NOT_DEFINE_SYMENT */ |
#ifndef DO_NOT_DEFINE_AUXENT |
union external_auxent |
{ |
struct |
{ |
char x_tagndx[4]; /* str, un, or enum tag indx */ |
union |
{ |
struct |
{ |
char x_lnno[2]; /* declaration line number */ |
char x_size[2]; /* str/union/array size */ |
} x_lnsz; |
char x_fsize[4]; /* size of function */ |
} x_misc; |
union |
{ |
struct /* if ISFCN, tag, or .bb */ |
{ |
char x_lnnoptr[4]; /* ptr to fcn line # */ |
char x_endndx[4]; /* entry ndx past block end */ |
} x_fcn; |
struct /* if ISARY, up to 4 dimen. */ |
{ |
char x_dimen[E_DIMNUM][2]; |
} x_ary; |
} x_fcnary; |
char x_tvndx[2]; /* tv index */ |
} x_sym; |
union |
{ |
char x_fname[E_FILNMLEN]; |
struct |
{ |
char x_zeroes[4]; |
char x_offset[4]; |
} x_n; |
} x_file; |
struct |
{ |
char x_scnlen[4]; /* section length */ |
char x_nreloc[2]; /* # relocation entries */ |
char x_nlinno[2]; /* # line numbers */ |
#ifdef INCLUDE_COMDAT_FIELDS_IN_AUXENT |
char x_checksum[4]; /* section COMDAT checksum */ |
char x_associated[2]; /* COMDAT associated section index */ |
char x_comdat[1]; /* COMDAT selection number */ |
#endif |
} x_scn; |
struct |
{ |
char x_tvfill[4]; /* tv fill value */ |
char x_tvlen[2]; /* length of .tv */ |
char x_tvran[2][2]; /* tv range */ |
} x_tv; /* info about .tv section (in auxent of symbol .tv)) */ |
} ATTRIBUTE_PACKED ; |
#define AUXENT union external_auxent |
#define AUXESZ 18 |
#define _ETEXT "etext" |
#endif /* not DO_NOT_DEFINE_AUXENT */ |
#endif /* COFF_EXTERNAL_H */ |
/contrib/toolchain/binutils/include/coff/go32exe.h |
---|
0,0 → 1,36 |
/* COFF information for PC running go32. |
Copyright 2001, 2005, 2009, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
struct external_filehdr_go32_exe |
{ |
char stub[GO32_STUBSIZE]; /* the stub to load the image */ |
/* the standard COFF header */ |
char f_magic[2]; /* magic number */ |
char f_nscns[2]; /* number of sections */ |
char f_timdat[4]; /* time & date stamp */ |
char f_symptr[4]; /* file pointer to symtab */ |
char f_nsyms[4]; /* number of symtab entries */ |
char f_opthdr[2]; /* sizeof(optional hdr) */ |
char f_flags[2]; /* flags */ |
}; |
#undef FILHDR |
#define FILHDR struct external_filehdr_go32_exe |
#undef FILHSZ |
#define FILHSZ GO32_STUBSIZE+20 |
/contrib/toolchain/binutils/include/coff/h8300.h |
---|
0,0 → 1,55 |
/* coff information for Renesas H8/300 and H8/300-H |
Copyright 2001, 2003, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#define L_LNNO_SIZE 4 |
#include "coff/external.h" |
#define H8300MAGIC 0x8300 |
#define H8300HMAGIC 0x8301 |
#define H8300SMAGIC 0x8302 |
#define H8300HNMAGIC 0x8303 |
#define H8300SNMAGIC 0x8304 |
#define H8300BADMAG(x) (((x).f_magic != H8300MAGIC)) |
#define H8300HBADMAG(x) (((x).f_magic != H8300HMAGIC)) |
#define H8300SBADMAG(x) (((x).f_magic != H8300SMAGIC)) |
#define H8300HNBADMAG(x) (((x).f_magic != H8300HNMAGIC)) |
#define H8300SNBADMAG(x) (((x).f_magic != H8300SNMAGIC)) |
/* Relocation directives. */ |
/* The external reloc has an offset field, because some of the reloc |
types on the h8 don't have room in the instruction for the entire |
offset - eg the strange jump and high page addressing modes. */ |
struct external_reloc |
{ |
char r_vaddr[4]; |
char r_symndx[4]; |
char r_offset[4]; |
char r_type[2]; |
char r_stuff[2]; |
}; |
#define RELOC struct external_reloc |
#define RELSZ 16 |
/contrib/toolchain/binutils/include/coff/h8500.h |
---|
0,0 → 1,47 |
/* coff information for Renesas H8/500 |
Copyright 2001, 2003, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#define L_LNNO_SIZE 4 |
#include "coff/external.h" |
#define H8500MAGIC 0x8500 |
#define H8500BADMAG(x) ((0xffff && ((x).f_magic) != H8500MAGIC)) |
/********************** RELOCATION DIRECTIVES **********************/ |
/* The external reloc has an offset field, because some of the reloc |
types on the h8 don't have room in the instruction for the entire |
offset - eg the strange jump and high page addressing modes. */ |
struct external_reloc |
{ |
char r_vaddr[4]; |
char r_symndx[4]; |
char r_offset[4]; |
char r_type[2]; |
char r_stuff[2]; |
}; |
#define RELOC struct external_reloc |
#define RELSZ 16 |
/contrib/toolchain/binutils/include/coff/i386.h |
---|
0,0 → 1,74 |
/* coff information for Intel 386/486. |
Copyright 2001, 2009, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#define L_LNNO_SIZE 2 |
#define INCLUDE_COMDAT_FIELDS_IN_AUXENT |
#include "coff/external.h" |
#define COFF_PAGE_SIZE 0x1000 |
/* Bits for f_flags: |
F_RELFLG Relocation info stripped from file |
F_EXEC File is executable (no unresolved external references) |
F_LNNO Line numbers stripped from file |
F_LSYMS Local symbols stripped from file |
F_AR32WR File has byte ordering of an AR32WR machine (e.g. vax). */ |
#define F_RELFLG (0x0001) |
#define F_EXEC (0x0002) |
#define F_LNNO (0x0004) |
#define F_LSYMS (0x0008) |
#define I386MAGIC 0x14c |
#define I386PTXMAGIC 0x154 |
#define I386AIXMAGIC 0x175 |
/* This is Lynx's all-platform magic number for executables. */ |
#define LYNXCOFFMAGIC 0415 |
#define I386BADMAG(x) ( ((x).f_magic != I386MAGIC) \ |
&& (x).f_magic != I386AIXMAGIC \ |
&& (x).f_magic != I386PTXMAGIC \ |
&& (x).f_magic != LYNXCOFFMAGIC) |
#define OMAGIC 0404 /* Object files, eg as output. */ |
#define ZMAGIC 0413 /* Demand load format, eg normal ld output. */ |
#define STMAGIC 0401 /* Target shlib. */ |
#define SHMAGIC 0443 /* Host shlib. */ |
/* Define some NT default values. */ |
/* #define NT_IMAGE_BASE 0x400000 moved to internal.h */ |
#define NT_SECTION_ALIGNMENT 0x1000 |
#define NT_FILE_ALIGNMENT 0x200 |
#define NT_DEF_RESERVE 0x100000 |
#define NT_DEF_COMMIT 0x1000 |
/* Relocation directives. */ |
struct external_reloc |
{ |
char r_vaddr[4]; |
char r_symndx[4]; |
char r_type[2]; |
}; |
#define RELOC struct external_reloc |
#define RELSZ 10 |
/contrib/toolchain/binutils/include/coff/i860.h |
---|
0,0 → 1,87 |
/* COFF information for the Intel i860. |
Copyright 2001, 2003, 2010, 2011 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* This file was hacked from i386.h [dolan@ssd.intel.com] */ |
#define L_LNNO_SIZE 2 |
#include "coff/external.h" |
/* Bits for f_flags: |
F_RELFLG relocation info stripped from file |
F_EXEC file is executable (no unresolved external references) |
F_LNNO line numbers stripped from file |
F_LSYMS local symbols stripped from file |
F_AR32WR file has byte ordering of an AR32WR machine (e.g. vax). */ |
#define F_RELFLG (0x0001) |
#define F_EXEC (0x0002) |
#define F_LNNO (0x0004) |
#define F_LSYMS (0x0008) |
#define I860MAGIC 0x14d |
#define I860BADMAG(x) ((x).f_magic != I860MAGIC) |
#undef AOUTSZ |
#define AOUTSZ 36 |
/* FIXME: What are the a.out magic numbers? */ |
#define _ETEXT "etext" |
/********************** RELOCATION DIRECTIVES **********************/ |
struct external_reloc |
{ |
char r_vaddr[4]; |
char r_symndx[4]; |
char r_type[2]; |
}; |
#define RELOC struct external_reloc |
#define RELSZ 10 |
/* The relocation directory entry types. |
PAIR : The low half that follows relates to the preceding HIGH[ADJ]. |
HIGH : The high half of a 32-bit constant. |
LOWn : The low half, insn bits 15..(n-1), 2^n-byte aligned. |
SPLITn : The low half, insn bits 20..16 and 10..(n-1), 2^n-byte aligned. |
HIGHADJ: Similar to HIGH, but with adjustment. |
BRADDR : 26-bit branch displacement. |
Note: The Intel assembler manual lists LOW4 as one of the |
relocation types, but it appears to be useless for the i860. |
We will recognize it anyway, just in case it actually appears in |
any object files. */ |
enum { |
COFF860_R_PAIR = 0x1c, |
COFF860_R_HIGH = 0x1e, |
COFF860_R_LOW0 = 0x1f, |
COFF860_R_LOW1 = 0x20, |
COFF860_R_LOW2 = 0x21, |
COFF860_R_LOW3 = 0x22, |
COFF860_R_LOW4 = 0x23, |
COFF860_R_SPLIT0 = 0x24, |
COFF860_R_SPLIT1 = 0x25, |
COFF860_R_SPLIT2 = 0x26, |
COFF860_R_HIGHADJ = 0x27, |
COFF860_R_BRADDR = 0x28 |
}; |
/contrib/toolchain/binutils/include/coff/i960.h |
---|
0,0 → 1,320 |
/* coff information for 80960. Origins: Intel corp, natch. |
Copyright 2001, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* NOTE: Tagentries (cf TAGBITS) are no longer used by the 960 */ |
/********************** FILE HEADER **********************/ |
struct external_filehdr |
{ |
char f_magic[2]; /* magic number */ |
char f_nscns[2]; /* number of sections */ |
char f_timdat[4]; /* time & date stamp */ |
char f_symptr[4]; /* file pointer to symtab */ |
char f_nsyms[4]; /* number of symtab entries */ |
char f_opthdr[2]; /* sizeof(optional hdr) */ |
char f_flags[2]; /* flags */ |
}; |
#define OMAGIC (0407) /* old impure format. data immediately |
follows text. both sections are rw. */ |
#define NMAGIC (0410) /* split i&d, read-only text */ |
/* |
* Intel 80960 (I960) processor flags. |
* F_I960TYPE == mask for processor type field. |
*/ |
#define F_I960TYPE (0xf000) |
#define F_I960CORE (0x1000) |
#define F_I960KB (0x2000) |
#define F_I960SB (0x2000) |
#define F_I960MC (0x3000) |
#define F_I960XA (0x4000) |
#define F_I960CA (0x5000) |
#define F_I960KA (0x6000) |
#define F_I960SA (0x6000) |
#define F_I960JX (0x7000) |
#define F_I960HX (0x8000) |
/** i80960 Magic Numbers |
*/ |
#define I960ROMAGIC (0x160) /* read-only text segments */ |
#define I960RWMAGIC (0x161) /* read-write text segments */ |
#define I960BADMAG(x) (((x).f_magic!=I960ROMAGIC) && ((x).f_magic!=I960RWMAGIC)) |
#define FILHDR struct external_filehdr |
#define FILHSZ 20 |
/********************** AOUT "OPTIONAL HEADER" **********************/ |
typedef struct |
{ |
unsigned long phys_addr; |
unsigned long bitarray; |
} TAGBITS; |
typedef struct |
{ |
char magic[2]; /* type of file */ |
char vstamp[2]; /* version stamp */ |
char tsize[4]; /* text size in bytes, padded to FW bdry*/ |
char dsize[4]; /* initialized data " " */ |
char bsize[4]; /* uninitialized data " " */ |
char entry[4]; /* entry pt. */ |
char text_start[4]; /* base of text used for this file */ |
char data_start[4]; /* base of data used for this file */ |
char tagentries[4]; /* number of tag entries to follow */ |
} |
AOUTHDR; |
/* return a pointer to the tag bits array */ |
#define TAGPTR(aout) ((TAGBITS *) (&(aout.tagentries)+1)) |
/* compute size of a header */ |
/*#define AOUTSZ(aout) (sizeof(AOUTHDR)+(aout.tagentries*sizeof(TAGBITS)))*/ |
#define AOUTSZ 32 |
#define AOUTHDRSZ 32 |
/********************** SECTION HEADER **********************/ |
struct external_scnhdr |
{ |
char s_name[8]; /* section name */ |
char s_paddr[4]; /* physical address, aliased s_nlib */ |
char s_vaddr[4]; /* virtual address */ |
char s_size[4]; /* section size */ |
char s_scnptr[4]; /* file ptr to raw data for section */ |
char s_relptr[4]; /* file ptr to relocation */ |
char s_lnnoptr[4]; /* file ptr to line numbers */ |
char s_nreloc[2]; /* number of relocation entries */ |
char s_nlnno[2]; /* number of line number entries*/ |
char s_flags[4]; /* flags */ |
char s_align[4]; /* section alignment */ |
}; |
#define SCNHDR struct external_scnhdr |
#define SCNHSZ 44 |
/* |
* names of "special" sections |
*/ |
#define _TEXT ".text" |
#define _DATA ".data" |
#define _BSS ".bss" |
/********************** LINE NUMBERS **********************/ |
/* 1 line number entry for every "breakpointable" source line in a section. |
* Line numbers are grouped on a per function basis; first entry in a function |
* grouping will have l_lnno = 0 and in place of physical address will be the |
* symbol table index of the function name. |
*/ |
struct external_lineno |
{ |
union |
{ |
char l_symndx[4]; /* function name symbol index, iff l_lnno == 0*/ |
char l_paddr[4]; /* (physical) address of line number */ |
} l_addr; |
char l_lnno[2]; /* line number */ |
char padding[2]; /* force alignment */ |
}; |
#define LINENO struct external_lineno |
#define LINESZ 8 |
/********************** SYMBOLS **********************/ |
#define E_SYMNMLEN 8 /* # characters in a symbol name */ |
#define E_FILNMLEN 14 /* # characters in a file name */ |
#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ |
struct external_syment |
{ |
union |
{ |
char e_name[E_SYMNMLEN]; |
struct |
{ |
char e_zeroes[4]; |
char e_offset[4]; |
} e; |
} e; |
char e_value[4]; |
char e_scnum[2]; |
char e_flags[2]; |
char e_type[4]; |
char e_sclass[1]; |
char e_numaux[1]; |
char pad2[2]; |
}; |
#define N_BTMASK (0x1f) |
#define N_TMASK (0x60) |
#define N_BTSHFT (5) |
#define N_TSHIFT (2) |
union external_auxent |
{ |
struct |
{ |
char x_tagndx[4]; /* str, un, or enum tag indx */ |
union |
{ |
struct |
{ |
char x_lnno[2]; /* declaration line number */ |
char x_size[2]; /* str/union/array size */ |
} x_lnsz; |
char x_fsize[4]; /* size of function */ |
} x_misc; |
union |
{ |
struct /* if ISFCN, tag, or .bb */ |
{ |
char x_lnnoptr[4]; /* ptr to fcn line # */ |
char x_endndx[4]; /* entry ndx past block end */ |
} x_fcn; |
struct /* if ISARY, up to 4 dimen. */ |
{ |
char x_dimen[E_DIMNUM][2]; |
} x_ary; |
} x_fcnary; |
char x_tvndx[2]; /* tv index */ |
} x_sym; |
union |
{ |
char x_fname[E_FILNMLEN]; |
struct |
{ |
char x_zeroes[4]; |
char x_offset[4]; |
} x_n; |
} x_file; |
struct |
{ |
char x_scnlen[4]; /* section length */ |
char x_nreloc[2]; /* # relocation entries */ |
char x_nlinno[2]; /* # line numbers */ |
} x_scn; |
struct |
{ |
char x_tvfill[4]; /* tv fill value */ |
char x_tvlen[2]; /* length of .tv */ |
char x_tvran[2][2]; /* tv range */ |
} x_tv; /* info about .tv section (in auxent of symbol .tv)) */ |
/****************************************** |
* I960-specific *2nd* aux. entry formats |
******************************************/ |
struct |
{ |
/* This is a very old typo that keeps getting propagated. */ |
#define x_stdindx x_stindx |
char x_stindx[4]; /* sys. table entry */ |
} x_sc; /* system call entry */ |
struct |
{ |
char x_balntry[4]; /* BAL entry point */ |
} x_bal; /* BAL-callable function */ |
struct |
{ |
char x_timestamp[4]; /* time stamp */ |
char x_idstring[20]; /* producer identity string */ |
} x_ident; /* Producer ident info */ |
}; |
#define SYMENT struct external_syment |
#define SYMESZ 24 |
#define AUXENT union external_auxent |
#define AUXESZ 24 |
# define _ETEXT "_etext" |
/********************** RELOCATION DIRECTIVES **********************/ |
struct external_reloc |
{ |
char r_vaddr[4]; |
char r_symndx[4]; |
char r_type[2]; |
char pad[2]; |
}; |
/* r_type values for the i960. */ |
/* The i960 uses R_RELLONG, which is defined in internal.h as 0x11. |
It is an absolute 32 bit relocation. */ |
#define R_IPRMED (0x19) /* 24-bit ip-relative relocation */ |
#define R_OPTCALL (0x1b) /* 32-bit optimizable call (leafproc/sysproc) */ |
#define R_OPTCALLX (0x1c) /* 64-bit optimizable call (leafproc/sysproc) */ |
/* The following relocation types are defined use by relaxing linkers, |
which convert 32 bit calls (which require a 64 bit instruction) |
into 24 bit calls (which require a 32 bit instruction) when |
possible. It will be possible whenever the target of the call is |
within a 24 bit range of the call instruction. |
It is always safe to ignore these relocations. They only serve to |
mark points which the relaxing linker will have to consider. The |
assembler must ensure that the correct code is generated even if |
the relocations are ignored. In particular, this means that the |
R_IPR13 relocation may not appear with an external symbol. */ |
#define R_IPR13 (0x1d) /* 13 bit ip-relative branch */ |
#define R_ALIGN (0x1e) /* alignment marker. This has no |
associated symbol. Instead, the |
r_symndx field indicates the |
require alignment at this point in |
the file. It must be a power of 2. */ |
#define RELOC struct external_reloc |
#define RELSZ 12 |
/contrib/toolchain/binutils/include/coff/ia64.h |
---|
0,0 → 1,89 |
/* coff information for HP/Intel IA-64. |
Copyright 2000, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#define DO_NOT_DEFINE_AOUTHDR |
#define L_LNNO_SIZE 2 |
#define INCLUDE_COMDAT_FIELDS_IN_AUXENT |
#include "coff/external.h" |
#define IA64MAGIC 0x200 |
#define IA64BADMAG(x) (((x).f_magic != IA64MAGIC)) |
/* Bits for f_flags: |
* F_RELFLG relocation info stripped from file |
* F_EXEC file is executable (no unresolved external references) |
* F_LNNO line numbers stripped from file |
* F_LSYMS local symbols stripped from file |
* F_AR32WR file has byte ordering of an AR32WR machine (e.g. vax) |
*/ |
#define F_RELFLG (0x0001) |
#define F_EXEC (0x0002) |
#define F_LNNO (0x0004) |
#define F_LSYMS (0x0008) |
/********************** AOUT "OPTIONAL HEADER" **********************/ |
typedef struct |
{ |
char magic[2]; /* type of file */ |
char vstamp[2]; /* version stamp */ |
char tsize[4]; /* text size in bytes, padded to FW bdry*/ |
char dsize[4]; /* initialized data " " */ |
char bsize[4]; /* uninitialized data " " */ |
char entry[4]; /* entry pt. */ |
char text_start[4]; /* base of text used for this file */ |
#ifndef BFD64 |
char data_start[4]; /* base of data used for this file */ |
#endif |
} |
AOUTHDR; |
#define PE32MAGIC 0x10b /* 32-bit image */ |
#define PE32PMAGIC 0x20b /* 32-bit image inside 64-bit address space */ |
#define PE32PBADMAG(x) (((x).f_magic != PE32PMAGIC)) |
#define AOUTSZ 108 |
#define AOUTHDRSZ 108 |
#define OMAGIC 0404 /* object files, eg as output */ |
#define ZMAGIC 0413 /* demand load format, eg normal ld output */ |
#define STMAGIC 0401 /* target shlib */ |
#define SHMAGIC 0443 /* host shlib */ |
/* define some NT default values */ |
/* #define NT_IMAGE_BASE 0x400000 moved to internal.h */ |
#define NT_SECTION_ALIGNMENT 0x1000 |
#define NT_FILE_ALIGNMENT 0x200 |
#define NT_DEF_RESERVE 0x100000 |
#define NT_DEF_COMMIT 0x1000 |
/********************** RELOCATION DIRECTIVES **********************/ |
struct external_reloc |
{ |
char r_vaddr[4]; |
char r_symndx[4]; |
char r_type[2]; |
}; |
#define RELOC struct external_reloc |
#define RELSZ 10 |
/contrib/toolchain/binutils/include/coff/internal.h |
---|
0,0 → 1,830 |
/* Internal format of COFF object file data structures, for GNU BFD. |
This file is part of BFD, the Binary File Descriptor library. |
Copyright 1999, 2000, 2001, 2002, 2003, 2004. 2005, 2006, 2007, 2009, |
2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef GNU_COFF_INTERNAL_H |
#define GNU_COFF_INTERNAL_H 1 |
/* First, make "signed char" work, even on old compilers. */ |
#ifndef signed |
#ifndef __STDC__ |
#define signed /**/ |
#endif |
#endif |
/********************** FILE HEADER **********************/ |
/* extra stuff in a PE header. */ |
struct internal_extra_pe_filehdr |
{ |
/* DOS header data follows for PE stuff */ |
unsigned short e_magic; /* Magic number, 0x5a4d */ |
unsigned short e_cblp; /* Bytes on last page of file, 0x90 */ |
unsigned short e_cp; /* Pages in file, 0x3 */ |
unsigned short e_crlc; /* Relocations, 0x0 */ |
unsigned short e_cparhdr; /* Size of header in paragraphs, 0x4 */ |
unsigned short e_minalloc; /* Minimum extra paragraphs needed, 0x0 */ |
unsigned short e_maxalloc; /* Maximum extra paragraphs needed, 0xFFFF */ |
unsigned short e_ss; /* Initial (relative) SS value, 0x0 */ |
unsigned short e_sp; /* Initial SP value, 0xb8 */ |
unsigned short e_csum; /* Checksum, 0x0 */ |
unsigned short e_ip; /* Initial IP value, 0x0 */ |
unsigned short e_cs; /* Initial (relative) CS value, 0x0 */ |
unsigned short e_lfarlc; /* File address of relocation table, 0x40 */ |
unsigned short e_ovno; /* Overlay number, 0x0 */ |
unsigned short e_res[4]; /* Reserved words, all 0x0 */ |
unsigned short e_oemid; /* OEM identifier (for e_oeminfo), 0x0 */ |
unsigned short e_oeminfo; /* OEM information; e_oemid specific, 0x0 */ |
unsigned short e_res2[10]; /* Reserved words, all 0x0 */ |
bfd_vma e_lfanew; /* File address of new exe header, 0x80 */ |
unsigned long dos_message[16]; /* text which always follows dos header */ |
bfd_vma nt_signature; /* required NT signature, 0x4550 */ |
}; |
#define GO32_STUBSIZE 2048 |
struct internal_filehdr |
{ |
struct internal_extra_pe_filehdr pe; |
/* coff-stgo32 EXE stub header before BFD tdata has been allocated. |
Its data is kept in INTERNAL_FILEHDR.GO32STUB afterwards. |
F_GO32STUB is set iff go32stub contains a valid data. Artifical headers |
created in BFD have no pre-set go32stub. */ |
char go32stub[GO32_STUBSIZE]; |
/* Standard coff internal info. */ |
unsigned short f_magic; /* magic number */ |
unsigned short f_nscns; /* number of sections */ |
long f_timdat; /* time & date stamp */ |
bfd_vma f_symptr; /* file pointer to symtab */ |
long f_nsyms; /* number of symtab entries */ |
unsigned short f_opthdr; /* sizeof(optional hdr) */ |
unsigned short f_flags; /* flags */ |
unsigned short f_target_id; /* (TI COFF specific) */ |
}; |
/* Bits for f_flags: |
F_RELFLG relocation info stripped from file |
F_EXEC file is executable (no unresolved external references) |
F_LNNO line numbers stripped from file |
F_LSYMS local symbols stripped from file |
F_AR16WR file is 16-bit little-endian |
F_AR32WR file is 32-bit little-endian |
F_AR32W file is 32-bit big-endian |
F_DYNLOAD rs/6000 aix: dynamically loadable w/imports & exports |
F_SHROBJ rs/6000 aix: file is a shared object |
F_DLL PE format DLL |
F_GO32STUB Field go32stub contains valid data. */ |
#define F_RELFLG (0x0001) |
#define F_EXEC (0x0002) |
#define F_LNNO (0x0004) |
#define F_LSYMS (0x0008) |
#define F_AR16WR (0x0080) |
#define F_AR32WR (0x0100) |
#define F_AR32W (0x0200) |
#define F_DYNLOAD (0x1000) |
#define F_SHROBJ (0x2000) |
#define F_DLL (0x2000) |
#define F_GO32STUB (0x4000) |
/* Extra structure which is used in the optional header. */ |
typedef struct _IMAGE_DATA_DIRECTORY |
{ |
bfd_vma VirtualAddress; |
long Size; |
} IMAGE_DATA_DIRECTORY; |
#define PE_EXPORT_TABLE 0 |
#define PE_IMPORT_TABLE 1 |
#define PE_RESOURCE_TABLE 2 |
#define PE_EXCEPTION_TABLE 3 |
#define PE_CERTIFICATE_TABLE 4 |
#define PE_BASE_RELOCATION_TABLE 5 |
#define PE_DEBUG_DATA 6 |
#define PE_ARCHITECTURE 7 |
#define PE_GLOBAL_PTR 8 |
#define PE_TLS_TABLE 9 |
#define PE_LOAD_CONFIG_TABLE 10 |
#define PE_BOUND_IMPORT_TABLE 11 |
#define PE_IMPORT_ADDRESS_TABLE 12 |
#define PE_DELAY_IMPORT_DESCRIPTOR 13 |
#define PE_CLR_RUNTIME_HEADER 14 |
/* DataDirectory[15] is currently reserved, so no define. */ |
#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16 |
/* Default image base for NT. */ |
#define NT_EXE_IMAGE_BASE 0x400000 |
#define NT_DLL_IMAGE_BASE 0x10000000 |
/* Default image base for BeOS. */ |
#define BEOS_EXE_IMAGE_BASE 0x80000000 |
#define BEOS_DLL_IMAGE_BASE 0x10000000 |
/* Extra stuff in a PE aouthdr */ |
#define PE_DEF_SECTION_ALIGNMENT 0x1000 |
#ifndef PE_DEF_FILE_ALIGNMENT |
# define PE_DEF_FILE_ALIGNMENT 0x200 |
#endif |
struct internal_extra_pe_aouthdr |
{ |
/* FIXME: The following entries are in AOUTHDR. But they aren't |
available internally in bfd. We add them here so that objdump |
can dump them. */ |
/* The state of the image file */ |
short Magic; |
/* Linker major version number */ |
char MajorLinkerVersion; |
/* Linker minor version number */ |
char MinorLinkerVersion; |
/* Total size of all code sections */ |
long SizeOfCode; |
/* Total size of all initialized data sections */ |
long SizeOfInitializedData; |
/* Total size of all uninitialized data sections */ |
long SizeOfUninitializedData; |
/* Address of entry point relative to image base. */ |
bfd_vma AddressOfEntryPoint; |
/* Address of the first code section relative to image base. */ |
bfd_vma BaseOfCode; |
/* Address of the first data section relative to image base. */ |
bfd_vma BaseOfData; |
/* PE stuff */ |
bfd_vma ImageBase; /* address of specific location in memory that |
file is located, NT default 0x10000 */ |
bfd_vma SectionAlignment; /* section alignment default 0x1000 */ |
bfd_vma FileAlignment; /* file alignment default 0x200 */ |
short MajorOperatingSystemVersion; /* minimum version of the operating */ |
short MinorOperatingSystemVersion; /* system req'd for exe, default to 1*/ |
short MajorImageVersion; /* user defineable field to store version of */ |
short MinorImageVersion; /* exe or dll being created, default to 0 */ |
short MajorSubsystemVersion; /* minimum subsystem version required to */ |
short MinorSubsystemVersion; /* run exe; default to 3.1 */ |
long Reserved1; /* seems to be 0 */ |
long SizeOfImage; /* size of memory to allocate for prog */ |
long SizeOfHeaders; /* size of PE header and section table */ |
long CheckSum; /* set to 0 */ |
short Subsystem; |
/* type of subsystem exe uses for user interface, |
possible values: |
1 - NATIVE Doesn't require a subsystem |
2 - WINDOWS_GUI runs in Windows GUI subsystem |
3 - WINDOWS_CUI runs in Windows char sub. (console app) |
5 - OS2_CUI runs in OS/2 character subsystem |
7 - POSIX_CUI runs in Posix character subsystem */ |
unsigned short DllCharacteristics; /* flags for DLL init */ |
bfd_vma SizeOfStackReserve; /* amount of memory to reserve */ |
bfd_vma SizeOfStackCommit; /* amount of memory initially committed for |
initial thread's stack, default is 0x1000 */ |
bfd_vma SizeOfHeapReserve; /* amount of virtual memory to reserve and */ |
bfd_vma SizeOfHeapCommit; /* commit, don't know what to defaut it to */ |
long LoaderFlags; /* can probably set to 0 */ |
long NumberOfRvaAndSizes; /* number of entries in next entry, 16 */ |
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; |
}; |
/********************** AOUT "OPTIONAL HEADER" **********************/ |
struct internal_aouthdr |
{ |
short magic; /* type of file */ |
short vstamp; /* version stamp */ |
bfd_vma tsize; /* text size in bytes, padded to FW bdry*/ |
bfd_vma dsize; /* initialized data " " */ |
bfd_vma bsize; /* uninitialized data " " */ |
bfd_vma entry; /* entry pt. */ |
bfd_vma text_start; /* base of text used for this file */ |
bfd_vma data_start; /* base of data used for this file */ |
/* i960 stuff */ |
unsigned long tagentries; /* number of tag entries to follow */ |
/* RS/6000 stuff */ |
bfd_vma o_toc; /* address of TOC */ |
short o_snentry; /* section number for entry point */ |
short o_sntext; /* section number for text */ |
short o_sndata; /* section number for data */ |
short o_sntoc; /* section number for toc */ |
short o_snloader; /* section number for loader section */ |
short o_snbss; /* section number for bss */ |
short o_algntext; /* max alignment for text */ |
short o_algndata; /* max alignment for data */ |
short o_modtype; /* Module type field, 1R,RE,RO */ |
short o_cputype; /* Encoded CPU type */ |
bfd_vma o_maxstack; /* max stack size allowed. */ |
bfd_vma o_maxdata; /* max data size allowed. */ |
/* ECOFF stuff */ |
bfd_vma bss_start; /* Base of bss section. */ |
bfd_vma gp_value; /* GP register value. */ |
unsigned long gprmask; /* General registers used. */ |
unsigned long cprmask[4]; /* Coprocessor registers used. */ |
unsigned long fprmask; /* Floating pointer registers used. */ |
/* Apollo stuff */ |
long o_inlib; /* inlib data */ |
long o_sri; /* Static Resource Information */ |
long vid[2]; /* Version id */ |
struct internal_extra_pe_aouthdr pe; |
}; |
/********************** STORAGE CLASSES **********************/ |
/* This used to be defined as -1, but now n_sclass is unsigned. */ |
#define C_EFCN 0xff /* physical end of function */ |
#define C_NULL 0 |
#define C_AUTO 1 /* automatic variable */ |
#define C_EXT 2 /* external symbol */ |
#define C_STAT 3 /* static */ |
#define C_REG 4 /* register variable */ |
#define C_EXTDEF 5 /* external definition */ |
#define C_LABEL 6 /* label */ |
#define C_ULABEL 7 /* undefined label */ |
#define C_MOS 8 /* member of structure */ |
#define C_ARG 9 /* function argument */ |
#define C_STRTAG 10 /* structure tag */ |
#define C_MOU 11 /* member of union */ |
#define C_UNTAG 12 /* union tag */ |
#define C_TPDEF 13 /* type definition */ |
#define C_USTATIC 14 /* undefined static */ |
#define C_ENTAG 15 /* enumeration tag */ |
#define C_MOE 16 /* member of enumeration */ |
#define C_REGPARM 17 /* register parameter */ |
#define C_FIELD 18 /* bit field */ |
#define C_AUTOARG 19 /* auto argument */ |
#define C_LASTENT 20 /* dummy entry (end of block) */ |
#define C_BLOCK 100 /* ".bb" or ".eb" */ |
#define C_FCN 101 /* ".bf" or ".ef" */ |
#define C_EOS 102 /* end of structure */ |
#define C_FILE 103 /* file name */ |
#define C_LINE 104 /* line # reformatted as symbol table entry */ |
#define C_ALIAS 105 /* duplicate tag */ |
#define C_HIDDEN 106 /* ext symbol in dmert public lib */ |
#define C_WEAKEXT 127 /* weak symbol -- GNU extension. */ |
/* New storage classes for TI COFF */ |
#define C_UEXT 19 /* Tentative external definition */ |
#define C_STATLAB 20 /* Static load time label */ |
#define C_EXTLAB 21 /* External load time label */ |
#define C_SYSTEM 23 /* System Wide variable */ |
/* New storage classes for WINDOWS_NT */ |
#define C_SECTION 104 /* section name */ |
#define C_NT_WEAK 105 /* weak external */ |
/* New storage classes for 80960 */ |
/* C_LEAFPROC is obsolete. Use C_LEAFEXT or C_LEAFSTAT */ |
#define C_LEAFPROC 108 /* Leaf procedure, "call" via BAL */ |
#define C_SCALL 107 /* Procedure reachable via system call */ |
#define C_LEAFEXT 108 /* External leaf */ |
#define C_LEAFSTAT 113 /* Static leaf */ |
#define C_OPTVAR 109 /* Optimized variable */ |
#define C_DEFINE 110 /* Preprocessor #define */ |
#define C_PRAGMA 111 /* Advice to compiler or linker */ |
#define C_SEGMENT 112 /* 80960 segment name */ |
/* Storage classes for m88k */ |
#define C_SHADOW 107 /* shadow symbol */ |
#define C_VERSION 108 /* coff version symbol */ |
/* New storage classes for RS/6000 */ |
#define C_HIDEXT 107 /* Un-named external symbol */ |
#define C_BINCL 108 /* Marks beginning of include file */ |
#define C_EINCL 109 /* Marks ending of include file */ |
#define C_AIX_WEAKEXT 111 /* AIX definition of C_WEAKEXT. */ |
#define C_NULL_VALUE 0x00de1e00 /* Value for a C_NULL deleted entry. */ |
#if defined _AIX52 || defined AIX_WEAK_SUPPORT |
#undef C_WEAKEXT |
#define C_WEAKEXT C_AIX_WEAKEXT |
#endif |
/* storage classes for stab symbols for RS/6000 */ |
#define C_GSYM (0x80) |
#define C_LSYM (0x81) |
#define C_PSYM (0x82) |
#define C_RSYM (0x83) |
#define C_RPSYM (0x84) |
#define C_STSYM (0x85) |
#define C_TCSYM (0x86) |
#define C_BCOMM (0x87) |
#define C_ECOML (0x88) |
#define C_ECOMM (0x89) |
#define C_DECL (0x8c) |
#define C_ENTRY (0x8d) |
#define C_FUN (0x8e) |
#define C_BSTAT (0x8f) |
#define C_ESTAT (0x90) |
#define C_GTLS (0x97) |
#define C_STTLS (0x98) |
/* Storage classes for Thumb symbols */ |
#define C_THUMBEXT (128 + C_EXT) /* 130 */ |
#define C_THUMBSTAT (128 + C_STAT) /* 131 */ |
#define C_THUMBLABEL (128 + C_LABEL) /* 134 */ |
#define C_THUMBEXTFUNC (C_THUMBEXT + 20) /* 150 */ |
#define C_THUMBSTATFUNC (C_THUMBSTAT + 20) /* 151 */ |
/* True if XCOFF symbols of class CLASS have auxillary csect information. */ |
#define CSECT_SYM_P(CLASS) \ |
((CLASS) == C_EXT || (CLASS) == C_AIX_WEAKEXT || (CLASS) == C_HIDEXT) |
/********************** SECTION HEADER **********************/ |
#define SCNNMLEN (8) |
struct internal_scnhdr |
{ |
char s_name[SCNNMLEN]; /* section name */ |
/* Physical address, aliased s_nlib. |
In the pei format, this field is the virtual section size |
(the size of the section after being loaded int memory), |
NOT the physical address. */ |
bfd_vma s_paddr; |
bfd_vma s_vaddr; /* virtual address */ |
bfd_vma s_size; /* section size */ |
bfd_vma s_scnptr; /* file ptr to raw data for section */ |
bfd_vma s_relptr; /* file ptr to relocation */ |
bfd_vma s_lnnoptr; /* file ptr to line numbers */ |
unsigned long s_nreloc; /* number of relocation entries */ |
unsigned long s_nlnno; /* number of line number entries*/ |
long s_flags; /* flags */ |
long s_align; /* used on I960 */ |
unsigned char s_page; /* TI COFF load page */ |
}; |
/* s_flags "type". */ |
#define STYP_REG (0x0000) /* "regular": allocated, relocated, loaded */ |
#define STYP_DSECT (0x0001) /* "dummy": relocated only*/ |
#define STYP_NOLOAD (0x0002) /* "noload": allocated, relocated, not loaded */ |
#define STYP_GROUP (0x0004) /* "grouped": formed of input sections */ |
#define STYP_PAD (0x0008) /* "padding": not allocated, not relocated, loaded */ |
#define STYP_COPY (0x0010) /* "copy": for decision function used by field update; not allocated, not relocated, |
loaded; reloc & lineno entries processed normally */ |
#define STYP_TEXT (0x0020) /* section contains text only */ |
#define S_SHRSEG (0x0020) /* In 3b Update files (output of ogen), sections which appear in SHARED segments of the Pfile |
will have the S_SHRSEG flag set by ogen, to inform dufr that updating 1 copy of the proc. will |
update all process invocations. */ |
#define STYP_DATA (0x0040) /* section contains data only */ |
#define STYP_BSS (0x0080) /* section contains bss only */ |
#define S_NEWFCN (0x0100) /* In a minimal file or an update file, a new function (as compared with a replaced function) */ |
#define STYP_INFO (0x0200) /* comment: not allocated not relocated, not loaded */ |
#define STYP_OVER (0x0400) /* overlay: relocated not allocated or loaded */ |
#define STYP_LIB (0x0800) /* for .lib: same as INFO */ |
#define STYP_MERGE (0x2000) /* merge section -- combines with text, data or bss sections only */ |
#define STYP_REVERSE_PAD (0x4000) /* section will be padded with no-op instructions |
wherever padding is necessary and there is a |
word of contiguous bytes beginning on a word |
boundary. */ |
#define STYP_LIT 0x8020 /* Literal data (like STYP_TEXT) */ |
/********************** LINE NUMBERS **********************/ |
/* 1 line number entry for every "breakpointable" source line in a section. |
Line numbers are grouped on a per function basis; first entry in a function |
grouping will have l_lnno = 0 and in place of physical address will be the |
symbol table index of the function name. */ |
struct internal_lineno |
{ |
union |
{ |
bfd_signed_vma l_symndx; /* function name symbol index, iff l_lnno == 0*/ |
bfd_signed_vma l_paddr; /* (physical) address of line number */ |
} l_addr; |
unsigned long l_lnno; /* line number */ |
}; |
/********************** SYMBOLS **********************/ |
#define SYMNMLEN 8 /* # characters in a symbol name */ |
#define FILNMLEN 14 /* # characters in a file name */ |
#define DIMNUM 4 /* # array dimensions in auxiliary entry */ |
struct internal_syment |
{ |
union |
{ |
char _n_name[SYMNMLEN]; /* old COFF version */ |
struct |
{ |
bfd_hostptr_t _n_zeroes; /* new == 0 */ |
bfd_hostptr_t _n_offset; /* offset into string table */ |
} _n_n; |
char *_n_nptr[2]; /* allows for overlaying */ |
} _n; |
bfd_vma n_value; /* value of symbol */ |
short n_scnum; /* section number */ |
unsigned short n_flags; /* copy of flags from filhdr */ |
unsigned short n_type; /* type and derived type */ |
unsigned char n_sclass; /* storage class */ |
unsigned char n_numaux; /* number of aux. entries */ |
}; |
#define n_name _n._n_name |
#define n_zeroes _n._n_n._n_zeroes |
#define n_offset _n._n_n._n_offset |
/* Relocatable symbols have number of the section in which they are defined, |
or one of the following: */ |
#define N_UNDEF ((short)0) /* undefined symbol */ |
#define N_ABS ((short)-1) /* value of symbol is absolute */ |
#define N_DEBUG ((short)-2) /* debugging symbol -- value is meaningless */ |
#define N_TV ((short)-3) /* indicates symbol needs preload transfer vector */ |
#define P_TV ((short)-4) /* indicates symbol needs postload transfer vector*/ |
/* Type of a symbol, in low N bits of the word. */ |
#define T_NULL 0 |
#define T_VOID 1 /* function argument (only used by compiler) */ |
#define T_CHAR 2 /* character */ |
#define T_SHORT 3 /* short integer */ |
#define T_INT 4 /* integer */ |
#define T_LONG 5 /* long integer */ |
#define T_FLOAT 6 /* floating point */ |
#define T_DOUBLE 7 /* double word */ |
#define T_STRUCT 8 /* structure */ |
#define T_UNION 9 /* union */ |
#define T_ENUM 10 /* enumeration */ |
#define T_MOE 11 /* member of enumeration*/ |
#define T_UCHAR 12 /* unsigned character */ |
#define T_USHORT 13 /* unsigned short */ |
#define T_UINT 14 /* unsigned integer */ |
#define T_ULONG 15 /* unsigned long */ |
#define T_LNGDBL 16 /* long double */ |
/* Derived types, in n_type. */ |
#define DT_NON (0) /* no derived type */ |
#define DT_PTR (1) /* pointer */ |
#define DT_FCN (2) /* function */ |
#define DT_ARY (3) /* array */ |
#define BTYPE(x) ((x) & N_BTMASK) |
#define DTYPE(x) (((x) & N_TMASK) >> N_BTSHFT) |
#define ISPTR(x) \ |
(((unsigned long) (x) & N_TMASK) == ((unsigned long) DT_PTR << N_BTSHFT)) |
#define ISFCN(x) \ |
(((unsigned long) (x) & N_TMASK) == ((unsigned long) DT_FCN << N_BTSHFT)) |
#define ISARY(x) \ |
(((unsigned long) (x) & N_TMASK) == ((unsigned long) DT_ARY << N_BTSHFT)) |
#define ISTAG(x) \ |
((x) == C_STRTAG || (x) == C_UNTAG || (x) == C_ENTAG) |
#define DECREF(x) \ |
((((x) >> N_TSHIFT) & ~ N_BTMASK) | ((x) & N_BTMASK)) |
union internal_auxent |
{ |
struct |
{ |
union |
{ |
long l; /* str, un, or enum tag indx */ |
struct coff_ptr_struct *p; |
} x_tagndx; |
union |
{ |
struct |
{ |
unsigned short x_lnno; /* declaration line number */ |
unsigned short x_size; /* str/union/array size */ |
} x_lnsz; |
long x_fsize; /* size of function */ |
} x_misc; |
union |
{ |
struct |
{ /* if ISFCN, tag, or .bb */ |
bfd_signed_vma x_lnnoptr; /* ptr to fcn line # */ |
union |
{ /* entry ndx past block end */ |
long l; |
struct coff_ptr_struct *p; |
} x_endndx; |
} x_fcn; |
struct |
{ /* if ISARY, up to 4 dimen. */ |
unsigned short x_dimen[DIMNUM]; |
} x_ary; |
} x_fcnary; |
unsigned short x_tvndx; /* tv index */ |
} x_sym; |
union |
{ |
char x_fname[FILNMLEN]; |
struct |
{ |
long x_zeroes; |
long x_offset; |
} x_n; |
} x_file; |
struct |
{ |
long x_scnlen; /* section length */ |
unsigned short x_nreloc; /* # relocation entries */ |
unsigned short x_nlinno; /* # line numbers */ |
unsigned long x_checksum; /* section COMDAT checksum for PE */ |
unsigned short x_associated; /* COMDAT associated section index for PE */ |
unsigned char x_comdat; /* COMDAT selection number for PE */ |
} x_scn; |
struct |
{ |
long x_tvfill; /* tv fill value */ |
unsigned short x_tvlen; /* length of .tv */ |
unsigned short x_tvran[2]; /* tv range */ |
} x_tv; /* info about .tv section (in auxent of symbol .tv)) */ |
/****************************************** |
* RS/6000-specific auxent - last auxent for every external symbol |
******************************************/ |
struct |
{ |
union |
{ /* csect length or enclosing csect */ |
bfd_signed_vma l; |
struct coff_ptr_struct *p; |
} x_scnlen; |
long x_parmhash; /* parm type hash index */ |
unsigned short x_snhash; /* sect num with parm hash */ |
unsigned char x_smtyp; /* symbol align and type */ |
/* 0-4 - Log 2 of alignment */ |
/* 5-7 - symbol type */ |
unsigned char x_smclas; /* storage mapping class */ |
long x_stab; /* dbx stab info index */ |
unsigned short x_snstab; /* sect num with dbx stab */ |
} x_csect; /* csect definition information */ |
/* x_smtyp values: */ |
#define SMTYP_ALIGN(x) ((x) >> 3) /* log2 of alignment */ |
#define SMTYP_SMTYP(x) ((x) & 0x7) /* symbol type */ |
/* Symbol type values: */ |
#define XTY_ER 0 /* External reference */ |
#define XTY_SD 1 /* Csect definition */ |
#define XTY_LD 2 /* Label definition */ |
#define XTY_CM 3 /* .BSS */ |
#define XTY_EM 4 /* Error message */ |
#define XTY_US 5 /* "Reserved for internal use" */ |
/* x_smclas values: */ |
#define XMC_PR 0 /* Read-only program code */ |
#define XMC_RO 1 /* Read-only constant */ |
#define XMC_DB 2 /* Read-only debug dictionary table */ |
#define XMC_TC 3 /* Read-write general TOC entry */ |
#define XMC_UA 4 /* Read-write unclassified */ |
#define XMC_RW 5 /* Read-write data */ |
#define XMC_GL 6 /* Read-only global linkage */ |
#define XMC_XO 7 /* Read-only extended operation */ |
#define XMC_SV 8 /* Read-only supervisor call */ |
#define XMC_BS 9 /* Read-write BSS */ |
#define XMC_DS 10 /* Read-write descriptor csect */ |
#define XMC_UC 11 /* Read-write unnamed Fortran common */ |
#define XMC_TI 12 /* Read-only traceback index csect */ |
#define XMC_TB 13 /* Read-only traceback table csect */ |
/* 14 ??? */ |
#define XMC_TC0 15 /* Read-write TOC anchor */ |
#define XMC_TD 16 /* Read-write data in TOC */ |
/****************************************** |
* I960-specific *2nd* aux. entry formats |
******************************************/ |
struct |
{ |
/* This is a very old typo that keeps getting propagated. */ |
#define x_stdindx x_stindx |
long x_stindx; /* sys. table entry */ |
} x_sc; /* system call entry */ |
struct |
{ |
unsigned long x_balntry; /* BAL entry point */ |
} x_bal; /* BAL-callable function */ |
struct |
{ |
unsigned long x_timestamp; /* time stamp */ |
char x_idstring[20]; /* producer identity string */ |
} x_ident; /* Producer ident info */ |
}; |
/********************** RELOCATION DIRECTIVES **********************/ |
struct internal_reloc |
{ |
bfd_vma r_vaddr; /* Virtual address of reference */ |
long r_symndx; /* Index into symbol table */ |
unsigned short r_type; /* Relocation type */ |
unsigned char r_size; /* Used by RS/6000 and ECOFF */ |
unsigned char r_extern; /* Used by ECOFF */ |
unsigned long r_offset; /* Used by Alpha ECOFF, SPARC, others */ |
}; |
/* X86-64 relocations. */ |
#define R_AMD64_ABS 0 /* Reference is absolute, no relocation is necessary. */ |
#define R_AMD64_DIR64 1 /* 64-bit address (VA). */ |
#define R_AMD64_DIR32 2 /* 32-bit address (VA) R_DIR32. */ |
#define R_AMD64_IMAGEBASE 3 /* 32-bit absolute ref w/o base R_IMAGEBASE. */ |
#define R_AMD64_PCRLONG 4 /* 32-bit relative address from byte following reloc R_PCRLONG. */ |
#define R_AMD64_PCRLONG_1 5 /* 32-bit relative address from byte distance 1 from reloc. */ |
#define R_AMD64_PCRLONG_2 6 /* 32-bit relative address from byte distance 2 from reloc. */ |
#define R_AMD64_PCRLONG_3 7 /* 32-bit relative address from byte distance 3 from reloc. */ |
#define R_AMD64_PCRLONG_4 8 /* 32-bit relative address from byte distance 4 from reloc. */ |
#define R_AMD64_PCRLONG_5 9 /* 32-bit relative address from byte distance 5 from reloc. */ |
#define R_AMD64_SECTION 10 /* Section index. */ |
#define R_AMD64_SECREL 11 /* 32 bit offset from base of section containing target R_SECREL. */ |
#define R_AMD64_SECREL7 12 /* 7 bit unsigned offset from base of section containing target. */ |
#define R_AMD64_TOKEN 13 /* 32 bit metadata token. */ |
#define R_AMD64_PCRQUAD 14 /* Pseude PC64 relocation - Note: not specified by MS/AMD but need for gas pc-relative 64bit wide relocation generated by ELF. */ |
/* i386 Relocations. */ |
#define R_DIR16 1 |
#define R_REL24 5 |
#define R_DIR32 6 |
#define R_IMAGEBASE 7 |
#define R_SECREL32 11 |
#define R_RELBYTE 15 |
#define R_RELWORD 16 |
#define R_RELLONG 17 |
#define R_PCRBYTE 18 |
#define R_PCRWORD 19 |
#define R_PCRLONG 20 |
#define R_PCR24 21 |
#define R_IPRSHORT 24 |
#define R_IPRLONG 26 |
#define R_GETSEG 29 |
#define R_GETPA 30 |
#define R_TAGWORD 31 |
#define R_JUMPTARG 32 /* strange 29k 00xx00xx reloc */ |
#define R_PARTLS16 32 |
#define R_PARTMS8 33 |
#define R_PCR16L 128 |
#define R_PCR26L 129 |
#define R_VRT16 130 |
#define R_HVRT16 131 |
#define R_LVRT16 132 |
#define R_VRT32 133 |
/* This reloc identifies mov.b instructions with a 16bit absolute |
address. The linker tries to turn insns with this reloc into |
an absolute 8-bit address. */ |
#define R_MOV16B1 0x41 |
/* This reloc identifies mov.b instructions which had a 16bit |
absolute address which have been shortened into a 8-bit |
absolute address. */ |
#define R_MOV16B2 0x42 |
/* This reloc identifies jmp insns with a 16bit target address; |
the linker tries to turn these insns into bra insns with |
an 8bit pc-relative target. */ |
#define R_JMP1 0x43 |
/* This reloc identifies a bra with an 8-bit pc-relative |
target that was formerly a jmp insn with a 16bit target. */ |
#define R_JMP2 0x44 |
/* ??? */ |
#define R_RELLONG_NEG 0x45 |
/* This reloc identifies jmp insns with a 24bit target address; |
the linker tries to turn these insns into bra insns with |
an 8bit pc-relative target. */ |
#define R_JMPL1 0x46 |
/* This reloc identifies a bra with an 8-bit pc-relative |
target that was formerly a jmp insn with a 24bit target. */ |
#define R_JMPL2 0x47 |
/* This reloc identifies mov.b instructions with a 24bit absolute |
address. The linker tries to turn insns with this reloc into |
an absolute 8-bit address. */ |
#define R_MOV24B1 0x48 |
/* This reloc identifies mov.b instructions which had a 24bit |
absolute address which have been shortened into a 8-bit |
absolute address. */ |
#define R_MOV24B2 0x49 |
/* An h8300 memory indirect jump/call. Forces the address of the jump/call |
target into the function vector (in page zero), and the address of the |
vector entry to be placed in the jump/call instruction. */ |
#define R_MEM_INDIRECT 0x4a |
/* This reloc identifies a 16bit pc-relative branch target which was |
shortened into an 8bit pc-relative branch target. */ |
#define R_PCRWORD_B 0x4b |
/* This reloc identifies mov.[wl] instructions with a 32/24 bit |
absolute address; the linker may turn this into a mov.[wl] |
insn with a 16bit absolute address. */ |
#define R_MOVL1 0x4c |
/* This reloc identifies mov.[wl] insns which formerly had |
a 32/24bit absolute address and now have a 16bit absolute address. */ |
#define R_MOVL2 0x4d |
/* This reloc identifies a bCC:8 which will have it's condition |
inverted and its target redirected to the target of the branch |
in the following insn. */ |
#define R_BCC_INV 0x4e |
/* This reloc identifies a jmp instruction that has been deleted. */ |
#define R_JMP_DEL 0x4f |
/* Z8k modes */ |
#define R_IMM16 0x01 /* 16 bit abs */ |
#define R_JR 0x02 /* jr 8 bit disp */ |
#define R_IMM4L 0x23 /* low nibble */ |
#define R_IMM8 0x22 /* 8 bit abs */ |
#define R_IMM32 R_RELLONG /* 32 bit abs */ |
#define R_CALL R_DA /* Absolute address which could be a callr */ |
#define R_JP R_DA /* Absolute address which could be a jp */ |
#define R_REL16 0x04 /* 16 bit PC rel */ |
#define R_CALLR 0x05 /* callr 12 bit disp */ |
#define R_SEG 0x10 /* set if in segmented mode */ |
#define R_IMM4H 0x24 /* high nibble */ |
#define R_DISP7 0x25 /* djnz displacement */ |
/* Z80 modes */ |
#define R_OFF8 0x32 /* 8 bit signed abs, for (i[xy]+d) */ |
#define R_IMM24 0x33 /* 24 bit abs */ |
/* R_JR, R_IMM8, R_IMM16, R_IMM32 - as for Z8k */ |
/* H8500 modes */ |
#define R_H8500_IMM8 1 /* 8 bit immediate */ |
#define R_H8500_IMM16 2 /* 16 bit immediate */ |
#define R_H8500_PCREL8 3 /* 8 bit pcrel */ |
#define R_H8500_PCREL16 4 /* 16 bit pcrel */ |
#define R_H8500_HIGH8 5 /* high 8 bits of 24 bit address */ |
#define R_H8500_LOW16 7 /* low 16 bits of 24 bit immediate */ |
#define R_H8500_IMM24 6 /* 24 bit immediate */ |
#define R_H8500_IMM32 8 /* 32 bit immediate */ |
#define R_H8500_HIGH16 9 /* high 16 bits of 32 bit immediate */ |
/* W65 modes */ |
#define R_W65_ABS8 1 /* addr & 0xff */ |
#define R_W65_ABS16 2 /* addr & 0xffff */ |
#define R_W65_ABS24 3 /* addr & 0xffffff */ |
#define R_W65_ABS8S8 4 /* (addr >> 8) & 0xff */ |
#define R_W65_ABS8S16 5 /* (addr >> 16) & 0xff */ |
#define R_W65_ABS16S8 6 /* (addr >> 8) & 0ffff */ |
#define R_W65_ABS16S16 7 /* (addr >> 16) & 0ffff */ |
#define R_W65_PCR8 8 |
#define R_W65_PCR16 9 |
#define R_W65_DP 10 /* direct page 8 bits only */ |
#endif /* GNU_COFF_INTERNAL_H */ |
/contrib/toolchain/binutils/include/coff/m68k.h |
---|
0,0 → 1,82 |
/* coff information for M68K |
Copyright 2001, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef GNU_COFF_M68K_H |
#define GNU_COFF_M68K_H 1 |
#define L_LNNO_SIZE 2 |
#include "coff/external.h" |
/* Motorola 68000/68008/68010/68020 */ |
#define MC68MAGIC 0520 |
#define MC68KWRMAGIC 0520 /* writeable text segments */ |
#define MC68TVMAGIC 0521 |
#define MC68KROMAGIC 0521 /* readonly shareable text segments */ |
#define MC68KPGMAGIC 0522 /* demand paged text segments */ |
#define M68MAGIC 0210 |
#define M68TVMAGIC 0211 |
/* This is the magic of the Bull dpx/2 */ |
#define MC68KBCSMAGIC 0526 |
/* This is Lynx's all-platform magic number for executables. */ |
#define LYNXCOFFMAGIC 0415 |
#define OMAGIC M68MAGIC |
/* This intentionally does not include MC68KBCSMAGIC; it only includes |
magic numbers which imply that names do not have underscores. */ |
#define M68KBADMAG(x) (((x).f_magic != MC68MAGIC) \ |
&& ((x).f_magic != MC68KWRMAGIC) \ |
&& ((x).f_magic != MC68TVMAGIC) \ |
&& ((x).f_magic != MC68KROMAGIC) \ |
&& ((x).f_magic != MC68KPGMAGIC) \ |
&& ((x).f_magic != M68MAGIC) \ |
&& ((x).f_magic != M68TVMAGIC) \ |
&& ((x).f_magic != LYNXCOFFMAGIC)) |
/* Magic numbers for the a.out header. */ |
#define PAGEMAGICEXECSWAPPED 0407 /* executable (swapped) */ |
#define PAGEMAGICPEXECSWAPPED 0410 /* pure executable (swapped) */ |
#define PAGEMAGICPEXECTSHLIB 0443 /* pure executable (target shared library) */ |
#define PAGEMAGICPEXECPAGED 0413 /* pure executable (paged) */ |
/********************** RELOCATION DIRECTIVES **********************/ |
struct external_reloc |
{ |
char r_vaddr[4]; |
char r_symndx[4]; |
char r_type[2]; |
#ifdef M68K_COFF_OFFSET |
char r_offset[4]; |
#endif |
}; |
#define RELOC struct external_reloc |
#ifdef M68K_COFF_OFFSET |
#define RELSZ 14 |
#else |
#define RELSZ 10 |
#endif |
#endif /* GNU_COFF_M68K_H */ |
/contrib/toolchain/binutils/include/coff/m88k.h |
---|
0,0 → 1,197 |
/* coff information for 88k bcs |
Copyright 2001, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#define DO_NOT_DEFINE_SCNHDR |
#define L_LNNO_SIZE 4 |
#define DO_NOT_DEFINE_SYMENT |
#define DO_NOT_DEFINE_AUXENT |
#include "coff/external.h" |
#define MC88MAGIC 0540 /* 88k BCS executable */ |
#define MC88DMAGIC 0541 /* DG/UX executable */ |
#define MC88OMAGIC 0555 /* Object file */ |
#define MC88BADMAG(x) (((x).f_magic != MC88MAGIC) \ |
&& ((x).f_magic != MC88DMAGIC) \ |
&& ((x).f_magic != MC88OMAGIC)) |
#define PAGEMAGIC3 0414 /* Split i&d, zero mapped */ |
#define PAGEMAGICBCS 0413 |
/********************** SECTION HEADER **********************/ |
struct external_scnhdr |
{ |
char s_name[8]; /* section name */ |
char s_paddr[4]; /* physical address, aliased s_nlib */ |
char s_vaddr[4]; /* virtual address */ |
char s_size[4]; /* section size */ |
char s_scnptr[4]; /* file ptr to raw data for section */ |
char s_relptr[4]; /* file ptr to relocation */ |
char s_lnnoptr[4]; /* file ptr to line numbers */ |
char s_nreloc[4]; /* number of relocation entries */ |
char s_nlnno[4]; /* number of line number entries*/ |
char s_flags[4]; /* flags */ |
}; |
#define SCNHDR struct external_scnhdr |
#define SCNHSZ 44 |
/* Names of "special" sections. */ |
#define _TEXT ".text" |
#define _DATA ".data" |
#define _BSS ".bss" |
#define _COMMENT ".comment" |
/********************** SYMBOLS **********************/ |
#define E_SYMNMLEN 8 /* # characters in a symbol name */ |
#define E_FILNMLEN 14 /* # characters in a file name */ |
#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ |
struct external_syment |
{ |
union |
{ |
char e_name[E_SYMNMLEN]; |
struct |
{ |
char e_zeroes[4]; |
char e_offset[4]; |
} e; |
} e; |
char e_value[4]; |
char e_scnum[2]; |
char e_type[2]; |
char e_sclass[1]; |
char e_numaux[1]; |
char pad2[2]; |
}; |
#define N_BTMASK 017 |
#define N_TMASK 060 |
#define N_BTSHFT 4 |
#define N_TSHIFT 2 |
/* Note that this isn't the same shape as other coffs */ |
union external_auxent |
{ |
struct |
{ |
char x_tagndx[4]; /* str, un, or enum tag indx */ |
/* 4 */ |
union |
{ |
char x_fsize[4]; /* size of function */ |
struct |
{ |
char x_lnno[4]; /* declaration line number */ |
char x_size[4]; /* str/union/array size */ |
} x_lnsz; |
} x_misc; |
/* 12 */ |
union |
{ |
struct /* if ISFCN, tag, or .bb */ |
{ |
char x_lnnoptr[4]; /* ptr to fcn line # */ |
char x_endndx[4]; /* entry ndx past block end */ |
} x_fcn; |
struct /* if ISARY, up to 4 dimen. */ |
{ |
char x_dimen[E_DIMNUM][2]; |
} x_ary; |
} x_fcnary; |
/* 20 */ |
} x_sym; |
union |
{ |
char x_fname[E_FILNMLEN]; |
struct |
{ |
char x_zeroes[4]; |
char x_offset[4]; |
} x_n; |
} x_file; |
struct |
{ |
char x_scnlen[4]; /* section length */ |
char x_nreloc[4]; /* # relocation entries */ |
char x_nlinno[4]; /* # line numbers */ |
} x_scn; |
struct |
{ |
char x_tvfill[4]; /* tv fill value */ |
char x_tvlen[2]; /* length of .tv */ |
char x_tvran[2][2]; /* tv range */ |
} x_tv; /* info about .tv section (in auxent of symbol .tv)) */ |
}; |
#define GET_LNSZ_SIZE(abfd, ext) \ |
H_GET_32 (abfd, ext->x_sym.x_misc.x_lnsz.x_size) |
#define GET_LNSZ_LNNO(abfd, ext) \ |
H_GET_32 (abfd, ext->x_sym.x_misc.x_lnsz.x_lnno) |
#define PUT_LNSZ_LNNO(abfd, in, ext) \ |
H_PUT_32 (abfd, in, ext->x_sym.x_misc.x_lnsz.x_lnno) |
#define PUT_LNSZ_SIZE(abfd, in, ext) \ |
H_PUT_32 (abfd, in, ext->x_sym.x_misc.x_lnsz.x_size) |
#define GET_SCN_NRELOC(abfd, ext) \ |
H_GET_32 (abfd, ext->x_scn.x_nreloc) |
#define GET_SCN_NLINNO(abfd, ext) \ |
H_GET_32 (abfd, ext->x_scn.x_nlinno) |
#define PUT_SCN_NRELOC(abfd, in, ext) \ |
H_PUT_32 (abfd, in, ext->x_scn.x_nreloc) |
#define PUT_SCN_NLINNO(abfd, in, ext) \ |
H_PUT_32 (abfd,in, ext->x_scn.x_nlinno) |
#define SYMENT struct external_syment |
#define SYMESZ 20 |
#define AUXENT union external_auxent |
#define AUXESZ 20 |
/********************** RELOCATION DIRECTIVES **********************/ |
struct external_reloc |
{ |
char r_vaddr[4]; |
char r_symndx[4]; |
char r_type[2]; |
char r_offset[2]; |
}; |
#define RELOC struct external_reloc |
#define RELSZ 12 |
#define NO_TVNDX |
/contrib/toolchain/binutils/include/coff/mcore.h |
---|
0,0 → 1,72 |
/* Motorola MCore support for BFD. |
Copyright 1999, 2000, 2010 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* This file holds definitions specific to the MCore COFF/PE ABI. */ |
#ifndef _COFF_MORE_H |
#define _COFF_MORE_H |
#define INCLUDE_COMDAT_FIELDS_IN_AUXENT |
#define L_LNNO_SIZE 2 |
#include "coff/external.h" |
#define MCOREMAGIC 0xb00 /* I just made this up */ |
#define MCOREBADMAG(x) (((x).f_magic != MCOREMAGIC)) |
#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ |
#define IMAGE_REL_MCORE_ABSOLUTE 0x0000 |
#define IMAGE_REL_MCORE_ADDR32 0x0001 |
#define IMAGE_REL_MCORE_PCREL_IMM8BY4 0x0002 |
#define IMAGE_REL_MCORE_PCREL_IMM11BY2 0x0003 |
#define IMAGE_REL_MCORE_PCREL_IMM4BY2 0x0004 |
#define IMAGE_REL_MCORE_PCREL_32 0x0005 |
#define IMAGE_REL_MCORE_PCREL_JSR_IMM11BY2 0x0006 |
#define IMAGE_REL_MCORE_RVA 0x0007 |
#define PEMCORE |
#define OMAGIC 0404 /* object files, eg as output */ |
#define ZMAGIC 0413 /* demand load format, eg normal ld output */ |
#define STMAGIC 0401 /* target shlib */ |
#define SHMAGIC 0443 /* host shlib */ |
/* From winnt.h */ |
#define IMAGE_NT_OPTIONAL_HDR_MAGIC 0x10b |
/* Define some NT default values. */ |
#define NT_SECTION_ALIGNMENT 0x1000 |
#define NT_FILE_ALIGNMENT 0x200 |
#define NT_DEF_RESERVE 0x100000 |
#define NT_DEF_COMMIT 0x1000 |
struct external_reloc |
{ |
char r_vaddr [4]; |
char r_symndx [4]; |
char r_type [2]; |
char r_offset [4]; |
}; |
#define RELOC struct external_reloc |
#define RELSZ 14 |
#endif /* __COFF_MCORE_H */ |
/contrib/toolchain/binutils/include/coff/mips.h |
---|
0,0 → 1,344 |
/* ECOFF support on MIPS machines. |
coff/ecoff.h must be included before this file. |
Copyright 1999, 2004, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#define DO_NOT_DEFINE_AOUTHDR |
#define L_LNNO_SIZE 4 |
#include "coff/external.h" |
/* Magic numbers are defined in coff/ecoff.h. */ |
#define MIPS_ECOFF_BADMAG(x) (((x).f_magic!=MIPS_MAGIC_1) && \ |
((x).f_magic!=MIPS_MAGIC_LITTLE) &&\ |
((x).f_magic!=MIPS_MAGIC_BIG) && \ |
((x).f_magic!=MIPS_MAGIC_LITTLE2) && \ |
((x).f_magic!=MIPS_MAGIC_BIG2) && \ |
((x).f_magic!=MIPS_MAGIC_LITTLE3) && \ |
((x).f_magic!=MIPS_MAGIC_BIG3)) |
/********************** AOUT "OPTIONAL HEADER" **********************/ |
typedef struct external_aouthdr |
{ |
unsigned char magic[2]; /* type of file */ |
unsigned char vstamp[2]; /* version stamp */ |
unsigned char tsize[4]; /* text size in bytes, padded to FW bdry*/ |
unsigned char dsize[4]; /* initialized data " " */ |
unsigned char bsize[4]; /* uninitialized data " " */ |
unsigned char entry[4]; /* entry pt. */ |
unsigned char text_start[4]; /* base of text used for this file */ |
unsigned char data_start[4]; /* base of data used for this file */ |
unsigned char bss_start[4]; /* base of bss used for this file */ |
unsigned char gprmask[4]; /* ?? */ |
unsigned char cprmask[4][4]; /* ?? */ |
unsigned char gp_value[4]; /* value for gp register */ |
} AOUTHDR; |
/* compute size of a header */ |
#define AOUTSZ 56 |
#define AOUTHDRSZ 56 |
/********************** RELOCATION DIRECTIVES **********************/ |
struct external_reloc |
{ |
unsigned char r_vaddr[4]; |
unsigned char r_bits[4]; |
}; |
#define RELOC struct external_reloc |
#define RELSZ 8 |
/* MIPS ECOFF uses a packed 8 byte format for relocs. These constants |
are used to unpack the r_bits field. */ |
#define RELOC_BITS0_SYMNDX_SH_LEFT_BIG 16 |
#define RELOC_BITS0_SYMNDX_SH_LEFT_LITTLE 0 |
#define RELOC_BITS1_SYMNDX_SH_LEFT_BIG 8 |
#define RELOC_BITS1_SYMNDX_SH_LEFT_LITTLE 8 |
#define RELOC_BITS2_SYMNDX_SH_LEFT_BIG 0 |
#define RELOC_BITS2_SYMNDX_SH_LEFT_LITTLE 16 |
/* Originally, ECOFF used four bits for the reloc type and had three |
reserved bits. Irix 4 added another bit for the reloc type, which |
was easy because it was big endian and one of the spare bits became |
the new most significant bit. To make this also work for little |
endian ECOFF, we need to wrap one of the reserved bits around to |
become the most significant bit of the reloc type. */ |
#define RELOC_BITS3_TYPE_BIG 0x3E |
#define RELOC_BITS3_TYPE_SH_BIG 1 |
#define RELOC_BITS3_TYPE_LITTLE 0x78 |
#define RELOC_BITS3_TYPE_SH_LITTLE 3 |
#define RELOC_BITS3_TYPEHI_LITTLE 0x04 |
#define RELOC_BITS3_TYPEHI_SH_LITTLE 2 |
#define RELOC_BITS3_EXTERN_BIG 0x01 |
#define RELOC_BITS3_EXTERN_LITTLE 0x80 |
/* The r_type field in a reloc is one of the following values. I |
don't know if any other values can appear. These seem to be all |
that occur in the Ultrix 4.2 libraries. */ |
#define MIPS_R_IGNORE 0 |
#define MIPS_R_REFHALF 1 |
#define MIPS_R_REFWORD 2 |
#define MIPS_R_JMPADDR 3 |
#define MIPS_R_REFHI 4 |
#define MIPS_R_REFLO 5 |
#define MIPS_R_GPREL 6 |
#define MIPS_R_LITERAL 7 |
/* FIXME: This relocation is used (internally only) to represent branches |
when assembling. It should never appear in output files, and |
be removed. (It used to be used for embedded-PIC support.) */ |
#define MIPS_R_PCREL16 12 |
/********************** STABS **********************/ |
#define MIPS_IS_STAB ECOFF_IS_STAB |
#define MIPS_MARK_STAB ECOFF_MARK_STAB |
#define MIPS_UNMARK_STAB ECOFF_UNMARK_STAB |
/********************** SYMBOLIC INFORMATION **********************/ |
/* Written by John Gilmore. */ |
/* ECOFF uses COFF-like section structures, but its own symbol format. |
This file defines the symbol format in fields whose size and alignment |
will not vary on different host systems. */ |
/* File header as a set of bytes */ |
struct hdr_ext |
{ |
unsigned char h_magic[2]; |
unsigned char h_vstamp[2]; |
unsigned char h_ilineMax[4]; |
unsigned char h_cbLine[4]; |
unsigned char h_cbLineOffset[4]; |
unsigned char h_idnMax[4]; |
unsigned char h_cbDnOffset[4]; |
unsigned char h_ipdMax[4]; |
unsigned char h_cbPdOffset[4]; |
unsigned char h_isymMax[4]; |
unsigned char h_cbSymOffset[4]; |
unsigned char h_ioptMax[4]; |
unsigned char h_cbOptOffset[4]; |
unsigned char h_iauxMax[4]; |
unsigned char h_cbAuxOffset[4]; |
unsigned char h_issMax[4]; |
unsigned char h_cbSsOffset[4]; |
unsigned char h_issExtMax[4]; |
unsigned char h_cbSsExtOffset[4]; |
unsigned char h_ifdMax[4]; |
unsigned char h_cbFdOffset[4]; |
unsigned char h_crfd[4]; |
unsigned char h_cbRfdOffset[4]; |
unsigned char h_iextMax[4]; |
unsigned char h_cbExtOffset[4]; |
}; |
/* File descriptor external record */ |
struct fdr_ext |
{ |
unsigned char f_adr[4]; |
unsigned char f_rss[4]; |
unsigned char f_issBase[4]; |
unsigned char f_cbSs[4]; |
unsigned char f_isymBase[4]; |
unsigned char f_csym[4]; |
unsigned char f_ilineBase[4]; |
unsigned char f_cline[4]; |
unsigned char f_ioptBase[4]; |
unsigned char f_copt[4]; |
unsigned char f_ipdFirst[2]; |
unsigned char f_cpd[2]; |
unsigned char f_iauxBase[4]; |
unsigned char f_caux[4]; |
unsigned char f_rfdBase[4]; |
unsigned char f_crfd[4]; |
unsigned char f_bits1[1]; |
unsigned char f_bits2[3]; |
unsigned char f_cbLineOffset[4]; |
unsigned char f_cbLine[4]; |
}; |
#define FDR_BITS1_LANG_BIG 0xF8 |
#define FDR_BITS1_LANG_SH_BIG 3 |
#define FDR_BITS1_LANG_LITTLE 0x1F |
#define FDR_BITS1_LANG_SH_LITTLE 0 |
#define FDR_BITS1_FMERGE_BIG 0x04 |
#define FDR_BITS1_FMERGE_LITTLE 0x20 |
#define FDR_BITS1_FREADIN_BIG 0x02 |
#define FDR_BITS1_FREADIN_LITTLE 0x40 |
#define FDR_BITS1_FBIGENDIAN_BIG 0x01 |
#define FDR_BITS1_FBIGENDIAN_LITTLE 0x80 |
#define FDR_BITS2_GLEVEL_BIG 0xC0 |
#define FDR_BITS2_GLEVEL_SH_BIG 6 |
#define FDR_BITS2_GLEVEL_LITTLE 0x03 |
#define FDR_BITS2_GLEVEL_SH_LITTLE 0 |
/* We ignore the `reserved' field in bits2. */ |
/* Procedure descriptor external record */ |
struct pdr_ext |
{ |
unsigned char p_adr[4]; |
unsigned char p_isym[4]; |
unsigned char p_iline[4]; |
unsigned char p_regmask[4]; |
unsigned char p_regoffset[4]; |
unsigned char p_iopt[4]; |
unsigned char p_fregmask[4]; |
unsigned char p_fregoffset[4]; |
unsigned char p_frameoffset[4]; |
unsigned char p_framereg[2]; |
unsigned char p_pcreg[2]; |
unsigned char p_lnLow[4]; |
unsigned char p_lnHigh[4]; |
unsigned char p_cbLineOffset[4]; |
}; |
/* Runtime procedure table */ |
struct rpdr_ext |
{ |
unsigned char p_adr[4]; |
unsigned char p_regmask[4]; |
unsigned char p_regoffset[4]; |
unsigned char p_fregmask[4]; |
unsigned char p_fregoffset[4]; |
unsigned char p_frameoffset[4]; |
unsigned char p_framereg[2]; |
unsigned char p_pcreg[2]; |
unsigned char p_irpss[4]; |
unsigned char p_reserved[4]; |
unsigned char p_exception_info[4]; |
}; |
/* Line numbers */ |
struct line_ext |
{ |
unsigned char l_line[4]; |
}; |
/* Symbol external record */ |
struct sym_ext |
{ |
unsigned char s_iss[4]; |
unsigned char s_value[4]; |
unsigned char s_bits1[1]; |
unsigned char s_bits2[1]; |
unsigned char s_bits3[1]; |
unsigned char s_bits4[1]; |
}; |
#define SYM_BITS1_ST_BIG 0xFC |
#define SYM_BITS1_ST_SH_BIG 2 |
#define SYM_BITS1_ST_LITTLE 0x3F |
#define SYM_BITS1_ST_SH_LITTLE 0 |
#define SYM_BITS1_SC_BIG 0x03 |
#define SYM_BITS1_SC_SH_LEFT_BIG 3 |
#define SYM_BITS1_SC_LITTLE 0xC0 |
#define SYM_BITS1_SC_SH_LITTLE 6 |
#define SYM_BITS2_SC_BIG 0xE0 |
#define SYM_BITS2_SC_SH_BIG 5 |
#define SYM_BITS2_SC_LITTLE 0x07 |
#define SYM_BITS2_SC_SH_LEFT_LITTLE 2 |
#define SYM_BITS2_RESERVED_BIG 0x10 |
#define SYM_BITS2_RESERVED_LITTLE 0x08 |
#define SYM_BITS2_INDEX_BIG 0x0F |
#define SYM_BITS2_INDEX_SH_LEFT_BIG 16 |
#define SYM_BITS2_INDEX_LITTLE 0xF0 |
#define SYM_BITS2_INDEX_SH_LITTLE 4 |
#define SYM_BITS3_INDEX_SH_LEFT_BIG 8 |
#define SYM_BITS3_INDEX_SH_LEFT_LITTLE 4 |
#define SYM_BITS4_INDEX_SH_LEFT_BIG 0 |
#define SYM_BITS4_INDEX_SH_LEFT_LITTLE 12 |
/* External symbol external record */ |
struct ext_ext |
{ |
unsigned char es_bits1[1]; |
unsigned char es_bits2[1]; |
unsigned char es_ifd[2]; |
struct sym_ext es_asym; |
}; |
#define EXT_BITS1_JMPTBL_BIG 0x80 |
#define EXT_BITS1_JMPTBL_LITTLE 0x01 |
#define EXT_BITS1_COBOL_MAIN_BIG 0x40 |
#define EXT_BITS1_COBOL_MAIN_LITTLE 0x02 |
#define EXT_BITS1_WEAKEXT_BIG 0x20 |
#define EXT_BITS1_WEAKEXT_LITTLE 0x04 |
/* Dense numbers external record */ |
struct dnr_ext |
{ |
unsigned char d_rfd[4]; |
unsigned char d_index[4]; |
}; |
/* Relative file descriptor */ |
struct rfd_ext |
{ |
unsigned char rfd[4]; |
}; |
/* Optimizer symbol external record */ |
struct opt_ext |
{ |
unsigned char o_bits1[1]; |
unsigned char o_bits2[1]; |
unsigned char o_bits3[1]; |
unsigned char o_bits4[1]; |
struct rndx_ext o_rndx; |
unsigned char o_offset[4]; |
}; |
#define OPT_BITS2_VALUE_SH_LEFT_BIG 16 |
#define OPT_BITS2_VALUE_SH_LEFT_LITTLE 0 |
#define OPT_BITS3_VALUE_SH_LEFT_BIG 8 |
#define OPT_BITS3_VALUE_SH_LEFT_LITTLE 8 |
#define OPT_BITS4_VALUE_SH_LEFT_BIG 0 |
#define OPT_BITS4_VALUE_SH_LEFT_LITTLE 16 |
/contrib/toolchain/binutils/include/coff/mipspe.h |
---|
0,0 → 1,67 |
/* coff information for Windows CE with MIPS VR4111 |
Copyright 2000, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#define L_LNNO_SIZE 2 |
#define INCLUDE_COMDAT_FIELDS_IN_AUXENT |
#include "coff/external.h" |
#define MIPS_ARCH_MAGIC_WINCE 0x0166 /* Windows CE - little endian */ |
#define MIPS_PE_MAGIC 0x010b |
#define MIPSBADMAG(x) ((x).f_magic != MIPS_ARCH_MAGIC_WINCE) |
/* define some NT default values */ |
/* #define NT_IMAGE_BASE 0x400000 moved to internal.h */ |
#define NT_SECTION_ALIGNMENT 0x1000 |
#define NT_FILE_ALIGNMENT 0x200 |
#define NT_DEF_RESERVE 0x100000 |
#define NT_DEF_COMMIT 0x1000 |
/********************** RELOCATION DIRECTIVES **********************/ |
/* The external reloc has an offset field, because some of the reloc |
types on the h8 don't have room in the instruction for the entire |
offset - eg the strange jump and high page addressing modes. */ |
struct external_reloc |
{ |
char r_vaddr[4]; |
char r_symndx[4]; |
char r_type[2]; |
}; |
#define RELOC struct external_reloc |
#define RELSZ 10 |
/* MIPS PE relocation types. */ |
#define MIPS_R_ABSOLUTE 0 /* ignored */ |
#define MIPS_R_REFHALF 1 |
#define MIPS_R_REFWORD 2 |
#define MIPS_R_JMPADDR 3 |
#define MIPS_R_REFHI 4 /* PAIR follows */ |
#define MIPS_R_REFLO 5 |
#define MIPS_R_GPREL 6 |
#define MIPS_R_LITERAL 7 /* same as GPREL */ |
#define MIPS_R_SECTION 10 |
#define MIPS_R_SECREL 11 |
#define MIPS_R_SECRELLO 12 |
#define MIPS_R_SECRELHI 13 /* PAIR follows */ |
#define MIPS_R_RVA 34 /* 0x22 */ |
#define MIPS_R_PAIR 37 /* 0x25 - symndx is really a signed 16-bit addend */ |
/contrib/toolchain/binutils/include/coff/or32.h |
---|
0,0 → 1,288 |
/* COFF specification for OpenRISC 1000. |
Copyright (C) 1993-2000, 2002, 2010 Free Software Foundation, Inc. |
Contributed by David Wood @ New York University. |
Modified by Johan Rydberg, <johan.rydberg@netinsight.se> |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef OR32 |
# define OR32 |
#endif |
/* File Header and related definitions. */ |
struct external_filehdr |
{ |
char f_magic[2]; /* magic number */ |
char f_nscns[2]; /* number of sections */ |
char f_timdat[4]; /* time & date stamp */ |
char f_symptr[4]; /* file pointer to symtab */ |
char f_nsyms[4]; /* number of symtab entries */ |
char f_opthdr[2]; /* sizeof(optional hdr) */ |
char f_flags[2]; /* flags */ |
}; |
#define FILHDR struct external_filehdr |
#define FILHSZ 20 |
/* Magic numbers for OpenRISC 1000. As it is know we use the |
numbers for Am29000. |
(AT&T will assign the "real" magic number). */ |
#define SIPFBOMAGIC 0572 /* Am29000 (Byte 0 is MSB). */ |
#define SIPRBOMAGIC 0573 /* Am29000 (Byte 0 is LSB). */ |
#define OR32_MAGIC_BIG SIPFBOMAGIC |
#define OR32_MAGIC_LITTLE SIPRBOMAGIC |
#define OR32BADMAG(x) (((x).f_magic!=OR32_MAGIC_BIG) && \ |
((x).f_magic!=OR32_MAGIC_LITTLE)) |
#define OMAGIC OR32_MAGIC_BIG |
/* Optional (a.out) header. */ |
typedef struct external_aouthdr |
{ |
char magic[2]; /* type of file */ |
char vstamp[2]; /* version stamp */ |
char tsize[4]; /* text size in bytes, padded to FW bdry */ |
char dsize[4]; /* initialized data " " */ |
char bsize[4]; /* uninitialized data " " */ |
char entry[4]; /* entry pt. */ |
char text_start[4]; /* base of text used for this file */ |
char data_start[4]; /* base of data used for this file */ |
} AOUTHDR; |
#define AOUTSZ 28 |
#define AOUTHDRSZ 28 |
/* aouthdr magic numbers. */ |
#define NMAGIC 0410 /* separate i/d executable. */ |
#define SHMAGIC 0406 /* NYU/Ultra3 shared data executable |
(writable text). */ |
#define _ETEXT "_etext" |
/* Section header and related definitions. */ |
struct external_scnhdr |
{ |
char s_name[8]; /* section name */ |
char s_paddr[4]; /* physical address, aliased s_nlib */ |
char s_vaddr[4]; /* virtual address */ |
char s_size[4]; /* section size */ |
char s_scnptr[4]; /* file ptr to raw data for section */ |
char s_relptr[4]; /* file ptr to relocation */ |
char s_lnnoptr[4]; /* file ptr to line numbers */ |
char s_nreloc[2]; /* number of relocation entries */ |
char s_nlnno[2]; /* number of line number entries */ |
char s_flags[4]; /* flags */ |
}; |
#define SCNHDR struct external_scnhdr |
#define SCNHSZ 40 |
/* Names of "special" sections: */ |
#define _TEXT ".text" |
#define _DATA ".data" |
#define _BSS ".bss" |
#define _LIT ".lit" |
/* Section types - with additional section type for global |
registers which will be relocatable for the OpenRISC 1000. |
In instances where it is necessary for a linker to produce an |
output file which contains text or data not based at virtual |
address 0, e.g. for a ROM, then the linker should accept |
address base information as command input and use PAD sections |
to skip over unused addresses. */ |
#define STYP_BSSREG 0x1200 /* Global register area (like STYP_INFO) */ |
#define STYP_ENVIR 0x2200 /* Environment (like STYP_INFO) */ |
#define STYP_ABS 0x4000 /* Absolute (allocated, not reloc, loaded) */ |
/* Relocation information declaration and related definitions: */ |
struct external_reloc |
{ |
char r_vaddr[4]; /* (virtual) address of reference */ |
char r_symndx[4]; /* index into symbol table */ |
char r_type[2]; /* relocation type */ |
}; |
#define RELOC struct external_reloc |
#define RELSZ 10 /* sizeof (RELOC) */ |
/* Relocation types for the OpenRISC 1000: */ |
#define R_ABS 0 /* reference is absolute */ |
#define R_IREL 030 /* instruction relative (jmp/call) */ |
#define R_IABS 031 /* instruction absolute (jmp/call) */ |
#define R_ILOHALF 032 /* instruction low half (const) */ |
#define R_IHIHALF 033 /* instruction high half (consth) part 1 */ |
#define R_IHCONST 034 /* instruction high half (consth) part 2 */ |
/* constant offset of R_IHIHALF relocation */ |
#define R_BYTE 035 /* relocatable byte value */ |
#define R_HWORD 036 /* relocatable halfword value */ |
#define R_WORD 037 /* relocatable word value */ |
#define R_IGLBLRC 040 /* instruction global register RC */ |
#define R_IGLBLRA 041 /* instruction global register RA */ |
#define R_IGLBLRB 042 /* instruction global register RB */ |
/* |
NOTE: |
All the "I" forms refer to 29000 instruction formats. The linker is |
expected to know how the numeric information is split and/or aligned |
within the instruction word(s). R_BYTE works for instructions, too. |
If the parameter to a CONSTH instruction is a relocatable type, two |
relocation records are written. The first has an r_type of R_IHIHALF |
(33 octal) and a normal r_vaddr and r_symndx. The second relocation |
record has an r_type of R_IHCONST (34 octal), a normal r_vaddr (which |
is redundant), and an r_symndx containing the 32-bit constant offset |
to the relocation instead of the actual symbol table index. This |
second record is always written, even if the constant offset is zero. |
The constant fields of the instruction are set to zero. */ |
/* Line number entry declaration and related definitions: */ |
struct external_lineno |
{ |
union |
{ |
char l_symndx[4]; /* function name symbol index, iff l_lnno == 0*/ |
char l_paddr[4]; /* (physical) address of line number */ |
} |
l_addr; |
char l_lnno[2]; /* line number */ |
}; |
#define LINENO struct external_lineno |
#define LINESZ 6 /* sizeof (LINENO) */ |
/* Symbol entry declaration and related definitions: */ |
#define E_SYMNMLEN 8 /* Number of characters in a symbol name */ |
struct external_syment |
{ |
union |
{ |
char e_name[E_SYMNMLEN]; |
struct |
{ |
char e_zeroes[4]; |
char e_offset[4]; |
} |
e; |
} |
e; |
char e_value[4]; |
char e_scnum[2]; |
char e_type[2]; |
char e_sclass[1]; |
char e_numaux[1]; |
}; |
#define SYMENT struct external_syment |
#define SYMESZ 18 |
/* Storage class definitions - new classes for global registers: */ |
#define C_GLBLREG 19 /* global register */ |
#define C_EXTREG 20 /* external global register */ |
#define C_DEFREG 21 /* ext. def. of global register */ |
/* Derived symbol mask/shifts: */ |
#define N_BTMASK (0xf) |
#define N_BTSHFT (4) |
#define N_TMASK (0x30) |
#define N_TSHIFT (2) |
/* Auxiliary symbol table entry declaration and related |
definitions. */ |
#define E_FILNMLEN 14 /* # characters in a file name */ |
#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ |
union external_auxent |
{ |
struct |
{ |
char x_tagndx[4]; /* str, un, or enum tag indx */ |
union |
{ |
struct |
{ |
char x_lnno[2]; /* declaration line number */ |
char x_size[2]; /* str/union/array size */ |
} |
x_lnsz; |
char x_fsize[4]; /* size of function */ |
} |
x_misc; |
union |
{ |
struct /* if ISFCN, tag, or .bb */ |
{ |
char x_lnnoptr[4]; /* ptr to fcn line # */ |
char x_endndx[4]; /* entry ndx past block end */ |
} |
x_fcn; |
struct /* if ISARY, up to 4 dimen. */ |
{ |
char x_dimen[E_DIMNUM][2]; |
} |
x_ary; |
} |
x_fcnary; |
char x_tvndx[2]; /* tv index */ |
} |
x_sym; |
union |
{ |
char x_fname[E_FILNMLEN]; |
struct |
{ |
char x_zeroes[4]; |
char x_offset[4]; |
} |
x_n; |
} |
x_file; |
struct |
{ |
char x_scnlen[4]; /* section length */ |
char x_nreloc[2]; /* # relocation entries */ |
char x_nlinno[2]; /* # line numbers */ |
} |
x_scn; |
struct |
{ |
char x_tvfill[4]; /* tv fill value */ |
char x_tvlen[2]; /* length of .tv */ |
char x_tvran[2][2]; /* tv range */ |
} |
x_tv; /* info about .tv section |
(in auxent of symbol .tv)) */ |
}; |
#define AUXENT union external_auxent |
#define AUXESZ 18 |
/contrib/toolchain/binutils/include/coff/pe.h |
---|
0,0 → 1,512 |
/* pe.h - PE COFF header information |
Copyright 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007, 2009, 2010 |
Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _PE_H |
#define _PE_H |
/* NT specific file attributes. */ |
#define IMAGE_FILE_RELOCS_STRIPPED 0x0001 |
#define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 |
#define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 |
#define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008 |
#define IMAGE_FILE_AGGRESSIVE_WS_TRIM 0x0010 |
#define IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020 |
#define IMAGE_FILE_16BIT_MACHINE 0x0040 |
#define IMAGE_FILE_BYTES_REVERSED_LO 0x0080 |
#define IMAGE_FILE_32BIT_MACHINE 0x0100 |
#define IMAGE_FILE_DEBUG_STRIPPED 0x0200 |
#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 0x0400 |
#define IMAGE_FILE_NET_RUN_FROM_SWAP 0x0800 |
#define IMAGE_FILE_SYSTEM 0x1000 |
#define IMAGE_FILE_DLL 0x2000 |
#define IMAGE_FILE_UP_SYSTEM_ONLY 0x4000 |
#define IMAGE_FILE_BYTES_REVERSED_HI 0x8000 |
/* DllCharacteristics flag bits. The inconsistent naming may seem |
odd, but that is how they are defined in the PE specification. */ |
#define IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE 0x0040 |
#define IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY 0x0080 |
#define IMAGE_DLL_CHARACTERISTICS_NX_COMPAT 0x0100 |
#define IMAGE_DLLCHARACTERISTICS_NO_ISOLATION 0x0200 |
#define IMAGE_DLLCHARACTERISTICS_NO_SEH 0x0400 |
#define IMAGE_DLLCHARACTERISTICS_NO_BIND 0x0800 |
#define IMAGE_DLLCHARACTERISTICS_WDM_DRIVER 0x2000 |
#define IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE 0x8000 |
/* Additional flags to be set for section headers to allow the NT loader to |
read and write to the section data (to replace the addresses of data in |
dlls for one thing); also to execute the section in .text's case. */ |
#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 |
#define IMAGE_SCN_MEM_EXECUTE 0x20000000 |
#define IMAGE_SCN_MEM_READ 0x40000000 |
#define IMAGE_SCN_MEM_WRITE 0x80000000 |
/* Section characteristics added for ppc-nt. */ |
#define IMAGE_SCN_TYPE_NO_PAD 0x00000008 /* Reserved. */ |
#define IMAGE_SCN_CNT_CODE 0x00000020 /* Section contains code. */ |
#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 /* Section contains initialized data. */ |
#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 /* Section contains uninitialized data. */ |
#define IMAGE_SCN_LNK_OTHER 0x00000100 /* Reserved. */ |
#define IMAGE_SCN_LNK_INFO 0x00000200 /* Section contains comments or some other type of information. */ |
#define IMAGE_SCN_LNK_REMOVE 0x00000800 /* Section contents will not become part of image. */ |
#define IMAGE_SCN_LNK_COMDAT 0x00001000 /* Section contents comdat. */ |
#define IMAGE_SCN_MEM_FARDATA 0x00008000 |
#define IMAGE_SCN_MEM_PURGEABLE 0x00020000 |
#define IMAGE_SCN_MEM_16BIT 0x00020000 |
#define IMAGE_SCN_MEM_LOCKED 0x00040000 |
#define IMAGE_SCN_MEM_PRELOAD 0x00080000 |
/* Bit position in the s_flags field where the alignment values start. */ |
#define IMAGE_SCN_ALIGN_POWER_BIT_POS 20 |
#define IMAGE_SCN_ALIGN_POWER_BIT_MASK 0x00f00000 |
#define IMAGE_SCN_ALIGN_POWER_NUM(val) \ |
(((val) >> IMAGE_SCN_ALIGN_POWER_BIT_POS) - 1) |
#define IMAGE_SCN_ALIGN_POWER_CONST(val) \ |
(((val) + 1) << IMAGE_SCN_ALIGN_POWER_BIT_POS) |
#define IMAGE_SCN_ALIGN_1BYTES IMAGE_SCN_ALIGN_POWER_CONST (0) |
#define IMAGE_SCN_ALIGN_2BYTES IMAGE_SCN_ALIGN_POWER_CONST (1) |
#define IMAGE_SCN_ALIGN_4BYTES IMAGE_SCN_ALIGN_POWER_CONST (2) |
#define IMAGE_SCN_ALIGN_8BYTES IMAGE_SCN_ALIGN_POWER_CONST (3) |
/* Default alignment if no others are specified. */ |
#define IMAGE_SCN_ALIGN_16BYTES IMAGE_SCN_ALIGN_POWER_CONST (4) |
#define IMAGE_SCN_ALIGN_32BYTES IMAGE_SCN_ALIGN_POWER_CONST (5) |
#define IMAGE_SCN_ALIGN_64BYTES IMAGE_SCN_ALIGN_POWER_CONST (6) |
#define IMAGE_SCN_ALIGN_128BYTES IMAGE_SCN_ALIGN_POWER_CONST (7) |
#define IMAGE_SCN_ALIGN_256BYTES IMAGE_SCN_ALIGN_POWER_CONST (8) |
#define IMAGE_SCN_ALIGN_512BYTES IMAGE_SCN_ALIGN_POWER_CONST (9) |
#define IMAGE_SCN_ALIGN_1024BYTES IMAGE_SCN_ALIGN_POWER_CONST (10) |
#define IMAGE_SCN_ALIGN_2048BYTES IMAGE_SCN_ALIGN_POWER_CONST (11) |
#define IMAGE_SCN_ALIGN_4096BYTES IMAGE_SCN_ALIGN_POWER_CONST (12) |
#define IMAGE_SCN_ALIGN_8192BYTES IMAGE_SCN_ALIGN_POWER_CONST (13) |
/* Encode alignment power into IMAGE_SCN_ALIGN bits of s_flags */ |
#define COFF_ENCODE_ALIGNMENT(SECTION, ALIGNMENT_POWER) \ |
((SECTION).s_flags |= IMAGE_SCN_ALIGN_POWER_CONST ((ALIGNMENT_POWER))) |
#define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000 /* Section contains extended relocations. */ |
#define IMAGE_SCN_MEM_NOT_CACHED 0x04000000 /* Section is not cachable. */ |
#define IMAGE_SCN_MEM_NOT_PAGED 0x08000000 /* Section is not pageable. */ |
#define IMAGE_SCN_MEM_SHARED 0x10000000 /* Section is shareable. */ |
/* COMDAT selection codes. */ |
#define IMAGE_COMDAT_SELECT_NODUPLICATES (1) /* Warn if duplicates. */ |
#define IMAGE_COMDAT_SELECT_ANY (2) /* No warning. */ |
#define IMAGE_COMDAT_SELECT_SAME_SIZE (3) /* Warn if different size. */ |
#define IMAGE_COMDAT_SELECT_EXACT_MATCH (4) /* Warn if different. */ |
#define IMAGE_COMDAT_SELECT_ASSOCIATIVE (5) /* Base on other section. */ |
/* Machine numbers. */ |
#define IMAGE_FILE_MACHINE_UNKNOWN 0x0000 |
#define IMAGE_FILE_MACHINE_ALPHA 0x0184 |
#define IMAGE_FILE_MACHINE_ALPHA64 0x0284 |
#define IMAGE_FILE_MACHINE_AM33 0x01d3 |
#define IMAGE_FILE_MACHINE_AMD64 0x8664 |
#define IMAGE_FILE_MACHINE_ARM 0x01c0 |
#define IMAGE_FILE_MACHINE_AXP64 IMAGE_FILE_MACHINE_ALPHA64 |
#define IMAGE_FILE_MACHINE_CEE 0xc0ee |
#define IMAGE_FILE_MACHINE_CEF 0x0cef |
#define IMAGE_FILE_MACHINE_EBC 0x0ebc |
#define IMAGE_FILE_MACHINE_I386 0x014c |
#define IMAGE_FILE_MACHINE_IA64 0x0200 |
#define IMAGE_FILE_MACHINE_M32R 0x9041 |
#define IMAGE_FILE_MACHINE_M68K 0x0268 |
#define IMAGE_FILE_MACHINE_MIPS16 0x0266 |
#define IMAGE_FILE_MACHINE_MIPSFPU 0x0366 |
#define IMAGE_FILE_MACHINE_MIPSFPU16 0x0466 |
#define IMAGE_FILE_MACHINE_POWERPC 0x01f0 |
#define IMAGE_FILE_MACHINE_POWERPCFP 0x01f1 |
#define IMAGE_FILE_MACHINE_R10000 0x0168 |
#define IMAGE_FILE_MACHINE_R3000 0x0162 |
#define IMAGE_FILE_MACHINE_R4000 0x0166 |
#define IMAGE_FILE_MACHINE_SH3 0x01a2 |
#define IMAGE_FILE_MACHINE_SH3DSP 0x01a3 |
#define IMAGE_FILE_MACHINE_SH3E 0x01a4 |
#define IMAGE_FILE_MACHINE_SH4 0x01a6 |
#define IMAGE_FILE_MACHINE_SH5 0x01a8 |
#define IMAGE_FILE_MACHINE_THUMB 0x01c2 |
#define IMAGE_FILE_MACHINE_TRICORE 0x0520 |
#define IMAGE_FILE_MACHINE_WCEMIPSV2 0x0169 |
#define IMAGE_FILE_MACHINE_AMD64 0x8664 |
#define IMAGE_SUBSYSTEM_UNKNOWN 0 |
#define IMAGE_SUBSYSTEM_NATIVE 1 |
#define IMAGE_SUBSYSTEM_WINDOWS_GUI 2 |
#define IMAGE_SUBSYSTEM_WINDOWS_CUI 3 |
#define IMAGE_SUBSYSTEM_POSIX_CUI 7 |
#define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI 9 |
#define IMAGE_SUBSYSTEM_EFI_APPLICATION 10 |
#define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 11 |
#define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 12 |
#define IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER 13 |
#define IMAGE_SUBSYSTEM_XBOX 14 |
/* Magic values that are true for all dos/nt implementations. */ |
#define DOSMAGIC 0x5a4d |
#define NT_SIGNATURE 0x00004550 |
/* NT allows long filenames, we want to accommodate this. |
This may break some of the bfd functions. */ |
#undef FILNMLEN |
#define FILNMLEN 18 /* # characters in a file name. */ |
struct external_PEI_DOS_hdr |
{ |
/* DOS header fields - always at offset zero in the EXE file. */ |
char e_magic[2]; /* Magic number, 0x5a4d. */ |
char e_cblp[2]; /* Bytes on last page of file, 0x90. */ |
char e_cp[2]; /* Pages in file, 0x3. */ |
char e_crlc[2]; /* Relocations, 0x0. */ |
char e_cparhdr[2]; /* Size of header in paragraphs, 0x4. */ |
char e_minalloc[2]; /* Minimum extra paragraphs needed, 0x0. */ |
char e_maxalloc[2]; /* Maximum extra paragraphs needed, 0xFFFF. */ |
char e_ss[2]; /* Initial (relative) SS value, 0x0. */ |
char e_sp[2]; /* Initial SP value, 0xb8. */ |
char e_csum[2]; /* Checksum, 0x0. */ |
char e_ip[2]; /* Initial IP value, 0x0. */ |
char e_cs[2]; /* Initial (relative) CS value, 0x0. */ |
char e_lfarlc[2]; /* File address of relocation table, 0x40. */ |
char e_ovno[2]; /* Overlay number, 0x0. */ |
char e_res[4][2]; /* Reserved words, all 0x0. */ |
char e_oemid[2]; /* OEM identifier (for e_oeminfo), 0x0. */ |
char e_oeminfo[2]; /* OEM information; e_oemid specific, 0x0. */ |
char e_res2[10][2]; /* Reserved words, all 0x0. */ |
char e_lfanew[4]; /* File address of new exe header, usually 0x80. */ |
char dos_message[16][4]; /* Other stuff, always follow DOS header. */ |
}; |
struct external_PEI_IMAGE_hdr |
{ |
char nt_signature[4]; /* required NT signature, 0x4550. */ |
/* From standard header. */ |
char f_magic[2]; /* Magic number. */ |
char f_nscns[2]; /* Number of sections. */ |
char f_timdat[4]; /* Time & date stamp. */ |
char f_symptr[4]; /* File pointer to symtab. */ |
char f_nsyms[4]; /* Number of symtab entries. */ |
char f_opthdr[2]; /* Sizeof(optional hdr). */ |
char f_flags[2]; /* Flags. */ |
}; |
struct external_PEI_filehdr |
{ |
/* DOS header fields - always at offset zero in the EXE file. */ |
char e_magic[2]; /* Magic number, 0x5a4d. */ |
char e_cblp[2]; /* Bytes on last page of file, 0x90. */ |
char e_cp[2]; /* Pages in file, 0x3. */ |
char e_crlc[2]; /* Relocations, 0x0. */ |
char e_cparhdr[2]; /* Size of header in paragraphs, 0x4. */ |
char e_minalloc[2]; /* Minimum extra paragraphs needed, 0x0. */ |
char e_maxalloc[2]; /* Maximum extra paragraphs needed, 0xFFFF. */ |
char e_ss[2]; /* Initial (relative) SS value, 0x0. */ |
char e_sp[2]; /* Initial SP value, 0xb8. */ |
char e_csum[2]; /* Checksum, 0x0. */ |
char e_ip[2]; /* Initial IP value, 0x0. */ |
char e_cs[2]; /* Initial (relative) CS value, 0x0. */ |
char e_lfarlc[2]; /* File address of relocation table, 0x40. */ |
char e_ovno[2]; /* Overlay number, 0x0. */ |
char e_res[4][2]; /* Reserved words, all 0x0. */ |
char e_oemid[2]; /* OEM identifier (for e_oeminfo), 0x0. */ |
char e_oeminfo[2]; /* OEM information; e_oemid specific, 0x0. */ |
char e_res2[10][2]; /* Reserved words, all 0x0. */ |
char e_lfanew[4]; /* File address of new exe header, usually 0x80. */ |
char dos_message[16][4]; /* Other stuff, always follow DOS header. */ |
/* Note: additional bytes may be inserted before the signature. Use |
the e_lfanew field to find the actual location of the NT signature. */ |
char nt_signature[4]; /* required NT signature, 0x4550. */ |
/* From standard header. */ |
char f_magic[2]; /* Magic number. */ |
char f_nscns[2]; /* Number of sections. */ |
char f_timdat[4]; /* Time & date stamp. */ |
char f_symptr[4]; /* File pointer to symtab. */ |
char f_nsyms[4]; /* Number of symtab entries. */ |
char f_opthdr[2]; /* Sizeof(optional hdr). */ |
char f_flags[2]; /* Flags. */ |
}; |
#ifdef COFF_IMAGE_WITH_PE |
/* The filehdr is only weird in images. */ |
#undef FILHDR |
#define FILHDR struct external_PEI_filehdr |
#undef FILHSZ |
#define FILHSZ 152 |
#endif /* COFF_IMAGE_WITH_PE */ |
/* 32-bit PE a.out header: */ |
typedef struct |
{ |
AOUTHDR standard; |
/* NT extra fields; see internal.h for descriptions. */ |
char ImageBase[4]; |
char SectionAlignment[4]; |
char FileAlignment[4]; |
char MajorOperatingSystemVersion[2]; |
char MinorOperatingSystemVersion[2]; |
char MajorImageVersion[2]; |
char MinorImageVersion[2]; |
char MajorSubsystemVersion[2]; |
char MinorSubsystemVersion[2]; |
char Reserved1[4]; |
char SizeOfImage[4]; |
char SizeOfHeaders[4]; |
char CheckSum[4]; |
char Subsystem[2]; |
char DllCharacteristics[2]; |
char SizeOfStackReserve[4]; |
char SizeOfStackCommit[4]; |
char SizeOfHeapReserve[4]; |
char SizeOfHeapCommit[4]; |
char LoaderFlags[4]; |
char NumberOfRvaAndSizes[4]; |
/* IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; */ |
char DataDirectory[16][2][4]; /* 16 entries, 2 elements/entry, 4 chars. */ |
} PEAOUTHDR; |
#undef AOUTSZ |
#define AOUTSZ (AOUTHDRSZ + 196) |
/* Like PEAOUTHDR, except that the "standard" member has no BaseOfData |
(aka data_start) member and that some of the members are 8 instead |
of just 4 bytes long. */ |
typedef struct |
{ |
#ifdef AOUTHDRSZ64 |
AOUTHDR64 standard; |
#else |
AOUTHDR standard; |
#endif |
/* NT extra fields; see internal.h for descriptions. */ |
char ImageBase[8]; |
char SectionAlignment[4]; |
char FileAlignment[4]; |
char MajorOperatingSystemVersion[2]; |
char MinorOperatingSystemVersion[2]; |
char MajorImageVersion[2]; |
char MinorImageVersion[2]; |
char MajorSubsystemVersion[2]; |
char MinorSubsystemVersion[2]; |
char Reserved1[4]; |
char SizeOfImage[4]; |
char SizeOfHeaders[4]; |
char CheckSum[4]; |
char Subsystem[2]; |
char DllCharacteristics[2]; |
char SizeOfStackReserve[8]; |
char SizeOfStackCommit[8]; |
char SizeOfHeapReserve[8]; |
char SizeOfHeapCommit[8]; |
char LoaderFlags[4]; |
char NumberOfRvaAndSizes[4]; |
/* IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; */ |
char DataDirectory[16][2][4]; /* 16 entries, 2 elements/entry, 4 chars. */ |
} PEPAOUTHDR; |
#ifdef AOUTHDRSZ64 |
#define PEPAOUTSZ (AOUTHDRSZ64 + 196 + 5 * 4) /* = 240 */ |
#else |
#define PEPAOUTSZ 240 |
#endif |
#undef E_FILNMLEN |
#define E_FILNMLEN 18 /* # characters in a file name. */ |
/* Import Tyoes fot ILF format object files.. */ |
#define IMPORT_CODE 0 |
#define IMPORT_DATA 1 |
#define IMPORT_CONST 2 |
/* Import Name Tyoes for ILF format object files. */ |
#define IMPORT_ORDINAL 0 |
#define IMPORT_NAME 1 |
#define IMPORT_NAME_NOPREFIX 2 |
#define IMPORT_NAME_UNDECORATE 3 |
/* Weak external characteristics. */ |
#define IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY 1 |
#define IMAGE_WEAK_EXTERN_SEARCH_LIBRARY 2 |
#define IMAGE_WEAK_EXTERN_SEARCH_ALIAS 3 |
/* .pdata/.xdata defines and structures for x64 PE+ for exception handling. */ |
/* .pdata in exception directory. */ |
struct pex64_runtime_function |
{ |
bfd_vma rva_BeginAddress; |
bfd_vma rva_EndAddress; |
bfd_vma rva_UnwindData; |
unsigned int isChained : 1; |
}; |
struct external_pex64_runtime_function |
{ |
bfd_byte rva_BeginAddress[4]; |
bfd_byte rva_EndAddress[4]; |
bfd_byte rva_UnwindData[4]; |
}; |
/* If the lowest significant bit is set for rva_UnwindData RVA, it |
means that the unified RVA points to another pex64_runtime_function |
that this entry shares the unwind_info block with. */ |
#define PEX64_IS_RUNTIME_FUNCTION_CHAINED(PTR_RTF) \ |
(((PTR_RTF)->rva_UnwindData & 1) != 0) |
#define PEX64_GET_UNWINDDATA_UNIFIED_RVA(PTR_RTF) \ |
((PTR_RTF)->rva_UnwindData & ~1) |
/* The unwind codes. */ |
#define UWOP_PUSH_NONVOL 0 |
#define UWOP_ALLOC_LARGE 1 |
#define UWOP_ALLOC_SMALL 2 |
#define UWOP_SET_FPREG 3 |
#define UWOP_SAVE_NONVOL 4 |
#define UWOP_SAVE_NONVOL_FAR 5 |
#define UWOP_SAVE_XMM 6 |
#define UWOP_SAVE_XMM_FAR 7 |
#define UWOP_SAVE_XMM128 8 |
#define UWOP_SAVE_XMM128_FAR 9 |
#define UWOP_PUSH_MACHFRAME 10 |
struct pex64_unwind_code |
{ |
bfd_vma prologue_offset; |
/* Contains Frame offset, or frame allocation size. */ |
bfd_vma frame_addr; |
unsigned int uwop_code : 4; |
/* xmm, mm, or standard register from 0 - 15. */ |
unsigned int reg : 4; |
/* Used for UWOP_PUSH_MACHFRAME to indicate optional errorcode stack |
argument. */ |
unsigned int has_errorcode : 1; |
}; |
struct external_pex64_unwind_code |
{ |
bfd_byte dta[2]; |
}; |
#define PEX64_UNWCODE_CODE(VAL) ((VAL) & 0xf) |
#define PEX64_UNWCODE_INFO(VAL) (((VAL) >> 4) & 0xf) |
/* The unwind info. */ |
#define UNW_FLAG_NHANDLER 0 |
#define UNW_FLAG_EHANDLER 1 |
#define UNW_FLAG_UHANDLER 2 |
#define UNW_FLAG_FHANDLER 3 |
#define UNW_FLAG_CHAININFO 4 |
#define UNW_FLAG_MASK 0x1f |
struct pex64_unwind_info |
{ |
bfd_vma SizeOfBlock; |
bfd_byte Version; /* Values from 0 up to 7 are possible. */ |
bfd_byte Flags; /* Values from 0 up to 31 are possible. */ |
bfd_vma SizeOfPrologue; |
bfd_vma CountOfCodes; /* Amount of pex64_unwind_code elements. */ |
/* 0 = CFA, 1..15 are index of integer registers. */ |
unsigned int FrameRegister : 4; |
bfd_vma FrameOffset; |
bfd_vma sizeofUnwindCodes; |
bfd_byte *rawUnwindCodes; |
/* Valid for UNW_FLAG_EHANDLER and UNW_FLAG_UHANDLER. */ |
bfd_vma CountOfScopes; |
bfd_byte *rawScopeEntries; |
bfd_vma rva_ExceptionHandler; /* UNW_EHANDLER. */ |
bfd_vma rva_TerminationHandler; /* UNW_FLAG_UHANDLER. */ |
bfd_vma rva_FrameHandler; /* UNW_FLAG_FHANDLER. */ |
bfd_vma FrameHandlerArgument; /* UNW_FLAG_FHANDLER. */ |
bfd_vma rva_FunctionEntry; /* UNW_FLAG_CHAININFO. */ |
}; |
struct external_pex64_unwind_info |
{ |
bfd_byte Version_Flags; |
bfd_byte SizeOfPrologue; |
bfd_byte CountOfCodes; |
bfd_byte FrameRegisterOffset; |
/* external_pex64_unwind_code array. */ |
/* bfd_byte handler[4]; */ |
/* Optional language specific data. */ |
}; |
struct external_pex64_scope |
{ |
bfd_vma Count; |
}; |
struct pex64_scope |
{ |
bfd_byte Count[4]; |
}; |
struct pex64_scope_entry |
{ |
bfd_vma rva_BeginAddress; |
bfd_vma rva_EndAddress; |
bfd_vma rva_HandlerAddress; |
bfd_vma rva_JumpAddress; |
}; |
#define PEX64_SCOPE_ENTRY_SIZE 16 |
struct external_pex64_scope_entry |
{ |
bfd_byte rva_BeginAddress[4]; |
bfd_byte rva_EndAddress[4]; |
bfd_byte rva_HandlerAddress[4]; |
bfd_byte rva_JumpAddress[4]; |
}; |
#define PEX64_UWI_VERSION(VAL) ((VAL) & 7) |
#define PEX64_UWI_FLAGS(VAL) (((VAL) >> 3) & 0x1f) |
#define PEX64_UWI_FRAMEREG(VAL) ((VAL) & 0xf) |
#define PEX64_UWI_FRAMEOFF(VAL) (((VAL) >> 4) & 0xf) |
#define PEX64_UWI_SIZEOF_UWCODE_ARRAY(VAL) \ |
((((VAL) + 1) & ~1) * 2) |
#define PEX64_OFFSET_TO_UNWIND_CODE 0x4 |
#define PEX64_OFFSET_TO_HANDLER_RVA (COUNTOFUNWINDCODES) \ |
(PEX64_OFFSET_TO_UNWIND_CODE + \ |
PEX64_UWI_SIZEOF_UWCODE_ARRAY(COUNTOFUNWINDCODES)) |
#define PEX64_OFFSET_TO_SCOPE_COUNT(COUNTOFUNWINDCODES) \ |
(PEX64_OFFSET_TO_HANDLER_RVA(COUNTOFUNWINDCODES) + 4) |
#define PEX64_SCOPE_ENTRY(COUNTOFUNWINDCODES, IDX) \ |
(PEX64_OFFSET_TO_SCOPE_COUNT(COUNTOFUNWINDCODES) + \ |
PEX64_SCOPE_ENTRY_SIZE * (IDX)) |
#endif /* _PE_H */ |
/contrib/toolchain/binutils/include/coff/powerpc.h |
---|
0,0 → 1,59 |
/* Basic coff information for the PowerPC |
Based on coff/rs6000.h, coff/i386.h and others. |
Copyright 2001, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. |
Initial release: Kim Knuttila (krk@cygnus.com) */ |
#define L_LNNO_SIZE 2 |
#define INCLUDE_COMDAT_FIELDS_IN_AUXENT |
#include "coff/external.h" |
/* Bits for f_flags: |
F_RELFLG relocation info stripped from file |
F_EXEC file is executable (no unresolved external references) |
F_LNNO line numbers stripped from file |
F_LSYMS local symbols stripped from file |
F_AR32WR file has byte ordering of an AR32WR machine (e.g. vax). */ |
#define F_RELFLG (0x0001) |
#define F_EXEC (0x0002) |
#define F_LNNO (0x0004) |
#define F_LSYMS (0x0008) |
/* extra NT defines */ |
#define PPCMAGIC 0760 /* peeked on aa PowerPC Windows NT box */ |
#define DOSMAGIC 0x5a4d /* from arm.h, i386.h */ |
#define NT_SIGNATURE 0x00004550 /* from arm.h, i386.h */ |
/* from winnt.h */ |
#define IMAGE_NT_OPTIONAL_HDR_MAGIC 0x10b |
#define PPCBADMAG(x) ((x).f_magic != PPCMAGIC) |
/********************** RELOCATION DIRECTIVES **********************/ |
struct external_reloc |
{ |
char r_vaddr[4]; |
char r_symndx[4]; |
char r_type[2]; |
}; |
#define RELOC struct external_reloc |
#define RELSZ 10 |
/contrib/toolchain/binutils/include/coff/rs6000.h |
---|
0,0 → 1,353 |
/* IBM RS/6000 "XCOFF" file definitions for BFD. |
Copyright (C) 1990, 1991, 2001, 2010 Free Software Foundation, Inc. |
Written by Mimi Phuong-Thao Vo of IBM |
and John Gilmore of Cygnus Support. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/********************** FILE HEADER **********************/ |
struct external_filehdr { |
char f_magic[2]; /* magic number */ |
char f_nscns[2]; /* number of sections */ |
char f_timdat[4]; /* time & date stamp */ |
char f_symptr[4]; /* file pointer to symtab */ |
char f_nsyms[4]; /* number of symtab entries */ |
char f_opthdr[2]; /* sizeof(optional hdr) */ |
char f_flags[2]; /* flags */ |
}; |
/* IBM RS/6000 */ |
#define U802WRMAGIC 0730 /* writeable text segments **chh** */ |
#define U802ROMAGIC 0735 /* readonly sharable text segments */ |
#define U802TOCMAGIC 0737 /* readonly text segments and TOC */ |
#define BADMAG(x) \ |
((x).f_magic != U802ROMAGIC && (x).f_magic != U802WRMAGIC && \ |
(x).f_magic != U802TOCMAGIC) |
#define FILHDR struct external_filehdr |
#define FILHSZ 20 |
/********************** AOUT "OPTIONAL HEADER" **********************/ |
typedef struct |
{ |
unsigned char magic[2]; /* type of file */ |
unsigned char vstamp[2]; /* version stamp */ |
unsigned char tsize[4]; /* text size in bytes, padded to FW bdry */ |
unsigned char dsize[4]; /* initialized data " " */ |
unsigned char bsize[4]; /* uninitialized data " " */ |
unsigned char entry[4]; /* entry pt. */ |
unsigned char text_start[4]; /* base of text used for this file */ |
unsigned char data_start[4]; /* base of data used for this file */ |
unsigned char o_toc[4]; /* address of TOC */ |
unsigned char o_snentry[2]; /* section number of entry point */ |
unsigned char o_sntext[2]; /* section number of .text section */ |
unsigned char o_sndata[2]; /* section number of .data section */ |
unsigned char o_sntoc[2]; /* section number of TOC */ |
unsigned char o_snloader[2]; /* section number of .loader section */ |
unsigned char o_snbss[2]; /* section number of .bss section */ |
unsigned char o_algntext[2]; /* .text alignment */ |
unsigned char o_algndata[2]; /* .data alignment */ |
unsigned char o_modtype[2]; /* module type (??) */ |
unsigned char o_cputype[2]; /* cpu type */ |
unsigned char o_maxstack[4]; /* max stack size (??) */ |
unsigned char o_maxdata[4]; /* max data size (??) */ |
unsigned char o_resv2[12]; /* reserved */ |
} |
AOUTHDR; |
#define AOUTSZ 72 |
#define SMALL_AOUTSZ (28) |
#define AOUTHDRSZ 72 |
/********************** SECTION HEADER **********************/ |
struct external_scnhdr { |
char s_name[8]; /* section name */ |
char s_paddr[4]; /* physical address, aliased s_nlib */ |
char s_vaddr[4]; /* virtual address */ |
char s_size[4]; /* section size */ |
char s_scnptr[4]; /* file ptr to raw data for section */ |
char s_relptr[4]; /* file ptr to relocation */ |
char s_lnnoptr[4]; /* file ptr to line numbers */ |
char s_nreloc[2]; /* number of relocation entries */ |
char s_nlnno[2]; /* number of line number entries*/ |
char s_flags[4]; /* flags */ |
}; |
#define SCNHDR struct external_scnhdr |
#define SCNHSZ 40 |
/********************** LINE NUMBERS **********************/ |
/* 1 line number entry for every "breakpointable" source line in a section. |
* Line numbers are grouped on a per function basis; first entry in a function |
* grouping will have l_lnno = 0 and in place of physical address will be the |
* symbol table index of the function name. |
*/ |
struct external_lineno { |
union { |
char l_symndx[4]; /* function name symbol index, iff l_lnno == 0*/ |
char l_paddr[4]; /* (physical) address of line number */ |
} l_addr; |
char l_lnno[2]; /* line number */ |
}; |
#define LINENO struct external_lineno |
#define LINESZ 6 |
/********************** SYMBOLS **********************/ |
#define E_SYMNMLEN 8 /* # characters in a symbol name */ |
#define E_FILNMLEN 14 /* # characters in a file name */ |
#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ |
struct external_syment |
{ |
union { |
char e_name[E_SYMNMLEN]; |
struct { |
char e_zeroes[4]; |
char e_offset[4]; |
} e; |
} e; |
char e_value[4]; |
char e_scnum[2]; |
char e_type[2]; |
char e_sclass[1]; |
char e_numaux[1]; |
}; |
#define N_BTMASK (017) |
#define N_TMASK (060) |
#define N_BTSHFT (4) |
#define N_TSHIFT (2) |
union external_auxent { |
struct { |
char x_tagndx[4]; /* str, un, or enum tag indx */ |
union { |
struct { |
char x_lnno[2]; /* declaration line number */ |
char x_size[2]; /* str/union/array size */ |
} x_lnsz; |
char x_fsize[4]; /* size of function */ |
} x_misc; |
union { |
struct { /* if ISFCN, tag, or .bb */ |
char x_lnnoptr[4]; /* ptr to fcn line # */ |
char x_endndx[4]; /* entry ndx past block end */ |
} x_fcn; |
struct { /* if ISARY, up to 4 dimen. */ |
char x_dimen[E_DIMNUM][2]; |
} x_ary; |
} x_fcnary; |
char x_tvndx[2]; /* tv index */ |
} x_sym; |
struct { |
union { |
char x_fname[E_FILNMLEN]; |
struct { |
char x_zeroes[4]; |
char x_offset[4]; |
} x_n; |
} x_n; |
char x_ftype[1]; |
} x_file; |
struct { |
char x_scnlen[4]; /* section length */ |
char x_nreloc[2]; /* # relocation entries */ |
char x_nlinno[2]; /* # line numbers */ |
} x_scn; |
struct { |
char x_tvfill[4]; /* tv fill value */ |
char x_tvlen[2]; /* length of .tv */ |
char x_tvran[2][2]; /* tv range */ |
} x_tv; /* info about .tv section (in auxent of symbol .tv)) */ |
struct { |
unsigned char x_scnlen[4]; |
unsigned char x_parmhash[4]; |
unsigned char x_snhash[2]; |
unsigned char x_smtyp[1]; |
unsigned char x_smclas[1]; |
unsigned char x_stab[4]; |
unsigned char x_snstab[2]; |
} x_csect; |
}; |
#define SYMENT struct external_syment |
#define SYMESZ 18 |
#define AUXENT union external_auxent |
#define AUXESZ 18 |
#define DBXMASK 0x80 /* for dbx storage mask */ |
#define SYMNAME_IN_DEBUG(symptr) ((symptr)->n_sclass & DBXMASK) |
/********************** RELOCATION DIRECTIVES **********************/ |
struct external_reloc { |
char r_vaddr[4]; |
char r_symndx[4]; |
char r_size[1]; |
char r_type[1]; |
}; |
#define RELOC struct external_reloc |
#define RELSZ 10 |
#define DEFAULT_DATA_SECTION_ALIGNMENT 4 |
#define DEFAULT_BSS_SECTION_ALIGNMENT 4 |
#define DEFAULT_TEXT_SECTION_ALIGNMENT 4 |
/* For new sections we havn't heard of before */ |
#define DEFAULT_SECTION_ALIGNMENT 4 |
/* The ldhdr structure. This appears at the start of the .loader |
section. */ |
struct external_ldhdr |
{ |
bfd_byte l_version[4]; |
bfd_byte l_nsyms[4]; |
bfd_byte l_nreloc[4]; |
bfd_byte l_istlen[4]; |
bfd_byte l_nimpid[4]; |
bfd_byte l_impoff[4]; |
bfd_byte l_stlen[4]; |
bfd_byte l_stoff[4]; |
}; |
#define LDHDRSZ (8 * 4) |
struct external_ldsym |
{ |
union |
{ |
bfd_byte _l_name[E_SYMNMLEN]; |
struct |
{ |
bfd_byte _l_zeroes[4]; |
bfd_byte _l_offset[4]; |
} _l_l; |
} _l; |
bfd_byte l_value[4]; |
bfd_byte l_scnum[2]; |
bfd_byte l_smtype[1]; |
bfd_byte l_smclas[1]; |
bfd_byte l_ifile[4]; |
bfd_byte l_parm[4]; |
}; |
#define LDSYMSZ (8 + 3 * 4 + 2 + 2) |
struct external_ldrel |
{ |
bfd_byte l_vaddr[4]; |
bfd_byte l_symndx[4]; |
bfd_byte l_rtype[2]; |
bfd_byte l_rsecnm[2]; |
}; |
#define LDRELSZ (2 * 4 + 2 * 2) |
struct external_exceptab |
{ |
union { |
bfd_byte e_symndx[4]; |
bfd_byte e_paddr[4]; |
} e_addr; |
bfd_byte e_lang[1]; |
bfd_byte e_reason[1]; |
}; |
#define EXCEPTSZ (4 + 2) |
/******************** Core files *************************/ |
struct external_core_dumpx |
{ |
unsigned char c_signo[1]; |
unsigned char c_flag[1]; |
unsigned char c_entries[2]; |
unsigned char c_version[4]; |
unsigned char c_fdsinfox[8]; |
unsigned char c_loader[8]; |
unsigned char c_lsize[8]; |
unsigned char c_n_thr[4]; |
unsigned char c_reserved0[4]; |
unsigned char c_thr[8]; |
unsigned char c_segs[8]; |
unsigned char c_segregion[8]; |
unsigned char c_stack[8]; |
unsigned char c_stackorg[8]; |
unsigned char c_size[8]; |
unsigned char c_data[8]; |
unsigned char c_dataorg[8]; |
unsigned char c_datasize[8]; |
unsigned char c_sdorg[8]; |
unsigned char c_sdsize[8]; |
unsigned char c_vmmregions[8]; |
unsigned char c_vmm[8]; |
unsigned char c_impl[4]; |
unsigned char c_pad[4]; |
unsigned char c_cprs[8]; |
unsigned char c_reserved[7 * 8]; |
/* Followed by: |
- context of the faulting thread. |
- user structure. */ |
}; |
/* Core file verion. */ |
#define CORE_DUMPX_VERSION 0x0feeddb1 |
#define CORE_DUMPXX_VERSION 0x0feeddb2 |
struct external_ld_info32 |
{ |
unsigned char ldinfo_next[4]; |
unsigned char core_offset[4]; |
unsigned char ldinfo_textorg[4]; |
unsigned char ldinfo_textsize[4]; |
unsigned char ldinfo_dataorg[4]; |
unsigned char ldinfo_datasize[4]; |
unsigned char ldinfo_filename[2]; |
}; |
/contrib/toolchain/binutils/include/coff/rs6k64.h |
---|
0,0 → 1,275 |
/* IBM RS/6000 "XCOFF64" file definitions for BFD. |
Copyright (C) 2000, 2001, 2002, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/********************** FILE HEADER **********************/ |
struct external_filehdr |
{ |
char f_magic[2]; /* magic number */ |
char f_nscns[2]; /* number of sections */ |
char f_timdat[4]; /* time & date stamp */ |
char f_symptr[8]; /* file pointer to symtab */ |
char f_opthdr[2]; /* sizeof(optional hdr) */ |
char f_flags[2]; /* flags */ |
char f_nsyms[4]; /* number of symtab entries */ |
}; |
/* IBM RS/6000. */ |
#define U803XTOCMAGIC 0757 /* Aix 4.3 64-bit XCOFF */ |
#define U64_TOCMAGIC 0767 /* AIX 5+ 64-bit XCOFF */ |
#define BADMAG(x) ((x).f_magic != U803XTOCMAGIC && (x).f_magic != U64_TOCMAGIC) |
#define FILHDR struct external_filehdr |
#define FILHSZ 24 |
/********************** AOUT "OPTIONAL HEADER" **********************/ |
typedef struct |
{ |
unsigned char magic[2]; /* type of file */ |
unsigned char vstamp[2]; /* version stamp */ |
unsigned char o_debugger[4]; /* reserved */ |
unsigned char text_start[8]; /* base of text used for this file */ |
unsigned char data_start[8]; /* base of data used for this file */ |
unsigned char o_toc[8]; /* address of TOC */ |
unsigned char o_snentry[2]; /* section number of entry point */ |
unsigned char o_sntext[2]; /* section number of .text section */ |
unsigned char o_sndata[2]; /* section number of .data section */ |
unsigned char o_sntoc[2]; /* section number of TOC */ |
unsigned char o_snloader[2]; /* section number of .loader section */ |
unsigned char o_snbss[2]; /* section number of .bss section */ |
unsigned char o_algntext[2]; /* .text alignment */ |
unsigned char o_algndata[2]; /* .data alignment */ |
unsigned char o_modtype[2]; /* module type (??) */ |
unsigned char o_cputype[2]; /* cpu type */ |
unsigned char o_resv2[4]; /* reserved */ |
unsigned char tsize[8]; /* text size bytes, padded to FW bdry */ |
unsigned char dsize[8]; /* initialized data " " */ |
unsigned char bsize[8]; /* uninitialized data " " */ |
unsigned char entry[8]; /* entry pt. */ |
unsigned char o_maxstack[8]; /* max stack size (??) */ |
unsigned char o_maxdata[8]; /* max data size (??) */ |
unsigned char o_resv3[16]; /* reserved */ |
} |
AOUTHDR; |
#define AOUTSZ 120 |
#define SMALL_AOUTSZ (0) |
#define AOUTHDRSZ 72 |
/********************** SECTION HEADER **********************/ |
struct external_scnhdr |
{ |
char s_name[8]; /* section name */ |
char s_paddr[8]; /* physical address, aliased s_nlib */ |
char s_vaddr[8]; /* virtual address */ |
char s_size[8]; /* section size */ |
char s_scnptr[8]; /* file ptr to raw data for section */ |
char s_relptr[8]; /* file ptr to relocation */ |
char s_lnnoptr[8]; /* file ptr to line numbers */ |
char s_nreloc[4]; /* number of relocation entries */ |
char s_nlnno[4]; /* number of line number entries*/ |
char s_flags[4]; /* flags */ |
char s_pad[4]; /* padding */ |
}; |
#define SCNHDR struct external_scnhdr |
#define SCNHSZ 72 |
/********************** LINE NUMBERS **********************/ |
/* 1 line number entry for every "breakpointable" source line in a section. |
Line numbers are grouped on a per function basis; first entry in a function |
grouping will have l_lnno = 0 and in place of physical address will be the |
symbol table index of the function name. */ |
struct external_lineno |
{ |
union |
{ |
char l_symndx[4]; /* function name symbol index, iff l_lnno == 0*/ |
char l_paddr[8]; /* (physical) address of line number */ |
} l_addr; |
char l_lnno[4]; /* line number */ |
}; |
#define LINENO struct external_lineno |
#define LINESZ 12 |
/********************** SYMBOLS **********************/ |
#define E_SYMNMLEN 8 /* # characters in a symbol name */ |
#define E_FILNMLEN 14 /* # characters in a file name */ |
#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ |
struct external_syment |
{ |
char e_value[8]; |
char e_offset[4]; |
char e_scnum[2]; |
char e_type[2]; |
char e_sclass[1]; |
char e_numaux[1]; |
}; |
#define N_BTMASK (017) |
#define N_TMASK (060) |
#define N_BTSHFT (4) |
#define N_TSHIFT (2) |
union external_auxent |
{ |
struct { |
union { |
struct { |
char x_lnno[4]; /* declaration line number */ |
char x_size[2]; /* str/union/array size */ |
} x_lnsz; |
struct { |
char x_lnnoptr[8];/* ptr to fcn line */ |
char x_fsize[4]; /* size of function */ |
char x_endndx[4]; /* entry ndx past block end */ |
} x_fcn; |
} x_fcnary; |
} x_sym; |
struct { |
union { |
char x_fname[E_FILNMLEN]; |
struct { |
char x_zeroes[4]; |
char x_offset[4]; |
char x_pad[6]; |
} x_n; |
} x_n; |
unsigned char x_ftype[1]; |
unsigned char x_resv[2]; |
} x_file; |
struct { |
char x_exptr[8]; |
char x_fsize[4]; |
char x_endndx[4]; |
char x_pad[1]; |
} x_except; |
struct { |
unsigned char x_scnlen_lo[4]; |
unsigned char x_parmhash[4]; |
unsigned char x_snhash[2]; |
unsigned char x_smtyp[1]; |
unsigned char x_smclas[1]; |
unsigned char x_scnlen_hi[4]; |
unsigned char x_pad[1]; |
} x_csect; |
struct { |
char x_pad[17]; |
char x_auxtype[1]; |
} x_auxtype; |
}; |
#define SYMENT struct external_syment |
#define SYMESZ 18 |
#define AUXENT union external_auxent |
#define AUXESZ 18 |
#define DBXMASK 0x80 /* for dbx storage mask */ |
#define SYMNAME_IN_DEBUG(symptr) ((symptr)->n_sclass & DBXMASK) |
/* Values for auxtype field in XCOFF64, taken from AIX 4.3 sym.h. */ |
#define _AUX_EXCEPT 255 |
#define _AUX_FCN 254 |
#define _AUX_SYM 253 |
#define _AUX_FILE 252 |
#define _AUX_CSECT 251 |
/********************** RELOCATION DIRECTIVES **********************/ |
struct external_reloc |
{ |
char r_vaddr[8]; |
char r_symndx[4]; |
char r_size[1]; |
char r_type[1]; |
}; |
#define RELOC struct external_reloc |
#define RELSZ 14 |
#define DEFAULT_DATA_SECTION_ALIGNMENT 4 |
#define DEFAULT_BSS_SECTION_ALIGNMENT 4 |
#define DEFAULT_TEXT_SECTION_ALIGNMENT 4 |
/* For new sections we havn't heard of before */ |
#define DEFAULT_SECTION_ALIGNMENT 4 |
/* The ldhdr structure. This appears at the start of the .loader |
section. */ |
struct external_ldhdr |
{ |
bfd_byte l_version[4]; |
bfd_byte l_nsyms[4]; |
bfd_byte l_nreloc[4]; |
bfd_byte l_istlen[4]; |
bfd_byte l_nimpid[4]; |
bfd_byte l_stlen[4]; |
bfd_byte l_impoff[8]; |
bfd_byte l_stoff[8]; |
bfd_byte l_symoff[8]; |
bfd_byte l_rldoff[8]; |
}; |
#define LDHDRSZ (56) |
struct external_ldsym |
{ |
bfd_byte l_value[8]; |
bfd_byte l_offset[4]; |
bfd_byte l_scnum[2]; |
bfd_byte l_smtype[1]; |
bfd_byte l_smclas[1]; |
bfd_byte l_ifile[4]; |
bfd_byte l_parm[4]; |
}; |
#define LDSYMSZ (24) |
struct external_ldrel |
{ |
bfd_byte l_vaddr[8]; |
bfd_byte l_rtype[2]; |
bfd_byte l_rsecnm[2]; |
bfd_byte l_symndx[4]; |
}; |
#define LDRELSZ (16) |
struct external_exceptab |
{ |
union { |
bfd_byte e_symndx[4]; |
bfd_byte e_paddr[8]; |
} e_addr; |
bfd_byte e_lang[1]; |
bfd_byte e_reason[1]; |
}; |
#define EXCEPTSZ (10) |
/contrib/toolchain/binutils/include/coff/sh.h |
---|
0,0 → 1,148 |
/* coff information for Renesas SH |
Copyright 2000, 2003, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifdef COFF_WITH_PE |
#define L_LNNO_SIZE 2 |
#else |
#define L_LNNO_SIZE 4 |
#endif |
#define INCLUDE_COMDAT_FIELDS_IN_AUXENT |
#include "coff/external.h" |
#define SH_ARCH_MAGIC_BIG 0x0500 |
#define SH_ARCH_MAGIC_LITTLE 0x0550 /* Little endian SH */ |
#define SH_ARCH_MAGIC_WINCE 0x01a2 /* Windows CE - little endian */ |
#define SH_PE_MAGIC 0x010b |
#define SHBADMAG(x) \ |
(((x).f_magic != SH_ARCH_MAGIC_BIG) && \ |
((x).f_magic != SH_ARCH_MAGIC_WINCE) && \ |
((x).f_magic != SH_ARCH_MAGIC_LITTLE)) |
/* Define some NT default values. */ |
/* #define NT_IMAGE_BASE 0x400000 moved to internal.h */ |
#define NT_SECTION_ALIGNMENT 0x1000 |
#define NT_FILE_ALIGNMENT 0x200 |
#define NT_DEF_RESERVE 0x100000 |
#define NT_DEF_COMMIT 0x1000 |
/********************** RELOCATION DIRECTIVES **********************/ |
/* The external reloc has an offset field, because some of the reloc |
types on the h8 don't have room in the instruction for the entire |
offset - eg the strange jump and high page addressing modes. */ |
#ifndef COFF_WITH_PE |
struct external_reloc |
{ |
char r_vaddr[4]; |
char r_symndx[4]; |
char r_offset[4]; |
char r_type[2]; |
char r_stuff[2]; |
}; |
#else |
struct external_reloc |
{ |
char r_vaddr[4]; |
char r_symndx[4]; |
char r_type[2]; |
}; |
#endif |
#define RELOC struct external_reloc |
#ifdef COFF_WITH_PE |
#define RELSZ 10 |
#else |
#define RELSZ 16 |
#endif |
/* SH relocation types. Not all of these are actually used. */ |
#define R_SH_UNUSED 0 /* only used internally */ |
#define R_SH_IMM32CE 2 /* 32 bit immediate for WinCE */ |
#define R_SH_PCREL8 3 /* 8 bit pcrel */ |
#define R_SH_PCREL16 4 /* 16 bit pcrel */ |
#define R_SH_HIGH8 5 /* high 8 bits of 24 bit address */ |
#define R_SH_LOW16 7 /* low 16 bits of 24 bit immediate */ |
#define R_SH_IMM24 6 /* 24 bit immediate */ |
#define R_SH_PCDISP8BY4 9 /* PC rel 8 bits *4 +ve */ |
#define R_SH_PCDISP8BY2 10 /* PC rel 8 bits *2 +ve */ |
#define R_SH_PCDISP8 11 /* 8 bit branch */ |
#define R_SH_PCDISP 12 /* 12 bit branch */ |
#define R_SH_IMM32 14 /* 32 bit immediate */ |
#define R_SH_IMM8 16 /* 8 bit immediate */ |
#define R_SH_IMAGEBASE 16 /* Windows CE */ |
#define R_SH_IMM8BY2 17 /* 8 bit immediate *2 */ |
#define R_SH_IMM8BY4 18 /* 8 bit immediate *4 */ |
#define R_SH_IMM4 19 /* 4 bit immediate */ |
#define R_SH_IMM4BY2 20 /* 4 bit immediate *2 */ |
#define R_SH_IMM4BY4 21 /* 4 bit immediate *4 */ |
#define R_SH_PCRELIMM8BY2 22 /* PC rel 8 bits *2 unsigned */ |
#define R_SH_PCRELIMM8BY4 23 /* PC rel 8 bits *4 unsigned */ |
#define R_SH_IMM16 24 /* 16 bit immediate */ |
/* The switch table reloc types are used for relaxing. They are |
generated for expressions such as |
.word L1 - L2 |
The r_offset field holds the difference between the reloc address |
and L2. */ |
#define R_SH_SWITCH8 33 /* 8 bit switch table entry */ |
#define R_SH_SWITCH16 25 /* 16 bit switch table entry */ |
#define R_SH_SWITCH32 26 /* 32 bit switch table entry */ |
/* The USES reloc type is used for relaxing. The compiler will |
generate .uses pseudo-ops when it finds a function call which it |
can relax. The r_offset field of the USES reloc holds the PC |
relative offset to the instruction which loads the register used in |
the function call. */ |
#define R_SH_USES 27 /* .uses pseudo-op */ |
/* The COUNT reloc type is used for relaxing. The assembler will |
generate COUNT relocs for addresses referred to by the register |
loads associated with USES relocs. The r_offset field of the COUNT |
reloc holds the number of times the address is referenced in the |
object file. */ |
#define R_SH_COUNT 28 /* Count of constant pool uses */ |
/* The ALIGN reloc type is used for relaxing. The r_offset field is |
the power of two to which subsequent portions of the object file |
must be aligned. */ |
#define R_SH_ALIGN 29 /* .align pseudo-op */ |
/* The CODE and DATA reloc types are used for aligning load and store |
instructions. The assembler will generate a CODE reloc before a |
block of instructions. It will generate a DATA reloc before data. |
A section should be processed assuming it contains data, unless a |
CODE reloc is seen. The only relevant pieces of information in the |
CODE and DATA relocs are the section and the address. The symbol |
and offset are meaningless. */ |
#define R_SH_CODE 30 /* start of code */ |
#define R_SH_DATA 31 /* start of data */ |
/* The LABEL reloc type is used for aligning load and store |
instructions. The assembler will generate a LABEL reloc for each |
label within a block of instructions. This permits the linker to |
avoid swapping instructions which are the targets of branches. */ |
#define R_SH_LABEL 32 /* label */ |
/* NB: R_SH_SWITCH8 is 33 */ |
#define R_SH_LOOP_START 34 |
#define R_SH_LOOP_END 35 |
/contrib/toolchain/binutils/include/coff/sparc.h |
---|
0,0 → 1,156 |
/* coff information for Sparc. |
Copyright 2001, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* This file is an amalgamation of several standard include files that |
define coff format, such as filehdr.h, aouthdr.h, and so forth. In |
addition, all datatypes have been translated into character arrays of |
(presumed) equivalent size. This is necessary so that this file can |
be used with different systems while still yielding the same results. */ |
#define L_LNNO_SIZE 2 |
#define DO_NOT_DEFINE_SYMENT |
#define DO_NOT_DEFINE_AUXENT |
#include "coff/external.h" |
#define F_RELFLG (0x0001) /* relocation info stripped */ |
#define F_EXEC (0x0002) /* file is executable */ |
#define F_LNNO (0x0004) /* line numbers stripped */ |
#define F_LSYMS (0x0008) /* local symbols stripped */ |
#define SPARCMAGIC (0540) |
/* This is Lynx's all-platform magic number for executables. */ |
#define LYNXCOFFMAGIC (0415) |
#define OMAGIC 0404 /* object files, eg as output */ |
#define ZMAGIC 0413 /* demand load format, eg normal ld output */ |
#define STMAGIC 0401 /* target shlib */ |
#define SHMAGIC 0443 /* host shlib */ |
/* More names of "special" sections. */ |
#define _TV ".tv" |
#define _INIT ".init" |
#define _FINI ".fini" |
/********************** SYMBOLS **********************/ |
#define E_SYMNMLEN (8) /* # characters in a symbol name */ |
#define E_FILNMLEN (14) /* # characters in a file name */ |
#define E_DIMNUM (4) /* # array dimensions in auxiliary entry */ |
struct external_syment |
{ |
union { |
char e_name[E_SYMNMLEN]; |
struct { |
char e_zeroes[4]; |
char e_offset[4]; |
} e; |
#if 0 /* of doubtful value */ |
char e_nptr[2][4]; |
struct { |
char e_leading_zero[1]; |
char e_dbx_type[1]; |
char e_dbx_desc[2]; |
} e_dbx; |
#endif |
} e; |
char e_value[4]; |
char e_scnum[2]; |
char e_type[2]; |
char e_sclass[1]; |
char e_numaux[1]; |
char padding[2]; |
}; |
#define N_BTMASK (0xf) |
#define N_TMASK (0x30) |
#define N_BTSHFT (4) |
#define N_TSHIFT (2) |
union external_auxent |
{ |
struct { |
char x_tagndx[4]; /* str, un, or enum tag indx */ |
union { |
struct { |
char x_lnno[2]; /* declaration line number */ |
char x_size[2]; /* str/union/array size */ |
} x_lnsz; |
char x_fsize[4]; /* size of function */ |
} x_misc; |
union { |
struct { /* if ISFCN, tag, or .bb */ |
char x_lnnoptr[4]; /* ptr to fcn line # */ |
char x_endndx[4]; /* entry ndx past block end */ |
} x_fcn; |
struct { /* if ISARY, up to 4 dimen. */ |
char x_dimen[E_DIMNUM][2]; |
} x_ary; |
} x_fcnary; |
char x_tvndx[2]; /* tv index */ |
} x_sym; |
union { |
char x_fname[E_FILNMLEN]; |
struct { |
char x_zeroes[4]; |
char x_offset[4]; |
} x_n; |
} x_file; |
struct { |
char x_scnlen[4]; /* section length */ |
char x_nreloc[2]; /* # relocation entries */ |
char x_nlinno[2]; /* # line numbers */ |
} x_scn; |
struct { |
char x_tvfill[4]; /* tv fill value */ |
char x_tvlen[2]; /* length of .tv */ |
char x_tvran[2][2]; /* tv range */ |
} x_tv; /* .tv section info (in auxent of sym .tv)) */ |
char x_fill[20]; /* forces to 20-byte size */ |
}; |
#define SYMENT struct external_syment |
#define SYMESZ 20 |
#define AUXENT union external_auxent |
#define AUXESZ 20 |
#define _ETEXT "etext" |
/********************** RELOCATION DIRECTIVES **********************/ |
struct external_reloc |
{ |
char r_vaddr[4]; |
char r_symndx[4]; |
char r_type[2]; |
char r_spare[2]; |
char r_offset[4]; |
}; |
#define RELOC struct external_reloc |
#define RELSZ 16 |
/contrib/toolchain/binutils/include/coff/sym.h |
---|
0,0 → 1,484 |
/* Declarations of internal format of MIPS ECOFF symbols. |
Originally contributed by MIPS Computer Systems and Third Eye Software. |
Changes contributed by Cygnus Support are in the public domain. |
This file is just aggregated with the files that make up the GNU |
release; it is not considered part of GAS, GDB, or other GNU |
programs. */ |
/* |
* |-----------------------------------------------------------| |
* | Copyright (c) 1992, 1991, 1990 MIPS Computer Systems, Inc.| |
* | MIPS Computer Systems, Inc. grants reproduction and use | |
* | rights to all parties, PROVIDED that this comment is | |
* | maintained in the copy. | |
* |-----------------------------------------------------------| |
*/ |
#ifndef _SYM_H |
#define _SYM_H |
/* (C) Copyright 1984 by Third Eye Software, Inc. |
* |
* Third Eye Software, Inc. grants reproduction and use rights to |
* all parties, PROVIDED that this comment is maintained in the copy. |
* |
* Third Eye makes no claims about the applicability of this |
* symbol table to a particular use. |
*/ |
/* |
* This file contains the definition of the Third Eye Symbol Table. |
* |
* Symbols are assumed to be in 'encounter order' - i.e. the order that |
* the things they represent were encountered by the compiler/assembler/loader. |
* EXCEPT for globals! These are assumed to be bunched together, |
* probably right after the last 'normal' symbol. Globals ARE sorted |
* in ascending order. |
* |
* ----------------------------------------------------------------------- |
* A brief word about Third Eye naming/use conventions: |
* |
* All arrays and index's are 0 based. |
* All "ifooMax" values are the highest legal value PLUS ONE. This makes |
* them good for allocating arrays, etc. All checks are "ifoo < ifooMax". |
* |
* "isym" Index into the SYMbol table. |
* "ipd" Index into the Procedure Descriptor array. |
* "ifd" Index into the File Descriptor array. |
* "iss" Index into String Space. |
* "cb" Count of Bytes. |
* "rgPd" array whose domain is "0..ipdMax-1" and RanGe is PDR. |
* "rgFd" array whose domain is "0..ifdMax-1" and RanGe is FDR. |
*/ |
/* |
* Symbolic Header (HDR) structure. |
* As long as all the pointers are set correctly, |
* we don't care WHAT order the various sections come out in! |
* |
* A file produced solely for the use of CDB will probably NOT have |
* any instructions or data areas in it, as these are available |
* in the original. |
*/ |
typedef struct { |
short magic; /* to verify validity of the table */ |
short vstamp; /* version stamp */ |
long ilineMax; /* number of line number entries */ |
bfd_vma cbLine; /* number of bytes for line number entries */ |
bfd_vma cbLineOffset; /* offset to start of line number entries*/ |
long idnMax; /* max index into dense number table */ |
bfd_vma cbDnOffset; /* offset to start dense number table */ |
long ipdMax; /* number of procedures */ |
bfd_vma cbPdOffset; /* offset to procedure descriptor table */ |
long isymMax; /* number of local symbols */ |
bfd_vma cbSymOffset; /* offset to start of local symbols*/ |
long ioptMax; /* max index into optimization symbol entries */ |
bfd_vma cbOptOffset; /* offset to optimization symbol entries */ |
long iauxMax; /* number of auxillary symbol entries */ |
bfd_vma cbAuxOffset; /* offset to start of auxillary symbol entries*/ |
long issMax; /* max index into local strings */ |
bfd_vma cbSsOffset; /* offset to start of local strings */ |
long issExtMax; /* max index into external strings */ |
bfd_vma cbSsExtOffset; /* offset to start of external strings */ |
long ifdMax; /* number of file descriptor entries */ |
bfd_vma cbFdOffset; /* offset to file descriptor table */ |
long crfd; /* number of relative file descriptor entries */ |
bfd_vma cbRfdOffset; /* offset to relative file descriptor table */ |
long iextMax; /* max index into external symbols */ |
bfd_vma cbExtOffset; /* offset to start of external symbol entries*/ |
/* If you add machine dependent fields, add them here */ |
} HDRR, *pHDRR; |
#define cbHDRR sizeof(HDRR) |
#define hdrNil ((pHDRR)0) |
/* |
* The FDR and PDR structures speed mapping of address <-> name. |
* They are sorted in ascending memory order and are kept in |
* memory by CDB at runtime. |
*/ |
/* |
* File Descriptor |
* |
* There is one of these for EVERY FILE, whether compiled with |
* full debugging symbols or not. The name of a file should be |
* the path name given to the compiler. This allows the user |
* to simply specify the names of the directories where the COMPILES |
* were done, and we will be able to find their files. |
* A field whose comment starts with "R - " indicates that it will be |
* setup at runtime. |
*/ |
typedef struct fdr { |
bfd_vma adr; /* memory address of beginning of file */ |
long rss; /* file name (of source, if known) */ |
long issBase; /* file's string space */ |
bfd_vma cbSs; /* number of bytes in the ss */ |
long isymBase; /* beginning of symbols */ |
long csym; /* count file's of symbols */ |
long ilineBase; /* file's line symbols */ |
long cline; /* count of file's line symbols */ |
long ioptBase; /* file's optimization entries */ |
long copt; /* count of file's optimization entries */ |
unsigned short ipdFirst;/* start of procedures for this file */ |
short cpd; /* count of procedures for this file */ |
long iauxBase; /* file's auxiliary entries */ |
long caux; /* count of file's auxiliary entries */ |
long rfdBase; /* index into the file indirect table */ |
long crfd; /* count file indirect entries */ |
unsigned lang: 5; /* language for this file */ |
unsigned fMerge : 1; /* whether this file can be merged */ |
unsigned fReadin : 1; /* true if it was read in (not just created) */ |
unsigned fBigendian : 1;/* if set, was compiled on big endian machine */ |
/* aux's will be in compile host's sex */ |
unsigned glevel : 2; /* level this file was compiled with */ |
unsigned reserved : 22; /* reserved for future use */ |
bfd_vma cbLineOffset; /* byte offset from header for this file ln's */ |
bfd_vma cbLine; /* size of lines for this file */ |
} FDR, *pFDR; |
#define cbFDR sizeof(FDR) |
#define fdNil ((pFDR)0) |
#define ifdNil -1 |
#define ifdTemp 0 |
#define ilnNil -1 |
/* |
* Procedure Descriptor |
* |
* There is one of these for EVERY TEXT LABEL. |
* If a procedure is in a file with full symbols, then isym |
* will point to the PROC symbols, else it will point to the |
* global symbol for the label. |
*/ |
typedef struct pdr { |
bfd_vma adr; /* memory address of start of procedure */ |
long isym; /* start of local symbol entries */ |
long iline; /* start of line number entries*/ |
long regmask; /* save register mask */ |
long regoffset; /* save register offset */ |
long iopt; /* start of optimization symbol entries*/ |
long fregmask; /* save floating point register mask */ |
long fregoffset; /* save floating point register offset */ |
long frameoffset; /* frame size */ |
short framereg; /* frame pointer register */ |
short pcreg; /* offset or reg of return pc */ |
long lnLow; /* lowest line in the procedure */ |
long lnHigh; /* highest line in the procedure */ |
bfd_vma cbLineOffset; /* byte offset for this procedure from the fd base */ |
/* These fields are new for 64 bit ECOFF. */ |
unsigned gp_prologue : 8; /* byte size of GP prologue */ |
unsigned gp_used : 1; /* true if the procedure uses GP */ |
unsigned reg_frame : 1; /* true if register frame procedure */ |
unsigned prof : 1; /* true if compiled with -pg */ |
unsigned reserved : 13; /* reserved: must be zero */ |
unsigned localoff : 8; /* offset of local variables from vfp */ |
} PDR, *pPDR; |
#define cbPDR sizeof(PDR) |
#define pdNil ((pPDR) 0) |
#define ipdNil -1 |
/* |
* The structure of the runtime procedure descriptor created by the loader |
* for use by the static exception system. |
*/ |
/* |
* If 0'd out because exception_info chokes Visual C++ and because there |
* don't seem to be any references to this structure elsewhere in gdb. |
*/ |
#if 0 |
typedef struct runtime_pdr { |
bfd_vma adr; /* memory address of start of procedure */ |
long regmask; /* save register mask */ |
long regoffset; /* save register offset */ |
long fregmask; /* save floating point register mask */ |
long fregoffset; /* save floating point register offset */ |
long frameoffset; /* frame size */ |
short framereg; /* frame pointer register */ |
short pcreg; /* offset or reg of return pc */ |
long irpss; /* index into the runtime string table */ |
long reserved; |
struct exception_info *exception_info;/* pointer to exception array */ |
} RPDR, *pRPDR; |
#define cbRPDR sizeof(RPDR) |
#define rpdNil ((pRPDR) 0) |
#endif |
/* |
* Line Numbers |
* |
* Line Numbers are segregated from the normal symbols because they |
* are [1] smaller , [2] are of no interest to your |
* average loader, and [3] are never needed in the middle of normal |
* scanning and therefore slow things down. |
* |
* By definition, the first LINER for any given procedure will have |
* the first line of a procedure and represent the first address. |
*/ |
typedef long LINER, *pLINER; |
#define lineNil ((pLINER)0) |
#define cbLINER sizeof(LINER) |
#define ilineNil -1 |
/* |
* The Symbol Structure (GFW, to those who Know!) |
*/ |
typedef struct { |
long iss; /* index into String Space of name */ |
bfd_vma value; /* value of symbol */ |
unsigned st : 6; /* symbol type */ |
unsigned sc : 5; /* storage class - text, data, etc */ |
unsigned reserved : 1; /* reserved */ |
unsigned index : 20; /* index into sym/aux table */ |
} SYMR, *pSYMR; |
#define symNil ((pSYMR)0) |
#define cbSYMR sizeof(SYMR) |
#define isymNil -1 |
#define indexNil 0xfffff |
#define issNil -1 |
#define issNull 0 |
/* The following converts a memory resident string to an iss. |
* This hack is recognized in SbFIss, in sym.c of the debugger. |
*/ |
#define IssFSb(sb) (0x80000000 | ((unsigned long)(sb))) |
/* E X T E R N A L S Y M B O L R E C O R D |
* |
* Same as the SYMR except it contains file context to determine where |
* the index is. |
*/ |
typedef struct ecoff_extr { |
unsigned jmptbl:1; /* symbol is a jump table entry for shlibs */ |
unsigned cobol_main:1; /* symbol is a cobol main procedure */ |
unsigned weakext:1; /* symbol is weak external */ |
unsigned reserved:13; /* reserved for future use */ |
int ifd; /* where the iss and index fields point into */ |
SYMR asym; /* symbol for the external */ |
} EXTR, *pEXTR; |
#define extNil ((pEXTR)0) |
#define cbEXTR sizeof(EXTR) |
/* A U X I L L A R Y T Y P E I N F O R M A T I O N */ |
/* |
* Type Information Record |
*/ |
typedef struct { |
unsigned fBitfield : 1; /* set if bit width is specified */ |
unsigned continued : 1; /* indicates additional TQ info in next AUX */ |
unsigned bt : 6; /* basic type */ |
unsigned tq4 : 4; |
unsigned tq5 : 4; |
/* ---- 16 bit boundary ---- */ |
unsigned tq0 : 4; |
unsigned tq1 : 4; /* 6 type qualifiers - tqPtr, etc. */ |
unsigned tq2 : 4; |
unsigned tq3 : 4; |
} TIR, *pTIR; |
#define cbTIR sizeof(TIR) |
#define tiNil ((pTIR)0) |
#define itqMax 6 |
/* |
* Relative symbol record |
* |
* If the rfd field is 4095, the index field indexes into the global symbol |
* table. |
*/ |
typedef struct { |
unsigned rfd : 12; /* index into the file indirect table */ |
unsigned index : 20; /* index int sym/aux/iss tables */ |
} RNDXR, *pRNDXR; |
#define cbRNDXR sizeof(RNDXR) |
#define rndxNil ((pRNDXR)0) |
/* dense numbers or sometimes called block numbers are stored in this type, |
* a rfd of 0xffffffff is an index into the global table. |
*/ |
typedef struct { |
unsigned long rfd; /* index into the file table */ |
unsigned long index; /* index int sym/aux/iss tables */ |
} DNR, *pDNR; |
#define cbDNR sizeof(DNR) |
#define dnNil ((pDNR)0) |
/* |
* Auxillary information occurs only if needed. |
* It ALWAYS occurs in this order when present. |
isymMac used by stProc only |
TIR type info |
TIR additional TQ info (if first TIR was not enough) |
rndx if (bt == btStruct,btUnion,btEnum,btSet,btRange, |
btTypedef): |
rsym.index == iaux for btSet or btRange |
else rsym.index == isym |
dimLow btRange, btSet |
dimMac btRange, btSet |
rndx0 As many as there are tq arrays |
dimLow0 |
dimHigh0 |
... |
rndxMax-1 |
dimLowMax-1 |
dimHighMax-1 |
width in bits if (bit field), width in bits. |
*/ |
#define cAuxMax (6 + (idimMax*3)) |
/* a union of all possible info in the AUX universe */ |
typedef union { |
TIR ti; /* type information record */ |
RNDXR rndx; /* relative index into symbol table */ |
long dnLow; /* low dimension */ |
long dnHigh; /* high dimension */ |
long isym; /* symbol table index (end of proc) */ |
long iss; /* index into string space (not used) */ |
long width; /* width for non-default sized struc fields */ |
long count; /* count of ranges for variant arm */ |
} AUXU, *pAUXU; |
#define cbAUXU sizeof(AUXU) |
#define auxNil ((pAUXU)0) |
#define iauxNil -1 |
/* |
* Optimization symbols |
* |
* Optimization symbols contain some overlap information with the normal |
* symbol table. In particular, the proc information |
* is somewhat redundant but necessary to easily find the other information |
* present. |
* |
* All of the offsets are relative to the beginning of the last otProc |
*/ |
typedef struct { |
unsigned ot: 8; /* optimization type */ |
unsigned value: 24; /* address where we are moving it to */ |
RNDXR rndx; /* points to a symbol or opt entry */ |
unsigned long offset; /* relative offset this occured */ |
} OPTR, *pOPTR; |
#define optNil ((pOPTR) 0) |
#define cbOPTR sizeof(OPTR) |
#define ioptNil -1 |
/* |
* File Indirect |
* |
* When a symbol is referenced across files the following procedure is used: |
* 1) use the file index to get the File indirect entry. |
* 2) use the file indirect entry to get the File descriptor. |
* 3) add the sym index to the base of that file's sym table |
* |
*/ |
typedef long RFDT, *pRFDT; |
#define cbRFDT sizeof(RFDT) |
#define rfdNil -1 |
/* |
* The file indirect table in the mips loader is known as an array of FITs. |
* This is done to keep the code in the loader readable in the area where |
* these tables are merged. Note this is only a name change. |
*/ |
typedef long FIT, *pFIT; |
#define cbFIT sizeof(FIT) |
#define ifiNil -1 |
#define fiNil ((pFIT) 0) |
#ifdef _LANGUAGE_PASCAL |
#define ifdNil -1 |
#define ilnNil -1 |
#define ipdNil -1 |
#define ilineNil -1 |
#define isymNil -1 |
#define indexNil 16#fffff |
#define issNil -1 |
#define issNull 0 |
#define itqMax 6 |
#define iauxNil -1 |
#define ioptNil -1 |
#define rfdNil -1 |
#define ifiNil -1 |
#endif /* _LANGUAGE_PASCAL */ |
/* Dense numbers |
* |
* Rather than use file index, symbol index pairs to represent symbols |
* and globals, we use dense number so that they can be easily embeded |
* in intermediate code and the programs that process them can |
* use direct access tabls instead of hash table (which would be |
* necesary otherwise because of the sparse name space caused by |
* file index, symbol index pairs. Dense number are represented |
* by RNDXRs. |
*/ |
/* |
* The following table defines the meaning of each SYM field as |
* a function of the "st". (scD/B == scData OR scBss) |
* |
* Note: the value "isymMac" is used by symbols that have the concept |
* of enclosing a block of related information. This value is the |
* isym of the first symbol AFTER the end associated with the primary |
* symbol. For example if a procedure was at isym==90 and had an |
* isymMac==155, the associated end would be at isym==154, and the |
* symbol at 155 would probably (although not necessarily) be the |
* symbol for the next procedure. This allows rapid skipping over |
* internal information of various sorts. "stEnd"s ALWAYS have the |
* isym of the primary symbol that started the block. |
* |
ST SC VALUE INDEX |
-------- ------ -------- ------ |
stFile scText address isymMac |
stLabel scText address --- |
stGlobal scD/B address iaux |
stStatic scD/B address iaux |
stParam scAbs offset iaux |
stLocal scAbs offset iaux |
stProc scText address iaux (isymMac is first AUX) |
stStaticProc scText address iaux (isymMac is first AUX) |
stMember scNil ordinal --- (if member of enum) |
(mipsread thinks the case below has a bit, not byte, offset.) |
stMember scNil byte offset iaux (if member of struct/union) |
stMember scBits bit offset iaux (bit field spec) |
stBlock scText address isymMac (text block) |
(the code seems to think that rather than scNil, we see scInfo for |
the two cases below.) |
stBlock scNil cb isymMac (struct/union member define) |
stBlock scNil cMembers isymMac (enum member define) |
(New types added by SGI to simplify things:) |
stStruct scInfo cb isymMac (struct type define) |
stUnion scInfo cb isymMac (union type define) |
stEnum scInfo cMembers isymMac (enum type define) |
stEnd scText address isymStart |
stEnd scNil ------- isymStart (struct/union/enum) |
stTypedef scNil ------- iaux |
stRegReloc sc??? value old register number |
stForward sc??? new address isym to original symbol |
stConstant scInfo value --- (scalar) |
stConstant scInfo iss --- (complex, e.g. string) |
* |
*/ |
#endif |
/contrib/toolchain/binutils/include/coff/symconst.h |
---|
0,0 → 1,184 |
/* Declarations of constants for internal format of MIPS ECOFF symbols. |
Originally contributed by MIPS Computer Systems and Third Eye Software. |
Changes contributed by Cygnus Support are in the public domain. |
This file is just aggregated with the files that make up the GNU |
release; it is not considered part of GAS, GDB, or other GNU |
programs. */ |
/* |
* |-----------------------------------------------------------| |
* | Copyright (c) 1992, 1991, 1990 MIPS Computer Systems, Inc.| |
* | MIPS Computer Systems, Inc. grants reproduction and use | |
* | rights to all parties, PROVIDED that this comment is | |
* | maintained in the copy. | |
* |-----------------------------------------------------------| |
*/ |
/* (C) Copyright 1984 by Third Eye Software, Inc. |
* |
* Third Eye Software, Inc. grants reproduction and use rights to |
* all parties, PROVIDED that this comment is maintained in the copy. |
* |
* Third Eye makes no claims about the applicability of this |
* symbol table to a particular use. |
*/ |
/* glevels for field in FDR */ |
#define GLEVEL_0 2 |
#define GLEVEL_1 1 |
#define GLEVEL_2 0 /* for upward compat reasons. */ |
#define GLEVEL_3 3 |
/* magic number fo symheader */ |
#define magicSym 0x7009 |
/* The Alpha uses this value instead, for some reason. */ |
#define magicSym2 0x1992 |
/* Language codes */ |
#define langC 0 |
#define langPascal 1 |
#define langFortran 2 |
#define langAssembler 3 /* one Assembley inst might map to many mach */ |
#define langMachine 4 |
#define langNil 5 |
#define langAda 6 |
#define langPl1 7 |
#define langCobol 8 |
#define langStdc 9 /* FIXME: Collides with SGI langCplusplus */ |
#define langCplusplus 9 /* FIXME: Collides with langStdc */ |
#define langCplusplusV2 10 /* SGI addition */ |
#define langMax 11 /* maximum allowed 32 -- 5 bits */ |
/* The following are value definitions for the fields in the SYMR */ |
/* |
* Storage Classes |
*/ |
#define scNil 0 |
#define scText 1 /* text symbol */ |
#define scData 2 /* initialized data symbol */ |
#define scBss 3 /* un-initialized data symbol */ |
#define scRegister 4 /* value of symbol is register number */ |
#define scAbs 5 /* value of symbol is absolute */ |
#define scUndefined 6 /* who knows? */ |
#define scCdbLocal 7 /* variable's value is IN se->va.?? */ |
#define scBits 8 /* this is a bit field */ |
#define scCdbSystem 9 /* variable's value is IN CDB's address space */ |
#define scDbx 9 /* overlap dbx internal use */ |
#define scRegImage 10 /* register value saved on stack */ |
#define scInfo 11 /* symbol contains debugger information */ |
#define scUserStruct 12 /* address in struct user for current process */ |
#define scSData 13 /* load time only small data */ |
#define scSBss 14 /* load time only small common */ |
#define scRData 15 /* load time only read only data */ |
#define scVar 16 /* Var parameter (fortran,pascal) */ |
#define scCommon 17 /* common variable */ |
#define scSCommon 18 /* small common */ |
#define scVarRegister 19 /* Var parameter in a register */ |
#define scVariant 20 /* Variant record */ |
#define scSUndefined 21 /* small undefined(external) data */ |
#define scInit 22 /* .init section symbol */ |
#define scBasedVar 23 /* Fortran or PL/1 ptr based var */ |
#define scXData 24 /* exception handling data */ |
#define scPData 25 /* Procedure section */ |
#define scFini 26 /* .fini section */ |
#define scRConst 27 /* .rconst section */ |
#define scMax 32 |
/* |
* Symbol Types |
*/ |
#define stNil 0 /* Nuthin' special */ |
#define stGlobal 1 /* external symbol */ |
#define stStatic 2 /* static */ |
#define stParam 3 /* procedure argument */ |
#define stLocal 4 /* local variable */ |
#define stLabel 5 /* label */ |
#define stProc 6 /* " " Procedure */ |
#define stBlock 7 /* beginnning of block */ |
#define stEnd 8 /* end (of anything) */ |
#define stMember 9 /* member (of anything - struct/union/enum */ |
#define stTypedef 10 /* type definition */ |
#define stFile 11 /* file name */ |
#define stRegReloc 12 /* register relocation */ |
#define stForward 13 /* forwarding address */ |
#define stStaticProc 14 /* load time only static procs */ |
#define stConstant 15 /* const */ |
#define stStaParam 16 /* Fortran static parameters */ |
/* These new symbol types have been recently added to SGI machines. */ |
#define stStruct 26 /* Beginning of block defining a struct type */ |
#define stUnion 27 /* Beginning of block defining a union type */ |
#define stEnum 28 /* Beginning of block defining an enum type */ |
#define stIndirect 34 /* Indirect type specification */ |
/* Pseudo-symbols - internal to debugger */ |
#define stStr 60 /* string */ |
#define stNumber 61 /* pure number (ie. 4 NOR 2+2) */ |
#define stExpr 62 /* 2+2 vs. 4 */ |
#define stType 63 /* post-coersion SER */ |
#define stMax 64 |
/* definitions for fields in TIR */ |
/* type qualifiers for ti.tq0 -> ti.(itqMax-1) */ |
#define tqNil 0 /* bt is what you see */ |
#define tqPtr 1 /* pointer */ |
#define tqProc 2 /* procedure */ |
#define tqArray 3 /* duh */ |
#define tqFar 4 /* longer addressing - 8086/8 land */ |
#define tqVol 5 /* volatile */ |
#define tqConst 6 /* const */ |
#define tqMax 8 |
/* basic types as seen in ti.bt */ |
#define btNil 0 /* undefined (also, enum members) */ |
#define btAdr 1 /* address - integer same size as pointer */ |
#define btChar 2 /* character */ |
#define btUChar 3 /* unsigned character */ |
#define btShort 4 /* short */ |
#define btUShort 5 /* unsigned short */ |
#define btInt 6 /* int */ |
#define btUInt 7 /* unsigned int */ |
#define btLong 8 /* long */ |
#define btULong 9 /* unsigned long */ |
#define btFloat 10 /* float (real) */ |
#define btDouble 11 /* Double (real) */ |
#define btStruct 12 /* Structure (Record) */ |
#define btUnion 13 /* Union (variant) */ |
#define btEnum 14 /* Enumerated */ |
#define btTypedef 15 /* defined via a typedef, isymRef points */ |
#define btRange 16 /* subrange of int */ |
#define btSet 17 /* pascal sets */ |
#define btComplex 18 /* fortran complex */ |
#define btDComplex 19 /* fortran double complex */ |
#define btIndirect 20 /* forward or unnamed typedef */ |
#define btFixedDec 21 /* Fixed Decimal */ |
#define btFloatDec 22 /* Float Decimal */ |
#define btString 23 /* Varying Length Character String */ |
#define btBit 24 /* Aligned Bit String */ |
#define btPicture 25 /* Picture */ |
#define btVoid 26 /* void */ |
#define btLongLong 27 /* long long */ |
#define btULongLong 28 /* unsigned long long */ |
#define btLong64 30 /* long (64-bit) */ |
#define btULong64 31 /* unsigned long (64-bit) */ |
#define btLongLong64 32 /* long long (64-bit) */ |
#define btULongLong64 33 /* unsigned long long (64-bit) */ |
#define btAdr64 34 /* address (64-bit) */ |
#define btInt64 35 /* int (64-bit) */ |
#define btUInt64 36 /* unsigned int (64-bit) */ |
#define btMax 64 |
#if (_MFG == _MIPS) |
/* optimization type codes */ |
#define otNil 0 |
#define otReg 1 /* move var to reg */ |
#define otBlock 2 /* begin basic block */ |
#define otProc 3 /* procedure */ |
#define otInline 4 /* inline procedure */ |
#define otEnd 5 /* whatever you started */ |
#define otMax 6 /* KEEP UP TO DATE */ |
#endif /* (_MFG == _MIPS) */ |
/contrib/toolchain/binutils/include/coff/ti.h |
---|
0,0 → 1,561 |
/* COFF information for TI COFF support. Definitions in this file should be |
customized in a target-specific file, and then this file included (see |
tic54x.h for an example). |
Copyright 2000, 2001, 2002, 2003, 2005, 2008, 2009, 2010 |
Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef COFF_TI_H |
#define COFF_TI_H |
/* Note "coff/external.h is not used because TI adds extra fields to the structures. */ |
/********************** FILE HEADER **********************/ |
struct external_filehdr |
{ |
char f_magic[2]; /* magic number */ |
char f_nscns[2]; /* number of sections */ |
char f_timdat[4]; /* time & date stamp */ |
char f_symptr[4]; /* file pointer to symtab */ |
char f_nsyms[4]; /* number of symtab entries */ |
char f_opthdr[2]; /* sizeof(optional hdr) */ |
char f_flags[2]; /* flags */ |
char f_target_id[2]; /* magic no. (TI COFF-specific) */ |
}; |
/* COFF0 has magic number in f_magic, and omits f_target_id from the file |
header; for later versions, f_magic is 0xC1 for COFF1 and 0xC2 for COFF2 |
and the target-specific magic number is found in f_target_id */ |
#define TICOFF0MAGIC TI_TARGET_ID |
#define TICOFF1MAGIC 0x00C1 |
#define TICOFF2MAGIC 0x00C2 |
#define TICOFF_AOUT_MAGIC 0x0108 /* magic number in optional header */ |
#define TICOFF 1 /* customize coffcode.h */ |
/* The target_id field changes depending on the particular CPU target */ |
/* for COFF0, the target id appeared in f_magic, where COFFX magic is now */ |
#ifndef TI_TARGET_ID |
#error "TI_TARGET_ID needs to be defined for your CPU" |
#endif |
/* Which bfd_arch to use... */ |
#ifndef TICOFF_TARGET_ARCH |
#error "TICOFF_TARGET_ARCH needs to be defined for your CPU" |
#endif |
#ifndef TICOFF_TARGET_MACHINE_GET |
#define TICOFF_TARGET_MACHINE_GET(FLAGS) 0 |
#endif |
#ifndef TICOFF_TARGET_MACHINE_SET |
#define TICOFF_TARGET_MACHINE_SET(FLAGSP, MACHINE) |
#endif |
/* Default to COFF2 for file output */ |
#ifndef TICOFF_DEFAULT_MAGIC |
#define TICOFF_DEFAULT_MAGIC TICOFF2MAGIC |
#endif |
/* This value is made available in the rare case where a bfd is unavailable */ |
#ifndef OCTETS_PER_BYTE_POWER |
#error "OCTETS_PER_BYTE_POWER not defined for this CPU" |
#else |
#define OCTETS_PER_BYTE (1<<OCTETS_PER_BYTE_POWER) |
#endif |
/* default alignment is on a byte (not octet!) boundary */ |
#ifndef COFF_DEFAULT_SECTION_ALIGNMENT_POWER |
#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER 0 |
#endif |
/* TI COFF encodes the section alignment in the section header flags */ |
#define COFF_ALIGN_IN_SECTION_HEADER 1 |
#define COFF_ALIGN_IN_S_FLAGS 1 |
/* requires a power-of-two argument */ |
#define COFF_ENCODE_ALIGNMENT(S,X) ((S).s_flags |= (((unsigned)(X)&0xF)<<8)) |
/* result is a power of two */ |
#define COFF_DECODE_ALIGNMENT(X) (((X)>>8)&0xF) |
#define COFF0_P(ABFD) (bfd_coff_filhsz(ABFD) == FILHSZ_V0) |
#define COFF2_P(ABFD) (bfd_coff_scnhsz(ABFD) != SCNHSZ_V01) |
#define COFF0_BADMAG(x) ((x).f_magic != TICOFF0MAGIC) |
#define COFF1_BADMAG(x) ((x).f_magic != TICOFF1MAGIC || (x).f_target_id != TI_TARGET_ID) |
#define COFF2_BADMAG(x) ((x).f_magic != TICOFF2MAGIC || (x).f_target_id != TI_TARGET_ID) |
/* we need to read/write an extra field in the coff file header */ |
#ifndef COFF_ADJUST_FILEHDR_IN_POST |
#define COFF_ADJUST_FILEHDR_IN_POST(abfd, src, dst) \ |
do \ |
{ \ |
if (!COFF0_P (abfd)) \ |
((struct internal_filehdr *)(dst))->f_target_id = \ |
H_GET_16 (abfd, ((FILHDR *)(src))->f_target_id); \ |
} \ |
while (0) |
#endif |
#ifndef COFF_ADJUST_FILEHDR_OUT_POST |
#define COFF_ADJUST_FILEHDR_OUT_POST(abfd, src, dst) \ |
do \ |
{ \ |
if (!COFF0_P (abfd)) \ |
H_PUT_16 (abfd, ((struct internal_filehdr *)(src))->f_target_id, \ |
((FILHDR *)(dst))->f_target_id); \ |
} \ |
while (0) |
#endif |
#define FILHDR struct external_filehdr |
#define FILHSZ 22 |
#define FILHSZ_V0 20 /* COFF0 omits target_id field */ |
/* File header flags */ |
#define F_RELFLG (0x0001) |
#define F_EXEC (0x0002) |
#define F_LNNO (0x0004) |
#define F_VERS (0x0010) /* TMS320C4x code */ |
/* F_LSYMS needs to be redefined in your source file */ |
#define F_LSYMS_TICOFF (0x0010) /* normal COFF is 0x8 */ |
#define F_10 0x00 /* file built for TMS320C1x devices */ |
#define F_20 0x10 /* file built for TMS320C2x devices */ |
#define F_25 0x20 /* file built for TMS320C2x/C5x devices */ |
#define F_LENDIAN 0x0100 /* 16 bits/word, LSB first */ |
#define F_SYMMERGE 0x1000 /* duplicate symbols were removed */ |
/********************** OPTIONAL HEADER **********************/ |
typedef struct |
{ |
char magic[2]; /* type of file (0x108) */ |
char vstamp[2]; /* version stamp */ |
char tsize[4]; /* text size in bytes, padded to FW bdry*/ |
char dsize[4]; /* initialized data " " */ |
char bsize[4]; /* uninitialized data " " */ |
char entry[4]; /* entry pt. */ |
char text_start[4]; /* base of text used for this file */ |
char data_start[4]; /* base of data used for this file */ |
} |
AOUTHDR; |
#define AOUTHDRSZ 28 |
#define AOUTSZ 28 |
/********************** SECTION HEADER **********************/ |
/* COFF0, COFF1 */ |
struct external_scnhdr_v01 { |
char s_name[8]; /* section name */ |
char s_paddr[4]; /* physical address, aliased s_nlib */ |
char s_vaddr[4]; /* virtual address */ |
char s_size[4]; /* section size (in WORDS) */ |
char s_scnptr[4]; /* file ptr to raw data for section */ |
char s_relptr[4]; /* file ptr to relocation */ |
char s_lnnoptr[4]; /* file ptr to line numbers */ |
char s_nreloc[2]; /* number of relocation entries */ |
char s_nlnno[2]; /* number of line number entries*/ |
char s_flags[2]; /* flags */ |
char s_reserved[1]; /* reserved */ |
char s_page[1]; /* section page number (LOAD) */ |
}; |
/* COFF2 */ |
struct external_scnhdr { |
char s_name[8]; /* section name */ |
char s_paddr[4]; /* physical address, aliased s_nlib */ |
char s_vaddr[4]; /* virtual address */ |
char s_size[4]; /* section size (in WORDS) */ |
char s_scnptr[4]; /* file ptr to raw data for section */ |
char s_relptr[4]; /* file ptr to relocation */ |
char s_lnnoptr[4]; /* file ptr to line numbers */ |
char s_nreloc[4]; /* number of relocation entries */ |
char s_nlnno[4]; /* number of line number entries*/ |
char s_flags[4]; /* flags */ |
char s_reserved[2]; /* reserved */ |
char s_page[2]; /* section page number (LOAD) */ |
}; |
/* |
* Special section flags |
*/ |
/* TI COFF defines these flags; |
STYP_CLINK: the section should be excluded from the final |
linker output if there are no references found to any symbol in the section |
STYP_BLOCK: the section should be blocked, i.e. if the section would cross |
a page boundary, it is started at a page boundary instead. |
TI COFF puts the section alignment power of two in the section flags |
e.g. 2**N is alignment, flags |= (N & 0xF) << 8 |
*/ |
#define STYP_CLINK (0x4000) |
#define STYP_BLOCK (0x1000) |
#define STYP_ALIGN (0x0F00) /* TI COFF stores section alignment here */ |
#define SCNHDR_V01 struct external_scnhdr_v01 |
#define SCNHDR struct external_scnhdr |
#define SCNHSZ_V01 40 /* for v0 and v1 */ |
#define SCNHSZ 48 |
/* COFF2 changes the offsets and sizes of these fields |
Assume we're dealing with the COFF2 scnhdr structure, and adjust |
accordingly. Note: The GNU C versions of some of these macros |
are necessary in order to avoid compile time warnings triggered |
gcc's array bounds checking. The PUT_SCNHDR_PAGE macro also has |
the advantage on not evaluating LOC twice. */ |
#define GET_SCNHDR_NRELOC(ABFD, LOC) \ |
(COFF2_P (ABFD) ? H_GET_32 (ABFD, LOC) : H_GET_16 (ABFD, LOC)) |
#define PUT_SCNHDR_NRELOC(ABFD, VAL, LOC) \ |
(COFF2_P (ABFD) ? H_PUT_32 (ABFD, VAL, LOC) : H_PUT_16 (ABFD, VAL, LOC)) |
#ifdef __GNUC__ |
#define GET_SCNHDR_NLNNO(ABFD, LOC) \ |
({ \ |
int nlnno; \ |
char * ptr = (LOC); \ |
if (COFF2_P (ABFD)) \ |
nlnno = H_GET_32 (ABFD, ptr); \ |
else \ |
nlnno = H_GET_16 (ABFD, ptr - 2); \ |
nlnno; \ |
}) |
#define PUT_SCNHDR_NLNNO(ABFD, VAL, LOC) \ |
do \ |
{ \ |
char * ptr = (LOC); \ |
if (COFF2_P (ABFD)) \ |
H_PUT_32 (ABFD, VAL, ptr); \ |
else \ |
H_PUT_16 (ABFD, VAL, ptr - 2); \ |
} \ |
while (0) |
#define GET_SCNHDR_FLAGS(ABFD, LOC) \ |
({ \ |
int flags; \ |
char * ptr = (LOC); \ |
if (COFF2_P (ABFD)) \ |
flags = H_GET_32 (ABFD, ptr); \ |
else \ |
flags = H_GET_16 (ABFD, ptr - 4); \ |
flags; \ |
}) |
#define PUT_SCNHDR_FLAGS(ABFD, VAL, LOC) \ |
do \ |
{ \ |
char * ptr = (LOC); \ |
if (COFF2_P (ABFD)) \ |
H_PUT_32 (ABFD, VAL, ptr); \ |
else \ |
H_PUT_16 (ABFD, VAL, ptr - 4); \ |
} \ |
while (0) |
#define GET_SCNHDR_PAGE(ABFD, LOC) \ |
({ \ |
unsigned page; \ |
char * ptr = (LOC); \ |
if (COFF2_P (ABFD)) \ |
page = H_GET_16 (ABFD, ptr); \ |
else \ |
page = (unsigned) H_GET_8 (ABFD, ptr - 7); \ |
page; \ |
}) |
/* On output, make sure that the "reserved" field is zero. */ |
#define PUT_SCNHDR_PAGE(ABFD, VAL, LOC) \ |
do \ |
{ \ |
char * ptr = (LOC); \ |
if (COFF2_P (ABFD)) \ |
H_PUT_16 (ABFD, VAL, ptr); \ |
else \ |
{ \ |
H_PUT_8 (ABFD, VAL, ptr - 7); \ |
H_PUT_8 (ABFD, 0, ptr - 8); \ |
} \ |
} \ |
while (0) |
#else |
#define GET_SCNHDR_NLNNO(ABFD, LOC) \ |
(COFF2_P (ABFD) ? H_GET_32 (ABFD, LOC) : H_GET_16 (ABFD, (LOC) - 2)) |
#define PUT_SCNHDR_NLNNO(ABFD, VAL, LOC) \ |
(COFF2_P (ABFD) ? H_PUT_32 (ABFD, VAL, LOC) : H_PUT_16 (ABFD, VAL, (LOC) - 2)) |
#define GET_SCNHDR_FLAGS(ABFD, LOC) \ |
(COFF2_P (ABFD) ? H_GET_32 (ABFD, LOC) : H_GET_16 (ABFD, (LOC) - 4)) |
#define PUT_SCNHDR_FLAGS(ABFD, VAL, LOC) \ |
(COFF2_P (ABFD) ? H_PUT_32 (ABFD, VAL, LOC) : H_PUT_16 (ABFD, VAL, (LOC) - 4)) |
#define GET_SCNHDR_PAGE(ABFD, LOC) \ |
(COFF2_P (ABFD) ? H_GET_16 (ABFD, LOC) : (unsigned) H_GET_8 (ABFD, (LOC) - 7)) |
/* On output, make sure that the "reserved" field is zero. */ |
#define PUT_SCNHDR_PAGE(ABFD, VAL, LOC) \ |
(COFF2_P (ABFD) \ |
? H_PUT_16 (ABFD, VAL, LOC) \ |
: H_PUT_8 (ABFD, VAL, (LOC) - 7), H_PUT_8 (ABFD, 0, (LOC) - 8)) |
#endif |
/* TI COFF stores section size as number of bytes (address units, not octets), |
so adjust to be number of octets, which is what BFD expects */ |
#define GET_SCNHDR_SIZE(ABFD, SZP) \ |
(H_GET_32 (ABFD, SZP) * bfd_octets_per_byte (ABFD)) |
#define PUT_SCNHDR_SIZE(ABFD, SZ, SZP) \ |
H_PUT_32 (ABFD, (SZ) / bfd_octets_per_byte (ABFD), SZP) |
#define COFF_ADJUST_SCNHDR_IN_POST(ABFD, EXT, INT) \ |
do \ |
{ \ |
((struct internal_scnhdr *)(INT))->s_page = \ |
GET_SCNHDR_PAGE (ABFD, ((SCNHDR *)(EXT))->s_page); \ |
} \ |
while (0) |
/* The entire scnhdr may not be assigned. |
Ensure that everything is initialized. */ |
#define COFF_ADJUST_SCNHDR_OUT_PRE(ABFD, INT, EXT) \ |
do \ |
{ \ |
memset((EXT), 0, sizeof (SCNHDR)); \ |
} \ |
while (0) |
/* The line number and reloc overflow checking in coff_swap_scnhdr_out in |
coffswap.h doesn't use PUT_X for s_nlnno and s_nreloc. |
Due to different sized v0/v1/v2 section headers, we have to re-write these |
fields. |
*/ |
#define COFF_ADJUST_SCNHDR_OUT_POST(ABFD, INT, EXT) \ |
do \ |
{ \ |
PUT_SCNHDR_NLNNO (ABFD, ((struct internal_scnhdr *)(INT))->s_nlnno, \ |
((SCNHDR *)(EXT))->s_nlnno); \ |
PUT_SCNHDR_NRELOC (ABFD, ((struct internal_scnhdr *)(INT))->s_nreloc,\ |
((SCNHDR *)(EXT))->s_nreloc); \ |
PUT_SCNHDR_FLAGS (ABFD, ((struct internal_scnhdr *)(INT))->s_flags, \ |
((SCNHDR *)(EXT))->s_flags); \ |
PUT_SCNHDR_PAGE (ABFD, ((struct internal_scnhdr *)(INT))->s_page, \ |
((SCNHDR *)(EXT))->s_page); \ |
} \ |
while (0) |
/* |
* names of "special" sections |
*/ |
#define _TEXT ".text" |
#define _DATA ".data" |
#define _BSS ".bss" |
#define _CINIT ".cinit" /* initialized C data */ |
#define _SCONST ".const" /* constants */ |
#define _SWITCH ".switch" /* switch tables */ |
#define _STACK ".stack" /* C stack */ |
#define _SYSMEM ".sysmem" /* used for malloc et al. syscalls */ |
/********************** LINE NUMBERS **********************/ |
/* 1 line number entry for every "breakpointable" source line in a section. |
* Line numbers are grouped on a per function basis; first entry in a function |
* grouping will have l_lnno = 0 and in place of physical address will be the |
* symbol table index of the function name. |
*/ |
struct external_lineno { |
union { |
char l_symndx[4]; /* function name symbol index, iff l_lnno == 0*/ |
char l_paddr[4]; /* (physical) address of line number */ |
} l_addr; |
char l_lnno[2]; /* line number */ |
}; |
#define LINENO struct external_lineno |
#define LINESZ 6 |
/********************** SYMBOLS **********************/ |
/* NOTE: this is what a local label looks like in assembly source; what it |
looks like in COFF output is undefined */ |
#define TICOFF_LOCAL_LABEL_P(NAME) \ |
((NAME[0] == '$' && NAME[1] >= '0' && NAME[1] <= '9' && NAME[2] == '\0') \ |
|| NAME[strlen(NAME)-1] == '?') |
#define E_SYMNMLEN 8 /* # characters in a symbol name */ |
#define E_FILNMLEN 14 /* # characters in a file name */ |
#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ |
struct external_syment |
{ |
union { |
char e_name[E_SYMNMLEN]; |
struct { |
char e_zeroes[4]; |
char e_offset[4]; |
} e; |
} e; |
char e_value[4]; |
char e_scnum[2]; |
char e_type[2]; |
char e_sclass[1]; |
char e_numaux[1]; |
}; |
#define N_BTMASK (017) |
#define N_TMASK (060) |
#define N_BTSHFT (4) |
#define N_TSHIFT (2) |
union external_auxent { |
struct { |
char x_tagndx[4]; /* str, un, or enum tag indx */ |
union { |
struct { |
char x_lnno[2]; /* declaration line number */ |
char x_size[2]; /* str/union/array size */ |
} x_lnsz; |
char x_fsize[4]; /* size of function */ |
} x_misc; |
union { |
struct { /* if ISFCN, tag, or .bb */ |
char x_lnnoptr[4]; /* ptr to fcn line # */ |
char x_endndx[4]; /* entry ndx past block end */ |
} x_fcn; |
struct { /* if ISARY, up to 4 dimen. */ |
char x_dimen[E_DIMNUM][2]; |
} x_ary; |
} x_fcnary; |
char x_tvndx[2]; /* tv index */ |
} x_sym; |
union { |
char x_fname[E_FILNMLEN]; |
struct { |
char x_zeroes[4]; |
char x_offset[4]; |
} x_n; |
} x_file; |
struct { |
char x_scnlen[4]; /* section length */ |
char x_nreloc[2]; /* # relocation entries */ |
char x_nlinno[2]; /* # line numbers */ |
} x_scn; |
struct { |
char x_tvfill[4]; /* tv fill value */ |
char x_tvlen[2]; /* length of .tv */ |
char x_tvran[2][2]; /* tv range */ |
} x_tv; /* info about .tv section (in auxent of symbol .tv)) */ |
}; |
#define SYMENT struct external_syment |
#define SYMESZ 18 |
#define AUXENT union external_auxent |
#define AUXESZ 18 |
/* section lengths are in target bytes (not host bytes) */ |
#define GET_SCN_SCNLEN(ABFD, EXT) \ |
(H_GET_32 (ABFD, (EXT)->x_scn.x_scnlen) * bfd_octets_per_byte (ABFD)) |
#define PUT_SCN_SCNLEN(ABFD, INT, EXT) \ |
H_PUT_32 (ABFD, (INT) / bfd_octets_per_byte (ABFD), (EXT)->x_scn.x_scnlen) |
/* lnsz size is in bits in COFF file, in bytes in BFD */ |
#define GET_LNSZ_SIZE(abfd, ext) \ |
(H_GET_16 (abfd, ext->x_sym.x_misc.x_lnsz.x_size) / (in_class != C_FIELD ? 8 : 1)) |
#define PUT_LNSZ_SIZE(abfd, in, ext) \ |
H_PUT_16 (abfd, ((in_class != C_FIELD) ? (in) * 8 : (in)), \ |
ext->x_sym.x_misc.x_lnsz.x_size) |
/* TI COFF stores offsets for MOS and MOU in bits; BFD expects bytes |
Also put the load page flag of the section into the symbol value if it's an |
address. */ |
#ifndef NEEDS_PAGE |
#define NEEDS_PAGE(X) 0 |
#define PAGE_MASK 0 |
#endif |
#define COFF_ADJUST_SYM_IN_POST(ABFD, EXT, INT) \ |
do \ |
{ \ |
struct internal_syment *dst = (struct internal_syment *)(INT); \ |
if (dst->n_sclass == C_MOS || dst->n_sclass == C_MOU) \ |
dst->n_value /= 8; \ |
else if (NEEDS_PAGE (dst->n_sclass)) { \ |
asection *scn = coff_section_from_bfd_index (abfd, dst->n_scnum); \ |
dst->n_value |= (scn->lma & PAGE_MASK); \ |
} \ |
} \ |
while (0) |
#define COFF_ADJUST_SYM_OUT_POST(ABFD, INT, EXT) \ |
do \ |
{ \ |
struct internal_syment *src = (struct internal_syment *)(INT); \ |
SYMENT *dst = (SYMENT *)(EXT); \ |
if (src->n_sclass == C_MOU || src->n_sclass == C_MOS) \ |
H_PUT_32 (abfd, src->n_value * 8, dst->e_value); \ |
else if (NEEDS_PAGE (src->n_sclass)) { \ |
H_PUT_32 (abfd, src->n_value &= ~PAGE_MASK, dst->e_value); \ |
} \ |
} \ |
while (0) |
/* Detect section-relative absolute symbols so they get flagged with a sym |
index of -1. |
*/ |
#define SECTION_RELATIVE_ABSOLUTE_SYMBOL_P(RELOC, SECT) \ |
((*(RELOC)->sym_ptr_ptr)->section->output_section == (SECT) \ |
&& (RELOC)->howto->name[0] == 'A') |
/********************** RELOCATION DIRECTIVES **********************/ |
struct external_reloc_v0 |
{ |
char r_vaddr[4]; |
char r_symndx[2]; |
char r_reserved[2]; |
char r_type[2]; |
}; |
struct external_reloc |
{ |
char r_vaddr[4]; |
char r_symndx[4]; |
char r_reserved[2]; /* extended pmad byte for COFF2 */ |
char r_type[2]; |
}; |
#define RELOC struct external_reloc |
#define RELSZ_V0 10 /* FIXME -- coffcode.h needs fixing */ |
#define RELSZ 12 /* for COFF1/2 */ |
#define SWAP_OUT_RELOC_EXTRA(abfd, src, dst) \ |
do memset (dst->r_reserved, 0, sizeof (dst->r_reserved)); while (0) |
/* various relocation types. */ |
#define R_ABS 0x0000 /* no relocation */ |
#define R_REL13 0x002A /* 13-bit direct reference (???) */ |
#define R_PARTLS7 0x0028 /* 7 LSBs of an address */ |
#define R_PARTMS9 0x0029 /* 9MSBs of an address */ |
#define R_EXTWORD 0x002B /* 23-bit direct reference */ |
#define R_EXTWORD16 0x002C /* 16-bit direct reference to 23-bit addr*/ |
#define R_EXTWORDMS7 0x002D /* upper 7 bits of 23-bit address */ |
#endif /* COFF_TI_H */ |
/contrib/toolchain/binutils/include/coff/tic30.h |
---|
0,0 → 1,51 |
/* coff information for Texas Instruments TMS320C3X |
Copyright 2001, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#define L_LNNO_SIZE 4 |
#include "coff/external.h" |
#define TIC30MAGIC 0xC000 |
#define TIC30BADMAG(x) (((x).f_magic != TIC30MAGIC)) |
/********************** RELOCATION DIRECTIVES **********************/ |
/* The external reloc has an offset field, because some of the reloc |
types on the z8k don't have room in the instruction for the entire |
offset - eg with segments */ |
struct external_reloc |
{ |
char r_vaddr[4]; |
char r_symndx[4]; |
char r_offset[4]; |
char r_type[2]; |
char r_stuff[2]; |
}; |
#define RELOC struct external_reloc |
#define RELSZ 16 |
/* TMS320C30 relocation types. */ |
#define R_TIC30_ABS16 0x100 /* 16 bit absolute. */ |
#define R_TIC30_ABS24 0x101 /* 24 bit absolute. */ |
#define R_TIC30_ABS32 0x102 /* 32 bit absolute. */ |
#define R_TIC30_LDP 0x103 /* LDP bits 23-16 to 7-0. */ |
#define R_TIC30_PC16 0x104 /* 16 bit pc relative. */ |
/contrib/toolchain/binutils/include/coff/tic4x.h |
---|
0,0 → 1,47 |
/* TI COFF information for Texas Instruments TMS320C4X/C3X. |
This file customizes the settings in coff/ti.h. |
Copyright 2002, 2003, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef COFF_TIC4X_H |
#define COFF_TIC4X_H |
#define TIC4X_TARGET_ID 0x0093 |
/* Octets per byte, as a power of two. */ |
#define TI_TARGET_ID TIC4X_TARGET_ID |
#define OCTETS_PER_BYTE_POWER 2 |
/* Add to howto to get absolute/sect-relative version. */ |
#define HOWTO_BANK 6 |
#define TICOFF_TARGET_ARCH bfd_arch_tic4x |
/* We use COFF2. */ |
#define TICOFF_DEFAULT_MAGIC TICOFF2MAGIC |
#define TICOFF_TARGET_MACHINE_GET(FLAGS) \ |
(((FLAGS) & F_VERS) ? bfd_mach_tic4x : bfd_mach_tic3x) |
#define TICOFF_TARGET_MACHINE_SET(FLAGSP, MACHINE) \ |
do \ |
{ \ |
if ((MACHINE) == bfd_mach_tic4x) \ |
*(FLAGSP) |= F_VERS; \ |
} \ |
while (0) |
#include "coff/ti.h" |
#endif /* COFF_TIC4X_H */ |
/contrib/toolchain/binutils/include/coff/tic54x.h |
---|
0,0 → 1,60 |
/* TI COFF information for Texas Instruments TMS320C54X. |
This file customizes the settings in coff/ti.h. |
Copyright 2000, 2001, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef COFF_TIC54X_H |
#define COFF_TIC54X_H |
#define TIC54X_TARGET_ID 0x98 |
#define TIC54XALGMAGIC 0x009B /* c54x algebraic assembler output */ |
#define TIC5X_TARGET_ID 0x92 |
#define TI_TARGET_ID TIC54X_TARGET_ID |
#define OCTETS_PER_BYTE_POWER 1 /* octets per byte, as a power of two */ |
#define HOWTO_BANK 6 /* add to howto to get absolute/sect-relative version */ |
#define TICOFF_TARGET_ARCH bfd_arch_tic54x |
#define TICOFF_DEFAULT_MAGIC TICOFF1MAGIC /* we use COFF1 for compatibility */ |
/* Page macros |
The first GDB port requires flags in its remote memory access commands to |
distinguish between data/prog space. Hopefully we can make this go away |
eventually. Stuff the page in the upper bits of a 32-bit address, since |
the c5x family only uses 16 or 23 bits. |
c2x, c5x and most c54x devices have 16-bit addresses, but the c548 has |
23-bit program addresses. Make sure the page flags don't interfere. |
These flags are used by GDB to identify the destination page for |
addresses. |
*/ |
/* Recognized load pages (by common convention). */ |
#define PG_PROG 0x0 /* PROG page */ |
#define PG_DATA 0x1 /* DATA page */ |
#define PG_IO 0x2 /* I/O page */ |
/** Indicate whether the given storage class requires a page flag. */ |
#define NEEDS_PAGE(X) ((X)==C_EXT) |
#define PAGE_MASK 0xFF000000 |
#define ADDR_MASK 0x00FFFFFF |
#define PG_TO_FLAG(p) (((unsigned long)(p) & 0xFF) << 24) |
#define FLAG_TO_PG(f) (((f) >> 24) & 0xFF) |
#include "coff/ti.h" |
#endif /* COFF_TIC54X_H */ |
/contrib/toolchain/binutils/include/coff/tic80.h |
---|
0,0 → 1,123 |
/* coff information for TI TMS320C80 (MVP) |
Copyright 2001, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#define DO_NOT_DEFINE_FILHDR |
#define DO_NOT_DEFINE_SCNHDR |
#define L_LNNO_SIZE 2 |
#include "coff/external.h" |
/********************** FILE HEADER **********************/ |
struct external_filehdr |
{ |
char f_magic[2]; /* magic number */ |
char f_nscns[2]; /* number of sections */ |
char f_timdat[4]; /* time & date stamp */ |
char f_symptr[4]; /* file pointer to symtab */ |
char f_nsyms[4]; /* number of symtab entries */ |
char f_opthdr[2]; /* sizeof(optional hdr) */ |
char f_flags[2]; /* flags */ |
char f_target_id[2];/* target id (TIc80 specific) */ |
}; |
#define TIC80_ARCH_MAGIC 0x0C1 /* Goes in the file header magic number field */ |
#define TIC80_TARGET_ID 0x95 /* Goes in the target id field */ |
#define TIC80BADMAG(x) ((x).f_magic != TIC80_ARCH_MAGIC) |
#define FILHDR struct external_filehdr |
#define FILHSZ 22 |
#define TIC80_AOUTHDR_MAGIC 0x108 /* Goes in the optional file header magic number field */ |
/********************** SECTION HEADER **********************/ |
struct external_scnhdr |
{ |
char s_name[8]; /* section name */ |
char s_paddr[4]; /* physical address, aliased s_nlib */ |
char s_vaddr[4]; /* virtual address */ |
char s_size[4]; /* section size */ |
char s_scnptr[4]; /* file ptr to raw data for section */ |
char s_relptr[4]; /* file ptr to relocation */ |
char s_lnnoptr[4]; /* file ptr to line numbers */ |
char s_nreloc[2]; /* number of relocation entries */ |
char s_nlnno[2]; /* number of line number entries*/ |
char s_flags[2]; /* flags */ |
char s_reserved[1]; /* reserved (TIc80 specific) */ |
char s_mempage[1]; /* memory page number (TIc80) */ |
}; |
/* Names of "special" sections. */ |
#define _TEXT ".text" |
#define _DATA ".data" |
#define _BSS ".bss" |
#define _CINIT ".cinit" |
#define _CONST ".const" |
#define _SWITCH ".switch" |
#define _STACK ".stack" |
#define _SYSMEM ".sysmem" |
#define SCNHDR struct external_scnhdr |
#define SCNHSZ 40 |
/* FIXME - need to correlate external_auxent with |
TIc80 Code Generation Tools User's Guide, CG:A-25 */ |
/********************** RELOCATION DIRECTIVES **********************/ |
/* The external reloc has an offset field, because some of the reloc |
types on the h8 don't have room in the instruction for the entire |
offset - eg the strange jump and high page addressing modes. */ |
struct external_reloc |
{ |
char r_vaddr[4]; |
char r_symndx[4]; |
char r_reserved[2]; |
char r_type[2]; |
}; |
#define RELOC struct external_reloc |
#define RELSZ 12 |
/* TIc80 relocation types. */ |
#define R_ABS 0x00 /* Absolute address - no relocation */ |
#define R_RELLONGX 0x11 /* PP: 32 bits, direct */ |
#define R_PPBASE 0x34 /* PP: Global base address type */ |
#define R_PPLBASE 0x35 /* PP: Local base address type */ |
#define R_PP15 0x38 /* PP: Global 15 bit offset */ |
#define R_PP15W 0x39 /* PP: Global 15 bit offset divided by 4 */ |
#define R_PP15H 0x3A /* PP: Global 15 bit offset divided by 2 */ |
#define R_PP16B 0x3B /* PP: Global 16 bit offset for bytes */ |
#define R_PPL15 0x3C /* PP: Local 15 bit offset */ |
#define R_PPL15W 0x3D /* PP: Local 15 bit offset divided by 4 */ |
#define R_PPL15H 0x3E /* PP: Local 15 bit offset divided by 2 */ |
#define R_PPL16B 0x3F /* PP: Local 16 bit offset for bytes */ |
#define R_PPN15 0x40 /* PP: Global 15 bit negative offset */ |
#define R_PPN15W 0x41 /* PP: Global 15 bit negative offset divided by 4 */ |
#define R_PPN15H 0x42 /* PP: Global 15 bit negative offset divided by 2 */ |
#define R_PPN16B 0x43 /* PP: Global 16 bit negative byte offset */ |
#define R_PPLN15 0x44 /* PP: Local 15 bit negative offset */ |
#define R_PPLN15W 0x45 /* PP: Local 15 bit negative offset divided by 4 */ |
#define R_PPLN15H 0x46 /* PP: Local 15 bit negative offset divided by 2 */ |
#define R_PPLN16B 0x47 /* PP: Local 16 bit negative byte offset */ |
#define R_MPPCR15W 0x4E /* MP: 15 bit PC-relative divided by 4 */ |
#define R_MPPCR 0x4F /* MP: 32 bit PC-relative divided by 4 */ |
/contrib/toolchain/binutils/include/coff/w65.h |
---|
0,0 → 1,47 |
/* coff information for WDC 65816 |
Copyright 2001, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#define L_LNNO_SIZE 4 |
#include "coff/external.h" |
#define W65MAGIC 0x6500 |
#define W65BADMAG(x) (((x).f_magic != W65MAGIC)) |
/********************** RELOCATION DIRECTIVES **********************/ |
/* The external reloc has an offset field, because some of the reloc |
types on the w65 don't have room in the instruction for the entire |
offset - eg the strange jump and high page addressing modes */ |
struct external_reloc |
{ |
char r_vaddr[4]; |
char r_symndx[4]; |
char r_offset[4]; |
char r_type[2]; |
char r_stuff[2]; |
}; |
#define RELOC struct external_reloc |
#define RELSZ 16 |
/contrib/toolchain/binutils/include/coff/we32k.h |
---|
0,0 → 1,62 |
/* coff information for we32k |
Copyright 2001, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#define L_LNNO_SIZE 2 |
#include "coff/external.h" |
/* Bits for f_flags: |
F_RELFLG relocation info stripped from file |
F_EXEC file is executable (no unresolved external references) |
F_LNNO line numbers stripped from file |
F_LSYMS local symbols stripped from file |
F_AR32WR file has byte ordering of an AR32WR machine (e.g. vax). */ |
#define F_RELFLG (0x0001) |
#define F_EXEC (0x0002) |
#define F_LNNO (0x0004) |
#define F_LSYMS (0x0008) |
#define F_BM32B (0020000) |
#define F_BM32MAU (0040000) |
#define WE32KMAGIC 0x170 /* we32k sans transfer vector */ |
#define FBOMAGIC 0x170 /* we32k sans transfer vector */ |
#define MTVMAGIC 0x171 /* we32k with transfer vector */ |
#define RBOMAGIC 0x172 /* reserved */ |
#define WE32KBADMAG(x) ( ((x).f_magic != WE32KMAGIC) \ |
&& ((x).f_magic != FBOMAGIC) \ |
&& ((x).f_magic != RBOMAGIC) \ |
&& ((x).f_magic != MTVMAGIC)) |
/* More names of "special" sections. */ |
#define _TV ".tv" |
#define _INIT ".init" |
#define _FINI ".fini" |
/********************** RELOCATION DIRECTIVES **********************/ |
struct external_reloc |
{ |
char r_vaddr[4]; |
char r_symndx[4]; |
char r_type[2]; |
}; |
#define RELOC struct external_reloc |
#define RELSZ 10 |
/contrib/toolchain/binutils/include/coff/x86_64.h |
---|
0,0 → 1,57 |
/* COFF information for AMD 64. |
Copyright 2006, 2009, 2010 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. |
Written by Kai Tietz, OneVision Software GmbH&CoKg. */ |
#define L_LNNO_SIZE 2 |
#define INCLUDE_COMDAT_FIELDS_IN_AUXENT |
#include "coff/external.h" |
#define COFF_PAGE_SIZE 0x1000 |
#define AMD64MAGIC 0x8664 |
#define AMD64BADMAG(x) ((x).f_magic != AMD64MAGIC) |
#define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b |
#define OMAGIC 0404 /* Object files, eg as output. */ |
#define ZMAGIC IMAGE_NT_OPTIONAL_HDR64_MAGIC /* Demand load format, eg normal ld output 0x10b. */ |
#define STMAGIC 0401 /* Target shlib. */ |
#define SHMAGIC 0443 /* Host shlib. */ |
/* Define some NT default values. */ |
/* #define NT_IMAGE_BASE 0x400000 moved to internal.h. */ |
#define NT_SECTION_ALIGNMENT 0x1000 |
#define NT_FILE_ALIGNMENT 0x200 |
#define NT_DEF_RESERVE 0x100000 |
#define NT_DEF_COMMIT 0x1000 |
/* Relocation directives. */ |
struct external_reloc |
{ |
char r_vaddr[4]; |
char r_symndx[4]; |
char r_type[2]; |
}; |
#define RELOC struct external_reloc |
#define RELSZ 10 |
/contrib/toolchain/binutils/include/coff/xcoff.h |
---|
0,0 → 1,647 |
/* Internal format of XCOFF object file data structures for BFD. |
Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, |
2009, 2010 Free Software Foundation, Inc. |
Written by Ian Lance Taylor <ian@cygnus.com>, Cygnus Support. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _INTERNAL_XCOFF_H |
#define _INTERNAL_XCOFF_H |
/* XCOFF specific f_flags. */ |
/* File was profiled with fdpr. */ |
#define F_FDPR_PROF 0x0010 |
/* File was reordered with fdpr. */ |
#define F_FDPR_OPTI 0x0020 |
/* File use very large program support. */ |
#define F_DSA 0x0040 |
/* One aux header specifying medium page sizes is non-zero. */ |
#define F_VARPG 0x0100 |
/* Read/write sections are non-executable. */ |
#define F_NONEXEC 0x8000 |
/* Linker */ |
/* Names of "special" sections. */ |
#define _TEXT ".text" |
#define _DATA ".data" |
#define _BSS ".bss" |
#define _PAD ".pad" |
#define _LOADER ".loader" |
#define _EXCEPT ".except" |
#define _TYPCHK ".typchk" |
/* XCOFF uses special .dwXXX sections with the type STYP_DWARF. */ |
#define STYP_DWARF 0x0010 |
/* High-order 16-bits dwarf subtypes. */ |
#define SSUBTYP_DWINFO 0x10000 |
#define SSUBTYP_DWLINE 0x20000 |
#define SSUBTYP_DWPBNMS 0x30000 |
#define SSUBTYP_DWPBTYP 0x40000 |
#define SSUBTYP_DWARNGE 0x50000 |
#define SSUBTYP_DWABREV 0x60000 |
#define SSUBTYP_DWSTR 0x70000 |
#define SSUBTYP_DWRNGES 0x80000 |
/* XCOFF uses a special .loader section with type STYP_LOADER. */ |
#define STYP_LOADER 0x1000 |
/* Specifies an exception section. A section of this type provides |
information to identify the reason that a trap or ececptin occured within |
and executable object program */ |
#define STYP_EXCEPT 0x0100 |
/* Specifies an initialized thread-local data section. */ |
#define STYP_TDATA 0x0400 |
/* Specifies an uninitialized thread-local data section. */ |
#define STYP_TBSS 0x0800 |
/* XCOFF uses a special .debug section with type STYP_DEBUG. */ |
#define STYP_DEBUG 0x2000 |
/* Specifies a type check section. A section of this type contains parameter |
argument type check strings used by the AIX binder. */ |
#define STYP_TYPCHK 0x4000 |
/* XCOFF handles line number or relocation overflow by creating |
another section header with STYP_OVRFLO set. */ |
#define STYP_OVRFLO 0x8000 |
#define RS6K_AOUTHDR_OMAGIC 0x0107 /* old: text & data writeable */ |
#define RS6K_AOUTHDR_NMAGIC 0x0108 /* new: text r/o, data r/w */ |
#define RS6K_AOUTHDR_ZMAGIC 0x010B /* paged: text r/o, both page-aligned */ |
/* XCOFF relocation types. |
The relocations are described in the function |
xcoff[64]_ppc_relocate_section in coff64-rs6000.c and coff-rs6000.c */ |
#define R_POS (0x00) |
#define R_NEG (0x01) |
#define R_REL (0x02) |
#define R_TOC (0x03) |
#define R_RTB (0x04) |
#define R_GL (0x05) |
#define R_TCL (0x06) |
#define R_BA (0x08) |
#define R_BR (0x0a) |
#define R_RL (0x0c) |
#define R_RLA (0x0d) |
#define R_REF (0x0f) |
#define R_TRL (0x12) |
#define R_TRLA (0x13) |
#define R_RRTBI (0x14) |
#define R_RRTBA (0x15) |
#define R_CAI (0x16) |
#define R_CREL (0x17) |
#define R_RBA (0x18) |
#define R_RBAC (0x19) |
#define R_RBR (0x1a) |
#define R_RBRC (0x1b) |
#define R_TLS (0x20) |
#define R_TLS_IE (0x21) |
#define R_TLS_LD (0x22) |
#define R_TLS_LE (0x23) |
#define R_TLSM (0x24) |
#define R_TLSML (0x25) |
#define R_TOCU (0x30) |
#define R_TOCL (0x31) |
/* Storage class #defines, from /usr/include/storclass.h that are not already |
defined in internal.h */ |
/* Comment string in .info section */ |
#define C_INFO 110 |
/* Dwarf symbol. */ |
#define C_DWARF 112 |
/* Auxillary Symbol Entries */ |
/* x_smtyp values: */ |
#define SMTYP_ALIGN(x) ((x) >> 3) /* log2 of alignment */ |
#define SMTYP_SMTYP(x) ((x) & 0x7) /* symbol type */ |
/* Symbol type values: */ |
#define XTY_ER 0 /* External reference */ |
#define XTY_SD 1 /* Csect definition */ |
#define XTY_LD 2 /* Label definition */ |
#define XTY_CM 3 /* .BSS */ |
#define XTY_EM 4 /* Error message */ |
#define XTY_US 5 /* "Reserved for internal use" */ |
/* x_smclas values: */ |
#define XMC_PR 0 /* Read-only program code */ |
#define XMC_RO 1 /* Read-only constant */ |
#define XMC_DB 2 /* Read-only debug dictionary table */ |
#define XMC_TC 3 /* Read-write general TOC entry */ |
#define XMC_UA 4 /* Read-write unclassified */ |
#define XMC_RW 5 /* Read-write data */ |
#define XMC_GL 6 /* Read-only global linkage */ |
#define XMC_XO 7 /* Read-only extended operation */ |
#define XMC_SV 8 /* Read-only supervisor call */ |
#define XMC_BS 9 /* Read-write BSS */ |
#define XMC_DS 10 /* Read-write descriptor csect */ |
#define XMC_UC 11 /* Read-write unnamed Fortran common */ |
#define XMC_TI 12 /* Read-only traceback index csect */ |
#define XMC_TB 13 /* Read-only traceback table csect */ |
/* 14 ??? */ |
#define XMC_TC0 15 /* Read-write TOC anchor */ |
#define XMC_TD 16 /* Read-write data in TOC */ |
#define XMC_SV64 17 /* Read-only 64 bit supervisor call */ |
#define XMC_SV3264 18 /* Read-only 32 or 64 bit supervisor call */ |
/* 19 ??? */ |
#define XMC_TL 20 /* Read-write initialized TLS data */ |
#define XMC_TU 21 /* Read-write uninitialized TLS data */ |
#define XMC_TE 22 /* Same as XMC_TC but mapped after it */ |
/* The ldhdr structure. This appears at the start of the .loader |
section. */ |
struct internal_ldhdr |
{ |
/* The version number: |
1 : 32 bit |
2 : 64 bit */ |
unsigned long l_version; |
/* The number of symbol table entries. */ |
bfd_size_type l_nsyms; |
/* The number of relocation table entries. */ |
bfd_size_type l_nreloc; |
/* The length of the import file string table. */ |
bfd_size_type l_istlen; |
/* The number of import files. */ |
bfd_size_type l_nimpid; |
/* The offset from the start of the .loader section to the first |
entry in the import file table. */ |
bfd_size_type l_impoff; |
/* The length of the string table. */ |
bfd_size_type l_stlen; |
/* The offset from the start of the .loader section to the first |
entry in the string table. */ |
bfd_size_type l_stoff; |
/* The offset to start of the symbol table, only in XCOFF64 */ |
bfd_vma l_symoff; |
/* The offset to the start of the relocation table, only in XCOFF64 */ |
bfd_vma l_rldoff; |
}; |
/* The ldsym structure. This is used to represent a symbol in the |
.loader section. */ |
struct internal_ldsym |
{ |
union |
{ |
/* The symbol name if <= SYMNMLEN characters. */ |
char _l_name[SYMNMLEN]; |
struct |
{ |
/* Zero if the symbol name is more than SYMNMLEN characters. */ |
long _l_zeroes; |
/* The offset in the string table if the symbol name is more |
than SYMNMLEN characters. */ |
long _l_offset; |
} |
_l_l; |
} |
_l; |
/* The symbol value. */ |
bfd_vma l_value; |
/* The symbol section number. */ |
short l_scnum; |
/* The symbol type and flags. */ |
char l_smtype; |
/* The symbol storage class. */ |
char l_smclas; |
/* The import file ID. */ |
bfd_size_type l_ifile; |
/* Offset to the parameter type check string. */ |
bfd_size_type l_parm; |
}; |
/* These flags are for the l_smtype field (the lower three bits are an |
XTY_* value). */ |
/* Imported symbol. */ |
#define L_IMPORT (0x40) |
/* Entry point. */ |
#define L_ENTRY (0x20) |
/* Exported symbol. */ |
#define L_EXPORT (0x10) |
/* Weak symbol. */ |
#define L_WEAK (0x08) |
/* The ldrel structure. This is used to represent a reloc in the |
.loader section. */ |
struct internal_ldrel |
{ |
/* The reloc address. */ |
bfd_vma l_vaddr; |
/* The symbol table index in the .loader section symbol table. */ |
bfd_size_type l_symndx; |
/* The relocation type and size. */ |
short l_rtype; |
/* The section number this relocation applies to. */ |
short l_rsecnm; |
}; |
/* An entry in the XCOFF linker hash table. */ |
struct xcoff_link_hash_entry |
{ |
struct bfd_link_hash_entry root; |
/* Symbol index in output file. Set to -1 initially. Set to -2 if |
there is a reloc against this symbol. */ |
long indx; |
/* If we have created a TOC entry for this symbol, this is the .tc |
section which holds it. */ |
asection *toc_section; |
union |
{ |
/* If we have created a TOC entry (the XCOFF_SET_TOC flag is |
set), this is the offset in toc_section. */ |
bfd_vma toc_offset; |
/* If the TOC entry comes from an input file, this is set to the |
symbol index of the C_HIDEXT XMC_TC or XMC_TD symbol. */ |
long toc_indx; |
} |
u; |
/* If this symbol is a function entry point which is called, this |
field holds a pointer to the function descriptor. If this symbol |
is a function descriptor, this field holds a pointer to the |
function entry point. */ |
struct xcoff_link_hash_entry *descriptor; |
/* The .loader symbol table entry, if there is one. */ |
struct internal_ldsym *ldsym; |
/* If XCOFF_BUILT_LDSYM is set, this is the .loader symbol table |
index. If XCOFF_BUILD_LDSYM is clear, and XCOFF_IMPORT is set, |
this is the l_ifile value. */ |
long ldindx; |
/* Some linker flags. */ |
unsigned long flags; |
/* The storage mapping class. */ |
unsigned char smclas; |
}; |
/* Flags for xcoff_link_hash_entry. */ |
/* Symbol is referenced by a regular object. */ |
#define XCOFF_REF_REGULAR 0x00000001 |
/* Symbol is defined by a regular object. */ |
#define XCOFF_DEF_REGULAR 0x00000002 |
/* Symbol is defined by a dynamic object. */ |
#define XCOFF_DEF_DYNAMIC 0x00000004 |
/* Symbol is used in a reloc being copied into the .loader section. */ |
#define XCOFF_LDREL 0x00000008 |
/* Symbol is the entry point. */ |
#define XCOFF_ENTRY 0x00000010 |
/* Symbol is for a function and is the target of a relocation. |
The relocation may or may not be a branch-type relocation. */ |
#define XCOFF_CALLED 0x00000020 |
/* Symbol needs the TOC entry filled in. */ |
#define XCOFF_SET_TOC 0x00000040 |
/* Symbol is implicitly or explicitly imported. */ |
#define XCOFF_IMPORT 0x00000080 |
/* Symbol is explicitly exported. */ |
#define XCOFF_EXPORT 0x00000100 |
/* Symbol has been processed by xcoff_build_ldsyms. */ |
#define XCOFF_BUILT_LDSYM 0x00000200 |
/* Symbol is mentioned by a section which was not garbage collected. */ |
#define XCOFF_MARK 0x00000400 |
/* Symbol size is recorded in size_list list from hash table. */ |
#define XCOFF_HAS_SIZE 0x00000800 |
/* Symbol is a function descriptor. */ |
#define XCOFF_DESCRIPTOR 0x00001000 |
/* Multiple definitions have been for the symbol. */ |
#define XCOFF_MULTIPLY_DEFINED 0x00002000 |
/* Symbol is the __rtinit symbol. */ |
#define XCOFF_RTINIT 0x00004000 |
/* Symbol is an imported 32 bit syscall. */ |
#define XCOFF_SYSCALL32 0x00008000 |
/* Symbol is an imported 64 bit syscall. */ |
#define XCOFF_SYSCALL64 0x00010000 |
/* Symbol was not explicitly defined by the time it was marked. */ |
#define XCOFF_WAS_UNDEFINED 0x00020000 |
/* We have assigned an output XCOFF entry to this symbol. */ |
#define XCOFF_ALLOCATED 0x00040000 |
/* The XCOFF linker hash table. */ |
#define XCOFF_NUMBER_OF_SPECIAL_SECTIONS 6 |
#define XCOFF_SPECIAL_SECTION_TEXT 0 |
#define XCOFF_SPECIAL_SECTION_ETEXT 1 |
#define XCOFF_SPECIAL_SECTION_DATA 2 |
#define XCOFF_SPECIAL_SECTION_EDATA 3 |
#define XCOFF_SPECIAL_SECTION_END 4 |
#define XCOFF_SPECIAL_SECTION_END2 5 |
/* These flags indicate which of -bexpall and -bexpfull are in effect. */ |
#define XCOFF_EXPALL 1 |
#define XCOFF_EXPFULL 2 |
/* This structure is used to pass information through |
xcoff_link_hash_traverse. */ |
struct xcoff_loader_info |
{ |
/* Set if a problem occurred. */ |
bfd_boolean failed; |
/* Output BFD. */ |
bfd *output_bfd; |
/* Link information structure. */ |
struct bfd_link_info *info; |
/* A mask of XCOFF_EXPALL and XCOFF_EXPFULL flags. */ |
unsigned int auto_export_flags; |
/* Number of ldsym structures. */ |
size_t ldsym_count; |
/* Size of string table. */ |
size_t string_size; |
/* String table. */ |
char *strings; |
/* Allocated size of string table. */ |
size_t string_alc; |
}; |
/* In case we're on a 32-bit machine, construct a 64-bit "-1" value |
from smaller values. Start with zero, widen, *then* decrement. */ |
#define MINUS_ONE (((bfd_vma) 0) - 1) |
/* __rtinit, from /usr/include/rtinit.h. */ |
struct __rtinit |
{ |
/* Pointer to runtime linker. |
XXX: Is the parameter really void? */ |
int (*rtl) (void); |
/* Offset to array of init functions, 0 if none. */ |
int init_offset; |
/* Offset to array of fini functions, 0 if none. */ |
int fini_offset; |
/* Size of __RTINIT_DESCRIPTOR. This value should be used instead of |
sizeof(__RTINIT_DESCRIPTOR). */ |
int __rtinit_descriptor_size; |
}; |
#define RTINIT_DESCRIPTOR_SIZE (12) |
struct __rtinit_descriptor |
{ |
/* Init/fini function. */ |
int f; |
/* Offset, relative to the start of the __rtinit symbol, to name of the |
function. */ |
int name_offset; |
/* Flags */ |
unsigned char flags; |
}; |
/* Archive */ |
#define XCOFFARMAG "<aiaff>\012" |
#define XCOFFARMAGBIG "<bigaf>\012" |
#define SXCOFFARMAG 8 |
/* The size of the ascii archive elements */ |
#define XCOFFARMAG_ELEMENT_SIZE 12 |
#define XCOFFARMAGBIG_ELEMENT_SIZE 20 |
/* This terminates an XCOFF archive member name. */ |
#define XCOFFARFMAG "`\012" |
#define SXCOFFARFMAG 2 |
/* XCOFF archives start with this (printable) structure. */ |
struct xcoff_ar_file_hdr |
{ |
/* Magic string. */ |
char magic[SXCOFFARMAG]; |
/* Offset of the member table (decimal ASCII string). */ |
char memoff[XCOFFARMAG_ELEMENT_SIZE]; |
/* Offset of the global symbol table (decimal ASCII string). */ |
char symoff[XCOFFARMAG_ELEMENT_SIZE]; |
/* Offset of the first member in the archive (decimal ASCII string). */ |
char firstmemoff[XCOFFARMAG_ELEMENT_SIZE]; |
/* Offset of the last member in the archive (decimal ASCII string). */ |
char lastmemoff[XCOFFARMAG_ELEMENT_SIZE]; |
/* Offset of the first member on the free list (decimal ASCII |
string). */ |
char freeoff[XCOFFARMAG_ELEMENT_SIZE]; |
}; |
#define SIZEOF_AR_FILE_HDR (SXCOFFARMAG + 5 * XCOFFARMAG_ELEMENT_SIZE) |
/* This is the equivalent data structure for the big archive format. */ |
struct xcoff_ar_file_hdr_big |
{ |
/* Magic string. */ |
char magic[SXCOFFARMAG]; |
/* Offset of the member table (decimal ASCII string). */ |
char memoff[XCOFFARMAGBIG_ELEMENT_SIZE]; |
/* Offset of the global symbol table for 32-bit objects (decimal ASCII |
string). */ |
char symoff[XCOFFARMAGBIG_ELEMENT_SIZE]; |
/* Offset of the global symbol table for 64-bit objects (decimal ASCII |
string). */ |
char symoff64[XCOFFARMAGBIG_ELEMENT_SIZE]; |
/* Offset of the first member in the archive (decimal ASCII string). */ |
char firstmemoff[XCOFFARMAGBIG_ELEMENT_SIZE]; |
/* Offset of the last member in the archive (decimal ASCII string). */ |
char lastmemoff[XCOFFARMAGBIG_ELEMENT_SIZE]; |
/* Offset of the first member on the free list (decimal ASCII |
string). */ |
char freeoff[XCOFFARMAGBIG_ELEMENT_SIZE]; |
}; |
#define SIZEOF_AR_FILE_HDR_BIG (SXCOFFARMAG + 6 * XCOFFARMAGBIG_ELEMENT_SIZE) |
/* Each XCOFF archive member starts with this (printable) structure. */ |
struct xcoff_ar_hdr |
{ |
/* File size not including the header (decimal ASCII string). */ |
char size[XCOFFARMAG_ELEMENT_SIZE]; |
/* File offset of next archive member (decimal ASCII string). */ |
char nextoff[XCOFFARMAG_ELEMENT_SIZE]; |
/* File offset of previous archive member (decimal ASCII string). */ |
char prevoff[XCOFFARMAG_ELEMENT_SIZE]; |
/* File mtime (decimal ASCII string). */ |
char date[12]; |
/* File UID (decimal ASCII string). */ |
char uid[12]; |
/* File GID (decimal ASCII string). */ |
char gid[12]; |
/* File mode (octal ASCII string). */ |
char mode[12]; |
/* Length of file name (decimal ASCII string). */ |
char namlen[4]; |
/* This structure is followed by the file name. The length of the |
name is given in the namlen field. If the length of the name is |
odd, the name is followed by a null byte. The name and optional |
null byte are followed by XCOFFARFMAG, which is not included in |
namlen. The contents of the archive member follow; the number of |
bytes is given in the size field. */ |
}; |
#define SIZEOF_AR_HDR (3 * XCOFFARMAG_ELEMENT_SIZE + 4 * 12 + 4) |
/* The equivalent for the big archive format. */ |
struct xcoff_ar_hdr_big |
{ |
/* File size not including the header (decimal ASCII string). */ |
char size[XCOFFARMAGBIG_ELEMENT_SIZE]; |
/* File offset of next archive member (decimal ASCII string). */ |
char nextoff[XCOFFARMAGBIG_ELEMENT_SIZE]; |
/* File offset of previous archive member (decimal ASCII string). */ |
char prevoff[XCOFFARMAGBIG_ELEMENT_SIZE]; |
/* File mtime (decimal ASCII string). */ |
char date[12]; |
/* File UID (decimal ASCII string). */ |
char uid[12]; |
/* File GID (decimal ASCII string). */ |
char gid[12]; |
/* File mode (octal ASCII string). */ |
char mode[12]; |
/* Length of file name (decimal ASCII string). */ |
char namlen[4]; |
/* This structure is followed by the file name. The length of the |
name is given in the namlen field. If the length of the name is |
odd, the name is followed by a null byte. The name and optional |
null byte are followed by XCOFFARFMAG, which is not included in |
namlen. The contents of the archive member follow; the number of |
bytes is given in the size field. */ |
}; |
#define SIZEOF_AR_HDR_BIG (3 * XCOFFARMAGBIG_ELEMENT_SIZE + 4 * 12 + 4) |
/* We often have to distinguish between the old and big file format. |
Make it a bit cleaner. We can use `xcoff_ardata' here because the |
`hdr' member has the same size and position in both formats. |
<bigaf> is the default format, return TRUE even when xcoff_ardata is |
NULL. */ |
#ifndef SMALL_ARCHIVE |
/* Creates big archives by default */ |
#define xcoff_big_format_p(abfd) \ |
((NULL != bfd_ardata (abfd) && NULL == xcoff_ardata (abfd)) || \ |
((NULL != bfd_ardata (abfd)) && \ |
(NULL != xcoff_ardata (abfd)) && \ |
(xcoff_ardata (abfd)->magic[1] == 'b'))) |
#else |
/* Creates small archives by default. */ |
#define xcoff_big_format_p(abfd) \ |
(((NULL != bfd_ardata (abfd)) && \ |
(NULL != xcoff_ardata (abfd)) && \ |
(xcoff_ardata (abfd)->magic[1] == 'b'))) |
#endif |
/* We store a copy of the xcoff_ar_file_hdr in the tdata field of the |
artdata structure. Similar for the big archive. */ |
#define xcoff_ardata(abfd) \ |
((struct xcoff_ar_file_hdr *) bfd_ardata (abfd)->tdata) |
#define xcoff_ardata_big(abfd) \ |
((struct xcoff_ar_file_hdr_big *) bfd_ardata (abfd)->tdata) |
/* We store a copy of the xcoff_ar_hdr in the arelt_data field of an |
archive element. Similar for the big archive. */ |
#define arch_eltdata(bfd) ((struct areltdata *) ((bfd)->arelt_data)) |
#define arch_xhdr(bfd) \ |
((struct xcoff_ar_hdr *) arch_eltdata (bfd)->arch_header) |
#define arch_xhdr_big(bfd) \ |
((struct xcoff_ar_hdr_big *) arch_eltdata (bfd)->arch_header) |
/* True if symbols of class CLASS are external. */ |
#define EXTERN_SYM_P(CLASS) \ |
((CLASS) == C_EXT || (CLASS) == C_AIX_WEAKEXT) |
#endif /* _INTERNAL_XCOFF_H */ |
/contrib/toolchain/binutils/include/coff/z80.h |
---|
0,0 → 1,60 |
/* coff information for Zilog Z80 |
Copyright 2005, 2010 Free Software Foundation, Inc. |
Contributed by Arnold Metselaar <arnold_m@operamail.com> |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#define L_LNNO_SIZE 4 |
#include "coff/external.h" |
/* z80 backend does not use dots in section names. */ |
#undef _TEXT |
#define _TEXT "text" |
#undef _DATA |
#define _DATA "data" |
#undef _BSS |
#define _BSS "bss" |
/* Type of cpu is stored in flags. */ |
#define F_MACHMASK 0xF000 |
/* Z80 COFF encodes the section alignment in the section header flags */ |
#define COFF_ALIGN_IN_SECTION_HEADER 1 |
#define COFF_ALIGN_IN_S_FLAGS 1 |
#define F_ALGNMASK 0x0F00 |
/* requires a power-of-two argument */ |
#define COFF_ENCODE_ALIGNMENT(S,X) ((S).s_flags |= (((unsigned)(X)&0xF)<<8)) |
/* result is a power of two */ |
#define COFF_DECODE_ALIGNMENT(X) (((X)>>8)&0xF) |
#define Z80MAGIC 0x805A |
#define Z80BADMAG(x) (((x).f_magic != Z80MAGIC)) |
/* Relocation directives. */ |
/* This format actually has more bits than we need. */ |
struct external_reloc |
{ |
char r_vaddr[4]; |
char r_symndx[4]; |
char r_offset[4]; |
char r_type[2]; |
char r_stuff[2]; |
}; |
#define RELOC struct external_reloc |
#define RELSZ 16 |
/contrib/toolchain/binutils/include/coff/z8k.h |
---|
0,0 → 1,49 |
/* coff information for Zilog Z800N |
Copyright 2001, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#define L_LNNO_SIZE 4 |
#include "coff/external.h" |
/* Type of cpu is stored in flags */ |
#define F_Z8001 0x1000 |
#define F_Z8002 0x2000 |
#define F_MACHMASK 0xf000 |
#define Z8KMAGIC 0x8000 |
#define Z8KBADMAG(x) (((x).f_magic != Z8KMAGIC)) |
/********************** RELOCATION DIRECTIVES **********************/ |
/* The external reloc has an offset field, because some of the reloc |
types on the z8k don't have room in the instruction for the entire |
offset - eg with segments. */ |
struct external_reloc |
{ |
char r_vaddr[4]; |
char r_symndx[4]; |
char r_offset[4]; |
char r_type[2]; |
char r_stuff[2]; |
}; |
#define RELOC struct external_reloc |
#define RELSZ 16 |
/contrib/toolchain/binutils/include/demangle.h |
---|
0,0 → 1,671 |
/* Defs for interface to demanglers. |
Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002, |
2003, 2004, 2005, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or |
modify it under the terms of the GNU Library General Public License |
as published by the Free Software Foundation; either version 2, or |
(at your option) any later version. |
In addition to the permissions in the GNU Library General Public |
License, the Free Software Foundation gives you unlimited |
permission to link the compiled version of this file into |
combinations with other programs, and to distribute those |
combinations without any restriction coming from the use of this |
file. (The Library Public License restrictions do apply in other |
respects; for example, they cover modification of the file, and |
distribution when not linked into a combined executable.) |
This program is distributed in the hope that it will be useful, but |
WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
Library General Public License for more details. |
You should have received a copy of the GNU Library General Public |
License along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA |
02110-1301, USA. */ |
#if !defined (DEMANGLE_H) |
#define DEMANGLE_H |
#include "libiberty.h" |
#ifdef __cplusplus |
extern "C" { |
#endif /* __cplusplus */ |
/* Options passed to cplus_demangle (in 2nd parameter). */ |
#define DMGL_NO_OPTS 0 /* For readability... */ |
#define DMGL_PARAMS (1 << 0) /* Include function args */ |
#define DMGL_ANSI (1 << 1) /* Include const, volatile, etc */ |
#define DMGL_JAVA (1 << 2) /* Demangle as Java rather than C++. */ |
#define DMGL_VERBOSE (1 << 3) /* Include implementation details. */ |
#define DMGL_TYPES (1 << 4) /* Also try to demangle type encodings. */ |
#define DMGL_RET_POSTFIX (1 << 5) /* Print function return types (when |
present) after function signature. |
It applies only to the toplevel |
function type. */ |
#define DMGL_RET_DROP (1 << 6) /* Suppress printing function return |
types, even if present. It applies |
only to the toplevel function type. |
*/ |
#define DMGL_AUTO (1 << 8) |
#define DMGL_GNU (1 << 9) |
#define DMGL_LUCID (1 << 10) |
#define DMGL_ARM (1 << 11) |
#define DMGL_HP (1 << 12) /* For the HP aCC compiler; |
same as ARM except for |
template arguments, etc. */ |
#define DMGL_EDG (1 << 13) |
#define DMGL_GNU_V3 (1 << 14) |
#define DMGL_GNAT (1 << 15) |
/* If none of these are set, use 'current_demangling_style' as the default. */ |
#define DMGL_STYLE_MASK (DMGL_AUTO|DMGL_GNU|DMGL_LUCID|DMGL_ARM|DMGL_HP|DMGL_EDG|DMGL_GNU_V3|DMGL_JAVA|DMGL_GNAT) |
/* Enumeration of possible demangling styles. |
Lucid and ARM styles are still kept logically distinct, even though |
they now both behave identically. The resulting style is actual the |
union of both. I.E. either style recognizes both "__pt__" and "__rf__" |
for operator "->", even though the first is lucid style and the second |
is ARM style. (FIXME?) */ |
extern enum demangling_styles |
{ |
no_demangling = -1, |
unknown_demangling = 0, |
auto_demangling = DMGL_AUTO, |
gnu_demangling = DMGL_GNU, |
lucid_demangling = DMGL_LUCID, |
arm_demangling = DMGL_ARM, |
hp_demangling = DMGL_HP, |
edg_demangling = DMGL_EDG, |
gnu_v3_demangling = DMGL_GNU_V3, |
java_demangling = DMGL_JAVA, |
gnat_demangling = DMGL_GNAT |
} current_demangling_style; |
/* Define string names for the various demangling styles. */ |
#define NO_DEMANGLING_STYLE_STRING "none" |
#define AUTO_DEMANGLING_STYLE_STRING "auto" |
#define GNU_DEMANGLING_STYLE_STRING "gnu" |
#define LUCID_DEMANGLING_STYLE_STRING "lucid" |
#define ARM_DEMANGLING_STYLE_STRING "arm" |
#define HP_DEMANGLING_STYLE_STRING "hp" |
#define EDG_DEMANGLING_STYLE_STRING "edg" |
#define GNU_V3_DEMANGLING_STYLE_STRING "gnu-v3" |
#define JAVA_DEMANGLING_STYLE_STRING "java" |
#define GNAT_DEMANGLING_STYLE_STRING "gnat" |
/* Some macros to test what demangling style is active. */ |
#define CURRENT_DEMANGLING_STYLE current_demangling_style |
#define AUTO_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_AUTO) |
#define GNU_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_GNU) |
#define LUCID_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_LUCID) |
#define ARM_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_ARM) |
#define HP_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_HP) |
#define EDG_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_EDG) |
#define GNU_V3_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_GNU_V3) |
#define JAVA_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_JAVA) |
#define GNAT_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_GNAT) |
/* Provide information about the available demangle styles. This code is |
pulled from gdb into libiberty because it is useful to binutils also. */ |
extern const struct demangler_engine |
{ |
const char *const demangling_style_name; |
const enum demangling_styles demangling_style; |
const char *const demangling_style_doc; |
} libiberty_demanglers[]; |
extern char * |
cplus_demangle (const char *mangled, int options); |
extern int |
cplus_demangle_opname (const char *opname, char *result, int options); |
extern const char * |
cplus_mangle_opname (const char *opname, int options); |
/* Note: This sets global state. FIXME if you care about multi-threading. */ |
extern void |
set_cplus_marker_for_demangling (int ch); |
extern enum demangling_styles |
cplus_demangle_set_style (enum demangling_styles style); |
extern enum demangling_styles |
cplus_demangle_name_to_style (const char *name); |
/* Callback typedef for allocation-less demangler interfaces. */ |
typedef void (*demangle_callbackref) (const char *, size_t, void *); |
/* V3 ABI demangling entry points, defined in cp-demangle.c. Callback |
variants return non-zero on success, zero on error. char* variants |
return a string allocated by malloc on success, NULL on error. */ |
extern int |
cplus_demangle_v3_callback (const char *mangled, int options, |
demangle_callbackref callback, void *opaque); |
extern char* |
cplus_demangle_v3 (const char *mangled, int options); |
extern int |
java_demangle_v3_callback (const char *mangled, |
demangle_callbackref callback, void *opaque); |
extern char* |
java_demangle_v3 (const char *mangled); |
char * |
ada_demangle (const char *mangled, int options); |
enum gnu_v3_ctor_kinds { |
gnu_v3_complete_object_ctor = 1, |
gnu_v3_base_object_ctor, |
gnu_v3_complete_object_allocating_ctor, |
gnu_v3_object_ctor_group |
}; |
/* Return non-zero iff NAME is the mangled form of a constructor name |
in the G++ V3 ABI demangling style. Specifically, return an `enum |
gnu_v3_ctor_kinds' value indicating what kind of constructor |
it is. */ |
extern enum gnu_v3_ctor_kinds |
is_gnu_v3_mangled_ctor (const char *name); |
enum gnu_v3_dtor_kinds { |
gnu_v3_deleting_dtor = 1, |
gnu_v3_complete_object_dtor, |
gnu_v3_base_object_dtor, |
gnu_v3_object_dtor_group |
}; |
/* Return non-zero iff NAME is the mangled form of a destructor name |
in the G++ V3 ABI demangling style. Specifically, return an `enum |
gnu_v3_dtor_kinds' value, indicating what kind of destructor |
it is. */ |
extern enum gnu_v3_dtor_kinds |
is_gnu_v3_mangled_dtor (const char *name); |
/* The V3 demangler works in two passes. The first pass builds a tree |
representation of the mangled name, and the second pass turns the |
tree representation into a demangled string. Here we define an |
interface to permit a caller to build their own tree |
representation, which they can pass to the demangler to get a |
demangled string. This can be used to canonicalize user input into |
something which the demangler might output. It could also be used |
by other demanglers in the future. */ |
/* These are the component types which may be found in the tree. Many |
component types have one or two subtrees, referred to as left and |
right (a component type with only one subtree puts it in the left |
subtree). */ |
enum demangle_component_type |
{ |
/* A name, with a length and a pointer to a string. */ |
DEMANGLE_COMPONENT_NAME, |
/* A qualified name. The left subtree is a class or namespace or |
some such thing, and the right subtree is a name qualified by |
that class. */ |
DEMANGLE_COMPONENT_QUAL_NAME, |
/* A local name. The left subtree describes a function, and the |
right subtree is a name which is local to that function. */ |
DEMANGLE_COMPONENT_LOCAL_NAME, |
/* A typed name. The left subtree is a name, and the right subtree |
describes that name as a function. */ |
DEMANGLE_COMPONENT_TYPED_NAME, |
/* A template. The left subtree is a template name, and the right |
subtree is a template argument list. */ |
DEMANGLE_COMPONENT_TEMPLATE, |
/* A template parameter. This holds a number, which is the template |
parameter index. */ |
DEMANGLE_COMPONENT_TEMPLATE_PARAM, |
/* A function parameter. This holds a number, which is the index. */ |
DEMANGLE_COMPONENT_FUNCTION_PARAM, |
/* A constructor. This holds a name and the kind of |
constructor. */ |
DEMANGLE_COMPONENT_CTOR, |
/* A destructor. This holds a name and the kind of destructor. */ |
DEMANGLE_COMPONENT_DTOR, |
/* A vtable. This has one subtree, the type for which this is a |
vtable. */ |
DEMANGLE_COMPONENT_VTABLE, |
/* A VTT structure. This has one subtree, the type for which this |
is a VTT. */ |
DEMANGLE_COMPONENT_VTT, |
/* A construction vtable. The left subtree is the type for which |
this is a vtable, and the right subtree is the derived type for |
which this vtable is built. */ |
DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE, |
/* A typeinfo structure. This has one subtree, the type for which |
this is the tpeinfo structure. */ |
DEMANGLE_COMPONENT_TYPEINFO, |
/* A typeinfo name. This has one subtree, the type for which this |
is the typeinfo name. */ |
DEMANGLE_COMPONENT_TYPEINFO_NAME, |
/* A typeinfo function. This has one subtree, the type for which |
this is the tpyeinfo function. */ |
DEMANGLE_COMPONENT_TYPEINFO_FN, |
/* A thunk. This has one subtree, the name for which this is a |
thunk. */ |
DEMANGLE_COMPONENT_THUNK, |
/* A virtual thunk. This has one subtree, the name for which this |
is a virtual thunk. */ |
DEMANGLE_COMPONENT_VIRTUAL_THUNK, |
/* A covariant thunk. This has one subtree, the name for which this |
is a covariant thunk. */ |
DEMANGLE_COMPONENT_COVARIANT_THUNK, |
/* A Java class. This has one subtree, the type. */ |
DEMANGLE_COMPONENT_JAVA_CLASS, |
/* A guard variable. This has one subtree, the name for which this |
is a guard variable. */ |
DEMANGLE_COMPONENT_GUARD, |
/* The init and wrapper functions for C++11 thread_local variables. */ |
DEMANGLE_COMPONENT_TLS_INIT, |
DEMANGLE_COMPONENT_TLS_WRAPPER, |
/* A reference temporary. This has one subtree, the name for which |
this is a temporary. */ |
DEMANGLE_COMPONENT_REFTEMP, |
/* A hidden alias. This has one subtree, the encoding for which it |
is providing alternative linkage. */ |
DEMANGLE_COMPONENT_HIDDEN_ALIAS, |
/* A standard substitution. This holds the name of the |
substitution. */ |
DEMANGLE_COMPONENT_SUB_STD, |
/* The restrict qualifier. The one subtree is the type which is |
being qualified. */ |
DEMANGLE_COMPONENT_RESTRICT, |
/* The volatile qualifier. The one subtree is the type which is |
being qualified. */ |
DEMANGLE_COMPONENT_VOLATILE, |
/* The const qualifier. The one subtree is the type which is being |
qualified. */ |
DEMANGLE_COMPONENT_CONST, |
/* The restrict qualifier modifying a member function. The one |
subtree is the type which is being qualified. */ |
DEMANGLE_COMPONENT_RESTRICT_THIS, |
/* The volatile qualifier modifying a member function. The one |
subtree is the type which is being qualified. */ |
DEMANGLE_COMPONENT_VOLATILE_THIS, |
/* The const qualifier modifying a member function. The one subtree |
is the type which is being qualified. */ |
DEMANGLE_COMPONENT_CONST_THIS, |
/* C++11 A reference modifying a member function. The one subtree is the |
type which is being referenced. */ |
DEMANGLE_COMPONENT_REFERENCE_THIS, |
/* C++11: An rvalue reference modifying a member function. The one |
subtree is the type which is being referenced. */ |
DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS, |
/* A vendor qualifier. The left subtree is the type which is being |
qualified, and the right subtree is the name of the |
qualifier. */ |
DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL, |
/* A pointer. The one subtree is the type which is being pointed |
to. */ |
DEMANGLE_COMPONENT_POINTER, |
/* A reference. The one subtree is the type which is being |
referenced. */ |
DEMANGLE_COMPONENT_REFERENCE, |
/* C++0x: An rvalue reference. The one subtree is the type which is |
being referenced. */ |
DEMANGLE_COMPONENT_RVALUE_REFERENCE, |
/* A complex type. The one subtree is the base type. */ |
DEMANGLE_COMPONENT_COMPLEX, |
/* An imaginary type. The one subtree is the base type. */ |
DEMANGLE_COMPONENT_IMAGINARY, |
/* A builtin type. This holds the builtin type information. */ |
DEMANGLE_COMPONENT_BUILTIN_TYPE, |
/* A vendor's builtin type. This holds the name of the type. */ |
DEMANGLE_COMPONENT_VENDOR_TYPE, |
/* A function type. The left subtree is the return type. The right |
subtree is a list of ARGLIST nodes. Either or both may be |
NULL. */ |
DEMANGLE_COMPONENT_FUNCTION_TYPE, |
/* An array type. The left subtree is the dimension, which may be |
NULL, or a string (represented as DEMANGLE_COMPONENT_NAME), or an |
expression. The right subtree is the element type. */ |
DEMANGLE_COMPONENT_ARRAY_TYPE, |
/* A pointer to member type. The left subtree is the class type, |
and the right subtree is the member type. CV-qualifiers appear |
on the latter. */ |
DEMANGLE_COMPONENT_PTRMEM_TYPE, |
/* A fixed-point type. */ |
DEMANGLE_COMPONENT_FIXED_TYPE, |
/* A vector type. The left subtree is the number of elements, |
the right subtree is the element type. */ |
DEMANGLE_COMPONENT_VECTOR_TYPE, |
/* An argument list. The left subtree is the current argument, and |
the right subtree is either NULL or another ARGLIST node. */ |
DEMANGLE_COMPONENT_ARGLIST, |
/* A template argument list. The left subtree is the current |
template argument, and the right subtree is either NULL or |
another TEMPLATE_ARGLIST node. */ |
DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, |
/* An initializer list. The left subtree is either an explicit type or |
NULL, and the right subtree is a DEMANGLE_COMPONENT_ARGLIST. */ |
DEMANGLE_COMPONENT_INITIALIZER_LIST, |
/* An operator. This holds information about a standard |
operator. */ |
DEMANGLE_COMPONENT_OPERATOR, |
/* An extended operator. This holds the number of arguments, and |
the name of the extended operator. */ |
DEMANGLE_COMPONENT_EXTENDED_OPERATOR, |
/* A typecast, represented as a unary operator. The one subtree is |
the type to which the argument should be cast. */ |
DEMANGLE_COMPONENT_CAST, |
/* A nullary expression. The left subtree is the operator. */ |
DEMANGLE_COMPONENT_NULLARY, |
/* A unary expression. The left subtree is the operator, and the |
right subtree is the single argument. */ |
DEMANGLE_COMPONENT_UNARY, |
/* A binary expression. The left subtree is the operator, and the |
right subtree is a BINARY_ARGS. */ |
DEMANGLE_COMPONENT_BINARY, |
/* Arguments to a binary expression. The left subtree is the first |
argument, and the right subtree is the second argument. */ |
DEMANGLE_COMPONENT_BINARY_ARGS, |
/* A trinary expression. The left subtree is the operator, and the |
right subtree is a TRINARY_ARG1. */ |
DEMANGLE_COMPONENT_TRINARY, |
/* Arguments to a trinary expression. The left subtree is the first |
argument, and the right subtree is a TRINARY_ARG2. */ |
DEMANGLE_COMPONENT_TRINARY_ARG1, |
/* More arguments to a trinary expression. The left subtree is the |
second argument, and the right subtree is the third argument. */ |
DEMANGLE_COMPONENT_TRINARY_ARG2, |
/* A literal. The left subtree is the type, and the right subtree |
is the value, represented as a DEMANGLE_COMPONENT_NAME. */ |
DEMANGLE_COMPONENT_LITERAL, |
/* A negative literal. Like LITERAL, but the value is negated. |
This is a minor hack: the NAME used for LITERAL points directly |
to the mangled string, but since negative numbers are mangled |
using 'n' instead of '-', we want a way to indicate a negative |
number which involves neither modifying the mangled string nor |
allocating a new copy of the literal in memory. */ |
DEMANGLE_COMPONENT_LITERAL_NEG, |
/* A libgcj compiled resource. The left subtree is the name of the |
resource. */ |
DEMANGLE_COMPONENT_JAVA_RESOURCE, |
/* A name formed by the concatenation of two parts. The left |
subtree is the first part and the right subtree the second. */ |
DEMANGLE_COMPONENT_COMPOUND_NAME, |
/* A name formed by a single character. */ |
DEMANGLE_COMPONENT_CHARACTER, |
/* A number. */ |
DEMANGLE_COMPONENT_NUMBER, |
/* A decltype type. */ |
DEMANGLE_COMPONENT_DECLTYPE, |
/* Global constructors keyed to name. */ |
DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS, |
/* Global destructors keyed to name. */ |
DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS, |
/* A lambda closure type. */ |
DEMANGLE_COMPONENT_LAMBDA, |
/* A default argument scope. */ |
DEMANGLE_COMPONENT_DEFAULT_ARG, |
/* An unnamed type. */ |
DEMANGLE_COMPONENT_UNNAMED_TYPE, |
/* A transactional clone. This has one subtree, the encoding for |
which it is providing alternative linkage. */ |
DEMANGLE_COMPONENT_TRANSACTION_CLONE, |
/* A non-transactional clone entry point. In the i386/x86_64 abi, |
the unmangled symbol of a tm_callable becomes a thunk and the |
non-transactional function version is mangled thus. */ |
DEMANGLE_COMPONENT_NONTRANSACTION_CLONE, |
/* A pack expansion. */ |
DEMANGLE_COMPONENT_PACK_EXPANSION, |
/* A name with an ABI tag. */ |
DEMANGLE_COMPONENT_TAGGED_NAME, |
/* A cloned function. */ |
DEMANGLE_COMPONENT_CLONE |
}; |
/* Types which are only used internally. */ |
struct demangle_operator_info; |
struct demangle_builtin_type_info; |
/* A node in the tree representation is an instance of a struct |
demangle_component. Note that the field names of the struct are |
not well protected against macros defined by the file including |
this one. We can fix this if it ever becomes a problem. */ |
struct demangle_component |
{ |
/* The type of this component. */ |
enum demangle_component_type type; |
union |
{ |
/* For DEMANGLE_COMPONENT_NAME. */ |
struct |
{ |
/* A pointer to the name (which need not NULL terminated) and |
its length. */ |
const char *s; |
int len; |
} s_name; |
/* For DEMANGLE_COMPONENT_OPERATOR. */ |
struct |
{ |
/* Operator. */ |
const struct demangle_operator_info *op; |
} s_operator; |
/* For DEMANGLE_COMPONENT_EXTENDED_OPERATOR. */ |
struct |
{ |
/* Number of arguments. */ |
int args; |
/* Name. */ |
struct demangle_component *name; |
} s_extended_operator; |
/* For DEMANGLE_COMPONENT_FIXED_TYPE. */ |
struct |
{ |
/* The length, indicated by a C integer type name. */ |
struct demangle_component *length; |
/* _Accum or _Fract? */ |
short accum; |
/* Saturating or not? */ |
short sat; |
} s_fixed; |
/* For DEMANGLE_COMPONENT_CTOR. */ |
struct |
{ |
/* Kind of constructor. */ |
enum gnu_v3_ctor_kinds kind; |
/* Name. */ |
struct demangle_component *name; |
} s_ctor; |
/* For DEMANGLE_COMPONENT_DTOR. */ |
struct |
{ |
/* Kind of destructor. */ |
enum gnu_v3_dtor_kinds kind; |
/* Name. */ |
struct demangle_component *name; |
} s_dtor; |
/* For DEMANGLE_COMPONENT_BUILTIN_TYPE. */ |
struct |
{ |
/* Builtin type. */ |
const struct demangle_builtin_type_info *type; |
} s_builtin; |
/* For DEMANGLE_COMPONENT_SUB_STD. */ |
struct |
{ |
/* Standard substitution string. */ |
const char* string; |
/* Length of string. */ |
int len; |
} s_string; |
/* For DEMANGLE_COMPONENT_*_PARAM. */ |
struct |
{ |
/* Parameter index. */ |
long number; |
} s_number; |
/* For DEMANGLE_COMPONENT_CHARACTER. */ |
struct |
{ |
int character; |
} s_character; |
/* For other types. */ |
struct |
{ |
/* Left (or only) subtree. */ |
struct demangle_component *left; |
/* Right subtree. */ |
struct demangle_component *right; |
} s_binary; |
struct |
{ |
/* subtree, same place as d_left. */ |
struct demangle_component *sub; |
/* integer. */ |
int num; |
} s_unary_num; |
} u; |
}; |
/* People building mangled trees are expected to allocate instances of |
struct demangle_component themselves. They can then call one of |
the following functions to fill them in. */ |
/* Fill in most component types with a left subtree and a right |
subtree. Returns non-zero on success, zero on failure, such as an |
unrecognized or inappropriate component type. */ |
extern int |
cplus_demangle_fill_component (struct demangle_component *fill, |
enum demangle_component_type, |
struct demangle_component *left, |
struct demangle_component *right); |
/* Fill in a DEMANGLE_COMPONENT_NAME. Returns non-zero on success, |
zero for bad arguments. */ |
extern int |
cplus_demangle_fill_name (struct demangle_component *fill, |
const char *, int); |
/* Fill in a DEMANGLE_COMPONENT_BUILTIN_TYPE, using the name of the |
builtin type (e.g., "int", etc.). Returns non-zero on success, |
zero if the type is not recognized. */ |
extern int |
cplus_demangle_fill_builtin_type (struct demangle_component *fill, |
const char *type_name); |
/* Fill in a DEMANGLE_COMPONENT_OPERATOR, using the name of the |
operator and the number of arguments which it takes (the latter is |
used to disambiguate operators which can be both binary and unary, |
such as '-'). Returns non-zero on success, zero if the operator is |
not recognized. */ |
extern int |
cplus_demangle_fill_operator (struct demangle_component *fill, |
const char *opname, int args); |
/* Fill in a DEMANGLE_COMPONENT_EXTENDED_OPERATOR, providing the |
number of arguments and the name. Returns non-zero on success, |
zero for bad arguments. */ |
extern int |
cplus_demangle_fill_extended_operator (struct demangle_component *fill, |
int numargs, |
struct demangle_component *nm); |
/* Fill in a DEMANGLE_COMPONENT_CTOR. Returns non-zero on success, |
zero for bad arguments. */ |
extern int |
cplus_demangle_fill_ctor (struct demangle_component *fill, |
enum gnu_v3_ctor_kinds kind, |
struct demangle_component *name); |
/* Fill in a DEMANGLE_COMPONENT_DTOR. Returns non-zero on success, |
zero for bad arguments. */ |
extern int |
cplus_demangle_fill_dtor (struct demangle_component *fill, |
enum gnu_v3_dtor_kinds kind, |
struct demangle_component *name); |
/* This function translates a mangled name into a struct |
demangle_component tree. The first argument is the mangled name. |
The second argument is DMGL_* options. This returns a pointer to a |
tree on success, or NULL on failure. On success, the third |
argument is set to a block of memory allocated by malloc. This |
block should be passed to free when the tree is no longer |
needed. */ |
extern struct demangle_component * |
cplus_demangle_v3_components (const char *mangled, int options, void **mem); |
/* This function takes a struct demangle_component tree and returns |
the corresponding demangled string. The first argument is DMGL_* |
options. The second is the tree to demangle. The third is a guess |
at the length of the demangled string, used to initially allocate |
the return buffer. The fourth is a pointer to a size_t. On |
success, this function returns a buffer allocated by malloc(), and |
sets the size_t pointed to by the fourth argument to the size of |
the allocated buffer (not the length of the returned string). On |
failure, this function returns NULL, and sets the size_t pointed to |
by the fourth argument to 0 for an invalid tree, or to 1 for a |
memory allocation error. */ |
extern char * |
cplus_demangle_print (int options, |
const struct demangle_component *tree, |
int estimated_length, |
size_t *p_allocated_size); |
/* This function takes a struct demangle_component tree and passes back |
a demangled string in one or more calls to a callback function. |
The first argument is DMGL_* options. The second is the tree to |
demangle. The third is a pointer to a callback function; on each call |
this receives an element of the demangled string, its length, and an |
opaque value. The fourth is the opaque value passed to the callback. |
The callback is called once or more to return the full demangled |
string. The demangled element string is always nul-terminated, though |
its length is also provided for convenience. In contrast to |
cplus_demangle_print(), this function does not allocate heap memory |
to grow output strings (except perhaps where alloca() is implemented |
by malloc()), and so is normally safe for use where the heap has been |
corrupted. On success, this function returns 1; on failure, 0. */ |
extern int |
cplus_demangle_print_callback (int options, |
const struct demangle_component *tree, |
demangle_callbackref callback, void *opaque); |
#ifdef __cplusplus |
} |
#endif /* __cplusplus */ |
#endif /* DEMANGLE_H */ |
/contrib/toolchain/binutils/include/dis-asm.h |
---|
0,0 → 1,382 |
/* Interface between the opcode library and its callers. |
Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, 2010, |
2011, 2012 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3, or (at your option) |
any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. |
Written by Cygnus Support, 1993. |
The opcode library (libopcodes.a) provides instruction decoders for |
a large variety of instruction sets, callable with an identical |
interface, for making instruction-processing programs more independent |
of the instruction set being processed. */ |
#ifndef DIS_ASM_H |
#define DIS_ASM_H |
#ifdef __cplusplus |
extern "C" { |
#endif |
#include <stdio.h> |
#include "bfd.h" |
typedef int (*fprintf_ftype) (void *, const char*, ...) ATTRIBUTE_FPTR_PRINTF_2; |
enum dis_insn_type |
{ |
dis_noninsn, /* Not a valid instruction. */ |
dis_nonbranch, /* Not a branch instruction. */ |
dis_branch, /* Unconditional branch. */ |
dis_condbranch, /* Conditional branch. */ |
dis_jsr, /* Jump to subroutine. */ |
dis_condjsr, /* Conditional jump to subroutine. */ |
dis_dref, /* Data reference instruction. */ |
dis_dref2 /* Two data references in instruction. */ |
}; |
/* This struct is passed into the instruction decoding routine, |
and is passed back out into each callback. The various fields are used |
for conveying information from your main routine into your callbacks, |
for passing information into the instruction decoders (such as the |
addresses of the callback functions), or for passing information |
back from the instruction decoders to their callers. |
It must be initialized before it is first passed; this can be done |
by hand, or using one of the initialization macros below. */ |
typedef struct disassemble_info |
{ |
fprintf_ftype fprintf_func; |
void *stream; |
void *application_data; |
/* Target description. We could replace this with a pointer to the bfd, |
but that would require one. There currently isn't any such requirement |
so to avoid introducing one we record these explicitly. */ |
/* The bfd_flavour. This can be bfd_target_unknown_flavour. */ |
enum bfd_flavour flavour; |
/* The bfd_arch value. */ |
enum bfd_architecture arch; |
/* The bfd_mach value. */ |
unsigned long mach; |
/* Endianness (for bi-endian cpus). Mono-endian cpus can ignore this. */ |
enum bfd_endian endian; |
/* Endianness of code, for mixed-endian situations such as ARM BE8. */ |
enum bfd_endian endian_code; |
/* An arch/mach-specific bitmask of selected instruction subsets, mainly |
for processors with run-time-switchable instruction sets. The default, |
zero, means that there is no constraint. CGEN-based opcodes ports |
may use ISA_foo masks. */ |
void *insn_sets; |
/* Some targets need information about the current section to accurately |
display insns. If this is NULL, the target disassembler function |
will have to make its best guess. */ |
asection *section; |
/* An array of pointers to symbols either at the location being disassembled |
or at the start of the function being disassembled. The array is sorted |
so that the first symbol is intended to be the one used. The others are |
present for any misc. purposes. This is not set reliably, but if it is |
not NULL, it is correct. */ |
asymbol **symbols; |
/* Number of symbols in array. */ |
int num_symbols; |
/* Symbol table provided for targets that want to look at it. This is |
used on Arm to find mapping symbols and determine Arm/Thumb code. */ |
asymbol **symtab; |
int symtab_pos; |
int symtab_size; |
/* For use by the disassembler. |
The top 16 bits are reserved for public use (and are documented here). |
The bottom 16 bits are for the internal use of the disassembler. */ |
unsigned long flags; |
/* Set if the disassembler has determined that there are one or more |
relocations associated with the instruction being disassembled. */ |
#define INSN_HAS_RELOC (1 << 31) |
/* Set if the user has requested the disassembly of data as well as code. */ |
#define DISASSEMBLE_DATA (1 << 30) |
/* Set if the user has specifically set the machine type encoded in the |
mach field of this structure. */ |
#define USER_SPECIFIED_MACHINE_TYPE (1 << 29) |
/* Use internally by the target specific disassembly code. */ |
void *private_data; |
/* Function used to get bytes to disassemble. MEMADDR is the |
address of the stuff to be disassembled, MYADDR is the address to |
put the bytes in, and LENGTH is the number of bytes to read. |
INFO is a pointer to this struct. |
Returns an errno value or 0 for success. */ |
int (*read_memory_func) |
(bfd_vma memaddr, bfd_byte *myaddr, unsigned int length, |
struct disassemble_info *dinfo); |
/* Function which should be called if we get an error that we can't |
recover from. STATUS is the errno value from read_memory_func and |
MEMADDR is the address that we were trying to read. INFO is a |
pointer to this struct. */ |
void (*memory_error_func) |
(int status, bfd_vma memaddr, struct disassemble_info *dinfo); |
/* Function called to print ADDR. */ |
void (*print_address_func) |
(bfd_vma addr, struct disassemble_info *dinfo); |
/* Function called to determine if there is a symbol at the given ADDR. |
If there is, the function returns 1, otherwise it returns 0. |
This is used by ports which support an overlay manager where |
the overlay number is held in the top part of an address. In |
some circumstances we want to include the overlay number in the |
address, (normally because there is a symbol associated with |
that address), but sometimes we want to mask out the overlay bits. */ |
int (* symbol_at_address_func) |
(bfd_vma addr, struct disassemble_info *dinfo); |
/* Function called to check if a SYMBOL is can be displayed to the user. |
This is used by some ports that want to hide special symbols when |
displaying debugging outout. */ |
bfd_boolean (* symbol_is_valid) |
(asymbol *, struct disassemble_info *dinfo); |
/* These are for buffer_read_memory. */ |
bfd_byte *buffer; |
bfd_vma buffer_vma; |
unsigned int buffer_length; |
/* This variable may be set by the instruction decoder. It suggests |
the number of bytes objdump should display on a single line. If |
the instruction decoder sets this, it should always set it to |
the same value in order to get reasonable looking output. */ |
int bytes_per_line; |
/* The next two variables control the way objdump displays the raw data. */ |
/* For example, if bytes_per_line is 8 and bytes_per_chunk is 4, the */ |
/* output will look like this: |
00: 00000000 00000000 |
with the chunks displayed according to "display_endian". */ |
int bytes_per_chunk; |
enum bfd_endian display_endian; |
/* Number of octets per incremented target address |
Normally one, but some DSPs have byte sizes of 16 or 32 bits. */ |
unsigned int octets_per_byte; |
/* The number of zeroes we want to see at the end of a section before we |
start skipping them. */ |
unsigned int skip_zeroes; |
/* The number of zeroes to skip at the end of a section. If the number |
of zeroes at the end is between SKIP_ZEROES_AT_END and SKIP_ZEROES, |
they will be disassembled. If there are fewer than |
SKIP_ZEROES_AT_END, they will be skipped. This is a heuristic |
attempt to avoid disassembling zeroes inserted by section |
alignment. */ |
unsigned int skip_zeroes_at_end; |
/* Whether the disassembler always needs the relocations. */ |
bfd_boolean disassembler_needs_relocs; |
/* Results from instruction decoders. Not all decoders yet support |
this information. This info is set each time an instruction is |
decoded, and is only valid for the last such instruction. |
To determine whether this decoder supports this information, set |
insn_info_valid to 0, decode an instruction, then check it. */ |
char insn_info_valid; /* Branch info has been set. */ |
char branch_delay_insns; /* How many sequential insn's will run before |
a branch takes effect. (0 = normal) */ |
char data_size; /* Size of data reference in insn, in bytes */ |
enum dis_insn_type insn_type; /* Type of instruction */ |
bfd_vma target; /* Target address of branch or dref, if known; |
zero if unknown. */ |
bfd_vma target2; /* Second target address for dref2 */ |
/* Command line options specific to the target disassembler. */ |
char * disassembler_options; |
} disassemble_info; |
/* Standard disassemblers. Disassemble one instruction at the given |
target address. Return number of octets processed. */ |
typedef int (*disassembler_ftype) (bfd_vma, disassemble_info *); |
extern int print_insn_aarch64 (bfd_vma, disassemble_info *); |
extern int print_insn_alpha (bfd_vma, disassemble_info *); |
extern int print_insn_avr (bfd_vma, disassemble_info *); |
extern int print_insn_bfin (bfd_vma, disassemble_info *); |
extern int print_insn_big_arm (bfd_vma, disassemble_info *); |
extern int print_insn_big_mips (bfd_vma, disassemble_info *); |
extern int print_insn_big_nios2 (bfd_vma, disassemble_info *); |
extern int print_insn_big_or32 (bfd_vma, disassemble_info *); |
extern int print_insn_big_powerpc (bfd_vma, disassemble_info *); |
extern int print_insn_big_score (bfd_vma, disassemble_info *); |
extern int print_insn_cr16 (bfd_vma, disassemble_info *); |
extern int print_insn_crx (bfd_vma, disassemble_info *); |
extern int print_insn_d10v (bfd_vma, disassemble_info *); |
extern int print_insn_d30v (bfd_vma, disassemble_info *); |
extern int print_insn_dlx (bfd_vma, disassemble_info *); |
extern int print_insn_epiphany (bfd_vma, disassemble_info *); |
extern int print_insn_fr30 (bfd_vma, disassemble_info *); |
extern int print_insn_frv (bfd_vma, disassemble_info *); |
extern int print_insn_h8300 (bfd_vma, disassemble_info *); |
extern int print_insn_h8300h (bfd_vma, disassemble_info *); |
extern int print_insn_h8300s (bfd_vma, disassemble_info *); |
extern int print_insn_h8500 (bfd_vma, disassemble_info *); |
extern int print_insn_hppa (bfd_vma, disassemble_info *); |
extern int print_insn_i370 (bfd_vma, disassemble_info *); |
extern int print_insn_i386 (bfd_vma, disassemble_info *); |
extern int print_insn_i386_att (bfd_vma, disassemble_info *); |
extern int print_insn_i386_intel (bfd_vma, disassemble_info *); |
extern int print_insn_i860 (bfd_vma, disassemble_info *); |
extern int print_insn_i960 (bfd_vma, disassemble_info *); |
extern int print_insn_ia64 (bfd_vma, disassemble_info *); |
extern int print_insn_ip2k (bfd_vma, disassemble_info *); |
extern int print_insn_iq2000 (bfd_vma, disassemble_info *); |
extern int print_insn_little_arm (bfd_vma, disassemble_info *); |
extern int print_insn_little_mips (bfd_vma, disassemble_info *); |
extern int print_insn_little_nios2 (bfd_vma, disassemble_info *); |
extern int print_insn_little_or32 (bfd_vma, disassemble_info *); |
extern int print_insn_little_powerpc (bfd_vma, disassemble_info *); |
extern int print_insn_little_score (bfd_vma, disassemble_info *); |
extern int print_insn_lm32 (bfd_vma, disassemble_info *); |
extern int print_insn_m32c (bfd_vma, disassemble_info *); |
extern int print_insn_m32r (bfd_vma, disassemble_info *); |
extern int print_insn_m68hc11 (bfd_vma, disassemble_info *); |
extern int print_insn_m68hc12 (bfd_vma, disassemble_info *); |
extern int print_insn_m9s12x (bfd_vma, disassemble_info *); |
extern int print_insn_m9s12xg (bfd_vma, disassemble_info *); |
extern int print_insn_m68k (bfd_vma, disassemble_info *); |
extern int print_insn_m88k (bfd_vma, disassemble_info *); |
extern int print_insn_mcore (bfd_vma, disassemble_info *); |
extern int print_insn_mep (bfd_vma, disassemble_info *); |
extern int print_insn_metag (bfd_vma, disassemble_info *); |
extern int print_insn_microblaze (bfd_vma, disassemble_info *); |
extern int print_insn_mmix (bfd_vma, disassemble_info *); |
extern int print_insn_mn10200 (bfd_vma, disassemble_info *); |
extern int print_insn_mn10300 (bfd_vma, disassemble_info *); |
extern int print_insn_moxie (bfd_vma, disassemble_info *); |
extern int print_insn_msp430 (bfd_vma, disassemble_info *); |
extern int print_insn_mt (bfd_vma, disassemble_info *); |
extern int print_insn_ns32k (bfd_vma, disassemble_info *); |
extern int print_insn_openrisc (bfd_vma, disassemble_info *); |
extern int print_insn_pdp11 (bfd_vma, disassemble_info *); |
extern int print_insn_pj (bfd_vma, disassemble_info *); |
extern int print_insn_rs6000 (bfd_vma, disassemble_info *); |
extern int print_insn_s390 (bfd_vma, disassemble_info *); |
extern int print_insn_sh (bfd_vma, disassemble_info *); |
extern int print_insn_sh64 (bfd_vma, disassemble_info *); |
extern int print_insn_sh64x_media (bfd_vma, disassemble_info *); |
extern int print_insn_sparc (bfd_vma, disassemble_info *); |
extern int print_insn_spu (bfd_vma, disassemble_info *); |
extern int print_insn_tic30 (bfd_vma, disassemble_info *); |
extern int print_insn_tic4x (bfd_vma, disassemble_info *); |
extern int print_insn_tic54x (bfd_vma, disassemble_info *); |
extern int print_insn_tic6x (bfd_vma, disassemble_info *); |
extern int print_insn_tic80 (bfd_vma, disassemble_info *); |
extern int print_insn_tilegx (bfd_vma, disassemble_info *); |
extern int print_insn_tilepro (bfd_vma, disassemble_info *); |
extern int print_insn_v850 (bfd_vma, disassemble_info *); |
extern int print_insn_vax (bfd_vma, disassemble_info *); |
extern int print_insn_w65 (bfd_vma, disassemble_info *); |
extern int print_insn_xc16x (bfd_vma, disassemble_info *); |
extern int print_insn_xgate (bfd_vma, disassemble_info *); |
extern int print_insn_xstormy16 (bfd_vma, disassemble_info *); |
extern int print_insn_xtensa (bfd_vma, disassemble_info *); |
extern int print_insn_z80 (bfd_vma, disassemble_info *); |
extern int print_insn_z8001 (bfd_vma, disassemble_info *); |
extern int print_insn_z8002 (bfd_vma, disassemble_info *); |
extern int print_insn_rx (bfd_vma, disassemble_info *); |
extern int print_insn_rl78 (bfd_vma, disassemble_info *); |
extern disassembler_ftype arc_get_disassembler (void *); |
extern disassembler_ftype cris_get_disassembler (bfd *); |
extern void print_aarch64_disassembler_options (FILE *); |
extern void print_i386_disassembler_options (FILE *); |
extern void print_mips_disassembler_options (FILE *); |
extern void print_ppc_disassembler_options (FILE *); |
extern void print_arm_disassembler_options (FILE *); |
extern void parse_arm_disassembler_option (char *); |
extern void print_s390_disassembler_options (FILE *); |
extern int get_arm_regname_num_options (void); |
extern int set_arm_regname_option (int); |
extern int get_arm_regnames (int, const char **, const char **, const char *const **); |
extern bfd_boolean aarch64_symbol_is_valid (asymbol *, struct disassemble_info *); |
extern bfd_boolean arm_symbol_is_valid (asymbol *, struct disassemble_info *); |
extern void disassemble_init_powerpc (struct disassemble_info *); |
/* Fetch the disassembler for a given BFD, if that support is available. */ |
extern disassembler_ftype disassembler (bfd *); |
/* Amend the disassemble_info structure as necessary for the target architecture. |
Should only be called after initialising the info->arch field. */ |
extern void disassemble_init_for_target (struct disassemble_info * dinfo); |
/* Document any target specific options available from the disassembler. */ |
extern void disassembler_usage (FILE *); |
/* This block of definitions is for particular callers who read instructions |
into a buffer before calling the instruction decoder. */ |
/* Here is a function which callers may wish to use for read_memory_func. |
It gets bytes from a buffer. */ |
extern int buffer_read_memory |
(bfd_vma, bfd_byte *, unsigned int, struct disassemble_info *); |
/* This function goes with buffer_read_memory. |
It prints a message using info->fprintf_func and info->stream. */ |
extern void perror_memory (int, bfd_vma, struct disassemble_info *); |
/* Just print the address in hex. This is included for completeness even |
though both GDB and objdump provide their own (to print symbolic |
addresses). */ |
extern void generic_print_address |
(bfd_vma, struct disassemble_info *); |
/* Always true. */ |
extern int generic_symbol_at_address |
(bfd_vma, struct disassemble_info *); |
/* Also always true. */ |
extern bfd_boolean generic_symbol_is_valid |
(asymbol *, struct disassemble_info *); |
/* Method to initialize a disassemble_info struct. This should be |
called by all applications creating such a struct. */ |
extern void init_disassemble_info (struct disassemble_info *dinfo, void *stream, |
fprintf_ftype fprintf_func); |
/* For compatibility with existing code. */ |
#define INIT_DISASSEMBLE_INFO(INFO, STREAM, FPRINTF_FUNC) \ |
init_disassemble_info (&(INFO), (STREAM), (fprintf_ftype) (FPRINTF_FUNC)) |
#define INIT_DISASSEMBLE_INFO_NO_ARCH(INFO, STREAM, FPRINTF_FUNC) \ |
init_disassemble_info (&(INFO), (STREAM), (fprintf_ftype) (FPRINTF_FUNC)) |
#ifdef __cplusplus |
} |
#endif |
#endif /* ! defined (DIS_ASM_H) */ |
/contrib/toolchain/binutils/include/dwarf2.def |
---|
0,0 → 1,688 |
/* -*- c -*- |
Declarations and definitions of codes relating to the DWARF2 and |
DWARF3 symbolic debugging information formats. |
Copyright (C) 1992, 1993, 1995, 1996, 1997, 1999, 2000, 2001, 2002, |
2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 |
Free Software Foundation, Inc. |
Written by Gary Funck (gary@intrepid.com) The Ada Joint Program |
Office (AJPO), Florida State University and Silicon Graphics Inc. |
provided support for this effort -- June 21, 1995. |
Derived from the DWARF 1 implementation written by Ron Guilmette |
(rfg@netcom.com), November 1990. |
This file is part of GCC. |
GCC is free software; you can redistribute it and/or modify it under |
the terms of the GNU General Public License as published by the Free |
Software Foundation; either version 3, or (at your option) any later |
version. |
GCC is distributed in the hope that it will be useful, but WITHOUT |
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY |
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public |
License for more details. |
Under Section 7 of GPL version 3, you are granted additional |
permissions described in the GCC Runtime Library Exception, version |
3.1, as published by the Free Software Foundation. |
You should have received a copy of the GNU General Public License and |
a copy of the GCC Runtime Library Exception along with this program; |
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see |
<http://www.gnu.org/licenses/>. */ |
/* This file is derived from the DWARF specification (a public document) |
Revision 2.0.0 (July 27, 1993) developed by the UNIX International |
Programming Languages Special Interest Group (UI/PLSIG) and distributed |
by UNIX International. Copies of this specification are available from |
UNIX International, 20 Waterview Boulevard, Parsippany, NJ, 07054. |
This file also now contains definitions from the DWARF 3 specification |
published Dec 20, 2005, available from: http://dwarf.freestandards.org. |
This file also now contains definitions from the DWARF 4 |
specification, available from: http://dwarfstd.org/ */ |
/* This file declares various DWARF-related constants using a set of |
macros which can be redefined by the including file. |
The macros are in sections. Each section corresponds to a single |
set of DWARF constants and has a corresponding key. The key is |
used in all the macro names. |
The sections are TAG (for DW_TAG_ constants), FORM (DW_FORM_), AT |
(DW_AT_), OP (DW_OP_), ATE (DW_ATE_), and CFA (DW_CFA_). |
Using TAG as an example, the following macros may be used for each |
key: |
DW_FIRST_TAG(name, value) - Introduce the first DW_TAG constant. |
DW_TAG(name, value) - Define a subsequent constant. |
DW_TAG_DUP(name, value) - Define a subsequent constant whose value |
is a duplicate of some other constant. Not all keys use the _DUP |
macro form. If more than one name shares a value, then the base |
(DW_TAG) form will be the preferred name and DW_TAG_DUP will hold |
any alternate names. |
DW_END_TAG - Invoked at the end of the DW_TAG constants. */ |
DW_FIRST_TAG (DW_TAG_padding, 0x00) |
DW_TAG (DW_TAG_array_type, 0x01) |
DW_TAG (DW_TAG_class_type, 0x02) |
DW_TAG (DW_TAG_entry_point, 0x03) |
DW_TAG (DW_TAG_enumeration_type, 0x04) |
DW_TAG (DW_TAG_formal_parameter, 0x05) |
DW_TAG (DW_TAG_imported_declaration, 0x08) |
DW_TAG (DW_TAG_label, 0x0a) |
DW_TAG (DW_TAG_lexical_block, 0x0b) |
DW_TAG (DW_TAG_member, 0x0d) |
DW_TAG (DW_TAG_pointer_type, 0x0f) |
DW_TAG (DW_TAG_reference_type, 0x10) |
DW_TAG (DW_TAG_compile_unit, 0x11) |
DW_TAG (DW_TAG_string_type, 0x12) |
DW_TAG (DW_TAG_structure_type, 0x13) |
DW_TAG (DW_TAG_subroutine_type, 0x15) |
DW_TAG (DW_TAG_typedef, 0x16) |
DW_TAG (DW_TAG_union_type, 0x17) |
DW_TAG (DW_TAG_unspecified_parameters, 0x18) |
DW_TAG (DW_TAG_variant, 0x19) |
DW_TAG (DW_TAG_common_block, 0x1a) |
DW_TAG (DW_TAG_common_inclusion, 0x1b) |
DW_TAG (DW_TAG_inheritance, 0x1c) |
DW_TAG (DW_TAG_inlined_subroutine, 0x1d) |
DW_TAG (DW_TAG_module, 0x1e) |
DW_TAG (DW_TAG_ptr_to_member_type, 0x1f) |
DW_TAG (DW_TAG_set_type, 0x20) |
DW_TAG (DW_TAG_subrange_type, 0x21) |
DW_TAG (DW_TAG_with_stmt, 0x22) |
DW_TAG (DW_TAG_access_declaration, 0x23) |
DW_TAG (DW_TAG_base_type, 0x24) |
DW_TAG (DW_TAG_catch_block, 0x25) |
DW_TAG (DW_TAG_const_type, 0x26) |
DW_TAG (DW_TAG_constant, 0x27) |
DW_TAG (DW_TAG_enumerator, 0x28) |
DW_TAG (DW_TAG_file_type, 0x29) |
DW_TAG (DW_TAG_friend, 0x2a) |
DW_TAG (DW_TAG_namelist, 0x2b) |
DW_TAG (DW_TAG_namelist_item, 0x2c) |
DW_TAG (DW_TAG_packed_type, 0x2d) |
DW_TAG (DW_TAG_subprogram, 0x2e) |
DW_TAG (DW_TAG_template_type_param, 0x2f) |
DW_TAG (DW_TAG_template_value_param, 0x30) |
DW_TAG (DW_TAG_thrown_type, 0x31) |
DW_TAG (DW_TAG_try_block, 0x32) |
DW_TAG (DW_TAG_variant_part, 0x33) |
DW_TAG (DW_TAG_variable, 0x34) |
DW_TAG (DW_TAG_volatile_type, 0x35) |
/* DWARF 3. */ |
DW_TAG (DW_TAG_dwarf_procedure, 0x36) |
DW_TAG (DW_TAG_restrict_type, 0x37) |
DW_TAG (DW_TAG_interface_type, 0x38) |
DW_TAG (DW_TAG_namespace, 0x39) |
DW_TAG (DW_TAG_imported_module, 0x3a) |
DW_TAG (DW_TAG_unspecified_type, 0x3b) |
DW_TAG (DW_TAG_partial_unit, 0x3c) |
DW_TAG (DW_TAG_imported_unit, 0x3d) |
DW_TAG (DW_TAG_condition, 0x3f) |
DW_TAG (DW_TAG_shared_type, 0x40) |
/* DWARF 4. */ |
DW_TAG (DW_TAG_type_unit, 0x41) |
DW_TAG (DW_TAG_rvalue_reference_type, 0x42) |
DW_TAG (DW_TAG_template_alias, 0x43) |
DW_TAG_DUP (DW_TAG_lo_user, 0x4080) |
DW_TAG_DUP (DW_TAG_hi_user, 0xffff) |
/* SGI/MIPS Extensions. */ |
DW_TAG (DW_TAG_MIPS_loop, 0x4081) |
/* HP extensions. See: ftp://ftp.hp.com/pub/lang/tools/WDB/wdb-4.0.tar.gz . */ |
DW_TAG (DW_TAG_HP_array_descriptor, 0x4090) |
DW_TAG (DW_TAG_HP_Bliss_field, 0x4091) |
DW_TAG (DW_TAG_HP_Bliss_field_set, 0x4092) |
/* GNU extensions. */ |
DW_TAG (DW_TAG_format_label, 0x4101) /* For FORTRAN 77 and Fortran 90. */ |
DW_TAG (DW_TAG_function_template, 0x4102) /* For C++. */ |
DW_TAG (DW_TAG_class_template, 0x4103) /* For C++. */ |
DW_TAG (DW_TAG_GNU_BINCL, 0x4104) |
DW_TAG (DW_TAG_GNU_EINCL, 0x4105) |
/* Template template parameter. |
See http://gcc.gnu.org/wiki/TemplateParmsDwarf . */ |
DW_TAG (DW_TAG_GNU_template_template_param, 0x4106) |
/* Template parameter pack extension, specified at |
http://wiki.dwarfstd.org/index.php?title=C%2B%2B0x:_Variadic_templates |
The values of these two TAGS are in the DW_TAG_GNU_* space until the tags |
are properly part of DWARF 5. */ |
DW_TAG (DW_TAG_GNU_template_parameter_pack, 0x4107) |
DW_TAG (DW_TAG_GNU_formal_parameter_pack, 0x4108) |
/* The GNU call site extension, specified at |
http://www.dwarfstd.org/ShowIssue.php?issue=100909.2&type=open . |
The values of these two TAGS are in the DW_TAG_GNU_* space until the tags |
are properly part of DWARF 5. */ |
DW_TAG (DW_TAG_GNU_call_site, 0x4109) |
DW_TAG (DW_TAG_GNU_call_site_parameter, 0x410a) |
/* Extensions for UPC. See: http://dwarfstd.org/doc/DWARF4.pdf. */ |
DW_TAG (DW_TAG_upc_shared_type, 0x8765) |
DW_TAG (DW_TAG_upc_strict_type, 0x8766) |
DW_TAG (DW_TAG_upc_relaxed_type, 0x8767) |
/* PGI (STMicroelectronics) extensions. No documentation available. */ |
DW_TAG (DW_TAG_PGI_kanji_type, 0xA000) |
DW_TAG (DW_TAG_PGI_interface_block, 0xA020) |
DW_END_TAG |
DW_FIRST_FORM (DW_FORM_addr, 0x01) |
DW_FORM (DW_FORM_block2, 0x03) |
DW_FORM (DW_FORM_block4, 0x04) |
DW_FORM (DW_FORM_data2, 0x05) |
DW_FORM (DW_FORM_data4, 0x06) |
DW_FORM (DW_FORM_data8, 0x07) |
DW_FORM (DW_FORM_string, 0x08) |
DW_FORM (DW_FORM_block, 0x09) |
DW_FORM (DW_FORM_block1, 0x0a) |
DW_FORM (DW_FORM_data1, 0x0b) |
DW_FORM (DW_FORM_flag, 0x0c) |
DW_FORM (DW_FORM_sdata, 0x0d) |
DW_FORM (DW_FORM_strp, 0x0e) |
DW_FORM (DW_FORM_udata, 0x0f) |
DW_FORM (DW_FORM_ref_addr, 0x10) |
DW_FORM (DW_FORM_ref1, 0x11) |
DW_FORM (DW_FORM_ref2, 0x12) |
DW_FORM (DW_FORM_ref4, 0x13) |
DW_FORM (DW_FORM_ref8, 0x14) |
DW_FORM (DW_FORM_ref_udata, 0x15) |
DW_FORM (DW_FORM_indirect, 0x16) |
/* DWARF 4. */ |
DW_FORM (DW_FORM_sec_offset, 0x17) |
DW_FORM (DW_FORM_exprloc, 0x18) |
DW_FORM (DW_FORM_flag_present, 0x19) |
DW_FORM (DW_FORM_ref_sig8, 0x20) |
/* Extensions for Fission. See http://gcc.gnu.org/wiki/DebugFission. */ |
DW_FORM (DW_FORM_GNU_addr_index, 0x1f01) |
DW_FORM (DW_FORM_GNU_str_index, 0x1f02) |
/* Extensions for DWZ multifile. |
See http://www.dwarfstd.org/ShowIssue.php?issue=120604.1&type=open . */ |
DW_FORM (DW_FORM_GNU_ref_alt, 0x1f20) |
DW_FORM (DW_FORM_GNU_strp_alt, 0x1f21) |
DW_END_FORM |
DW_FIRST_AT (DW_AT_sibling, 0x01) |
DW_AT (DW_AT_location, 0x02) |
DW_AT (DW_AT_name, 0x03) |
DW_AT (DW_AT_ordering, 0x09) |
DW_AT (DW_AT_subscr_data, 0x0a) |
DW_AT (DW_AT_byte_size, 0x0b) |
DW_AT (DW_AT_bit_offset, 0x0c) |
DW_AT (DW_AT_bit_size, 0x0d) |
DW_AT (DW_AT_element_list, 0x0f) |
DW_AT (DW_AT_stmt_list, 0x10) |
DW_AT (DW_AT_low_pc, 0x11) |
DW_AT (DW_AT_high_pc, 0x12) |
DW_AT (DW_AT_language, 0x13) |
DW_AT (DW_AT_member, 0x14) |
DW_AT (DW_AT_discr, 0x15) |
DW_AT (DW_AT_discr_value, 0x16) |
DW_AT (DW_AT_visibility, 0x17) |
DW_AT (DW_AT_import, 0x18) |
DW_AT (DW_AT_string_length, 0x19) |
DW_AT (DW_AT_common_reference, 0x1a) |
DW_AT (DW_AT_comp_dir, 0x1b) |
DW_AT (DW_AT_const_value, 0x1c) |
DW_AT (DW_AT_containing_type, 0x1d) |
DW_AT (DW_AT_default_value, 0x1e) |
DW_AT (DW_AT_inline, 0x20) |
DW_AT (DW_AT_is_optional, 0x21) |
DW_AT (DW_AT_lower_bound, 0x22) |
DW_AT (DW_AT_producer, 0x25) |
DW_AT (DW_AT_prototyped, 0x27) |
DW_AT (DW_AT_return_addr, 0x2a) |
DW_AT (DW_AT_start_scope, 0x2c) |
DW_AT (DW_AT_bit_stride, 0x2e) |
DW_AT (DW_AT_upper_bound, 0x2f) |
DW_AT (DW_AT_abstract_origin, 0x31) |
DW_AT (DW_AT_accessibility, 0x32) |
DW_AT (DW_AT_address_class, 0x33) |
DW_AT (DW_AT_artificial, 0x34) |
DW_AT (DW_AT_base_types, 0x35) |
DW_AT (DW_AT_calling_convention, 0x36) |
DW_AT (DW_AT_count, 0x37) |
DW_AT (DW_AT_data_member_location, 0x38) |
DW_AT (DW_AT_decl_column, 0x39) |
DW_AT (DW_AT_decl_file, 0x3a) |
DW_AT (DW_AT_decl_line, 0x3b) |
DW_AT (DW_AT_declaration, 0x3c) |
DW_AT (DW_AT_discr_list, 0x3d) |
DW_AT (DW_AT_encoding, 0x3e) |
DW_AT (DW_AT_external, 0x3f) |
DW_AT (DW_AT_frame_base, 0x40) |
DW_AT (DW_AT_friend, 0x41) |
DW_AT (DW_AT_identifier_case, 0x42) |
DW_AT (DW_AT_macro_info, 0x43) |
DW_AT (DW_AT_namelist_items, 0x44) |
DW_AT (DW_AT_priority, 0x45) |
DW_AT (DW_AT_segment, 0x46) |
DW_AT (DW_AT_specification, 0x47) |
DW_AT (DW_AT_static_link, 0x48) |
DW_AT (DW_AT_type, 0x49) |
DW_AT (DW_AT_use_location, 0x4a) |
DW_AT (DW_AT_variable_parameter, 0x4b) |
DW_AT (DW_AT_virtuality, 0x4c) |
DW_AT (DW_AT_vtable_elem_location, 0x4d) |
/* DWARF 3 values. */ |
DW_AT (DW_AT_allocated, 0x4e) |
DW_AT (DW_AT_associated, 0x4f) |
DW_AT (DW_AT_data_location, 0x50) |
DW_AT (DW_AT_byte_stride, 0x51) |
DW_AT (DW_AT_entry_pc, 0x52) |
DW_AT (DW_AT_use_UTF8, 0x53) |
DW_AT (DW_AT_extension, 0x54) |
DW_AT (DW_AT_ranges, 0x55) |
DW_AT (DW_AT_trampoline, 0x56) |
DW_AT (DW_AT_call_column, 0x57) |
DW_AT (DW_AT_call_file, 0x58) |
DW_AT (DW_AT_call_line, 0x59) |
DW_AT (DW_AT_description, 0x5a) |
DW_AT (DW_AT_binary_scale, 0x5b) |
DW_AT (DW_AT_decimal_scale, 0x5c) |
DW_AT (DW_AT_small, 0x5d) |
DW_AT (DW_AT_decimal_sign, 0x5e) |
DW_AT (DW_AT_digit_count, 0x5f) |
DW_AT (DW_AT_picture_string, 0x60) |
DW_AT (DW_AT_mutable, 0x61) |
DW_AT (DW_AT_threads_scaled, 0x62) |
DW_AT (DW_AT_explicit, 0x63) |
DW_AT (DW_AT_object_pointer, 0x64) |
DW_AT (DW_AT_endianity, 0x65) |
DW_AT (DW_AT_elemental, 0x66) |
DW_AT (DW_AT_pure, 0x67) |
DW_AT (DW_AT_recursive, 0x68) |
/* DWARF 4. */ |
DW_AT (DW_AT_signature, 0x69) |
DW_AT (DW_AT_main_subprogram, 0x6a) |
DW_AT (DW_AT_data_bit_offset, 0x6b) |
DW_AT (DW_AT_const_expr, 0x6c) |
DW_AT (DW_AT_enum_class, 0x6d) |
DW_AT (DW_AT_linkage_name, 0x6e) |
DW_AT_DUP (DW_AT_lo_user, 0x2000) /* Implementation-defined range start. */ |
DW_AT_DUP (DW_AT_hi_user, 0x3fff) /* Implementation-defined range end. */ |
/* SGI/MIPS extensions. */ |
DW_AT (DW_AT_MIPS_fde, 0x2001) |
DW_AT (DW_AT_MIPS_loop_begin, 0x2002) |
DW_AT (DW_AT_MIPS_tail_loop_begin, 0x2003) |
DW_AT (DW_AT_MIPS_epilog_begin, 0x2004) |
DW_AT (DW_AT_MIPS_loop_unroll_factor, 0x2005) |
DW_AT (DW_AT_MIPS_software_pipeline_depth, 0x2006) |
DW_AT (DW_AT_MIPS_linkage_name, 0x2007) |
DW_AT (DW_AT_MIPS_stride, 0x2008) |
DW_AT (DW_AT_MIPS_abstract_name, 0x2009) |
DW_AT (DW_AT_MIPS_clone_origin, 0x200a) |
DW_AT (DW_AT_MIPS_has_inlines, 0x200b) |
/* HP extensions. */ |
DW_AT (DW_AT_HP_block_index, 0x2000) |
DW_AT_DUP (DW_AT_HP_unmodifiable, 0x2001) /* Same as DW_AT_MIPS_fde. */ |
DW_AT_DUP (DW_AT_HP_prologue, 0x2005) /* Same as DW_AT_MIPS_loop_unroll. */ |
DW_AT_DUP (DW_AT_HP_epilogue, 0x2008) /* Same as DW_AT_MIPS_stride. */ |
DW_AT (DW_AT_HP_actuals_stmt_list, 0x2010) |
DW_AT (DW_AT_HP_proc_per_section, 0x2011) |
DW_AT (DW_AT_HP_raw_data_ptr, 0x2012) |
DW_AT (DW_AT_HP_pass_by_reference, 0x2013) |
DW_AT (DW_AT_HP_opt_level, 0x2014) |
DW_AT (DW_AT_HP_prof_version_id, 0x2015) |
DW_AT (DW_AT_HP_opt_flags, 0x2016) |
DW_AT (DW_AT_HP_cold_region_low_pc, 0x2017) |
DW_AT (DW_AT_HP_cold_region_high_pc, 0x2018) |
DW_AT (DW_AT_HP_all_variables_modifiable, 0x2019) |
DW_AT (DW_AT_HP_linkage_name, 0x201a) |
DW_AT (DW_AT_HP_prof_flags, 0x201b) /* In comp unit of procs_info for -g. */ |
DW_AT (DW_AT_HP_unit_name, 0x201f) |
DW_AT (DW_AT_HP_unit_size, 0x2020) |
DW_AT (DW_AT_HP_widened_byte_size, 0x2021) |
DW_AT (DW_AT_HP_definition_points, 0x2022) |
DW_AT (DW_AT_HP_default_location, 0x2023) |
DW_AT (DW_AT_HP_is_result_param, 0x2029) |
/* GNU extensions. */ |
DW_AT (DW_AT_sf_names, 0x2101) |
DW_AT (DW_AT_src_info, 0x2102) |
DW_AT (DW_AT_mac_info, 0x2103) |
DW_AT (DW_AT_src_coords, 0x2104) |
DW_AT (DW_AT_body_begin, 0x2105) |
DW_AT (DW_AT_body_end, 0x2106) |
DW_AT (DW_AT_GNU_vector, 0x2107) |
/* Thread-safety annotations. |
See http://gcc.gnu.org/wiki/ThreadSafetyAnnotation . */ |
DW_AT (DW_AT_GNU_guarded_by, 0x2108) |
DW_AT (DW_AT_GNU_pt_guarded_by, 0x2109) |
DW_AT (DW_AT_GNU_guarded, 0x210a) |
DW_AT (DW_AT_GNU_pt_guarded, 0x210b) |
DW_AT (DW_AT_GNU_locks_excluded, 0x210c) |
DW_AT (DW_AT_GNU_exclusive_locks_required, 0x210d) |
DW_AT (DW_AT_GNU_shared_locks_required, 0x210e) |
/* One-definition rule violation detection. |
See http://gcc.gnu.org/wiki/DwarfSeparateTypeInfo . */ |
DW_AT (DW_AT_GNU_odr_signature, 0x210f) |
/* Template template argument name. |
See http://gcc.gnu.org/wiki/TemplateParmsDwarf . */ |
DW_AT (DW_AT_GNU_template_name, 0x2110) |
/* The GNU call site extension. |
See http://www.dwarfstd.org/ShowIssue.php?issue=100909.2&type=open . */ |
DW_AT (DW_AT_GNU_call_site_value, 0x2111) |
DW_AT (DW_AT_GNU_call_site_data_value, 0x2112) |
DW_AT (DW_AT_GNU_call_site_target, 0x2113) |
DW_AT (DW_AT_GNU_call_site_target_clobbered, 0x2114) |
DW_AT (DW_AT_GNU_tail_call, 0x2115) |
DW_AT (DW_AT_GNU_all_tail_call_sites, 0x2116) |
DW_AT (DW_AT_GNU_all_call_sites, 0x2117) |
DW_AT (DW_AT_GNU_all_source_call_sites, 0x2118) |
/* Section offset into .debug_macro section. */ |
DW_AT (DW_AT_GNU_macros, 0x2119) |
/* Extensions for Fission. See http://gcc.gnu.org/wiki/DebugFission. */ |
DW_AT (DW_AT_GNU_dwo_name, 0x2130) |
DW_AT (DW_AT_GNU_dwo_id, 0x2131) |
DW_AT (DW_AT_GNU_ranges_base, 0x2132) |
DW_AT (DW_AT_GNU_addr_base, 0x2133) |
DW_AT (DW_AT_GNU_pubnames, 0x2134) |
DW_AT (DW_AT_GNU_pubtypes, 0x2135) |
/* Attribute for discriminator. |
See http://gcc.gnu.org/wiki/Discriminator */ |
DW_AT (DW_AT_GNU_discriminator, 0x2136) |
/* VMS extensions. */ |
DW_AT (DW_AT_VMS_rtnbeg_pd_address, 0x2201) |
/* GNAT extensions. */ |
/* GNAT descriptive type. |
See http://gcc.gnu.org/wiki/DW_AT_GNAT_descriptive_type . */ |
DW_AT (DW_AT_use_GNAT_descriptive_type, 0x2301) |
DW_AT (DW_AT_GNAT_descriptive_type, 0x2302) |
/* UPC extension. */ |
DW_AT (DW_AT_upc_threads_scaled, 0x3210) |
/* PGI (STMicroelectronics) extensions. */ |
DW_AT (DW_AT_PGI_lbase, 0x3a00) |
DW_AT (DW_AT_PGI_soffset, 0x3a01) |
DW_AT (DW_AT_PGI_lstride, 0x3a02) |
DW_END_AT |
DW_FIRST_OP (DW_OP_addr, 0x03) |
DW_OP (DW_OP_deref, 0x06) |
DW_OP (DW_OP_const1u, 0x08) |
DW_OP (DW_OP_const1s, 0x09) |
DW_OP (DW_OP_const2u, 0x0a) |
DW_OP (DW_OP_const2s, 0x0b) |
DW_OP (DW_OP_const4u, 0x0c) |
DW_OP (DW_OP_const4s, 0x0d) |
DW_OP (DW_OP_const8u, 0x0e) |
DW_OP (DW_OP_const8s, 0x0f) |
DW_OP (DW_OP_constu, 0x10) |
DW_OP (DW_OP_consts, 0x11) |
DW_OP (DW_OP_dup, 0x12) |
DW_OP (DW_OP_drop, 0x13) |
DW_OP (DW_OP_over, 0x14) |
DW_OP (DW_OP_pick, 0x15) |
DW_OP (DW_OP_swap, 0x16) |
DW_OP (DW_OP_rot, 0x17) |
DW_OP (DW_OP_xderef, 0x18) |
DW_OP (DW_OP_abs, 0x19) |
DW_OP (DW_OP_and, 0x1a) |
DW_OP (DW_OP_div, 0x1b) |
DW_OP (DW_OP_minus, 0x1c) |
DW_OP (DW_OP_mod, 0x1d) |
DW_OP (DW_OP_mul, 0x1e) |
DW_OP (DW_OP_neg, 0x1f) |
DW_OP (DW_OP_not, 0x20) |
DW_OP (DW_OP_or, 0x21) |
DW_OP (DW_OP_plus, 0x22) |
DW_OP (DW_OP_plus_uconst, 0x23) |
DW_OP (DW_OP_shl, 0x24) |
DW_OP (DW_OP_shr, 0x25) |
DW_OP (DW_OP_shra, 0x26) |
DW_OP (DW_OP_xor, 0x27) |
DW_OP (DW_OP_bra, 0x28) |
DW_OP (DW_OP_eq, 0x29) |
DW_OP (DW_OP_ge, 0x2a) |
DW_OP (DW_OP_gt, 0x2b) |
DW_OP (DW_OP_le, 0x2c) |
DW_OP (DW_OP_lt, 0x2d) |
DW_OP (DW_OP_ne, 0x2e) |
DW_OP (DW_OP_skip, 0x2f) |
DW_OP (DW_OP_lit0, 0x30) |
DW_OP (DW_OP_lit1, 0x31) |
DW_OP (DW_OP_lit2, 0x32) |
DW_OP (DW_OP_lit3, 0x33) |
DW_OP (DW_OP_lit4, 0x34) |
DW_OP (DW_OP_lit5, 0x35) |
DW_OP (DW_OP_lit6, 0x36) |
DW_OP (DW_OP_lit7, 0x37) |
DW_OP (DW_OP_lit8, 0x38) |
DW_OP (DW_OP_lit9, 0x39) |
DW_OP (DW_OP_lit10, 0x3a) |
DW_OP (DW_OP_lit11, 0x3b) |
DW_OP (DW_OP_lit12, 0x3c) |
DW_OP (DW_OP_lit13, 0x3d) |
DW_OP (DW_OP_lit14, 0x3e) |
DW_OP (DW_OP_lit15, 0x3f) |
DW_OP (DW_OP_lit16, 0x40) |
DW_OP (DW_OP_lit17, 0x41) |
DW_OP (DW_OP_lit18, 0x42) |
DW_OP (DW_OP_lit19, 0x43) |
DW_OP (DW_OP_lit20, 0x44) |
DW_OP (DW_OP_lit21, 0x45) |
DW_OP (DW_OP_lit22, 0x46) |
DW_OP (DW_OP_lit23, 0x47) |
DW_OP (DW_OP_lit24, 0x48) |
DW_OP (DW_OP_lit25, 0x49) |
DW_OP (DW_OP_lit26, 0x4a) |
DW_OP (DW_OP_lit27, 0x4b) |
DW_OP (DW_OP_lit28, 0x4c) |
DW_OP (DW_OP_lit29, 0x4d) |
DW_OP (DW_OP_lit30, 0x4e) |
DW_OP (DW_OP_lit31, 0x4f) |
DW_OP (DW_OP_reg0, 0x50) |
DW_OP (DW_OP_reg1, 0x51) |
DW_OP (DW_OP_reg2, 0x52) |
DW_OP (DW_OP_reg3, 0x53) |
DW_OP (DW_OP_reg4, 0x54) |
DW_OP (DW_OP_reg5, 0x55) |
DW_OP (DW_OP_reg6, 0x56) |
DW_OP (DW_OP_reg7, 0x57) |
DW_OP (DW_OP_reg8, 0x58) |
DW_OP (DW_OP_reg9, 0x59) |
DW_OP (DW_OP_reg10, 0x5a) |
DW_OP (DW_OP_reg11, 0x5b) |
DW_OP (DW_OP_reg12, 0x5c) |
DW_OP (DW_OP_reg13, 0x5d) |
DW_OP (DW_OP_reg14, 0x5e) |
DW_OP (DW_OP_reg15, 0x5f) |
DW_OP (DW_OP_reg16, 0x60) |
DW_OP (DW_OP_reg17, 0x61) |
DW_OP (DW_OP_reg18, 0x62) |
DW_OP (DW_OP_reg19, 0x63) |
DW_OP (DW_OP_reg20, 0x64) |
DW_OP (DW_OP_reg21, 0x65) |
DW_OP (DW_OP_reg22, 0x66) |
DW_OP (DW_OP_reg23, 0x67) |
DW_OP (DW_OP_reg24, 0x68) |
DW_OP (DW_OP_reg25, 0x69) |
DW_OP (DW_OP_reg26, 0x6a) |
DW_OP (DW_OP_reg27, 0x6b) |
DW_OP (DW_OP_reg28, 0x6c) |
DW_OP (DW_OP_reg29, 0x6d) |
DW_OP (DW_OP_reg30, 0x6e) |
DW_OP (DW_OP_reg31, 0x6f) |
DW_OP (DW_OP_breg0, 0x70) |
DW_OP (DW_OP_breg1, 0x71) |
DW_OP (DW_OP_breg2, 0x72) |
DW_OP (DW_OP_breg3, 0x73) |
DW_OP (DW_OP_breg4, 0x74) |
DW_OP (DW_OP_breg5, 0x75) |
DW_OP (DW_OP_breg6, 0x76) |
DW_OP (DW_OP_breg7, 0x77) |
DW_OP (DW_OP_breg8, 0x78) |
DW_OP (DW_OP_breg9, 0x79) |
DW_OP (DW_OP_breg10, 0x7a) |
DW_OP (DW_OP_breg11, 0x7b) |
DW_OP (DW_OP_breg12, 0x7c) |
DW_OP (DW_OP_breg13, 0x7d) |
DW_OP (DW_OP_breg14, 0x7e) |
DW_OP (DW_OP_breg15, 0x7f) |
DW_OP (DW_OP_breg16, 0x80) |
DW_OP (DW_OP_breg17, 0x81) |
DW_OP (DW_OP_breg18, 0x82) |
DW_OP (DW_OP_breg19, 0x83) |
DW_OP (DW_OP_breg20, 0x84) |
DW_OP (DW_OP_breg21, 0x85) |
DW_OP (DW_OP_breg22, 0x86) |
DW_OP (DW_OP_breg23, 0x87) |
DW_OP (DW_OP_breg24, 0x88) |
DW_OP (DW_OP_breg25, 0x89) |
DW_OP (DW_OP_breg26, 0x8a) |
DW_OP (DW_OP_breg27, 0x8b) |
DW_OP (DW_OP_breg28, 0x8c) |
DW_OP (DW_OP_breg29, 0x8d) |
DW_OP (DW_OP_breg30, 0x8e) |
DW_OP (DW_OP_breg31, 0x8f) |
DW_OP (DW_OP_regx, 0x90) |
DW_OP (DW_OP_fbreg, 0x91) |
DW_OP (DW_OP_bregx, 0x92) |
DW_OP (DW_OP_piece, 0x93) |
DW_OP (DW_OP_deref_size, 0x94) |
DW_OP (DW_OP_xderef_size, 0x95) |
DW_OP (DW_OP_nop, 0x96) |
/* DWARF 3 extensions. */ |
DW_OP (DW_OP_push_object_address, 0x97) |
DW_OP (DW_OP_call2, 0x98) |
DW_OP (DW_OP_call4, 0x99) |
DW_OP (DW_OP_call_ref, 0x9a) |
DW_OP (DW_OP_form_tls_address, 0x9b) |
DW_OP (DW_OP_call_frame_cfa, 0x9c) |
DW_OP (DW_OP_bit_piece, 0x9d) |
/* DWARF 4 extensions. */ |
DW_OP (DW_OP_implicit_value, 0x9e) |
DW_OP (DW_OP_stack_value, 0x9f) |
DW_OP_DUP (DW_OP_lo_user, 0xe0) /* Implementation-defined range start. */ |
DW_OP_DUP (DW_OP_hi_user, 0xff) /* Implementation-defined range end. */ |
/* GNU extensions. */ |
DW_OP (DW_OP_GNU_push_tls_address, 0xe0) |
/* The following is for marking variables that are uninitialized. */ |
DW_OP (DW_OP_GNU_uninit, 0xf0) |
DW_OP (DW_OP_GNU_encoded_addr, 0xf1) |
/* The GNU implicit pointer extension. |
See http://www.dwarfstd.org/ShowIssue.php?issue=100831.1&type=open . */ |
DW_OP (DW_OP_GNU_implicit_pointer, 0xf2) |
/* The GNU entry value extension. |
See http://www.dwarfstd.org/ShowIssue.php?issue=100909.1&type=open . */ |
DW_OP (DW_OP_GNU_entry_value, 0xf3) |
/* The GNU typed stack extension. |
See http://www.dwarfstd.org/doc/040408.1.html . */ |
DW_OP (DW_OP_GNU_const_type, 0xf4) |
DW_OP (DW_OP_GNU_regval_type, 0xf5) |
DW_OP (DW_OP_GNU_deref_type, 0xf6) |
DW_OP (DW_OP_GNU_convert, 0xf7) |
DW_OP (DW_OP_GNU_reinterpret, 0xf9) |
/* The GNU parameter ref extension. */ |
DW_OP (DW_OP_GNU_parameter_ref, 0xfa) |
/* Extensions for Fission. See http://gcc.gnu.org/wiki/DebugFission. */ |
DW_OP (DW_OP_GNU_addr_index, 0xfb) |
DW_OP (DW_OP_GNU_const_index, 0xfc) |
/* HP extensions. */ |
DW_OP_DUP (DW_OP_HP_unknown, 0xe0) /* Ouch, the same as GNU_push_tls_address. */ |
DW_OP (DW_OP_HP_is_value, 0xe1) |
DW_OP (DW_OP_HP_fltconst4, 0xe2) |
DW_OP (DW_OP_HP_fltconst8, 0xe3) |
DW_OP (DW_OP_HP_mod_range, 0xe4) |
DW_OP (DW_OP_HP_unmod_range, 0xe5) |
DW_OP (DW_OP_HP_tls, 0xe6) |
/* PGI (STMicroelectronics) extensions. */ |
DW_OP (DW_OP_PGI_omp_thread_num, 0xf8) |
DW_END_OP |
DW_FIRST_ATE (DW_ATE_void, 0x0) |
DW_ATE (DW_ATE_address, 0x1) |
DW_ATE (DW_ATE_boolean, 0x2) |
DW_ATE (DW_ATE_complex_float, 0x3) |
DW_ATE (DW_ATE_float, 0x4) |
DW_ATE (DW_ATE_signed, 0x5) |
DW_ATE (DW_ATE_signed_char, 0x6) |
DW_ATE (DW_ATE_unsigned, 0x7) |
DW_ATE (DW_ATE_unsigned_char, 0x8) |
/* DWARF 3. */ |
DW_ATE (DW_ATE_imaginary_float, 0x9) |
DW_ATE (DW_ATE_packed_decimal, 0xa) |
DW_ATE (DW_ATE_numeric_string, 0xb) |
DW_ATE (DW_ATE_edited, 0xc) |
DW_ATE (DW_ATE_signed_fixed, 0xd) |
DW_ATE (DW_ATE_unsigned_fixed, 0xe) |
DW_ATE (DW_ATE_decimal_float, 0xf) |
/* DWARF 4. */ |
DW_ATE (DW_ATE_UTF, 0x10) |
DW_ATE_DUP (DW_ATE_lo_user, 0x80) |
DW_ATE_DUP (DW_ATE_hi_user, 0xff) |
/* HP extensions. */ |
DW_ATE (DW_ATE_HP_float80, 0x80) /* Floating-point (80 bit). */ |
DW_ATE (DW_ATE_HP_complex_float80, 0x81) /* Complex floating-point (80 bit). */ |
DW_ATE (DW_ATE_HP_float128, 0x82) /* Floating-point (128 bit). */ |
DW_ATE (DW_ATE_HP_complex_float128, 0x83) /* Complex fp (128 bit). */ |
DW_ATE (DW_ATE_HP_floathpintel, 0x84) /* Floating-point (82 bit IA64). */ |
DW_ATE (DW_ATE_HP_imaginary_float80, 0x85) |
DW_ATE (DW_ATE_HP_imaginary_float128, 0x86) |
DW_ATE (DW_ATE_HP_VAX_float, 0x88) /* F or G floating. */ |
DW_ATE (DW_ATE_HP_VAX_float_d, 0x89) /* D floating. */ |
DW_ATE (DW_ATE_HP_packed_decimal, 0x8a) /* Cobol. */ |
DW_ATE (DW_ATE_HP_zoned_decimal, 0x8b) /* Cobol. */ |
DW_ATE (DW_ATE_HP_edited, 0x8c) /* Cobol. */ |
DW_ATE (DW_ATE_HP_signed_fixed, 0x8d) /* Cobol. */ |
DW_ATE (DW_ATE_HP_unsigned_fixed, 0x8e) /* Cobol. */ |
DW_ATE (DW_ATE_HP_VAX_complex_float, 0x8f) /* F or G floating complex. */ |
DW_ATE (DW_ATE_HP_VAX_complex_float_d, 0x90) /* D floating complex. */ |
DW_END_ATE |
DW_FIRST_CFA (DW_CFA_advance_loc, 0x40) |
DW_CFA (DW_CFA_offset, 0x80) |
DW_CFA (DW_CFA_restore, 0xc0) |
DW_CFA (DW_CFA_nop, 0x00) |
DW_CFA (DW_CFA_set_loc, 0x01) |
DW_CFA (DW_CFA_advance_loc1, 0x02) |
DW_CFA (DW_CFA_advance_loc2, 0x03) |
DW_CFA (DW_CFA_advance_loc4, 0x04) |
DW_CFA (DW_CFA_offset_extended, 0x05) |
DW_CFA (DW_CFA_restore_extended, 0x06) |
DW_CFA (DW_CFA_undefined, 0x07) |
DW_CFA (DW_CFA_same_value, 0x08) |
DW_CFA (DW_CFA_register, 0x09) |
DW_CFA (DW_CFA_remember_state, 0x0a) |
DW_CFA (DW_CFA_restore_state, 0x0b) |
DW_CFA (DW_CFA_def_cfa, 0x0c) |
DW_CFA (DW_CFA_def_cfa_register, 0x0d) |
DW_CFA (DW_CFA_def_cfa_offset, 0x0e) |
/* DWARF 3. */ |
DW_CFA (DW_CFA_def_cfa_expression, 0x0f) |
DW_CFA (DW_CFA_expression, 0x10) |
DW_CFA (DW_CFA_offset_extended_sf, 0x11) |
DW_CFA (DW_CFA_def_cfa_sf, 0x12) |
DW_CFA (DW_CFA_def_cfa_offset_sf, 0x13) |
DW_CFA (DW_CFA_val_offset, 0x14) |
DW_CFA (DW_CFA_val_offset_sf, 0x15) |
DW_CFA (DW_CFA_val_expression, 0x16) |
DW_CFA (DW_CFA_lo_user, 0x1c) |
DW_CFA (DW_CFA_hi_user, 0x3f) |
/* SGI/MIPS specific. */ |
DW_CFA (DW_CFA_MIPS_advance_loc8, 0x1d) |
/* GNU extensions. */ |
DW_CFA (DW_CFA_GNU_window_save, 0x2d) |
DW_CFA (DW_CFA_GNU_args_size, 0x2e) |
DW_CFA (DW_CFA_GNU_negative_offset_extended, 0x2f) |
DW_END_CFA |
/contrib/toolchain/binutils/include/dwarf2.h |
---|
0,0 → 1,426 |
/* Declarations and definitions of codes relating to the DWARF2 and |
DWARF3 symbolic debugging information formats. |
Copyright (C) 1992, 1993, 1995, 1996, 1997, 1999, 2000, 2001, 2002, |
2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 |
Free Software Foundation, Inc. |
Written by Gary Funck (gary@intrepid.com) The Ada Joint Program |
Office (AJPO), Florida State University and Silicon Graphics Inc. |
provided support for this effort -- June 21, 1995. |
Derived from the DWARF 1 implementation written by Ron Guilmette |
(rfg@netcom.com), November 1990. |
This file is part of GCC. |
GCC is free software; you can redistribute it and/or modify it under |
the terms of the GNU General Public License as published by the Free |
Software Foundation; either version 3, or (at your option) any later |
version. |
GCC is distributed in the hope that it will be useful, but WITHOUT |
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY |
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public |
License for more details. |
Under Section 7 of GPL version 3, you are granted additional |
permissions described in the GCC Runtime Library Exception, version |
3.1, as published by the Free Software Foundation. |
You should have received a copy of the GNU General Public License and |
a copy of the GCC Runtime Library Exception along with this program; |
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see |
<http://www.gnu.org/licenses/>. */ |
/* This file is derived from the DWARF specification (a public document) |
Revision 2.0.0 (July 27, 1993) developed by the UNIX International |
Programming Languages Special Interest Group (UI/PLSIG) and distributed |
by UNIX International. Copies of this specification are available from |
UNIX International, 20 Waterview Boulevard, Parsippany, NJ, 07054. |
This file also now contains definitions from the DWARF 3 specification |
published Dec 20, 2005, available from: http://dwarf.freestandards.org. */ |
#ifndef _DWARF2_H |
#define _DWARF2_H |
#define DW_TAG(name, value) , name = value |
#define DW_TAG_DUP(name, value) , name = value |
#define DW_FORM(name, value) , name = value |
#define DW_AT(name, value) , name = value |
#define DW_AT_DUP(name, value) , name = value |
#define DW_OP(name, value) , name = value |
#define DW_OP_DUP(name, value) , name = value |
#define DW_ATE(name, value) , name = value |
#define DW_ATE_DUP(name, value) , name = value |
#define DW_CFA(name, value) , name = value |
#define DW_FIRST_TAG(name, value) enum dwarf_tag { \ |
name = value |
#define DW_END_TAG }; |
#define DW_FIRST_FORM(name, value) enum dwarf_form { \ |
name = value |
#define DW_END_FORM }; |
#define DW_FIRST_AT(name, value) enum dwarf_attribute { \ |
name = value |
#define DW_END_AT }; |
#define DW_FIRST_OP(name, value) enum dwarf_location_atom { \ |
name = value |
#define DW_END_OP }; |
#define DW_FIRST_ATE(name, value) enum dwarf_type { \ |
name = value |
#define DW_END_ATE }; |
#define DW_FIRST_CFA(name, value) enum dwarf_call_frame_info { \ |
name = value |
#define DW_END_CFA }; |
#include "dwarf2.def" |
#undef DW_FIRST_TAG |
#undef DW_END_TAG |
#undef DW_FIRST_FORM |
#undef DW_END_FORM |
#undef DW_FIRST_AT |
#undef DW_END_AT |
#undef DW_FIRST_OP |
#undef DW_END_OP |
#undef DW_FIRST_ATE |
#undef DW_END_ATE |
#undef DW_FIRST_CFA |
#undef DW_END_CFA |
#undef DW_TAG |
#undef DW_TAG_DUP |
#undef DW_FORM |
#undef DW_AT |
#undef DW_AT_DUP |
#undef DW_OP |
#undef DW_OP_DUP |
#undef DW_ATE |
#undef DW_ATE_DUP |
#undef DW_CFA |
/* Flag that tells whether entry has a child or not. */ |
#define DW_children_no 0 |
#define DW_children_yes 1 |
#define DW_AT_stride_size DW_AT_bit_stride /* Note: The use of DW_AT_stride_size is deprecated. */ |
#define DW_AT_stride DW_AT_byte_stride /* Note: The use of DW_AT_stride is deprecated. */ |
/* Decimal sign encodings. */ |
enum dwarf_decimal_sign_encoding |
{ |
/* DWARF 3. */ |
DW_DS_unsigned = 0x01, |
DW_DS_leading_overpunch = 0x02, |
DW_DS_trailing_overpunch = 0x03, |
DW_DS_leading_separate = 0x04, |
DW_DS_trailing_separate = 0x05 |
}; |
/* Endianity encodings. */ |
enum dwarf_endianity_encoding |
{ |
/* DWARF 3. */ |
DW_END_default = 0x00, |
DW_END_big = 0x01, |
DW_END_little = 0x02, |
DW_END_lo_user = 0x40, |
DW_END_hi_user = 0xff |
}; |
/* Array ordering names and codes. */ |
enum dwarf_array_dim_ordering |
{ |
DW_ORD_row_major = 0, |
DW_ORD_col_major = 1 |
}; |
/* Access attribute. */ |
enum dwarf_access_attribute |
{ |
DW_ACCESS_public = 1, |
DW_ACCESS_protected = 2, |
DW_ACCESS_private = 3 |
}; |
/* Visibility. */ |
enum dwarf_visibility_attribute |
{ |
DW_VIS_local = 1, |
DW_VIS_exported = 2, |
DW_VIS_qualified = 3 |
}; |
/* Virtuality. */ |
enum dwarf_virtuality_attribute |
{ |
DW_VIRTUALITY_none = 0, |
DW_VIRTUALITY_virtual = 1, |
DW_VIRTUALITY_pure_virtual = 2 |
}; |
/* Case sensitivity. */ |
enum dwarf_id_case |
{ |
DW_ID_case_sensitive = 0, |
DW_ID_up_case = 1, |
DW_ID_down_case = 2, |
DW_ID_case_insensitive = 3 |
}; |
/* Calling convention. */ |
enum dwarf_calling_convention |
{ |
DW_CC_normal = 0x1, |
DW_CC_program = 0x2, |
DW_CC_nocall = 0x3, |
DW_CC_lo_user = 0x40, |
DW_CC_hi_user = 0xff, |
DW_CC_GNU_renesas_sh = 0x40, |
DW_CC_GNU_borland_fastcall_i386 = 0x41, |
/* This DW_CC_ value is not currently generated by any toolchain. It is |
used internally to GDB to indicate OpenCL C functions that have been |
compiled with the IBM XL C for OpenCL compiler and use a non-platform |
calling convention for passing OpenCL C vector types. This value may |
be changed freely as long as it does not conflict with any other DW_CC_ |
value defined here. */ |
DW_CC_GDB_IBM_OpenCL = 0xff |
}; |
/* Inline attribute. */ |
enum dwarf_inline_attribute |
{ |
DW_INL_not_inlined = 0, |
DW_INL_inlined = 1, |
DW_INL_declared_not_inlined = 2, |
DW_INL_declared_inlined = 3 |
}; |
/* Discriminant lists. */ |
enum dwarf_discrim_list |
{ |
DW_DSC_label = 0, |
DW_DSC_range = 1 |
}; |
/* Line number opcodes. */ |
enum dwarf_line_number_ops |
{ |
DW_LNS_extended_op = 0, |
DW_LNS_copy = 1, |
DW_LNS_advance_pc = 2, |
DW_LNS_advance_line = 3, |
DW_LNS_set_file = 4, |
DW_LNS_set_column = 5, |
DW_LNS_negate_stmt = 6, |
DW_LNS_set_basic_block = 7, |
DW_LNS_const_add_pc = 8, |
DW_LNS_fixed_advance_pc = 9, |
/* DWARF 3. */ |
DW_LNS_set_prologue_end = 10, |
DW_LNS_set_epilogue_begin = 11, |
DW_LNS_set_isa = 12 |
}; |
/* Line number extended opcodes. */ |
enum dwarf_line_number_x_ops |
{ |
DW_LNE_end_sequence = 1, |
DW_LNE_set_address = 2, |
DW_LNE_define_file = 3, |
DW_LNE_set_discriminator = 4, |
/* HP extensions. */ |
DW_LNE_HP_negate_is_UV_update = 0x11, |
DW_LNE_HP_push_context = 0x12, |
DW_LNE_HP_pop_context = 0x13, |
DW_LNE_HP_set_file_line_column = 0x14, |
DW_LNE_HP_set_routine_name = 0x15, |
DW_LNE_HP_set_sequence = 0x16, |
DW_LNE_HP_negate_post_semantics = 0x17, |
DW_LNE_HP_negate_function_exit = 0x18, |
DW_LNE_HP_negate_front_end_logical = 0x19, |
DW_LNE_HP_define_proc = 0x20, |
DW_LNE_HP_source_file_correlation = 0x80, |
DW_LNE_lo_user = 0x80, |
DW_LNE_hi_user = 0xff |
}; |
/* Sub-opcodes for DW_LNE_HP_source_file_correlation. */ |
enum dwarf_line_number_hp_sfc_ops |
{ |
DW_LNE_HP_SFC_formfeed = 1, |
DW_LNE_HP_SFC_set_listing_line = 2, |
DW_LNE_HP_SFC_associate = 3 |
}; |
/* Type codes for location list entries. |
Extension for Fission. See http://gcc.gnu.org/wiki/DebugFission. */ |
enum dwarf_location_list_entry_type |
{ |
DW_LLE_GNU_end_of_list_entry = 0, |
DW_LLE_GNU_base_address_selection_entry = 1, |
DW_LLE_GNU_start_end_entry = 2, |
DW_LLE_GNU_start_length_entry = 3 |
}; |
#define DW_CIE_ID 0xffffffff |
#define DW64_CIE_ID 0xffffffffffffffffULL |
#define DW_CIE_VERSION 1 |
#define DW_CFA_extended 0 |
#define DW_CHILDREN_no 0x00 |
#define DW_CHILDREN_yes 0x01 |
#define DW_ADDR_none 0 |
/* Source language names and codes. */ |
enum dwarf_source_language |
{ |
DW_LANG_C89 = 0x0001, |
DW_LANG_C = 0x0002, |
DW_LANG_Ada83 = 0x0003, |
DW_LANG_C_plus_plus = 0x0004, |
DW_LANG_Cobol74 = 0x0005, |
DW_LANG_Cobol85 = 0x0006, |
DW_LANG_Fortran77 = 0x0007, |
DW_LANG_Fortran90 = 0x0008, |
DW_LANG_Pascal83 = 0x0009, |
DW_LANG_Modula2 = 0x000a, |
/* DWARF 3. */ |
DW_LANG_Java = 0x000b, |
DW_LANG_C99 = 0x000c, |
DW_LANG_Ada95 = 0x000d, |
DW_LANG_Fortran95 = 0x000e, |
DW_LANG_PLI = 0x000f, |
DW_LANG_ObjC = 0x0010, |
DW_LANG_ObjC_plus_plus = 0x0011, |
DW_LANG_UPC = 0x0012, |
DW_LANG_D = 0x0013, |
/* DWARF 4. */ |
DW_LANG_Python = 0x0014, |
/* DWARF 5. */ |
DW_LANG_Go = 0x0016, |
DW_LANG_lo_user = 0x8000, /* Implementation-defined range start. */ |
DW_LANG_hi_user = 0xffff, /* Implementation-defined range start. */ |
/* MIPS. */ |
DW_LANG_Mips_Assembler = 0x8001, |
/* UPC. */ |
DW_LANG_Upc = 0x8765, |
/* HP extensions. */ |
DW_LANG_HP_Bliss = 0x8003, |
DW_LANG_HP_Basic91 = 0x8004, |
DW_LANG_HP_Pascal91 = 0x8005, |
DW_LANG_HP_IMacro = 0x8006, |
DW_LANG_HP_Assembler = 0x8007 |
}; |
/* Names and codes for macro information. */ |
enum dwarf_macinfo_record_type |
{ |
DW_MACINFO_define = 1, |
DW_MACINFO_undef = 2, |
DW_MACINFO_start_file = 3, |
DW_MACINFO_end_file = 4, |
DW_MACINFO_vendor_ext = 255 |
}; |
/* Names and codes for new style macro information. */ |
enum dwarf_macro_record_type |
{ |
DW_MACRO_GNU_define = 1, |
DW_MACRO_GNU_undef = 2, |
DW_MACRO_GNU_start_file = 3, |
DW_MACRO_GNU_end_file = 4, |
DW_MACRO_GNU_define_indirect = 5, |
DW_MACRO_GNU_undef_indirect = 6, |
DW_MACRO_GNU_transparent_include = 7, |
/* Extensions for DWZ multifile. |
See http://www.dwarfstd.org/ShowIssue.php?issue=120604.1&type=open . */ |
DW_MACRO_GNU_define_indirect_alt = 8, |
DW_MACRO_GNU_undef_indirect_alt = 9, |
DW_MACRO_GNU_transparent_include_alt = 10, |
DW_MACRO_GNU_lo_user = 0xe0, |
DW_MACRO_GNU_hi_user = 0xff |
}; |
/* @@@ For use with GNU frame unwind information. */ |
#define DW_EH_PE_absptr 0x00 |
#define DW_EH_PE_omit 0xff |
#define DW_EH_PE_uleb128 0x01 |
#define DW_EH_PE_udata2 0x02 |
#define DW_EH_PE_udata4 0x03 |
#define DW_EH_PE_udata8 0x04 |
#define DW_EH_PE_sleb128 0x09 |
#define DW_EH_PE_sdata2 0x0A |
#define DW_EH_PE_sdata4 0x0B |
#define DW_EH_PE_sdata8 0x0C |
#define DW_EH_PE_signed 0x08 |
#define DW_EH_PE_pcrel 0x10 |
#define DW_EH_PE_textrel 0x20 |
#define DW_EH_PE_datarel 0x30 |
#define DW_EH_PE_funcrel 0x40 |
#define DW_EH_PE_aligned 0x50 |
#define DW_EH_PE_indirect 0x80 |
/* Codes for the debug sections in a dwarf package (.dwp) file. |
Extensions for Fission. See http://gcc.gnu.org/wiki/DebugFissionDWP. */ |
enum dwarf_sect |
{ |
DW_SECT_INFO = 1, |
DW_SECT_TYPES = 2, |
DW_SECT_ABBREV = 3, |
DW_SECT_LINE = 4, |
DW_SECT_LOC = 5, |
DW_SECT_STR_OFFSETS = 6, |
DW_SECT_MACINFO = 7, |
DW_SECT_MACRO = 8, |
DW_SECT_MAX = 8 |
}; |
#ifdef __cplusplus |
extern "C" { |
#endif /* __cplusplus */ |
/* Return the name of a DW_TAG_ constant, or NULL if the value is not |
recognized. */ |
extern const char *get_DW_TAG_name (unsigned int tag); |
/* Return the name of a DW_AT_ constant, or NULL if the value is not |
recognized. */ |
extern const char *get_DW_AT_name (unsigned int attr); |
/* Return the name of a DW_FORM_ constant, or NULL if the value is not |
recognized. */ |
extern const char *get_DW_FORM_name (unsigned int form); |
/* Return the name of a DW_OP_ constant, or NULL if the value is not |
recognized. */ |
extern const char *get_DW_OP_name (unsigned int op); |
/* Return the name of a DW_ATE_ constant, or NULL if the value is not |
recognized. */ |
extern const char *get_DW_ATE_name (unsigned int enc); |
/* Return the name of a DW_CFA_ constant, or NULL if the value is not |
recognized. */ |
extern const char *get_DW_CFA_name (unsigned int opc); |
#ifdef __cplusplus |
} |
#endif /* __cplusplus */ |
#endif /* _DWARF2_H */ |
/contrib/toolchain/binutils/include/dyn-string.h |
---|
0,0 → 1,73 |
/* An abstract string datatype. |
Copyright (C) 1998, 1999, 2000, 2002, 2004, 2005, 2009 |
Free Software Foundation, Inc. |
Contributed by Mark Mitchell (mark@markmitchell.com). |
This file is part of GCC. |
GCC is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2, or (at your option) |
any later version. |
GCC is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with GCC; see the file COPYING. If not, write to |
the Free Software Foundation, 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
#ifndef DYN_STRING_H |
#define DYN_STRING_H |
#ifdef __cplusplus |
extern "C" { |
#endif |
typedef struct dyn_string |
{ |
int allocated; /* The amount of space allocated for the string. */ |
int length; /* The actual length of the string. */ |
char *s; /* The string itself, NUL-terminated. */ |
}* dyn_string_t; |
/* The length STR, in bytes, not including the terminating NUL. */ |
#define dyn_string_length(STR) \ |
((STR)->length) |
/* The NTBS in which the contents of STR are stored. */ |
#define dyn_string_buf(STR) \ |
((STR)->s) |
/* Compare DS1 to DS2 with strcmp. */ |
#define dyn_string_compare(DS1, DS2) \ |
(strcmp ((DS1)->s, (DS2)->s)) |
extern int dyn_string_init (struct dyn_string *, int); |
extern dyn_string_t dyn_string_new (int); |
extern void dyn_string_delete (dyn_string_t); |
extern char *dyn_string_release (dyn_string_t); |
extern dyn_string_t dyn_string_resize (dyn_string_t, int); |
extern void dyn_string_clear (dyn_string_t); |
extern int dyn_string_copy (dyn_string_t, dyn_string_t); |
extern int dyn_string_copy_cstr (dyn_string_t, const char *); |
extern int dyn_string_prepend (dyn_string_t, dyn_string_t); |
extern int dyn_string_prepend_cstr (dyn_string_t, const char *); |
extern int dyn_string_insert (dyn_string_t, int, dyn_string_t); |
extern int dyn_string_insert_cstr (dyn_string_t, int, const char *); |
extern int dyn_string_insert_char (dyn_string_t, int, int); |
extern int dyn_string_append (dyn_string_t, dyn_string_t); |
extern int dyn_string_append_cstr (dyn_string_t, const char *); |
extern int dyn_string_append_char (dyn_string_t, int); |
extern int dyn_string_substring (dyn_string_t, dyn_string_t, int, int); |
extern int dyn_string_eq (dyn_string_t, dyn_string_t); |
#ifdef __cplusplus |
} |
#endif |
#endif /* !defined (DYN_STRING_H) */ |
/contrib/toolchain/binutils/include/elf/ChangeLog |
---|
0,0 → 1,1921 |
2013-11-17 H.J. Lu <hongjiu.lu@intel.com> |
* x86-64.h: Add R_X86_64_PC32_BND and R_X86_64_PLT32_BND. |
2013-11-15 Alan Modra <amodra@gmail.com> |
Apply changes from mainline to 2.24 |
2013-10-30 Alan Modra <amodra@gmail.com> |
* ppc.h (DT_PPC_TLSOPT): Delete. |
(DT_PPC_OPT, PPC_OPT_TLS): Define. |
* ppc64.h (DT_PPC64_TLSOPT): Delete. |
(DT_PPC64_OPT, PPC64_OPT_TLS, PPC64_OPT_MULTI_TOC): Define. |
2013-10-30 Alan Modra <amodra@gmail.com> |
* ppc64.h (STO_PPC64_LOCAL_BIT, STO_PPC64_LOCAL_MASK): Define. |
(ppc64_decode_local_entry, ppc64_encode_local_entry): New functions. |
(PPC64_LOCAL_ENTRY_OFFSET, PPC64_SET_LOCAL_ENTRY_OFFSET): Define. |
2013-10-30 Alan Modra <amodra@gmail.com> |
* ppc64.h (EF_PPC64_ABI): Define. |
2013-10-30 Alan Modra <amodra@gmail.com> |
* ppc64.h (R_PPC64_ADDR16_HIGH, R_PPC64_ADDR16_HIGHA, |
R_PPC64_TPREL16_HIGH, R_PPC64_TPREL16_HIGHA, |
R_PPC64_DTPREL16_HIGH, R_PPC64_DTPREL16_HIGHA): New. |
(IS_PPC64_TLS_RELOC): Match new tls relocs. |
2013-11-13 Yufeng Zhang <yufeng.zhang@arm.com> |
* aarch64.h: Define R_AARCH64_TLS_DTPMOD64, |
R_AARCH64_TLS_DTPREL64 and R_AARCH64_TLS_TPREL64; guard |
R_AARCH64_TLS_DTPMOD, R_AARCH64_TLS_DTPREL and |
R_AARCH64_TLS_TPREL with RELOC_MACROS_GEN_FUNC. |
2013-09-17 Doug Gilmore <Doug.Gilmore@imgtec.com> |
* mips.h (EF_MIPS_FP64): New e_flags bit. |
2013-08-09 Nick Clifton <nickc@redhat.com> |
* rl78.c (E_FLAG_RL78_G10): Define. |
2013-07-15 Maciej W. Rozycki <macro@codesourcery.com> |
* mips.h (Tag_GNU_MIPS_ABI_FP): Remove comment. |
(Val_GNU_MIPS_ABI_FP_ANY, Val_GNU_MIPS_ABI_FP_DOUBLE, |
Val_GNU_MIPS_ABI_FP_SINGLE, Val_GNU_MIPS_ABI_FP_SOFT, |
Val_GNU_MIPS_ABI_FP_64): New enum. |
2013-07-12 Maciej W. Rozycki <macro@codesourcery.com> |
* mips.h (EF_MIPS_NAN2008): New macro. |
2013-07-08 Tristan Gingold <gingold@adacore.com> |
* ia64.h (STB_VMS_WEAK, STB_VMS_SYSTEM): Add. |
2013-07-05 Andreas Krebbel <Andreas.Krebbel@de.ibm.com> |
* s390.h: Add new relocs R_390_PC12DBL, R_390_PLT12DBL, |
R_390_PC24DBL, and R_390_PLT24DBL. |
2013-06-26 Yufeng Zhang <yufeng.zhang@arm.com> |
* aarch64.h: Add ELF32 reloc codes and remove fake ELF64 ones. |
2013-06-24 Maciej W. Rozycki <macro@codesourcery.com> |
* mips.h (ELF_ST_IS_MIPS_PLT): Respect STO_MIPS16 setting. |
(ELF_ST_SET_MIPS_PLT): Likewise. |
2013-06-19 Will Newton <will.newton@linaro.org> |
* aarch64.h: Remove R_AARCH64_IRELATIVE. |
2013-06-07 Will Newton <will.newton@linaro.org> |
* aarch64.h: Add R_AARCH64_IRELATIVE reloc. |
2013-06-06 Maciej W. Rozycki <macro@codesourcery.com> |
* mips.h (ELF_ST_SET_MIPS_PIC): Clear any STO_MIPS16 setting. |
2013-05-30 Paul Brook <paul@codesourcery.com> |
* mips.h (R_MIPS_EH): New. |
2013-05-28 Yufeng Zhang <yufeng.zhang@arm.com> |
* aarch64.h (R_AARCH64_TLSDESC_LD64_PREL19): Rename to ... |
(R_AARCH64_TLSDESC_LD_PREL19): ... this. |
(R_AARCH64_TLSDESC_ADR_PAGE): Rename to ... |
(R_AARCH64_TLSDESC_ADR_PAGE21): ... this. |
2013-05-22 H.J. Lu <hongjiu.lu@intel.com> |
* common.h (EM_INTEL205): New. |
(EM_INTEL206): Likewise. |
(EM_INTEL207): Likewise. |
(EM_INTEL208): Likewise. |
(EM_INTEL209): Likewise. |
2013-05-02 Nick Clifton <nickc@redhat.com> |
* msp430.h: Add MSP430X relocs. |
Add some more MSP430 machine numbers. |
Add values used by .MSP430.attributes section. |
2013-03-21 Michael Schewe <michael.schewe@gmx.net> |
* h8.h: Add new reloc R_H8_DISP32A16 for relaxation of |
mov @(disp:32,ERx) to mov @(disp:16,ERx). |
2013-03-08 Andreas Arnez <arnez@linux.vnet.ibm.com> |
* common.h (NT_S390_TDB): Define. |
2013-02-06 Sandra Loosemore <sandra@codesourcery.com> |
Andrew Jenner <andrew@codesourcery.com> |
Based on patches from Altera Corporation. |
* nios2.h: New file. |
2013-01-24 Nick Clifton <nickc@redhat.com> |
* v850.h: Add support for e3v5 architecture. |
Reorganize processor selection macros. |
2013-01-16 H.J. Lu <hongjiu.lu@intel.com> |
* i386.h (R_386_SIZE32): Fill it. |
* x86-64.h (R_X86_64_SIZE32): Likewise. |
(R_X86_64_SIZE64): Likewise. |
2013-01-10 Will Newton <will.newton@imgtec.com> |
* common.h: Fix case of "Meta". |
* metag.h: New file. |
2013-01-08 Yufeng Zhang <yufeng.zhang@arm.com> |
* common.h (NT_ARM_TLS, NT_ARM_HW_BREAK, NT_ARM_HW_WATCH): New macro |
definitions. |
2013-01-04 Juergen Urban <JuergenUrban@gmx.de> |
* mips.h: Add MIPS machine variant number for r5900 which is |
compatible with old Playstation 2 software. |
2012-11-16 H.J. Lu <hongjiu.lu@intel.com> |
* common.h (DF_1_CONLFAT): Renamed to ... |
(DF_1_CONFALT): This. |
(DF_1_ENDFILTEE): New. |
(DF_1_DISPRELDNE): Likewise. |
(DF_1_DISPRELPND): Likewise. |
(DF_1_NODIRECT): Likewise. |
(DF_1_IGNMULDEF): Likewise. |
(DF_1_NOKSYMS): Likewise. |
(DF_1_NOHDR): Likewise. |
(DF_1_EDITED): Likewise. |
(DF_1_NORELOC): Likewise. |
(DF_1_SYMINTPOSE): Likewise. |
(DF_1_GLOBAUDIT): Likewise. |
(DF_1_SINGLETON): Likewise. |
2012-11-09 Nick Clifton <nickc@redhat.com> |
* rx.h (EF_RX_CPU_RX): Add comment. |
(E_FLAG_RX_ABI): Define. |
* v850.h: Add RH850 ABI values. |
2012-11-08 Maciej W. Rozycki <macro@codesourcery.com> |
* mips.h (EF_MIPS_32BITMODE): Move next to lower-order bits. |
2012-11-01 Tom Tromey <tromey@redhat.com> |
* common.h (NT_386_TLS, NT_386_IOPERM): New defines. |
2012-10-30 Steve McIntyre <steve.mcintyre@linaro.org> |
* elf/arm.h (EF_ARM_ABI_FLOAT_SOFT): New define. |
(EF_ARM_ABI_FLOAT_HARD): Likewise. |
2012-10-23 Tom Tromey <tromey@redhat.com> |
* common.h (NT_SIGINFO, NT_FILE): New defines. |
2012-08-27 Walter Lee <walt@tilera.com> |
* tilegx.h (R_TILEGX_IMM16_X0_HW0_PLT_PCREL): New relocation. |
(R_TILEGX_IMM16_X1_HW0_PLT_PCREL): Ditto. |
(R_TILEGX_IMM16_X0_HW1_PLT_PCREL): Ditto. |
(R_TILEGX_IMM16_X1_HW1_PLT_PCREL): Ditto. |
(R_TILEGX_IMM16_X0_HW2_PLT_PCREL): Ditto. |
(R_TILEGX_IMM16_X1_HW2_PLT_PCREL): Ditto. |
(R_TILEGX_IMM16_X0_HW3_PLT_PCREL): Ditto. |
(R_TILEGX_IMM16_X1_HW3_PLT_PCREL): Ditto. |
(R_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL): Ditto. |
(R_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL): Ditto. |
(R_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL): Ditto. |
(R_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL): Ditto. |
(R_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL ): Ditto. |
(R_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL): Ditto. |
2012-08-13 Ian Bolton <ian.bolton@arm.com> |
Laurent Desnogues <laurent.desnogues@arm.com> |
Jim MacArthur <jim.macarthur@arm.com> |
Marcus Shawcroft <marcus.shawcroft@arm.com> |
Nigel Stephens <nigel.stephens@arm.com> |
Ramana Radhakrishnan <ramana.radhakrishnan@arm.com> |
Richard Earnshaw <rearnsha@arm.com> |
Sofiane Naci <sofiane.naci@arm.com> |
Tejas Belagod <tejas.belagod@arm.com> |
Yufeng Zhang <yufeng.zhang@arm.com> |
* aarch64.h: New file. |
* common.h (EM_res183): Rename to EM_AARCH64. |
(EM_res184): Rename to EM_ARM184. |
2012-06-28 Iain Sandoe <iain@codesourcery.com> |
* common.h (AT_L1I_CACHESHAPE, AT_L1D_CACHESHAPE, |
AT_L2_CACHESHAPE, AT_L3_CACHESHAPE): New defines. |
2012-05-16 Georg-Johann Lay <avr@gjlay.de> |
PR target/13503 |
* avr.h (RELOC_NUMBERS): Rename R_AVR_8_HHI8 to R_AVR_8_HLO8. |
2012-05-15 James Murray <jsm@jsm-net.demon.co.uk> |
* m68hc11.h (R_M68HC12_16B, R_M68HC12_PCREL_9, R_M68HC12_PCREL_10) |
R_M68HC12_HI8XG, R_M68HC12_LO8XG): New relocations. |
(E_M68HC11_XGATE_RAMOFFSET): Define. |
2012-05-14 James Lemke <jwlemke@codesourcery.com> |
* ppc.h (SEC_PPC_VLE): Remove. |
2012-05-14 Catherine Moore <clm@codesourcery.com> |
James Lemke <jwlemke@codesourcery.com> |
* ppc.h (R_PPC_VLE_REL8): New reloction. |
(R_PPC_VLE_REL15): Likewise. |
(R_PPC_VLE_REL24): Likewise. |
(R_PPC_VLE_LO16A): Likewise. |
(R_PPC_VLE_LO16D): Likewise. |
(R_PPC_VLE_HI16A): Likewise. |
(R_PPC_VLE_HI16D): Likewise. |
(R_PPC_VLE_HA16A): Likewise. |
(R_PPC_VLE_HA16D): Likewise. |
(R_PPC_VLE_SDA21): Likewise. |
(R_PPC_VLE_SDA21_LO): Likewise. |
(R_PPC_VLE_SDAREL_LO16A): Likewise. |
(R_PPC_VLE_SDAREL_LO16D): Likewise. |
(R_PPC_VLE_SDAREL_HI16A): Likewise. |
(R_PPC_VLE_SDAREL_HI16D): Likewise. |
(R_PPC_VLE_SDAREL_HA16A): Likewise. |
(R_PPC_VLE_SDAREL_HA16D): Likewise. |
(SEC_PPC_VLE): Remove. |
(PF_PPC_VLE): New program header flag. |
(SHF_PPC_VLE): New section header flag. |
(vle_opcodes, vle_num_opcodes): New. |
(VLE_OP): New macro. |
(VLE_OP_TO_SEG): New macro. |
2012-05-11 Georg-Johann Lay <avr@gjlay.de |
PR target/13503 |
* elf/avr.h (RELOC_NUMBERS): Add values for R_AVR_8_LO8, |
R_AVR_8_HI8, R_AVR_8_HHI8. |
2012-05-03 Sean Keys <skeys@ipdatasys.com> |
* xgate.h: Mininal file to support XGATE relocations. |
2012-04-27 David S. Miller <davem@davemloft.net> |
* sparc.h: Add new ELF_SPARC_HWCAP_* defines for crypto, |
pause, and compare-and-branch instructions. |
2012-03-07 Nick Clifton <nickc@redhat.com> |
* mn10300.h (elf_mn10300_reloc_type): Add R_MN10300_TLS_GD, |
R_MN10300_TLS_LD, R_MN10300_TLS_LDO, R_MN10300_TLS_GOTIE, |
R_MN10300_TLS_IE, R_MN10300_TLS_LE, R_MN10300_TLS_DPTMOD, |
R_MN10300_TLS_DTPOFF and R_MN10300_TLS_TPOFF. |
2012-02-25 Walter Lee <walt@tilera.com> |
* tilegx.h (R_TILEGX_IMM16_X0_HW1_GOT): Delete. |
(R_TILEGX_IMM16_X1_HW1_GOT): Ditto. |
(R_TILEGX_IMM16_X0_HW2_GOT): Ditto. |
(R_TILEGX_IMM16_X1_HW2_GOT): Ditto. |
(R_TILEGX_IMM16_X0_HW3_GOT): Ditto. |
(R_TILEGX_IMM16_X1_HW3_GOT): Ditto. |
(R_TILEGX_IMM16_X0_HW2_LAST_GOT): Ditto. |
(R_TILEGX_IMM16_X1_HW2_LAST_GOT): Ditto. |
(R_TILEGX_IMM16_X0_HW1_TLS_GD): Ditto. |
(R_TILEGX_IMM16_X1_HW1_TLS_GD): Ditto. |
(R_TILEGX_IMM16_X0_HW2_TLS_GD): Ditto. |
(R_TILEGX_IMM16_X1_HW2_TLS_GD): Ditto. |
(R_TILEGX_IMM16_X0_HW3_TLS_GD): Ditto. |
(R_TILEGX_IMM16_X1_HW3_TLS_GD): Ditto. |
(R_TILEGX_IMM16_X0_HW2_LAST_TLS_GD): Ditto. |
(R_TILEGX_IMM16_X1_HW2_LAST_TLS_GD): Ditto. |
(R_TILEGX_IMM16_X0_HW1_TLS_IE): Ditto. |
(R_TILEGX_IMM16_X1_HW1_TLS_IE): Ditto. |
(R_TILEGX_IMM16_X0_HW2_TLS_IE): Ditto. |
(R_TILEGX_IMM16_X1_HW2_TLS_IE): Ditto. |
(R_TILEGX_IMM16_X0_HW3_TLS_IE): Ditto. |
(R_TILEGX_IMM16_X1_HW3_TLS_IE): Ditto. |
(R_TILEGX_IMM16_X0_HW2_LAST_TLS_IE): Ditto. |
(R_TILEGX_IMM16_X1_HW2_LAST_TLS_IE): Ditto. |
(R_TILEGX_IMM16_X0_HW0_TLS_LE): New relocation. |
(R_TILEGX_IMM16_X1_HW0_TLS_LE): Ditto. |
(R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE): Ditto. |
(R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE): Ditto. |
(R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE): Ditto. |
(R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE): Ditto. |
(R_TILEGX_TLS_GD_CALL): Ditto. |
(R_TILEGX_IMM8_X0_TLS_GD_ADD): Ditto. |
(R_TILEGX_IMM8_X1_TLS_GD_ADD): Ditto. |
(R_TILEGX_IMM8_Y0_TLS_GD_ADD): Ditto. |
(R_TILEGX_IMM8_Y1_TLS_GD_ADD): Ditto. |
(R_TILEGX_TLS_IE_LOAD): Ditto. |
(R_TILEGX_IMM8_X0_TLS_ADD): Ditto. |
(R_TILEGX_IMM8_X1_TLS_ADD): Ditto. |
(R_TILEGX_IMM8_Y0_TLS_ADD): Ditto. |
(R_TILEGX_IMM8_Y1_TLS_ADD): Ditto. |
* tilepro.h (R_TILEPRO_TLS_GD_CALL): New relocation. |
(R_TILEPRO_IMM8_X0_TLS_GD_ADD): Ditto. |
(R_TILEPRO_IMM8_X1_TLS_GD_ADD): Ditto. |
(R_TILEPRO_IMM8_Y0_TLS_GD_ADD): Ditto. |
(R_TILEPRO_IMM8_Y1_TLS_GD_ADD): Ditto. |
(R_TILEPRO_TLS_IE_LOAD): Ditto. |
(R_TILEPRO_IMM16_X0_TLS_LE): Ditto. |
(R_TILEPRO_IMM16_X1_TLS_LE): Ditto. |
(R_TILEPRO_IMM16_X0_TLS_LE_LO): Ditto. |
(R_TILEPRO_IMM16_X1_TLS_LE_LO): Ditto. |
(R_TILEPRO_IMM16_X0_TLS_LE_HI): Ditto. |
(R_TILEPRO_IMM16_X1_TLS_LE_HI): Ditto. |
(R_TILEPRO_IMM16_X0_TLS_LE_HA): Ditto. |
(R_TILEPRO_IMM16_X1_TLS_LE_HA): Ditto. |
2011-12-22 DJ Delorie <dj@redhat.com> |
* rl78.h (R_RL78_RH_RELAX, R_RL78_RH_SFR, R_RL78_RH_SADDR): New. |
(RL78_RELAXA_BRA, RL78_RELAXA_ADDR16: New. |
2011-12-19 Chung-Lin Tang <cltang@codesourcery.com> |
* mips.h (elf_mips_reloc_type): Add R_MIPS16_TLS_* entries. |
2011-12-06 Ulrich Weigand <uweigand@de.ibm.com> |
* common.h (NT_S390_LAST_BREAK): Define. |
(NT_S390_SYSTEM_CALL): Likewise. |
2011-11-01 DJ Delorie <dj@redhat.com> |
* common.h (EM_RL78, EM_78K0R): New. |
* rl78.h: New. |
2011-10-25 Joern Rennecke <joern.rennecke@embecosm.com> |
* epiphany.h: New file. |
* common.h (EM_ADAPTEVA_EPIPHANY): Define. |
2011-10-10 Alan Modra <amodra@gmail.com> |
* ppc64.h (R_PPC64_TOCSAVE): Add. |
2011-10-05 DJ Delorie <dj@redhat.com> |
* rx.h (E_FLAG_RX_PID): New. |
2011-09-21 David S. Miller <davem@davemloft.net> |
* sparc.h (Tag_GNU_Sparc_HWCAPS): New object attribute. |
(ELF_SPARC_HWCAP_*): New HWCAPS bitmask values. |
2011-08-12 H.J. Lu <hongjiu.lu@intel.com> |
PR ld/13082 |
* x86-64.h (R_X86_64_RELATIVE64): New. |
2011-07-24 Chao-ying Fu <fu@mips.com> |
Maciej W. Rozycki <macro@codesourcery.com> |
* mips.h (R_MICROMIPS_min): New relocations. |
(R_MICROMIPS_26_S1): Likewise. |
(R_MICROMIPS_HI16, R_MICROMIPS_LO16): Likewise. |
(R_MICROMIPS_GPREL16, R_MICROMIPS_LITERAL): Likewise. |
(R_MICROMIPS_GOT16, R_MICROMIPS_PC7_S1): Likewise. |
(R_MICROMIPS_PC10_S1, R_MICROMIPS_PC16_S1): Likewise. |
(R_MICROMIPS_CALL16, R_MICROMIPS_GOT_DISP): Likewise. |
(R_MICROMIPS_GOT_PAGE, R_MICROMIPS_GOT_OFST): Likewise. |
(R_MICROMIPS_GOT_HI16, R_MICROMIPS_GOT_LO16): Likewise. |
(R_MICROMIPS_SUB, R_MICROMIPS_HIGHER): Likewise. |
(R_MICROMIPS_HIGHEST, R_MICROMIPS_CALL_HI16): Likewise. |
(R_MICROMIPS_CALL_LO16, R_MICROMIPS_SCN_DISP): Likewise. |
(R_MICROMIPS_JALR, R_MICROMIPS_HI0_LO16): Likewise. |
(R_MICROMIPS_TLS_GD, R_MICROMIPS_TLS_LDM): Likewise. |
(R_MICROMIPS_TLS_DTPREL_HI, R_MICROMIPS_TLS_DTPREL_LO): Likewise. |
(R_MICROMIPS_TLS_GOTTPREL): Likewise. |
(R_MICROMIPS_TLS_TPREL_HI16): Likewise. |
(R_MICROMIPS_TLS_TPREL_LO16): Likewise. |
(R_MICROMIPS_GPREL7_S2, R_MICROMIPS_PC23_S2): Likewise. |
(R_MICROMIPS_max): Likewise. |
(EF_MIPS_ARCH_ASE_MICROMIPS): New macro. |
(STO_MIPS_ISA, STO_MIPS_FLAGS): Likewise. |
(ELF_ST_IS_MIPS_PLT, ELF_ST_SET_MIPS_PLT): Likewise. |
(STO_MICROMIPS): Likewise. |
(ELF_ST_IS_MICROMIPS, ELF_ST_SET_MICROMIPS): Likewise. |
(ELF_ST_IS_COMPRESSED): Likewise. |
(STO_MIPS_PLT, STO_MIPS_PIC): Rework. |
(ELF_ST_IS_MIPS_PIC, ELF_ST_SET_MIPS_PIC): Likewise. |
(STO_MIPS16, ELF_ST_IS_MIPS16, ELF_ST_SET_MIPS16): Likewise. |
2011-07-22 H.J. Lu <hongjiu.lu@intel.com> |
* common.h (EM_K1OM): New. |
2011-07-03 Samuel Thibault <samuel.thibault@gnu.org> |
Thomas Schwinge <thomas@schwinge.name> |
PR binutils/12913 |
* common.h (ELFOSABI_GNU): Define, replaces... |
(ELFOSABI_LINUX): ... this, kept as an alias. |
(ELFOSABI_HURD): Remove. |
2011-06-15 Ulrich Weigand <ulrich.weigand@linaro.org> |
* common.h (NT_ARM_VFP): Define. |
2011-06-13 Walter Lee <walt@tilera.com> |
* common.h: Add EM_TILEGX. |
* tilegx.h: New file. |
* tilepro.h: New file. |
2011-06-09 Tristan Gingold <gingold@adacore.com> |
* ia64.h (Elf64_External_VMS_ORIG_DYN_Note): New struct. |
2011-06-02 Nick Clifton <nickc@redhat.com> |
* common.h: Fix spelling mistake in comment. |
* reloc-macros.h: Likewise. |
2011-05-31 Paul Brook <paul@codesourcery.com> |
* arm.h (arm_st_branch_type): Add ST_BRANCH_UNKNOWN. |
2011-05-09 Paul Brook <paul@codesourcery.com> |
* tic6x.h (ELF_STRING_C6000_unwind, |
ELF_STRING_C6000_unwind_info, ELF_STRING_C6000_unwind_once, |
ELF_STRING_C6000_unwind_info_once): Define. |
2011-04-15 Sergio Durigan Junior <sergiodj@redhat.com> |
* common.h (NT_STAPSDT): New define. |
2011-03-31 Bernd Schmidt <bernds@codesourcery.com> |
* tic6x.h (R_C6000_JUMP_SPLOT, R_C6000_EHTYPE, |
R_C6000_PCR_H16, R_C6000_PCR_L16): New relocs. |
(SHN_TIC6X_SCOMMON): Define. |
2011-03-31 Tristan Gingold <gingold@adacore.com> |
* ia64.h (Elf64_External_VMS_Note): New struct. |
(NT_VMS_MHD, NT_VMS_LNM, NT_VMS_SRC, NT_VMS_TITLE, NT_VMS_EIDC) |
(NT_VMS_FPMODE, NT_VMS_LINKTIME, NT_VMS_IMGNAM, NT_VMS_IMGID) |
(NT_VMS_LINKID, NT_VMS_IMGBID, NT_VMS_GSTNAM, NT_VMS_ORIG_DYN) |
(NT_VMS_PATCHTIME) New macros. |
2011-03-14 Richard Sandiford <richard.sandiford@linaro.org> |
* arm.h (R_ARM_IRELATIVE): New relocation. |
2011-03-14 Richard Sandiford <richard.sandiford@linaro.org> |
* internal.h (elf_internal_sym): Add st_target_internal. |
* arm.h (arm_st_branch_type): New enum. |
(ARM_SYM_BRANCH_TYPE): New macro. |
2011-03-10 Nick Clifton <nickc@redhat.com> |
* common.h (EM_V850): V850s now supplied by Renesas. |
2011-02-25 Alan Modra <amodra@gmail.com> |
PR 12516 |
* internal.h (ELF_SECTION_IN_SEGMENT_1): Don't match zero size |
sections at start or end of PT_DYNAMIC. |
2011-01-10 Nathan Sidwell <nathan@codesourcery.com> |
Glauber de Oliveira Costa <glommer@gmail.com> |
* arm.h (R_ARM_TLS_DESC, R_ARM_TLS_GOTDESC, R_ARM_TLS_CALL, |
R_ARM_TLS_DESCSEQ, T_ARM_THM_TLS_CALL, R_ARM_THM_TLS_DESCSEQ): New |
relocations. |
2010-11-16 Jie Zhang <jie.zhang@analog.com> |
* bfin.h (EF_BFIN_CODE_IN_L1): Define. |
(EF_BFIN_DATA_IN_L1): Define. |
2010-11-11 Mingming Sun <mingm.sun@gmail.com> |
* mips.h (E_MIPS_MACH_LS3A): Defined. |
2010-11-02 Joseph Myers <joseph@codesourcery.com> |
* tic6x-attrs.h (Tag_ABI_wchar_t, Tag_ABI_stack_align_needed, |
Tag_ABI_stack_align_preserved, Tag_ABI_PID, Tag_ABI_PIC, |
Tag_ABI_array_object_alignment, |
Tag_ABI_array_object_align_expected, Tag_ABI_conformance): Define. |
2010-10-29 Joseph Myers <joseph@codesourcery.com> |
* tic6x-attrs.h (Tag_ABI_compatibility): Define. |
2010-10-29 Bernd Schmidt <bernds@codesourcery.com> |
Joseph Myers <joseph@codesourcery.com> |
* tic6x-attrs.h (Tag_ABI_DSBT): New. |
2010-10-21 Joseph Myers <joseph@codesourcery.com> |
* tic6x-attrs.h (Tag_C6XABI_Tag_CPU_arch): Change to Tag_ISA, |
value 4. |
* tic6x.h (Values for Tag_C6XABI_Tag_CPU_arch): Rename for |
attribute renaming. |
2010-07-23 Naveen.H.S <naveen.S@kpitcummins.com> |
Ina Pandit <ina.pandit@kpitcummins.com> |
* v850.h: Add support for V850E2 and V850E2V3. |
(v850_reloc_type): Update the newly added relocations |
2010-07-20 Alan Modra <amodra@gmail.com> |
* internal.h (ELF_TBSS_SPECIAL): New macro, extracted from.. |
(ELF_SECTION_SIZE): ..here. |
(ELF_SECTION_IN_SEGMENT_1): Add "strict" arg. |
(ELF_SECTION_IN_SEGMENT_STRICT): New macro. |
2010-06-25 Alan Modra <amodra@gmail.com> |
* ppc64.h (R_PPC64_LO_DS_OPT): Define. |
2010-06-15 Joseph Myers <joseph@codesourcery.com> |
* tic6x-attrs.h: New. |
* tic6x.h: Include elf/tic6x-attrs.h for attribute table. |
(C6XABI_Tag_CPU_arch_none, C6XABI_Tag_CPU_arch_C62X, |
C6XABI_Tag_CPU_arch_C67X, C6XABI_Tag_CPU_arch_C67XP, |
C6XABI_Tag_CPU_arch_C64X, C6XABI_Tag_CPU_arch_C64XP, |
C6XABI_Tag_CPU_arch_C674X): Define. |
2010-06-11 Tristan Gingold <gingold@adacore.com> |
* ia64.h (EF_IA_64_VMS_COMCOD, EF_IA_64_VMS_COMCOD_SUCCESS) |
(EF_IA_64_VMS_COMCOD_WARNING, EF_IA_64_VMS_COMCOD_ERROR) |
(EF_IA_64_VMS_COMCOD_ABORT, EF_IA_64_VMS_LINKAGES): Define. |
(VMS_LF_CALL_DEBUG, VMS_LF_NOP0BUFS, VMS_LF_P0IMAGE) |
(VMS_LF_MKTHREADS, VMS_LF_UPCALLS, VMS_LF_IMGSTA) |
(VMS_LF_INITIALIZE, VMS_LF_MAIN, VMS_LF_EXE_INIT) |
(VMS_LF_TBK_IN_IMG, VMS_LF_DBG_IN_IMG, VMS_LF_TBK_IN_DSF) |
(VMS_LF_DBG_IN_DSF, VMS_LF_SIGNATURES, VMS_LF_REL_SEG_OFF): Define. |
(VMS_STO_VISIBILITY, VMS_ST_VISIBILITY, VMS_STO_FUNC_TYPE) |
(VMS_ST_FUNC_TYPE, VMS_SFT_CODE_ADDR, VMS_SFT_SYMV_IDX) |
(VMS_SFT_FD, VMS_SFT_RESERVE, VMS_STO_LINKAGE, VMS_ST_LINKAGE) |
(VMS_STL_IGNORE, VMS_STL_RESERVE, VMS_STL_STD, VMS_STL_LNK): Define. |
(Elf64_External_VMS_IMAGE_FIXUP): New declaration. |
(Elf64_External_VMS_IMAGE_RELA): Ditto. |
(R_IA64_VMS_DIR8, R_IA64_VMS_DIR16LSB, R_IA64_VMS_CALL_SIGNATURE) |
(R_IA64_VMS_EXECLET_FUNC, R_IA64_VMS_EXECLET_DATA, R_IA64_VMS_FIX8) |
(R_IA64_VMS_FIX16, R_IA64_VMS_FIX32, R_IA64_VMS_FIX64) |
(R_IA64_VMS_FIXFD, R_IA64_VMS_ACC_LOAD, R_IA64_VMS_ACC_ADD) |
(R_IA64_VMS_ACC_SUB, R_IA64_VMS_ACC_MUL, R_IA64_VMS_ACC_DIV) |
(R_IA64_VMS_ACC_AND, R_IA64_VMS_ACC_IOR, R_IA64_VMS_ACC_EOR) |
(R_IA64_VMS_ACC_ASH, R_IA64_VMS_ACC_STO8, R_IA64_VMS_ACC_STO16LSH) |
(R_IA64_VMS_ACC_STO32LSH, R_IA64_VMS_ACC_STO64LSH): New. |
2010-05-25 Daniel Jacobowitz <dan@codesourcery.com> |
Joseph Myers <joseph@codesourcery.com> |
Andrew Stubbs <ams@codesourcery.com> |
* sh.h (EF_SH_PIC, EF_SH_FDPIC): Define. |
(R_SH_FIRST_INVALID_RELOC_6, R_SH_LAST_INVALID_RELOC_6): New. Adjust |
other invalid ranges. |
(R_SH_GOT20, R_SH_GOTOFF20, R_SH_GOTFUNCDESC, R_SH_GOTFUNCDESC20) |
(R_SH_GOTOFFFUNCDESC, R_SH_GOTOFFFUNCDESC20, R_SH_FUNCDESC) |
(R_SH_FUNCDESC_VALUE): New. |
2010-05-18 H.J. Lu <hongjiu.lu@intel.com> |
PR gas/11600 |
* common.h (SHF_EXCLUDE): New. |
* i370.h (SHF_EXCLUDE): Removed. |
* or32.h (SHF_EXCLUDE): Likewise. |
* ppc.h (SHF_EXCLUDE): Likewise. |
* sparc.h (SHF_EXCLUDE): Likewise. |
2010-04-23 Alan Modra <amodra@gmail.com> |
* internal.h (ELF_SECTION_SIZE): Protect macro args with parentheses. |
Invert logic to clarify test for .tbss. |
(ELF_IS_SECTION_IN_SEGMENT): Rename to.. |
(ELF_SECTION_IN_SEGMENT_1): ..this. Add check_vma param. Protect |
macro args with parentheses. |
(ELF_SECTION_IN_SEGMENT): Define. |
(ELF_IS_SECTION_IN_SEGMENT_FILE): Delete. |
(ELF_IS_SECTION_IN_SEGMENT_MEMORY): Delete. |
2010-04-15 Matthew Gretton-Dann <matthew.gretton-dann@arm.com> |
* arm.h (Tag_FP_arch, Tag_ABI_align_needed, Tag_ABI_align_preserved, |
Tag_FP_HP_extension): Add new ABI attribute tags. |
2010-04-15 Nick Clifton <nickc@redhat.com> |
* alpha.h: Update copyright notice to use GPLv3. |
* arc.h: Likewise. |
* arm.h: Likewise. |
* avr.h: Likewise. |
* bfin.h: Likewise. |
* common.h: Likewise. |
* cr16.h: Likewise. |
* cr16c.h: Likewise. |
* cris.h: Likewise. |
* crx.h: Likewise. |
* d10v.h: Likewise. |
* d30v.h: Likewise. |
* dlx.h: Likewise. |
* dwarf.h: Likewise. |
* external.h: Likewise. |
* fr30.h: Likewise. |
* frv.h: Likewise. |
* h8.h: Likewise. |
* hppa.h: Likewise. |
* i370.h: Likewise. |
* i386.h: Likewise. |
* i860.h: Likewise. |
* i960.h: Likewise. |
* ia64.h: Likewise. |
* internal.h: Likewise. |
* ip2k.h: Likewise. |
* iq2000.h: Likewise. |
* lm32.h: Likewise. |
* m32c.h: Likewise. |
* m32r.h: Likewise. |
* m68hc11.h: Likewise. |
* m68k.h: Likewise. |
* mcore.h: Likewise. |
* mep.h: Likewise. |
* microblaze.h: Likewise. |
* mips.h: Likewise. |
* mmix.h: Likewise. |
* mn10200.h: Likewise. |
* moxie.h: Likewise. |
* msp430.h: Likewise. |
* mt.h: Likewise. |
* openrisc.h: Likewise. |
* or32.h: Likewise. |
* pj.h: Likewise. |
* ppc.h: Likewise. |
* ppc64.h: Likewise. |
* reloc-macros.h: Likewise. |
* rx.h: Likewise. |
* s390.h: Likewise. |
* sh.h: Likewise. |
* sparc.h: Likewise. |
* spu.h: Likewise. |
* v850.h: Likewise. |
* vax.h: Likewise. |
* vxworks.h: Likewise. |
* x86-64.h: Likewise. |
* xc16x.h: Likewise. |
* xstormy16.h: Likewise. |
* xtensa.h: Likewise. |
2010-04-08 David Stubbs <stubbs@icerasemi.com> |
* internal.h (ELF_IS_SECTION_IN_SEGMENT): PT_PHDR program headers |
cannot contain any sections. |
2010-03-25 Joseph Myers <joseph@codesourcery.com> |
* common.h (ELFOSABI_C6000_ELFABI, ELFOSABI_C6000_LINUX): Define. |
* tic6x.h: New. |
2010-03-05 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> |
* common.h (VER_FLG_*): Document. |
(VER_FLG_INFO): Define. |
2010-02-23 Andrew Zabolotny <anpaza@mail.ru> |
PR binutils/11297 |
* avr.h: (R_AVR_8): New relocation number. |
2010-02-18 Matthew Gretton-Dann <matthew.gretton-dann@arm.com> |
* arm.h (Tag_MPextension_use): Renumber. |
(Tag_DIV_use): Add. |
(Tag_MPextension_use_legacy): Likewise. |
2010-02-09 Michael Holzheu <holzheu@de.ibm.com> |
* common.h (NT_S390_TIMER, NT_S390_TODCMP, NT_S390_TODPREG, |
NT_S390_CTRS and NT_S390_PREFIX): Define. |
2010-02-08 David S. Miller <davem@davemloft.net> |
* sparc.h (R_SPARC_JMP_IREL, R_SPARC_IRELATIVE): Define. |
2010-02-02 H.J. Lu <hongjiu.lu@intel.com> |
* common.h (NT_386_XSTATE): New. |
2010-01-21 Andreas Krebbel <Andreas.Krebbel@de.ibm.com> |
* s390.h (EF_S390_HIGH_GPRS): Added macro definition. |
2010-01-19 Daisuke Hatayama <d.hatayama@jp.fujitsu.com> |
* common.h (PN_XNUM): Define. |
2009-12-18 Ulrich Weigand <uweigand@de.ibm.com> |
* common.h (NT_S390_HIGH_GPRS): Define. |
2009-12-17 Alan Modra <amodra@bigpond.net.au> |
* ppc.h (R_PPC_RELAX32, R_PPC_RELAX32PC, R_PPC_RELAX32_PLT, |
R_PPC_RELAX32PC_PLT): Delete. |
(R_PPC_RELAX, R_PPC_RELAX_PLT, R_PPC_RELAX_PLTREL24): Define. |
2009-12-03 David Daney <ddaney@caviumnetworks.com> |
Adam Nemet <adambnemet@gmail.com> |
* mips.h (E_MIPS_MACH_OCTEON2): New machine flag. |
2009-11-28 Joseph Myers <joseph@codesourcery.com> |
* common.h (ELFOSABI_FENIXOS, EM_TI_C6000, EM_TI_C2000, |
EM_TI_C5500, EM_CUDA): Define. |
(EM_res140, EM_res141, EM_res142): Remove. |
2009-11-17 Paul Brook <paul@codesourcery.com> |
Daniel Jacobowitz <dan@codesourcery.com> |
* arm.h (TAG_CPU_ARCH_V7E_M): Define. |
2009-09-29 DJ Delorie <dj@redhat.com> |
* rx.h: New file. |
2009-09-21 Alan Modra <amodra@bigpond.net.au> |
* ppc.h (DT_PPC_TLSOPT): Define. |
* ppc64.h (DT_PPC64_TLSOPT): Define. |
2009-08-10 Daniel Gutson <dgutson@codesourcery.com> |
* arm.h: (SHT_ARM_DEBUGOVERLAY): New define. |
(SHT_ARM_OVERLAYSECTION): New define. |
2006-08-09 Bernd Schmidt <bernd.schmidt@analog.com> |
From Mike Frysinger <michael.frysinger@analog.com> |
* bfin.h (R_BFIN_UNUSED, R_BFIN_PCREL5M2, R_BFIN_UNUSED1, |
R_BFIN_PCREL10, R_BFIN_PCREL12_JUMP, R_BFIN_RIMM16, |
R_BFIN_LUIMM16, R_BFIN_HUIMM16, R_BFIN_PCREL12_JUMP_S, |
R_BFIN_PCREL24_JUMP_X, R_BFIN_PCREL24, R_BFIN_UNUSEDB, |
R_BFIN_UNUSEDC, R_BFIN_PCREL24_JUMP_L, R_BFIN_PCREL24_CALL_X, |
R_BFIN_VAR_EQ_SYMB, R_BFIN_BYTE_DATA, R_BFIN_BYTE2_DATA, |
R_BFIN_BYTE4_DATA, R_BFIN_PCREL11, R_BFIN_PUSH, R_BFIN_CONST, |
R_BFIN_ADD, R_BFIN_SUB, R_BFIN_MULT, R_BFIN_DIV, R_BFIN_MOD, |
R_BFIN_LSHIFT, R_BFIN_RSHIFT, R_BFIN_AND, R_BFIN_OR, R_BFIN_XOR, |
R_BFIN_LAND, R_BFIN_LOR, R_BFIN_LEN, R_BFIN_NEG, R_BFIN_COMP, |
R_BFIN_PAGE, R_BFIN_HWPAGE, R_BFIN_ADDR, R_BFIN_PLTPLC, |
R_BFIN_GOT, R_BFIN_MAX): Renamed from R_unused0, R_pcrel5ms, |
R_unused1, R_pcrel10, R_pcrel12_jump, R_rimm16, R_luimm16, |
R_huimm16, R_pcrel12_jump_s, R_pcrel24_jump_x, R_pcrel24, |
R_unusedb, R_unusedc, R_pcrel24_jump_l, R_pcrel24_call_x, |
R_var_eq_symb, R_byte_data, R_byte2_data, R_byte4_data, R_pcrel11, |
R_push, R_const, R_add, R_sub, R_mult, R_div, R_mod, R_lshift, |
R_rshift, R_and, R_or, R_xor, R_land, R_lor, R_len, R_neg, R_comp, |
R_page, R_hwpage, R_addr, R_pltpc, R_got. |
2009-08-09 Michael Eager <eager@eagercon.com> |
* elf/common.h: Define EM_resnnn reserved values. Add EM_AVR32, |
EM_STM8, EM_TILE64, EM_TILEPRO. Change EM_MICROBLAZE. |
2009-08-06 Michael Eager <eager@eagercon.com> |
* elf/common.h: Define EM_MICROBLAZE & EM_MICROBLAZE_OLD. |
* elf/microblaze.h: New reloc definitions. |
2009-07-30 Alan Modra <amodra@bigpond.net.au> |
* ppc64.h: Add R_PPC64_JMP_IREL, R_PPC64_REL16, R_PPC64_REL16_LO, |
R_PPC64_REL16_HI, R_PPC64_REL16_HA. |
2009-07-25 H.J. Lu <hongjiu.lu@intel.com> |
* common.h (EM_L1OM): New. |
2009-07-24 Trevor Smigiel <Trevor_Smigiel@playstation.sony.com> |
Alan Modra <amodra@bigpond.net.au> |
* spu.h (R_SPU_ADD_PIC): New. |
2009-07-23 Ulrich Drepper <drepper@redhat.com> |
* common.h (STB_GNU_UNIQUE): Define. |
2009-07-10 Tom Tromey <tromey@redhat.com> |
* dwarf2.h: Move to `..'. |
2009-07-10 H.J. Lu <hongjiu.lu@intel.com> |
* dwarf2.h: Just include ../dwarf2.h. |
2009-07-10 Alan Modra <amodra@bigpond.net.au> |
* ppc.h (R_PPC_IRELATIVE): Add. |
(R_PPC_RELAX32, R_PPC_RELAX32PC, |
R_PPC_RELAX32_PLT, R_PPC_RELAX32PC_PLT): Renumber. |
* ppc64.h (R_PPC64_IRELATIVE): Add. |
2009-07-03 Jakub Jelinek <jakub@redhat.com> |
* dwarf2.h (enum dwarf_location_atom): Add DW_OP_implicit_value |
and DW_OP_stack_value. |
2009-06-22 Alan Modra <amodra@bigpond.net.au> |
* ppc.h (R_PPC_RELAX*): Define as enum. |
2009-06-11 Anthony Green <green@moxielogic.org> |
* moxie.h (R_MOXIE_PCREL10): New. |
2009-06-01 H.J. Lu <hongjiu.lu@intel.com> |
PR ld/10205 |
* i386.h (R_386_IRELATIVE): New. |
* x86-64.h (R_X86_64_IRELATIVE): Likewise. |
2009-05-27 H.J. Lu <hongjiu.lu@intel.com> |
* common.h: Update comments for dynamic tag ranges. |
2009-04-30 DJ Delorie <dj@redhat.com> |
* mep.h (EF_MEP_COP_*): New. |
(EF_MEP_ALL_FLAGS): Add them. |
2009-04-30 Nick Clifton <nickc@redhat.com> |
* common.h (STT_GNU_IFUNC): Define. |
2009-04-24 Cary Coutant <ccoutant@google.com> |
* dwarf2.h (DW_LNE_set_discriminator): New enum value. |
2009-04-15 Anthony Green <green@moxielogic.com> |
* common.h (EM_MOXIE): Define. |
* moxie.h: New file. |
2009-04-07 DJ Delorie <dj@redhat.com> |
* mep.h (EF_MEP_CPU_C5): New. |
2009-04-01 H.J. Lu <hongjiu.lu@intel.com> |
* common.h (EM_INTEL178): Removed. |
(EM_INTEL179): Likewise. |
(EM_ETPU): New. |
(EM_SLE9X): Likewise. |
(EM_INTEL181): Likewise. |
(EM_INTEL182): Likewise. |
2009-03-31 H.J. Lu <hongjiu.lu@intel.com> |
* common.h (EM_INTEL178): New. |
(EM_INTEL179): Likewise. |
(EM_INTEL180): Likewise. |
2009-03-20 Mikolaj Zalewski <mikolajz@google.com> |
* common.h (SHT_GNU_INCREMENTAL_INPUTS): Define. |
2009-03-14 Mark Kettenis <kettenis@gnu.org> |
* common.h (NT_OPENBSD_PROCINFO, NT_OPENBSD_AUXV) |
(NT_OPENBSD_REGS, NT_OPENBSD_FPREGS, NT_OPENBSD_XFPREGS) |
(NT_OPENBSD_WCOOKIE): New defines. |
2009-03-16 Jan Kratochvil <jan.kratochvil@redhat.com> |
* common.h (AT_RANDOM): Define. |
2009-03-04 Alan Modra <amodra@bigpond.net.au> |
* ppc.h (R_PPC_TLSGD, R_PPC_TLSLD): Add new relocs. |
* ppc64.h (R_PPC64_TLSGD, R_PPC64_TLSLD): Add new relocs. |
2009-03-02 Qinwei <qinwei@sunnorth.com.cn> |
* score.h (RELOC_NUMBER): Add R_SCORE_IMM32. |
* common.h (EM_SCORE_OLD): Define. |
2009-02-23 H.J. Lu <hongjiu.lu@intel.com> |
* common.h (STB_LOPROC): Replace Application-specific with |
Processor-specific in comments. |
(STB_HIPROC): Likewise. |
(STT_LOPROC): Likewise. |
(STT_HIPROC): Likewise. |
2009-02-03 Sandip Matte <sandip@rmicorp.com> |
* mips.h (E_MIPS_MACH_XLR): Define. |
2009-02-03 Maxim Kuvyrkov <maxim@codesourcery.com> |
* m68k.h: Map TLS relocations to numbers. |
2009-01-15 Andrew Stubbs <ams@codesourcery.com> |
Julian Brown <julian@codesourcery.com> |
* arm.h (TAG_CPU_ARCH_V6_M, TAG_CPU_ARCH_V6S_M): New defines. |
(MAX_TAG_CPU_ARCH, TAG_CPU_ARCH_V4T_PLUS_V6_M): New defines. |
(Tag_NEON_arch): Rename to Tag_Advanced_SIMD_arch to match ARM ABI |
version 2.07. |
(Tag_undefined39, Tag_nodefaults): New enum values. |
(Tag_also_compatible_with, Tag_T2EE_use): Likewise. |
(Tag_conformance, Tag_Virtualization_use): Likewise. |
(Tag_undefined69, Tag_MPextension_use): Likewise. |
2009-01-15 Douglas B Rupp <rupp@gnat.com> |
* ia64.h (SHT_IA_64_VMS_DISPLAY_NAME_INFO, EF_IA_64_ARCHVER_1): |
New macros. Minor reformatting. |
2008-12-23 Jon Beniston <jon@beniston.com> |
* lm32.h: New file. |
2008-12-23 Nick Clifton <nickc@redhat.com> |
* commmon.h (STT_IFUNC): Delete. |
2008-12-20 Hans-Peter Nilsson <hp@axis.com> |
* cris.h (R_CRIS_32_IE): New relocation. |
2008-12-03 Nick Clifton <nickc@redhat.com> |
* common.h (STT_IFUNC): Define. |
2008-11-27 M R Swami Reddy <MR.Swami.Reddy@nsc.com> |
* cr16.h (R_CR16_GOT_REGREL20, R_CR16_GOTC_REGREL20 and |
R_CR16_GLOB_DAT): New relocations. |
2008-11-25 Hans-Peter Nilsson <hp@axis.com> |
* cris.h (R_CRIS_32_TPREL): Correct comment. |
(R_CRIS_DTPMOD): Open up for use elsewhere than the fourth GOT entry. |
2008-11-18 Catherine Moore <clm@codesourcery.com> |
* arm.h (Tag_ABI_FP_16bit_format): Define. |
2008-11-14 Nathan Sidwell <nathan@codesourcery.com> |
* internal.h (struct elf_segment_map): Add header_size field. |
2008-10-13 Ulrich Weigand <uweigand@de.ibm.com> |
* common.h (AT_BASE_PLATFORM, AT_EXECFN): Define. |
2008-10-10 Nathan Froyd <froydnj@codesourcery.com> |
* ppc.h: Add Tag_GNU_Power_ABI_Struct_Return. |
2008-10-04 Hans-Peter Nilsson <hp@axis.com> |
* cris.h (R_CRIS_32_GOT_GD, R_CRIS_16_GOT_GD, R_CRIS_32_GD) |
(R_CRIS_DTP, R_CRIS_32_DTPREL, R_CRIS_16_DTPREL, R_CRIS_DTPMOD) |
(R_CRIS_32_GOT_TPREL, R_CRIS_16_GOT_TPREL, R_CRIS_32_TPREL) |
(R_CRIS_16_TPREL): New relocations. |
2008-08-20 Bob Wilson <bob.wilson@acm.org> |
* xtensa.h (R_XTENSA_TLSDESC_FN, R_XTENSA_TLSDESC_ARG) |
(R_XTENSA_TLS_DTPOFF, R_XTENSA_TLS_TPOFF, R_XTENSA_TLS_FUNC) |
(R_XTENSA_TLS_ARG, R_XTENSA_TLS_CALL): New. |
2008-08-08 Richard Sandiford <rdsandiford@googlemail.com> |
Daniel Jacobowitz <dan@codesourcery.com> |
Catherine Moore <clm@codesourcery.com> |
Mark Shinwell <shinwell@codesourcery.com> |
* mips.h (STO_MIPS_PLT, ELF_ST_IS_MIPS_PLT, ELF_ST_SET_MIPS_PLT) |
(STO_MIPS_PIC, DT_MIPS_PLTGOT, DT_MIPS_RWPLT): New macros. |
2008-08-04 Markus Weiss <weissms@aros.org> |
* common.h (ELFOSABI_AROS): Update comment. |
2008-07-26 Michael Eager <eager@eagercon.com> |
* ppc.h: Add description of single-precision. |
2008-07-21 Luis Machado <luisgpm@br.ibm.com> |
* common.h: Define NT_PPC_VSX. |
2008-07-10 Richard Sandiford <rdsandiford@googlemail.com> |
* mips.h (ELF_ST_IS_MIPS16, ELF_ST_SET_MIPS16): New macros. |
2008-06-18 M R Swami Reddy <MR.Swami.Reddy@nsc.com> |
* common.h (EM_CR16): Correct value. |
(EM_CR16): Rename to EM_CR16_OLD. |
2008-06-12 DJ Delorie <dj@redhat.com> |
* common.h (EM_M32C_NEW): Rename to EM_M32C. |
(EM_M32C): Rename to EM_M32C_OLD. |
2008-06-12 Joseph Myers <joseph@codesourcery.com> |
* common.h: Update e_machine table. |
2008-06-09 Takashi Yoshii <yoshii.takashi@renesas.com> |
* sh.h (EF_SH_BFD_TABLE): Set bfd_mach_sh for EF_SH_UNKNOWN. |
2008-06-09 Joseph Myers <joseph@codesourcery.com> |
* common.h: Change registry@caldera.com to registry@sco.com. |
2008-05-21 Nick Clifton <nickc@redhat.com> |
* reloc-macros.h: Add a comment about the use of the |
END_RELOC_NUMBERS symbol as a sentinel value. |
2008-05-15 Christophe Lyon <christophe.lyon@st.com> |
* arm.h (END_RELOC_NUMBERS): Provide a maximum value. |
2008-04-16 David S. Miller <davem@davemloft.net> |
* elf/sparc.h (R_SPARC_GOTDATA_HIX22, |
R_SPARC_GOTDATA_LOX10, R_SPARC_GOTDATA_OP_HIX22, |
R_SPARC_GOTDATA_OP_LOX10, R_SPARC_GOTDATA_OP, |
R_SPARC_H34, R_SPARC_SIZE32, R_SPARC_SIZE64): New relocs. |
2008-03-24 Ian Lance Taylor <iant@google.com> |
* common.h (NT_GNU_GOLD_VERSION): Define. |
2008-03-13 Alan Modra <amodra@bigpond.net.au> |
* internal.h (Elf_Internal_Shdr): Change sh_link and sh_info from |
unsigned long to unsigned int. Change sh_addralign to bfd_vma. |
Order struct as for external version. |
2008-03-12 Alan Modra <amodra@bigpond.net.au> |
PR 5900 |
* common.h (SHN_BAD): Delete. |
(SHN_LORESERVE .. SHN_HIRESERVE): Move to.. |
* external.h: ..here. |
* internal.h (SHN_LORESERVE, SHN_HIRESERVE): Define. |
(SHN_LOPROC, SHN_HIPROC, SHN_LOOS, SHN_HIOS): Define. |
(SHN_ABS, SHN_COMMON, SHN_XINDEX, SHN_BAD): Define. |
2008-03-12 Alan Modra <amodra@bigpond.net.au> |
* cr16c.h (SHN_CR16C_FCOMMON): Define using SHN_LORESERVE. |
(SHN_CR16C_NCOMMON): Likewise. |
* hppa.h (SHN_PARISC_ANSI_COMMON): Likewise. |
(SHN_PARISC_HUGE_COMMON): Likewise. |
* ia64.h (SHN_IA_64_ANSI_COMMON): Likewise. |
(SHN_IA_64_VMS_SYMVEC): Define using SHN_LOOS. |
* m32r.h (SHN_M32R_SCOMMON): Define using SHN_LORESERVE. |
* mips.h (SHN_MIPS_ACOMMON, SHN_MIPS_TEXT): Likewise. |
(SHN_MIPS_DATA, SHN_MIPS_SCOMMON, SHN_MIPS_SUNDEFINED): Likewise. |
* score.h (SHN_SCORE_TEXT, SHN_SCORE_DATA): Likewise. |
(SHN_SCORE_SCOMMON): Likewise. |
* sparc.h (SHN_BEFORE, SHN_AFTER): Likewise. |
* v850.h (SHN_V850_SCOMMON, SHN_V850_TCOMMON): Likewise. |
(SHN_V850_ZCOMMON): Likewise. |
* x86-64.h (SHN_X86_64_LCOMMON): Likewise. |
2008-03-03 Pallavi Tambay <pallavi.tambay@amd.com> |
* dwarf2.h: (enum dwarf_location_atom): Add new DW_OP: |
DW_OP_PGI_omp_thread_num. |
2008-02-04 Adam Nemet <anemet@caviumnetworks.com> |
* mips.h: Update copyright. |
(E_MIPS_MACH_OCTEON): New macro. |
2008-01-30 Tristan Gingold <gingold@adacore.com> |
Add OpenVMS extensions. |
* ia64.h (SHF_IA_64_VMS_GLOBAL, SHF_IA_64_VMS_OVERLAID) |
(SHF_IA_64_VMS_SHARED, SHF_IA_64_VMS_VECTOR) |
(SHF_IA_64_VMS_ALLOC_64BIT, SHF_IA_64_VMS_PROTECTED) |
(SHT_IA_64_VMS_TRACE, SHT_IA_64_VMS_TIE_SIGNATURES) |
(SHT_IA_64_VMS_DEBUG, SHT_IA_64_VMS_DEBUG_STR) |
(SHT_IA_64_VMS_LINKAGES, SHT_IA_64_VMS_SYMBOL_VECTOR) |
(SHT_IA_64_VMS_FIXUP, DT_IA_64_VMS_SUBTYPE) |
(DT_IA_64_VMS_IMGIOCNT, DT_IA_64_VMS_LNKFLAGS) |
(DT_IA_64_VMS_VIR_MEM_BLK_SIZ, DT_IA_64_VMS_IDENT) |
(DT_IA_64_VMS_NEEDED_IDENT, DT_IA_64_VMS_IMG_RELA_CNT) |
(DT_IA_64_VMS_SEG_RELA_CNT, DT_IA_64_VMS_FIXUP_RELA_CNT) |
(DT_IA_64_VMS_FIXUP_NEEDED, DT_IA_64_VMS_SYMVEC_CNT) |
(DT_IA_64_VMS_XLATED, DT_IA_64_VMS_STACKSIZE) |
(DT_IA_64_VMS_UNWINDSZ, DT_IA_64_VMS_UNWIND_CODSEG) |
(DT_IA_64_VMS_UNWIND_INFOSEG, DT_IA_64_VMS_LINKTIME) |
(DT_IA_64_VMS_SEG_NO, DT_IA_64_VMS_SYMVEC_OFFSET) |
(DT_IA_64_VMS_SYMVEC_SEG, DT_IA_64_VMS_UNWIND_OFFSET) |
(DT_IA_64_VMS_UNWIND_SEG, DT_IA_64_VMS_STRTAB_OFFSET) |
(DT_IA_64_VMS_SYSVER_OFFSET, DT_IA_64_VMS_IMG_RELA_OFF) |
(DT_IA_64_VMS_SEG_RELA_OFF, DT_IA_64_VMS_FIXUP_RELA_OFF) |
(DT_IA_64_VMS_PLTGOT_OFFSET, DT_IA_64_VMS_PLTGOT_SEG) |
(DT_IA_64_VMS_FPMODE, SHN_IA_64_VMS_SYMVEC): Define |
2008-01-16 Mark Kettenis <kettenis@gnu.org> |
* common.h (AT_SUN_AUXFLAGS): Define. |
2007-12-11 Daniel Jacobowitz <dan@codesourcery.com> |
* dwarf2.h (DW_AT_hi_user): Correct value. |
2007-12-07 Bob Wilson <bob.wilson@acm.org> |
* xtensa.h (R_XTENSA_32_PCREL): New. |
2007-11-29 Mark Shinwell <shinwell@codesourcery.com> |
* mips.h (E_MIPS_MACH_LS2E): New. |
(E_MIPS_MACH_LS2F): New. |
2007-11-28 Nathan Sidwell <nathan@codesourcery.com> |
* internal.h (ELF_IS_SECTION_IN_SEGMENT): Adjust to cope with |
segments at the end of memory. |
2007-11-17 Thiemo Seufer <ths@mips.com> |
* mips.h (Tag_GNU_MIPS_ABI_FP): Mention -mips32r2 -mfp64 variant |
in comment. |
2007-11-16 Nick Clifton <nickc@redhat.com> |
* dwarf2.h: Mention the location of the DWARF3 spec on the web. |
(DW_AT_stride_size): Rename to DW_AT_bit_stride. |
(DW_AT_stride): Rename to DW_AT_byte_stride. |
2007-11-08 Nathan Sidwell <nathan@codesourcery.com> |
* vxworks.h: New. |
2007-10-30 Nick Clifton <nickc@redhat.com> |
* mn10300.h (R_MN10300_ALIGN): Define. |
2007-10-25 Daniel Jacobowitz <dan@codesourcery.com> |
* ppc.h (Tag_GNU_Power_ABI_Vector): New. |
2007-10-19 Nick Clifton <nickc@redhat.com> |
* mn10300.h: Add R_MN10300_SYM_DIFF reloc. |
2007-10-18 Roland McGrath <roland@redhat.com> |
* common.h (NT_PPC_VMX): New macro. |
2007-10-01 M R Swami Reddy <MR.Swami.Reddy@nsc.com> |
* cr16.h: Updated with new relocaction macros. |
2007-09-17 H.J. Lu <hongjiu.lu@intel.com> |
PR binutils/3281 |
PR binutils/5037 |
* internal.h (elf_segment_map): Add p_size and p_size_valid. |
(ELF_IS_SECTION_IN_SEGMENT): Allow SHF_TLS sections in |
PT_GNU_RELRO segments. |
2007-09-11 Nathan Sidwell <nathan@codesourcery.com> |
* m68k.h (EF_M68K_CF_ISA_C_NODIV): New. |
2007-08-25 Ulrich Weigand <uweigand@de.ibm.com> |
* common.h (NT_SPU): Define. |
2007-08-16 H.J. Lu <hongjiu.lu@intel.com> |
* common.h: Revert last change. |
2007-08-16 H.J. Lu <hongjiu.lu@intel.com> |
* common.h (PT_GNU_STACK): Renamed to ... |
(PT_GNU_ATTR): This. |
(PT_GNU_STACK): New. Make an alias of PT_GNU_ATTR. |
2007-07-09 Roland McGrath <roland@redhat.com> |
* common.h (NT_GNU_HWCAP, NT_GNU_BUILD_ID): New macros. |
2007-06-29 Joseph Myers <joseph@codesourcery.com> |
* ppc.h (Tag_GNU_Power_ABI_FP): Define. |
2007-06-29 Joseph Myers <joseph@codesourcery.com> |
* mips.h (Tag_GNU_MIPS_ABI_FP): Define. |
2007-06-29 Joseph Myers <joseph@codesourcery.com> |
* arm.h (elf32_arm_add_eabi_attr_int, |
elf32_arm_add_eabi_attr_string, elf32_arm_add_eabi_attr_compat, |
elf32_arm_get_eabi_attr_int, elf32_arm_set_eabi_attr_contents, |
elf32_arm_eabi_attr_size, Tag_NULL, Tag_File, Tag_Section, |
Tag_Symbol, Tag_compatibility): Remove. |
* common.h (SHT_GNU_ATTRIBUTES): Define. |
2007-06-29 M R Swami Reddy <MR.Swami.Reddy@nsc.com> |
* common.h (EM_CR16): New entry for CR16 cpu. |
* cr16.h: New file. |
2007-06-11 Sterling Augustine <sterling@tensilica.com> |
Bob Wilson <bob.wilson@acm.org> |
* xtensa.h (XTENSA_PROP_INSN_NO_TRANSFORM): Renamed to... |
(XTENSA_PROP_NO_TRANSFORM): ...this. |
2007-05-18 Caroline Tice <ctice@apple.com> |
* dwarf2.h: (enum dwarf_location_atom): Add new DW_OP, |
DW_OP_GNU_uninit. |
2007-05-12 Alan Modra <amodra@bigpond.net.au> |
* spu.h (R_SPU_ADDR16X): Define. |
(R_SPU_PPU32, R_SPU_PPU64): Renumber. |
2007-05-11 Alan Modra <amodra@bigpond.net.au> |
* spu.h (R_SPU_PPU32, R_SPU_PPU64): Define. |
2007-05-02 Alan Modra <amodra@bigpond.net.au> |
* internal.h (ELF_IS_SECTION_IN_SEGMENT): Check both file offset |
and vma for appropriate sections. |
2007-04-26 Jan Beulich <jbeulich@novell.com> |
* common.h (DT_ENCODING): Correct value (back to spec mandated |
value). |
2007-03-08 Alan Modra <amodra@bigpond.net.au> |
* v850.h (V850_OTHER_TDA_BYTE): Delete. |
(V850_OTHER_SDA, V850_OTHER_ZDA, V850_OTHER_TDA): Assign bits |
that don't clash with visibility bits. |
2007-03-07 Alan Modra <amodra@bigpond.net.au> |
* common.h (ELF_ST_VISIBILITY): Comment typo fix. |
2007-02-05 Dave Brolley <brolley@redhat.com> |
Richard Sandiford <rsandifo@redhat.com> |
Richard Henderson <rth@redhat.com> |
DJ Delorie <dj@redhat.com> |
Ben Elliston <bje@redhat.com> |
* mep.h: New file. |
* common.h (EM_CYGNUS_MEP): Define. |
2007-02-15 Dave Brolley <brolley@redhat.com> |
From Graydon Hoare <graydon@redhat.com>: |
* common.h (STT_RELC, STT_SRELC, R_RELC): New macros. |
2007-01-08 Kazu Hirata <kazu@codesourcery.com> |
* m68k.h (EF_M68K_FIDO): New. |
(EF_M68K_ARCH_MASK): OR EF_M68K_FIDO. |
(EF_M68K_CPU32_FIDO_A, EF_M68K_CPU32_MASK): Remove. |
2006-12-25 Kazu Hirata <kazu@codesourcery.com> |
* m68k.h (EF_M68K_CPU32_FIDO_A, EF_M68K_CPU32_MASK): New. |
2006-12-19 Kazu Hirata <kazu@codesourcery.com> |
* m68k.h (EF_M68K_ARCH_MASK): New. |
2006-12-19 Nathan Sidwell <nathan@codesourcery.com> |
* internal.h (struct elf_segment_map): Add p_vaddr_offset field. |
2006-12-07 Kazu Hirata <kazu@codesourcery.com> |
* m68k.h (EF_M68K_ISA_MASK, EF_M68K_ISA_A_NODIV, |
EF_M68K_ISA_A, EF_M68K_ISA_A_PLUS, EF_M68K_ISA_B_NOUSP, |
EF_M68K_ISA_B, EF_M68K_ISA_C, EF_M68K_MAC_MASK, EF_M68K_MAC, |
EF_M68K_EMAC, EF_M68K_EMAC_B, EF_M68K_FLOAT): Rename to |
EF_M68K_CF_ISA_MASK, EF_M68K_CF_ISA_A_NODIV, EF_M68K_CF_ISA_A, |
EF_M68K_CF_ISA_A_PLUS, EF_M68K_CF_ISA_B_NOUSP, |
EF_M68K_CF_ISA_B, EF_M68K_CF_ISA_C, EF_M68K_CF_MAC_MASK, |
EF_M68K_CF_MAC, EF_M68K_CF_EMAC, EF_M68K_CF_EMAC_B, |
EF_M68K_CF_FLOAT, respectively. |
2006-12-05 Michael Tautschnig <tautschn@model.in.tum.de> |
Nick Clifton <nickc@redhat.com> |
* external.h (struct Elf_External_Versym): Use ATTRIBUTE_PACKED. |
2006-10-28 Richard Sandiford <richard@codesourcery.com> |
* mips.h (R_MIPS_GLOB_DAT): Define |
(R_MIPS_max): Bump by 1. |
2006-10-25 Trevor Smigiel <Trevor_Smigiel@playstation.sony.com> |
Yukishige Shibata <shibata@rd.scei.sony.co.jp> |
Nobuhisa Fujinami <fnami@rd.scei.sony.co.jp> |
Takeaki Fukuoka <fukuoka@rd.scei.sony.co.jp> |
Alan Modra <amodra@bigpond.net.au> |
* common.h (EM_SPU): Define. |
* spu.h: New file. |
2006-10-19 Mei Ligang <ligang@sunnorth.com.cn> |
* score.h (EF_SCORE_PIC): Redefine EF_SCORE_PIC as 0x80000000. |
(EF_SCORE_FIXDEP): Redefine EF_SCORE_FIXDEP as 0x40000000. |
(EF_SCORE_HASENTRY): Delete. |
2006-10-17 Mark Shinwell <shinwell@codesourcery.com> |
* arm.h: Define TAG_CPU_ARCH_* constants. |
2006-09-17 Mei Ligang <ligang@sunnorth.com.cn> |
* score.h: New file. |
* common.h: Add Score machine number. |
2006-07-10 Jakub Jelinek <jakub@redhat.com> |
* common.h (SHT_GNU_HASH, DT_GNU_HASH): Define. |
2006-05-31 H.J. Lu <hongjiu.lu@intel.com> |
* internal.h (ELF_SECTION_SIZE): New. |
(ELF_IS_SECTION_IN_SEGMENT): Likewise. |
(ELF_IS_SECTION_IN_SEGMENT_FILE): Updated. |
(ELF_IS_SECTION_IN_SEGMENT_MEMORY): Likewise. |
2006-05-27 H.J. Lu <hongjiu.lu@intel.com> |
* internal.h (struct elf_segment_map): Add p_align and p_align_valid. |
2006-05-24 Carlos O'Donell <carlos@systemhalted.org> |
Randolph Chung <randolph@tausq.org> |
* hppa.h (R_PARISC_TLS_GD21L, R_PARISC_TLS_GD14R, R_PARISC_TLS_GDCALL, |
R_PARISC_TLS_LDM21L, R_PARISC_TLS_LDM14R, R_PARISC_TLS_LDMCALL, |
R_PARISC_TLS_LDO21L, R_PARISC_TLS_LDO14R, R_PARISC_TLS_DTPMOD32, |
R_PARISC_TLS_DTPMOD64, R_PARISC_TLS_DTPOFF32, R_PARISC_TLS_DTPOFF64): |
New TLS relocs. |
(R_PARISC_TLS_LE21L, R_PARISC_TLS_LE14R, R_PARISC_TLS_IE21L, |
R_PARISC_TLS_IE14R, R_PARISC_TLS_TPREL32, R_PARISC_TLS_TPREL64): |
Define TLS relocs using existing equivalents. |
2006-05-24 Bjoern Haase <bjoern.m.haase@web.de> |
* avr.h: Add E_AVR_MACH_AVR6, R_AVR_LO8_LDI_GS and R_AVR_HI8_LDI_GS. |
2006-03-25 Bernd Schmidt <bernd.schmidt@analog.com> |
* bfin.h (R_BFIN_GOT17M4, R_BFIN_GOTHI, R_BFIN_GOTLO, |
R_BFIN_FUNCDESC, R_BFIN_FUNCDESC_GOT17M4, R_BFIN_FUNCDESC_GOTHI, |
R_BFIN_FUNCDESC_GOTLO, R_BFIN_FUNCDESC_VALUE, |
R_BFIN_FUNCDESC_GOTOFF17M4, R_BFIN_FUNCDESC_GOTOFFHI, |
R_BFIN_FUNCDESC_GOTOFFLO, R_BFIN_GOTOFF17M4, R_BFIN_GOTOFFHI, |
R_BFIN_GOTOFFLO): New relocs. |
(EF_BFIN_PIC, EF_BFIN_FDPIC, EF_BFIN_PIC_FLAGS): New macros. |
2006-03-23 Michael Matz <matz@suse.de> |
* x86-64.h: Add the new relocations with their official |
numbers. |
2006-03-22 Richard Sandiford <richard@codesourcery.com> |
Daniel Jacobowitz <dan@codesourcery.com> |
Phil Edwards <phil@codesourcery.com> |
Zack Weinberg <zack@codesourcery.com> |
Mark Mitchell <mark@codesourcery.com> |
Nathan Sidwell <nathan@codesourcery.com> |
* mips.h (R_MIPS_COPY, R_MIPS_JUMP_SLOT): New relocs. |
2006-03-19 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> |
* hppa.h (SHF_HP_TLS, SHF_HP_NEAR_SHARED, SHF_HP_FAR_SHARED, |
SHF_HP_COMDAT, SHF_HP_CONST, SHN_TLS_COMMON, SHN_NS_COMMON, |
SHN_NS_UNDEF, SHN_FS_UNDEF, SHN_HP_EXTERN, SHN_HP_EXTHINT, |
SHN_HP_UNDEF_BIND_IMM, SHT_HP_OVLBITS, SHT_HP_DLKM, SHT_HP_COMDAT, |
SHT_HP_OBJDICT, SHT_HP_ANNOT, STB_HP_ALIAS): Define. |
2006-03-10 Paul Brook <paul@codesourcery.com> |
* arm.h (EF_ARM_EABI_VER5): Define. |
2006-03-06 Nathan Sidwell <nathan@codesourcery.com> |
* m68k.h (EF_M68K_ISA_MASK, EF_M68K_ISA_A, |
EF_M68K_ISA_A_PLUS, EF_M68K_ISA_B, EF_M68K_ISA_C): Adjust. |
(EF_M68K_ISA_A_NODIV, EF_M68K_ISA_B_NOUSP): New. |
(EF_M68K_HW_DIV, EF_M68K_USP): Remove. |
(EF_M68K_MAC, EF_M68K_EMAC, EF_M68K_FLOAT): Adjust. |
(EF_M68K_EMAC_B): New. |
2006-03-03 Bjoern Haase <bjoern.m.haase@web.de> |
* avr.h (R_AVR_MS8_LDI,R_AVR_MS8_LDI_NEG): Add. |
(EF_AVR_LINKRELAX_PREPARED): Add. |
2006-03-02 Ben Elliston <bje@au.ibm.com> |
Import from the GCC tree: |
2006-03-01 Jakub Jelinek <jakub@redhat.com> |
* dwarf2.h (DW_TAG_condition, DW_TAG_shared_type): New constants |
from DWARF 3. |
(DW_AT_description, DW_AT_binary_scale, DW_AT_decimal_scale, |
DW_AT_small, DW_AT_decimal_sign, DW_AT_digit_count, |
DW_AT_picture_string, DW_AT_mutable, DW_AT_threads_scaled, |
DW_AT_explicit, DW_AT_object_pointer, DW_AT_endianity, |
DW_AT_elemental, DW_AT_pure, DW_AT_recursive): New. |
(DW_OP_form_tls_address, DW_OP_call_frame_cfa, DW_OP_bit_piece): New. |
(DW_ATE_packed_decimal, DW_ATE_numeric_string, DW_ATE_edited, |
DW_ATE_signed_fixed, DW_ATE_unsigned_fixed): New. |
(DW_DS_unsigned, DW_DS_leading_overpunch, DW_DS_trailing_overpunch, |
DW_DS_leading_separate, DW_DS_trailing_separate): New. |
(DW_END_default, DW_END_big, DW_END_little): New. |
(DW_END_lo_user, DW_END_hi_user): Define. |
(DW_LNE_lo_user, DW_LNE_hi_user): Define. |
(DW_CFA_val_offset, DW_CFA_val_offset_sf, DW_CFA_val_expression): New. |
(DW_LANG_PLI, DW_LANG_ObjC, DW_LANG_ObjC_plus_plus, DW_LANG_UPC, |
DW_LANG_D): New. |
2006-02-06 Steve Ellcey <sje@cup.hp.com> |
* ia64.h (SHF_IA_64_HP_TLS): New. |
2006-02-24 DJ Delorie <dj@redhat.com> |
* m32c.h: Add relax relocs. |
2006-02-17 Shrirang Khisti <shrirangk@kpitcummins.com> |
Anil Paranjape <anilp1@kpitcummins.com> |
Shilin Shakti <shilins@kpitcummins.com> |
* common.h (EM_XC16X): New entry for xc16x cpu. |
Sort other EM_* numbers into numerical order. |
* xc16x.h: New file. |
2006-02-10 H.J. Lu <hongjiu.lu@intel.com> |
PR binutils/2258 |
* internal.h (ELF_IS_SECTION_IN_SEGMENT_FILE): New. |
(ELF_IS_SECTION_IN_SEGMENT_MEMORY): Likewise. |
2006-02-07 Nathan Sidwell <nathan@codesourcery.com> |
* m68k.h (EF_CPU32, EF_M68000, EF_CFV4E): Rename to ... |
(EF_M68K_CPU32, EF_M68K_M68000, EF_M68K_CFV4E): ... here. |
(EF_M68K_ISA_MASK, EF_M68K_ISA_A, EF_M68K_M68K_ISA_A_PLUS, |
EF_M68K_ISA_B, EF_M68K_HW_DIV, EF_M68K_MAC_MASK, EF_M68K_MAC, |
EF_M68K_EMAC, EF_M68K_USP, EF_M68K_FLOAT): New. |
2006-02-06 Steve Ellcey <sje@cup.hp.com> |
* ia64.h (SHF_IA_64_HP_TLS): New. |
2006-01-18 Alexandre Oliva <aoliva@redhat.com> |
Introduce TLS descriptors for i386 and x86_64. |
* common.h (DT_TLSDESC_GOT, DT_TLSDESC_PLT): New. |
* i386.h (R_386_TLS_GOTDESC, R_386_TLS_DESC_CALL, R_386_TLS_DESC): |
New. |
* x86-64.h (R_X86_64_GOTPC32_TLSDESC, R_X86_64_TLSDESC_CALL, |
R_X86_64_TLSDESC): New. |
2006-01-09 Mike Frysinger <vapier@gentoo.org>: |
* common.h (EM_ALTERA_NIOS2, EM_NIOS32) Define. |
2005-12-16 Nathan Sidwell <nathan@codesourcery.com> |
Second part of ms1 to mt renaming. |
* common.h (EM_MT): Renamed. |
* mt.h: Rename relocs, cpu & other defines. |
2005-12-12 Nathan Sidwell <nathan@codesourcery.com> |
* mt.h: Renamed from ms1.h |
2005-12-12 Paul Brook <paul@codesourcery.com> |
* arm.h (elf32_arm_get_eabi_attr_int): Add prototype. |
2005-11-11 Nick Clifton <nickc@redhat.com> |
PR 1150 |
* mips.h (STO_OPTIONAL): Define. |
(ELF_MIPS_IS_OPTIONAL): Define. |
2005-11-07 Nathan Sidwell <nathan@codesourcery.com> |
Add ms2. |
* ms1.h (EF_MS1_CPU_MS2): New. |
2005-11-06 John David Anglin <dave.anglin@nrc-crnc.gc.ca> |
* hppa.h (R_PARISC_DIR64WR, R_PARISC_DIR64DR): Remove relocs. |
2005-09-30 Catherine Moore <clm@cm00re.com> |
* bfin.h: New file. |
* common.h (EM_BLACKFIN): Define. |
2005-10-08 Paul Brook <paul@codesourcery.com> |
* arm.h: Add prototypes for BFD object attribute routines. |
2005-09-09 Richard Earnshaw <richard.earnshaw@arm.com> |
* arm.h (SHT_ARM_PREEMPTMAP, SHT_ARM_ATTRIBUTES): New defines. |
2005-08-09 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> |
* hppa.h (SHT_PARISC_DLKM, SHF_PARISC_WEAKORDER, PT_PARISC_WEAKORDER): |
New defines. |
2005-08-04 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> |
* hppa.h (PF_HP_CODE, PF_HP_MODIFY, PF_HP_LAZYSWAP): Revise defines. |
(PF_HP_CODE_DEPR, PF_HP_MODIFY_DEPR, PF_HP_LAZYSWAP_DEPR): New |
deprecated defines. |
(DT_HP_EPLTREL, DT_HP_EPLTRELSZ, DT_HP_FILTERED, DT_HP_FILTER_TLS, |
DT_HP_COMPAT_FILTERED, DT_HP_LAZYLOAD, DT_HP_BIND_NOW_COUNT, DT_PLT, |
DT_PLT_SIZE, DT_DLT, DT_DLT_SIZE, DT_HP_BIND_DEPTH_FIRST, DT_HP_GST, |
DT_HP_SHLIB_FIXED, DT_HP_MERGE_SHLIB_SEG, DT_HP_NODELETE, DT_HP_GROUP, |
DT_HP_PROTECT_LINKAGE_TABLE, PT_HP_OPT_ANNOT, PT_HP_HSL_ANNOT, |
PT_HP_STACK, PT_HP_CORE_UTSNAME, NT_HP_COMPILER, NT_HP_COPYRIGHT, |
NT_HP_VERSION, NT_HP_SRCFILE_INFO, NT_HP_LINKER, NT_HP_INSTRUMENTED, |
NT_HP_UX_OPTIONS): Define. |
2005-07-25 DJ Delorie <dj@redhat.com> |
* m32c.h: Add R_M32C_8, R_M32C_LO16, R_M32C_HI8, and R_M32C_HI16. |
2005-07-25 Jan Hubicka <jh@suse.cz> |
* x86-64.h (SHN_X86_64_LCOMMON): New. |
(SHF_X86_64_LARGE): New. |
2005-07-20 Kazuhiro Inaoka <inaoka.kazuhiro@renesas.com> |
* m32r.h (R_M32R_REL32): Added. |
2005-07-18 Ben Elliston <bje@au.ibm.com> |
* dwarf2.h (enum dwarf_type): Remove DW_AT_GNU_decimal_float. |
Replace with DW_ATE_decimal_float (now in DWARF 3). |
2005-07-14 Jim Blandy <jimb@redhat.com> |
Add support for Renesas M32C and M16C. |
* common.h (EM_M32C): New machine number. |
* m32c.h: New file. |
2005-06-17 Jakub Jelinek <jakub@redhat.com> |
* external.h (GRP_ENTRY_SIZE): Define. |
2005-06-17 Jan Beulich <jbeulich@novell.com> |
* x86-64.h (elf_x86_64_reloc_type): Adjust comment for |
R_X86_64_GOTPCREL. Add R_X86_64_PC64, R_X86_64_GOTOFF64, and |
R_X86_64_GOTPC32. |
2005-06-07 Aldy Hernandez <aldyh@redhat.com> |
Michael Snyder <msnyder@redhat.com> |
Stan Cox <scox@redhat.com> |
* common.h (EM_MS1): Define. |
* ms1.h: New file. |
2005-05-31 Richard Henderson <rth@redhat.com> |
* alpha.h (LITUSE_ALPHA_JSRDIRECT): New. |
2005-05-29 Richard Henderson <rth@redhat.com> |
* alpha.h (DT_ALPHA_PLTRO): New. |
2005-05-19 Ben Elliston <bje@au.ibm.com> |
* dwarf2.h (enum dwarf_type): Assign DW_ATE_GNU_decimal_float from |
the user-defined encoding space pending inclusion in the standard. |
2005-05-18 Zack Weinberg <zack@codesourcery.com> |
* arm.h: Make all #ifndef OLD_ARM_ABI blocks |
unconditional, delete all #ifdef OLD_ARM_ABI blocks. |
2005-05-17 Zack Weinberg <zack@codesourcery.com> |
* arm.h: Import complete list of official relocation names |
and numbers from AAELF. Define FAKE_RELOCs for old names. |
Remove a few old names no longer used anywhere. |
2005-05-14 Alan Modra <amodra@bigpond.net.au> |
* ppc.h (DT_PPC_GOT): Rename from DT_PPC_GLINK. |
2005-05-11 Alan Modra <amodra@bigpond.net.au> |
* ppc.h (R_PPC_RELAX32, R_PPC_RELAX32PC, R_PPC_RELAX32_PLT, |
R_PPC_RELAX32PC_PLT) Adjust. |
(R_PPC_REL16, R_PPC_REL16_LO, R_PPC_REL16_HI, R_PPC_REL16_HA): Define. |
(DT_PPC_GLINK): Define. |
2005-05-10 Nick Clifton <nickc@redhat.com> |
* Update the address and phone number of the FSF organization in |
the GPL notices in the following files: |
alpha.h, arc.h, arm.h, avr.h, common.h, cr16c.h, cris.h, crx.h, |
d10v.h, d30v.h, dlx.h, dwarf.h, dwarf2.h, external.h, fr30.h, |
frv.h, h8.h, hppa.h, i370.h, i386.h, i860.h, i960.h, ia64.h, |
internal.h, ip2k.h, iq2000.h, m32r.h, m68hc11.h, m68k.h, mcore.h, |
mips.h, mmix.h, mn10200.h, mn10300.h, msp430.h, openrisc.h, |
or32.h, pj.h, ppc.h, ppc64.h, reloc-macros.h, s390.h, sh.h, |
sparc.h, v850.h, vax.h, x86-64.h, xstormy16.h, xtensa.h |
2005-04-13 H.J. Lu <hongjiu.lu@intel.com> |
Moved from ../ChangeLog |
2004-10-27 Richard Earnshaw <rearnsha@arm.com> |
* arm.h: Add R_ARM_CALL and R_ARM_JUMP32. |
2004-10-12 Paul Brook <paul@codesourcery.com> |
* arm.h (EF_ARM_EABI_VER4): Define. |
2004-10-08 Daniel Jacobowitz <dan@debian.org> |
* common.h (PT_SUNW_EH_FRAME): Define. |
* x86-64.h (SHT_X86_64_UNWIND): Define. |
2004-10-07 Bob Wilson <bob.wilson@acm.org> |
* xtensa.h (R_XTENSA_DIFF8, R_XTENSA_DIFF16, R_XTENSA_DIFF32, |
R_XTENSA_SLOT*_OP, R_XTENSA_SLOT*_ALT): New relocations. |
(XTENSA_PROP_SEC_NAME): Define. |
(property_table_entry): Add flags field. |
(XTENSA_PROP_*, GET_XTENSA_PROP_*, SET_XTENSA_PROP_*): Define. |
2004-09-17 Paul Brook <paul@codesourcery.com> |
* arm.h: Remove R_ARM_STKCHK and R_ARM_THM_STKCHK. |
Add R_ARM_TARGET2, R_ARM_PREL31, R_ARM_GOT_ABS, R_ARM_GOT_PREL, |
R_ARM_GOT_BREL12, R_ARM_GOTOFF12 and R_ARM_GOTRELAX. |
2004-09-13 Paul Brook <paul@codesourcery.com> |
* arm.h: Rename RELABS to TARGET1. |
2004-05-11 Jakub Jelinek <jakub@redhat.com> |
* common.h (PT_GNU_EH_FRAME, PT_GNU_STACK): Add comments. |
(PT_GNU_RELRO): Define. |
2005-03-29 Daniel Jacobowitz <dan@codesourcery.com> |
Phil Blundell <philb@gnu.org> |
* arm.h: Add TLS relocations. |
2005-03-23 Ben Elliston <bje@au.ibm.com> |
* dwarf.h: Merge with GCC's dwarf.h. |
2005-03-18 C Jaipraash <cjaiprakash@noida.hcltech.com> |
* m68k.h (EF_CFV4E): Define. |
2005-03-17 Paul Brook <paul@codesourcery.com> |
Dan Jacobowitz <dan@codesourcery.com> |
Mark Mitchell <mark@codesourcery.com> |
* arm.h (PT_ARM_EXIDX): Define. |
2005-03-02 Daniel Jacobowitz <dan@codesourcery.com> |
Joseph Myers <joseph@codesourcery.com> |
* mips.h: Define MIPS TLS relocations. |
2005-02-15 Nigel Stephens <nigel@mips.com> |
Maciej W. Rozycki <macro@mips.com> |
* mips.h (R_MIPS16_GOT16): New reloc code. |
(R_MIPS16_CALL16): Likewise. |
(R_MIPS16_HI16): Likewise. |
(R_MIPS16_LO16): Likewise. |
(R_MIPS16_min): New fake reloc code. |
(R_MIPS16_max): Likewise. |
2005-02-11 Maciej W. Rozycki <macro@mips.com> |
* mips.h (R_MIPS_max): Use FAKE_RELOC to define. |
2005-01-25 Alexandre Oliva <aoliva@redhat.com> |
2004-12-10 Alexandre Oliva <aoliva@redhat.com> |
* frv.h: Add R_FRV_TLSMOFF. |
2004-11-10 Alexandre Oliva <aoliva@redhat.com> |
* frv.h: Add TLS relocations. |
2005-01-17 Nick Clifton <nickc@redhat.com> |
* sh.h (EF_SH2A_SH4_NOFPU, EF_SH2A_SH3_NOFPU, EF_SH2A_SH4, |
EF_SH2A_SH3E): New flags. |
(EF_SH_BFD_TABLE): Add these new flags to the table. |
2005-01-12 Alan Modra <amodra@bigpond.net.au> |
* ppc.h (R_PPC_RELAX32_PLT, R_PPC_RELAX32PC_PLT): Define. |
(R_PPC_RELAX32, R_PPC_RELAX32PC): Adjust value. |
2004-12-22 Klaus Rudolph <lts-rudolph@gmx.de> |
* avr.h (R_AVR_LDI, R_AVR_6, R_AVR_6_ADIW): New relocs. |
2004-12-16 Richard Sandiford <rsandifo@redhat.com> |
* v850.h (R_V850_LO16_SPLIT_OFFSET): New reloc. |
2004-12-09 Ian Lance Taylor <ian@wasabisystems.com> |
* mips.h (E_MIPS_MACH_9000): Define. |
2004-11-04 Hans-Peter Nilsson <hp@axis.com> |
* cris.h (EF_CRIS_VARIANT_MASK, EF_CRIS_VARIANT_ANY_V0_V10) |
(EF_CRIS_VARIANT_V32, EF_CRIS_VARIANT_COMMON_V10_V32): New |
macros. |
2004-10-06 Eric Christopher <echristo@redhat.com> |
* dwarf2.h: Sync with gcc dwarf2.h. Fix typo. |
2004-10-01 Paul Brook <paul@codesourcery.com> |
* arm.h (SHT_ARM_EXIDX): Define. |
(ELF_STRING_ARM_unwind, ELF_STRING_ARM_unwind, |
ELF_STRING_ARM_unwind_once, ELF_STRING_ARM_unwind_info_once): |
Define. |
2004-08-25 Dmitry Diky <diwil@spec.ru> |
* msp430.h: Add new relocs. |
2004-08-12 H.J. Lu <hongjiu.lu@intel.com> |
* i386.h (R_386_USED_BY_INTEL_200): New. |
2004-07-29 Alexandre Oliva <aoliva@redhat.com> |
Introduce SH2a support. |
2004-02-18 Corinna Vinschen <vinschen@redhat.com> |
* sh.h (EF_SH2A_NOFPU): New. |
2003-12-01 Michael Snyder <msnyder@redhat.com> |
* sh.h (EF_SH2A): New. |
2004-07-27 Tomer Levi <Tomer.Levi@nsc.com> |
* crx.h: Add BFD_RELOC_CRX_SWITCH8, BFD_RELOC_CRX_SWITCH16, |
BFD_RELOC_CRX_SWITCH32. |
2004-07-06 Tomer Levi <Tomer.Levi@nsc.com> |
* common.h (EM_CRX): Define. |
* crx.h: New file. |
2004-06-25 Kazuhiro Inaoka <inaoka.kazuhiro@renesas.com> |
* m32r.h: Add defintions of R_M32R_GOTOFF_HI_ULO, |
R_M32R_GOTOFF_HI_SLO and R_M32R_GOTOFF_LO. |
2004-06-19 Alan Modra <amodra@bigpond.net.au> |
* common.h (ELF64_R_INFO): Warning fix. |
2004-06-14 Chris Demetriou <cgd@broadcom.com> |
* mips.h (R_MIPS_PC32): Add back (undoing removal on 2004-04-24), |
with an updated comment. |
2004-05-28 Andrew Stubbs <andrew.stubbs@superh.com> |
* sh.h (EF_SH_HAS_DSP): Remove. |
(EF_SH_HAS_FP): Remove. |
(EF_SH_MERGE_MACH): Remove. |
(EF_SH4_NOFPU): Convert to decimal. |
(EF_SH4A_NOFPU): Likewise. |
(EF_SH4_NOMMU_NOFPU): Likewise. |
(EF_SH3_NOMMU): Add new macro. |
(EF_SH_BFD_TABLE): Likewise. |
(sh_find_elf_flags): Add prototype. |
(sh_elf_get_flags_from_mach): Likewise. |
2004-04-24 Chris Demetriou <cgd@broadcom.com> |
* mips.h (R_MIPS_PC32, R_MIPS_PC64, R_MIPS_GNU_REL_LO16) |
(R_MIPS_GNU_REL_HI16): Remove. |
(R_MIPS_GNU_REL16_S2): Update comment. |
2004-30-30 Galit Heller <Galit.Heller@nsc.com> |
Tomer Levi <Tomer.Levi@nsc.com> |
* common.h (EM_CR): Define. |
* cr16c.h: New file. |
2004-03-23 Paul Brook <paul@codesourcery.com> |
* arm.h (EF_ERM_BE8, EF_ARM_LE8, EF_ARM_EABI_VER3): Add. |
2003-03-03 Andrew Stubbs <andrew.stubbs@superh.com> |
* sh.h: Add EF_SH4_NOMMU_NOFPU. |
2004-03-01 Richard Sandiford <rsandifo@redhat.com> |
* frv.h (EF_FRV_CPU_FR405, EF_FRV_CPU_FR450): Define. |
2004-01-28 Roland McGrath <roland@redhat.com> |
* common.h (AT_SECURE): New macro. |
2004-01-21 Roland McGrath <roland@redhat.com> |
* common.h (AT_SUN_UID, AT_SUN_RUID, AT_SUN_GID): New macros. |
(AT_SUN_RGID, AT_SUN_LDELF, AT_SUN_LDSHDR, AT_SUN_LDNAME, |
AT_SUN_LPAGESZ, AT_SUN_PLATFORM, AT_SUN_HWCAP, AT_SUN_IFLUSH, |
AT_SUN_CPU, AT_SUN_EMUL_ENTRY, AT_SUN_EMUL_EXECFD, |
AT_SUN_EXECNAME) AT_SUN_MMU, AT_SUN_LDDATA): Likewise. |
2004-01-17 Mark Kettenis <kettenis@gnu.org> |
* common.h (NT_OPENBSD_IDENT): Define. |
2004-01-06 Alexandre Oliva <aoliva@redhat.com> |
2003-09-18 Alexandre Oliva <aoliva@redhat.com> |
* frv.h (EF_FRV_FDPIC): New macro. |
(EF_FRV_PIC_FLAGS): Adjust. |
2003-08-08 Alexandre Oliva <aoliva@redhat.com> |
* frv.h (R_FRV_FUNCDESC_VALUE, R_FRV_FUNCDESC_GOTOFF12, |
R_FRV_FUNCDESC_GOTOFFLO, R_FRV_FUNCDESC_GOTOFFHI, R_FRV_GOTOFF12, |
R_FRV_GOTOFFLO, R_FRV_GOTOFFHI): New. |
2003-08-04 Alexandre Oliva <aoliva@redhat.com> |
* frv.h (R_FRV_GOT12, R_FRV_GOTHI, R_FRV_GOTLO, R_FRV_FUNCDESC, |
R_FRV_FUNCDESC_GOT12, R_FRV_FUNCDESC_GOTHI, R_FRV_FUNCDESC_GOTLO): |
New. |
For older changes see ChangeLog-9103 |
Copyright (C) 2004-2012 Free Software Foundation, Inc. |
Copying and distribution of this file, with or without modification, |
are permitted in any medium without royalty provided the copyright |
notice and this notice are preserved. |
Local Variables: |
mode: change-log |
left-margin: 8 |
fill-column: 74 |
version-control: never |
End: |
/contrib/toolchain/binutils/include/elf/ChangeLog-9103 |
---|
0,0 → 1,1957 |
2005-04-13 H.J. Lu <hongjiu.lu@intel.com> |
Moved from ../ChangeLog |
2003-10-14 Bob Wilson <bob.wilson@acm.org> |
* xtensa.h: Formatting. Fix comments about property section |
names for linkonce sections. |
2003-05-23 Jakub Jelinek <jakub@redhat.com> |
* common.h (PT_GNU_STACK): Define. |
2003-01-25 Jakub Jelinek <jakub@redhat.com> |
* sparc.h: Add TLS relocs. Move R_SPARC_REV32 to 252. |
2002-09-26 Jakub Jelinek <jakub@redhat.com> |
* x86-64.h: Add TLS relocs. |
2002-09-19 Jakub Jelinek <jakub@redhat.com> |
* i386.h (R_386_TLS_TPOFF, R_386_TLS_IE, R_386_TLS_GOTIE): |
Define. |
2002-07-10 Jakub Jelinek <jakub@redhat.com> |
* common.h (SHT_GNU_LIBLIST, DT_GNU_PRELINKED, |
DT_GNU_CONFLICT*, DT_GNU_LIBLIST*): Define. |
2002-05-31 Michal Ludvig <mludvig@suse.cz> |
* dwarf2.h (DW_CFA_low_user, DW_CFA_high_user): Renamed |
to DW_CFA_lo_user, DW_CFA_hi_user respectively. |
2002-05-23 Jakub Jelinek <jakub@redhat.com> |
* common.h (PT_TLS, SHF_TLS, STT_TLS, DF_STATIC_TLS): Define. |
* ia64.h (R_IA64_LTOFF_TPREL22): Renamed from R_IA64_LTOFF_TP22. |
* i386.h: Add TLS relocs. |
2003-12-19 Kazuhiro Inaoka <inaoka.kazuhiro@renesas.com> |
* m32r.h : Added m32r-linux and PIC support. Add new ABI that |
uses RELA. |
(R_M32R_16_RELA, R_M32R_32_RELA, R_M32R_24_RELA, |
R_M32R_10_PCREL_RELA, R_M32R_18_PCREL_RELA, |
R_M32R_26_PCREL_RELA, R_M32R_HI16_ULO_RELA, |
R_M32R_HI16_SLO_RELA, R_M32R_LO16_RELA, |
R_M32R_SDA16_RELA, R_M32R_RELA_GNU_VTINHERIT, |
R_M32R_RELA_GNU_VTENTRY, R_M32R_GOT24, |
R_M32R_26_PLTREL, R_M32R_COPY, R_M32R_GLOB_DAT, |
R_M32R_JMP_SLOT, R_M32R_RELATIVE, R_M32R_GOTOFF, |
R_M32R_GOTPC24, R_M32R_GOT16_HI_ULO, |
R_M32R_GOT16_HI_SLO, R_M32R_GOT16_LO, |
R_M32R_GOTPC_HI_ULO, R_M32R_GOTPC_HI_SLO, |
R_M32R_GOTPC_LO): New relocs. |
2003-12-06 Alan Modra <amodra@bigpond.net.au> |
From Jan Beulich <JBeulich@novell.com> |
* common.h (DT_HIOS): Correct value. |
2003-12-03 Kazuhiro Inaoka <inaoka.kazuhiro@renesas.com> |
* m32r.h: Add new machine type m32r2 and instruction modes. |
2003-11-06 Alan Modra <amodra@bigpond.net.au> |
* ppc.h (R_PPC_RELAX32PC): Define. |
2003-10-22 Alexandre Oliva <aoliva@redhat.com>, |
Michael Snyder <msnyder@redhat.com> |
* sh.h (EF_SH4A, EF_SH4AL_DSP, EF_SH4_NOFPU, EF_SH4A_NOFPU): New. |
(EF_SH_MERGE_MACH): Combine them. |
2003-10-18 Hans-Peter Nilsson <hp@bitrange.com> |
* mmix.h (R_MMIX_PUSHJ_STUBBABLE): New reloc number. |
(_bfd_mmix_before_linker_allocation): Rename from |
_bfd_mmix_prepare_linker_allocated_gregs. |
(_bfd_mmix_after_linker_allocation): Rename from |
_bfd_mmix_finalize_linker_allocated_gregs. |
2003-10-06 Dave Brolley <brolley@redhat.com> |
* frv.h (EF_FRV_CPU_FR550): New macro. |
2003-09-30 Chris Demetriou <cgd@broadcom.com> |
* mips.h (E_MIPS_ARCH_64R2): New define. |
2003-09-23 DJ Delorie <dj@redhat.com> |
* sh.h (R_SH_SWITCH8, R_SH_GNU_VTINHERIT, R_SH_GNU_VTENTRY, |
R_SH_LOOP_START,R_SH_LOOP_END): Move to "reserved" spaces. |
(R_SH_DIR16, R_SH_DIR8, R_SH_DIR8UL, R_SH_DIR8UW, R_SH_DIR8U, |
R_SH_DIR8SW, R_SH_DIR8S, R_SH_DIR4UL, R_SH_DIR4UW, R_SH_DIR4U, |
R_SH_PSHA, R_SH_PSHL): New. |
2003-09-11 James Cownie <jcownie@etnus.com> |
* dwarf2.h: Add HP dwarf extensions from their hacked gdb |
header files (ftp://ftp.hp.com/pub/lang/tools/WDB/wdb-4.0.tar.gz). |
2003-09-04 Nick Clifton <nickc@redhat.com> |
* v850.h (E_V850E1_ARCH): Define. |
2003-08-21 James Cownie <jcownie@etnus.com> |
* dwarf2.h: Add PGI dwarf extensions. |
2003-08-08 Dmitry Diky <diwil@mail.ru> |
* msp430.h: Add xW42 and xE42 parts. Sort MPU list according to |
gcc order. |
2003-08-07 Alan Modra <amodra@bigpond.net.au> |
* reloc-macros.h (START_RELOC_NUMBERS) : Remove PARAMS macro. Use |
C90 function definition. Formatting. |
(RELOC_NUMBER): Remove !__STDC__ code. |
2003-07-28 Eric Christopher <echristo@redhat.com> |
* ppc.h (R_PPC_RELAX32): New. Fake relocation. |
2003-07-25 H.J. Lu <hongjiu.lu@intel.com> |
* v850.h (SHF_V850_GPREL): New. |
(SHF_V850_EPREL): Likewise. |
(SHF_V850_R0REL): Likewise. |
2003-07-09 Alexandre Oliva <aoliva@redhat.com> |
2001-05-16 Alexandre Oliva <aoliva@redhat.com> |
* mn10300.h: Introduce GOTPC16, GOTOFF24, GOTOFF16 and |
PLT16, and rename GOTPC to GOTPC32 and GOTOFF to GOTOFF32. |
Renumbered all relocs. |
2001-04-12 Alexandre Oliva <aoliva@redhat.com> |
* mn10300.h (R_MN10300_GOTPC, R_MN10300_GOTOFF, |
R_MN10300_PLT32, R_MN10300_GOT32, R_MN10300_GOT24, |
R_MN10300_GOT16, R_MN10300_COPY, R_MN10300_GLOB_DAT, |
R_MN10300_JMP_SLOT, R_MN10300_RELATIVE): New relocs. |
2003-07-09 Alexandre Oliva <aoliva@redhat.com> |
2000-04-01 Alexandre Oliva <aoliva@cygnus.com> |
* mn10300.h (E_MN10300_MACH_AM33_2): Renamed from |
E_MN10300_MACH_AM332. |
2000-03-31 Alexandre Oliva <aoliva@cygnus.com> |
* mn10300.h (E_MN10300_MACH_AM332): Defined. |
2003-07-01 Martin Schwidefsky <schwidefsky@de.ibm.com> |
* s390.h (elf_s390_reloc_type): Add long displacement relocations |
R_390_20, R_390_GOT20, R_390_GOTPLT20 and R_390_TLS_GOTIE20. |
2003-06-29 Andreas Jaeger <aj@suse.de> |
* mmix.h: Convert to ISO C90 prototypes. |
* mips.h: Likewise. |
2003-06-13 Robert Millan <zeratul2@wanadoo.es> |
* common.h (GNU_ABI_TAG_NETBSD): New tag. |
(GNU_ABI_TAG_FREEBSD): New tag. |
2003-06-10 Richard Sandiford <rsandifo@redhat.com> |
* h8.h (E_H8_MACH_H8300SXN): New flag. |
2003-06-03 Nick Clifton <nickc@redhat.com> |
* v850.h (R_V850_32): Rename to R_V850_ABS32. |
Add R_V850_REL32. |
2003-05-15 Roland McGrath <roland@redhat.com> |
* common.h (NT_AUXV, AT_*): New macros. |
* external.h (Elf32_External_Auxv, Elf64_External_Auxv): New types. |
* internal.h (Elf_Internal_Auxv): New type. |
2003-05-14 Michael Snyder <msnyder@redhat.com> |
From Bernd Schmidt <bernds@redhat.com> |
* h8.h (E_H8_MACH_H8300SX): New. |
2003-04-24 Dhananjay Deshpande <dhananjayd@kpitcummins.com> |
* h8.h (E_H8_MACH_H8300HN, E_H8_MACH_H8300SN): New |
2003-04-23 J"orn Rennecke <joern.rennecke@superh.com> |
* common.h (EM_SH): Amend comment to refer to SuperH. |
2003-04-22 Kazuhiro Inaoka <inaoka.kazuhiro@renesas.com> |
* common.h: Replace references to Mitsubishi M32R with |
references to Renesas M32R. |
2003-04-15 Rohit Kumar Srivastava <rohits@kpitcummins.com> |
* common.h: Replace occurrances of 'Hitachi' with 'Renesas'. |
2003-04-01 Bob Wilson <bob.wilson@acm.org> |
* common.h (EM_XTENSA_OLD): Define. |
* xtensa.h: New file. |
2003-04-01 Nick Clifton <nickc@redhat.com> |
* arm.h (ARM_NOTE_SECTION): Include .gnu in the string. |
2003-03-25 Stan Cox <scox@redhat.com> |
Nick Clifton <nickc@redhat.com> |
Contribute support for Intel's iWMMXt chip - an ARM variant: |
* arm.h (ARM_NOTE_SECTION): Define. |
2003-03-03 J"orn Rennecke <joern.rennecke@superh.com> |
* sh.h (EF_SH_MERGE_MACH): Make sure SH2E & SH3/SH3E merge to SH3E, |
and SH2E & SH4 merge to SH4, not SH2E. |
2003-02-21 Ian Wienand <ianw@gelato.unsw.edu.au> |
* ia64.h (SHT_IA_64_LOPSREG, SHT_IA_64_HIPSREG, |
SHT_IA_64_PRIORITY_INIT): Define. |
2003-02-18 Alan Modra <amodra@bigpond.net.au> |
* ppc64.h (IS_PPC64_TLS_RELOC): Rename from IS_TLS_RELOC. |
* ppc.h: Replace DTPMOD64, TPREL64, DTPREL64 with DTPMOD32 etc. |
(IS_PPC_TLS_RELOC): Define. |
2003-02-10 Nick Clifton <nickc@redhat.com> |
* arm.h (EF_ARM_MAVERICK_FLOAT): Define. |
2003-02-05 Alan Modra <amodra@bigpond.net.au> |
* ppc.h: Add TLS relocs. Format. |
* ppc64.h: Likewise. |
2003-01-27 Alexandre Oliva <aoliva@redhat.com> |
* mips.h (EF_MIPS_XGOT): Define. |
2003-01-24 Martin Schwidefsky <schwidefsky@de.ibm.com> |
* s390.h: Add s390 TLS relocations. |
2003-01-23 Nick Clifton <nickc@redhat.com> |
* Add sh2e support: |
2002-04-02 Alexandre Oliva <aoliva@redhat.com> |
* sh.h (EF_SH_MERGE_MACH): Handle SH2E. |
2002-04-02 Elena Zannoni <ezannoni@redhat.com> |
* sh.h (EF_SH2E): New. |
2003-01-23 Alan Modra <amodra@bigpond.net.au> |
* sh.h: Split out various bits to bfd/elf32-sh64.h. |
2003-01-20 Martin Schwidefsky <schwidefsky@de.ibm.com> |
* s390.h: Rename R_390_GOTOFF to R_390_GOTOFF32. Add new gotoff, |
gotplt and pltoff relocations. |
2003-01-17 Alan Modra <amodra@bigpond.net.au> |
* common.h: Formatting, typo fixes. |
(DT_ENCODING): Correct value. |
2003-01-17 Fabio Alemagna <falemagn@aros.org> |
* common.h (ELFOSABI_AROS): Define. |
(ELFOSABI_OPENVMS): Likewise. |
(ELFOSABI_NSK): Likewise. |
2003-01-16 Alan Modra <amodra@bigpond.net.au> |
* ppc.h: Split out ppc64 definitions to.. |
* pcc64.h: ..here. New file. |
(R_PPC64_REL30): Rename from R_PPC64_ADDR30. |
2003-01-13 Dmitry Diky <diwil@mail.ru> |
* elf/common.h (EM_MSP430): Change e_machine value to officially |
assigned. |
2003-01-02 Ben Elliston <bje@redhat.com> |
* common.h (EM_IQ2000): Define. |
* iq2000.h: New file. |
2002-12-30 Chris Demetriou <cgd@broadcom.com> |
* mips.h (E_MIPS_ARCH_32R2): New define. |
2002-12-24 Dmitry Diky <diwil@mail.ru> |
* common.h: Define msp430 machine numbers. |
* msp430.h: New file. Define msp430 relocs. |
2002-12-20 DJ Delorie <dj@redhat.com> |
* xstormy16.h: Add XSTORMY16_12. |
2002-12-16 Andrew MacLeod <amacleod@redhat.com> |
* xstormy16.h (START_RELOC_NUMBERS) Add relocation numbers |
for R_XSTORMY16_LO16 and R_XSTORMY16_HI16. |
2002-12-10 James Cownie <jcownie@etnus.com> |
* dwarf2.h (DW_TAG_upc_shared_type, DW_TAG_upc_strict_type, |
DW_TAG_upc_relaxed_type, DW_AT_upc_threads_scaled, DW_LANG_Upc): |
Define. |
2002-12-01 Stephane Carrez <stcarrez@nerim.fr> |
* m68hc11.h (EF_M68HC12_MACH, EF_M68HCS12_MACH): Define. |
(EF_M68HC11_MACH_MASK, EF_M68HC11_MACH): Define. |
(EF_M68HC11_MERGE_MACH, EF_M68HC11_CAN_MERGE_MACH): Define. |
2002-11-30 Alan Modra <amodra@bigpond.net.au> |
* mmix.h: Replace boolean with bfd_boolean. |
* sh.h: Likewise. |
2002-11-28 Alan Modra <amodra@bigpond.net.au> |
* internal.h (elf32_internal_ehdr, Elf32_Internal_Ehdr, |
elf64_internal_ehdr, Elf64_Internal_Ehdr, elf32_internal_phdr, |
Elf32_Internal_Phdr, elf64_internal_phdr, Elf64_Internal_Phdr, |
elf32_internal_shdr, Elf32_Internal_Shdr, elf64_internal_shdr, |
Elf64_Internal_Shdr, elf32_internal_sym, elf64_internal_sym, |
Elf32_Internal_Sym, Elf64_Internal_Sym, Elf32_Internal_Note, |
elf32_internal_note, elf32_internal_rel, Elf32_Internal_Rel, |
elf64_internal_rel, Elf64_Internal_Rel, elf32_internal_rela, |
elf64_internal_rela, Elf32_Internal_Rela, Elf64_Internal_Rela, |
elf32_internal_dyn, elf64_internal_dyn, Elf32_Internal_Dyn, |
Elf64_Internal_Dyn, elf32_internal_verdef, elf64_internal_verdef, |
elf32_internal_verdaux, elf64_internal_verdaux, elf32_internal_verneed, |
elf64_internal_verneed, elf32_internal_vernaux, elf64_internal_vernaux, |
elf32_internal_versym, elf64_internal_versym, Elf32_Internal_Verdef, |
Elf64_Internal_Verdef, Elf32_Internal_Verdaux, Elf64_Internal_Verdaux, |
Elf32_Internal_Verneed, Elf64_Internal_Verneed, Elf32_Internal_Vernaux, |
Elf64_Internal_Vernaux, Elf32_Internal_Versym, Elf64_Internal_Versym, |
Elf32_Internal_Syminfo, Elf64_Internal_Syminfo): Delete. |
(Elf_Internal_Rel): Delete. |
2002-10-11 Kaz Kojima <kkojima@rr.iij4u.or.jp> |
* sh.h: Add SH TLS relocs. |
2002-09-30 Gavin Romig-Koch <gavin@redhat.com> |
Ken Raeburn <raeburn@cygnus.com> |
Aldy Hernandez <aldyh@redhat.com> |
Eric Christopher <echristo@redhat.com> |
Richard Sandiford <rsandifo@redhat.com> |
* mips.h (E_MIPS_MACH_4120, E_MIPS_MACH_5400, E_MIPS_MACH_5500): New. |
2002-09-12 Roland McGrath <roland@redhat.com> |
* dwarf2.h: Updates from GCC version of thie file: |
(enum dwarf_location_atom): DW_OP_calli -> DW_OP_call_ref. |
Add DW_OP_GNU_push_tls_address. |
(DW_OP_lo_user): Change to 0xe0. |
2002-08-28 Catherine Moore <clm@redhat.com> |
* v850.h (R_V850_LONGCALL, R_V850_ALIGN, |
R_V850_LONGJUMP): New relocations. |
2002-08-15 Alan Modra <amodra@bigpond.net.au> |
* i370.h: Define relocs using reloc-macros.h. |
2002-08-13 Stephane Carrez <stcarrez@nerim.fr> |
* m68hc11.h (E_M68HC12_BANKS, E_M68HC11_I32, E_M68HC11_F64, |
EF_M68HC11_ABI): Define for ABI specification. |
(STO_M68HC12_FAR, STO_M68HC12_INTERRUPT): Symbol flags for |
linker and debugger. |
(R_M68HC11_24, R_M68HC11_LO16, R_M68HC11_PAGE): New relocs. |
(R_M68HC11_RL_JUMP, R_M68HC11_RL_GROUP): New reloc for linker |
relaxation. |
2002-07-15 Denis Chertykov <denisc@overta.ru> |
Frank Ch. Eigler <fche@redhat.com> |
Ben Elliston <bje@redhat.com> |
Alan Lehotsky <alehotsky@cygnus.com> |
John Healy <jhealy@redhat.com> |
Graham Stott <grahams@redhat.com> |
Jeff Johnston <jjohnstn@redhat.com> |
* common.h (EM_IP2K): New macro. |
(EM_IP2K_OLD): New macro. |
* ip2k.h: New file. |
2002-07-01 Matt Thomas <matt@3am-software.com> |
* vax.h: Rename EF_* to EF_VAX_*. |
2002-06-18 Dave Brolley <brolley@redhat.com> |
From Catherine Moore, Michael Meissner, Dave Brolley: |
* common.h (EM_CYGNUS_FRV): New macro. |
* frv.h: New file. |
2002-06-06 Lars Brinkhoff <lars@nocrew.org> |
* common.h: Change registry@sco.com to registry@caldera.com. |
(EM_PDP10, EM_PDP11): Define. |
2002-06-04 Jason Thorpe <thorpej@wasabisystems.com> |
* sh.h (_bfd_sh64_crange_qsort_cmpb, _bfd_sh64_crange_qsort_cmpl) |
(_bfd_sh64_crange_bsearch_cmpb, _bfd_sh64_crange_bsearch_cmpl): New |
prototypes. |
2002-06-01 Richard Henderson <rth@redhat.com> |
* alpha.h (LITUSE_ALPHA_ADDR, LITUSE_ALPHA_BASE, LITUSE_ALPHA_BYTOFF, |
LITUSE_ALPHA_JSR, LITUSE_ALPHA_TLSGD, LITUSE_ALPHA_TLSLDM): New. |
2002-05-30 Richard Henderson <rth@redhat.com> |
* alpha.h (R_ALPHA_TLSGD, R_ALPHA_TLSLDM, R_ALPHA_DTPMOD64, |
R_ALPHA_GOTDTPREL, R_ALPHA_DTPREL64, R_ALPHA_DTPRELHI, |
R_ALPHA_DTPRELLO, R_ALPHA_DTPREL16, R_ALPHA_GOTTPREL, R_ALPHA_TPREL64, |
R_ALPHA_TPRELHI, R_ALPHA_TPRELLO, R_ALPHA_TPREL16): New. |
2002-05-29 Matt Thomas <matt@3am-software.com> |
* vax.h: New file |
2002-05-28 Kuang Hwa Lin <kuang@sbcglobal.net> |
* common.h (EM_DLX): Define. |
* dlx.h: New file. |
2002-05-08 Jason Thorpe <thorpej@wasabisystems.com> |
* common.h (NT_GNU_ABI_TAG): Define. |
(GNU_ABI_TAG_LINUX): Define. |
(GNU_ABI_TAG_HURD): Define. |
(GNU_ABI_TAG_SOLARIS): Define. |
(NT_NETBSD_IDENT): Define. |
(NT_FREEBSD_ABI_TAG): Define. |
2002-04-24 Elena Zannoni <ezannoni@redhat.com> |
* dwarf2.h: Add DW_AT_GNU_vector. |
2002-02-13 Matt Fredette <fredette@netbsd.org> |
* m68k.h (EF_M68000): Define. |
2002-02-12 Alan Modra <amodra@bigpond.net.au> |
* ppc.h (DT_PPC64_OPD, DT_PPC64_OPDSZ): Define. |
2002-02-09 Richard Henderson <rth@redhat.com> |
* alpha.h (R_ALPHA_BRSGP): New. |
2002-02-08 Alexandre Oliva <aoliva@redhat.com> |
Contribute sh64-elf. |
2002-01-23 Alexandre Oliva <aoliva@redhat.com> |
* sh.h (R_SH_GOTPLT32, R_SH_GOT_LOW16, R_SH_GOT_MEDLOW16, |
R_SH_GOT_MEDHI16, R_SH_GOT_HI16, R_SH_GOTPLT_LOW16, |
R_SH_GOTPLT_MEDLOW16, R_SH_GOTPLT_MEDHI16, R_SH_GOTPLT_HI16, |
R_SH_PLT_LOW16, R_SH_PLT_MEDLOW16, R_SH_PLT_MEDHI16, |
R_SH_PLT_HI16, R_SH_GOTOFF_LOW16, R_SH_GOTOFF_MEDLOW16, |
R_SH_GOTOFF_MEDHI16, R_SH_GOTOFF_HI16, R_SH_GOTPC_LOW16, |
R_SH_GOTPC_MEDLOW16, R_SH_GOTPC_MEDHI16, R_SH_GOTPC_HI16, |
R_SH_GOT10BY4, R_SH_GOTPLT10BY4, R_SH_GOT10BY8, |
R_SH_GOTPLT10BY8, R_SH_COPY64, R_SH_GLOB_DAT64, R_SH_JMP_SLOT64, |
R_SH_RELATIVE64): New relocs. |
(R_SH_FIRST_INVALID_RELOC_4): Adjust. |
2001-05-16 Alexandre Oliva <aoliva@redhat.com> |
* sh.h: Renumbered and renamed some SH5 relocations to match |
official numbers and names; moved unmaching ones to the range |
0xf2-0xff. |
2001-01-06 Hans-Peter Nilsson <hpn@cygnus.com> |
* sh.h (sh64_get_contents_type): Declare. |
(sh64_address_is_shmedia): Likewise. |
2000-12-30 Hans-Peter Nilsson <hpn@cygnus.com> |
* sh.h (sh64_elf_crange): New type. |
(struct sh64_section_data): New. |
(sh64_elf_section_data): New macro. |
(EF_SH5): Rename back from EF_SH64. |
2000-12-18 Hans-Peter Nilsson <hpn@cygnus.com> |
* sh.h (SHF_SH5_ISA32_MIXED, SHT_SH5_CR_SORTED, |
SH64_CRANGES_SECTION_NAME, SH64_CRANGE_SIZE, |
SH64_CRANGE_CR_ADDR_OFFSET, SH64_CRANGE_CR_SIZE_OFFSET, |
SH64_CRANGE_CR_TYPE_OFFSET): New macros. |
2000-12-12 Hans-Peter Nilsson <hpn@cygnus.com> |
* sh.h (EF_SH64): Don't define EF_SH64_ABI64. |
2000-11-27 Hans-Peter Nilsson <hpn@cygnus.com> |
* sh.h (EF_SH64_32BIT_ABI, EF_SH64_64BIT_ABI): Delete. |
(EF_SH64_ABI64): New. |
2000-11-23 Hans-Peter Nilsson <hpn@cygnus.com> |
* sh.h (EF_SH64): Rename from EF_SH5. |
(EF_SH64_32BIT_ABI): New. |
(EF_SH64_64BIT_ABI): New. |
(R_SH_PT_16, R_SH_SHMEDIA_CODE |
R_SH_IMMU5, R_SH_IMMS6, R_SH_IMMU6, R_SH_IMMS10, R_SH_IMMS10BY2, |
R_SH_IMMS10BY4, R_SH_IMMS10BY8, R_SH_IMMS16, R_SH_IMMU16, |
R_SH_IMM_LOW16, R_SH_IMM_LOW16_PCREL, R_SH_IMM_MEDLOW16, |
R_SH_IMM_MEDLOW16_PCREL, R_SH_IMM_MEDHI16, R_SH_IMM_MEDHI16_PCREL, |
R_SH_IMM_HI16, R_SH_IMM_HI16_PCREL, R_SH_64, R_SH_64_PCREL): New |
relocs. |
2000-09-01 Ben Elliston <bje@redhat.com> |
* sh.h (EF_SH5): Define. |
2002-02-01 Hans-Peter Nilsson <hp@bitrange.com> |
* mmix.h: Tweak comments. |
(MMIX_LD_ALLOCATED_REG_CONTENTS_SECTION_NAME): New. |
[BFD_ARCH_SIZE] (_bfd_mmix_prepare_linker_allocated_gregs, |
_bfd_mmix_finalize_linker_allocated_gregs, |
_bfd_mmix_check_all_relocs): Provide prototypes. |
2002-01-31 Ivan Guzvinec <ivang@opencores.org> |
* or32.h: New file. |
* common.h: Add support for or32 targets. |
2002-01-28 Jason Merrill <jason@redhat.com> |
* dwarf2.h: Sync with gcc version. |
2002-01-16 Alan Modra <amodra@bigpond.net.au> |
* ppc.h (DT_PPC64_GLINK): Define. |
2002-01-15 Richard Earnshaw <rearnsha@arm.com> |
* arm.h (F_VFP_FLOAT, EF_ARM_VFP_FLOAT): Define. |
2002-01-09 Jason Thorpe <thorpej@wasabisystems.com> |
* common.h: Update copyright years. |
(NT_NETBSDCORE_PROCINFO): Define. |
(NT_NETBSDCORE_FIRSTMACH): Define. |
2002-01-06 Steve Ellcey <sje@cup.hp.com> |
* ia64.h (ELF_STRING_ia64_unwind_hdr): New Macro for HP-UX. |
(SHT_IA_64_HP_OPT_ANOT): Ditto |
(PT_IA_64_HP_OPT_ANOT): Ditto |
(PT_IA_64_HP_HSL_ANOT): Ditto |
(PT_IA_64_HP_STACK): Ditto |
(SHN_IA_64_ANSI_COMMON): Ditto |
2001-12-17 Alan Modra <amodra@bigpond.net.au> |
* external.h (Elf_External_Sym_Shndx): Declare. |
* internal.h (struct elf_internal_sym <st_shndx>): Make it an |
unsigned int. |
* common.h (SHN_BAD): Define. |
2001-12-13 Jakub Jelinek <jakub@redhat.com> |
* common.h (PT_GNU_EH_FRAME): Define. |
2001-12-11 Alan Modra <amodra@bigpond.net.au> |
* common.h (SHN_XINDEX): Comment typo fix. |
* internal.h (Elf_Internal_Ehdr): Change existing "unsigned short" |
size, count and index fields to "unsigned int". |
2001-12-07 Geoffrey Keating <geoffk@redhat.com> |
Richard Henderson <rth@redhat.com> |
* common.h (EM_XSTORMY16): Define. |
* xstormy16.h: New file. |
2001-11-15 Alan Modra <amodra@bigpond.net.au> |
* common.h (NT_ARCH): Define. Remove incorrect comment. |
2001-11-11 Geoffrey Keating <geoffk@redhat.com> |
* dwarf2.h (dwarf_line_number_ops): Add DWARF 3 opcodes. |
2001-10-30 Hans-Peter Nilsson <hp@bitrange.com> |
* mmix.h: New file. |
2001-10-23 Alan Modra <amodra@bigpond.net.au> |
* internal.h: White space changes to keep lines under 80 chars. |
2001-10-16 Jeff Holcomb <jeffh@redhat.com> |
* internal.h (elf_internal_shdr): Make contents a unsigned char *. |
2001-09-18 Alan Modra <amodra@bigpond.net.au> |
* internal.h (elf_internal_rela): Make r_addend a bfd_vma. |
2001-09-13 Alexandre Oliva <aoliva@redhat.com> |
* common.h (EM_OPENRISC_OLD): Renamed the old EM_OPENRISC entry. |
2001-09-12 Alexandre Oliva <aoliva@redhat.com> |
* common.h (EM_AVR_OLD): Renamed from... |
(EM_AVR): this, redefined as in the current ELF standard. |
(EM_PJ_OLD): Renamed from... |
(EM_PJ): this, redefined as in the current ELF standard. |
(EM_R30, EM_D10V, EM_D30V, EM_V850, EM_M32R, EM_MN10300, |
EM_MN10200, EM_OPENRISC, EM_ARC_A5, EM_XTENSA): Defined as in |
the current ELF standard. |
(EM_CYGNUS_ARC): Removed, unused for a long time. |
2001-09-04 Richard Henderson <rth@redhat.com> |
* alpha.h (R_ALPHA_OP*, R_ALPHA_IMMED*, R_ALPHA_GPVALUE): Remove. |
(R_ALPHA_GPREL16): Rename from R_ALPHA_IMMED_GP_16. |
2001-08-30 Eric Christopher <echristo@redhat.com> |
* mips.h: Remove E_MIPS_MACH_MIPS32_4K. |
2001-08-29 Jeff Law <law@redhat.com> |
* h8.h (EF_H8_MACH): New mask for encoded machine type. |
(E_H8_MACH_H8300, E_H8_MACH_H8300H, E_H8_MACH_H8300S): New |
machine types. |
2001-08-26 J"orn Rennecke <amylaar@redhat.com> |
* h8.h: New file. |
2001-08-27 Staffan Ulfberg <staffanu@swox.se> |
* ppc.h: Add relocs from the 64-bit PowerPC ELF ABI revision 1.2. |
2001-06-30 Daniel Berlin <dan@cgsoftware.com> |
* dwarf2.h: Remerge with gcc version, |
including all new DWARF 2.1 extensions. |
2001-06-29 James Cownie <jcownie@etnus.com> |
* dwarf2.h: Add DWARF 2.1 attribues. |
2001-06-15 Per Bothner <per@bothner.com> |
* dwarf2.h: Partial merge with gcc version. |
(enum dwarf_descrim_list): Fix typo -> dwarf_discrim_list. |
(DW_LANG_Java): Use value from dwarf 2.1 draft (also used in gcc). |
2001-05-15 Ralf Baechle <ralf@gnu.org> |
* common.h: Remove definition of EM_MIPS_RS4_BE. The constant was |
never in active use and is used otherwise by the ABI. |
2001-05-11 Jakub Jelinek <jakub@redhat.com> |
* ia64.h (ELF_STRING_ia64_unwind_once): Define. |
(ELF_STRING_ia64_unwind_info_once): Define. |
2001-05-07 Thiemo Seufer <seufer@csv.ica.uni-stuttgart.de> |
* external.h: Fix typo. |
* mips.h: Add/Extend many comments with reference to the MIPS ELF64 |
spec v. 2.4, available at e.g. |
ftp://oss.sgi.com/pub/linux/mips/doc/ABI/ELF64.ps. |
(EF_MIPS_UCODE): Define. |
(EF_MIPS_OPTIONS_FIRST): Define. |
(EF_MIPS_ARCH_ASE): Define. |
(EF_MIPS_ARCH_ASE_MDMX): Define. |
(EF_MIPS_ARCH_ASE_M16): Define. |
(SHF_MIPS_ADDR): Renamed SHF_MIPS_ADDR32. |
(SHF_MIPS_STRING): Renamed SHF_MIPS_ADDR64. |
(SHF_MIPS_NODUPES): Define. |
(ELF64_MIPS_R_SSYM): New MIPS ELF 64 relocation info access macro. |
(ELF64_MIPS_R_TYPE3): Likewise. |
(ELF64_MIPS_R_TYPE2): Likewise. |
(ELF64_MIPS_R_TYPE): Likewise. |
(OHW_R10KLDL): Define. |
2001-04-24 Todd Fries <todd@fries.net> |
* sparc.h: Fix typo. |
2001-04-20 Johan Rydberg <jrydberg@opencores.org> |
* openrisc.h: New file. |
* common.h (EM_OPENRISC): New constant. |
2001-04-23 Bo Thorsen <bo@suse.de> |
* x86-64.h: Add vtable support. |
2001-03-23 Nick Clifton <nickc@redhat.com> |
* mips.h: Remove extraneous whitespace. |
2001-03-22 Hans-Peter Nilsson <hp@axis.com> |
* cris.h: Add leading comment about PC-relative location. |
(R_CRIS_COPY, R_CRIS_GLOB_DAT, R_CRIS_JUMP_SLOT, R_CRIS_RELATIVE, |
R_CRIS_16_GOT, R_CRIS_32_GOT, R_CRIS_16_GOTPLT, R_CRIS_32_GOTPLT, |
R_CRIS_32_GOTREL, R_CRIS_32_PLT_GOTREL, R_CRIS_32_PLT_PCREL): |
New relocs. |
2001-02-27 Philip Blundell <pb@futuretv.com> |
* arm.h: Add new definitions from ARM document SWS ESPC 0003 B-01. |
(EF_PIC, et al.): Rename to EF_ARM_xx. |
2001-02-09 Martin Schwidefsky <schwidefsky@de.ibm.com> |
* common.h: Add linux target for S/390. |
* s390.h: New file. |
2001-01-11 Peter Targett <peter.targett@arccores.com> |
* arc.h (E_ARC_MACH_ARC5, E_ARC_MACH_ARC6, E_ARC_MACH_ARC7, |
E_ARC_MACH_ARC8): New definitions for cpu types. |
* common.h (EM_ARC): Change comment. |
2000-12-12 Nick Clifton <nickc@redhat.com> |
* mips.h: Fix formatting. |
2000-12-11 Jeffrey A Law (law@cygnus.com) |
* hppa.h (DT_HP_*): Define relative to OLD_DT_LOOS for hpux |
compatibility. |
2000-10-16 Chris Demetriou <cgd@sibyte.com> |
* mips.h (E_MIPS_ARCH_32): New constant. |
(E_MIPS_MACH_MIPS32, E_MIPS_MACH_MIPS32_4K): Replace the |
former with the latter. |
* mips.h (E_MIPS_ARCH_5, E_MIPS_ARCH_64): New definitions. |
* mips.h (E_MIPS_MACH_SB1): New constant. |
2000-11-30 Jan Hubicka <jh@suse.cz> |
* common.h (EM_X86_64): New macro. |
* x86-64.h: New file. |
2000-11-27 Hans-Peter Nilsson <hp@axis.com> |
* common.h (e_machine numbers): Clarify comments to describe how |
EM_* constants are assigned. Move EM_PJ from official section to |
ad-hoc section. |
(EM_CRIS): Correct comment to match official description. |
(EM_MMIX): Ditto. |
2000-11-22 Nick Clifton <nickc@redhat.com> |
* common.h (EM_JAVELIN): New machine number. |
(EM_FIREPATH): New machine number. |
(EM_ZSP): New machine number. |
(EM_MMIX): New machine number. |
(EM_HUANY): New machine number. |
(EM_PRISM): New machine number. |
(SHT_GROUP): New section type. |
(SHT_SYMTAB_SHNDX): New section type. |
(SHF_GROUP): New section flag. |
(SHN_XINDEX): New section index. |
(GRP_COMDAT): New section group flag. |
2000-11-20 H.J. Lu <hjl@gnu.org> |
* common.h (ELFOSABI_MONTEREY): Renamed to ... |
(ELFOSABI_AIX): This. |
2000-11-16 Richard Henderson <rth@redhat.com> |
Update relocations per August psABI docs. |
* ia64.h (R_IA64_SEGBASE): Remove. |
(R_IA64_LTV*): Renumber to 0x74 to 0x77. |
(R_IA64_EPLTMSB, R_IA64_EPLTLSB): Remove. |
(R_IA64_TPREL14, R_IA64_TPREL64I): New. |
(R_IA64_DTPMOD*): New. |
(R_IA64_DTPREL*): New. |
2000-09-29 Hans-Peter Nilsson <hp@axis.com> |
* cris.h (EF_CRIS_UNDERSCORE): New. |
2000-09-27 Alan Modra <alan@linuxcare.com.au> |
* hppa.h (R_PARISC_DIR14F): Add. |
2000-09-14 Alexandre Oliva <aoliva@redhat.com> |
* sh.h (R_SH_GOT32, R_SH_PLT32, R_SH_COPY, R_SH_GLOB_DAT, |
R_SH_JMP_SLOT, R_SH_RELATIVE, R_SH_GOTOFF, R_SH_GOTPC): Change |
numbers to the range from 160 to 167. |
(R_SH_FIRST_INVALID_RELOC): Adjust. |
(R_SH_FIRST_INVALID_RELOC_2, R_SH_LAST_INVALID_RELOC_2): |
New relocs to fill in the gap. |
2000-09-13 Anders Norlander <anorland@acc.umu.se> |
* mips.h (E_MIPS_MACH_4K): New define. |
2000-09-05 Alan Modra <alan@linuxcare.com.au> |
* hppa.h: Fix a comment. |
(R_PARISC_PCREL12F): Define. |
(R_PARISC_GNU_VTENTRY): Define. |
(R_PARISC_GNU_VTINHERIT): Define. |
2000-09-01 Alexandre Oliva <aoliva@redhat.com> |
* sh.h (R_SH_GOT32, R_SH_PLT32, R_SH_COPY, R_SH_GLOB_DAT, |
R_SH_JMP_SLOT, R_SH_RELATIVE, R_SH_GOTOFF, R_SH_GOTPC): New relocs. |
(R_SH_FIRST_INVALID_RELOC): Adjust. |
2000-08-14 Jim Wilson <wilson@cygnus.com> |
* ia64.h (EF_IA_64_REDUCEDFP, EF_IA_64_CONS_GP, |
EF_IA_64_NOFUNCDESC_CONS_GP, EF_IA_64_ABSOLUTE): Define. |
2000-08-07 Nick Clifton <nickc@cygnus.com> |
* ppc.h: Remove spurious CYGNUS LOCAL comments. |
* v850.h: Likewise. |
2000-07-22 Jason Eckhardt <jle@cygnus.com> |
* i860.h: New file. |
(elf_i860_reloc_type): Defined ELF32 i860 relocations. |
2000-07-20 Hans-Peter Nilsson <hp@axis.com> |
common.h (EM_CRIS): New machine number. |
cris.h: New file. |
2000-07-19 H.J. Lu <hjl@gnu.org> |
* common.h (DF_1_NODEFLIB): Renamed from DF_1_NODEPLIB. |
2000-07-19 H.J. Lu <hjl@gnu.org> |
* common.h (DT_CHECKSUM): Set to 0x6ffffdf8. |
(DTF_1_CONFEXP): It is 0x00000002 as suspected. |
2000-07-19 H.J. Lu <hjl@gnu.org> |
* common.h (DT_FEATURE): Renamed from DT_FEATURE_1. |
(DT_CONFIG): New. From Solaris 8. |
(DT_DEPAUDIT): Likewise. |
(DT_AUDIT): Likewise. |
(DT_PLTPAD): Likewise. |
(DT_MOVETAB): Likewise. |
(DF_1_NODEPLIB): Likewise. |
(DF_1_NODUMP): Likewise. |
(DF_1_CONLFAT): Likewise. |
(DT_CHECKSUM): Likewise. FIXME. Check the value on Solaris 8. |
(DTF_1_CONFEXP): Likewise. |
2000-07-18 H.J. Lu <hjl@gnu.org> |
* common.h (DT_FLAGS_1): Renamed from DT_1_FLAGS. |
2000-07-12 Alan Modra <alan@linuxcare.com.au> |
* internal.h (struct elf_internal_sym): Update comment for st_other. |
2000-07-10 Alan Modra <alan@linuxcare.com.au> |
* hppa.h: Add comments to all the relocs. |
2000-06-26 Marek Michalkiewicz <marekm@linux.org.pl> |
* avr.h (E_AVR_MACH_AVR5): Define. |
2000-06-18 Stephane Carrez <stcarrez@worldnet.fr> |
* m68hc11.h: New file, definitions for the Motorola 68hc11. |
2000-06-06 Alan Modra <alan@linuxcare.com.au> |
* reloc-macros.h (START_RELOC_NUMBERS): Don't define initial dummy |
-1 valued enum. |
(RELOC_NUMBER, FAKE_RELOC, EMPTY_RELOC): Append rather than |
prepend comma. |
(END_RELOC_NUMBERS): Give macro an arg to define as last enum. |
* alpha.h (R_ALPHA_max): Define via END_RELOC_NUMBERS rather than |
with EMPTY_RELOC. |
* arc.h (R_ARC_max): Likewise. |
* avr.h (R_AVR_max): Likewise. |
* fr30.h (R_FR30_max): Likewise. |
* hppa.h (R_PARISC_UNIMPLEMENTED): Likewise. |
* i960.h (R_960_max): Likewise. |
* m32r.h (R_M32R_max): Likewise. |
* m68k.h (R_68K_max): Likewise. |
* mcore.h (R_MCORE_max): Likewise. |
* mn10300.h (R_MN10300_MAX): Likewise. |
* pj.h (R_PJ_max): Likewise. |
* ppc.h (R_PPC_max): Likewise. |
* sh.h (R_SH_max): Likewise. |
* sparc.h (R_SPARC_max): Likewise. |
* v850.h (R_V850_max): Likewise. |
* arm.h (R_ARM_max): Define via END_RELOC_NUMBERS. |
* d10v.h (R_D10V_max): Likewise. |
* d30v.h (R_D30V_max): Likewise. |
* ia64.h (R_IA64_max): Likewise. |
* mips.h (R_MIPS_maxext): Likewise. |
* mn10200.h (R_MN10200_max): Likewise. |
* i386.h (R_386_max): Remove old RELOC_NUMBER definition, and |
define via END_RELOC_NUMBERS. |
2000-06-03 Alan Modra <alan@linuxcare.com.au> |
* reloc-macros.h (START_RELOC_NUMBERS): Fix name clash for |
!__STDC__ case. |
(RELOC_NUMBER): Use ansi stringify if ALMOST_STDC defined. |
2000-05-22 Richard Henderson <rth@cygnus.com> |
* ia64.h (R_IA64_PCREL60B, R_IA64_PCREL21BI): New. |
(R_IA64_PCREL22, R_IA64_PCREL64I): New. |
2000-05-02 H.J. Lu <hjl@gnu.org> |
* common.h (ELFOSABI_NONE): Renamed from ELFOSABI_SYSV. |
(ELFOSABI_MODESTO): Defined. |
(ELFOSABI_OPENBSD): Likewise. |
2000-04-21 Richard Henderson <rth@cygnus.com> |
David Mosberger <davidm@hpl.hp.com> |
* ia64.h: New file. |
2000-04-14 H.J. Lu <hjl@gnu.org> |
* common.h (ELFOSABI_TRUE64): Renamed to ELFOSABI_TRU64. |
2000-04-14 H.J. Lu <hjl@gnu.org> |
* common.h (ELFOSABI_NETBSD): Defined. |
(ELFOSABI_HURD): Likewise. |
(ELFOSABI_SOLARIS): Likewise. |
(ELFOSABI_MONTEREY): Likewise. |
(ELFOSABI_IRIX): Likewise. |
(ELFOSABI_FREEBSD): Likewise. |
(ELFOSABI_TRUE64): Likewise. |
2000-04-07 Nick Clifton <nickc@cygnus.com> |
* arm-oabi.h: Delete. |
* arm.h: Merge in definitions of old reloc numbers from |
arm-oabi.h. |
2000-04-06 Nick Clifton <nickc@cygnus.com> |
* arm.h (EF_ARM_SYMSARESORTED): Define. |
(EF_ARM_EABIMASK): Define. |
(EF_ARM_EABI_VERSION): Define. |
(EF_ARM_EABI_UNKNOWN): Define. |
(EF_ARM_EABI_VER1): Define. |
(PF_ARM_PI): Define. |
(PF_ARM_ABS): Define. |
2000-04-05 J"orn Rennecke <amylaar@cygnus.co.uk> |
* sh.h (R_SH_LOOP_START, R_SH_LOOP_END): New RELOC_NUMBERs. |
2000-03-27 Denis Chertykov <denisc@overta.ru> |
* avr.h: New file. AVR ELF support for BFD. |
* common.h: Add AVR magic number. |
2000-03-10 Geoffrey Keating <geoffk@cygnus.com> |
* mips.h: Add R_MIPS_GNU_REL_HI16, R_MIPS_GNU_REL_LO16, |
R_MIPS_GNU_REL16_S2, R_MIPS_PC64 and R_MIPS_PC32 relocation |
numbers. |
2000-02-23 Linas Vepstas <linas@linas.org> |
* i370.h: New file. |
2000-02-22 Nick Clifton <nickc@cygnus.com> |
* common.h (ELF_ST_OTHER): Remove definition. |
(ELF32_ST_OTHER): Remove definition. |
(ELF64_ST_OTHER): Remove definition. |
2000-02-22 H.J. Lu <hjl@gnu.org> |
* common.h (ELFOSABI_LINUX): Define. |
2000-02-17 J"orn Rennecke <amylaar@cygnus.co.uk> |
* sh.h: (EF_SH_MACH_MASK, EF_SH_UNKNOWN, EF_SH1, EF_SH2): New macros. |
(EF_SH3, EF_SH_HAS_DSP, EF_SH_DSP, EF_SH3_DSP): Likewise. |
(EF_SH_HAS_FP, EF_SH3E, EF_SH4, EF_SH_MERGE_MACH): Likewise. |
2000-02-03 H.J. Lu <hjl@gnu.org> |
* arm-oabi.h: Duplicate changes made to arm.h on Jan. 27, |
2000 by Thomas de Lellis <tdel@windriver.com>. |
2000-01-27 Thomas de Lellis <tdel@windriver.com> |
* arm.h (STT_ARM_TFUNC): Define in terms of STT_LOPROC. |
(STT_ARM_16BIT): New flag. Denotes a label that was defined in |
Thumb block but was does not identify a function. |
2000-01-20 Nick Clifton <nickc@cygnus.com> |
* common.h (EM_MCORE): Fix spelling of Motorola. |
* mcore.h (EM_MCORE): Fix spelling of Motorola. |
2000-01-13 Nick Clifton <nickc@cygnus.com> |
* common.h (EM_S370): Change comment - this is now the IBM |
System/370. |
(EM_IA_64): Change comment - this is now the IA-64. |
2000-01-11 Nick Clifton <nickc@cygnus.com> |
* common.h (DT_ENCODING): Fix definition of this value. |
(DT_LOOS): Fix definition of this value. |
(DT_HIOS): Fix definition of this value. |
(OLD_DT_LOOS): Value of DT_LOOS before Oct 4, 1999 draft |
of ELF spec changed it. |
(OLD_DT_HIOS): Value of DT_HIOS before Oct 4, 1999 draft |
of ELF spec changed it. |
2000-01-10 Egor Duda <deo@logos-m.ru> |
* common.h (NT_WIN32PSTATUS): Define. (cygwin elf core dumps). |
1999-12-28 Nick Clifton <nickc@cygnus.com> |
* mips.h (STO_*): Redefine in terms of STV_* values now in |
common.h. |
1999-12-27 Nick Clifton <nickc@cygnus.com> |
* common.h: Upgrade to match Oct4, 1999 Draft ELF ABI Spec. |
(EM_MIPS_RS3_LE): New machine number. |
(EM_RCE): New machine number. |
(EM_MMA): New machine number. |
(EM_PCP): New machine number. |
(EM_NCPU): New machine number. |
(EM_NDR1): New machine number. |
(EM_STARCORE): New machine number. |
(EM_ME16): New machine number. |
(EM_ST100): New machine number. |
(EM_TINYJ): New machine number. |
(EM_FX66): New machine number. |
(EM_ST9PLUS): New machine number. |
(EM_ST7): New machine number. |
(EM_68HC16): New machine number. |
(EM_68HC11): New machine number. |
(EM_68HC08): New machine number. |
(EM_68HC05): New machine number. |
(EM_SVX): New machine number. |
(EM_VAX): New machine number. |
(PF_MASKOS): Change value. |
(SHT_INIT_ARRAY): New value for sh_type field. |
(SHT_FINI_ARRAY): New value for sh_type field. |
(SHT_PREINIT_ARRAY): New value for sh_type field. |
(SHT_HIUSER): Change value. |
(SHF_MERGE): New valye for sh_flags field. |
(SHF_STRINGS): New valye for sh_flags field. |
(SHF_INFO_LINK): New valye for sh_flags field. |
(SHF_OS_NONCONFORMING): New valye for sh_flags field. |
(SHF_MASKOS): Change value. |
(ELF_ST_VISIBILITY): New macro. |
(ELF_ST_OTHER): New macro. |
(STT_COMMON): New symbol type. |
(STV_DEFAULT): Value for symbol visibility. |
(STV_INTERNAL): Value for symbol visibility. |
(STV_HIDDEN): Value for symbol visibility. |
(STV_PROTECTED): Value for symbol visibility. |
(DT_RUNPATH): New dynamic section tag. |
(DT_FLAGS): New dynamic section tag. |
(DT_ENCODING): New dynamic section tag. |
(DT_PREINIT_ARRAY): New dynamic section tag. |
(DT_PREINIT_ARRAYSZ): New dynamic section tag. |
(DT_LOPROC): New dynamic section tag index. |
(DT_HIPROC): New dynamic section tag index. |
(DF_ORIGIN): Value for dynamic section flag. |
(DF_SYMBOLIC): Value for dynamic section flag. |
(DF_TEXTREL): Value for dynamic section flag. |
(DF_BIND_NOW): Value for dynamic section flag. |
1999-12-09 Fred Fish <fnf@cygnus.com> |
* i960.h (reloc-macros.h): Include using relative dir elf/. |
* i386.h (reloc-macros.h): Include using relative dir elf/. |
* hppa.h (reloc-macros.h): Include using relative dir elf/. |
1999-12-07 Jim Blandy <jimb@cygnus.com> |
* common.h (NT_PRXFPREG): New definition. |
Wed Dec 1 03:02:15 1999 Jeffrey A Law (law@cygnus.com) |
* mn10300.h (E_MN10300_MACH_AM33): Define. |
Mon Oct 11 22:42:37 1999 Jeffrey A Law (law@cygnus.com) |
* hppa.h (PF_HP_PAGE_SIZE): Define. |
(PF_HP_FAR_SHARED, PF_HP_NEAR_SHARED, PF_HP_CODE): Likewise. |
(PF_HP_MODIFY, PF_HP_LAZYSWAP, PF_HP_SBP): Likewise. |
Mon Oct 4 17:42:38 1999 Doug Evans <devans@canuck.cygnus.com> |
* m32r.h (E_M32RX_ARCH): Define. |
1999-09-15 Ulrich Drepper <drepper@cygnus.com> |
* hppa.h: Add DT_HP_GST_SIZE, DT_HP_GST_VERSION, and DT_HP_GST_HASHVAL. |
1999-09-04 Steve Chamberlain <sac@pobox.com> |
* pj.h: New file. |
* common.h (EM_PJ): Define. |
1999-09-02 Ulrich Drepper <drepper@cygnus.com> |
* hppa.h: Add HPUX specific symbol type definitions. |
* hppa.h: Add HPUX specific dynamic and program header table |
specific definitions. |
1999-08-31 Scott Bambrough <scottb@netwinder.org> |
* common.h (NT_TASKSTRUCT): Define. |
1999-07-16 Jakub Jelinek <jj@ultra.linux.cz> |
* sparc.h (EF_SPARC_SUN_US3): Define in Cheetah extensions |
flag (as per SCD2.4.1). |
1999-07-16 Jakub Jelinek <jj@ultra.linux.cz> |
* sparc.h (ELF64_R_TYPE_DATA): Only use ELF64_R_TYPE bits, not |
ELF64_R_SYM bits. |
1999-06-21 Philip Blundell <pb@nexus.co.uk> |
* arm.h (EF_SOFT_FLOAT, F_SOFT_FLOAT): Define. |
1999-07-13 Andreas Schwab <schwab@suse.de> |
* m68k.h (EF_CPU32): Move definition inside multiple inclusion |
guard. |
1999-07-08 Richard Henderson <rth@cygnus.com> |
* sparc.h (ELF64_R_TYPE_DATA): Sign extend the value. |
(ELF64_R_TYPE_INFO): Mask out all but low 24 bits of data. |
(DT_SPARC_PLTFMT): Delete. |
Based on a patch from Jakub Jelinek. |
Mon Jun 21 16:36:02 1999 Jeffrey A Law (law@cygnus.com) |
* hppa.h (elf_hppa_reloc_type): Renamed from elf32_hppa_reloc_type. |
1999-06-10 Jakub Jelinek <jj@ultra.linux.cz> |
* sparc.h (R_SPARC_max_std): Define. |
Wed Jun 9 15:16:34 1999 Jeffrey A Law (law@cygnus.com) |
* hppa.h: Update with various changes from newest PA ELF |
specifications. |
1999-06-03 Ian Lance Taylor <ian@zembu.com> |
* common.h (EM_PPC64): Define. |
1999-06-02 Stu Grossman <grossman@babylon-5.cygnus.com> |
* dwarf.h: Add LANG_JAVA. |
* dwarf2.h: Add DW_LANG_Java. |
1999-05-29 Nick Clifton <nickc@cygnus.com> |
* common.h (ELFOSABI_ARM): Define. |
1999-05-28 Nick Clifton <nickc@cygnus.com> |
* reloc-macros.h: Update comment. |
1999-05-28 Ian Lance Taylor <ian@zembu.com> |
* i960.h: New file. |
1999-05-16 Nick Clifton <nickc@cygnus.com> |
* mcore.h (R_MCORE_COPY): Define. |
(R_MCORE_GLOB_DAT): Define. |
(R_MCORE_JUMP_SLOT): Define. |
1999-05-15 Nick Clifton <nickc@cygnus.com> |
* mcore.h (R_MCORE_RELATIVE): Define. |
1999-05-05 Catherine Moore <clm@cygnus.com> |
* m68k.h (EF_CPU32): Define. |
1999-04-21 Nick Clifton <nickc@cygnus.com> |
* reloc-macros.h (START_RELOC_NUMBERS): Prepend an underscore to |
fake reloc entry name (if possible), in order to avoid conflicts |
with typedefs of the same name. |
1999-04-16 Gavin Romig-Koch <gavin@cygnus.com> |
* mips.h (EF_MIPS_32BITMODE): New. |
1999-04-08 Nick Clifton <nickc@cygnus.com> |
* mcore.h: New header file. Defines for Motorola's MCore |
processor. |
1999-04-08 Nick Clifton <nickc@cygnus.com> |
* common.h: Add new constants defined in: "System V Application |
Binary Interface - DRAFT - April 29, 1998" found at the web site: |
http://www.sco.com/developer/gabi/contents.html |
(EM_MMA): Removed. Replaced with EM_MCORE as Motorolla own this |
value. |
1999-03-31 Nick Clifton <nickc@cygnus.com> |
* reloc-macros.h: Fixed to not generate an enum with a trailing |
comma. |
1999-03-16 Gavin Romig-Koch <gavin@cygnus.com> |
* mips.h (E_MIPS_MACH_5000): New. |
1999-03-10 Ulrich Drepper <drepper@cygnus.com> |
* common.h: Add definitions for a few more Solaris ELF extensions. |
Thu Feb 18 18:58:26 1999 Ian Lance Taylor <ian@cygnus.com> |
* external.h: Only use attribute if __GNUC__ is defined. |
1999-02-17 Nick Clifton <nickc@cygnus.com> |
Patch submitted by: Scott Bambrough <scottb@corelcomputer.com> |
* external.h: struct Elf_External_Versym must be packed on |
ARM. Code uses sizeof(Elf_External_Versym) and assumes it is |
equal to sizeof(char[2]). Reported by Jim Pick <jim@jimpick.com> |
1999-02-02 Nick Clifton <nickc@cygnus.com> |
* dwarf2.h (DWARF2_External_ARange): New structure. |
(DWARF2_Internal_ARange): New structure. |
Mon Feb 1 11:33:56 1999 Catherine Moore <clm@cygnus.com> |
* arm.h: Renumber relocs to conform to standard. |
(EF_NEW_ABI): Define. |
(EF_OLD_ABI): Define. |
* arm-oabi.h: New file. |
1999-01-28 Nick Clifton <nickc@cygnus.com> |
* fr30.h: Add R_FR30_GNU_VT{INHERIT,ENTRY} relocs. |
1999-01-27 Nick Clifton <nickc@cygnus.com> |
* dwarf2.h: Add typedefs for structures found in dwarf2 sections. |
1998-12-16 Gavin Romig-Koch <gavin@cygnus.com> |
* mips.h (E_MIPS_MACH_4111): New. |
1998-12-15 Gavin Romig-Koch <gavin@cygnus.com> |
* mips.h (EF_MIPS_ABI,E_MIPS_ABI_O32,E_MIPS_ABI_O64, |
E_MIPS_ABI_EABI32,E_MIPS_ABI_EABI64): |
1998-12-03 Nick Clifton <nickc@cygnus.com> |
* fr30.h: Add R_FR30_48 reloc. |
1998-12-02 Ulrich Drepper <drepper@cygnus.com> |
* mips.h: Add external data type for conflict section. |
* mips.h: Add more LL_* options from Irix 6.5. |
* mips.h: Add R_MIPS_JALR and adjust R_MIPS_max appropriately. |
Mon Nov 30 15:25:58 1998 J"orn Rennecke <amylaar@cygnus.co.uk> |
* sh.h (elf_sh_reloc_type): Add R_SH_FIRST_INVALID_RELOC, |
R_SH_LAST_INVALID_RELOC, R_SH_SWITCH8 and R_SH_max. |
Tue Nov 10 15:12:28 1998 Nick Clifton <nickc@cygnus.com> |
* common.h (EM_CYGNUS_FR30): Reduce to a 16 bit value. |
Tue Nov 10 15:17:28 1998 Catherine Moore <clm@cygnus.com> |
* d10v.h: Add vtable relocs. |
Wed Nov 4 15:56:50 1998 Nick Clifton <nickc@cygnus.com> |
* common.h (EM_CYGNUS_FR30): New machine number. |
* fr30.h: New file: Definitions for the FR30. |
Fri Oct 30 11:54:15 1998 Catherine Moore <clm@cygnus.com> |
From Philip Blundell <pb@nexus.co.uk>: |
* arm.h (R_ARM_COPY, et al.): New relocs, used by Linux for PIC. |
(EF_ALIGN8): New flag. |
Tue Oct 20 11:19:50 1998 Ian Lance Taylor <ian@cygnus.com> |
* common.h (NT_LWPSTATUS): Close comment accidentally left open. |
Mon Oct 19 20:24:11 1998 Catherine Moore <clm@cygnus.com> |
* sh.h: Add vtable relocs. |
Mon Oct 19 01:44:42 1998 Felix Lee <flee@cygnus.com> |
* common.h (NT_PSTATUS, NT_FPREGS, NT_PSINFO, |
NT_LWPSTATUS,NT_LWPSINFO): added. |
* internal.h (Elf_Internal_Note): new structure members. |
Fri Oct 16 14:11:25 1998 Catherine Moore <clm@cygnus.com> |
* m32r.h: Add vtable relocs. |
Tue Oct 6 09:22:22 1998 Catherine Moore <clm@cygnus.com> |
* sparc.h: Add vtable relocs. |
Mon Oct 5 09:39:22 1998 Catherine Moore <clm@cygnus.com> |
* v850.h: Add vtable relocs. |
Sun Oct 4 21:17:51 1998 Ian Lance Taylor <ian@cygnus.com> |
* i386.h (R_386_max): Change from 252 to 24. |
Mon Sep 21 12:24:44 1998 Catherine Moore <clm@cygnus.com> |
* i386.h: Change vtable reloc numbers. |
Sun Sep 20 00:54:22 1998 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> |
* m68k.h: Add vtable relocs and R_68K_max. |
Tue Sep 15 09:56:49 CDT 1998 Catherine Moore <clm@cygnus.com> |
* arm.h: Add vtable relocs. |
Mon Aug 31 11:25:27 1998 Catherine Moore <clm@cygnus.com> |
* arm.h: Define STT_ARM_TFUNC. Remove ST_THUMB_xxxx |
definitions. |
Sat Aug 29 22:25:51 1998 Richard Henderson <rth@cygnus.com> |
* i386.h: Add vtable relocs. |
1998-08-25 16:42 Ulrich Drepper <drepper@cygnus.com> |
* common.h: Add SYMINFO_* macros to access Elf*_Syminfo information. |
* external.h: Add Elf_External_Syminfo definition. |
* internal.h: Add Elf_Internal_Syminfo, Elf32_Internal_Syminfo, |
and Elf64_Syminfo definitions. |
Sun Aug 9 20:26:49 CDT 1998 Catherine Moore <clm@cygnus.com> |
* arm.h: Add ST_THUMB definitions. |
Wed Aug 5 15:52:35 1998 Nick Clifton <nickc@cygnus.com> |
* arm.h: Add ELF header flags to specify compile time optins: |
EF_INTERWORK: New flag. |
EF_APCS_26: New flag. |
EF_APCS_FLOAT: New flag. |
EF_PIC: New flag. |
1998-07-31 21:28 Ulrich Drepper <drepper@cygnus.com> |
* mips.h: Add missing RHF_* constants. |
Fri Jul 31 10:01:40 1998 Catherine Moore <clm@cygnus.com> |
* arm.h: Add R_ARM_THM_PC9 relocation. |
1998-07-30 16:25 Ulrich Drepper <drepper@cygnus.com> |
* common.h: Add new DT_* entries and there flag macros from Solaris. |
Tue Jul 28 18:14:07 1998 Stan Cox <scox@equinox.cygnus.com> |
* sparc.h: (R_SPARC_REV32): Added for little endian data e.g. sparc 86x. |
Fri Jul 24 11:22:06 1998 Jeffrey A Law (law@cygnus.com) |
* mn10300.h: Add R_MN10300_24 relocation. |
1998-07-24 Ulrich Drepper <drepper@cygnus.com> |
* mips.h: Add MIPS64 relocation names and values. |
Wed Jul 22 19:29:00 Catherine Moore <clm@cygnus.com> |
* arm.h: Rename relocations. |
1998-07-22 Ulrich Drepper <drepper@cygnus.com> |
* ppc.h: Define enum as elf_ppc_reloc_type. |
Wed Jul 22 16:22:11 1998 Nick Clifton <nickc@cygnus.com> |
* reloc-macros.h: New file. Provides relocation macros: |
START_RELOC_NUMBERS, RELOC_NUMBER, FAKE_RELOC, EMPTY_RELOC and |
END_RELOC_NUMBERS used by other elf header files. |
* alpha.h: Use reloc-macros.h. |
* arc.h: Use reloc-macros.h. |
* arm.h: Use reloc-macros.h. |
* d10v.h: Use reloc-macros.h. |
* d30v.h: Use reloc-macros.h. |
* hppa.h: Use reloc-macros.h. |
* i386.h: Use reloc-macros.h. |
* m32r.h: Use reloc-macros.h. |
* m68k.h: Use reloc-macros.h. |
* mips.h: Use reloc-macros.h. |
* mn10200.h: Use reloc-macros.h. |
* mn10300.h: Use reloc-macros.h. |
* ppc.h: Use reloc-macros.h. |
* sh.h: Use reloc-macros.h. |
* sparc.h: Use reloc-macros.h. |
* v850.h: Use reloc-macros.h. |
1998-07-22 13:07 Ulrich Drepper <drepper@cygnus.com> |
* mn10300.h: Rewrite relocation definition using macros. |
* mips.h: Likewise. |
* ppc.h: Likewise. |
* alpha.h: Likewise. |
* arm.h: Likewise. |
* d10v.h: Likewise. |
* d30v.h: Likewise. |
* m32r.h: Likewise. |
* m68k.h: Likewise. |
* mn10200.h: Likewise. |
* sh.h: Likewise. |
* sparc.h: Likewise. |
1998-07-21 13:07 Ulrich Drepper <drepper@cygnus.com> |
* arm.h: New file. |
* d10v.h: New file. |
* d30v.h: New file. |
* i386.h: New file. |
* m68k.h: New file. |
* mn10200.h: New file. |
* sh.h: New file. |
* mips.h: Add R_MIPS_* and SHT_MIPS_* entries. |
* mn10300.h: Add R_MN10300_* entries. |
* ppc.h: Add R_PPC_* entries. |
1998-07-20 07:11 Ulrich Drepper <drepper@cygnus.com> |
* mips.h: Add ODK_*, OEX_*, OPAD_*, OHW_*, and OGP_* constants. |
Define Elf32_External_Lib. |
1998-07-19 15:24 Ulrich Drepper <drepper@cygnus.com> |
* mips.h (PT_MIPS_OPTIONS): New symbol. |
Add lots of DT_MIPS_* symbols. |
Fri Jun 26 10:46:35 1998 Jeffrey A Law (law@cygnus.com) |
* mn10300.h: New file. |
Thu Jun 18 19:27:56 1998 Nick Clifton <nickc@cygnus.com> |
* common.h (EM_960, EM_V800, EM_FR20, EM_RH32, EM_MMA, |
EM_OLD_ALPHA): Add these constants. |
Thu Jun 11 17:59:01 1998 Nick Clifton <nickc@cygnus.com> |
* common.h (EM_486, EM_S370): Add these constants. |
Tue Jun 9 09:35:29 1998 Nick Clifton <nickc@cygnus.com> |
* common.h (EM_ARM): Add this constant. |
Wed May 6 09:45:30 1998 Gavin Koch <gavin@cygnus.com> |
* mips.h (EF_MIPS_MACH,E_MIPS_MACH_*): Added. |
Sat Apr 25 18:35:06 1998 Richard Henderson <rth@cygnus.com> |
* alpha.h (STO_ALPHA_NOPV, STO_ALPHA_STD_GPLOAD): New. |
Wed Apr 15 15:42:45 1998 Richard Henderson <rth@cygnus.com> |
* common.h (EM_SPARC64): Move and rename to EM_OLD_SPARCV9. |
(EM_SPARCV9): New. This is the official ABI name and number. |
Sat Feb 28 17:04:41 1998 Richard Henderson <rth@cygnus.com> |
* alpha.h (EF_ALPHA_32BIT, EF_ALPHA_CANRELAX): New. |
Mon Dec 15 15:07:49 1997 Nick Clifton <nickc@cygnus.com> |
* m32r.h (EF_M32R_ARCH, E_M32R_ARCH): New flags to |
specify machine architecture. |
Fri Dec 5 11:20:08 1997 Nick Clifton <nickc@cygnus.com> |
* v850.h: New constants: SHN_V850_SCOMMON, SHN_V850_TCOMMON, |
SHN_V850_ZCOMMON, SHT_V850_SCOMMON, SHT_V850_TCOMMON, |
SHT_V850_ZCOMMON to handle v850 common sections. |
enum reloc_type renamed to v850_reloc_type to avoid name |
conflict. |
Thu Oct 23 13:55:24 1997 Richard Henderson <rth@cygnus.com> |
* sparc.h (enum elf_sparc_reloc_type): Add UA64 & UA16. |
Thu Oct 23 00:42:04 1997 Richard Henderson <rth@dot.cygnus.com> |
* sparc.h (DT_SPARC_REGISTER): New macro. |
(DT_SPARC_PLTFMT): In support of old sparc64-linux .plts; will |
go away soon. |
Tue Sep 30 13:26:58 1997 Doug Evans <dje@canuck.cygnus.com> |
* sparc.h (EF_SPARC_HAL_R1, EF_SPARC_EXT_MASK): New macros. |
(EF_SPARCV9_{MM,TSO,PSO,RMO}): New macros. |
(SHN_BEFORE,SHN_AFTER): New macros. |
(SHF_EXCLUDE,SHF_ORDERED): New macros. |
(STT_REGISTER): New macro. |
(R_SPARC_GLOB_JMP): Deleted, but slot reserved. |
(R_SPARC_{DISP64,PLT64,HIX22,LOX10}): New relocations. |
(R_SPARC_{H44,M44,L44,REGISTER}): New relocations. |
(ELF64_R_TYPE_{DATA,ID,INFO}): New macros. |
Wed Sep 17 16:41:42 1997 Nick Clifton <nickc@cygnus.com> |
* v850.h: Add R_V850_CALLT_6_7_OFFSET and R_V850_CALLT_16_16_OFFSET. |
Tue Sep 16 14:16:17 1997 Nick Clifton <nickc@cygnus.com> |
* v850.h (reloc_type): Add R_V850_TDA_16_16_OFFSET. |
Wed Sep 3 15:11:14 1997 Richard Henderson <rth@cygnus.com> |
* mips.h: Correct typo in comment. |
Wed Sep 3 11:25:57 1997 Nick Clifton <nickc@cygnus.com> |
* v850.h (reloc_type): Remove R_V850_16_PCREL. |
Tue Sep 2 17:41:05 1997 Nick Clifton <nickc@cygnus.com> |
* common.h: Remove magic number for V850E. |
* common.h: Remove magic number for V850EA. |
* v850.h: Add new flags for e_flags field in elf header. |
Mon Aug 25 16:06:47 1997 Nick Clifton <nickc@cygnus.com> |
* common.h (EM_CYGNUS_V850E): backend magic number for v850e. |
* common.h (EM_CYGNUS_V850EA): backend magic number for v850ea. |
Mon Aug 18 11:05:23 1997 Nick Clifton <nickc@cygnus.com> |
* v850.h (reloc_type): Add 16 bit PC relative relocation. |
Fri Aug 15 05:10:09 1997 Doug Evans <dje@canuck.cygnus.com> |
* arc.h (enum reloc): Move here from elf32-arc.c. |
Fri Aug 8 17:05:29 1997 Doug Evans <dje@canuck.cygnus.com> |
* arc.h: New file. |
* common.h (EM_CYGNUS_ARC): Define. |
Mon Jun 16 14:46:12 1997 Ian Lance Taylor <ian@cygnus.com> |
* internal.h (Elf_Internal_Ehdr): Change e_phoff and e_shoff from |
bfd_signed_vma to bfd_size_type, as they are not signed. |
Wed Mar 5 15:35:26 1997 Doug Evans <dje@seba.cygnus.com> |
* m32r.h (SHF_M32R_CAN_RELAX): Define. |
Mon Feb 24 17:49:01 1997 Ian Lance Taylor <ian@cygnus.com> |
* external.h: Dump the 32/64 bit specific forms of the version |
structures, and just define them as size independent. |
* common.h (VERSYM_HIDDEN, VERSYM_VERSION): Define. |
Fri Feb 21 13:00:34 1997 Doug Evans <dje@canuck.cygnus.com> |
* m32r.h (enum reloc_type): Add R_M32R_SDA16. |
(SHN_M32R_SCOMMON): Define. |
Wed Feb 19 15:35:31 1997 Ian Lance Taylor <ian@cygnus.com> |
From Eric Youngdale <eric@andante.jic.com>: |
* external.h, internal.h, common.h: Added new structures and |
definitions for ELF versions. |
Tue Feb 18 17:40:36 1997 Martin M. Hunt <hunt@pizza.cygnus.com> |
* common.h (EM_CYGNUS_D30V): Define. |
Mon Jan 27 11:54:44 1997 Doug Evans <dje@seba.cygnus.com> |
* m32r.h (enum reloc_type): Add R_M32R_HI16_[SU]LO,R_M32R_LO16. |
Fri Jan 3 11:32:51 1997 Michael Meissner <meissner@tiktok.cygnus.com> |
* v850.h (V850_OTHER_{TDA_BYTE,ERROR}): New bits for the st_other |
field. |
(SHN_V850_*): Remove v850 specific section indexes, which are not |
needed. |
(enum reloc_type): Move the v850 relocations here from |
elf32-v850.c |
Thu Jan 2 19:30:23 1997 Michael Meissner <meissner@tiktok.cygnus.com> |
* v850.h: New file, provide V850 specific definitions. |
Tue Dec 31 14:44:32 1996 Ian Lance Taylor <ian@cygnus.com> |
* common.h (DT_AUXILIARY): Define. |
(DT_FILTER): Define. |
Wed Dec 4 05:03:37 1996 Jason Merrill <jason@yorick.cygnus.com> |
* dwarf2.h: Update. |
Tue Nov 26 10:44:47 1996 Ian Lance Taylor <ian@cygnus.com> |
* mips.h (STO_MIPS16): Define. |
Tue Nov 12 15:45:42 1996 Martin M. Hunt <hunt@pizza.cygnus.com> |
* d10v.h: Remove empty file. |
Tue Oct 8 11:31:24 1996 Ian Lance Taylor <ian@cygnus.com> |
* mips.h (EF_MIPS_ABI2): Define. |
Thu Oct 3 10:01:40 1996 Jeffrey A Law (law@cygnus.com) |
* common.h: Break mn10x00 support into mn10200 and mn10300. |
Wed Oct 2 21:26:43 1996 Jeffrey A Law (law@cygnus.com) |
* common.h (EM_CYGNUS_MN10x00): Define. |
Mon Sep 23 09:18:04 1996 Doug Evans <dje@seba.cygnus.com> |
* m32r.h: New file. |
Fri Aug 30 17:06:21 1996 Ian Lance Taylor <ian@cygnus.com> |
* common.h (EM_SH): Define. |
Tue Aug 20 14:47:54 1996 J.T. Conklin <jtc@hippo.cygnus.com> |
* common.h (EM_CYGNUS_V850): Define. |
Mon Aug 19 10:59:10 1996 Doug Evans <dje@canuck.cygnus.com> |
* common.h (EM_CYGNUS_M32R): Define. |
Mon Jul 22 18:59:55 1996 Ian Lance Taylor <ian@cygnus.com> |
* mips.h (SHT_MIPS_IFACE, SHT_MIPS_CONTENT): Define. |
(SHT_MIPS_SYMBOL_LIB): Define. |
(SHF_MIPS_MERGE, SHF_MIPS_ADDR32, SHF_MIPS_ADDR64): Define. |
(SHF_MIPS_NOSTRIP, SHF_MIPS_LOCAL, SHF_MIPS_NAMES): Define. |
Thu Jul 18 19:12:15 1996 Stan Shebs <shebs@andros.cygnus.com> |
* dwarf2.h: New file. |
Jul 18 13:20:39 1996 Martin M. Hunt <hunt@pizza.cygnus.com> |
* common.h (EM_CYGNUS_D10V): Define. |
* d10v.h: New file. |
Fri Jun 21 12:33:24 1996 Richard Henderson <rth@tamu.edu> |
* alpha.h: New file. |
* common.h (EM_ALPHA): Define. |
Fri May 31 17:28:05 1996 Ian Lance Taylor <ian@cygnus.com> |
* mips.h (Elf_External_Options, Elf_Internal_Options): Define. |
(bfd_mips_elf_swap_options_in): Declare. |
(bfd_mips_elf_swap_options_out): Declare. |
(ODK_*): Define. |
(Elf64_External_RegInfo, Elf64_Internal_RegInfo): Define. |
(bfd_mips_elf64_swap_reginfo_in): Declare. |
(bfd_mips_elf64_swap_reginfo_out): Declare. |
Thu May 30 12:35:57 1996 Ian Lance Taylor <ian@cygnus.com> |
* mips.h (E_MIPS_ARCH_4): Define. |
Wed May 29 15:35:33 1996 Ian Lance Taylor <ian@cygnus.com> |
* mips.h (Elf64_Mips_External_Rel): Define. |
(Elf64_Mips_Internal_Rel): Define. |
(Elf64_Mips_External_Rela, Elf64_Mips_Internal_Rela): Define. |
(RSS_*): Define. |
Mon Apr 22 18:26:30 1996 Doug Evans <dje@canuck.cygnus.com> |
* sparc.h (R_SPARC_[56]): Always define. |
Mon Feb 19 01:55:56 1996 Doug Evans <dje@charmed.cygnus.com> |
* sparc.h (R_SPARC_{PLT32,HIPLT22,LOPLT10,PCPLT32,PCPLT22, |
PCPLT10,5,6}): Don't define ifdef SPARC64_OLD_RELOCS. |
Tue Feb 6 11:33:58 1996 Doug Evans <dje@charmed.cygnus.com> |
* sparc.h (enum sparc_elf_reloc_type): Define. |
Wed Jan 17 09:09:16 1996 Doug Evans <dje@canuck.cygnus.com> |
* common.h: Define EM_SPARC32PLUS. |
* sparc.h: New file. |
Thu Jan 11 16:27:34 1996 Michael Meissner <meissner@tiktok.cygnus.com> |
* ppc.h (SHF_EXCLUDE, SHT_ORDERED): New fields from the abi. |
Thu Nov 30 16:47:18 1995 Ian Lance Taylor <ian@cygnus.com> |
* internal.h (struct elf_segment_map): Add includes_filehdr and |
includes_phdrs fields. |
Tue Nov 28 16:58:10 1995 Ian Lance Taylor <ian@cygnus.com> |
* internal.h (struct elf_segment_map): Define. |
Tue Oct 31 15:19:36 1995 Fred Fish <fnf@cygnus.com> |
* common.h, dwarf.h, external.h, hppa.h, internal.h, |
mips.h, ppc.h: Protect against multiple inclusions. |
Thu Sep 21 13:51:58 1995 Michael Meissner <meissner@tiktok.cygnus.com> |
* ppc.h (EF_PPC_RELOCATABLE_LIB): Add new flag bit. |
Fri Sep 1 15:32:17 1995 Kazumoto Kojima <kkojima@info.kanagawa-u.ac.jp> |
* mips.h: Add some definitions used on Irix 5. |
Tue Jun 20 10:18:28 1995 Jeff Law (law@snake.cs.utah.edu) |
* hppa.h (CPU_PA_RISC1_0): Protect from redefinitions. |
(CPU_PA_RISC1_1): Likewise. |
Wed Mar 8 18:14:37 1995 Michael Meissner <meissner@tiktok.cygnus.com> |
* ppc.h: New file for PowerPC support. |
Tue Feb 14 13:59:13 1995 Michael Meissner <meissner@tiktok.cygnus.com> |
* common.h (EM_PPC): Use offical value of 20, not 17. |
(EM_PPC_OLD): Define this to be the old value of EM_PPC. |
Tue Jan 24 09:40:59 1995 Michael Meissner <meissner@tiktok.cygnus.com> |
* common.h (EM_PPC): New macro, PowerPC machine id. |
Tue Jan 17 10:51:38 1995 Ian Lance Taylor <ian@sanguine.cygnus.com> |
* mips.h (SHT_MIPS_MSYM, SHT_MIPS_DWARF, SHT_MIPS_EVENTS): Define. |
Mon Oct 17 13:43:59 1994 Ian Lance Taylor <ian@sanguine.cygnus.com> |
* internal.h (Elf_Internal_Shdr): Remove rawdata and size fields. |
Add bfd_section field. |
Tue May 24 16:11:50 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* mips.h (Elf32_External_gptab): Define. |
Mon May 16 13:22:04 1994 Jeff Law (law@snake.cs.utah.edu) |
* common.h (EM_HPPA): Delete. |
(EM_PARISC): Add. |
* hppa.h: New file. |
Mon May 9 13:27:03 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* common.h (SHN_LORESERVE): Rename from SHN_LORESERV. |
(ELF32_R_TYPE, ELF32_R_INFO): Don't rely on size of unsigned char. |
(ELF64_R_TYPE): Don't rely on size of unsigned long. |
Mon Apr 25 15:53:09 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* internal.h (Elf_Internal_Shdr): Use PTR, not void *. |
Fri Mar 11 00:34:59 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) |
* mips.h (SHN_MIPS_TEXT, SHN_MIPS_DATA): Define. |
Sat Mar 5 14:08:54 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) |
* internal.h: Remove Elf32_*, Elf64_* typedefs. These names |
cause conflicts with system headers, e.g. link.h in gdb/solib.c. |
Combine 32- and 64-bit versions of *_Internal_Dyn. |
* common.h: Replace uses of Elf64_Word, Elf64_Xword typedefs |
by their expansion. |
* mips.h: Replace uses of Elf32_Word, Elf32_Sword, Elf32_Addr |
typedefs by their expansion. Add DT_MIPS_RLD_MAP definition. |
Fri Feb 18 10:39:54 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* common.h (EM_CYGNUS_POWERPC): Define. This may be temporary, |
depending upon how quickly I can find a real PowerPC ABI. |
Mon Feb 7 08:27:13 1994 Jim Kingdon (kingdon@lioth.cygnus.com) |
* internal.h: Change HOST_64_BIT to BFD_HOST_64_BIT. |
Wed Feb 2 14:12:18 1994 Jim Kingdon (kingdon@lioth.cygnus.com) |
* common.h: Add comments regarding value of EM_HPPA and how to |
pick an unofficial value. |
Wed Nov 17 17:14:26 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* mips.h (SHT_MIPS_OPTIONS): Define. |
Mon Nov 8 17:57:00 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* mips.h: Added some more MIPS ABI macro definitions. |
Wed Nov 3 22:07:17 1993 Ken Raeburn (raeburn@rtl.cygnus.com) |
* common.h (EM_MIPS_RS4_BE): New macro. |
Tue Oct 12 07:28:18 1993 Ian Lance Taylor (ian@cygnus.com) |
* mips.h: New file. MIPS ABI specific information. |
Mon Jun 21 13:13:43 1993 Ken Raeburn (raeburn@poseidon.cygnus.com) |
* internal.h: Combined 32- and 64-bit versions of all structures |
except *_Internal_Dyn. This will simply the assembler interface, |
and some bfd code. |
Tue May 25 02:00:16 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) |
* external.h, internal.h, common.h: Added 64-bit versions of some |
structures and macros. Renamed old versions to put "32" in the |
name. Some are unchanged. |
Thu Apr 29 12:12:20 1993 Ken Raeburn (raeburn@deneb.cygnus.com) |
* common.h (EM_HPPA, NT_VERSION, STN_UNDEF, DT_*): New macros. |
* external.h (Elf_External_Dyn): New type. |
* internal.h (Elf_Intenral_Shdr): New field `size'. |
(Elf_Internal_Dyn): New type. |
Tue Apr 20 16:03:45 1993 Fred Fish (fnf@cygnus.com) |
* dwarf.h (LANG_CHILL): Change value to one randomly picked in |
the user defined range, to reduce probability of collisions. |
Sun Nov 15 09:34:02 1992 Fred Fish (fnf@cygnus.com) |
* dwarf.h (AT_src_coords): Whitespace change only. |
* dwarf.h (AT_body_begin, AT_body_end, LANG_MODULA2): |
Add from latest gcc. |
* dwarf.h (LANG_CHILL): Add as GNU extension. |
Sat Aug 1 13:46:53 1992 Fred Fish (fnf@cygnus.com) |
* dwarf.h: Replace with current version from gcc distribution. |
Fri Jun 19 19:05:09 1992 John Gilmore (gnu at cygnus.com) |
* internal.h: Add real struct tags to all the Type_Defs, so they |
can be used in prototypes where the Type_Defs are not known. |
Fri Apr 3 20:58:58 1992 Mark Eichin (eichin at cygnus.com) |
* common.h: added ELF_R_{SYM,TYPE,INFO} for handling relocation |
info |
added EM_MIPS, and corrected value of EM_860 based on System V ABI |
manual. |
* external.h: added Elf_External_{Rel,Rela}. |
* internal.h: added Elf_Internal_{Rel,Rela}. |
added rawdata to Elf_Internal_Shdr. |
Sat Nov 30 20:43:59 1991 Steve Chamberlain (sac at rtl.cygnus.com) |
* common.h, dwarf.h, external.h, internal.h, ChangeLog; moved from |
../elf-<foo> |
Copyright (C) 1991-2003 Free Software Foundation, Inc. |
Copying and distribution of this file, with or without modification, |
are permitted in any medium without royalty provided the copyright |
notice and this notice are preserved. |
Local Variables: |
mode: change-log |
left-margin: 8 |
fill-column: 74 |
version-control: never |
End: |
/contrib/toolchain/binutils/include/elf/aarch64.h |
---|
0,0 → 1,335 |
/* AArch64 ELF support for BFD. |
Copyright 2009, 2010, 2011, 2012 Free Software Foundation, Inc. |
Contributed by ARM Ltd. |
This file is part of GNU Binutils. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the license, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; see the file COPYING3. If not, |
see <http://www.gnu.org/licenses/>. */ |
#ifndef _ELF_AARCH64_H |
#define _ELF_AARCH64_H |
#include "elf/reloc-macros.h" |
/* Processor specific program header types. */ |
#define PT_AARCH64_ARCHEXT (PT_LOPROC + 0) |
/* Additional section types. */ |
#define SHT_AARCH64_ATTRIBUTES 0x70000003 /* Section holds attributes. */ |
/* AArch64-specific values for sh_flags. */ |
#define SHF_ENTRYSECT 0x10000000 /* Section contains an |
entry point. */ |
#define SHF_COMDEF 0x80000000 /* Section may be multiply defined |
in the input to a link step. */ |
/* Relocation types. */ |
START_RELOC_NUMBERS (elf_aarch64_reloc_type) |
/* Null relocations. */ |
RELOC_NUMBER (R_AARCH64_NONE, 0) /* No reloc */ |
/* Basic data relocations. */ |
/* .word: (S+A) */ |
RELOC_NUMBER (R_AARCH64_P32_ABS32, 1) |
/* .half: (S+A) */ |
RELOC_NUMBER (R_AARCH64_P32_ABS16, 2) |
/* .word: (S+A-P) */ |
RELOC_NUMBER (R_AARCH64_P32_PREL32, 3) |
/* .half: (S+A-P) */ |
RELOC_NUMBER (R_AARCH64_P32_PREL16, 4) |
/* Group relocations to create a 16, 32, 48 or 64 bit |
unsigned data or abs address inline. */ |
/* MOV[ZK]: ((S+A) >> 0) & 0xffff */ |
RELOC_NUMBER (R_AARCH64_P32_MOVW_UABS_G0, 5) |
/* MOV[ZK]: ((S+A) >> 0) & 0xffff */ |
RELOC_NUMBER (R_AARCH64_P32_MOVW_UABS_G0_NC, 6) |
/* MOV[ZK]: ((S+A) >> 16) & 0xffff */ |
RELOC_NUMBER (R_AARCH64_P32_MOVW_UABS_G1, 7) |
/* Group relocations to create high part of a 16, 32, 48 or 64 bit |
signed data or abs address inline. Will change instruction |
to MOVN or MOVZ depending on sign of calculated value. */ |
/* MOV[ZN]: ((S+A) >> 0) & 0xffff */ |
RELOC_NUMBER (R_AARCH64_P32_MOVW_SABS_G0, 8) |
/* Relocations to generate 19, 21 and 33 bit PC-relative load/store |
addresses: PG(x) is (x & ~0xfff). */ |
/* LD-lit: ((S+A-P) >> 2) & 0x7ffff */ |
RELOC_NUMBER (R_AARCH64_P32_LD_PREL_LO19, 9) |
/* ADR: (S+A-P) & 0x1fffff */ |
RELOC_NUMBER (R_AARCH64_P32_ADR_PREL_LO21, 10) |
/* ADRH: ((PG(S+A)-PG(P)) >> 12) & 0x1fffff */ |
RELOC_NUMBER (R_AARCH64_P32_ADR_PREL_PG_HI21, 11) |
/* ADD: (S+A) & 0xfff */ |
RELOC_NUMBER (R_AARCH64_P32_ADD_ABS_LO12_NC, 12) |
/* LD/ST8: (S+A) & 0xfff */ |
RELOC_NUMBER (R_AARCH64_P32_LDST8_ABS_LO12_NC, 13) |
/* LD/ST16: (S+A) & 0xffe */ |
RELOC_NUMBER (R_AARCH64_P32_LDST16_ABS_LO12_NC, 14) |
/* LD/ST32: (S+A) & 0xffc */ |
RELOC_NUMBER (R_AARCH64_P32_LDST32_ABS_LO12_NC, 15) |
/* LD/ST64: (S+A) & 0xff8 */ |
RELOC_NUMBER (R_AARCH64_P32_LDST64_ABS_LO12_NC, 16) |
/* LD/ST128: (S+A) & 0xff0 */ |
RELOC_NUMBER (R_AARCH64_P32_LDST128_ABS_LO12_NC, 17) |
/* Relocations for control-flow instructions. */ |
/* TBZ/NZ: ((S+A-P) >> 2) & 0x3fff. */ |
RELOC_NUMBER (R_AARCH64_P32_TSTBR14, 18) |
/* B.cond: ((S+A-P) >> 2) & 0x7ffff. */ |
RELOC_NUMBER (R_AARCH64_P32_CONDBR19, 19) |
/* B: ((S+A-P) >> 2) & 0x3ffffff. */ |
RELOC_NUMBER (R_AARCH64_P32_JUMP26, 20) |
/* BL: ((S+A-P) >> 2) & 0x3ffffff. */ |
RELOC_NUMBER (R_AARCH64_P32_CALL26, 21) |
RELOC_NUMBER (R_AARCH64_P32_GOT_LD_PREL19, 25) |
RELOC_NUMBER (R_AARCH64_P32_ADR_GOT_PAGE, 26) |
RELOC_NUMBER (R_AARCH64_P32_LD32_GOT_LO12_NC, 27) |
RELOC_NUMBER (R_AARCH64_P32_TLSGD_ADR_PAGE21, 81) |
RELOC_NUMBER (R_AARCH64_P32_TLSGD_ADD_LO12_NC, 82) |
RELOC_NUMBER (R_AARCH64_P32_TLSIE_ADR_GOTTPREL_PAGE21, 103) |
RELOC_NUMBER (R_AARCH64_P32_TLSIE_LD32_GOTTPREL_LO12_NC, 104) |
RELOC_NUMBER (R_AARCH64_P32_TLSIE_LD_GOTTPREL_PREL19, 105) |
RELOC_NUMBER (R_AARCH64_P32_TLSLE_MOVW_TPREL_G1, 106) |
RELOC_NUMBER (R_AARCH64_P32_TLSLE_MOVW_TPREL_G0, 107) |
RELOC_NUMBER (R_AARCH64_P32_TLSLE_MOVW_TPREL_G0_NC, 108) |
RELOC_NUMBER (R_AARCH64_P32_TLSLE_ADD_TPREL_HI12, 109) |
RELOC_NUMBER (R_AARCH64_P32_TLSLE_ADD_TPREL_LO12, 110) |
RELOC_NUMBER (R_AARCH64_P32_TLSLE_ADD_TPREL_LO12_NC, 111) |
RELOC_NUMBER (R_AARCH64_P32_TLSDESC_LD_PREL19, 122) |
RELOC_NUMBER (R_AARCH64_P32_TLSDESC_ADR_PREL21, 123) |
RELOC_NUMBER (R_AARCH64_P32_TLSDESC_ADR_PAGE21, 124) |
RELOC_NUMBER (R_AARCH64_P32_TLSDESC_LD32_LO12_NC, 125) |
RELOC_NUMBER (R_AARCH64_P32_TLSDESC_ADD_LO12_NC, 126) |
RELOC_NUMBER (R_AARCH64_P32_TLSDESC_CALL, 127) |
/* Dynamic relocations */ |
/* Copy symbol at runtime. */ |
RELOC_NUMBER (R_AARCH64_P32_COPY, 180) |
/* Create GOT entry. */ |
RELOC_NUMBER (R_AARCH64_P32_GLOB_DAT, 181) |
/* Create PLT entry. */ |
RELOC_NUMBER (R_AARCH64_P32_JUMP_SLOT, 182) |
/* Adjust by program base. */ |
RELOC_NUMBER (R_AARCH64_P32_RELATIVE, 183) |
RELOC_NUMBER (R_AARCH64_P32_TLS_DTPMOD, 184) |
RELOC_NUMBER (R_AARCH64_P32_TLS_DTPREL, 185) |
RELOC_NUMBER (R_AARCH64_P32_TLS_TPREL, 186) |
RELOC_NUMBER (R_AARCH64_P32_TLSDESC, 187) |
RELOC_NUMBER (R_AARCH64_P32_IRELATIVE, 188) |
RELOC_NUMBER (R_AARCH64_NULL, 256) /* No reloc */ |
/* Basic data relocations. */ |
/* .xword: (S+A) */ |
RELOC_NUMBER (R_AARCH64_ABS64, 257) |
/* .word: (S+A) */ |
RELOC_NUMBER (R_AARCH64_ABS32, 258) |
/* .half: (S+A) */ |
RELOC_NUMBER (R_AARCH64_ABS16, 259) |
/* .xword: (S+A-P) */ |
RELOC_NUMBER (R_AARCH64_PREL64, 260) |
/* .word: (S+A-P) */ |
RELOC_NUMBER (R_AARCH64_PREL32, 261) |
/* .half: (S+A-P) */ |
RELOC_NUMBER (R_AARCH64_PREL16, 262) |
/* Group relocations to create a 16, 32, 48 or 64 bit |
unsigned data or abs address inline. */ |
/* MOV[ZK]: ((S+A) >> 0) & 0xffff */ |
RELOC_NUMBER (R_AARCH64_MOVW_UABS_G0, 263) |
/* MOV[ZK]: ((S+A) >> 0) & 0xffff */ |
RELOC_NUMBER (R_AARCH64_MOVW_UABS_G0_NC, 264) |
/* MOV[ZK]: ((S+A) >> 16) & 0xffff */ |
RELOC_NUMBER (R_AARCH64_MOVW_UABS_G1, 265) |
/* MOV[ZK]: ((S+A) >> 16) & 0xffff */ |
RELOC_NUMBER (R_AARCH64_MOVW_UABS_G1_NC, 266) |
/* MOV[ZK]: ((S+A) >> 32) & 0xffff */ |
RELOC_NUMBER (R_AARCH64_MOVW_UABS_G2, 267) |
/* MOV[ZK]: ((S+A) >> 32) & 0xffff */ |
RELOC_NUMBER (R_AARCH64_MOVW_UABS_G2_NC, 268) |
/* MOV[ZK]: ((S+A) >> 48) & 0xffff */ |
RELOC_NUMBER (R_AARCH64_MOVW_UABS_G3, 269) |
/* Group relocations to create high part of a 16, 32, 48 or 64 bit |
signed data or abs address inline. Will change instruction |
to MOVN or MOVZ depending on sign of calculated value. */ |
/* MOV[ZN]: ((S+A) >> 0) & 0xffff */ |
RELOC_NUMBER (R_AARCH64_MOVW_SABS_G0, 270) |
/* MOV[ZN]: ((S+A) >> 16) & 0xffff */ |
RELOC_NUMBER (R_AARCH64_MOVW_SABS_G1, 271) |
/* MOV[ZN]: ((S+A) >> 32) & 0xffff */ |
RELOC_NUMBER (R_AARCH64_MOVW_SABS_G2, 272) |
/* Relocations to generate 19, 21 and 33 bit PC-relative load/store |
addresses: PG(x) is (x & ~0xfff). */ |
/* LD-lit: ((S+A-P) >> 2) & 0x7ffff */ |
RELOC_NUMBER (R_AARCH64_LD_PREL_LO19, 273) |
/* ADR: (S+A-P) & 0x1fffff */ |
RELOC_NUMBER (R_AARCH64_ADR_PREL_LO21, 274) |
/* ADRH: ((PG(S+A)-PG(P)) >> 12) & 0x1fffff */ |
RELOC_NUMBER (R_AARCH64_ADR_PREL_PG_HI21, 275) |
/* ADRH: ((PG(S+A)-PG(P)) >> 12) & 0x1fffff */ |
RELOC_NUMBER (R_AARCH64_ADR_PREL_PG_HI21_NC, 276) |
/* ADD: (S+A) & 0xfff */ |
RELOC_NUMBER (R_AARCH64_ADD_ABS_LO12_NC, 277) |
/* LD/ST8: (S+A) & 0xfff */ |
RELOC_NUMBER (R_AARCH64_LDST8_ABS_LO12_NC, 278) |
/* Relocations for control-flow instructions. */ |
/* TBZ/NZ: ((S+A-P) >> 2) & 0x3fff. */ |
RELOC_NUMBER (R_AARCH64_TSTBR14, 279) |
/* B.cond: ((S+A-P) >> 2) & 0x7ffff. */ |
RELOC_NUMBER (R_AARCH64_CONDBR19, 280) |
/* 281 unused */ |
/* B: ((S+A-P) >> 2) & 0x3ffffff. */ |
RELOC_NUMBER (R_AARCH64_JUMP26, 282) |
/* BL: ((S+A-P) >> 2) & 0x3ffffff. */ |
RELOC_NUMBER (R_AARCH64_CALL26, 283) |
/* LD/ST16: (S+A) & 0xffe */ |
RELOC_NUMBER (R_AARCH64_LDST16_ABS_LO12_NC, 284) |
/* LD/ST32: (S+A) & 0xffc */ |
RELOC_NUMBER (R_AARCH64_LDST32_ABS_LO12_NC, 285) |
/* LD/ST64: (S+A) & 0xff8 */ |
RELOC_NUMBER (R_AARCH64_LDST64_ABS_LO12_NC, 286) |
/* LD/ST128: (S+A) & 0xff0 */ |
RELOC_NUMBER (R_AARCH64_LDST128_ABS_LO12_NC, 299) |
RELOC_NUMBER (R_AARCH64_GOT_LD_PREL19, 309) |
RELOC_NUMBER (R_AARCH64_ADR_GOT_PAGE, 311) |
RELOC_NUMBER (R_AARCH64_LD64_GOT_LO12_NC, 312) |
RELOC_NUMBER (R_AARCH64_TLSGD_ADR_PAGE21, 513) |
RELOC_NUMBER (R_AARCH64_TLSGD_ADD_LO12_NC, 514) |
RELOC_NUMBER (R_AARCH64_TLSIE_MOVW_GOTTPREL_G1, 539) |
RELOC_NUMBER (R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC, 540) |
RELOC_NUMBER (R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21, 541) |
RELOC_NUMBER (R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC, 542) |
RELOC_NUMBER (R_AARCH64_TLSIE_LD_GOTTPREL_PREL19, 543) |
RELOC_NUMBER (R_AARCH64_TLSLE_MOVW_TPREL_G2, 544) |
RELOC_NUMBER (R_AARCH64_TLSLE_MOVW_TPREL_G1, 545) |
RELOC_NUMBER (R_AARCH64_TLSLE_MOVW_TPREL_G1_NC, 546) |
RELOC_NUMBER (R_AARCH64_TLSLE_MOVW_TPREL_G0, 547) |
RELOC_NUMBER (R_AARCH64_TLSLE_MOVW_TPREL_G0_NC, 548) |
RELOC_NUMBER (R_AARCH64_TLSLE_ADD_TPREL_HI12, 549) |
RELOC_NUMBER (R_AARCH64_TLSLE_ADD_TPREL_LO12, 550) |
RELOC_NUMBER (R_AARCH64_TLSLE_ADD_TPREL_LO12_NC, 551) |
RELOC_NUMBER (R_AARCH64_TLSDESC_LD_PREL19, 560) |
RELOC_NUMBER (R_AARCH64_TLSDESC_ADR_PREL21, 561) |
RELOC_NUMBER (R_AARCH64_TLSDESC_ADR_PAGE21, 562) |
RELOC_NUMBER (R_AARCH64_TLSDESC_LD64_LO12_NC, 563) |
RELOC_NUMBER (R_AARCH64_TLSDESC_ADD_LO12_NC, 564) |
RELOC_NUMBER (R_AARCH64_TLSDESC_OFF_G1, 565) |
RELOC_NUMBER (R_AARCH64_TLSDESC_OFF_G0_NC, 566) |
RELOC_NUMBER (R_AARCH64_TLSDESC_LDR, 567) |
RELOC_NUMBER (R_AARCH64_TLSDESC_ADD, 568) |
RELOC_NUMBER (R_AARCH64_TLSDESC_CALL, 569) |
/* Dynamic relocations */ |
/* Copy symbol at runtime. */ |
RELOC_NUMBER (R_AARCH64_COPY, 1024) |
/* Create GOT entry. */ |
RELOC_NUMBER (R_AARCH64_GLOB_DAT, 1025) |
/* Create PLT entry. */ |
RELOC_NUMBER (R_AARCH64_JUMP_SLOT, 1026) |
/* Adjust by program base. */ |
RELOC_NUMBER (R_AARCH64_RELATIVE, 1027) |
RELOC_NUMBER (R_AARCH64_TLS_DTPMOD64, 1028) |
RELOC_NUMBER (R_AARCH64_TLS_DTPREL64, 1029) |
RELOC_NUMBER (R_AARCH64_TLS_TPREL64, 1030) |
/* Aliasing relocs are guarded by RELOC_MACROS_GEN_FUNC |
so that readelf.c won't generate duplicated case |
statements. */ |
#ifndef RELOC_MACROS_GEN_FUNC |
RELOC_NUMBER (R_AARCH64_TLS_DTPMOD, 1028) |
RELOC_NUMBER (R_AARCH64_TLS_DTPREL, 1029) |
RELOC_NUMBER (R_AARCH64_TLS_TPREL, 1030) |
#endif |
RELOC_NUMBER (R_AARCH64_TLSDESC, 1031) |
RELOC_NUMBER (R_AARCH64_IRELATIVE, 1032) |
END_RELOC_NUMBERS (R_AARCH64_end) |
#endif /* _ELF_AARCH64_H */ |
/contrib/toolchain/binutils/include/elf/alpha.h |
---|
0,0 → 1,131 |
/* ALPHA ELF support for BFD. |
Copyright 1996, 1998, 2000, 2001, 2002, 2010 Free Software Foundation, Inc. |
By Eric Youngdale, <eric@aib.com>. No processor supplement available |
for this platform. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* This file holds definitions specific to the ALPHA ELF ABI. Note |
that most of this is not actually implemented by BFD. */ |
#ifndef _ELF_ALPHA_H |
#define _ELF_ALPHA_H |
/* Processor specific flags for the ELF header e_flags field. */ |
/* All addresses must be below 2GB. */ |
#define EF_ALPHA_32BIT 0x00000001 |
/* All relocations needed for relaxation with code movement are present. */ |
#define EF_ALPHA_CANRELAX 0x00000002 |
/* Processor specific section flags. */ |
/* This section must be in the global data area. */ |
#define SHF_ALPHA_GPREL 0x10000000 |
/* Section contains some sort of debugging information. The exact |
format is unspecified. It's probably ECOFF symbols. */ |
#define SHT_ALPHA_DEBUG 0x70000001 |
/* Section contains register usage information. */ |
#define SHT_ALPHA_REGINFO 0x70000002 |
/* A section of type SHT_MIPS_REGINFO contains the following |
structure. */ |
typedef struct |
{ |
/* Mask of general purpose registers used. */ |
unsigned long ri_gprmask; |
/* Mask of co-processor registers used. */ |
unsigned long ri_cprmask[4]; |
/* GP register value for this object file. */ |
long ri_gp_value; |
} Elf64_RegInfo; |
/* Special values for the st_other field in the symbol table. */ |
#define STO_ALPHA_NOPV 0x80 |
#define STO_ALPHA_STD_GPLOAD 0x88 |
/* Special values for Elf64_Dyn tag. */ |
#define DT_ALPHA_PLTRO DT_LOPROC |
#include "elf/reloc-macros.h" |
/* Alpha relocs. */ |
START_RELOC_NUMBERS (elf_alpha_reloc_type) |
RELOC_NUMBER (R_ALPHA_NONE, 0) /* No reloc */ |
RELOC_NUMBER (R_ALPHA_REFLONG, 1) /* Direct 32 bit */ |
RELOC_NUMBER (R_ALPHA_REFQUAD, 2) /* Direct 64 bit */ |
RELOC_NUMBER (R_ALPHA_GPREL32, 3) /* GP relative 32 bit */ |
RELOC_NUMBER (R_ALPHA_LITERAL, 4) /* GP relative 16 bit w/optimization */ |
RELOC_NUMBER (R_ALPHA_LITUSE, 5) /* Optimization hint for LITERAL */ |
RELOC_NUMBER (R_ALPHA_GPDISP, 6) /* Add displacement to GP */ |
RELOC_NUMBER (R_ALPHA_BRADDR, 7) /* PC+4 relative 23 bit shifted */ |
RELOC_NUMBER (R_ALPHA_HINT, 8) /* PC+4 relative 16 bit shifted */ |
RELOC_NUMBER (R_ALPHA_SREL16, 9) /* PC relative 16 bit */ |
RELOC_NUMBER (R_ALPHA_SREL32, 10) /* PC relative 32 bit */ |
RELOC_NUMBER (R_ALPHA_SREL64, 11) /* PC relative 64 bit */ |
/* Skip 12 - 16; deprecated ECOFF relocs. */ |
RELOC_NUMBER (R_ALPHA_GPRELHIGH, 17) /* GP relative 32 bit, high 16 bits */ |
RELOC_NUMBER (R_ALPHA_GPRELLOW, 18) /* GP relative 32 bit, low 16 bits */ |
RELOC_NUMBER (R_ALPHA_GPREL16, 19) /* GP relative 16 bit */ |
/* Skip 20 - 23; deprecated ECOFF relocs. */ |
/* These relocations are specific to shared libraries. */ |
RELOC_NUMBER (R_ALPHA_COPY, 24) /* Copy symbol at runtime */ |
RELOC_NUMBER (R_ALPHA_GLOB_DAT, 25) /* Create GOT entry */ |
RELOC_NUMBER (R_ALPHA_JMP_SLOT, 26) /* Create PLT entry */ |
RELOC_NUMBER (R_ALPHA_RELATIVE, 27) /* Adjust by program base */ |
/* Like BRADDR, but assert that the source and target object file |
share the same GP value, and adjust the target address for |
STO_ALPHA_STD_GPLOAD. */ |
RELOC_NUMBER (R_ALPHA_BRSGP, 28) |
/* Thread-Local Storage. */ |
RELOC_NUMBER (R_ALPHA_TLSGD, 29) |
RELOC_NUMBER (R_ALPHA_TLSLDM, 30) |
RELOC_NUMBER (R_ALPHA_DTPMOD64, 31) |
RELOC_NUMBER (R_ALPHA_GOTDTPREL, 32) |
RELOC_NUMBER (R_ALPHA_DTPREL64, 33) |
RELOC_NUMBER (R_ALPHA_DTPRELHI, 34) |
RELOC_NUMBER (R_ALPHA_DTPRELLO, 35) |
RELOC_NUMBER (R_ALPHA_DTPREL16, 36) |
RELOC_NUMBER (R_ALPHA_GOTTPREL, 37) |
RELOC_NUMBER (R_ALPHA_TPREL64, 38) |
RELOC_NUMBER (R_ALPHA_TPRELHI, 39) |
RELOC_NUMBER (R_ALPHA_TPRELLO, 40) |
RELOC_NUMBER (R_ALPHA_TPREL16, 41) |
END_RELOC_NUMBERS (R_ALPHA_max) |
#define LITUSE_ALPHA_ADDR 0 |
#define LITUSE_ALPHA_BASE 1 |
#define LITUSE_ALPHA_BYTOFF 2 |
#define LITUSE_ALPHA_JSR 3 |
#define LITUSE_ALPHA_TLSGD 4 |
#define LITUSE_ALPHA_TLSLDM 5 |
#define LITUSE_ALPHA_JSRDIRECT 6 |
#endif /* _ELF_ALPHA_H */ |
/contrib/toolchain/binutils/include/elf/arc.h |
---|
0,0 → 1,57 |
/* ARC ELF support for BFD. |
Copyright 1995, 1997, 1998, 2000, 2001, 2010 Free Software Foundation, Inc. |
Contributed by Doug Evans, (dje@cygnus.com) |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* This file holds definitions specific to the ARC ELF ABI. */ |
#ifndef _ELF_ARC_H |
#define _ELF_ARC_H |
#include "elf/reloc-macros.h" |
/* Relocations. */ |
START_RELOC_NUMBERS (elf_arc_reloc_type) |
RELOC_NUMBER (R_ARC_NONE, 0) |
RELOC_NUMBER (R_ARC_32, 1) |
RELOC_NUMBER (R_ARC_B26, 2) |
RELOC_NUMBER (R_ARC_B22_PCREL, 3) |
END_RELOC_NUMBERS (R_ARC_max) |
/* Processor specific flags for the ELF header e_flags field. */ |
/* Four bit ARC machine type field. */ |
#define EF_ARC_MACH 0x0000000f |
/* Various CPU types. */ |
#define E_ARC_MACH_ARC5 0 |
#define E_ARC_MACH_ARC6 1 |
#define E_ARC_MACH_ARC7 2 |
#define E_ARC_MACH_ARC8 3 |
/* Leave bits 0xf0 alone in case we ever have more than 16 cpu types. */ |
/* File contains position independent code. */ |
#define EF_ARC_PIC 0x00000100 |
#endif /* _ELF_ARC_H */ |
/contrib/toolchain/binutils/include/elf/arm.h |
---|
0,0 → 1,344 |
/* ARM ELF support for BFD. |
Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2009, 2010 |
Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_ARM_H |
#define _ELF_ARM_H |
#include "elf/reloc-macros.h" |
/* Processor specific flags for the ELF header e_flags field. */ |
#define EF_ARM_RELEXEC 0x01 |
#define EF_ARM_HASENTRY 0x02 |
#define EF_ARM_INTERWORK 0x04 |
#define EF_ARM_APCS_26 0x08 |
#define EF_ARM_APCS_FLOAT 0x10 |
#define EF_ARM_PIC 0x20 |
#define EF_ARM_ALIGN8 0x40 /* 8-bit structure alignment is in use. */ |
#define EF_ARM_NEW_ABI 0x80 |
#define EF_ARM_OLD_ABI 0x100 |
#define EF_ARM_SOFT_FLOAT 0x200 |
#define EF_ARM_VFP_FLOAT 0x400 |
#define EF_ARM_MAVERICK_FLOAT 0x800 |
/* Frame unwind information */ |
#define PT_ARM_EXIDX (PT_LOPROC + 1) |
/* Other constants defined in the ARM ELF spec. version B-01. */ |
#define EF_ARM_SYMSARESORTED 0x04 /* NB conflicts with EF_INTERWORK. */ |
#define EF_ARM_DYNSYMSUSESEGIDX 0x08 /* NB conflicts with EF_APCS26. */ |
#define EF_ARM_MAPSYMSFIRST 0x10 /* NB conflicts with EF_APCS_FLOAT. */ |
#define EF_ARM_EABIMASK 0xFF000000 |
/* New constants defined in the ARM ELF spec. version XXX. |
Only valid in conjunction with EF_ARM_EABI_VER5. */ |
#define EF_ARM_ABI_FLOAT_SOFT 0x200 /* NB conflicts with EF_ARM_SOFT_FLOAT. */ |
#define EF_ARM_ABI_FLOAT_HARD 0x400 /* NB conflicts with EF_ARM_VFP_FLOAT. */ |
/* Constants defined in AAELF. */ |
#define EF_ARM_BE8 0x00800000 |
#define EF_ARM_LE8 0x00400000 |
#define EF_ARM_EABI_VERSION(flags) ((flags) & EF_ARM_EABIMASK) |
#define EF_ARM_EABI_UNKNOWN 0x00000000 |
#define EF_ARM_EABI_VER1 0x01000000 |
#define EF_ARM_EABI_VER2 0x02000000 |
#define EF_ARM_EABI_VER3 0x03000000 |
#define EF_ARM_EABI_VER4 0x04000000 |
#define EF_ARM_EABI_VER5 0x05000000 |
/* Local aliases for some flags to match names used by COFF port. */ |
#define F_INTERWORK EF_ARM_INTERWORK |
#define F_APCS26 EF_ARM_APCS_26 |
#define F_APCS_FLOAT EF_ARM_APCS_FLOAT |
#define F_PIC EF_ARM_PIC |
#define F_SOFT_FLOAT EF_ARM_SOFT_FLOAT |
#define F_VFP_FLOAT EF_ARM_VFP_FLOAT |
/* Additional symbol types for Thumb. */ |
#define STT_ARM_TFUNC STT_LOPROC /* A Thumb function. */ |
#define STT_ARM_16BIT STT_HIPROC /* A Thumb label. */ |
/* Additional section types. */ |
#define SHT_ARM_EXIDX 0x70000001 /* Section holds ARM unwind info. */ |
#define SHT_ARM_PREEMPTMAP 0x70000002 /* Section pre-emption details. */ |
#define SHT_ARM_ATTRIBUTES 0x70000003 /* Section holds attributes. */ |
#define SHT_ARM_DEBUGOVERLAY 0x70000004 /* Section holds overlay debug info. */ |
#define SHT_ARM_OVERLAYSECTION 0x70000005 /* Section holds GDB and overlay integration info. */ |
/* ARM-specific values for sh_flags. */ |
#define SHF_ENTRYSECT 0x10000000 /* Section contains an entry point. */ |
#define SHF_COMDEF 0x80000000 /* Section may be multiply defined in the input to a link step. */ |
/* ARM-specific program header flags. */ |
#define PF_ARM_SB 0x10000000 /* Segment contains the location addressed by the static base. */ |
#define PF_ARM_PI 0x20000000 /* Segment is position-independent. */ |
#define PF_ARM_ABS 0x40000000 /* Segment must be loaded at its base address. */ |
/* Values for the Tag_CPU_arch EABI attribute. */ |
#define TAG_CPU_ARCH_PRE_V4 0 |
#define TAG_CPU_ARCH_V4 1 |
#define TAG_CPU_ARCH_V4T 2 |
#define TAG_CPU_ARCH_V5T 3 |
#define TAG_CPU_ARCH_V5TE 4 |
#define TAG_CPU_ARCH_V5TEJ 5 |
#define TAG_CPU_ARCH_V6 6 |
#define TAG_CPU_ARCH_V6KZ 7 |
#define TAG_CPU_ARCH_V6T2 8 |
#define TAG_CPU_ARCH_V6K 9 |
#define TAG_CPU_ARCH_V7 10 |
#define TAG_CPU_ARCH_V6_M 11 |
#define TAG_CPU_ARCH_V6S_M 12 |
#define TAG_CPU_ARCH_V7E_M 13 |
#define TAG_CPU_ARCH_V8 14 |
#define MAX_TAG_CPU_ARCH 14 |
/* Pseudo-architecture to allow objects to be compatible with the subset of |
armv4t and armv6-m. This value should never be stored in object files. */ |
#define TAG_CPU_ARCH_V4T_PLUS_V6_M (MAX_TAG_CPU_ARCH + 1) |
/* Relocation types. */ |
START_RELOC_NUMBERS (elf_arm_reloc_type) |
/* AAELF official names and numbers. */ |
RELOC_NUMBER (R_ARM_NONE, 0) |
RELOC_NUMBER (R_ARM_PC24, 1) /* deprecated */ |
RELOC_NUMBER (R_ARM_ABS32, 2) |
RELOC_NUMBER (R_ARM_REL32, 3) |
RELOC_NUMBER (R_ARM_LDR_PC_G0, 4) |
RELOC_NUMBER (R_ARM_ABS16, 5) |
RELOC_NUMBER (R_ARM_ABS12, 6) |
RELOC_NUMBER (R_ARM_THM_ABS5, 7) |
RELOC_NUMBER (R_ARM_ABS8, 8) |
RELOC_NUMBER (R_ARM_SBREL32, 9) |
RELOC_NUMBER (R_ARM_THM_CALL, 10) |
RELOC_NUMBER (R_ARM_THM_PC8, 11) |
RELOC_NUMBER (R_ARM_BREL_ADJ, 12) |
RELOC_NUMBER (R_ARM_TLS_DESC, 13) |
RELOC_NUMBER (R_ARM_THM_SWI8, 14) /* obsolete */ |
RELOC_NUMBER (R_ARM_XPC25, 15) /* obsolete */ |
RELOC_NUMBER (R_ARM_THM_XPC22, 16) /* obsolete */ |
RELOC_NUMBER (R_ARM_TLS_DTPMOD32, 17) |
RELOC_NUMBER (R_ARM_TLS_DTPOFF32, 18) |
RELOC_NUMBER (R_ARM_TLS_TPOFF32, 19) |
RELOC_NUMBER (R_ARM_COPY, 20) /* Copy symbol at runtime. */ |
RELOC_NUMBER (R_ARM_GLOB_DAT, 21) /* Create GOT entry. */ |
RELOC_NUMBER (R_ARM_JUMP_SLOT, 22) /* Create PLT entry. */ |
RELOC_NUMBER (R_ARM_RELATIVE, 23) /* Adjust by program base. */ |
RELOC_NUMBER (R_ARM_GOTOFF32, 24) /* 32 bit offset to GOT. */ |
RELOC_NUMBER (R_ARM_BASE_PREL, 25) /* 32 bit PC relative offset to GOT. */ |
RELOC_NUMBER (R_ARM_GOT_BREL, 26) /* 32 bit GOT entry. */ |
RELOC_NUMBER (R_ARM_PLT32, 27) /* deprecated - 32 bit PLT address. */ |
RELOC_NUMBER (R_ARM_CALL, 28) |
RELOC_NUMBER (R_ARM_JUMP24, 29) |
RELOC_NUMBER (R_ARM_THM_JUMP24, 30) |
RELOC_NUMBER (R_ARM_BASE_ABS, 31) |
RELOC_NUMBER (R_ARM_ALU_PCREL7_0, 32) /* obsolete */ |
RELOC_NUMBER (R_ARM_ALU_PCREL15_8, 33) /* obsolete */ |
RELOC_NUMBER (R_ARM_ALU_PCREL23_15, 34) /* obsolete */ |
RELOC_NUMBER (R_ARM_LDR_SBREL_11_0, 35) /* deprecated, should have _NC suffix */ |
RELOC_NUMBER (R_ARM_ALU_SBREL_19_12, 36) /* deprecated, should have _NC suffix */ |
RELOC_NUMBER (R_ARM_ALU_SBREL_27_20, 37) /* deprecated, should have _CK suffix */ |
RELOC_NUMBER (R_ARM_TARGET1, 38) |
RELOC_NUMBER (R_ARM_SBREL31, 39) /* deprecated */ |
RELOC_NUMBER (R_ARM_V4BX, 40) |
RELOC_NUMBER (R_ARM_TARGET2, 41) |
RELOC_NUMBER (R_ARM_PREL31, 42) |
RELOC_NUMBER (R_ARM_MOVW_ABS_NC, 43) |
RELOC_NUMBER (R_ARM_MOVT_ABS, 44) |
RELOC_NUMBER (R_ARM_MOVW_PREL_NC, 45) |
RELOC_NUMBER (R_ARM_MOVT_PREL, 46) |
RELOC_NUMBER (R_ARM_THM_MOVW_ABS_NC, 47) |
RELOC_NUMBER (R_ARM_THM_MOVT_ABS, 48) |
RELOC_NUMBER (R_ARM_THM_MOVW_PREL_NC, 49) |
RELOC_NUMBER (R_ARM_THM_MOVT_PREL, 50) |
RELOC_NUMBER (R_ARM_THM_JUMP19, 51) |
RELOC_NUMBER (R_ARM_THM_JUMP6, 52) |
RELOC_NUMBER (R_ARM_THM_ALU_PREL_11_0, 53) |
RELOC_NUMBER (R_ARM_THM_PC12, 54) |
RELOC_NUMBER (R_ARM_ABS32_NOI, 55) |
RELOC_NUMBER (R_ARM_REL32_NOI, 56) |
RELOC_NUMBER (R_ARM_ALU_PC_G0_NC, 57) |
RELOC_NUMBER (R_ARM_ALU_PC_G0, 58) |
RELOC_NUMBER (R_ARM_ALU_PC_G1_NC, 59) |
RELOC_NUMBER (R_ARM_ALU_PC_G1, 60) |
RELOC_NUMBER (R_ARM_ALU_PC_G2, 61) |
RELOC_NUMBER (R_ARM_LDR_PC_G1, 62) |
RELOC_NUMBER (R_ARM_LDR_PC_G2, 63) |
RELOC_NUMBER (R_ARM_LDRS_PC_G0, 64) |
RELOC_NUMBER (R_ARM_LDRS_PC_G1, 65) |
RELOC_NUMBER (R_ARM_LDRS_PC_G2, 66) |
RELOC_NUMBER (R_ARM_LDC_PC_G0, 67) |
RELOC_NUMBER (R_ARM_LDC_PC_G1, 68) |
RELOC_NUMBER (R_ARM_LDC_PC_G2, 69) |
RELOC_NUMBER (R_ARM_ALU_SB_G0_NC, 70) |
RELOC_NUMBER (R_ARM_ALU_SB_G0, 71) |
RELOC_NUMBER (R_ARM_ALU_SB_G1_NC, 72) |
RELOC_NUMBER (R_ARM_ALU_SB_G1, 73) |
RELOC_NUMBER (R_ARM_ALU_SB_G2, 74) |
RELOC_NUMBER (R_ARM_LDR_SB_G0, 75) |
RELOC_NUMBER (R_ARM_LDR_SB_G1, 76) |
RELOC_NUMBER (R_ARM_LDR_SB_G2, 77) |
RELOC_NUMBER (R_ARM_LDRS_SB_G0, 78) |
RELOC_NUMBER (R_ARM_LDRS_SB_G1, 79) |
RELOC_NUMBER (R_ARM_LDRS_SB_G2, 80) |
RELOC_NUMBER (R_ARM_LDC_SB_G0, 81) |
RELOC_NUMBER (R_ARM_LDC_SB_G1, 82) |
RELOC_NUMBER (R_ARM_LDC_SB_G2, 83) |
RELOC_NUMBER (R_ARM_MOVW_BREL_NC, 84) |
RELOC_NUMBER (R_ARM_MOVT_BREL, 85) |
RELOC_NUMBER (R_ARM_MOVW_BREL, 86) |
RELOC_NUMBER (R_ARM_THM_MOVW_BREL_NC, 87) |
RELOC_NUMBER (R_ARM_THM_MOVT_BREL, 88) |
RELOC_NUMBER (R_ARM_THM_MOVW_BREL, 89) |
RELOC_NUMBER (R_ARM_TLS_GOTDESC, 90) |
RELOC_NUMBER (R_ARM_TLS_CALL, 91) |
RELOC_NUMBER (R_ARM_TLS_DESCSEQ, 92) |
RELOC_NUMBER (R_ARM_THM_TLS_CALL, 93) |
RELOC_NUMBER (R_ARM_PLT32_ABS, 94) |
RELOC_NUMBER (R_ARM_GOT_ABS, 95) |
RELOC_NUMBER (R_ARM_GOT_PREL, 96) |
RELOC_NUMBER (R_ARM_GOT_BREL12, 97) |
RELOC_NUMBER (R_ARM_GOTOFF12, 98) |
RELOC_NUMBER (R_ARM_GOTRELAX, 99) |
RELOC_NUMBER (R_ARM_GNU_VTENTRY, 100) /* deprecated - old C++ abi */ |
RELOC_NUMBER (R_ARM_GNU_VTINHERIT, 101) /* deprecated - old C++ abi */ |
RELOC_NUMBER (R_ARM_THM_JUMP11, 102) |
RELOC_NUMBER (R_ARM_THM_JUMP8, 103) |
RELOC_NUMBER (R_ARM_TLS_GD32, 104) |
RELOC_NUMBER (R_ARM_TLS_LDM32, 105) |
RELOC_NUMBER (R_ARM_TLS_LDO32, 106) |
RELOC_NUMBER (R_ARM_TLS_IE32, 107) |
RELOC_NUMBER (R_ARM_TLS_LE32, 108) |
RELOC_NUMBER (R_ARM_TLS_LDO12, 109) |
RELOC_NUMBER (R_ARM_TLS_LE12, 110) |
RELOC_NUMBER (R_ARM_TLS_IE12GP, 111) |
/* 112 - 127 private range */ |
RELOC_NUMBER (R_ARM_ME_TOO, 128) /* obsolete */ |
RELOC_NUMBER (R_ARM_THM_TLS_DESCSEQ ,129) |
RELOC_NUMBER (R_ARM_IRELATIVE, 160) |
/* Extensions? R=read-only? */ |
RELOC_NUMBER (R_ARM_RXPC25, 249) |
RELOC_NUMBER (R_ARM_RSBREL32, 250) |
RELOC_NUMBER (R_ARM_THM_RPC22, 251) |
RELOC_NUMBER (R_ARM_RREL32, 252) |
RELOC_NUMBER (R_ARM_RABS32, 253) |
RELOC_NUMBER (R_ARM_RPC24, 254) |
RELOC_NUMBER (R_ARM_RBASE, 255) |
/* Unofficial names for some of the relocs. */ |
FAKE_RELOC (R_ARM_GOTOFF, R_ARM_GOTOFF32) /* 32 bit offset to GOT. */ |
FAKE_RELOC (R_ARM_THM_PC22, R_ARM_THM_CALL) |
FAKE_RELOC (R_ARM_THM_PC11, R_ARM_THM_JUMP11) |
FAKE_RELOC (R_ARM_THM_PC9, R_ARM_THM_JUMP8) |
/* Relocs with both a different name, and (apparently) different meaning in |
GNU usage. */ |
FAKE_RELOC (R_ARM_GOTPC, R_ARM_BASE_PREL) /* 32 bit PC relative offset to GOT. */ |
FAKE_RELOC (R_ARM_GOT32, R_ARM_GOT_BREL) /* 32 bit GOT entry. */ |
FAKE_RELOC (R_ARM_ROSEGREL32, R_ARM_SBREL31) /* ??? */ |
FAKE_RELOC (R_ARM_AMP_VCALL9, R_ARM_BREL_ADJ) /* Thumb-something. Not used. */ |
END_RELOC_NUMBERS (R_ARM_max = 256) |
#ifdef BFD_ARCH_SIZE |
/* EABI object attributes. */ |
enum |
{ |
/* 0-3 are generic. */ |
Tag_CPU_raw_name = 4, |
Tag_CPU_name, |
Tag_CPU_arch, |
Tag_CPU_arch_profile, |
Tag_ARM_ISA_use, |
Tag_THUMB_ISA_use, |
Tag_FP_arch, |
Tag_WMMX_arch, |
Tag_Advanced_SIMD_arch, |
Tag_PCS_config, |
Tag_ABI_PCS_R9_use, |
Tag_ABI_PCS_RW_data, |
Tag_ABI_PCS_RO_data, |
Tag_ABI_PCS_GOT_use, |
Tag_ABI_PCS_wchar_t, |
Tag_ABI_FP_rounding, |
Tag_ABI_FP_denormal, |
Tag_ABI_FP_exceptions, |
Tag_ABI_FP_user_exceptions, |
Tag_ABI_FP_number_model, |
Tag_ABI_align_needed, |
Tag_ABI_align_preserved, |
Tag_ABI_enum_size, |
Tag_ABI_HardFP_use, |
Tag_ABI_VFP_args, |
Tag_ABI_WMMX_args, |
Tag_ABI_optimization_goals, |
Tag_ABI_FP_optimization_goals, |
/* 32 is generic (Tag_compatibility). */ |
Tag_undefined33 = 33, |
Tag_CPU_unaligned_access, |
Tag_undefined35, |
Tag_FP_HP_extension, |
Tag_undefined37, |
Tag_ABI_FP_16bit_format, |
Tag_undefined39, |
Tag_undefined40, |
Tag_undefined41, |
Tag_MPextension_use, |
Tag_undefined_43, |
Tag_DIV_use, |
Tag_nodefaults = 64, |
Tag_also_compatible_with, |
Tag_T2EE_use, |
Tag_conformance, |
Tag_Virtualization_use, |
Tag_undefined69, |
Tag_MPextension_use_legacy, |
/* The following tags are legacy names for other tags. */ |
Tag_VFP_arch = Tag_FP_arch, |
Tag_ABI_align8_needed = Tag_ABI_align_needed, |
Tag_ABI_align8_preserved = Tag_ABI_align_preserved, |
Tag_VFP_HP_extension = Tag_FP_HP_extension |
}; |
#endif |
/* The name of the note section used to identify arm variants. */ |
#define ARM_NOTE_SECTION ".note.gnu.arm.ident" |
/* Special section names. */ |
#define ELF_STRING_ARM_unwind ".ARM.exidx" |
#define ELF_STRING_ARM_unwind_info ".ARM.extab" |
#define ELF_STRING_ARM_unwind_once ".gnu.linkonce.armexidx." |
#define ELF_STRING_ARM_unwind_info_once ".gnu.linkonce.armextab." |
enum arm_st_branch_type { |
ST_BRANCH_TO_ARM, |
ST_BRANCH_TO_THUMB, |
ST_BRANCH_LONG, |
ST_BRANCH_UNKNOWN |
}; |
#define ARM_SYM_BRANCH_TYPE(SYM) \ |
((enum arm_st_branch_type) (SYM)->st_target_internal) |
#endif /* _ELF_ARM_H */ |
/contrib/toolchain/binutils/include/elf/avr.h |
---|
0,0 → 1,86 |
/* AVR ELF support for BFD. |
Copyright 1999, 2000, 2004, 2006, 2010, 2012 |
Free Software Foundation, Inc. |
Contributed by Denis Chertykov <denisc@overta.ru> |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_AVR_H |
#define _ELF_AVR_H |
#include "elf/reloc-macros.h" |
/* Processor specific flags for the ELF header e_flags field. */ |
#define EF_AVR_MACH 0x7F |
/* If bit #7 is set, it is assumed that the elf file uses local symbols |
as reference for the relocations so that linker relaxation is possible. */ |
#define EF_AVR_LINKRELAX_PREPARED 0x80 |
#define E_AVR_MACH_AVR1 1 |
#define E_AVR_MACH_AVR2 2 |
#define E_AVR_MACH_AVR25 25 |
#define E_AVR_MACH_AVR3 3 |
#define E_AVR_MACH_AVR31 31 |
#define E_AVR_MACH_AVR35 35 |
#define E_AVR_MACH_AVR4 4 |
#define E_AVR_MACH_AVR5 5 |
#define E_AVR_MACH_AVR51 51 |
#define E_AVR_MACH_AVR6 6 |
#define E_AVR_MACH_XMEGA1 101 |
#define E_AVR_MACH_XMEGA2 102 |
#define E_AVR_MACH_XMEGA3 103 |
#define E_AVR_MACH_XMEGA4 104 |
#define E_AVR_MACH_XMEGA5 105 |
#define E_AVR_MACH_XMEGA6 106 |
#define E_AVR_MACH_XMEGA7 107 |
/* Relocations. */ |
START_RELOC_NUMBERS (elf_avr_reloc_type) |
RELOC_NUMBER (R_AVR_NONE, 0) |
RELOC_NUMBER (R_AVR_32, 1) |
RELOC_NUMBER (R_AVR_7_PCREL, 2) |
RELOC_NUMBER (R_AVR_13_PCREL, 3) |
RELOC_NUMBER (R_AVR_16, 4) |
RELOC_NUMBER (R_AVR_16_PM, 5) |
RELOC_NUMBER (R_AVR_LO8_LDI, 6) |
RELOC_NUMBER (R_AVR_HI8_LDI, 7) |
RELOC_NUMBER (R_AVR_HH8_LDI, 8) |
RELOC_NUMBER (R_AVR_LO8_LDI_NEG, 9) |
RELOC_NUMBER (R_AVR_HI8_LDI_NEG, 10) |
RELOC_NUMBER (R_AVR_HH8_LDI_NEG, 11) |
RELOC_NUMBER (R_AVR_LO8_LDI_PM, 12) |
RELOC_NUMBER (R_AVR_HI8_LDI_PM, 13) |
RELOC_NUMBER (R_AVR_HH8_LDI_PM, 14) |
RELOC_NUMBER (R_AVR_LO8_LDI_PM_NEG, 15) |
RELOC_NUMBER (R_AVR_HI8_LDI_PM_NEG, 16) |
RELOC_NUMBER (R_AVR_HH8_LDI_PM_NEG, 17) |
RELOC_NUMBER (R_AVR_CALL, 18) |
RELOC_NUMBER (R_AVR_LDI, 19) |
RELOC_NUMBER (R_AVR_6, 20) |
RELOC_NUMBER (R_AVR_6_ADIW, 21) |
RELOC_NUMBER (R_AVR_MS8_LDI, 22) |
RELOC_NUMBER (R_AVR_MS8_LDI_NEG, 23) |
RELOC_NUMBER (R_AVR_LO8_LDI_GS, 24) |
RELOC_NUMBER (R_AVR_HI8_LDI_GS, 25) |
RELOC_NUMBER (R_AVR_8, 26) |
RELOC_NUMBER (R_AVR_8_LO8, 27) |
RELOC_NUMBER (R_AVR_8_HI8, 28) |
RELOC_NUMBER (R_AVR_8_HLO8, 29) |
END_RELOC_NUMBERS (R_AVR_max) |
#endif /* _ELF_AVR_H */ |
/contrib/toolchain/binutils/include/elf/bfin.h |
---|
0,0 → 1,95 |
/* Blackfin ELF support for BFD. |
Copyright (C) 2005, 2006, 2009, 2010 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_BFIN_H |
#define _ELF_BFIN_H |
#include "elf/reloc-macros.h" |
START_RELOC_NUMBERS (elf_bfin_reloc_type) |
RELOC_NUMBER (R_BFIN_UNUSED0, 0x00) /* relocation type 0 is not defined */ |
RELOC_NUMBER (R_BFIN_PCREL5M2, 0x01) /* LSETUP part a */ |
RELOC_NUMBER (R_BFIN_UNUSED1, 0x02) /* relocation type 2 is not defined */ |
RELOC_NUMBER (R_BFIN_PCREL10, 0x03) /* type 3, 0x00) if cc jump <target> */ |
RELOC_NUMBER (R_BFIN_PCREL12_JUMP, 0x04) /* type 4, 0x00) jump <target> */ |
RELOC_NUMBER (R_BFIN_RIMM16, 0x05) /* type 0x5, 0x00) rN = <target> */ |
RELOC_NUMBER (R_BFIN_LUIMM16, 0x06) /* # 0x6, 0x00) preg.l=<target> Load imm 16 to lower half */ |
RELOC_NUMBER (R_BFIN_HUIMM16, 0x07) /* # 0x7, 0x00) preg.h=<target> Load imm 16 to upper half */ |
RELOC_NUMBER (R_BFIN_PCREL12_JUMP_S, 0x08) /* # 0x8 jump.s <target> */ |
RELOC_NUMBER (R_BFIN_PCREL24_JUMP_X, 0x09) /* # 0x9 jump.x <target> */ |
RELOC_NUMBER (R_BFIN_PCREL24, 0x0a) /* # 0xa call <target> , 0x00) not expandable */ |
RELOC_NUMBER (R_BFIN_UNUSEDB, 0x0b) /* # 0xb not generated */ |
RELOC_NUMBER (R_BFIN_UNUSEDC, 0x0c) /* # 0xc not used */ |
RELOC_NUMBER (R_BFIN_PCREL24_JUMP_L, 0x0d) /* 0xd jump.l <target> */ |
RELOC_NUMBER (R_BFIN_PCREL24_CALL_X, 0x0e) /* 0xE, 0x00) call.x <target> if <target> is above 24 bit limit call through P1 */ |
RELOC_NUMBER (R_BFIN_VAR_EQ_SYMB, 0x0f) /* 0xf, 0x00) linker should treat it same as 0x12 */ |
RELOC_NUMBER (R_BFIN_BYTE_DATA, 0x10) /* 0x10, 0x00) .byte var = symbol */ |
RELOC_NUMBER (R_BFIN_BYTE2_DATA, 0x11) /* 0x11, 0x00) .byte2 var = symbol */ |
RELOC_NUMBER (R_BFIN_BYTE4_DATA, 0x12) /* 0x12, 0x00) .byte4 var = symbol and .var var=symbol */ |
RELOC_NUMBER (R_BFIN_PCREL11, 0x13) /* 0x13, 0x00) lsetup part b */ |
RELOC_NUMBER (R_BFIN_GOT17M4, 0x14) |
RELOC_NUMBER (R_BFIN_GOTHI, 0x15) |
RELOC_NUMBER (R_BFIN_GOTLO, 0x16) |
RELOC_NUMBER (R_BFIN_FUNCDESC, 0x17) |
RELOC_NUMBER (R_BFIN_FUNCDESC_GOT17M4, 0x18) |
RELOC_NUMBER (R_BFIN_FUNCDESC_GOTHI, 0x19) |
RELOC_NUMBER (R_BFIN_FUNCDESC_GOTLO, 0x1a) |
RELOC_NUMBER (R_BFIN_FUNCDESC_VALUE, 0x1b) |
RELOC_NUMBER (R_BFIN_FUNCDESC_GOTOFF17M4, 0x1c) |
RELOC_NUMBER (R_BFIN_FUNCDESC_GOTOFFHI, 0x1d) |
RELOC_NUMBER (R_BFIN_FUNCDESC_GOTOFFLO, 0x1e) |
RELOC_NUMBER (R_BFIN_GOTOFF17M4, 0x1f) |
RELOC_NUMBER (R_BFIN_GOTOFFHI, 0x20) |
RELOC_NUMBER (R_BFIN_GOTOFFLO, 0x21) |
RELOC_NUMBER (R_BFIN_PUSH, 0xE0) |
RELOC_NUMBER (R_BFIN_CONST, 0xE1) |
RELOC_NUMBER (R_BFIN_ADD, 0xE2) |
RELOC_NUMBER (R_BFIN_SUB, 0xE3) |
RELOC_NUMBER (R_BFIN_MULT, 0xE4) |
RELOC_NUMBER (R_BFIN_DIV, 0xE5) |
RELOC_NUMBER (R_BFIN_MOD, 0xE6) |
RELOC_NUMBER (R_BFIN_LSHIFT, 0xE7) |
RELOC_NUMBER (R_BFIN_RSHIFT, 0xE8) |
RELOC_NUMBER (R_BFIN_AND, 0xE9) |
RELOC_NUMBER (R_BFIN_OR, 0xEA) |
RELOC_NUMBER (R_BFIN_XOR, 0xEB) |
RELOC_NUMBER (R_BFIN_LAND, 0xEC) |
RELOC_NUMBER (R_BFIN_LOR, 0xED) |
RELOC_NUMBER (R_BFIN_LEN, 0xEE) |
RELOC_NUMBER (R_BFIN_NEG, 0xEF) |
RELOC_NUMBER (R_BFIN_COMP, 0xF0) |
RELOC_NUMBER (R_BFIN_PAGE, 0xF1) |
RELOC_NUMBER (R_BFIN_HWPAGE, 0xF2) |
RELOC_NUMBER (R_BFIN_ADDR, 0xF3) |
RELOC_NUMBER (R_BFIN_PLTPC, 0x40) /* PLT gnu only relocation */ |
RELOC_NUMBER (R_BFIN_GOT, 0x41) /* GOT gnu only relocation */ |
RELOC_NUMBER (R_BFIN_GNU_VTINHERIT, 0x42) /* C++, gnu only */ |
RELOC_NUMBER (R_BFIN_GNU_VTENTRY, 0x43) /* C++, gnu only */ |
END_RELOC_NUMBERS (R_BFIN_max) |
/* Processor specific flags for the ELF header e_flags field. */ |
#define EF_BFIN_PIC 0x00000001 /* -fpic */ |
#define EF_BFIN_FDPIC 0x00000002 /* -mfdpic */ |
#define EF_BFIN_CODE_IN_L1 0x00000010 /* --code-in-l1 */ |
#define EF_BFIN_DATA_IN_L1 0x00000020 /* --data-in-l1 */ |
#define EF_BFIN_PIC_FLAGS (EF_BFIN_PIC | EF_BFIN_FDPIC) |
#endif /* _ELF_BFIN_H */ |
/contrib/toolchain/binutils/include/elf/common.h |
---|
0,0 → 1,1001 |
/* ELF support for BFD. |
Copyright 1991-2013 Free Software Foundation, Inc. |
Written by Fred Fish @ Cygnus Support, from information published |
in "UNIX System V Release 4, Programmers Guide: ANSI C and |
Programming Support Tools". |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* This file is part of ELF support for BFD, and contains the portions |
that are common to both the internal and external representations. |
For example, ELFMAG0 is the byte 0x7F in both the internal (in-memory) |
and external (in-file) representations. */ |
#ifndef _ELF_COMMON_H |
#define _ELF_COMMON_H |
/* Fields in e_ident[]. */ |
#define EI_MAG0 0 /* File identification byte 0 index */ |
#define ELFMAG0 0x7F /* Magic number byte 0 */ |
#define EI_MAG1 1 /* File identification byte 1 index */ |
#define ELFMAG1 'E' /* Magic number byte 1 */ |
#define EI_MAG2 2 /* File identification byte 2 index */ |
#define ELFMAG2 'L' /* Magic number byte 2 */ |
#define EI_MAG3 3 /* File identification byte 3 index */ |
#define ELFMAG3 'F' /* Magic number byte 3 */ |
#define EI_CLASS 4 /* File class */ |
#define ELFCLASSNONE 0 /* Invalid class */ |
#define ELFCLASS32 1 /* 32-bit objects */ |
#define ELFCLASS64 2 /* 64-bit objects */ |
#define EI_DATA 5 /* Data encoding */ |
#define ELFDATANONE 0 /* Invalid data encoding */ |
#define ELFDATA2LSB 1 /* 2's complement, little endian */ |
#define ELFDATA2MSB 2 /* 2's complement, big endian */ |
#define EI_VERSION 6 /* File version */ |
#define EI_OSABI 7 /* Operating System/ABI indication */ |
#define ELFOSABI_NONE 0 /* UNIX System V ABI */ |
#define ELFOSABI_HPUX 1 /* HP-UX operating system */ |
#define ELFOSABI_NETBSD 2 /* NetBSD */ |
#define ELFOSABI_GNU 3 /* GNU */ |
#define ELFOSABI_LINUX 3 /* Alias for ELFOSABI_GNU */ |
#define ELFOSABI_SOLARIS 6 /* Solaris */ |
#define ELFOSABI_AIX 7 /* AIX */ |
#define ELFOSABI_IRIX 8 /* IRIX */ |
#define ELFOSABI_FREEBSD 9 /* FreeBSD */ |
#define ELFOSABI_TRU64 10 /* TRU64 UNIX */ |
#define ELFOSABI_MODESTO 11 /* Novell Modesto */ |
#define ELFOSABI_OPENBSD 12 /* OpenBSD */ |
#define ELFOSABI_OPENVMS 13 /* OpenVMS */ |
#define ELFOSABI_NSK 14 /* Hewlett-Packard Non-Stop Kernel */ |
#define ELFOSABI_AROS 15 /* AROS */ |
#define ELFOSABI_FENIXOS 16 /* FenixOS */ |
#define ELFOSABI_C6000_ELFABI 64 /* Bare-metal TMS320C6000 */ |
#define ELFOSABI_C6000_LINUX 65 /* Linux TMS320C6000 */ |
#define ELFOSABI_ARM 97 /* ARM */ |
#define ELFOSABI_STANDALONE 255 /* Standalone (embedded) application */ |
#define EI_ABIVERSION 8 /* ABI version */ |
#define EI_PAD 9 /* Start of padding bytes */ |
/* Values for e_type, which identifies the object file type. */ |
#define ET_NONE 0 /* No file type */ |
#define ET_REL 1 /* Relocatable file */ |
#define ET_EXEC 2 /* Executable file */ |
#define ET_DYN 3 /* Shared object file */ |
#define ET_CORE 4 /* Core file */ |
#define ET_LOOS 0xFE00 /* Operating system-specific */ |
#define ET_HIOS 0xFEFF /* Operating system-specific */ |
#define ET_LOPROC 0xFF00 /* Processor-specific */ |
#define ET_HIPROC 0xFFFF /* Processor-specific */ |
/* Values for e_machine, which identifies the architecture. These numbers |
are officially assigned by registry@sco.com. See below for a list of |
ad-hoc numbers used during initial development. */ |
#define EM_NONE 0 /* No machine */ |
#define EM_M32 1 /* AT&T WE 32100 */ |
#define EM_SPARC 2 /* SUN SPARC */ |
#define EM_386 3 /* Intel 80386 */ |
#define EM_68K 4 /* Motorola m68k family */ |
#define EM_88K 5 /* Motorola m88k family */ |
#define EM_486 6 /* Intel 80486 *//* Reserved for future use */ |
#define EM_860 7 /* Intel 80860 */ |
#define EM_MIPS 8 /* MIPS R3000 (officially, big-endian only) */ |
#define EM_S370 9 /* IBM System/370 */ |
#define EM_MIPS_RS3_LE 10 /* MIPS R3000 little-endian (Oct 4 1999 Draft) Deprecated */ |
#define EM_res011 11 /* Reserved */ |
#define EM_res012 12 /* Reserved */ |
#define EM_res013 13 /* Reserved */ |
#define EM_res014 14 /* Reserved */ |
#define EM_PARISC 15 /* HPPA */ |
#define EM_res016 16 /* Reserved */ |
#define EM_VPP550 17 /* Fujitsu VPP500 */ |
#define EM_SPARC32PLUS 18 /* Sun's "v8plus" */ |
#define EM_960 19 /* Intel 80960 */ |
#define EM_PPC 20 /* PowerPC */ |
#define EM_PPC64 21 /* 64-bit PowerPC */ |
#define EM_S390 22 /* IBM S/390 */ |
#define EM_SPU 23 /* Sony/Toshiba/IBM SPU */ |
#define EM_res024 24 /* Reserved */ |
#define EM_res025 25 /* Reserved */ |
#define EM_res026 26 /* Reserved */ |
#define EM_res027 27 /* Reserved */ |
#define EM_res028 28 /* Reserved */ |
#define EM_res029 29 /* Reserved */ |
#define EM_res030 30 /* Reserved */ |
#define EM_res031 31 /* Reserved */ |
#define EM_res032 32 /* Reserved */ |
#define EM_res033 33 /* Reserved */ |
#define EM_res034 34 /* Reserved */ |
#define EM_res035 35 /* Reserved */ |
#define EM_V800 36 /* NEC V800 series */ |
#define EM_FR20 37 /* Fujitsu FR20 */ |
#define EM_RH32 38 /* TRW RH32 */ |
#define EM_MCORE 39 /* Motorola M*Core */ /* May also be taken by Fujitsu MMA */ |
#define EM_RCE 39 /* Old name for MCore */ |
#define EM_ARM 40 /* ARM */ |
#define EM_OLD_ALPHA 41 /* Digital Alpha */ |
#define EM_SH 42 /* Renesas (formerly Hitachi) / SuperH SH */ |
#define EM_SPARCV9 43 /* SPARC v9 64-bit */ |
#define EM_TRICORE 44 /* Siemens Tricore embedded processor */ |
#define EM_ARC 45 /* ARC Cores */ |
#define EM_H8_300 46 /* Renesas (formerly Hitachi) H8/300 */ |
#define EM_H8_300H 47 /* Renesas (formerly Hitachi) H8/300H */ |
#define EM_H8S 48 /* Renesas (formerly Hitachi) H8S */ |
#define EM_H8_500 49 /* Renesas (formerly Hitachi) H8/500 */ |
#define EM_IA_64 50 /* Intel IA-64 Processor */ |
#define EM_MIPS_X 51 /* Stanford MIPS-X */ |
#define EM_COLDFIRE 52 /* Motorola Coldfire */ |
#define EM_68HC12 53 /* Motorola M68HC12 */ |
#define EM_MMA 54 /* Fujitsu Multimedia Accelerator */ |
#define EM_PCP 55 /* Siemens PCP */ |
#define EM_NCPU 56 /* Sony nCPU embedded RISC processor */ |
#define EM_NDR1 57 /* Denso NDR1 microprocessor */ |
#define EM_STARCORE 58 /* Motorola Star*Core processor */ |
#define EM_ME16 59 /* Toyota ME16 processor */ |
#define EM_ST100 60 /* STMicroelectronics ST100 processor */ |
#define EM_TINYJ 61 /* Advanced Logic Corp. TinyJ embedded processor */ |
#define EM_X86_64 62 /* Advanced Micro Devices X86-64 processor */ |
#define EM_PDSP 63 /* Sony DSP Processor */ |
#define EM_PDP10 64 /* Digital Equipment Corp. PDP-10 */ |
#define EM_PDP11 65 /* Digital Equipment Corp. PDP-11 */ |
#define EM_FX66 66 /* Siemens FX66 microcontroller */ |
#define EM_ST9PLUS 67 /* STMicroelectronics ST9+ 8/16 bit microcontroller */ |
#define EM_ST7 68 /* STMicroelectronics ST7 8-bit microcontroller */ |
#define EM_68HC16 69 /* Motorola MC68HC16 Microcontroller */ |
#define EM_68HC11 70 /* Motorola MC68HC11 Microcontroller */ |
#define EM_68HC08 71 /* Motorola MC68HC08 Microcontroller */ |
#define EM_68HC05 72 /* Motorola MC68HC05 Microcontroller */ |
#define EM_SVX 73 /* Silicon Graphics SVx */ |
#define EM_ST19 74 /* STMicroelectronics ST19 8-bit cpu */ |
#define EM_VAX 75 /* Digital VAX */ |
#define EM_CRIS 76 /* Axis Communications 32-bit embedded processor */ |
#define EM_JAVELIN 77 /* Infineon Technologies 32-bit embedded cpu */ |
#define EM_FIREPATH 78 /* Element 14 64-bit DSP processor */ |
#define EM_ZSP 79 /* LSI Logic's 16-bit DSP processor */ |
#define EM_MMIX 80 /* Donald Knuth's educational 64-bit processor */ |
#define EM_HUANY 81 /* Harvard's machine-independent format */ |
#define EM_PRISM 82 /* SiTera Prism */ |
#define EM_AVR 83 /* Atmel AVR 8-bit microcontroller */ |
#define EM_FR30 84 /* Fujitsu FR30 */ |
#define EM_D10V 85 /* Mitsubishi D10V */ |
#define EM_D30V 86 /* Mitsubishi D30V */ |
#define EM_V850 87 /* Renesas V850 (formerly NEC V850) */ |
#define EM_M32R 88 /* Renesas M32R (formerly Mitsubishi M32R) */ |
#define EM_MN10300 89 /* Matsushita MN10300 */ |
#define EM_MN10200 90 /* Matsushita MN10200 */ |
#define EM_PJ 91 /* picoJava */ |
#define EM_OPENRISC 92 /* OpenRISC 32-bit embedded processor */ |
#define EM_ARC_A5 93 /* ARC Cores Tangent-A5 */ |
#define EM_XTENSA 94 /* Tensilica Xtensa Architecture */ |
#define EM_VIDEOCORE 95 /* Alphamosaic VideoCore processor */ |
#define EM_TMM_GPP 96 /* Thompson Multimedia General Purpose Processor */ |
#define EM_NS32K 97 /* National Semiconductor 32000 series */ |
#define EM_TPC 98 /* Tenor Network TPC processor */ |
#define EM_SNP1K 99 /* Trebia SNP 1000 processor */ |
#define EM_ST200 100 /* STMicroelectronics ST200 microcontroller */ |
#define EM_IP2K 101 /* Ubicom IP2022 micro controller */ |
#define EM_MAX 102 /* MAX Processor */ |
#define EM_CR 103 /* National Semiconductor CompactRISC */ |
#define EM_F2MC16 104 /* Fujitsu F2MC16 */ |
#define EM_MSP430 105 /* TI msp430 micro controller */ |
#define EM_BLACKFIN 106 /* ADI Blackfin */ |
#define EM_SE_C33 107 /* S1C33 Family of Seiko Epson processors */ |
#define EM_SEP 108 /* Sharp embedded microprocessor */ |
#define EM_ARCA 109 /* Arca RISC Microprocessor */ |
#define EM_UNICORE 110 /* Microprocessor series from PKU-Unity Ltd. and MPRC of Peking University */ |
#define EM_EXCESS 111 /* eXcess: 16/32/64-bit configurable embedded CPU */ |
#define EM_DXP 112 /* Icera Semiconductor Inc. Deep Execution Processor */ |
#define EM_ALTERA_NIOS2 113 /* Altera Nios II soft-core processor */ |
#define EM_CRX 114 /* National Semiconductor CRX */ |
#define EM_XGATE 115 /* Motorola XGATE embedded processor */ |
#define EM_C166 116 /* Infineon C16x/XC16x processor */ |
#define EM_M16C 117 /* Renesas M16C series microprocessors */ |
#define EM_DSPIC30F 118 /* Microchip Technology dsPIC30F Digital Signal Controller */ |
#define EM_CE 119 /* Freescale Communication Engine RISC core */ |
#define EM_M32C 120 /* Renesas M32C series microprocessors */ |
#define EM_res121 121 /* Reserved */ |
#define EM_res122 122 /* Reserved */ |
#define EM_res123 123 /* Reserved */ |
#define EM_res124 124 /* Reserved */ |
#define EM_res125 125 /* Reserved */ |
#define EM_res126 126 /* Reserved */ |
#define EM_res127 127 /* Reserved */ |
#define EM_res128 128 /* Reserved */ |
#define EM_res129 129 /* Reserved */ |
#define EM_res130 130 /* Reserved */ |
#define EM_TSK3000 131 /* Altium TSK3000 core */ |
#define EM_RS08 132 /* Freescale RS08 embedded processor */ |
#define EM_res133 133 /* Reserved */ |
#define EM_ECOG2 134 /* Cyan Technology eCOG2 microprocessor */ |
#define EM_SCORE 135 /* Sunplus Score */ |
#define EM_SCORE7 135 /* Sunplus S+core7 RISC processor */ |
#define EM_DSP24 136 /* New Japan Radio (NJR) 24-bit DSP Processor */ |
#define EM_VIDEOCORE3 137 /* Broadcom VideoCore III processor */ |
#define EM_LATTICEMICO32 138 /* RISC processor for Lattice FPGA architecture */ |
#define EM_SE_C17 139 /* Seiko Epson C17 family */ |
#define EM_TI_C6000 140 /* Texas Instruments TMS320C6000 DSP family */ |
#define EM_TI_C2000 141 /* Texas Instruments TMS320C2000 DSP family */ |
#define EM_TI_C5500 142 /* Texas Instruments TMS320C55x DSP family */ |
#define EM_res143 143 /* Reserved */ |
#define EM_res144 144 /* Reserved */ |
#define EM_res145 145 /* Reserved */ |
#define EM_res146 146 /* Reserved */ |
#define EM_res147 147 /* Reserved */ |
#define EM_res148 148 /* Reserved */ |
#define EM_res149 149 /* Reserved */ |
#define EM_res150 150 /* Reserved */ |
#define EM_res151 151 /* Reserved */ |
#define EM_res152 152 /* Reserved */ |
#define EM_res153 153 /* Reserved */ |
#define EM_res154 154 /* Reserved */ |
#define EM_res155 155 /* Reserved */ |
#define EM_res156 156 /* Reserved */ |
#define EM_res157 157 /* Reserved */ |
#define EM_res158 158 /* Reserved */ |
#define EM_res159 159 /* Reserved */ |
#define EM_MMDSP_PLUS 160 /* STMicroelectronics 64bit VLIW Data Signal Processor */ |
#define EM_CYPRESS_M8C 161 /* Cypress M8C microprocessor */ |
#define EM_R32C 162 /* Renesas R32C series microprocessors */ |
#define EM_TRIMEDIA 163 /* NXP Semiconductors TriMedia architecture family */ |
#define EM_QDSP6 164 /* QUALCOMM DSP6 Processor */ |
#define EM_8051 165 /* Intel 8051 and variants */ |
#define EM_STXP7X 166 /* STMicroelectronics STxP7x family */ |
#define EM_NDS32 167 /* Andes Technology compact code size embedded RISC processor family */ |
#define EM_ECOG1 168 /* Cyan Technology eCOG1X family */ |
#define EM_ECOG1X 168 /* Cyan Technology eCOG1X family */ |
#define EM_MAXQ30 169 /* Dallas Semiconductor MAXQ30 Core Micro-controllers */ |
#define EM_XIMO16 170 /* New Japan Radio (NJR) 16-bit DSP Processor */ |
#define EM_MANIK 171 /* M2000 Reconfigurable RISC Microprocessor */ |
#define EM_CRAYNV2 172 /* Cray Inc. NV2 vector architecture */ |
#define EM_RX 173 /* Renesas RX family */ |
#define EM_METAG 174 /* Imagination Technologies Meta processor architecture */ |
#define EM_MCST_ELBRUS 175 /* MCST Elbrus general purpose hardware architecture */ |
#define EM_ECOG16 176 /* Cyan Technology eCOG16 family */ |
#define EM_CR16 177 /* National Semiconductor CompactRISC 16-bit processor */ |
#define EM_ETPU 178 /* Freescale Extended Time Processing Unit */ |
#define EM_SLE9X 179 /* Infineon Technologies SLE9X core */ |
#define EM_L1OM 180 /* Intel L1OM */ |
#define EM_K1OM 181 /* Intel K1OM */ |
#define EM_INTEL182 182 /* Reserved by Intel */ |
#define EM_AARCH64 183 /* ARM 64-bit architecture */ |
#define EM_ARM184 184 /* Reserved by ARM */ |
#define EM_AVR32 185 /* Atmel Corporation 32-bit microprocessor family */ |
#define EM_STM8 186 /* STMicroeletronics STM8 8-bit microcontroller */ |
#define EM_TILE64 187 /* Tilera TILE64 multicore architecture family */ |
#define EM_TILEPRO 188 /* Tilera TILEPro multicore architecture family */ |
#define EM_MICROBLAZE 189 /* Xilinx MicroBlaze 32-bit RISC soft processor core */ |
#define EM_CUDA 190 /* NVIDIA CUDA architecture */ |
#define EM_TILEGX 191 /* Tilera TILE-Gx multicore architecture family */ |
#define EM_RL78 197 /* Renesas RL78 family. */ |
#define EM_78K0R 199 /* Renesas 78K0R. */ |
#define EM_INTEL205 205 /* Reserved by Intel */ |
#define EM_INTEL206 206 /* Reserved by Intel */ |
#define EM_INTEL207 207 /* Reserved by Intel */ |
#define EM_INTEL208 208 /* Reserved by Intel */ |
#define EM_INTEL209 209 /* Reserved by Intel */ |
/* If it is necessary to assign new unofficial EM_* values, please pick large |
random numbers (0x8523, 0xa7f2, etc.) to minimize the chances of collision |
with official or non-GNU unofficial values. |
NOTE: Do not just increment the most recent number by one. |
Somebody else somewhere will do exactly the same thing, and you |
will have a collision. Instead, pick a random number. |
Normally, each entity or maintainer responsible for a machine with an |
unofficial e_machine number should eventually ask registry@sco.com for |
an officially blessed number to be added to the list above. */ |
/* Old version of Sparc v9, from before the ABI; |
This should be removed shortly. */ |
#define EM_OLD_SPARCV9 11 |
/* Old version of PowerPC, this should be removed shortly. */ |
#define EM_PPC_OLD 17 |
/* picoJava */ |
#define EM_PJ_OLD 99 |
/* Old, unofficial value for National Semiconductor CompactRISC - CR16 */ |
#define EM_CR16_OLD 115 |
/* AVR magic number. Written in the absense of an ABI. */ |
#define EM_AVR_OLD 0x1057 |
/* MSP430 magic number. Written in the absense of everything. */ |
#define EM_MSP430_OLD 0x1059 |
/* Morpho MT. Written in the absense of an ABI. */ |
#define EM_MT 0x2530 |
/* FR30 magic number - no EABI available. */ |
#define EM_CYGNUS_FR30 0x3330 |
/* OpenRISC magic number. Written in the absense of an ABI. */ |
#define EM_OPENRISC_OLD 0x3426 |
/* DLX magic number. Written in the absense of an ABI. */ |
#define EM_DLX 0x5aa5 |
/* FRV magic number - no EABI available??. */ |
#define EM_CYGNUS_FRV 0x5441 |
/* Infineon Technologies 16-bit microcontroller with C166-V2 core. */ |
#define EM_XC16X 0x4688 |
/* D10V backend magic number. Written in the absence of an ABI. */ |
#define EM_CYGNUS_D10V 0x7650 |
/* D30V backend magic number. Written in the absence of an ABI. */ |
#define EM_CYGNUS_D30V 0x7676 |
/* Ubicom IP2xxx; Written in the absense of an ABI. */ |
#define EM_IP2K_OLD 0x8217 |
/* (Deprecated) Temporary number for the OpenRISC processor. */ |
#define EM_OR32 0x8472 |
/* Cygnus PowerPC ELF backend. Written in the absence of an ABI. */ |
#define EM_CYGNUS_POWERPC 0x9025 |
/* Alpha backend magic number. Written in the absence of an ABI. */ |
#define EM_ALPHA 0x9026 |
/* Cygnus M32R ELF backend. Written in the absence of an ABI. */ |
#define EM_CYGNUS_M32R 0x9041 |
/* V850 backend magic number. Written in the absense of an ABI. */ |
#define EM_CYGNUS_V850 0x9080 |
/* old S/390 backend magic number. Written in the absence of an ABI. */ |
#define EM_S390_OLD 0xa390 |
/* Old, unofficial value for Xtensa. */ |
#define EM_XTENSA_OLD 0xabc7 |
#define EM_XSTORMY16 0xad45 |
/* mn10200 and mn10300 backend magic numbers. |
Written in the absense of an ABI. */ |
#define EM_CYGNUS_MN10300 0xbeef |
#define EM_CYGNUS_MN10200 0xdead |
/* Renesas M32C and M16C. */ |
#define EM_M32C_OLD 0xFEB0 |
/* Vitesse IQ2000. */ |
#define EM_IQ2000 0xFEBA |
/* NIOS magic number - no EABI available. */ |
#define EM_NIOS32 0xFEBB |
#define EM_CYGNUS_MEP 0xF00D /* Toshiba MeP */ |
#define EM_MOXIE 0xFEED /* Moxie */ |
/* Old Sunplus S+core7 backend magic number. Written in the absence of an ABI. */ |
#define EM_SCORE_OLD 95 |
#define EM_MICROBLAZE_OLD 0xbaab /* Old MicroBlaze */ |
#define EM_ADAPTEVA_EPIPHANY 0x1223 /* Adapteva's Epiphany architecture. */ |
/* See the above comment before you add a new EM_* value here. */ |
/* Values for e_version. */ |
#define EV_NONE 0 /* Invalid ELF version */ |
#define EV_CURRENT 1 /* Current version */ |
/* Value for e_phnum. */ |
#define PN_XNUM 0xffff /* Extended numbering */ |
/* Values for program header, p_type field. */ |
#define PT_NULL 0 /* Program header table entry unused */ |
#define PT_LOAD 1 /* Loadable program segment */ |
#define PT_DYNAMIC 2 /* Dynamic linking information */ |
#define PT_INTERP 3 /* Program interpreter */ |
#define PT_NOTE 4 /* Auxiliary information */ |
#define PT_SHLIB 5 /* Reserved, unspecified semantics */ |
#define PT_PHDR 6 /* Entry for header table itself */ |
#define PT_TLS 7 /* Thread local storage segment */ |
#define PT_LOOS 0x60000000 /* OS-specific */ |
#define PT_HIOS 0x6fffffff /* OS-specific */ |
#define PT_LOPROC 0x70000000 /* Processor-specific */ |
#define PT_HIPROC 0x7FFFFFFF /* Processor-specific */ |
#define PT_GNU_EH_FRAME (PT_LOOS + 0x474e550) /* Frame unwind information */ |
#define PT_SUNW_EH_FRAME PT_GNU_EH_FRAME /* Solaris uses the same value */ |
#define PT_GNU_STACK (PT_LOOS + 0x474e551) /* Stack flags */ |
#define PT_GNU_RELRO (PT_LOOS + 0x474e552) /* Read-only after relocation */ |
/* Program segment permissions, in program header p_flags field. */ |
#define PF_X (1 << 0) /* Segment is executable */ |
#define PF_W (1 << 1) /* Segment is writable */ |
#define PF_R (1 << 2) /* Segment is readable */ |
/* #define PF_MASKOS 0x0F000000 *//* OS-specific reserved bits */ |
#define PF_MASKOS 0x0FF00000 /* New value, Oct 4, 1999 Draft */ |
#define PF_MASKPROC 0xF0000000 /* Processor-specific reserved bits */ |
/* Values for section header, sh_type field. */ |
#define SHT_NULL 0 /* Section header table entry unused */ |
#define SHT_PROGBITS 1 /* Program specific (private) data */ |
#define SHT_SYMTAB 2 /* Link editing symbol table */ |
#define SHT_STRTAB 3 /* A string table */ |
#define SHT_RELA 4 /* Relocation entries with addends */ |
#define SHT_HASH 5 /* A symbol hash table */ |
#define SHT_DYNAMIC 6 /* Information for dynamic linking */ |
#define SHT_NOTE 7 /* Information that marks file */ |
#define SHT_NOBITS 8 /* Section occupies no space in file */ |
#define SHT_REL 9 /* Relocation entries, no addends */ |
#define SHT_SHLIB 10 /* Reserved, unspecified semantics */ |
#define SHT_DYNSYM 11 /* Dynamic linking symbol table */ |
#define SHT_INIT_ARRAY 14 /* Array of ptrs to init functions */ |
#define SHT_FINI_ARRAY 15 /* Array of ptrs to finish functions */ |
#define SHT_PREINIT_ARRAY 16 /* Array of ptrs to pre-init funcs */ |
#define SHT_GROUP 17 /* Section contains a section group */ |
#define SHT_SYMTAB_SHNDX 18 /* Indicies for SHN_XINDEX entries */ |
#define SHT_LOOS 0x60000000 /* First of OS specific semantics */ |
#define SHT_HIOS 0x6fffffff /* Last of OS specific semantics */ |
#define SHT_GNU_INCREMENTAL_INPUTS 0x6fff4700 /* incremental build data */ |
#define SHT_GNU_ATTRIBUTES 0x6ffffff5 /* Object attributes */ |
#define SHT_GNU_HASH 0x6ffffff6 /* GNU style symbol hash table */ |
#define SHT_GNU_LIBLIST 0x6ffffff7 /* List of prelink dependencies */ |
/* The next three section types are defined by Solaris, and are named |
SHT_SUNW*. We use them in GNU code, so we also define SHT_GNU* |
versions. */ |
#define SHT_SUNW_verdef 0x6ffffffd /* Versions defined by file */ |
#define SHT_SUNW_verneed 0x6ffffffe /* Versions needed by file */ |
#define SHT_SUNW_versym 0x6fffffff /* Symbol versions */ |
#define SHT_GNU_verdef SHT_SUNW_verdef |
#define SHT_GNU_verneed SHT_SUNW_verneed |
#define SHT_GNU_versym SHT_SUNW_versym |
#define SHT_LOPROC 0x70000000 /* Processor-specific semantics, lo */ |
#define SHT_HIPROC 0x7FFFFFFF /* Processor-specific semantics, hi */ |
#define SHT_LOUSER 0x80000000 /* Application-specific semantics */ |
/* #define SHT_HIUSER 0x8FFFFFFF *//* Application-specific semantics */ |
#define SHT_HIUSER 0xFFFFFFFF /* New value, defined in Oct 4, 1999 Draft */ |
/* Values for section header, sh_flags field. */ |
#define SHF_WRITE (1 << 0) /* Writable data during execution */ |
#define SHF_ALLOC (1 << 1) /* Occupies memory during execution */ |
#define SHF_EXECINSTR (1 << 2) /* Executable machine instructions */ |
#define SHF_MERGE (1 << 4) /* Data in this section can be merged */ |
#define SHF_STRINGS (1 << 5) /* Contains null terminated character strings */ |
#define SHF_INFO_LINK (1 << 6) /* sh_info holds section header table index */ |
#define SHF_LINK_ORDER (1 << 7) /* Preserve section ordering when linking */ |
#define SHF_OS_NONCONFORMING (1 << 8) /* OS specific processing required */ |
#define SHF_GROUP (1 << 9) /* Member of a section group */ |
#define SHF_TLS (1 << 10) /* Thread local storage section */ |
/* #define SHF_MASKOS 0x0F000000 *//* OS-specific semantics */ |
#define SHF_MASKOS 0x0FF00000 /* New value, Oct 4, 1999 Draft */ |
#define SHF_MASKPROC 0xF0000000 /* Processor-specific semantics */ |
/* This used to be implemented as a processor specific section flag. |
We just make it generic. */ |
#define SHF_EXCLUDE 0x80000000 /* Link editor is to exclude |
this section from executable |
and shared library that it |
builds when those objects |
are not to be further |
relocated. */ |
/* Values of note segment descriptor types for core files. */ |
#define NT_PRSTATUS 1 /* Contains copy of prstatus struct */ |
#define NT_FPREGSET 2 /* Contains copy of fpregset struct */ |
#define NT_PRPSINFO 3 /* Contains copy of prpsinfo struct */ |
#define NT_TASKSTRUCT 4 /* Contains copy of task struct */ |
#define NT_AUXV 6 /* Contains copy of Elfxx_auxv_t */ |
#define NT_PRXFPREG 0x46e62b7f /* Contains a user_xfpregs_struct; */ |
/* note name must be "LINUX". */ |
#define NT_PPC_VMX 0x100 /* PowerPC Altivec/VMX registers */ |
/* note name must be "LINUX". */ |
#define NT_PPC_VSX 0x102 /* PowerPC VSX registers */ |
/* note name must be "LINUX". */ |
#define NT_386_TLS 0x200 /* x86 TLS information */ |
/* note name must be "LINUX". */ |
#define NT_386_IOPERM 0x201 /* x86 io permissions */ |
/* note name must be "LINUX". */ |
#define NT_X86_XSTATE 0x202 /* x86 XSAVE extended state */ |
/* note name must be "LINUX". */ |
#define NT_S390_HIGH_GPRS 0x300 /* S/390 upper halves of GPRs */ |
/* note name must be "LINUX". */ |
#define NT_S390_TIMER 0x301 /* S390 timer */ |
/* note name must be "LINUX". */ |
#define NT_S390_TODCMP 0x302 /* S390 TOD clock comparator */ |
/* note name must be "LINUX". */ |
#define NT_S390_TODPREG 0x303 /* S390 TOD programmable register */ |
/* note name must be "LINUX". */ |
#define NT_S390_CTRS 0x304 /* S390 control registers */ |
/* note name must be "LINUX". */ |
#define NT_S390_PREFIX 0x305 /* S390 prefix register */ |
/* note name must be "LINUX". */ |
#define NT_S390_LAST_BREAK 0x306 /* S390 breaking event address */ |
/* note name must be "LINUX". */ |
#define NT_S390_SYSTEM_CALL 0x307 /* S390 system call restart data */ |
/* note name must be "LINUX". */ |
#define NT_S390_TDB 0x308 /* S390 transaction diagnostic block */ |
/* note name must be "LINUX". */ |
#define NT_ARM_VFP 0x400 /* ARM VFP registers */ |
/* The following definitions should really use NT_AARCH_..., but defined |
this way for compatibility with Linux. */ |
#define NT_ARM_TLS 0x401 /* AArch TLS registers */ |
/* note name must be "LINUX". */ |
#define NT_ARM_HW_BREAK 0x402 /* AArch hardware breakpoint registers */ |
/* note name must be "LINUX". */ |
#define NT_ARM_HW_WATCH 0x403 /* AArch hardware watchpoint registers */ |
/* note name must be "LINUX". */ |
#define NT_SIGINFO 0x53494749 /* Fields of siginfo_t. */ |
#define NT_FILE 0x46494c45 /* Description of mapped files. */ |
/* Note segments for core files on dir-style procfs systems. */ |
#define NT_PSTATUS 10 /* Has a struct pstatus */ |
#define NT_FPREGS 12 /* Has a struct fpregset */ |
#define NT_PSINFO 13 /* Has a struct psinfo */ |
#define NT_LWPSTATUS 16 /* Has a struct lwpstatus_t */ |
#define NT_LWPSINFO 17 /* Has a struct lwpsinfo_t */ |
#define NT_WIN32PSTATUS 18 /* Has a struct win32_pstatus */ |
/* Note segment for SystemTap probes. */ |
#define NT_STAPSDT 3 |
/* Note segments for core files on NetBSD systems. Note name |
must start with "NetBSD-CORE". */ |
#define NT_NETBSDCORE_PROCINFO 1 /* Has a struct procinfo */ |
#define NT_NETBSDCORE_FIRSTMACH 32 /* start of machdep note types */ |
/* Note segments for core files on OpenBSD systems. Note name is |
"OpenBSD". */ |
#define NT_OPENBSD_PROCINFO 10 |
#define NT_OPENBSD_AUXV 11 |
#define NT_OPENBSD_REGS 20 |
#define NT_OPENBSD_FPREGS 21 |
#define NT_OPENBSD_XFPREGS 22 |
#define NT_OPENBSD_WCOOKIE 23 |
/* Note segments for core files on SPU systems. Note name |
must start with "SPU/". */ |
#define NT_SPU 1 |
/* Values of note segment descriptor types for object files. */ |
#define NT_VERSION 1 /* Contains a version string. */ |
#define NT_ARCH 2 /* Contains an architecture string. */ |
/* Values for notes in non-core files using name "GNU". */ |
#define NT_GNU_ABI_TAG 1 |
#define NT_GNU_HWCAP 2 /* Used by ld.so and kernel vDSO. */ |
#define NT_GNU_BUILD_ID 3 /* Generated by ld --build-id. */ |
#define NT_GNU_GOLD_VERSION 4 /* Generated by gold. */ |
/* Values used in GNU .note.ABI-tag notes (NT_GNU_ABI_TAG). */ |
#define GNU_ABI_TAG_LINUX 0 |
#define GNU_ABI_TAG_HURD 1 |
#define GNU_ABI_TAG_SOLARIS 2 |
#define GNU_ABI_TAG_FREEBSD 3 |
#define GNU_ABI_TAG_NETBSD 4 |
/* Values for NetBSD .note.netbsd.ident notes. Note name is "NetBSD". */ |
#define NT_NETBSD_IDENT 1 |
/* Values for OpenBSD .note.openbsd.ident notes. Note name is "OpenBSD". */ |
#define NT_OPENBSD_IDENT 1 |
/* Values for FreeBSD .note.ABI-tag notes. Note name is "FreeBSD". */ |
#define NT_FREEBSD_ABI_TAG 1 |
/* These three macros disassemble and assemble a symbol table st_info field, |
which contains the symbol binding and symbol type. The STB_ and STT_ |
defines identify the binding and type. */ |
#define ELF_ST_BIND(val) (((unsigned int)(val)) >> 4) |
#define ELF_ST_TYPE(val) ((val) & 0xF) |
#define ELF_ST_INFO(bind,type) (((bind) << 4) + ((type) & 0xF)) |
/* The 64bit and 32bit versions of these macros are identical, but |
the ELF spec defines them, so here they are. */ |
#define ELF32_ST_BIND ELF_ST_BIND |
#define ELF32_ST_TYPE ELF_ST_TYPE |
#define ELF32_ST_INFO ELF_ST_INFO |
#define ELF64_ST_BIND ELF_ST_BIND |
#define ELF64_ST_TYPE ELF_ST_TYPE |
#define ELF64_ST_INFO ELF_ST_INFO |
/* This macro disassembles and assembles a symbol's visibility into |
the st_other field. The STV_ defines specify the actual visibility. */ |
#define ELF_ST_VISIBILITY(v) ((v) & 0x3) |
/* The remaining bits in the st_other field are not currently used. |
They should be set to zero. */ |
#define ELF32_ST_VISIBILITY ELF_ST_VISIBILITY |
#define ELF64_ST_VISIBILITY ELF_ST_VISIBILITY |
#define STN_UNDEF 0 /* Undefined symbol index */ |
#define STB_LOCAL 0 /* Symbol not visible outside obj */ |
#define STB_GLOBAL 1 /* Symbol visible outside obj */ |
#define STB_WEAK 2 /* Like globals, lower precedence */ |
#define STB_LOOS 10 /* OS-specific semantics */ |
#define STB_GNU_UNIQUE 10 /* Symbol is unique in namespace */ |
#define STB_HIOS 12 /* OS-specific semantics */ |
#define STB_LOPROC 13 /* Processor-specific semantics */ |
#define STB_HIPROC 15 /* Processor-specific semantics */ |
#define STT_NOTYPE 0 /* Symbol type is unspecified */ |
#define STT_OBJECT 1 /* Symbol is a data object */ |
#define STT_FUNC 2 /* Symbol is a code object */ |
#define STT_SECTION 3 /* Symbol associated with a section */ |
#define STT_FILE 4 /* Symbol gives a file name */ |
#define STT_COMMON 5 /* An uninitialised common block */ |
#define STT_TLS 6 /* Thread local data object */ |
#define STT_RELC 8 /* Complex relocation expression */ |
#define STT_SRELC 9 /* Signed Complex relocation expression */ |
#define STT_LOOS 10 /* OS-specific semantics */ |
#define STT_GNU_IFUNC 10 /* Symbol is an indirect code object */ |
#define STT_HIOS 12 /* OS-specific semantics */ |
#define STT_LOPROC 13 /* Processor-specific semantics */ |
#define STT_HIPROC 15 /* Processor-specific semantics */ |
/* The following constants control how a symbol may be accessed once it has |
become part of an executable or shared library. */ |
#define STV_DEFAULT 0 /* Visibility is specified by binding type */ |
#define STV_INTERNAL 1 /* OS specific version of STV_HIDDEN */ |
#define STV_HIDDEN 2 /* Can only be seen inside currect component */ |
#define STV_PROTECTED 3 /* Treat as STB_LOCAL inside current component */ |
/* Relocation info handling macros. */ |
#define ELF32_R_SYM(i) ((i) >> 8) |
#define ELF32_R_TYPE(i) ((i) & 0xff) |
#define ELF32_R_INFO(s,t) (((s) << 8) + ((t) & 0xff)) |
#define ELF64_R_SYM(i) ((i) >> 32) |
#define ELF64_R_TYPE(i) ((i) & 0xffffffff) |
#define ELF64_R_INFO(s,t) (((bfd_vma) (s) << 31 << 1) + (bfd_vma) (t)) |
/* Dynamic section tags. */ |
#define DT_NULL 0 |
#define DT_NEEDED 1 |
#define DT_PLTRELSZ 2 |
#define DT_PLTGOT 3 |
#define DT_HASH 4 |
#define DT_STRTAB 5 |
#define DT_SYMTAB 6 |
#define DT_RELA 7 |
#define DT_RELASZ 8 |
#define DT_RELAENT 9 |
#define DT_STRSZ 10 |
#define DT_SYMENT 11 |
#define DT_INIT 12 |
#define DT_FINI 13 |
#define DT_SONAME 14 |
#define DT_RPATH 15 |
#define DT_SYMBOLIC 16 |
#define DT_REL 17 |
#define DT_RELSZ 18 |
#define DT_RELENT 19 |
#define DT_PLTREL 20 |
#define DT_DEBUG 21 |
#define DT_TEXTREL 22 |
#define DT_JMPREL 23 |
#define DT_BIND_NOW 24 |
#define DT_INIT_ARRAY 25 |
#define DT_FINI_ARRAY 26 |
#define DT_INIT_ARRAYSZ 27 |
#define DT_FINI_ARRAYSZ 28 |
#define DT_RUNPATH 29 |
#define DT_FLAGS 30 |
#define DT_ENCODING 32 |
#define DT_PREINIT_ARRAY 32 |
#define DT_PREINIT_ARRAYSZ 33 |
/* Note, the Oct 4, 1999 draft of the ELF ABI changed the values |
for DT_LOOS and DT_HIOS. Some implementations however, use |
values outside of the new range (see below). */ |
#define OLD_DT_LOOS 0x60000000 |
#define DT_LOOS 0x6000000d |
#define DT_HIOS 0x6ffff000 |
#define OLD_DT_HIOS 0x6fffffff |
#define DT_LOPROC 0x70000000 |
#define DT_HIPROC 0x7fffffff |
/* The next 2 dynamic tag ranges, integer value range (DT_VALRNGLO to |
DT_VALRNGHI) and virtual address range (DT_ADDRRNGLO to DT_ADDRRNGHI), |
are used on Solaris. We support them everywhere. Note these values |
lie outside of the (new) range for OS specific values. This is a |
deliberate special case and we maintain it for backwards compatability. |
*/ |
#define DT_VALRNGLO 0x6ffffd00 |
#define DT_GNU_PRELINKED 0x6ffffdf5 |
#define DT_GNU_CONFLICTSZ 0x6ffffdf6 |
#define DT_GNU_LIBLISTSZ 0x6ffffdf7 |
#define DT_CHECKSUM 0x6ffffdf8 |
#define DT_PLTPADSZ 0x6ffffdf9 |
#define DT_MOVEENT 0x6ffffdfa |
#define DT_MOVESZ 0x6ffffdfb |
#define DT_FEATURE 0x6ffffdfc |
#define DT_POSFLAG_1 0x6ffffdfd |
#define DT_SYMINSZ 0x6ffffdfe |
#define DT_SYMINENT 0x6ffffdff |
#define DT_VALRNGHI 0x6ffffdff |
#define DT_ADDRRNGLO 0x6ffffe00 |
#define DT_GNU_HASH 0x6ffffef5 |
#define DT_TLSDESC_PLT 0x6ffffef6 |
#define DT_TLSDESC_GOT 0x6ffffef7 |
#define DT_GNU_CONFLICT 0x6ffffef8 |
#define DT_GNU_LIBLIST 0x6ffffef9 |
#define DT_CONFIG 0x6ffffefa |
#define DT_DEPAUDIT 0x6ffffefb |
#define DT_AUDIT 0x6ffffefc |
#define DT_PLTPAD 0x6ffffefd |
#define DT_MOVETAB 0x6ffffefe |
#define DT_SYMINFO 0x6ffffeff |
#define DT_ADDRRNGHI 0x6ffffeff |
#define DT_RELACOUNT 0x6ffffff9 |
#define DT_RELCOUNT 0x6ffffffa |
#define DT_FLAGS_1 0x6ffffffb |
#define DT_VERDEF 0x6ffffffc |
#define DT_VERDEFNUM 0x6ffffffd |
#define DT_VERNEED 0x6ffffffe |
#define DT_VERNEEDNUM 0x6fffffff |
/* This tag is a GNU extension to the Solaris version scheme. */ |
#define DT_VERSYM 0x6ffffff0 |
#define DT_LOPROC 0x70000000 |
#define DT_HIPROC 0x7fffffff |
/* These section tags are used on Solaris. We support them |
everywhere, and hope they do not conflict. */ |
#define DT_AUXILIARY 0x7ffffffd |
#define DT_USED 0x7ffffffe |
#define DT_FILTER 0x7fffffff |
/* Values used in DT_FEATURE .dynamic entry. */ |
#define DTF_1_PARINIT 0x00000001 |
/* From |
http://docs.sun.com:80/ab2/coll.45.13/LLM/@Ab2PageView/21165?Ab2Lang=C&Ab2Enc=iso-8859-1 |
DTF_1_CONFEXP is the same as DTF_1_PARINIT. It is a typo. The value |
defined here is the same as the one in <sys/link.h> on Solaris 8. */ |
#define DTF_1_CONFEXP 0x00000002 |
/* Flag values used in the DT_POSFLAG_1 .dynamic entry. */ |
#define DF_P1_LAZYLOAD 0x00000001 |
#define DF_P1_GROUPPERM 0x00000002 |
/* Flag value in in the DT_FLAGS_1 .dynamic entry. */ |
#define DF_1_NOW 0x00000001 |
#define DF_1_GLOBAL 0x00000002 |
#define DF_1_GROUP 0x00000004 |
#define DF_1_NODELETE 0x00000008 |
#define DF_1_LOADFLTR 0x00000010 |
#define DF_1_INITFIRST 0x00000020 |
#define DF_1_NOOPEN 0x00000040 |
#define DF_1_ORIGIN 0x00000080 |
#define DF_1_DIRECT 0x00000100 |
#define DF_1_TRANS 0x00000200 |
#define DF_1_INTERPOSE 0x00000400 |
#define DF_1_NODEFLIB 0x00000800 |
#define DF_1_NODUMP 0x00001000 |
#define DF_1_CONFALT 0x00002000 |
#define DF_1_ENDFILTEE 0x00004000 |
#define DF_1_DISPRELDNE 0x00008000 |
#define DF_1_DISPRELPND 0x00010000 |
#define DF_1_NODIRECT 0x00020000 |
#define DF_1_IGNMULDEF 0x00040000 |
#define DF_1_NOKSYMS 0x00080000 |
#define DF_1_NOHDR 0x00100000 |
#define DF_1_EDITED 0x00200000 |
#define DF_1_NORELOC 0x00400000 |
#define DF_1_SYMINTPOSE 0x00800000 |
#define DF_1_GLOBAUDIT 0x01000000 |
#define DF_1_SINGLETON 0x02000000 |
/* Flag values for the DT_FLAGS entry. */ |
#define DF_ORIGIN (1 << 0) |
#define DF_SYMBOLIC (1 << 1) |
#define DF_TEXTREL (1 << 2) |
#define DF_BIND_NOW (1 << 3) |
#define DF_STATIC_TLS (1 << 4) |
/* These constants are used for the version number of a Elf32_Verdef |
structure. */ |
#define VER_DEF_NONE 0 |
#define VER_DEF_CURRENT 1 |
/* These constants appear in the vd_flags field of a Elf32_Verdef |
structure. |
Cf. the Solaris Linker and Libraries Guide, Ch. 7, Object File Format, |
Versioning Sections, for a description: |
http://docs.sun.com/app/docs/doc/819-0690/chapter6-93046?l=en&a=view */ |
#define VER_FLG_BASE 0x1 |
#define VER_FLG_WEAK 0x2 |
#define VER_FLG_INFO 0x4 |
/* These special constants can be found in an Elf32_Versym field. */ |
#define VER_NDX_LOCAL 0 |
#define VER_NDX_GLOBAL 1 |
/* These constants are used for the version number of a Elf32_Verneed |
structure. */ |
#define VER_NEED_NONE 0 |
#define VER_NEED_CURRENT 1 |
/* This flag appears in a Versym structure. It means that the symbol |
is hidden, and is only visible with an explicit version number. |
This is a GNU extension. */ |
#define VERSYM_HIDDEN 0x8000 |
/* This is the mask for the rest of the Versym information. */ |
#define VERSYM_VERSION 0x7fff |
/* This is a special token which appears as part of a symbol name. It |
indictes that the rest of the name is actually the name of a |
version node, and is not part of the actual name. This is a GNU |
extension. For example, the symbol name `stat@ver2' is taken to |
mean the symbol `stat' in version `ver2'. */ |
#define ELF_VER_CHR '@' |
/* Possible values for si_boundto. */ |
#define SYMINFO_BT_SELF 0xffff /* Symbol bound to self */ |
#define SYMINFO_BT_PARENT 0xfffe /* Symbol bound to parent */ |
#define SYMINFO_BT_LOWRESERVE 0xff00 /* Beginning of reserved entries */ |
/* Possible bitmasks for si_flags. */ |
#define SYMINFO_FLG_DIRECT 0x0001 /* Direct bound symbol */ |
#define SYMINFO_FLG_PASSTHRU 0x0002 /* Pass-thru symbol for translator */ |
#define SYMINFO_FLG_COPY 0x0004 /* Symbol is a copy-reloc */ |
#define SYMINFO_FLG_LAZYLOAD 0x0008 /* Symbol bound to object to be lazy loaded */ |
/* Syminfo version values. */ |
#define SYMINFO_NONE 0 |
#define SYMINFO_CURRENT 1 |
#define SYMINFO_NUM 2 |
/* Section Group Flags. */ |
#define GRP_COMDAT 0x1 /* A COMDAT group */ |
/* Auxv a_type values. */ |
#define AT_NULL 0 /* End of vector */ |
#define AT_IGNORE 1 /* Entry should be ignored */ |
#define AT_EXECFD 2 /* File descriptor of program */ |
#define AT_PHDR 3 /* Program headers for program */ |
#define AT_PHENT 4 /* Size of program header entry */ |
#define AT_PHNUM 5 /* Number of program headers */ |
#define AT_PAGESZ 6 /* System page size */ |
#define AT_BASE 7 /* Base address of interpreter */ |
#define AT_FLAGS 8 /* Flags */ |
#define AT_ENTRY 9 /* Entry point of program */ |
#define AT_NOTELF 10 /* Program is not ELF */ |
#define AT_UID 11 /* Real uid */ |
#define AT_EUID 12 /* Effective uid */ |
#define AT_GID 13 /* Real gid */ |
#define AT_EGID 14 /* Effective gid */ |
#define AT_CLKTCK 17 /* Frequency of times() */ |
#define AT_PLATFORM 15 /* String identifying platform. */ |
#define AT_HWCAP 16 /* Machine dependent hints about |
processor capabilities. */ |
#define AT_FPUCW 18 /* Used FPU control word. */ |
#define AT_DCACHEBSIZE 19 /* Data cache block size. */ |
#define AT_ICACHEBSIZE 20 /* Instruction cache block size. */ |
#define AT_UCACHEBSIZE 21 /* Unified cache block size. */ |
#define AT_IGNOREPPC 22 /* Entry should be ignored */ |
#define AT_SECURE 23 /* Boolean, was exec setuid-like? */ |
#define AT_BASE_PLATFORM 24 /* String identifying real platform, |
may differ from AT_PLATFORM. */ |
#define AT_RANDOM 25 /* Address of 16 random bytes. */ |
#define AT_EXECFN 31 /* Filename of executable. */ |
/* Pointer to the global system page used for system calls and other |
nice things. */ |
#define AT_SYSINFO 32 |
#define AT_SYSINFO_EHDR 33 /* Pointer to ELF header of system-supplied DSO. */ |
/* More complete cache descriptions than AT_[DIU]CACHEBSIZE. If the |
value is -1, then the cache doesn't exist. Otherwise: |
bit 0-3: Cache set-associativity; 0 means fully associative. |
bit 4-7: Log2 of cacheline size. |
bit 8-31: Size of the entire cache >> 8. */ |
#define AT_L1I_CACHESHAPE 34 |
#define AT_L1D_CACHESHAPE 35 |
#define AT_L2_CACHESHAPE 36 |
#define AT_L3_CACHESHAPE 37 |
#define AT_SUN_UID 2000 /* Effective user ID. */ |
#define AT_SUN_RUID 2001 /* Real user ID. */ |
#define AT_SUN_GID 2002 /* Effective group ID. */ |
#define AT_SUN_RGID 2003 /* Real group ID. */ |
#define AT_SUN_LDELF 2004 /* Dynamic linker's ELF header. */ |
#define AT_SUN_LDSHDR 2005 /* Dynamic linker's section headers. */ |
#define AT_SUN_LDNAME 2006 /* String giving name of dynamic linker. */ |
#define AT_SUN_LPAGESZ 2007 /* Large pagesize. */ |
#define AT_SUN_PLATFORM 2008 /* Platform name string. */ |
#define AT_SUN_HWCAP 2009 /* Machine dependent hints about |
processor capabilities. */ |
#define AT_SUN_IFLUSH 2010 /* Should flush icache? */ |
#define AT_SUN_CPU 2011 /* CPU name string. */ |
#define AT_SUN_EMUL_ENTRY 2012 /* COFF entry point address. */ |
#define AT_SUN_EMUL_EXECFD 2013 /* COFF executable file descriptor. */ |
#define AT_SUN_EXECNAME 2014 /* Canonicalized file name given to execve. */ |
#define AT_SUN_MMU 2015 /* String for name of MMU module. */ |
#define AT_SUN_LDDATA 2016 /* Dynamic linker's data segment address. */ |
#define AT_SUN_AUXFLAGS 2017 /* AF_SUN_ flags passed from the kernel. */ |
#endif /* _ELF_COMMON_H */ |
/contrib/toolchain/binutils/include/elf/cr16.h |
---|
0,0 → 1,62 |
/* CR16 ELF support for BFD. |
Copyright 2007, 2010 Free Software Foundation, Inc. |
Contributed by M R Swami Reddy. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_CR16_H |
#define _ELF_CR16_H |
#include "elf/reloc-macros.h" |
/* Creating indices for reloc_map_index array. */ |
START_RELOC_NUMBERS(elf_cr16_reloc_type) |
RELOC_NUMBER (R_CR16_NONE, 0) |
RELOC_NUMBER (R_CR16_NUM8, 1) |
RELOC_NUMBER (R_CR16_NUM16, 2) |
RELOC_NUMBER (R_CR16_NUM32, 3) |
RELOC_NUMBER (R_CR16_NUM32a, 4) |
RELOC_NUMBER (R_CR16_REGREL4, 5) |
RELOC_NUMBER (R_CR16_REGREL4a, 6) |
RELOC_NUMBER (R_CR16_REGREL14, 7) |
RELOC_NUMBER (R_CR16_REGREL14a, 8) |
RELOC_NUMBER (R_CR16_REGREL16, 9) |
RELOC_NUMBER (R_CR16_REGREL20, 10) |
RELOC_NUMBER (R_CR16_REGREL20a, 11) |
RELOC_NUMBER (R_CR16_ABS20, 12) |
RELOC_NUMBER (R_CR16_ABS24, 13) |
RELOC_NUMBER (R_CR16_IMM4, 14) |
RELOC_NUMBER (R_CR16_IMM8, 15) |
RELOC_NUMBER (R_CR16_IMM16, 16) |
RELOC_NUMBER (R_CR16_IMM20, 17) |
RELOC_NUMBER (R_CR16_IMM24, 18) |
RELOC_NUMBER (R_CR16_IMM32, 19) |
RELOC_NUMBER (R_CR16_IMM32a, 20) |
RELOC_NUMBER (R_CR16_DISP4, 21) |
RELOC_NUMBER (R_CR16_DISP8, 22) |
RELOC_NUMBER (R_CR16_DISP16, 23) |
RELOC_NUMBER (R_CR16_DISP24, 24) |
RELOC_NUMBER (R_CR16_DISP24a, 25) |
RELOC_NUMBER (R_CR16_SWITCH8, 26) |
RELOC_NUMBER (R_CR16_SWITCH16, 27) |
RELOC_NUMBER (R_CR16_SWITCH32, 28) |
RELOC_NUMBER (R_CR16_GOT_REGREL20, 29) |
RELOC_NUMBER (R_CR16_GOTC_REGREL20, 30) |
RELOC_NUMBER (R_CR16_GLOB_DAT, 31) |
END_RELOC_NUMBERS(R_CR16_MAX) |
#endif /* _ELF_CR16_H */ |
/contrib/toolchain/binutils/include/elf/cr16c.h |
---|
0,0 → 1,258 |
/* CR16C ELF support for BFD. |
Copyright 2004, 2008, 2010 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_CR16C_H |
#define _ELF_CR16C_H |
#include "bfd.h" |
#include "elf/reloc-macros.h" |
/* Creating indices for reloc_map_index array. */ |
START_RELOC_NUMBERS (elf_cr16c_reloc_type) |
RELOC_NUMBER (RINDEX_16C_NUM08, 0) |
RELOC_NUMBER (RINDEX_16C_NUM08_C, 1) |
RELOC_NUMBER (RINDEX_16C_NUM16, 2) |
RELOC_NUMBER (RINDEX_16C_NUM16_C, 3) |
RELOC_NUMBER (RINDEX_16C_NUM32, 4) |
RELOC_NUMBER (RINDEX_16C_NUM32_C, 5) |
RELOC_NUMBER (RINDEX_16C_DISP04, 6) |
RELOC_NUMBER (RINDEX_16C_DISP04_C, 7) |
RELOC_NUMBER (RINDEX_16C_DISP08, 8) |
RELOC_NUMBER (RINDEX_16C_DISP08_C, 9) |
RELOC_NUMBER (RINDEX_16C_DISP16, 10) |
RELOC_NUMBER (RINDEX_16C_DISP16_C, 11) |
RELOC_NUMBER (RINDEX_16C_DISP24, 12) |
RELOC_NUMBER (RINDEX_16C_DISP24_C, 13) |
RELOC_NUMBER (RINDEX_16C_DISP24a, 14) |
RELOC_NUMBER (RINDEX_16C_DISP24a_C, 15) |
RELOC_NUMBER (RINDEX_16C_REG04, 16) |
RELOC_NUMBER (RINDEX_16C_REG04_C, 17) |
RELOC_NUMBER (RINDEX_16C_REG04a, 18) |
RELOC_NUMBER (RINDEX_16C_REG04a_C, 19) |
RELOC_NUMBER (RINDEX_16C_REG14, 20) |
RELOC_NUMBER (RINDEX_16C_REG14_C, 21) |
RELOC_NUMBER (RINDEX_16C_REG16, 22) |
RELOC_NUMBER (RINDEX_16C_REG16_C, 23) |
RELOC_NUMBER (RINDEX_16C_REG20, 24) |
RELOC_NUMBER (RINDEX_16C_REG20_C, 25) |
RELOC_NUMBER (RINDEX_16C_ABS20, 26) |
RELOC_NUMBER (RINDEX_16C_ABS20_C, 27) |
RELOC_NUMBER (RINDEX_16C_ABS24, 28) |
RELOC_NUMBER (RINDEX_16C_ABS24_C, 29) |
RELOC_NUMBER (RINDEX_16C_IMM04, 30) |
RELOC_NUMBER (RINDEX_16C_IMM04_C, 31) |
RELOC_NUMBER (RINDEX_16C_IMM16, 32) |
RELOC_NUMBER (RINDEX_16C_IMM16_C, 33) |
RELOC_NUMBER (RINDEX_16C_IMM20, 34) |
RELOC_NUMBER (RINDEX_16C_IMM20_C, 35) |
RELOC_NUMBER (RINDEX_16C_IMM24, 36) |
RELOC_NUMBER (RINDEX_16C_IMM24_C, 37) |
RELOC_NUMBER (RINDEX_16C_IMM32, 38) |
RELOC_NUMBER (RINDEX_16C_IMM32_C, 39) |
END_RELOC_NUMBERS (RINDEX_16C_MAX) |
/* CR16C Relocation Types ('cr_reloc_type' entry in the reloc_map structure). |
The relocation constant name is determined as follows : |
R_16C_<format><size>[_C] |
Where : |
<format> is one of the following: |
NUM - R_NUMBER mnemonic, |
DISP - R_16C_DISPL mnemonic, |
REG - R_16C_REGREL mnemonic, |
ABS - R_16C_ABS mnemonic, |
IMM - R_16C_IMMED mnemonic, |
<size> stands for R_S_16C_<size> |
_C means 'code label' and is only added when R_ADDRTYPE subfield |
is of type R_CODE_ADDR. */ |
/* The table below shows what the hex digits in the definition of the |
relocation type constants correspond to. |
------------------------------------------------------------------ |
R_SIZESP R_FORMAT R_RELTO R_ADDRTYPE |
------------------------------------------------------------------ */ |
/* R_S_16C_08 R_NUMBER R_ABS R_ADDRESS */ |
#define R_16C_NUM08 0X0001 |
/* R_S_16C_08 R_NUMBER R_ABS R_CODE_ADDR */ |
#define R_16C_NUM08_C 0X0006 |
/* R_S_16C_16 R_NUMBER R_ABS R_ADDRESS */ |
#define R_16C_NUM16 0X1001 |
/* R_S_16C_16 R_NUMBER R_ABS R_CODE_ADDR */ |
#define R_16C_NUM16_C 0X1006 |
/* R_S_16C_32 R_NUMBER R_ABS R_ADDRESS */ |
#define R_16C_NUM32 0X2001 |
/* R_S_16C_32 R_NUMBER R_ABS R_CODE_ADDR */ |
#define R_16C_NUM32_C 0X2006 |
/* R_S_16C_04 R_16C_DISPL R_PCREL R_ADDRESS */ |
#define R_16C_DISP04 0X5411 |
/* R_S_16C_04 R_16C_DISPL R_PCREL R_CODE_ADDR */ |
#define R_16C_DISP04_C 0X5416 |
/* R_S_16C_08 R_16C_DISPL R_PCREL R_ADDRESS */ |
#define R_16C_DISP08 0X0411 |
/* R_S_16C_08 R_16C_DISPL R_PCREL R_CODE_ADDR */ |
#define R_16C_DISP08_C 0X0416 |
/* R_S_16C_16 R_16C_DISPL R_PCREL R_ADDRESS */ |
#define R_16C_DISP16 0X1411 |
/* R_S_16C_16 R_16C_DISPL R_PCREL R_CODE_ADDR */ |
#define R_16C_DISP16_C 0X1416 |
/* R_S_16C_24 R_16C_DISPL R_PCREL R_ADDRESS */ |
#define R_16C_DISP24 0X7411 |
/* R_S_16C_24 R_16C_DISPL R_PCREL R_CODE_ADDR */ |
#define R_16C_DISP24_C 0X7416 |
/* R_S_16C_24a R_16C_DISPL R_PCREL R_ADDRESS */ |
#define R_16C_DISP24a 0X6411 |
/* R_S_16C_24a R_16C_DISPL R_PCREL R_CODE_ADDR */ |
#define R_16C_DISP24a_C 0X6416 |
/* R_S_16C_04 R_16C_REGREL R_ABS R_ADDRESS */ |
#define R_16C_REG04 0X5201 |
/* R_S_16C_04 R_16C_REGREL R_ABS R_CODE_ADDR */ |
#define R_16C_REG04_C 0X5206 |
/* R_S_16C_04_a R_16C_REGREL R_ABS R_ADDRESS */ |
#define R_16C_REG04a 0X4201 |
/* R_S_16C_04_a R_16C_REGREL R_ABS R_CODE_ADDR */ |
#define R_16C_REG04a_C 0X4206 |
/* R_S_16C_14 R_16C_REGREL R_ABS R_ADDRESS */ |
#define R_16C_REG14 0X3201 |
/* R_S_16C_14 R_16C_REGREL R_ABS R_CODE_ADDR */ |
#define R_16C_REG14_C 0X3206 |
/* R_S_16C_16 R_16C_REGREL R_ABS R_ADDRESS */ |
#define R_16C_REG16 0X1201 |
/* R_S_16C_16 R_16C_REGREL R_ABS R_CODE_ADDR */ |
#define R_16C_REG16_C 0X1206 |
/* R_S_16C_20 R_16C_REGREL R_ABS R_ADDRESS */ |
#define R_16C_REG20 0X8201 |
/* R_S_16C_20 R_16C_REGREL R_ABS R_CODE_ADDR */ |
#define R_16C_REG20_C 0X8206 |
/* R_S_16C_20 R_16C_ABS R_ABS R_ADDRESS */ |
#define R_16C_ABS20 0X8101 |
/* R_S_16C_20 R_16C_ABS R_ABS R_CODE_ADDR */ |
#define R_16C_ABS20_C 0X8106 |
/* R_S_16C_24 R_16C_ABS R_ABS R_ADDRESS */ |
#define R_16C_ABS24 0X7101 |
/* R_S_16C_24 R_16C_ABS R_ABS R_CODE_ADDR */ |
#define R_16C_ABS24_C 0X7106 |
/* R_S_16C_04 R_16C_IMMED R_ABS R_ADDRESS */ |
#define R_16C_IMM04 0X5301 |
/* R_S_16C_04 R_16C_IMMED R_ABS R_CODE_ADDR */ |
#define R_16C_IMM04_C 0X5306 |
/* R_S_16C_16 R_16C_IMMED R_ABS R_ADDRESS */ |
#define R_16C_IMM16 0X1301 |
/* R_S_16C_16 R_16C_IMMED R_ABS R_CODE_ADDR */ |
#define R_16C_IMM16_C 0X1306 |
/* R_S_16C_20 R_16C_IMMED R_ABS R_ADDRESS */ |
#define R_16C_IMM20 0X8301 |
/* R_S_16C_20 R_16C_IMMED R_ABS R_CODE_ADDR */ |
#define R_16C_IMM20_C 0X8306 |
/* R_S_16C_24 R_16C_IMMED R_ABS R_ADDRESS */ |
#define R_16C_IMM24 0X7301 |
/* R_S_16C_24 R_16C_IMMED R_ABS R_CODE_ADDR */ |
#define R_16C_IMM24_C 0X7306 |
/* R_S_16C_32 R_16C_IMMED R_ABS R_ADDRESS */ |
#define R_16C_IMM32 0X2301 |
/* R_S_16C_32 R_16C_IMMED R_ABS R_CODE_ADDR */ |
#define R_16C_IMM32_C 0X2306 |
/* Relocation item type. */ |
#define R_ADDRTYPE 0x000f |
#define R_ADDRESS 0x0001 /* Take address of symbol. */ |
#define R_CODE_ADDR 0x0006 /* Take address of symbol divided by 2. */ |
/* Relocation action. */ |
#define R_RELTO 0x00f0 |
#define R_ABS 0x0000 /* Keep symbol's address as such. */ |
#define R_PCREL 0x0010 /* Subtract the pc address of hole. */ |
/* Relocation item data format. */ |
#define R_FORMAT 0x0f00 |
#define R_NUMBER 0x0000 /* Retain as two's complement value. */ |
#define R_16C_DISPL 0x0400 /* CR16C displacement type. */ |
#define R_16C_ABS 0x0100 /* CR16C absolute type. */ |
#define R_16C_REGREL 0x0200 /* CR16C register-relative type. */ |
#define R_16C_IMMED 0x0300 /* CR16C immediate type. */ |
/* Relocation item size. */ |
#define R_SIZESP 0xf000 |
#define R_S_16C_04 0x5000 |
#define R_S_16C_04_a 0x4000 |
#define R_S_16C_08 0x0000 |
#define R_S_16C_14 0x3000 |
#define R_S_16C_16 0x1000 |
#define R_S_16C_20 0x8000 |
#define R_S_16C_24_a 0x6000 |
#define R_S_16C_24 0x7000 |
#define R_S_16C_32 0x2000 |
/* Processor specific section indices. These sections do not actually |
exist. Symbols with a st_shndx field corresponding to one of these |
values have a special meaning. */ |
/* Far common symbol. */ |
#define SHN_CR16C_FCOMMON SHN_LORESERVE |
#define SHN_CR16C_NCOMMON (SHN_LORESERVE + 1) |
typedef struct reloc_map |
{ |
unsigned short cr_reloc_type; /* CR relocation type. */ |
bfd_reloc_code_real_type bfd_reloc_enum; /* BFD relocation enum. */ |
} RELOC_MAP; |
#endif /* _ELF_CR16C_H */ |
/contrib/toolchain/binutils/include/elf/cris.h |
---|
0,0 → 1,193 |
/* CRIS ELF support for BFD. |
Copyright 2000, 2001, 2004, 2010 Free Software Foundation, Inc. |
Contributed by Axis Communications AB, Lund, Sweden. |
Written by Hans-Peter Nilsson. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_CRIS_H |
#define _ELF_CRIS_H |
#include "elf/reloc-macros.h" |
/* Relocations. */ |
START_RELOC_NUMBERS (elf_cris_reloc_type) |
RELOC_NUMBER (R_CRIS_NONE, 0) |
RELOC_NUMBER (R_CRIS_8, 1) |
RELOC_NUMBER (R_CRIS_16, 2) |
RELOC_NUMBER (R_CRIS_32, 3) |
/* The "PC" position is the location right after the relocation. */ |
RELOC_NUMBER (R_CRIS_8_PCREL, 4) |
RELOC_NUMBER (R_CRIS_16_PCREL, 5) |
RELOC_NUMBER (R_CRIS_32_PCREL, 6) |
RELOC_NUMBER (R_CRIS_GNU_VTINHERIT, 7) |
RELOC_NUMBER (R_CRIS_GNU_VTENTRY, 8) |
/* Copy contents at dynlinking. Generated by the linker. |
The BFD equivalent is BFD_RELOC_CRIS_COPY. */ |
RELOC_NUMBER (R_CRIS_COPY, 9) |
/* Create GOT entry. Generated by the linker. |
The BFD equivalent is BFD_RELOC_CRIS_GLOB_DAT. */ |
RELOC_NUMBER (R_CRIS_GLOB_DAT, 10) |
/* Create PLT entry. Generated by the linker. |
The BFD equivalent is BFD_RELOC_CRIS_JUMP_SLOT. */ |
RELOC_NUMBER (R_CRIS_JUMP_SLOT, 11) |
/* Adjust by program base. Generated by the linker. |
The BFD equivalent is BFD_RELOC_CRIS_RELATIVE. */ |
RELOC_NUMBER (R_CRIS_RELATIVE, 12) |
/* A 16-bit offset to entry in GOT and request to create GOT entry for |
that symbol. |
The BFD equivalent is BFD_RELOC_CRIS_16_GOT. */ |
RELOC_NUMBER (R_CRIS_16_GOT, 13) |
/* A 32-bit offset to entry in GOT and request to create GOT entry for |
that symbol. |
The BFD equivalent is BFD_RELOC_CRIS_32_GOT. */ |
RELOC_NUMBER (R_CRIS_32_GOT, 14) |
/* A 16-bit offset to entry in PLT part of GOT and request to create PLT |
entry for that symbol. |
The BFD equivalent is BFD_RELOC_CRIS_16_GOTPLT. */ |
RELOC_NUMBER (R_CRIS_16_GOTPLT, 15) |
/* A 32-bit offset to entry in PLT part of GOT and request to create PLT |
entry for that symbol. |
The BFD equivalent is BFD_RELOC_CRIS_32_GOTPLT. */ |
RELOC_NUMBER (R_CRIS_32_GOTPLT, 16) |
/* A 32-bit offset from GOT to (local) symbol: no GOT entry should be |
necessary. |
The BFD equivalent is BFD_RELOC_CRIS_32_GOTREL. */ |
RELOC_NUMBER (R_CRIS_32_GOTREL, 17) |
/* A 32-bit offset from GOT to entry for this symbol in PLT and request |
to create PLT entry for symbol. |
The BFD equivalent is BFD_RELOC_CRIS_32_GOTREL. */ |
RELOC_NUMBER (R_CRIS_32_PLT_GOTREL, 18) |
/* A 32-bit offset from location after this relocation (addend specifies |
offset) to entry for this symbol in PLT and request to create PLT |
entry for symbol. |
The BFD equivalent is BFD_RELOC_CRIS_32_PLT_PCREL. */ |
RELOC_NUMBER (R_CRIS_32_PLT_PCREL, 19) |
/* An assembler-generated-only relocation, instructing the linker to |
reserve two GOT slots, carrying the R_CRIS_DTP relocation for the |
symbol (pointing to the first slot, the relocation fills in |
both). The value is a 32-bit-value, relative to the start of the |
GOT. Assembly syntax: "sym:GDGOTREL". */ |
RELOC_NUMBER (R_CRIS_32_GOT_GD, 20) |
/* Similar to R_CRIS_32_GOT_GD, but the value is a 16-bit unsigned |
number, limiting access to 65536/4 global symbols per module (or |
65536/8 thread variables; loosely speaking G*4+T*8 < 65536, where |
T is the number of thread variables and G is the number of other |
external global variables and functions). Assembly syntax: |
"sym:GDGOTREL16". */ |
RELOC_NUMBER (R_CRIS_16_GOT_GD, 21) |
/* Similar to R_CRIS_32_GOT_GD, but the value is the absolute |
address of the GOT entry. Disallowed in DSOs created with |
-shared. Assembly syntax: "sym:GD". */ |
RELOC_NUMBER (R_CRIS_32_GD, 22) |
/* A linker-generated-only relocation, instructing the dynamic |
linker to fill in the module ID and module-relative-TLS-block |
offset of the symbol in question, used for GOT entries. Note |
that this relocation instructs to fill in two 32-bit values. */ |
RELOC_NUMBER (R_CRIS_DTP, 23) |
/* An assembler-generated-only relocation, instructing the linker to |
reserve the first two GOT slots, and attach the R_CRIS_DTPMOD |
relocation(*) for the module to the first slot, the second |
containing zero. The value is 32 bits, the offset from the start |
of the TLS block of the module to the thread-local symbol |
mentioned in the relocation. This relocation must only be applied |
to module-local symbols. Assembly syntax: "expr:DTPREL". */ |
RELOC_NUMBER (R_CRIS_32_DTPREL, 24) |
/* Similar to R_CRIS_32_DTPREL, but the value is a 16-bit signed |
number, limiting the size of thread-variables of the DSO to 32768 |
bytes. (Note: matches both model 1 and 2 and allows use of addo.w |
as the instruction where this relocation is used.) Assembly |
syntax: "expr:DTPREL16". */ |
RELOC_NUMBER (R_CRIS_16_DTPREL, 25) |
/* An assembler-generated-only relocation, instructing the linker to |
reserve a GOT slot and attach the R_CRIS_32_TPREL relocation for |
the symbol in question. The value is 32 bits, which is the |
GOT-relative offset of the slot. Assembly syntax: |
"sym:TPOFFGOT". */ |
RELOC_NUMBER (R_CRIS_32_GOT_TPREL, 26) |
/* Similar to R_CRIS_32_TPREL, but the value is a 16-bit positive |
number, limiting the number of thread- and global variables of |
the DSO to 32768/4. Assembly syntax: "sym:TPOFFGOT16". */ |
RELOC_NUMBER (R_CRIS_16_GOT_TPREL, 27) |
/* An assembler- and linker-generated relocation, instructing to |
resolve the symbol in question yielding the TLS offset of the |
thread variable, relative to the global TLS block. Not allowed |
as input when generating a DSO. Assembly syntax: |
"expr:TPOFF". */ |
RELOC_NUMBER (R_CRIS_32_TPREL, 28) |
/* Similar to R_CRIS_32_TPREL, but only applicable to executables |
compiled with -msmall-tls. Not allowed in a DSO. The value is a |
16-bit signed number, limiting the size of thread-variables of |
the executable to 32768 bytes. (Note: being signed makes it match |
both model 1 and 2 and allows use of addo.w as the instruction |
where this relocation is applied.) Assembly syntax: |
"expr:TPOFF16". */ |
RELOC_NUMBER (R_CRIS_16_TPREL, 29) |
/* A linker-generated-only relocation, instructing the dynamic |
linker to fill in the current module ID, used for GOT entries |
(usually the fourth one). */ |
RELOC_NUMBER (R_CRIS_DTPMOD, 30) |
/* Similar to R_CRIS_32_GOT_TPREL, but the value is the absolute |
address of the GOT entry. Disallowed in DSOs created with |
-shared. Assembly syntax: "sym:IE". */ |
RELOC_NUMBER (R_CRIS_32_IE, 31) |
/* No other relocs must be visible outside the assembler. */ |
END_RELOC_NUMBERS (R_CRIS_max) |
/* User symbols in this file have a leading underscore. */ |
#define EF_CRIS_UNDERSCORE 0x00000001 |
/* This is a mask for different incompatible machine variants. */ |
#define EF_CRIS_VARIANT_MASK 0x0000000e |
/* Variant 0; may contain v0..10 object. */ |
#define EF_CRIS_VARIANT_ANY_V0_V10 0x00000000 |
/* Variant 1; contains v32 object. */ |
#define EF_CRIS_VARIANT_V32 0x00000002 |
/* Variant 2; contains object compatible with v32 and v10. */ |
#define EF_CRIS_VARIANT_COMMON_V10_V32 0x00000004 |
#endif /* _ELF_CRIS_H */ |
/contrib/toolchain/binutils/include/elf/crx.h |
---|
0,0 → 1,53 |
/* CRX ELF support for BFD. |
Copyright 2004, 2010 Free Software Foundation, Inc. |
Contributed by Tomer Levi, NSC, Israel. |
Originally written for GAS 2.12 by Tomer Levi, NSC, Israel. |
Updates, BFDizing, GNUifying and ELF support by Tomer Levi. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_CRX_H |
#define _ELF_CRX_H |
#include "elf/reloc-macros.h" |
/* Creating indices for reloc_map_index array. */ |
START_RELOC_NUMBERS(elf_crx_reloc_type) |
RELOC_NUMBER (R_CRX_NONE, 0) |
RELOC_NUMBER (R_CRX_REL4, 1) |
RELOC_NUMBER (R_CRX_REL8, 2) |
RELOC_NUMBER (R_CRX_REL8_CMP, 3) |
RELOC_NUMBER (R_CRX_REL16, 4) |
RELOC_NUMBER (R_CRX_REL24, 5) |
RELOC_NUMBER (R_CRX_REL32, 6) |
RELOC_NUMBER (R_CRX_REGREL12, 7) |
RELOC_NUMBER (R_CRX_REGREL22, 8) |
RELOC_NUMBER (R_CRX_REGREL28, 9) |
RELOC_NUMBER (R_CRX_REGREL32, 10) |
RELOC_NUMBER (R_CRX_ABS16, 11) |
RELOC_NUMBER (R_CRX_ABS32, 12) |
RELOC_NUMBER (R_CRX_NUM8, 13) |
RELOC_NUMBER (R_CRX_NUM16, 14) |
RELOC_NUMBER (R_CRX_NUM32, 15) |
RELOC_NUMBER (R_CRX_IMM16, 16) |
RELOC_NUMBER (R_CRX_IMM32, 17) |
RELOC_NUMBER (R_CRX_SWITCH8, 18) |
RELOC_NUMBER (R_CRX_SWITCH16, 19) |
RELOC_NUMBER (R_CRX_SWITCH32, 20) |
END_RELOC_NUMBERS(R_CRX_MAX) |
#endif /* _ELF_CRX_H */ |
/contrib/toolchain/binutils/include/elf/d10v.h |
---|
0,0 → 1,38 |
/* d10v ELF support for BFD. |
Copyright 1998, 2000, 2010 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_D10V_H |
#define _ELF_D10V_H |
#include "elf/reloc-macros.h" |
/* Relocation types. */ |
START_RELOC_NUMBERS (elf_d10v_reloc_type) |
RELOC_NUMBER (R_D10V_NONE, 0) |
RELOC_NUMBER (R_D10V_10_PCREL_R, 1) |
RELOC_NUMBER (R_D10V_10_PCREL_L, 2) |
RELOC_NUMBER (R_D10V_16, 3) |
RELOC_NUMBER (R_D10V_18, 4) |
RELOC_NUMBER (R_D10V_18_PCREL, 5) |
RELOC_NUMBER (R_D10V_32, 6) |
RELOC_NUMBER (R_D10V_GNU_VTINHERIT, 7) |
RELOC_NUMBER (R_D10V_GNU_VTENTRY, 8) |
END_RELOC_NUMBERS (R_D10V_max) |
#endif |
/contrib/toolchain/binutils/include/elf/d30v.h |
---|
0,0 → 1,42 |
/* d30v ELF support for BFD. |
Copyright 1998, 2000, 2010 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_D30V_H |
#define _ELF_D30V_H |
#include "elf/reloc-macros.h" |
/* Relocations. */ |
START_RELOC_NUMBERS (elf_d30v_reloc_type) |
RELOC_NUMBER (R_D30V_NONE, 0) |
RELOC_NUMBER (R_D30V_6, 1) |
RELOC_NUMBER (R_D30V_9_PCREL, 2) |
RELOC_NUMBER (R_D30V_9_PCREL_R, 3) |
RELOC_NUMBER (R_D30V_15, 4) |
RELOC_NUMBER (R_D30V_15_PCREL, 5) |
RELOC_NUMBER (R_D30V_15_PCREL_R, 6) |
RELOC_NUMBER (R_D30V_21, 7) |
RELOC_NUMBER (R_D30V_21_PCREL, 8) |
RELOC_NUMBER (R_D30V_21_PCREL_R, 9) |
RELOC_NUMBER (R_D30V_32, 10) |
RELOC_NUMBER (R_D30V_32_PCREL, 11) |
RELOC_NUMBER (R_D30V_32_NORMAL, 12) |
END_RELOC_NUMBERS (R_D30V_max) |
#endif |
/contrib/toolchain/binutils/include/elf/dlx.h |
---|
0,0 → 1,53 |
/* DLX support for BFD. |
Copyright 2002, 2010 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_DLX_H |
#define _ELF_DLX_H |
#include "elf/reloc-macros.h" |
#if 0 |
START_RELOC_NUMBERS (elf_dlx_reloc_type) |
RELOC_NUMBER (R_DLX_NONE, 0) |
RELOC_NUMBER (R_DLX_RELOC_16, 1) |
RELOC_NUMBER (R_DLX_RELOC_26, 2) |
RELOC_NUMBER (R_DLX_RELOC_32, 3) |
RELOC_NUMBER (R_DLX_GNU_VTINHERIT, 4) |
RELOC_NUMBER (R_DLX_GNU_VTENTRY, 5) |
RELOC_NUMBER (R_DLX_RELOC_16_HI, 6) |
RELOC_NUMBER (R_DLX_RELOC_16_LO, 7) |
RELOC_NUMBER (R_DLX_RELOC_16_PCREL, 8) |
RELOC_NUMBER (R_DLX_RELOC_26_PCREL, 9) |
END_RELOC_NUMBERS (R_DLX_max) |
#else |
START_RELOC_NUMBERS (elf_dlx_reloc_type) |
RELOC_NUMBER (R_DLX_NONE, 0) |
RELOC_NUMBER (R_DLX_RELOC_8, 1) |
RELOC_NUMBER (R_DLX_RELOC_16, 2) |
RELOC_NUMBER (R_DLX_RELOC_32, 3) |
RELOC_NUMBER (R_DLX_GNU_VTINHERIT, 4) |
RELOC_NUMBER (R_DLX_GNU_VTENTRY, 5) |
RELOC_NUMBER (R_DLX_RELOC_16_HI, 6) |
RELOC_NUMBER (R_DLX_RELOC_16_LO, 7) |
RELOC_NUMBER (R_DLX_RELOC_16_PCREL, 8) |
RELOC_NUMBER (R_DLX_RELOC_26_PCREL, 9) |
END_RELOC_NUMBERS (R_DLX_max) |
#endif /* 0 */ |
#endif /* _ELF_DLX_H */ |
/contrib/toolchain/binutils/include/elf/dwarf.h |
---|
0,0 → 1,323 |
/* Declarations and definitions of codes relating to the DWARF symbolic |
debugging information format. |
Written by Ron Guilmette (rfg@netcom.com) |
Copyright 1992, 1993, 1995, 1999, 2005, 2010 Free Software Foundation, Inc. |
This file is part of both GCC and the BFD library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with GCC; see the file COPYING3. If not, write to the Free |
Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA |
02110-1301, USA. */ |
/* This file is derived from the DWARF specification (a public document) |
Revision 1.0.1 (April 8, 1992) developed by the UNIX International |
Programming Languages Special Interest Group (UI/PLSIG) and distributed |
by UNIX International. Copies of this specification are available from |
UNIX International, 20 Waterview Boulevard, Parsippany, NJ, 07054. */ |
#ifndef _ELF_DWARF_H |
#define _ELF_DWARF_H |
/* Tag names and codes. */ |
enum dwarf_tag { |
TAG_padding = 0x0000, |
TAG_array_type = 0x0001, |
TAG_class_type = 0x0002, |
TAG_entry_point = 0x0003, |
TAG_enumeration_type = 0x0004, |
TAG_formal_parameter = 0x0005, |
TAG_global_subroutine = 0x0006, |
TAG_global_variable = 0x0007, |
/* 0x0008 -- reserved */ |
/* 0x0009 -- reserved */ |
TAG_label = 0x000a, |
TAG_lexical_block = 0x000b, |
TAG_local_variable = 0x000c, |
TAG_member = 0x000d, |
/* 0x000e -- reserved */ |
TAG_pointer_type = 0x000f, |
TAG_reference_type = 0x0010, |
TAG_compile_unit = 0x0011, |
TAG_string_type = 0x0012, |
TAG_structure_type = 0x0013, |
TAG_subroutine = 0x0014, |
TAG_subroutine_type = 0x0015, |
TAG_typedef = 0x0016, |
TAG_union_type = 0x0017, |
TAG_unspecified_parameters = 0x0018, |
TAG_variant = 0x0019, |
TAG_common_block = 0x001a, |
TAG_common_inclusion = 0x001b, |
TAG_inheritance = 0x001c, |
TAG_inlined_subroutine = 0x001d, |
TAG_module = 0x001e, |
TAG_ptr_to_member_type = 0x001f, |
TAG_set_type = 0x0020, |
TAG_subrange_type = 0x0021, |
TAG_with_stmt = 0x0022, |
/* GNU extensions */ |
TAG_format_label = 0x8000, /* for FORTRAN 77 and Fortran 90 */ |
TAG_namelist = 0x8001, /* For Fortran 90 */ |
TAG_function_template = 0x8002, /* for C++ */ |
TAG_class_template = 0x8003 /* for C++ */ |
}; |
#define TAG_lo_user 0x8000 /* implementation-defined range start */ |
#define TAG_hi_user 0xffff /* implementation-defined range end */ |
#define TAG_source_file TAG_compile_unit /* for backward compatibility */ |
/* Form names and codes. */ |
enum dwarf_form { |
FORM_ADDR = 0x1, |
FORM_REF = 0x2, |
FORM_BLOCK2 = 0x3, |
FORM_BLOCK4 = 0x4, |
FORM_DATA2 = 0x5, |
FORM_DATA4 = 0x6, |
FORM_DATA8 = 0x7, |
FORM_STRING = 0x8 |
}; |
/* Attribute names and codes. */ |
enum dwarf_attribute { |
AT_sibling = (0x0010|FORM_REF), |
AT_location = (0x0020|FORM_BLOCK2), |
AT_name = (0x0030|FORM_STRING), |
AT_fund_type = (0x0050|FORM_DATA2), |
AT_mod_fund_type = (0x0060|FORM_BLOCK2), |
AT_user_def_type = (0x0070|FORM_REF), |
AT_mod_u_d_type = (0x0080|FORM_BLOCK2), |
AT_ordering = (0x0090|FORM_DATA2), |
AT_subscr_data = (0x00a0|FORM_BLOCK2), |
AT_byte_size = (0x00b0|FORM_DATA4), |
AT_bit_offset = (0x00c0|FORM_DATA2), |
AT_bit_size = (0x00d0|FORM_DATA4), |
/* (0x00e0|FORM_xxxx) -- reserved */ |
AT_element_list = (0x00f0|FORM_BLOCK4), |
AT_stmt_list = (0x0100|FORM_DATA4), |
AT_low_pc = (0x0110|FORM_ADDR), |
AT_high_pc = (0x0120|FORM_ADDR), |
AT_language = (0x0130|FORM_DATA4), |
AT_member = (0x0140|FORM_REF), |
AT_discr = (0x0150|FORM_REF), |
AT_discr_value = (0x0160|FORM_BLOCK2), |
/* (0x0170|FORM_xxxx) -- reserved */ |
/* (0x0180|FORM_xxxx) -- reserved */ |
AT_string_length = (0x0190|FORM_BLOCK2), |
AT_common_reference = (0x01a0|FORM_REF), |
AT_comp_dir = (0x01b0|FORM_STRING), |
AT_const_value_string = (0x01c0|FORM_STRING), |
AT_const_value_data2 = (0x01c0|FORM_DATA2), |
AT_const_value_data4 = (0x01c0|FORM_DATA4), |
AT_const_value_data8 = (0x01c0|FORM_DATA8), |
AT_const_value_block2 = (0x01c0|FORM_BLOCK2), |
AT_const_value_block4 = (0x01c0|FORM_BLOCK4), |
AT_containing_type = (0x01d0|FORM_REF), |
AT_default_value_addr = (0x01e0|FORM_ADDR), |
AT_default_value_data2 = (0x01e0|FORM_DATA2), |
AT_default_value_data4 = (0x01e0|FORM_DATA4), |
AT_default_value_data8 = (0x01e0|FORM_DATA8), |
AT_default_value_string = (0x01e0|FORM_STRING), |
AT_friends = (0x01f0|FORM_BLOCK2), |
AT_inline = (0x0200|FORM_STRING), |
AT_is_optional = (0x0210|FORM_STRING), |
AT_lower_bound_ref = (0x0220|FORM_REF), |
AT_lower_bound_data2 = (0x0220|FORM_DATA2), |
AT_lower_bound_data4 = (0x0220|FORM_DATA4), |
AT_lower_bound_data8 = (0x0220|FORM_DATA8), |
AT_private = (0x0240|FORM_STRING), |
AT_producer = (0x0250|FORM_STRING), |
AT_program = (0x0230|FORM_STRING), |
AT_protected = (0x0260|FORM_STRING), |
AT_prototyped = (0x0270|FORM_STRING), |
AT_public = (0x0280|FORM_STRING), |
AT_pure_virtual = (0x0290|FORM_STRING), |
AT_return_addr = (0x02a0|FORM_BLOCK2), |
AT_abstract_origin = (0x02b0|FORM_REF), |
AT_start_scope = (0x02c0|FORM_DATA4), |
AT_stride_size = (0x02e0|FORM_DATA4), |
AT_upper_bound_ref = (0x02f0|FORM_REF), |
AT_upper_bound_data2 = (0x02f0|FORM_DATA2), |
AT_upper_bound_data4 = (0x02f0|FORM_DATA4), |
AT_upper_bound_data8 = (0x02f0|FORM_DATA8), |
AT_virtual = (0x0300|FORM_STRING), |
/* GNU extensions. */ |
AT_sf_names = (0x8000|FORM_DATA4), |
AT_src_info = (0x8010|FORM_DATA4), |
AT_mac_info = (0x8020|FORM_DATA4), |
AT_src_coords = (0x8030|FORM_DATA4), |
AT_body_begin = (0x8040|FORM_ADDR), |
AT_body_end = (0x8050|FORM_ADDR) |
}; |
#define AT_lo_user 0x2000 /* implementation-defined range start */ |
#define AT_hi_user 0x3ff0 /* implementation-defined range end */ |
/* Location atom names and codes. */ |
enum dwarf_location_atom { |
OP_REG = 0x01, |
OP_BASEREG = 0x02, |
OP_ADDR = 0x03, |
OP_CONST = 0x04, |
OP_DEREF2 = 0x05, |
OP_DEREF4 = 0x06, |
OP_ADD = 0x07, |
/* GNU extensions. */ |
OP_MULT = 0x80 |
}; |
#define OP_LO_USER 0x80 /* implementation-defined range start */ |
#define OP_HI_USER 0xff /* implementation-defined range end */ |
/* Fundamental type names and codes. */ |
enum dwarf_fundamental_type { |
FT_char = 0x0001, |
FT_signed_char = 0x0002, |
FT_unsigned_char = 0x0003, |
FT_short = 0x0004, |
FT_signed_short = 0x0005, |
FT_unsigned_short = 0x0006, |
FT_integer = 0x0007, |
FT_signed_integer = 0x0008, |
FT_unsigned_integer = 0x0009, |
FT_long = 0x000a, |
FT_signed_long = 0x000b, |
FT_unsigned_long = 0x000c, |
FT_pointer = 0x000d, /* an alias for (void *) */ |
FT_float = 0x000e, |
FT_dbl_prec_float = 0x000f, |
FT_ext_prec_float = 0x0010, /* breaks "classic" svr4 SDB */ |
FT_complex = 0x0011, /* breaks "classic" svr4 SDB */ |
FT_dbl_prec_complex = 0x0012, /* breaks "classic" svr4 SDB */ |
/* 0x0013 -- reserved */ |
FT_void = 0x0014, |
FT_boolean = 0x0015, /* breaks "classic" svr4 SDB */ |
FT_ext_prec_complex = 0x0016, /* breaks "classic" svr4 SDB */ |
FT_label = 0x0017, |
/* GNU extensions |
The low order byte must indicate the size (in bytes) for the type. |
All of these types will probably break "classic" svr4 SDB. */ |
FT_long_long = 0x8008, |
FT_signed_long_long = 0x8108, |
FT_unsigned_long_long = 0x8208, |
FT_int8 = 0x9001, |
FT_signed_int8 = 0x9101, |
FT_unsigned_int8 = 0x9201, |
FT_int16 = 0x9302, |
FT_signed_int16 = 0x9402, |
FT_unsigned_int16 = 0x9502, |
FT_int32 = 0x9604, |
FT_signed_int32 = 0x9704, |
FT_unsigned_int32 = 0x9804, |
FT_int64 = 0x9908, |
FT_signed_int64 = 0x9a08, |
FT_unsigned_int64 = 0x9b08, |
FT_int128 = 0x9c10, |
FT_signed_int128 = 0x9d10, |
FT_unsigned_int128 = 0x9e10, |
FT_real32 = 0xa004, |
FT_real64 = 0xa108, |
FT_real96 = 0xa20c, |
FT_real128 = 0xa310 |
}; |
#define FT_lo_user 0x8000 /* implementation-defined range start */ |
#define FT_hi_user 0xffff /* implementation defined range end */ |
/* Type modifier names and codes. */ |
enum dwarf_type_modifier { |
MOD_pointer_to = 0x01, |
MOD_reference_to = 0x02, |
MOD_const = 0x03, |
MOD_volatile = 0x04 |
}; |
#define MOD_lo_user 0x80 /* implementation-defined range start */ |
#define MOD_hi_user 0xff /* implementation-defined range end */ |
/* Array ordering names and codes. */ |
enum dwarf_array_dim_ordering { |
ORD_row_major = 0, |
ORD_col_major = 1 |
}; |
/* Array subscript format names and codes. */ |
enum dwarf_subscr_data_formats { |
FMT_FT_C_C = 0x0, |
FMT_FT_C_X = 0x1, |
FMT_FT_X_C = 0x2, |
FMT_FT_X_X = 0x3, |
FMT_UT_C_C = 0x4, |
FMT_UT_C_X = 0x5, |
FMT_UT_X_C = 0x6, |
FMT_UT_X_X = 0x7, |
FMT_ET = 0x8 |
}; |
/* Derived from above for ease of use. */ |
#define FMT_CODE(_FUNDAMENTAL_TYPE_P, _LB_CONST_P, _UB_CONST_P) \ |
(((_FUNDAMENTAL_TYPE_P) ? 0 : 4) \ |
| ((_LB_CONST_P) ? 0 : 2) \ |
| ((_UB_CONST_P) ? 0 : 1)) |
/* Source language names and codes. */ |
enum dwarf_source_language { |
LANG_C89 = 0x00000001, |
LANG_C = 0x00000002, |
LANG_ADA83 = 0x00000003, |
LANG_C_PLUS_PLUS = 0x00000004, |
LANG_COBOL74 = 0x00000005, |
LANG_COBOL85 = 0x00000006, |
LANG_FORTRAN77 = 0x00000007, |
LANG_FORTRAN90 = 0x00000008, |
LANG_PASCAL83 = 0x00000009, |
LANG_MODULA2 = 0x0000000a, |
LANG_JAVA = 0x0000000b |
}; |
#define LANG_lo_user 0x00008000 /* implementation-defined range start */ |
#define LANG_hi_user 0x0000ffff /* implementation-defined range end */ |
/* Names and codes for GNU "macinfo" extension. */ |
enum dwarf_macinfo_record_type { |
MACINFO_start = 's', |
MACINFO_resume = 'r', |
MACINFO_define = 'd', |
MACINFO_undef = 'u' |
}; |
#endif /* _ELF_DWARF_H */ |
/contrib/toolchain/binutils/include/elf/epiphany.h |
---|
0,0 → 1,59 |
/* Adapteva EPIPHANY ELF support for BFD. |
Copyright (C) 2009, 2011 Free Software Foundation, Inc. |
Contributed by Embecosm on behalf of Adapteva, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_EPIPHANY_H |
#define _ELF_EPIPHANY_H |
#include "elf/reloc-macros.h" |
/* Relocations. */ |
START_RELOC_NUMBERS (elf_epiphany_reloc_type) |
RELOC_NUMBER (R_EPIPHANY_NONE, 0) |
/* Absolute address relocations. */ |
RELOC_NUMBER (R_EPIPHANY_8, 1) |
RELOC_NUMBER (R_EPIPHANY_16, 2) |
RELOC_NUMBER (R_EPIPHANY_32, 3) |
/* PC-relative relocations. */ |
RELOC_NUMBER (R_EPIPHANY_8_PCREL, 4) |
RELOC_NUMBER (R_EPIPHANY_16_PCREL,5) |
RELOC_NUMBER (R_EPIPHANY_32_PCREL,6) |
/* special forms for 8/24 bit branch displacements. */ |
RELOC_NUMBER (R_EPIPHANY_SIMM8, 7) |
RELOC_NUMBER (R_EPIPHANY_SIMM24, 8) |
/* HIGH and LOW relocations taking part of a 32 bit address and |
depositing it into the IMM16 field of a destination. */ |
RELOC_NUMBER (R_EPIPHANY_HIGH, 9) |
RELOC_NUMBER (R_EPIPHANY_LOW,10) |
/* 11 bit signed immediate value. */ |
RELOC_NUMBER (R_EPIPHANY_SIMM11, 11) |
/* 11 bit magnitude addressing displacement. */ |
RELOC_NUMBER (R_EPIPHANY_IMM11, 12) |
/* 8 bit immediate for MOV.S R,IMM8. */ |
RELOC_NUMBER (R_EPIPHANY_IMM8, 13) |
END_RELOC_NUMBERS(R_EPIPHANY_max) |
#endif /* _ELF_EPIPHANY_H */ |
/contrib/toolchain/binutils/include/elf/external.h |
---|
0,0 → 1,288 |
/* ELF support for BFD. |
Copyright 1991, 1992, 1993, 1995, 1997, 1998, 1999, 2001, 2003, 2005, |
2008, 2010 Free Software Foundation, Inc. |
Written by Fred Fish @ Cygnus Support, from information published |
in "UNIX System V Release 4, Programmers Guide: ANSI C and |
Programming Support Tools". |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* This file is part of ELF support for BFD, and contains the portions |
that describe how ELF is represented externally by the BFD library. |
I.E. it describes the in-file representation of ELF. It requires |
the elf/common.h file which contains the portions that are common to |
both the internal and external representations. */ |
/* The 64-bit stuff is kind of random. Perhaps someone will publish a |
spec someday. */ |
#ifndef _ELF_EXTERNAL_H |
#define _ELF_EXTERNAL_H |
/* Special section indices, which may show up in st_shndx fields, among |
other places. */ |
#define SHN_LORESERVE 0xFF00 /* Begin range of reserved indices */ |
#define SHN_LOPROC 0xFF00 /* Begin range of appl-specific */ |
#define SHN_HIPROC 0xFF1F /* End range of appl-specific */ |
#define SHN_LOOS 0xFF20 /* OS specific semantics, lo */ |
#define SHN_HIOS 0xFF3F /* OS specific semantics, hi */ |
#define SHN_ABS 0xFFF1 /* Associated symbol is absolute */ |
#define SHN_COMMON 0xFFF2 /* Associated symbol is in common */ |
#define SHN_XINDEX 0xFFFF /* Section index is held elsewhere */ |
#define SHN_HIRESERVE 0xFFFF /* End range of reserved indices */ |
/* ELF Header (32-bit implementations) */ |
typedef struct { |
unsigned char e_ident[16]; /* ELF "magic number" */ |
unsigned char e_type[2]; /* Identifies object file type */ |
unsigned char e_machine[2]; /* Specifies required architecture */ |
unsigned char e_version[4]; /* Identifies object file version */ |
unsigned char e_entry[4]; /* Entry point virtual address */ |
unsigned char e_phoff[4]; /* Program header table file offset */ |
unsigned char e_shoff[4]; /* Section header table file offset */ |
unsigned char e_flags[4]; /* Processor-specific flags */ |
unsigned char e_ehsize[2]; /* ELF header size in bytes */ |
unsigned char e_phentsize[2]; /* Program header table entry size */ |
unsigned char e_phnum[2]; /* Program header table entry count */ |
unsigned char e_shentsize[2]; /* Section header table entry size */ |
unsigned char e_shnum[2]; /* Section header table entry count */ |
unsigned char e_shstrndx[2]; /* Section header string table index */ |
} Elf32_External_Ehdr; |
typedef struct { |
unsigned char e_ident[16]; /* ELF "magic number" */ |
unsigned char e_type[2]; /* Identifies object file type */ |
unsigned char e_machine[2]; /* Specifies required architecture */ |
unsigned char e_version[4]; /* Identifies object file version */ |
unsigned char e_entry[8]; /* Entry point virtual address */ |
unsigned char e_phoff[8]; /* Program header table file offset */ |
unsigned char e_shoff[8]; /* Section header table file offset */ |
unsigned char e_flags[4]; /* Processor-specific flags */ |
unsigned char e_ehsize[2]; /* ELF header size in bytes */ |
unsigned char e_phentsize[2]; /* Program header table entry size */ |
unsigned char e_phnum[2]; /* Program header table entry count */ |
unsigned char e_shentsize[2]; /* Section header table entry size */ |
unsigned char e_shnum[2]; /* Section header table entry count */ |
unsigned char e_shstrndx[2]; /* Section header string table index */ |
} Elf64_External_Ehdr; |
/* Program header */ |
typedef struct { |
unsigned char p_type[4]; /* Identifies program segment type */ |
unsigned char p_offset[4]; /* Segment file offset */ |
unsigned char p_vaddr[4]; /* Segment virtual address */ |
unsigned char p_paddr[4]; /* Segment physical address */ |
unsigned char p_filesz[4]; /* Segment size in file */ |
unsigned char p_memsz[4]; /* Segment size in memory */ |
unsigned char p_flags[4]; /* Segment flags */ |
unsigned char p_align[4]; /* Segment alignment, file & memory */ |
} Elf32_External_Phdr; |
typedef struct { |
unsigned char p_type[4]; /* Identifies program segment type */ |
unsigned char p_flags[4]; /* Segment flags */ |
unsigned char p_offset[8]; /* Segment file offset */ |
unsigned char p_vaddr[8]; /* Segment virtual address */ |
unsigned char p_paddr[8]; /* Segment physical address */ |
unsigned char p_filesz[8]; /* Segment size in file */ |
unsigned char p_memsz[8]; /* Segment size in memory */ |
unsigned char p_align[8]; /* Segment alignment, file & memory */ |
} Elf64_External_Phdr; |
/* Section header */ |
typedef struct { |
unsigned char sh_name[4]; /* Section name, index in string tbl */ |
unsigned char sh_type[4]; /* Type of section */ |
unsigned char sh_flags[4]; /* Miscellaneous section attributes */ |
unsigned char sh_addr[4]; /* Section virtual addr at execution */ |
unsigned char sh_offset[4]; /* Section file offset */ |
unsigned char sh_size[4]; /* Size of section in bytes */ |
unsigned char sh_link[4]; /* Index of another section */ |
unsigned char sh_info[4]; /* Additional section information */ |
unsigned char sh_addralign[4]; /* Section alignment */ |
unsigned char sh_entsize[4]; /* Entry size if section holds table */ |
} Elf32_External_Shdr; |
typedef struct { |
unsigned char sh_name[4]; /* Section name, index in string tbl */ |
unsigned char sh_type[4]; /* Type of section */ |
unsigned char sh_flags[8]; /* Miscellaneous section attributes */ |
unsigned char sh_addr[8]; /* Section virtual addr at execution */ |
unsigned char sh_offset[8]; /* Section file offset */ |
unsigned char sh_size[8]; /* Size of section in bytes */ |
unsigned char sh_link[4]; /* Index of another section */ |
unsigned char sh_info[4]; /* Additional section information */ |
unsigned char sh_addralign[8]; /* Section alignment */ |
unsigned char sh_entsize[8]; /* Entry size if section holds table */ |
} Elf64_External_Shdr; |
/* Symbol table entry */ |
typedef struct { |
unsigned char st_name[4]; /* Symbol name, index in string tbl */ |
unsigned char st_value[4]; /* Value of the symbol */ |
unsigned char st_size[4]; /* Associated symbol size */ |
unsigned char st_info[1]; /* Type and binding attributes */ |
unsigned char st_other[1]; /* No defined meaning, 0 */ |
unsigned char st_shndx[2]; /* Associated section index */ |
} Elf32_External_Sym; |
typedef struct { |
unsigned char st_name[4]; /* Symbol name, index in string tbl */ |
unsigned char st_info[1]; /* Type and binding attributes */ |
unsigned char st_other[1]; /* No defined meaning, 0 */ |
unsigned char st_shndx[2]; /* Associated section index */ |
unsigned char st_value[8]; /* Value of the symbol */ |
unsigned char st_size[8]; /* Associated symbol size */ |
} Elf64_External_Sym; |
typedef struct { |
unsigned char est_shndx[4]; /* Section index */ |
} Elf_External_Sym_Shndx; |
/* Note segments */ |
typedef struct { |
unsigned char namesz[4]; /* Size of entry's owner string */ |
unsigned char descsz[4]; /* Size of the note descriptor */ |
unsigned char type[4]; /* Interpretation of the descriptor */ |
char name[1]; /* Start of the name+desc data */ |
} Elf_External_Note; |
/* Relocation Entries */ |
typedef struct { |
unsigned char r_offset[4]; /* Location at which to apply the action */ |
unsigned char r_info[4]; /* index and type of relocation */ |
} Elf32_External_Rel; |
typedef struct { |
unsigned char r_offset[4]; /* Location at which to apply the action */ |
unsigned char r_info[4]; /* index and type of relocation */ |
unsigned char r_addend[4]; /* Constant addend used to compute value */ |
} Elf32_External_Rela; |
typedef struct { |
unsigned char r_offset[8]; /* Location at which to apply the action */ |
unsigned char r_info[8]; /* index and type of relocation */ |
} Elf64_External_Rel; |
typedef struct { |
unsigned char r_offset[8]; /* Location at which to apply the action */ |
unsigned char r_info[8]; /* index and type of relocation */ |
unsigned char r_addend[8]; /* Constant addend used to compute value */ |
} Elf64_External_Rela; |
/* dynamic section structure */ |
typedef struct { |
unsigned char d_tag[4]; /* entry tag value */ |
union { |
unsigned char d_val[4]; |
unsigned char d_ptr[4]; |
} d_un; |
} Elf32_External_Dyn; |
typedef struct { |
unsigned char d_tag[8]; /* entry tag value */ |
union { |
unsigned char d_val[8]; |
unsigned char d_ptr[8]; |
} d_un; |
} Elf64_External_Dyn; |
/* The version structures are currently size independent. They are |
named without a 32 or 64. If that ever changes, these structures |
will need to be renamed. */ |
/* This structure appears in a SHT_GNU_verdef section. */ |
typedef struct { |
unsigned char vd_version[2]; |
unsigned char vd_flags[2]; |
unsigned char vd_ndx[2]; |
unsigned char vd_cnt[2]; |
unsigned char vd_hash[4]; |
unsigned char vd_aux[4]; |
unsigned char vd_next[4]; |
} Elf_External_Verdef; |
/* This structure appears in a SHT_GNU_verdef section. */ |
typedef struct { |
unsigned char vda_name[4]; |
unsigned char vda_next[4]; |
} Elf_External_Verdaux; |
/* This structure appears in a SHT_GNU_verneed section. */ |
typedef struct { |
unsigned char vn_version[2]; |
unsigned char vn_cnt[2]; |
unsigned char vn_file[4]; |
unsigned char vn_aux[4]; |
unsigned char vn_next[4]; |
} Elf_External_Verneed; |
/* This structure appears in a SHT_GNU_verneed section. */ |
typedef struct { |
unsigned char vna_hash[4]; |
unsigned char vna_flags[2]; |
unsigned char vna_other[2]; |
unsigned char vna_name[4]; |
unsigned char vna_next[4]; |
} Elf_External_Vernaux; |
/* This structure appears in a SHT_GNU_versym section. This is not a |
standard ELF structure; ELF just uses Elf32_Half. */ |
typedef struct { |
unsigned char vs_vers[2]; |
} ATTRIBUTE_PACKED Elf_External_Versym; |
/* Structure for syminfo section. */ |
typedef struct |
{ |
unsigned char si_boundto[2]; |
unsigned char si_flags[2]; |
} Elf_External_Syminfo; |
/* This structure appears on the stack and in NT_AUXV core file notes. */ |
typedef struct |
{ |
unsigned char a_type[4]; |
unsigned char a_val[4]; |
} Elf32_External_Auxv; |
typedef struct |
{ |
unsigned char a_type[8]; |
unsigned char a_val[8]; |
} Elf64_External_Auxv; |
/* Size of SHT_GROUP section entry. */ |
#define GRP_ENTRY_SIZE 4 |
#endif /* _ELF_EXTERNAL_H */ |
/contrib/toolchain/binutils/include/elf/fr30.h |
---|
0,0 → 1,42 |
/* FR30 ELF support for BFD. |
Copyright 1998, 1999, 2000, 2010 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_FR30_H |
#define _ELF_FR30_H |
#include "elf/reloc-macros.h" |
/* Relocations. */ |
START_RELOC_NUMBERS (elf_fr30_reloc_type) |
RELOC_NUMBER (R_FR30_NONE, 0) |
RELOC_NUMBER (R_FR30_8, 1) |
RELOC_NUMBER (R_FR30_20, 2) |
RELOC_NUMBER (R_FR30_32, 3) |
RELOC_NUMBER (R_FR30_48, 4) |
RELOC_NUMBER (R_FR30_6_IN_4, 5) |
RELOC_NUMBER (R_FR30_8_IN_8, 6) |
RELOC_NUMBER (R_FR30_9_IN_8, 7) |
RELOC_NUMBER (R_FR30_10_IN_8, 8) |
RELOC_NUMBER (R_FR30_9_PCREL, 9) |
RELOC_NUMBER (R_FR30_12_PCREL, 10) |
RELOC_NUMBER (R_FR30_GNU_VTINHERIT, 11) |
RELOC_NUMBER (R_FR30_GNU_VTENTRY, 12) |
END_RELOC_NUMBERS (R_FR30_max) |
#endif /* _ELF_FR30_H */ |
/contrib/toolchain/binutils/include/elf/frv.h |
---|
0,0 → 1,130 |
/* FRV ELF support for BFD. |
Copyright (C) 2002, 2003, 2004, 2005, 2010 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_FRV_H |
#define _ELF_FRV_H |
#include "elf/reloc-macros.h" |
/* Relocations. */ |
START_RELOC_NUMBERS (elf_frv_reloc_type) |
RELOC_NUMBER (R_FRV_NONE, 0) |
RELOC_NUMBER (R_FRV_32, 1) |
RELOC_NUMBER (R_FRV_LABEL16, 2) |
RELOC_NUMBER (R_FRV_LABEL24, 3) |
RELOC_NUMBER (R_FRV_LO16, 4) |
RELOC_NUMBER (R_FRV_HI16, 5) |
RELOC_NUMBER (R_FRV_GPREL12, 6) |
RELOC_NUMBER (R_FRV_GPRELU12, 7) |
RELOC_NUMBER (R_FRV_GPREL32, 8) |
RELOC_NUMBER (R_FRV_GPRELHI, 9) |
RELOC_NUMBER (R_FRV_GPRELLO, 10) |
RELOC_NUMBER (R_FRV_GOT12, 11) |
RELOC_NUMBER (R_FRV_GOTHI, 12) |
RELOC_NUMBER (R_FRV_GOTLO, 13) |
RELOC_NUMBER (R_FRV_FUNCDESC, 14) |
RELOC_NUMBER (R_FRV_FUNCDESC_GOT12, 15) |
RELOC_NUMBER (R_FRV_FUNCDESC_GOTHI, 16) |
RELOC_NUMBER (R_FRV_FUNCDESC_GOTLO, 17) |
RELOC_NUMBER (R_FRV_FUNCDESC_VALUE, 18) |
RELOC_NUMBER (R_FRV_FUNCDESC_GOTOFF12, 19) |
RELOC_NUMBER (R_FRV_FUNCDESC_GOTOFFHI, 20) |
RELOC_NUMBER (R_FRV_FUNCDESC_GOTOFFLO, 21) |
RELOC_NUMBER (R_FRV_GOTOFF12, 22) |
RELOC_NUMBER (R_FRV_GOTOFFHI, 23) |
RELOC_NUMBER (R_FRV_GOTOFFLO, 24) |
RELOC_NUMBER (R_FRV_GETTLSOFF, 25) |
RELOC_NUMBER (R_FRV_TLSDESC_VALUE, 26) |
RELOC_NUMBER (R_FRV_GOTTLSDESC12, 27) |
RELOC_NUMBER (R_FRV_GOTTLSDESCHI, 28) |
RELOC_NUMBER (R_FRV_GOTTLSDESCLO, 29) |
RELOC_NUMBER (R_FRV_TLSMOFF12, 30) |
RELOC_NUMBER (R_FRV_TLSMOFFHI, 31) |
RELOC_NUMBER (R_FRV_TLSMOFFLO, 32) |
RELOC_NUMBER (R_FRV_GOTTLSOFF12, 33) |
RELOC_NUMBER (R_FRV_GOTTLSOFFHI, 34) |
RELOC_NUMBER (R_FRV_GOTTLSOFFLO, 35) |
RELOC_NUMBER (R_FRV_TLSOFF, 36) |
RELOC_NUMBER (R_FRV_TLSDESC_RELAX, 37) |
RELOC_NUMBER (R_FRV_GETTLSOFF_RELAX, 38) |
RELOC_NUMBER (R_FRV_TLSOFF_RELAX, 39) |
RELOC_NUMBER (R_FRV_TLSMOFF, 40) |
RELOC_NUMBER (R_FRV_GNU_VTINHERIT, 200) |
RELOC_NUMBER (R_FRV_GNU_VTENTRY, 201) |
END_RELOC_NUMBERS(R_FRV_max) |
/* Processor specific flags for the ELF header e_flags field. */ |
/* gpr support */ |
#define EF_FRV_GPR_MASK 0x00000003 /* mask for # of gprs */ |
#define EF_FRV_GPR_32 0x00000001 /* -mgpr-32 */ |
#define EF_FRV_GPR_64 0x00000002 /* -mgpr-64 */ |
/* fpr support */ |
#define EF_FRV_FPR_MASK 0x0000000c /* mask for # of fprs */ |
#define EF_FRV_FPR_32 0x00000004 /* -mfpr-32 */ |
#define EF_FRV_FPR_64 0x00000008 /* -mfpr-64 */ |
#define EF_FRV_FPR_NONE 0x0000000c /* -msoft-float */ |
/* double word support */ |
#define EF_FRV_DWORD_MASK 0x00000030 /* mask for dword support */ |
#define EF_FRV_DWORD_YES 0x00000010 /* use double word insns */ |
#define EF_FRV_DWORD_NO 0x00000020 /* don't use double word insn*/ |
#define EF_FRV_DOUBLE 0x00000040 /* -mdouble */ |
#define EF_FRV_MEDIA 0x00000080 /* -mmedia */ |
#define EF_FRV_PIC 0x00000100 /* -fpic */ |
#define EF_FRV_NON_PIC_RELOCS 0x00000200 /* used non pic safe relocs */ |
#define EF_FRV_MULADD 0x00000400 /* -mmuladd */ |
#define EF_FRV_BIGPIC 0x00000800 /* -fPIC */ |
#define EF_FRV_LIBPIC 0x00001000 /* -mlibrary-pic */ |
#define EF_FRV_G0 0x00002000 /* -G 0, no small data ptr */ |
#define EF_FRV_NOPACK 0x00004000 /* -mnopack */ |
#define EF_FRV_FDPIC 0x00008000 /* -mfdpic */ |
#define EF_FRV_CPU_MASK 0xff000000 /* specific cpu bits */ |
#define EF_FRV_CPU_GENERIC 0x00000000 /* generic FRV */ |
#define EF_FRV_CPU_FR500 0x01000000 /* FRV500 */ |
#define EF_FRV_CPU_FR300 0x02000000 /* FRV300 */ |
#define EF_FRV_CPU_SIMPLE 0x03000000 /* SIMPLE */ |
#define EF_FRV_CPU_TOMCAT 0x04000000 /* Tomcat, FR500 prototype */ |
#define EF_FRV_CPU_FR400 0x05000000 /* FRV400 */ |
#define EF_FRV_CPU_FR550 0x06000000 /* FRV550 */ |
#define EF_FRV_CPU_FR405 0x07000000 |
#define EF_FRV_CPU_FR450 0x08000000 |
/* Mask of PIC related bits */ |
#define EF_FRV_PIC_FLAGS (EF_FRV_PIC | EF_FRV_LIBPIC | EF_FRV_BIGPIC \ |
| EF_FRV_FDPIC) |
/* Mask of all flags */ |
#define EF_FRV_ALL_FLAGS (EF_FRV_GPR_MASK | \ |
EF_FRV_FPR_MASK | \ |
EF_FRV_DWORD_MASK | \ |
EF_FRV_DOUBLE | \ |
EF_FRV_MEDIA | \ |
EF_FRV_PIC_FLAGS | \ |
EF_FRV_NON_PIC_RELOCS | \ |
EF_FRV_MULADD | \ |
EF_FRV_G0 | \ |
EF_FRV_NOPACK | \ |
EF_FRV_CPU_MASK) |
#endif /* _ELF_FRV_H */ |
/contrib/toolchain/binutils/include/elf/h8.h |
---|
0,0 → 1,101 |
/* H8300/h8500 ELF support for BFD. |
Copyright 2001-2013 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_H8_H |
#define _ELF_H8_H |
#include "elf/reloc-macros.h" |
/* Relocations. */ |
/* Relocations 59..64 are GNU extensions. */ |
START_RELOC_NUMBERS (elf_h8_reloc_type) |
RELOC_NUMBER (R_H8_NONE, 0) |
RELOC_NUMBER (R_H8_DIR32, 1) |
RELOC_NUMBER (R_H8_DIR32_28, 2) |
RELOC_NUMBER (R_H8_DIR32_24, 3) |
RELOC_NUMBER (R_H8_DIR32_16, 4) |
RELOC_NUMBER (R_H8_DIR32U, 6) |
RELOC_NUMBER (R_H8_DIR32U_28, 7) |
RELOC_NUMBER (R_H8_DIR32U_24, 8) |
RELOC_NUMBER (R_H8_DIR32U_20, 9) |
RELOC_NUMBER (R_H8_DIR32U_16, 10) |
RELOC_NUMBER (R_H8_DIR24, 11) |
RELOC_NUMBER (R_H8_DIR24_20, 12) |
RELOC_NUMBER (R_H8_DIR24_16, 13) |
RELOC_NUMBER (R_H8_DIR24U, 14) |
RELOC_NUMBER (R_H8_DIR24U_20, 15) |
RELOC_NUMBER (R_H8_DIR24U_16, 16) |
RELOC_NUMBER (R_H8_DIR16, 17) |
RELOC_NUMBER (R_H8_DIR16U, 18) |
RELOC_NUMBER (R_H8_DIR16S_32, 19) |
RELOC_NUMBER (R_H8_DIR16S_28, 20) |
RELOC_NUMBER (R_H8_DIR16S_24, 21) |
RELOC_NUMBER (R_H8_DIR16S_20, 22) |
RELOC_NUMBER (R_H8_DIR16S, 23) |
RELOC_NUMBER (R_H8_DIR8, 24) |
RELOC_NUMBER (R_H8_DIR8U, 25) |
RELOC_NUMBER (R_H8_DIR8Z_32, 26) |
RELOC_NUMBER (R_H8_DIR8Z_28, 27) |
RELOC_NUMBER (R_H8_DIR8Z_24, 28) |
RELOC_NUMBER (R_H8_DIR8Z_20, 29) |
RELOC_NUMBER (R_H8_DIR8Z_16, 30) |
RELOC_NUMBER (R_H8_PCREL16, 31) |
RELOC_NUMBER (R_H8_PCREL8, 32) |
RELOC_NUMBER (R_H8_BPOS, 33) |
FAKE_RELOC (R_H8_FIRST_INVALID_DIR_RELOC, 34) |
FAKE_RELOC (R_H8_LAST_INVALID_DIR_RELOC, 58) |
RELOC_NUMBER (R_H8_DIR16A8, 59) |
RELOC_NUMBER (R_H8_DIR16R8, 60) |
RELOC_NUMBER (R_H8_DIR24A8, 61) |
RELOC_NUMBER (R_H8_DIR24R8, 62) |
RELOC_NUMBER (R_H8_DIR32A16, 63) |
RELOC_NUMBER (R_H8_DISP32A16, 64) |
RELOC_NUMBER (R_H8_ABS32, 65) |
RELOC_NUMBER (R_H8_ABS32A16, 127) |
RELOC_NUMBER (R_H8_SYM, 128) |
RELOC_NUMBER (R_H8_OPneg, 129) |
RELOC_NUMBER (R_H8_OPadd, 130) |
RELOC_NUMBER (R_H8_OPsub, 131) |
RELOC_NUMBER (R_H8_OPmul, 132) |
RELOC_NUMBER (R_H8_OPdiv, 133) |
RELOC_NUMBER (R_H8_OPshla, 134) |
RELOC_NUMBER (R_H8_OPshra, 135) |
RELOC_NUMBER (R_H8_OPsctsize, 136) |
RELOC_NUMBER (R_H8_OPhword, 137) |
RELOC_NUMBER (R_H8_OPlword, 138) |
RELOC_NUMBER (R_H8_OPhigh, 139) |
RELOC_NUMBER (R_H8_OPlow, 140) |
RELOC_NUMBER (R_H8_OPscttop, 141) |
END_RELOC_NUMBERS (R_H8_max) |
/* Machine variant if we know it. This field was invented at Cygnus, |
but it is hoped that other vendors will adopt it. If some standard |
is developed, this code should be changed to follow it. */ |
#define EF_H8_MACH 0x00FF0000 |
#define E_H8_MACH_H8300 0x00800000 |
#define E_H8_MACH_H8300H 0x00810000 |
#define E_H8_MACH_H8300S 0x00820000 |
#define E_H8_MACH_H8300HN 0x00830000 |
#define E_H8_MACH_H8300SN 0x00840000 |
#define E_H8_MACH_H8300SX 0x00850000 |
#define E_H8_MACH_H8300SXN 0x00860000 |
#endif |
/contrib/toolchain/binutils/include/elf/hppa.h |
---|
0,0 → 1,635 |
/* HPPA ELF support for BFD. |
Copyright 1993, 1994, 1995, 1998, 1999, 2000, 2005, 2006, 2008, 2010 |
Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* This file holds definitions specific to the HPPA ELF ABI. Note |
that most of this is not actually implemented by BFD. */ |
#ifndef _ELF_HPPA_H |
#define _ELF_HPPA_H |
/* Processor specific flags for the ELF header e_flags field. */ |
/* Trap null address dereferences. */ |
#define EF_PARISC_TRAPNIL 0x00010000 |
/* .PARISC.archext section is present. */ |
#define EF_PARISC_EXT 0x00020000 |
/* Program expects little-endian mode. */ |
#define EF_PARISC_LSB 0x00040000 |
/* Program expects wide mode. */ |
#define EF_PARISC_WIDE 0x00080000 |
/* Do not allow kernel-assisted branch prediction. */ |
#define EF_PARISC_NO_KABP 0x00100000 |
/* Allow lazy swap for dynamically allocated program segments. */ |
#define EF_PARISC_LAZYSWAP 0x00400000 |
/* Architecture version */ |
#define EF_PARISC_ARCH 0x0000ffff |
#define EFA_PARISC_1_0 0x020b |
#define EFA_PARISC_1_1 0x0210 |
#define EFA_PARISC_2_0 0x0214 |
/* Special section indices. */ |
/* A symbol that has been declared as a tentative definition in an ANSI C |
compilation. */ |
#define SHN_PARISC_ANSI_COMMON SHN_LORESERVE |
/* A symbol that has been declared as a common block using the |
huge memory model. */ |
#define SHN_PARISC_HUGE_COMMON (SHN_LORESERVE + 1) |
/* Processor specific section types. */ |
/* Section contains product specific extension bits. */ |
#define SHT_PARISC_EXT 0x70000000 |
/* Section contains unwind table entries. */ |
#define SHT_PARISC_UNWIND 0x70000001 |
/* Section contains debug information for optimized code. */ |
#define SHT_PARISC_DOC 0x70000002 |
/* Section contains code annotations. */ |
#define SHT_PARISC_ANNOT 0x70000003 |
/* DLKM special section. */ |
#define SHT_PARISC_DLKM 0x70000004 |
/* These are strictly for compatibility with the older elf32-hppa |
implementation. Hopefully we can eliminate them in the future. */ |
/* Optional section holding argument location/relocation info. */ |
#define SHT_PARISC_SYMEXTN SHT_LOPROC + 8 |
/* Option section for linker stubs. */ |
#define SHT_PARISC_STUBS SHT_LOPROC + 9 |
/* Processor specific section flags. */ |
/* Section contains code compiled for static branch prediction. */ |
#define SHF_PARISC_SBP 0x80000000 |
/* Section should be allocated from from GP. */ |
#define SHF_PARISC_HUGE 0x40000000 |
/* Section should go near GP. */ |
#define SHF_PARISC_SHORT 0x20000000 |
/* Section is weak ordered. */ |
#define SHF_PARISC_WEAKORDER 0x10000000 |
/* Identifies the entry point of a millicode routine. */ |
#define STT_PARISC_MILLI 13 |
/* ELF/HPPA relocation types */ |
/* Note: PA-ELF is defined to use only RELA relocations. */ |
#include "elf/reloc-macros.h" |
START_RELOC_NUMBERS (elf_hppa_reloc_type) |
RELOC_NUMBER (R_PARISC_NONE, 0) /* No reloc */ |
/* Data / Inst. Format Relocation Expression */ |
RELOC_NUMBER (R_PARISC_DIR32, 1) |
/* 32-bit word symbol + addend */ |
RELOC_NUMBER (R_PARISC_DIR21L, 2) |
/* long immediate (7) LR(symbol, addend) */ |
RELOC_NUMBER (R_PARISC_DIR17R, 3) |
/* branch external (19) RR(symbol, addend) */ |
RELOC_NUMBER (R_PARISC_DIR17F, 4) |
/* branch external (19) symbol + addend */ |
RELOC_NUMBER (R_PARISC_DIR14R, 6) |
/* load/store (1) RR(symbol, addend) */ |
RELOC_NUMBER (R_PARISC_DIR14F, 7) |
/* load/store (1) symbol, addend */ |
/* PC-relative relocation types |
Typically used for calls. |
Note PCREL17C and PCREL17F differ only in overflow handling. |
PCREL17C never reports a relocation error. |
When supporting argument relocations, function calls must be |
accompanied by parameter relocation information. This information is |
carried in the ten high-order bits of the addend field. The remaining |
22 bits of of the addend field are sign-extended to form the Addend. |
Note the code to build argument relocations depends on the |
addend being zero. A consequence of this limitation is GAS |
can not perform relocation reductions for function symbols. */ |
RELOC_NUMBER (R_PARISC_PCREL12F, 8) |
/* op & branch (17) symbol - PC - 8 + addend */ |
RELOC_NUMBER (R_PARISC_PCREL32, 9) |
/* 32-bit word symbol - PC - 8 + addend */ |
RELOC_NUMBER (R_PARISC_PCREL21L, 10) |
/* long immediate (7) L(symbol - PC - 8 + addend) */ |
RELOC_NUMBER (R_PARISC_PCREL17R, 11) |
/* branch external (19) R(symbol - PC - 8 + addend) */ |
RELOC_NUMBER (R_PARISC_PCREL17F, 12) |
/* branch (20) symbol - PC - 8 + addend */ |
RELOC_NUMBER (R_PARISC_PCREL17C, 13) |
/* branch (20) symbol - PC - 8 + addend */ |
RELOC_NUMBER (R_PARISC_PCREL14R, 14) |
/* load/store (1) R(symbol - PC - 8 + addend) */ |
RELOC_NUMBER (R_PARISC_PCREL14F, 15) |
/* load/store (1) symbol - PC - 8 + addend */ |
/* DP-relative relocation types. */ |
RELOC_NUMBER (R_PARISC_DPREL21L, 18) |
/* long immediate (7) LR(symbol - GP, addend) */ |
RELOC_NUMBER (R_PARISC_DPREL14WR, 19) |
/* load/store mod. comp. (2) RR(symbol - GP, addend) */ |
RELOC_NUMBER (R_PARISC_DPREL14DR, 20) |
/* load/store doubleword (3) RR(symbol - GP, addend) */ |
RELOC_NUMBER (R_PARISC_DPREL14R, 22) |
/* load/store (1) RR(symbol - GP, addend) */ |
RELOC_NUMBER (R_PARISC_DPREL14F, 23) |
/* load/store (1) symbol - GP + addend */ |
/* Data linkage table (DLT) relocation types |
SOM DLT_REL fixup requests are used to for static data references |
from position-independent code within shared libraries. They are |
similar to the GOT relocation types in some SVR4 implementations. */ |
RELOC_NUMBER (R_PARISC_DLTREL21L, 26) |
/* long immediate (7) LR(symbol - GP, addend) */ |
RELOC_NUMBER (R_PARISC_DLTREL14R, 30) |
/* load/store (1) RR(symbol - GP, addend) */ |
RELOC_NUMBER (R_PARISC_DLTREL14F, 31) |
/* load/store (1) symbol - GP + addend */ |
/* DLT indirect relocation types */ |
RELOC_NUMBER (R_PARISC_DLTIND21L, 34) |
/* long immediate (7) L(ltoff(symbol + addend)) */ |
RELOC_NUMBER (R_PARISC_DLTIND14R, 38) |
/* load/store (1) R(ltoff(symbol + addend)) */ |
RELOC_NUMBER (R_PARISC_DLTIND14F, 39) |
/* load/store (1) ltoff(symbol + addend) */ |
/* Base relative relocation types. Ugh. These imply lots of state */ |
RELOC_NUMBER (R_PARISC_SETBASE, 40) |
/* none no reloc; base := sym */ |
RELOC_NUMBER (R_PARISC_SECREL32, 41) |
/* 32-bit word symbol - SECT + addend */ |
RELOC_NUMBER (R_PARISC_BASEREL21L, 42) |
/* long immediate (7) LR(symbol - base, addend) */ |
RELOC_NUMBER (R_PARISC_BASEREL17R, 43) |
/* branch external (19) RR(symbol - base, addend) */ |
RELOC_NUMBER (R_PARISC_BASEREL17F, 44) |
/* branch external (19) symbol - base + addend */ |
RELOC_NUMBER (R_PARISC_BASEREL14R, 46) |
/* load/store (1) RR(symbol - base, addend) */ |
RELOC_NUMBER (R_PARISC_BASEREL14F, 47) |
/* load/store (1) symbol - base, addend */ |
/* Segment relative relocation types. */ |
RELOC_NUMBER (R_PARISC_SEGBASE, 48) |
/* none no relocation; SB := sym */ |
RELOC_NUMBER (R_PARISC_SEGREL32, 49) |
/* 32-bit word symbol - SB + addend */ |
/* Offsets from the PLT. */ |
RELOC_NUMBER (R_PARISC_PLTOFF21L, 50) |
/* long immediate (7) LR(pltoff(symbol), addend) */ |
RELOC_NUMBER (R_PARISC_PLTOFF14R, 54) |
/* load/store (1) RR(pltoff(symbol), addend) */ |
RELOC_NUMBER (R_PARISC_PLTOFF14F, 55) |
/* load/store (1) pltoff(symbol) + addend */ |
RELOC_NUMBER (R_PARISC_LTOFF_FPTR32, 57) |
/* 32-bit word ltoff(fptr(symbol+addend)) */ |
RELOC_NUMBER (R_PARISC_LTOFF_FPTR21L, 58) |
/* long immediate (7) L(ltoff(fptr(symbol+addend))) */ |
RELOC_NUMBER (R_PARISC_LTOFF_FPTR14R, 62) |
/* load/store (1) R(ltoff(fptr(symbol+addend))) */ |
RELOC_NUMBER (R_PARISC_FPTR64, 64) |
/* 64-bit doubleword fptr(symbol+addend) */ |
/* Plabel relocation types. */ |
RELOC_NUMBER (R_PARISC_PLABEL32, 65) |
/* 32-bit word fptr(symbol) */ |
RELOC_NUMBER (R_PARISC_PLABEL21L, 66) |
/* long immediate (7) L(fptr(symbol)) */ |
RELOC_NUMBER (R_PARISC_PLABEL14R, 70) |
/* load/store (1) R(fptr(symbol)) */ |
/* PCREL relocations. */ |
RELOC_NUMBER (R_PARISC_PCREL64, 72) |
/* 64-bit doubleword symbol - PC - 8 + addend */ |
RELOC_NUMBER (R_PARISC_PCREL22C, 73) |
/* branch & link (21) symbol - PC - 8 + addend */ |
RELOC_NUMBER (R_PARISC_PCREL22F, 74) |
/* branch & link (21) symbol - PC - 8 + addend */ |
RELOC_NUMBER (R_PARISC_PCREL14WR, 75) |
/* load/store mod. comp. (2) R(symbol - PC - 8 + addend) */ |
RELOC_NUMBER (R_PARISC_PCREL14DR, 76) |
/* load/store doubleword (3) R(symbol - PC - 8 + addend) */ |
RELOC_NUMBER (R_PARISC_PCREL16F, 77) |
/* load/store (1) symbol - PC - 8 + addend */ |
RELOC_NUMBER (R_PARISC_PCREL16WF, 78) |
/* load/store mod. comp. (2) symbol - PC - 8 + addend */ |
RELOC_NUMBER (R_PARISC_PCREL16DF, 79) |
/* load/store doubleword (3) symbol - PC - 8 + addend */ |
RELOC_NUMBER (R_PARISC_DIR64, 80) |
/* 64-bit doubleword symbol + addend */ |
RELOC_NUMBER (R_PARISC_DIR14WR, 83) |
/* load/store mod. comp. (2) RR(symbol, addend) */ |
RELOC_NUMBER (R_PARISC_DIR14DR, 84) |
/* load/store doubleword (3) RR(symbol, addend) */ |
RELOC_NUMBER (R_PARISC_DIR16F, 85) |
/* load/store (1) symbol + addend */ |
RELOC_NUMBER (R_PARISC_DIR16WF, 86) |
/* load/store mod. comp. (2) symbol + addend */ |
RELOC_NUMBER (R_PARISC_DIR16DF, 87) |
/* load/store doubleword (3) symbol + addend */ |
RELOC_NUMBER (R_PARISC_GPREL64, 88) |
/* 64-bit doubleword symbol - GP + addend */ |
RELOC_NUMBER (R_PARISC_DLTREL14WR, 91) |
/* load/store mod. comp. (2) RR(symbol - GP, addend) */ |
RELOC_NUMBER (R_PARISC_DLTREL14DR, 92) |
/* load/store doubleword (3) RR(symbol - GP, addend) */ |
RELOC_NUMBER (R_PARISC_GPREL16F, 93) |
/* load/store (1) symbol - GP + addend */ |
RELOC_NUMBER (R_PARISC_GPREL16WF, 94) |
/* load/store mod. comp. (2) symbol - GP + addend */ |
RELOC_NUMBER (R_PARISC_GPREL16DF, 95) |
/* load/store doubleword (3) symbol - GP + addend */ |
RELOC_NUMBER (R_PARISC_LTOFF64, 96) |
/* 64-bit doubleword ltoff(symbol + addend) */ |
RELOC_NUMBER (R_PARISC_DLTIND14WR, 99) |
/* load/store mod. comp. (2) R(ltoff(symbol + addend)) */ |
RELOC_NUMBER (R_PARISC_DLTIND14DR, 100) |
/* load/store doubleword (3) R(ltoff(symbol + addend)) */ |
RELOC_NUMBER (R_PARISC_LTOFF16F, 101) |
/* load/store (1) ltoff(symbol + addend) */ |
RELOC_NUMBER (R_PARISC_LTOFF16WF, 102) |
/* load/store mod. comp. (2) ltoff(symbol + addend) */ |
RELOC_NUMBER (R_PARISC_LTOFF16DF, 103) |
/* load/store doubleword (3) ltoff(symbol + addend) */ |
RELOC_NUMBER (R_PARISC_SECREL64, 104) |
/* 64-bit doubleword symbol - SECT + addend */ |
RELOC_NUMBER (R_PARISC_BASEREL14WR, 107) |
/* load/store mod. comp. (2) RR(symbol - base, addend) */ |
RELOC_NUMBER (R_PARISC_BASEREL14DR, 108) |
/* load/store doubleword (3) RR(symbol - base, addend) */ |
RELOC_NUMBER (R_PARISC_SEGREL64, 112) |
/* 64-bit doubleword symbol - SB + addend */ |
RELOC_NUMBER (R_PARISC_PLTOFF14WR, 115) |
/* load/store mod. comp. (2) RR(pltoff(symbol), addend) */ |
RELOC_NUMBER (R_PARISC_PLTOFF14DR, 116) |
/* load/store doubleword (3) RR(pltoff(symbol), addend) */ |
RELOC_NUMBER (R_PARISC_PLTOFF16F, 117) |
/* load/store (1) pltoff(symbol) + addend */ |
RELOC_NUMBER (R_PARISC_PLTOFF16WF, 118) |
/* load/store mod. comp. (2) pltoff(symbol) + addend */ |
RELOC_NUMBER (R_PARISC_PLTOFF16DF, 119) |
/* load/store doubleword (3) pltoff(symbol) + addend */ |
RELOC_NUMBER (R_PARISC_LTOFF_FPTR64, 120) |
/* 64-bit doubleword ltoff(fptr(symbol+addend)) */ |
RELOC_NUMBER (R_PARISC_LTOFF_FPTR14WR, 123) |
/* load/store mod. comp. (2) R(ltoff(fptr(symbol+addend))) */ |
RELOC_NUMBER (R_PARISC_LTOFF_FPTR14DR, 124) |
/* load/store doubleword (3) R(ltoff(fptr(symbol+addend))) */ |
RELOC_NUMBER (R_PARISC_LTOFF_FPTR16F, 125) |
/* load/store (1) ltoff(fptr(symbol+addend)) */ |
RELOC_NUMBER (R_PARISC_LTOFF_FPTR16WF, 126) |
/* load/store mod. comp. (2) ltoff(fptr(symbol+addend)) */ |
RELOC_NUMBER (R_PARISC_LTOFF_FPTR16DF, 127) |
/* load/store doubleword (3) ltoff(fptr(symbol+addend)) */ |
RELOC_NUMBER (R_PARISC_COPY, 128) |
/* data Dynamic relocations only */ |
RELOC_NUMBER (R_PARISC_IPLT, 129) |
/* plt */ |
RELOC_NUMBER (R_PARISC_EPLT, 130) |
/* plt */ |
RELOC_NUMBER (R_PARISC_TPREL32, 153) |
/* 32-bit word symbol - TP + addend */ |
RELOC_NUMBER (R_PARISC_TPREL21L, 154) |
/* long immediate (7) LR(symbol - TP, addend) */ |
RELOC_NUMBER (R_PARISC_TPREL14R, 158) |
/* load/store (1) RR(symbol - TP, addend) */ |
RELOC_NUMBER (R_PARISC_LTOFF_TP21L, 162) |
/* long immediate (7) L(ltoff(symbol - TP + addend)) */ |
RELOC_NUMBER (R_PARISC_LTOFF_TP14R, 166) |
/* load/store (1) R(ltoff(symbol - TP + addend)) */ |
RELOC_NUMBER (R_PARISC_LTOFF_TP14F, 167) |
/* load/store (1) ltoff(symbol - TP + addend) */ |
RELOC_NUMBER (R_PARISC_TPREL64, 216) |
/* 64-bit word symbol - TP + addend */ |
RELOC_NUMBER (R_PARISC_TPREL14WR, 219) |
/* load/store mod. comp. (2) RR(symbol - TP, addend) */ |
RELOC_NUMBER (R_PARISC_TPREL14DR, 220) |
/* load/store doubleword (3) RR(symbol - TP, addend) */ |
RELOC_NUMBER (R_PARISC_TPREL16F, 221) |
/* load/store (1) symbol - TP + addend */ |
RELOC_NUMBER (R_PARISC_TPREL16WF, 222) |
/* load/store mod. comp. (2) symbol - TP + addend */ |
RELOC_NUMBER (R_PARISC_TPREL16DF, 223) |
/* load/store doubleword (3) symbol - TP + addend */ |
RELOC_NUMBER (R_PARISC_LTOFF_TP64, 224) |
/* 64-bit doubleword ltoff(symbol - TP + addend) */ |
RELOC_NUMBER (R_PARISC_LTOFF_TP14WR, 227) |
/* load/store mod. comp. (2) R(ltoff(symbol - TP + addend)) */ |
RELOC_NUMBER (R_PARISC_LTOFF_TP14DR, 228) |
/* load/store doubleword (3) R(ltoff(symbol - TP + addend)) */ |
RELOC_NUMBER (R_PARISC_LTOFF_TP16F, 229) |
/* load/store (1) ltoff(symbol - TP + addend) */ |
RELOC_NUMBER (R_PARISC_LTOFF_TP16WF, 230) |
/* load/store mod. comp. (2) ltoff(symbol - TP + addend) */ |
RELOC_NUMBER (R_PARISC_LTOFF_TP16DF, 231) |
/* load/store doubleword (3) ltoff(symbol - TP + addend) */ |
RELOC_NUMBER (R_PARISC_GNU_VTENTRY, 232) |
RELOC_NUMBER (R_PARISC_GNU_VTINHERIT, 233) |
RELOC_NUMBER (R_PARISC_TLS_GD21L, 234) |
RELOC_NUMBER (R_PARISC_TLS_GD14R, 235) |
RELOC_NUMBER (R_PARISC_TLS_GDCALL, 236) |
RELOC_NUMBER (R_PARISC_TLS_LDM21L, 237) |
RELOC_NUMBER (R_PARISC_TLS_LDM14R, 238) |
RELOC_NUMBER (R_PARISC_TLS_LDMCALL, 239) |
RELOC_NUMBER (R_PARISC_TLS_LDO21L, 240) |
RELOC_NUMBER (R_PARISC_TLS_LDO14R, 241) |
RELOC_NUMBER (R_PARISC_TLS_DTPMOD32, 242) |
RELOC_NUMBER (R_PARISC_TLS_DTPMOD64, 243) |
RELOC_NUMBER (R_PARISC_TLS_DTPOFF32, 244) |
RELOC_NUMBER (R_PARISC_TLS_DTPOFF64, 245) |
END_RELOC_NUMBERS (R_PARISC_UNIMPLEMENTED) |
#define R_PARISC_TLS_LE21L R_PARISC_TPREL21L |
#define R_PARISC_TLS_LE14R R_PARISC_TPREL14R |
#define R_PARISC_TLS_IE21L R_PARISC_LTOFF_TP21L |
#define R_PARISC_TLS_IE14R R_PARISC_LTOFF_TP14R |
#define R_PARISC_TLS_TPREL32 R_PARISC_TPREL32 |
#define R_PARISC_TLS_TPREL64 R_PARISC_TPREL64 |
#ifndef RELOC_MACROS_GEN_FUNC |
typedef enum elf_hppa_reloc_type elf_hppa_reloc_type; |
#endif |
#define PT_PARISC_ARCHEXT 0x70000000 |
#define PT_PARISC_UNWIND 0x70000001 |
#define PT_PARISC_WEAKORDER 0x70000002 |
/* Flag bits in sh_flags of ElfXX_Shdr. */ |
#define SHF_HP_TLS 0x01000000 |
#define SHF_HP_NEAR_SHARED 0x02000000 |
#define SHF_HP_FAR_SHARED 0x04000000 |
#define SHF_HP_COMDAT 0x08000000 |
#define SHF_HP_CONST 0x00800000 |
/* Reserved section header indices. */ |
#define SHN_TLS_COMMON (SHN_LOOS + 0x0) |
#define SHN_NS_COMMON (SHN_LOOS + 0x1) |
#define SHN_FS_COMMON (SHN_LOOS + 0x2) |
#define SHN_NS_UNDEF (SHN_LOOS + 0x3) |
#define SHN_FS_UNDEF (SHN_LOOS + 0x4) |
#define SHN_HP_EXTERN (SHN_LOOS + 0x5) |
#define SHN_HP_EXTHINT (SHN_LOOS + 0x6) |
#define SHN_HP_UNDEF_BIND_IMM (SHN_LOOS + 0x7) |
/* Values of sh_type in ElfXX_Shdr. */ |
#define SHT_HP_OVLBITS (SHT_LOOS + 0x0) |
#define SHT_HP_DLKM (SHT_LOOS + 0x1) |
#define SHT_HP_COMDAT (SHT_LOOS + 0x2) |
#define SHT_HP_OBJDICT (SHT_LOOS + 0x3) |
#define SHT_HP_ANNOT (SHT_LOOS + 0x4) |
/* Flag bits in p_flags of ElfXX_Phdr. */ |
#define PF_HP_CODE 0x00040000 |
#define PF_HP_MODIFY 0x00080000 |
#define PF_HP_PAGE_SIZE 0x00100000 |
#define PF_HP_FAR_SHARED 0x00200000 |
#define PF_HP_NEAR_SHARED 0x00400000 |
#define PF_HP_LAZYSWAP 0x00800000 |
#define PF_HP_CODE_DEPR 0x01000000 |
#define PF_HP_MODIFY_DEPR 0x02000000 |
#define PF_HP_LAZYSWAP_DEPR 0x04000000 |
#define PF_PARISC_SBP 0x08000000 |
#define PF_HP_SBP 0x08000000 |
/* Processor specific dynamic array tags. */ |
/* Arggh. HP's tools define these symbols based on the |
old value of DT_LOOS. So we must do the same to be |
compatible. */ |
#define DT_HP_LOAD_MAP (OLD_DT_LOOS + 0x0) |
#define DT_HP_DLD_FLAGS (OLD_DT_LOOS + 0x1) |
#define DT_HP_DLD_HOOK (OLD_DT_LOOS + 0x2) |
#define DT_HP_UX10_INIT (OLD_DT_LOOS + 0x3) |
#define DT_HP_UX10_INITSZ (OLD_DT_LOOS + 0x4) |
#define DT_HP_PREINIT (OLD_DT_LOOS + 0x5) |
#define DT_HP_PREINITSZ (OLD_DT_LOOS + 0x6) |
#define DT_HP_NEEDED (OLD_DT_LOOS + 0x7) |
#define DT_HP_TIME_STAMP (OLD_DT_LOOS + 0x8) |
#define DT_HP_CHECKSUM (OLD_DT_LOOS + 0x9) |
#define DT_HP_GST_SIZE (OLD_DT_LOOS + 0xa) |
#define DT_HP_GST_VERSION (OLD_DT_LOOS + 0xb) |
#define DT_HP_GST_HASHVAL (OLD_DT_LOOS + 0xc) |
#define DT_HP_EPLTREL (OLD_DT_LOOS + 0xd) |
#define DT_HP_EPLTRELSZ (OLD_DT_LOOS + 0xe) |
#define DT_HP_FILTERED (OLD_DT_LOOS + 0xf) |
#define DT_HP_FILTER_TLS (OLD_DT_LOOS + 0x10) |
#define DT_HP_COMPAT_FILTERED (OLD_DT_LOOS + 0x11) |
#define DT_HP_LAZYLOAD (OLD_DT_LOOS + 0x12) |
#define DT_HP_BIND_NOW_COUNT (OLD_DT_LOOS + 0x13) |
#define DT_PLT (OLD_DT_LOOS + 0x14) |
#define DT_PLT_SIZE (OLD_DT_LOOS + 0x15) |
#define DT_DLT (OLD_DT_LOOS + 0x16) |
#define DT_DLT_SIZE (OLD_DT_LOOS + 0x17) |
/* Values for DT_HP_DLD_FLAGS. */ |
#define DT_HP_DEBUG_PRIVATE 0x00001 /* Map text private */ |
#define DT_HP_DEBUG_CALLBACK 0x00002 /* Callback */ |
#define DT_HP_DEBUG_CALLBACK_BOR 0x00004 /* BOR callback */ |
#define DT_HP_NO_ENVVAR 0x00008 /* No env var */ |
#define DT_HP_BIND_NOW 0x00010 /* Bind now */ |
#define DT_HP_BIND_NONFATAL 0x00020 /* Bind non-fatal */ |
#define DT_HP_BIND_VERBOSE 0x00040 /* Bind verbose */ |
#define DT_HP_BIND_RESTRICTED 0x00080 /* Bind restricted */ |
#define DT_HP_BIND_SYMBOLIC 0x00100 /* Bind symbolic */ |
#define DT_HP_RPATH_FIRST 0x00200 /* RPATH first */ |
#define DT_HP_BIND_DEPTH_FIRST 0x00400 /* Bind depth-first */ |
#define DT_HP_GST 0x00800 /* Dld global sym table */ |
#define DT_HP_SHLIB_FIXED 0x01000 /* shared vtable support */ |
#define DT_HP_MERGE_SHLIB_SEG 0x02000 /* merge shlib data segs */ |
#define DT_HP_NODELETE 0x04000 /* never unload */ |
#define DT_HP_GROUP 0x08000 /* bind only within group */ |
#define DT_HP_PROTECT_LINKAGE_TABLE 0x10000 /* protected linkage table */ |
/* Program header extensions. */ |
#define PT_HP_TLS (PT_LOOS + 0x0) |
#define PT_HP_CORE_NONE (PT_LOOS + 0x1) |
#define PT_HP_CORE_VERSION (PT_LOOS + 0x2) |
#define PT_HP_CORE_KERNEL (PT_LOOS + 0x3) |
#define PT_HP_CORE_COMM (PT_LOOS + 0x4) |
#define PT_HP_CORE_PROC (PT_LOOS + 0x5) |
#define PT_HP_CORE_LOADABLE (PT_LOOS + 0x6) |
#define PT_HP_CORE_STACK (PT_LOOS + 0x7) |
#define PT_HP_CORE_SHM (PT_LOOS + 0x8) |
#define PT_HP_CORE_MMF (PT_LOOS + 0x9) |
#define PT_HP_PARALLEL (PT_LOOS + 0x10) |
#define PT_HP_FASTBIND (PT_LOOS + 0x11) |
#define PT_HP_OPT_ANNOT (PT_LOOS + 0x12) |
#define PT_HP_HSL_ANNOT (PT_LOOS + 0x13) |
#define PT_HP_STACK (PT_LOOS + 0x14) |
#define PT_HP_CORE_UTSNAME (PT_LOOS + 0x15) |
/* Binding information. */ |
#define STB_HP_ALIAS (STB_LOOS + 0x0) |
/* Additional symbol types. */ |
#define STT_HP_OPAQUE (STT_LOOS + 0x1) |
#define STT_HP_STUB (STT_LOOS + 0x2) |
/* Note types. */ |
#define NT_HP_COMPILER 1 |
#define NT_HP_COPYRIGHT 2 |
#define NT_HP_VERSION 3 |
#define NT_HP_SRCFILE_INFO 4 |
#define NT_HP_LINKER 5 |
#define NT_HP_INSTRUMENTED 6 |
#define NT_HP_UX_OPTIONS 7 |
#endif /* _ELF_HPPA_H */ |
/contrib/toolchain/binutils/include/elf/i370.h |
---|
0,0 → 1,61 |
/* i370 ELF support for BFD. |
Copyright 2000, 2002, 2010 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* This file holds definitions specific to the i370 ELF ABI. Note |
that most of this is not actually implemented by BFD. */ |
#ifndef _ELF_I370_H |
#define _ELF_I370_H |
#include "elf/reloc-macros.h" |
/* Processor specific section headers, sh_type field */ |
#define SHT_ORDERED SHT_HIPROC /* Link editor is to sort the \ |
entries in this section \ |
based on the address \ |
specified in the associated \ |
symbol table entry. */ |
#define EF_I370_RELOCATABLE 0x00010000 /* i370 -mrelocatable flag */ |
#define EF_I370_RELOCATABLE_LIB 0x00008000 /* i370 -mrelocatable-lib flag */ |
/* i370 relocations |
Note that there is really just one relocation that we currently |
support (and only one that we seem to need, at the moment), and |
that is the 31-bit address relocation. Note that the 370/390 |
only supports a 31-bit (2GB) address space. */ |
START_RELOC_NUMBERS (i370_reloc_type) |
RELOC_NUMBER (R_I370_NONE, 0) |
RELOC_NUMBER (R_I370_ADDR31, 1) |
RELOC_NUMBER (R_I370_ADDR32, 2) |
RELOC_NUMBER (R_I370_ADDR16, 3) |
RELOC_NUMBER (R_I370_REL31, 4) |
RELOC_NUMBER (R_I370_REL32, 5) |
RELOC_NUMBER (R_I370_ADDR12, 6) |
RELOC_NUMBER (R_I370_REL12, 7) |
RELOC_NUMBER (R_I370_ADDR8, 8) |
RELOC_NUMBER (R_I370_REL8, 9) |
RELOC_NUMBER (R_I370_COPY, 10) |
RELOC_NUMBER (R_I370_RELATIVE, 11) |
END_RELOC_NUMBERS (R_I370_max) |
#endif /* _ELF_I370_H */ |
/contrib/toolchain/binutils/include/elf/i386.h |
---|
0,0 → 1,79 |
/* ix86 ELF support for BFD. |
Copyright 1998, 1999, 2000, 2002, 2004, 2005, 2006, 2009, 2010 |
Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_I386_H |
#define _ELF_I386_H |
#include "elf/reloc-macros.h" |
START_RELOC_NUMBERS (elf_i386_reloc_type) |
RELOC_NUMBER (R_386_NONE, 0) /* No reloc */ |
RELOC_NUMBER (R_386_32, 1) /* Direct 32 bit */ |
RELOC_NUMBER (R_386_PC32, 2) /* PC relative 32 bit */ |
RELOC_NUMBER (R_386_GOT32, 3) /* 32 bit GOT entry */ |
RELOC_NUMBER (R_386_PLT32, 4) /* 32 bit PLT address */ |
RELOC_NUMBER (R_386_COPY, 5) /* Copy symbol at runtime */ |
RELOC_NUMBER (R_386_GLOB_DAT, 6) /* Create GOT entry */ |
RELOC_NUMBER (R_386_JUMP_SLOT, 7) /* Create PLT entry */ |
RELOC_NUMBER (R_386_RELATIVE, 8) /* Adjust by program base */ |
RELOC_NUMBER (R_386_GOTOFF, 9) /* 32 bit offset to GOT */ |
RELOC_NUMBER (R_386_GOTPC, 10) /* 32 bit PC relative offset to GOT */ |
RELOC_NUMBER (R_386_32PLT, 11) /* Used by Sun */ |
FAKE_RELOC (FIRST_INVALID_RELOC, 12) |
FAKE_RELOC (LAST_INVALID_RELOC, 13) |
RELOC_NUMBER (R_386_TLS_TPOFF,14) |
RELOC_NUMBER (R_386_TLS_IE, 15) |
RELOC_NUMBER (R_386_TLS_GOTIE,16) |
RELOC_NUMBER (R_386_TLS_LE, 17) |
RELOC_NUMBER (R_386_TLS_GD, 18) |
RELOC_NUMBER (R_386_TLS_LDM, 19) |
RELOC_NUMBER (R_386_16, 20) |
RELOC_NUMBER (R_386_PC16, 21) |
RELOC_NUMBER (R_386_8, 22) |
RELOC_NUMBER (R_386_PC8, 23) |
RELOC_NUMBER (R_386_TLS_GD_32, 24) |
RELOC_NUMBER (R_386_TLS_GD_PUSH, 25) |
RELOC_NUMBER (R_386_TLS_GD_CALL, 26) |
RELOC_NUMBER (R_386_TLS_GD_POP, 27) |
RELOC_NUMBER (R_386_TLS_LDM_32, 28) |
RELOC_NUMBER (R_386_TLS_LDM_PUSH, 29) |
RELOC_NUMBER (R_386_TLS_LDM_CALL, 30) |
RELOC_NUMBER (R_386_TLS_LDM_POP, 31) |
RELOC_NUMBER (R_386_TLS_LDO_32, 32) |
RELOC_NUMBER (R_386_TLS_IE_32, 33) |
RELOC_NUMBER (R_386_TLS_LE_32, 34) |
RELOC_NUMBER (R_386_TLS_DTPMOD32, 35) |
RELOC_NUMBER (R_386_TLS_DTPOFF32, 36) |
RELOC_NUMBER (R_386_TLS_TPOFF32, 37) |
RELOC_NUMBER (R_386_SIZE32, 38) /* 32-bit symbol size */ |
RELOC_NUMBER (R_386_TLS_GOTDESC, 39) |
RELOC_NUMBER (R_386_TLS_DESC_CALL,40) |
RELOC_NUMBER (R_386_TLS_DESC, 41) |
RELOC_NUMBER (R_386_IRELATIVE, 42) /* Adjust indirectly by program base */ |
/* Used by Intel. */ |
RELOC_NUMBER (R_386_USED_BY_INTEL_200, 200) |
/* These are GNU extensions to enable C++ vtable garbage collection. */ |
RELOC_NUMBER (R_386_GNU_VTINHERIT, 250) |
RELOC_NUMBER (R_386_GNU_VTENTRY, 251) |
END_RELOC_NUMBERS (R_386_max) |
#endif |
/contrib/toolchain/binutils/include/elf/i860.h |
---|
0,0 → 1,66 |
/* i860 ELF support for BFD. |
Copyright 2000, 2010 Free Software Foundation, Inc. |
Contributed by Jason Eckhardt <jle@cygnus.com>. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_I860_H |
#define _ELF_I860_H |
/* Note: i860 ELF is defined to use only RELA relocations. */ |
#include "elf/reloc-macros.h" |
START_RELOC_NUMBERS (elf_i860_reloc_type) |
RELOC_NUMBER (R_860_NONE, 0x00) /* No reloc */ |
RELOC_NUMBER (R_860_32, 0x01) /* S+A */ |
RELOC_NUMBER (R_860_COPY, 0x02) /* No calculation */ |
RELOC_NUMBER (R_860_GLOB_DAT, 0x03) /* S, Create GOT entry */ |
RELOC_NUMBER (R_860_JUMP_SLOT, 0x04) /* S+A, Create PLT entry */ |
RELOC_NUMBER (R_860_RELATIVE, 0x05) /* B+A, Adj by program base */ |
RELOC_NUMBER (R_860_PC26, 0x30) /* (S+A-P) >> 2 */ |
RELOC_NUMBER (R_860_PLT26, 0x31) /* (L+A-P) >> 2 */ |
RELOC_NUMBER (R_860_PC16, 0x32) /* (S+A-P) >> 2 */ |
RELOC_NUMBER (R_860_LOW0, 0x40) /* S+A */ |
RELOC_NUMBER (R_860_SPLIT0, 0x42) /* S+A */ |
RELOC_NUMBER (R_860_LOW1, 0x44) /* S+A */ |
RELOC_NUMBER (R_860_SPLIT1, 0x46) /* S+A */ |
RELOC_NUMBER (R_860_LOW2, 0x48) /* S+A */ |
RELOC_NUMBER (R_860_SPLIT2, 0x4A) /* S+A */ |
RELOC_NUMBER (R_860_LOW3, 0x4C) /* S+A */ |
RELOC_NUMBER (R_860_LOGOT0, 0x50) /* G */ |
RELOC_NUMBER (R_860_SPGOT0, 0x52) /* G */ |
RELOC_NUMBER (R_860_LOGOT1, 0x54) /* G */ |
RELOC_NUMBER (R_860_SPGOT1, 0x56) /* G */ |
RELOC_NUMBER (R_860_LOGOTOFF0, 0x60) /* O */ |
RELOC_NUMBER (R_860_SPGOTOFF0, 0x62) /* O */ |
RELOC_NUMBER (R_860_LOGOTOFF1, 0x64) /* O */ |
RELOC_NUMBER (R_860_SPGOTOFF1, 0x66) /* O */ |
RELOC_NUMBER (R_860_LOGOTOFF2, 0x68) /* O */ |
RELOC_NUMBER (R_860_LOGOTOFF3, 0x6C) /* O */ |
RELOC_NUMBER (R_860_LOPC, 0x70) /* (S+A-P) >> 2 */ |
RELOC_NUMBER (R_860_HIGHADJ, 0x80) /* hiadj(S+A) */ |
RELOC_NUMBER (R_860_HAGOT, 0x90) /* hiadj(G) */ |
RELOC_NUMBER (R_860_HAGOTOFF, 0xA0) /* hiadj(O) */ |
RELOC_NUMBER (R_860_HAPC, 0xB0) /* hiadj((S+A-P) >> 2) */ |
RELOC_NUMBER (R_860_HIGH, 0xC0) /* (S+A) >> 16 */ |
RELOC_NUMBER (R_860_HIGOT, 0xD0) /* G >> 16 */ |
RELOC_NUMBER (R_860_HIGOTOFF, 0xE0) /* O */ |
END_RELOC_NUMBERS (R_860_max) |
#endif |
/contrib/toolchain/binutils/include/elf/i960.h |
---|
0,0 → 1,37 |
/* Intel 960 ELF support for BFD. |
Copyright 1999, 2000, 2010 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_I960_H |
#define _ELF_I960_H |
#include "elf/reloc-macros.h" |
START_RELOC_NUMBERS (elf_i960_reloc_type) |
RELOC_NUMBER (R_960_NONE, 0) |
RELOC_NUMBER (R_960_12, 1) |
RELOC_NUMBER (R_960_32, 2) |
RELOC_NUMBER (R_960_IP24, 3) |
RELOC_NUMBER (R_960_SUB, 4) |
RELOC_NUMBER (R_960_OPTCALL, 5) |
RELOC_NUMBER (R_960_OPTCALLX, 6) |
RELOC_NUMBER (R_960_OPTCALLXA, 7) |
END_RELOC_NUMBERS (R_960_max) |
#endif /* _ELF_I960_H */ |
/contrib/toolchain/binutils/include/elf/ia64.h |
---|
0,0 → 1,416 |
/* IA-64 ELF support for BFD. |
Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2008, 2009, 2010 |
Free Software Foundation, Inc. |
Contributed by David Mosberger-Tang <davidm@hpl.hp.com> |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _ELF_IA64_H |
#define _ELF_IA64_H |
/* Bits in the e_flags field of the Elf64_Ehdr: */ |
#define EF_IA_64_MASKOS 0x0000000f /* OS-specific flags. */ |
#define EF_IA_64_ARCH 0xff000000 /* Arch. version mask. */ |
#define EF_IA_64_ARCHVER_1 (1 << 24) /* Arch. version level 1 compat. */ |
/* ??? These four definitions are not part of the SVR4 ABI. |
They were present in David's initial code drop, so it is probable |
that they are used by HP/UX. */ |
#define EF_IA_64_TRAPNIL (1 << 0) /* Trap NIL pointer dereferences. */ |
#define EF_IA_64_EXT (1 << 2) /* Program uses arch. extensions. */ |
#define EF_IA_64_BE (1 << 3) /* PSR BE bit set (big-endian). */ |
#define EFA_IA_64_EAS2_3 0x23000000 /* IA64 EAS 2.3. */ |
#define EF_IA_64_ABI64 (1 << 4) /* 64-bit ABI. */ |
/* Not used yet. */ |
#define EF_IA_64_REDUCEDFP (1 << 5) /* Only FP6-FP11 used. */ |
#define EF_IA_64_CONS_GP (1 << 6) /* gp as program wide constant. */ |
#define EF_IA_64_NOFUNCDESC_CONS_GP (1 << 7) /* And no function descriptors. */ |
/* Not used yet. */ |
#define EF_IA_64_ABSOLUTE (1 << 8) /* Load at absolute addresses. */ |
/* OpenVMS speficic. */ |
#define EF_IA_64_VMS_COMCOD 0x03 /* Completion code. */ |
#define EF_IA_64_VMS_COMCOD_SUCCESS 0 |
#define EF_IA_64_VMS_COMCOD_WARNING 1 |
#define EF_IA_64_VMS_COMCOD_ERROR 2 |
#define EF_IA_64_VMS_COMCOD_ABORT 3 |
#define EF_IA_64_VMS_LINKAGES 0x04 /* Contains VMS linkages info. */ |
#define ELF_STRING_ia64_archext ".IA_64.archext" |
#define ELF_STRING_ia64_pltoff ".IA_64.pltoff" |
#define ELF_STRING_ia64_unwind ".IA_64.unwind" |
#define ELF_STRING_ia64_unwind_info ".IA_64.unwind_info" |
#define ELF_STRING_ia64_unwind_once ".gnu.linkonce.ia64unw." |
#define ELF_STRING_ia64_unwind_info_once ".gnu.linkonce.ia64unwi." |
/* .IA_64.unwind_hdr is only used by HP-UX. */ |
#define ELF_STRING_ia64_unwind_hdr ".IA_64.unwind_hdr" |
/* Bits in the sh_flags field of Elf64_Shdr: */ |
#define SHF_IA_64_SHORT 0x10000000 /* Section near gp. */ |
#define SHF_IA_64_NORECOV 0x20000000 /* Spec insns w/o recovery. */ |
#define SHF_IA_64_HP_TLS 0x01000000 /* HP specific TLS flag. */ |
#define SHF_IA_64_VMS_GLOBAL 0x0100000000ULL /* Global for clustering. */ |
#define SHF_IA_64_VMS_OVERLAID 0x0200000000ULL /* To be overlaid. */ |
#define SHF_IA_64_VMS_SHARED 0x0400000000ULL /* Shared btw processes. */ |
#define SHF_IA_64_VMS_VECTOR 0x0800000000ULL /* Priv change mode vect. */ |
#define SHF_IA_64_VMS_ALLOC_64BIT 0x1000000000ULL /* Allocate beyond 2GB. */ |
#define SHF_IA_64_VMS_PROTECTED 0x2000000000ULL /* Export from sharable. */ |
/* Possible values for sh_type in Elf64_Shdr: */ |
#define SHT_IA_64_EXT (SHT_LOPROC + 0) /* Extension bits. */ |
#define SHT_IA_64_UNWIND (SHT_LOPROC + 1) /* Unwind bits. */ |
#define SHT_IA_64_LOPSREG (SHT_LOPROC + 0x8000000) |
/* ABI says (SHT_LOPROC + 0xfffffff) but I think it's a typo -- this makes sense. */ |
#define SHT_IA_64_HIPSREG (SHT_LOPROC + 0x8ffffff) |
#define SHT_IA_64_PRIORITY_INIT (SHT_LOPROC + 0x9000000) |
/* SHT_IA_64_HP_OPT_ANOT is only generated by HPUX compilers for its |
optimization annotation section. GCC does not generate it but we |
want readelf to know what they are. Do not use two capital Ns in |
annotate or sed will turn it into 32 or 64 during the build. */ |
#define SHT_IA_64_HP_OPT_ANOT 0x60000004 |
/* OpenVMS section types. */ |
/* The section contains PC-to-source correlation information for use by the |
VMS RTL's traceback facility. */ |
#define SHT_IA_64_VMS_TRACE 0x60000000 |
/* The section contains routine signature information for use by the |
translated image executive. */ |
#define SHT_IA_64_VMS_TIE_SIGNATURES 0x60000001 |
/* The section contains dwarf-3 information. */ |
#define SHT_IA_64_VMS_DEBUG 0x60000002 |
/* The section contains the dwarf-3 string table. */ |
#define SHT_IA_64_VMS_DEBUG_STR 0x60000003 |
/* The section contains linkage information to perform consistency checking |
accross object modules. */ |
#define SHT_IA_64_VMS_LINKAGES 0x60000004 |
/* The section allows the symbol vector in an image to be location through |
the section table. */ |
#define SHT_IA_64_VMS_SYMBOL_VECTOR 0x60000005 |
/* The section contains inter-image fixups. */ |
#define SHT_IA_64_VMS_FIXUP 0x60000006 |
/* The section contains unmangled name info. */ |
#define SHT_IA_64_VMS_DISPLAY_NAME_INFO 0x60000007 |
/* Bits in the p_flags field of Elf64_Phdr: */ |
#define PF_IA_64_NORECOV 0x80000000 |
/* Possible values for p_type in Elf64_Phdr: */ |
#define PT_IA_64_ARCHEXT (PT_LOPROC + 0) /* Arch extension bits, */ |
#define PT_IA_64_UNWIND (PT_LOPROC + 1) /* IA64 unwind bits. */ |
/* HP-UX specific values for p_type in Elf64_Phdr. |
These values are currently just used to make |
readelf more usable on HP-UX. */ |
#define PT_IA_64_HP_OPT_ANOT (PT_LOOS + 0x12) |
#define PT_IA_64_HP_HSL_ANOT (PT_LOOS + 0x13) |
#define PT_IA_64_HP_STACK (PT_LOOS + 0x14) |
/* Possible values for d_tag in Elf64_Dyn: */ |
#define DT_IA_64_PLT_RESERVE (DT_LOPROC + 0) |
/* VMS specific values for d_tag in Elf64_Dyn: */ |
#define DT_IA_64_VMS_SUBTYPE (DT_LOOS + 0) |
#define DT_IA_64_VMS_IMGIOCNT (DT_LOOS + 2) |
#define DT_IA_64_VMS_LNKFLAGS (DT_LOOS + 8) |
#define DT_IA_64_VMS_VIR_MEM_BLK_SIZ (DT_LOOS + 10) |
#define DT_IA_64_VMS_IDENT (DT_LOOS + 12) |
#define DT_IA_64_VMS_NEEDED_IDENT (DT_LOOS + 16) |
#define DT_IA_64_VMS_IMG_RELA_CNT (DT_LOOS + 18) |
#define DT_IA_64_VMS_SEG_RELA_CNT (DT_LOOS + 20) |
#define DT_IA_64_VMS_FIXUP_RELA_CNT (DT_LOOS + 22) |
#define DT_IA_64_VMS_FIXUP_NEEDED (DT_LOOS + 24) |
#define DT_IA_64_VMS_SYMVEC_CNT (DT_LOOS + 26) |
#define DT_IA_64_VMS_XLATED (DT_LOOS + 30) |
#define DT_IA_64_VMS_STACKSIZE (DT_LOOS + 32) |
#define DT_IA_64_VMS_UNWINDSZ (DT_LOOS + 34) |
#define DT_IA_64_VMS_UNWIND_CODSEG (DT_LOOS + 36) |
#define DT_IA_64_VMS_UNWIND_INFOSEG (DT_LOOS + 38) |
#define DT_IA_64_VMS_LINKTIME (DT_LOOS + 40) |
#define DT_IA_64_VMS_SEG_NO (DT_LOOS + 42) |
#define DT_IA_64_VMS_SYMVEC_OFFSET (DT_LOOS + 44) |
#define DT_IA_64_VMS_SYMVEC_SEG (DT_LOOS + 46) |
#define DT_IA_64_VMS_UNWIND_OFFSET (DT_LOOS + 48) |
#define DT_IA_64_VMS_UNWIND_SEG (DT_LOOS + 50) |
#define DT_IA_64_VMS_STRTAB_OFFSET (DT_LOOS + 52) |
#define DT_IA_64_VMS_SYSVER_OFFSET (DT_LOOS + 54) |
#define DT_IA_64_VMS_IMG_RELA_OFF (DT_LOOS + 56) |
#define DT_IA_64_VMS_SEG_RELA_OFF (DT_LOOS + 58) |
#define DT_IA_64_VMS_FIXUP_RELA_OFF (DT_LOOS + 60) |
#define DT_IA_64_VMS_PLTGOT_OFFSET (DT_LOOS + 62) |
#define DT_IA_64_VMS_PLTGOT_SEG (DT_LOOS + 64) |
#define DT_IA_64_VMS_FPMODE (DT_LOOS + 66) |
/* Values for DT_IA_64_LNKFLAGS. */ |
#define VMS_LF_CALL_DEBUG 0x0001 /* Activate and call the debugger. */ |
#define VMS_LF_NOP0BUFS 0x0002 /* RMS use of P0 for i/o disabled. */ |
#define VMS_LF_P0IMAGE 0x0004 /* Image in P0 space only. */ |
#define VMS_LF_MKTHREADS 0x0008 /* Multiple kernel threads enabled. */ |
#define VMS_LF_UPCALLS 0x0010 /* Upcalls enabled. */ |
#define VMS_LF_IMGSTA 0x0020 /* Use SYS$IMGSTA. */ |
#define VMS_LF_INITIALIZE 0x0040 /* Image uses tfradr2. */ |
#define VMS_LF_MAIN 0x0080 /* Image uses tfradr3. */ |
#define VMS_LF_EXE_INIT 0x0200 /* Image uses tfradr4. */ |
#define VMS_LF_TBK_IN_IMG 0x0400 /* Traceback records in image. */ |
#define VMS_LF_DBG_IN_IMG 0x0800 /* Debug records in image. */ |
#define VMS_LF_TBK_IN_DSF 0x1000 /* Traceback records in DSF. */ |
#define VMS_LF_DBG_IN_DSF 0x2000 /* Debug records in DSF. */ |
#define VMS_LF_SIGNATURES 0x4000 /* Signatures present. */ |
#define VMS_LF_REL_SEG_OFF 0x8000 /* Maintain relative pos of seg. */ |
/* This section only used by HP-UX, The HP linker gives weak symbols |
precedence over regular common symbols. We want common to override |
weak. Using this common instead of SHN_COMMON does that. */ |
#define SHN_IA_64_ANSI_COMMON SHN_LORESERVE |
/* This section is only used by OpenVMS. Symbol is defined in the symbol |
vector (only possible for image files). */ |
#define SHN_IA_64_VMS_SYMVEC SHN_LOOS |
/* OpenVMS IA64-specific symbol attributes. */ |
#define VMS_STO_VISIBILITY 3 /* Alias of the standard field. */ |
#define VMS_ST_VISIBILITY(o) ((o) & VMS_STO_VISIBILITY) |
#define VMS_STO_FUNC_TYPE 0x30 /* Function type. */ |
#define VMS_ST_FUNC_TYPE(o) (((o) & VMS_STO_FUNC_TYPE) >> 4) |
# define VMS_SFT_CODE_ADDR 0 /* Symbol value is a code address. */ |
# define VMS_SFT_SYMV_IDX 1 /* Symbol value is a symbol vector index. */ |
# define VMS_SFT_FD 2 /* Symbol value is a function descriptor. */ |
# define VMS_SFT_RESERVE 3 /* Reserved. */ |
#define VMS_STO_LINKAGE 0xc0 |
#define VMS_ST_LINKAGE(o) (((o) & VMS_STO_LINKAGE) >> 6) |
# define VMS_STL_IGNORE 0 /* No associated linkage. */ |
# define VMS_STL_RESERVE 1 |
# define VMS_STL_STD 2 /* Standard linkage with return value. */ |
# define VMS_STL_LNK 3 /* Explicit represented in .vms_linkages. */ |
/* OpenVMS specific symbol binding values. */ |
#define STB_VMS_WEAK 11 /* VMS weak symbol. */ |
#define STB_VMS_SYSTEM 12 /* System symbol. */ |
/* OpenVMS specific fixup and relocation structures. */ |
typedef struct |
{ |
unsigned char fixup_offset[8]; |
unsigned char type[4]; |
unsigned char fixup_seg[4]; |
unsigned char addend[8]; |
unsigned char symvec_index[4]; |
unsigned char data_type[4]; |
} Elf64_External_VMS_IMAGE_FIXUP; |
typedef struct |
{ |
unsigned char rela_offset[8]; |
unsigned char type[4]; |
unsigned char rela_seg[4]; |
unsigned char addend[8]; |
unsigned char sym_offset[8]; |
unsigned char sym_seg[4]; |
unsigned char fill_1[4]; |
} Elf64_External_VMS_IMAGE_RELA; |
/* Note segments. VMS is special as it uses 64-bit entries. */ |
typedef struct { |
unsigned char namesz[8]; /* Size of entry's owner string */ |
unsigned char descsz[8]; /* Size of the note descriptor */ |
unsigned char type[8]; /* Interpretation of the descriptor */ |
char name[1]; /* Start of the name+desc data */ |
} Elf64_External_VMS_Note; |
#define NT_VMS_MHD 1 /* Object module name, version, and date/time. */ |
#define NT_VMS_LNM 2 /* Language processor name. */ |
#define NT_VMS_SRC 3 /* Source files. */ |
#define NT_VMS_TITLE 4 /* Title text. */ |
#define NT_VMS_EIDC 5 /* Entity ident consistency check. */ |
#define NT_VMS_FPMODE 6 /* Whole program floating-point mode. */ |
#define NT_VMS_LINKTIME 101 /* Date/time image was linked. */ |
#define NT_VMS_IMGNAM 102 /* Image name string. */ |
#define NT_VMS_IMGID 103 /* Image ident string. */ |
#define NT_VMS_LINKID 104 /* Linker ident string. */ |
#define NT_VMS_IMGBID 105 /* Image build ident string. */ |
#define NT_VMS_GSTNAM 106 /* Global Symbol Table Name. */ |
#define NT_VMS_ORIG_DYN 107 /* Original setting of dynamic data. */ |
#define NT_VMS_PATCHTIME 108 /* Date/time of last patch. */ |
/* Corresponding data for NT_VMS_ORIG_DYM. */ |
typedef struct { |
unsigned char major_id[4]; /* Should be 1. */ |
unsigned char minor_id[4]; /* Should be 3. */ |
unsigned char manipulation_date[8]; /* Original NT_VMS_LNKTIME. */ |
unsigned char link_flags[8]; /* Original NT_VMS_LNKFLAGS. */ |
unsigned char elf_flags[4]; /* Original ehdr flags. */ |
unsigned char _pad[4]; |
unsigned char imgid[1]; /* Original NT_VMS_IMGID. */ |
} Elf64_External_VMS_ORIG_DYN_Note; |
/* IA64-specific relocation types: */ |
/* Relocs apply to specific instructions within a bundle. The least |
significant 2 bits of the address indicate which instruction in the |
bundle the reloc refers to (0=first slot, 1=second slow, 2=third |
slot, 3=undefined) and the remaining bits give the address of the |
bundle (16 byte aligned). |
The top 5 bits of the reloc code specifies the expression type, the |
low 3 bits the format of the data word being relocated. */ |
#include "elf/reloc-macros.h" |
START_RELOC_NUMBERS (elf_ia64_reloc_type) |
RELOC_NUMBER (R_IA64_NONE, 0x00) /* none */ |
RELOC_NUMBER (R_IA64_IMM14, 0x21) /* symbol + addend, add imm14 */ |
RELOC_NUMBER (R_IA64_IMM22, 0x22) /* symbol + addend, add imm22 */ |
RELOC_NUMBER (R_IA64_IMM64, 0x23) /* symbol + addend, mov imm64 */ |
RELOC_NUMBER (R_IA64_DIR32MSB, 0x24) /* symbol + addend, data4 MSB */ |
RELOC_NUMBER (R_IA64_DIR32LSB, 0x25) /* symbol + addend, data4 LSB */ |
RELOC_NUMBER (R_IA64_DIR64MSB, 0x26) /* symbol + addend, data8 MSB */ |
RELOC_NUMBER (R_IA64_DIR64LSB, 0x27) /* symbol + addend, data8 LSB */ |
RELOC_NUMBER (R_IA64_GPREL22, 0x2a) /* @gprel(sym+add), add imm22 */ |
RELOC_NUMBER (R_IA64_GPREL64I, 0x2b) /* @gprel(sym+add), mov imm64 */ |
RELOC_NUMBER (R_IA64_GPREL32MSB, 0x2c) /* @gprel(sym+add), data4 MSB */ |
RELOC_NUMBER (R_IA64_GPREL32LSB, 0x2d) /* @gprel(sym+add), data4 LSB */ |
RELOC_NUMBER (R_IA64_GPREL64MSB, 0x2e) /* @gprel(sym+add), data8 MSB */ |
RELOC_NUMBER (R_IA64_GPREL64LSB, 0x2f) /* @gprel(sym+add), data8 LSB */ |
RELOC_NUMBER (R_IA64_LTOFF22, 0x32) /* @ltoff(sym+add), add imm22 */ |
RELOC_NUMBER (R_IA64_LTOFF64I, 0x33) /* @ltoff(sym+add), mov imm64 */ |
RELOC_NUMBER (R_IA64_PLTOFF22, 0x3a) /* @pltoff(sym+add), add imm22 */ |
RELOC_NUMBER (R_IA64_PLTOFF64I, 0x3b) /* @pltoff(sym+add), mov imm64 */ |
RELOC_NUMBER (R_IA64_PLTOFF64MSB, 0x3e) /* @pltoff(sym+add), data8 MSB */ |
RELOC_NUMBER (R_IA64_PLTOFF64LSB, 0x3f) /* @pltoff(sym+add), data8 LSB */ |
RELOC_NUMBER (R_IA64_FPTR64I, 0x43) /* @fptr(sym+add), mov imm64 */ |
RELOC_NUMBER (R_IA64_FPTR32MSB, 0x44) /* @fptr(sym+add), data4 MSB */ |
RELOC_NUMBER (R_IA64_FPTR32LSB, 0x45) /* @fptr(sym+add), data4 LSB */ |
RELOC_NUMBER (R_IA64_FPTR64MSB, 0x46) /* @fptr(sym+add), data8 MSB */ |
RELOC_NUMBER (R_IA64_FPTR64LSB, 0x47) /* @fptr(sym+add), data8 LSB */ |
RELOC_NUMBER (R_IA64_PCREL60B, 0x48) /* @pcrel(sym+add), brl */ |
RELOC_NUMBER (R_IA64_PCREL21B, 0x49) /* @pcrel(sym+add), ptb, call */ |
RELOC_NUMBER (R_IA64_PCREL21M, 0x4a) /* @pcrel(sym+add), chk.s */ |
RELOC_NUMBER (R_IA64_PCREL21F, 0x4b) /* @pcrel(sym+add), fchkf */ |
RELOC_NUMBER (R_IA64_PCREL32MSB, 0x4c) /* @pcrel(sym+add), data4 MSB */ |
RELOC_NUMBER (R_IA64_PCREL32LSB, 0x4d) /* @pcrel(sym+add), data4 LSB */ |
RELOC_NUMBER (R_IA64_PCREL64MSB, 0x4e) /* @pcrel(sym+add), data8 MSB */ |
RELOC_NUMBER (R_IA64_PCREL64LSB, 0x4f) /* @pcrel(sym+add), data8 LSB */ |
RELOC_NUMBER (R_IA64_LTOFF_FPTR22, 0x52) /* @ltoff(@fptr(s+a)), imm22 */ |
RELOC_NUMBER (R_IA64_LTOFF_FPTR64I, 0x53) /* @ltoff(@fptr(s+a)), imm64 */ |
RELOC_NUMBER (R_IA64_LTOFF_FPTR32MSB, 0x54) /* @ltoff(@fptr(s+a)), 4 MSB */ |
RELOC_NUMBER (R_IA64_LTOFF_FPTR32LSB, 0x55) /* @ltoff(@fptr(s+a)), 4 LSB */ |
RELOC_NUMBER (R_IA64_LTOFF_FPTR64MSB, 0x56) /* @ltoff(@fptr(s+a)), 8 MSB */ |
RELOC_NUMBER (R_IA64_LTOFF_FPTR64LSB, 0x57) /* @ltoff(@fptr(s+a)), 8 LSB */ |
RELOC_NUMBER (R_IA64_SEGREL32MSB, 0x5c) /* @segrel(sym+add), data4 MSB */ |
RELOC_NUMBER (R_IA64_SEGREL32LSB, 0x5d) /* @segrel(sym+add), data4 LSB */ |
RELOC_NUMBER (R_IA64_SEGREL64MSB, 0x5e) /* @segrel(sym+add), data8 MSB */ |
RELOC_NUMBER (R_IA64_SEGREL64LSB, 0x5f) /* @segrel(sym+add), data8 LSB */ |
RELOC_NUMBER (R_IA64_SECREL32MSB, 0x64) /* @secrel(sym+add), data4 MSB */ |
RELOC_NUMBER (R_IA64_SECREL32LSB, 0x65) /* @secrel(sym+add), data4 LSB */ |
RELOC_NUMBER (R_IA64_SECREL64MSB, 0x66) /* @secrel(sym+add), data8 MSB */ |
RELOC_NUMBER (R_IA64_SECREL64LSB, 0x67) /* @secrel(sym+add), data8 LSB */ |
RELOC_NUMBER (R_IA64_REL32MSB, 0x6c) /* data 4 + REL */ |
RELOC_NUMBER (R_IA64_REL32LSB, 0x6d) /* data 4 + REL */ |
RELOC_NUMBER (R_IA64_REL64MSB, 0x6e) /* data 8 + REL */ |
RELOC_NUMBER (R_IA64_REL64LSB, 0x6f) /* data 8 + REL */ |
RELOC_NUMBER (R_IA64_LTV32MSB, 0x74) /* symbol + addend, data4 MSB */ |
RELOC_NUMBER (R_IA64_LTV32LSB, 0x75) /* symbol + addend, data4 LSB */ |
RELOC_NUMBER (R_IA64_LTV64MSB, 0x76) /* symbol + addend, data8 MSB */ |
RELOC_NUMBER (R_IA64_LTV64LSB, 0x77) /* symbol + addend, data8 LSB */ |
RELOC_NUMBER (R_IA64_PCREL21BI, 0x79) /* @pcrel(sym+add), ptb, call */ |
RELOC_NUMBER (R_IA64_PCREL22, 0x7a) /* @pcrel(sym+add), imm22 */ |
RELOC_NUMBER (R_IA64_PCREL64I, 0x7b) /* @pcrel(sym+add), imm64 */ |
RELOC_NUMBER (R_IA64_IPLTMSB, 0x80) /* dynamic reloc, imported PLT, MSB */ |
RELOC_NUMBER (R_IA64_IPLTLSB, 0x81) /* dynamic reloc, imported PLT, LSB */ |
RELOC_NUMBER (R_IA64_COPY, 0x84) /* dynamic reloc, data copy */ |
RELOC_NUMBER (R_IA64_LTOFF22X, 0x86) /* LTOFF22, relaxable. */ |
RELOC_NUMBER (R_IA64_LDXMOV, 0x87) /* Use of LTOFF22X. */ |
RELOC_NUMBER (R_IA64_TPREL14, 0x91) /* @tprel(sym+add), add imm14 */ |
RELOC_NUMBER (R_IA64_TPREL22, 0x92) /* @tprel(sym+add), add imm22 */ |
RELOC_NUMBER (R_IA64_TPREL64I, 0x93) /* @tprel(sym+add), add imm64 */ |
RELOC_NUMBER (R_IA64_TPREL64MSB, 0x96) /* @tprel(sym+add), data8 MSB */ |
RELOC_NUMBER (R_IA64_TPREL64LSB, 0x97) /* @tprel(sym+add), data8 LSB */ |
RELOC_NUMBER (R_IA64_LTOFF_TPREL22, 0x9a) /* @ltoff(@tprel(s+a)), add imm22 */ |
RELOC_NUMBER (R_IA64_DTPMOD64MSB, 0xa6) /* @dtpmod(sym+add), data8 MSB */ |
RELOC_NUMBER (R_IA64_DTPMOD64LSB, 0xa7) /* @dtpmod(sym+add), data8 LSB */ |
RELOC_NUMBER (R_IA64_LTOFF_DTPMOD22, 0xaa) /* @ltoff(@dtpmod(s+a)), imm22 */ |
RELOC_NUMBER (R_IA64_DTPREL14, 0xb1) /* @dtprel(sym+add), imm14 */ |
RELOC_NUMBER (R_IA64_DTPREL22, 0xb2) /* @dtprel(sym+add), imm22 */ |
RELOC_NUMBER (R_IA64_DTPREL64I, 0xb3) /* @dtprel(sym+add), imm64 */ |
RELOC_NUMBER (R_IA64_DTPREL32MSB, 0xb4) /* @dtprel(sym+add), data4 MSB */ |
RELOC_NUMBER (R_IA64_DTPREL32LSB, 0xb5) /* @dtprel(sym+add), data4 LSB */ |
RELOC_NUMBER (R_IA64_DTPREL64MSB, 0xb6) /* @dtprel(sym+add), data8 MSB */ |
RELOC_NUMBER (R_IA64_DTPREL64LSB, 0xb7) /* @dtprel(sym+add), data8 LSB */ |
RELOC_NUMBER (R_IA64_LTOFF_DTPREL22, 0xba) /* @ltoff(@dtprel(s+a)), imm22 */ |
FAKE_RELOC (R_IA64_MAX_RELOC_CODE, 0xba) |
/* OpenVMS specific relocs. */ |
RELOC_NUMBER (R_IA64_VMS_DIR8, 0x70000000) /* S + A */ |
RELOC_NUMBER (R_IA64_VMS_DIR16LSB, 0x70000001) /* S + A */ |
RELOC_NUMBER (R_IA64_VMS_CALL_SIGNATURE, 0x70000002) |
RELOC_NUMBER (R_IA64_VMS_EXECLET_FUNC, 0x70000003) |
RELOC_NUMBER (R_IA64_VMS_EXECLET_DATA, 0x70000004) |
RELOC_NUMBER (R_IA64_VMS_FIX8, 0x70000005) /* S + A */ |
RELOC_NUMBER (R_IA64_VMS_FIX16, 0x70000006) /* S + A */ |
RELOC_NUMBER (R_IA64_VMS_FIX32, 0x70000007) /* S + A */ |
RELOC_NUMBER (R_IA64_VMS_FIX64, 0x70000008) /* S + A */ |
RELOC_NUMBER (R_IA64_VMS_FIXFD, 0x70000009) |
RELOC_NUMBER (R_IA64_VMS_ACC_LOAD, 0x7000000a) /* ACC = S + A */ |
RELOC_NUMBER (R_IA64_VMS_ACC_ADD, 0x7000000b) /* ACC += S + A */ |
RELOC_NUMBER (R_IA64_VMS_ACC_SUB, 0x7000000c) /* ACC -= S + A */ |
RELOC_NUMBER (R_IA64_VMS_ACC_MUL, 0x7000000d) /* ACC *= S + A */ |
RELOC_NUMBER (R_IA64_VMS_ACC_DIV, 0x7000000e) /* ACC /= S + A */ |
RELOC_NUMBER (R_IA64_VMS_ACC_AND, 0x7000000f) /* ACC &= S + A */ |
RELOC_NUMBER (R_IA64_VMS_ACC_IOR, 0x70000010) /* ACC |= S + A */ |
RELOC_NUMBER (R_IA64_VMS_ACC_EOR, 0x70000011) /* ACC ^= S + A */ |
RELOC_NUMBER (R_IA64_VMS_ACC_ASH, 0x70000012) /* ACC >>= S + A */ |
RELOC_NUMBER (R_IA64_VMS_ACC_STO8, 0x70000014) /* ACC */ |
RELOC_NUMBER (R_IA64_VMS_ACC_STO16LSH, 0x70000015) /* ACC */ |
RELOC_NUMBER (R_IA64_VMS_ACC_STO32LSH, 0x70000016) /* ACC */ |
RELOC_NUMBER (R_IA64_VMS_ACC_STO64LSH, 0x70000017) /* ACC */ |
END_RELOC_NUMBERS (R_IA64_max) |
#endif /* _ELF_IA64_H */ |
/contrib/toolchain/binutils/include/elf/internal.h |
---|
0,0 → 1,360 |
/* ELF support for BFD. |
Copyright 1991, 1992, 1993, 1994, 1995, 1997, 1998, 2000, 2001, 2002, |
2003, 2006, 2007, 2008, 2010, 2011 Free Software Foundation, Inc. |
Written by Fred Fish @ Cygnus Support, from information published |
in "UNIX System V Release 4, Programmers Guide: ANSI C and |
Programming Support Tools". |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* This file is part of ELF support for BFD, and contains the portions |
that describe how ELF is represented internally in the BFD library. |
I.E. it describes the in-memory representation of ELF. It requires |
the elf-common.h file which contains the portions that are common to |
both the internal and external representations. */ |
/* NOTE that these structures are not kept in the same order as they appear |
in the object file. In some cases they've been reordered for more optimal |
packing under various circumstances. */ |
#ifndef _ELF_INTERNAL_H |
#define _ELF_INTERNAL_H |
/* Special section indices, which may show up in st_shndx fields, among |
other places. */ |
#undef SHN_UNDEF |
#undef SHN_LORESERVE |
#undef SHN_LOPROC |
#undef SHN_HIPROC |
#undef SHN_LOOS |
#undef SHN_HIOS |
#undef SHN_ABS |
#undef SHN_COMMON |
#undef SHN_XINDEX |
#undef SHN_HIRESERVE |
#define SHN_UNDEF 0 /* Undefined section reference */ |
#define SHN_LORESERVE (-0x100u) /* Begin range of reserved indices */ |
#define SHN_LOPROC (-0x100u) /* Begin range of appl-specific */ |
#define SHN_HIPROC (-0xE1u) /* End range of appl-specific */ |
#define SHN_LOOS (-0xE0u) /* OS specific semantics, lo */ |
#define SHN_HIOS (-0xC1u) /* OS specific semantics, hi */ |
#define SHN_ABS (-0xFu) /* Associated symbol is absolute */ |
#define SHN_COMMON (-0xEu) /* Associated symbol is in common */ |
#define SHN_XINDEX (-0x1u) /* Section index is held elsewhere */ |
#define SHN_HIRESERVE (-0x1u) /* End range of reserved indices */ |
#define SHN_BAD (-0x101u) /* Used internally by bfd */ |
/* ELF Header */ |
#define EI_NIDENT 16 /* Size of e_ident[] */ |
typedef struct elf_internal_ehdr { |
unsigned char e_ident[EI_NIDENT]; /* ELF "magic number" */ |
bfd_vma e_entry; /* Entry point virtual address */ |
bfd_size_type e_phoff; /* Program header table file offset */ |
bfd_size_type e_shoff; /* Section header table file offset */ |
unsigned long e_version; /* Identifies object file version */ |
unsigned long e_flags; /* Processor-specific flags */ |
unsigned short e_type; /* Identifies object file type */ |
unsigned short e_machine; /* Specifies required architecture */ |
unsigned int e_ehsize; /* ELF header size in bytes */ |
unsigned int e_phentsize; /* Program header table entry size */ |
unsigned int e_phnum; /* Program header table entry count */ |
unsigned int e_shentsize; /* Section header table entry size */ |
unsigned int e_shnum; /* Section header table entry count */ |
unsigned int e_shstrndx; /* Section header string table index */ |
} Elf_Internal_Ehdr; |
/* Program header */ |
struct elf_internal_phdr { |
unsigned long p_type; /* Identifies program segment type */ |
unsigned long p_flags; /* Segment flags */ |
bfd_vma p_offset; /* Segment file offset */ |
bfd_vma p_vaddr; /* Segment virtual address */ |
bfd_vma p_paddr; /* Segment physical address */ |
bfd_vma p_filesz; /* Segment size in file */ |
bfd_vma p_memsz; /* Segment size in memory */ |
bfd_vma p_align; /* Segment alignment, file & memory */ |
}; |
typedef struct elf_internal_phdr Elf_Internal_Phdr; |
/* Section header */ |
typedef struct elf_internal_shdr { |
unsigned int sh_name; /* Section name, index in string tbl */ |
unsigned int sh_type; /* Type of section */ |
bfd_vma sh_flags; /* Miscellaneous section attributes */ |
bfd_vma sh_addr; /* Section virtual addr at execution */ |
file_ptr sh_offset; /* Section file offset */ |
bfd_size_type sh_size; /* Size of section in bytes */ |
unsigned int sh_link; /* Index of another section */ |
unsigned int sh_info; /* Additional section information */ |
bfd_vma sh_addralign; /* Section alignment */ |
bfd_size_type sh_entsize; /* Entry size if section holds table */ |
/* The internal rep also has some cached info associated with it. */ |
asection * bfd_section; /* Associated BFD section. */ |
unsigned char *contents; /* Section contents. */ |
} Elf_Internal_Shdr; |
/* Symbol table entry */ |
struct elf_internal_sym { |
bfd_vma st_value; /* Value of the symbol */ |
bfd_vma st_size; /* Associated symbol size */ |
unsigned long st_name; /* Symbol name, index in string tbl */ |
unsigned char st_info; /* Type and binding attributes */ |
unsigned char st_other; /* Visibilty, and target specific */ |
unsigned char st_target_internal; /* Internal-only information */ |
unsigned int st_shndx; /* Associated section index */ |
}; |
typedef struct elf_internal_sym Elf_Internal_Sym; |
/* Note segments */ |
typedef struct elf_internal_note { |
unsigned long namesz; /* Size of entry's owner string */ |
unsigned long descsz; /* Size of the note descriptor */ |
unsigned long type; /* Interpretation of the descriptor */ |
char * namedata; /* Start of the name+desc data */ |
char * descdata; /* Start of the desc data */ |
bfd_vma descpos; /* File offset of the descdata */ |
} Elf_Internal_Note; |
/* Relocation Entries */ |
typedef struct elf_internal_rela { |
bfd_vma r_offset; /* Location at which to apply the action */ |
bfd_vma r_info; /* Index and Type of relocation */ |
bfd_vma r_addend; /* Constant addend used to compute value */ |
} Elf_Internal_Rela; |
/* dynamic section structure */ |
typedef struct elf_internal_dyn { |
/* This needs to support 64-bit values in elf64. */ |
bfd_vma d_tag; /* entry tag value */ |
union { |
/* This needs to support 64-bit values in elf64. */ |
bfd_vma d_val; |
bfd_vma d_ptr; |
} d_un; |
} Elf_Internal_Dyn; |
/* This structure appears in a SHT_GNU_verdef section. */ |
typedef struct elf_internal_verdef { |
unsigned short vd_version; /* Version number of structure. */ |
unsigned short vd_flags; /* Flags (VER_FLG_*). */ |
unsigned short vd_ndx; /* Version index. */ |
unsigned short vd_cnt; /* Number of verdaux entries. */ |
unsigned long vd_hash; /* Hash of name. */ |
unsigned long vd_aux; /* Offset to verdaux entries. */ |
unsigned long vd_next; /* Offset to next verdef. */ |
/* These fields are set up when BFD reads in the structure. FIXME: |
It would be cleaner to store these in a different structure. */ |
bfd *vd_bfd; /* BFD. */ |
const char *vd_nodename; /* Version name. */ |
struct elf_internal_verdef *vd_nextdef; /* vd_next as pointer. */ |
struct elf_internal_verdaux *vd_auxptr; /* vd_aux as pointer. */ |
unsigned int vd_exp_refno; /* Used by the linker. */ |
} Elf_Internal_Verdef; |
/* This structure appears in a SHT_GNU_verdef section. */ |
typedef struct elf_internal_verdaux { |
unsigned long vda_name; /* String table offset of name. */ |
unsigned long vda_next; /* Offset to next verdaux. */ |
/* These fields are set up when BFD reads in the structure. FIXME: |
It would be cleaner to store these in a different structure. */ |
const char *vda_nodename; /* vda_name as pointer. */ |
struct elf_internal_verdaux *vda_nextptr; /* vda_next as pointer. */ |
} Elf_Internal_Verdaux; |
/* This structure appears in a SHT_GNU_verneed section. */ |
typedef struct elf_internal_verneed { |
unsigned short vn_version; /* Version number of structure. */ |
unsigned short vn_cnt; /* Number of vernaux entries. */ |
unsigned long vn_file; /* String table offset of library name. */ |
unsigned long vn_aux; /* Offset to vernaux entries. */ |
unsigned long vn_next; /* Offset to next verneed. */ |
/* These fields are set up when BFD reads in the structure. FIXME: |
It would be cleaner to store these in a different structure. */ |
bfd *vn_bfd; /* BFD. */ |
const char *vn_filename; /* vn_file as pointer. */ |
struct elf_internal_vernaux *vn_auxptr; /* vn_aux as pointer. */ |
struct elf_internal_verneed *vn_nextref; /* vn_nextref as pointer. */ |
} Elf_Internal_Verneed; |
/* This structure appears in a SHT_GNU_verneed section. */ |
typedef struct elf_internal_vernaux { |
unsigned long vna_hash; /* Hash of dependency name. */ |
unsigned short vna_flags; /* Flags (VER_FLG_*). */ |
unsigned short vna_other; /* Unused. */ |
unsigned long vna_name; /* String table offset to version name. */ |
unsigned long vna_next; /* Offset to next vernaux. */ |
/* These fields are set up when BFD reads in the structure. FIXME: |
It would be cleaner to store these in a different structure. */ |
const char *vna_nodename; /* vna_name as pointer. */ |
struct elf_internal_vernaux *vna_nextptr; /* vna_next as pointer. */ |
} Elf_Internal_Vernaux; |
/* This structure appears in a SHT_GNU_versym section. This is not a |
standard ELF structure; ELF just uses Elf32_Half. */ |
typedef struct elf_internal_versym { |
unsigned short vs_vers; |
} Elf_Internal_Versym; |
/* Structure for syminfo section. */ |
typedef struct |
{ |
unsigned short int si_boundto; |
unsigned short int si_flags; |
} Elf_Internal_Syminfo; |
/* This structure appears on the stack and in NT_AUXV core file notes. */ |
typedef struct |
{ |
bfd_vma a_type; |
bfd_vma a_val; |
} Elf_Internal_Auxv; |
/* This structure is used to describe how sections should be assigned |
to program segments. */ |
struct elf_segment_map |
{ |
/* Next program segment. */ |
struct elf_segment_map *next; |
/* Program segment type. */ |
unsigned long p_type; |
/* Program segment flags. */ |
unsigned long p_flags; |
/* Program segment physical address. */ |
bfd_vma p_paddr; |
/* Program segment virtual address offset from section vma. */ |
bfd_vma p_vaddr_offset; |
/* Program segment alignment. */ |
bfd_vma p_align; |
/* Segment size in file and memory */ |
bfd_vma p_size; |
/* Required size of filehdr + phdrs, if non-zero */ |
bfd_vma header_size; |
/* Whether the p_flags field is valid; if not, the flags are based |
on the section flags. */ |
unsigned int p_flags_valid : 1; |
/* Whether the p_paddr field is valid; if not, the physical address |
is based on the section lma values. */ |
unsigned int p_paddr_valid : 1; |
/* Whether the p_align field is valid; if not, PT_LOAD segment |
alignment is based on the default maximum page size. */ |
unsigned int p_align_valid : 1; |
/* Whether the p_size field is valid; if not, the size are based |
on the section sizes. */ |
unsigned int p_size_valid : 1; |
/* Whether this segment includes the file header. */ |
unsigned int includes_filehdr : 1; |
/* Whether this segment includes the program headers. */ |
unsigned int includes_phdrs : 1; |
/* Number of sections (may be 0). */ |
unsigned int count; |
/* Sections. Actual number of elements is in count field. */ |
asection *sections[1]; |
}; |
/* .tbss is special. It doesn't contribute memory space to normal |
segments and it doesn't take file space in normal segments. */ |
#define ELF_TBSS_SPECIAL(sec_hdr, segment) \ |
(((sec_hdr)->sh_flags & SHF_TLS) != 0 \ |
&& (sec_hdr)->sh_type == SHT_NOBITS \ |
&& (segment)->p_type != PT_TLS) |
#define ELF_SECTION_SIZE(sec_hdr, segment) \ |
(ELF_TBSS_SPECIAL(sec_hdr, segment) ? 0 : (sec_hdr)->sh_size) |
/* Decide if the section SEC_HDR is in SEGMENT. If CHECK_VMA, then |
VMAs are checked for alloc sections. If STRICT, then a zero size |
section won't match at the end of a segment, unless the segment |
is also zero size. Regardless of STRICT and CHECK_VMA, zero size |
sections won't match at the start or end of PT_DYNAMIC, unless |
PT_DYNAMIC is itself zero sized. */ |
#define ELF_SECTION_IN_SEGMENT_1(sec_hdr, segment, check_vma, strict) \ |
((/* Only PT_LOAD, PT_GNU_RELRO and PT_TLS segments can contain \ |
SHF_TLS sections. */ \ |
((((sec_hdr)->sh_flags & SHF_TLS) != 0) \ |
&& ((segment)->p_type == PT_TLS \ |
|| (segment)->p_type == PT_GNU_RELRO \ |
|| (segment)->p_type == PT_LOAD)) \ |
/* PT_TLS segment contains only SHF_TLS sections, PT_PHDR no \ |
sections at all. */ \ |
|| (((sec_hdr)->sh_flags & SHF_TLS) == 0 \ |
&& (segment)->p_type != PT_TLS \ |
&& (segment)->p_type != PT_PHDR)) \ |
/* Any section besides one of type SHT_NOBITS must have file \ |
offsets within the segment. */ \ |
&& ((sec_hdr)->sh_type == SHT_NOBITS \ |
|| ((bfd_vma) (sec_hdr)->sh_offset >= (segment)->p_offset \ |
&& (!(strict) \ |
|| ((sec_hdr)->sh_offset - (segment)->p_offset \ |
<= (segment)->p_filesz - 1)) \ |
&& (((sec_hdr)->sh_offset - (segment)->p_offset \ |
+ ELF_SECTION_SIZE(sec_hdr, segment)) \ |
<= (segment)->p_filesz))) \ |
/* SHF_ALLOC sections must have VMAs within the segment. */ \ |
&& (!(check_vma) \ |
|| ((sec_hdr)->sh_flags & SHF_ALLOC) == 0 \ |
|| ((sec_hdr)->sh_addr >= (segment)->p_vaddr \ |
&& (!(strict) \ |
|| ((sec_hdr)->sh_addr - (segment)->p_vaddr \ |
<= (segment)->p_memsz - 1)) \ |
&& (((sec_hdr)->sh_addr - (segment)->p_vaddr \ |
+ ELF_SECTION_SIZE(sec_hdr, segment)) \ |
<= (segment)->p_memsz))) \ |
/* No zero size sections at start or end of PT_DYNAMIC. */ \ |
&& ((segment)->p_type != PT_DYNAMIC \ |
|| (sec_hdr)->sh_size != 0 \ |
|| (segment)->p_memsz == 0 \ |
|| (((sec_hdr)->sh_type == SHT_NOBITS \ |
|| ((bfd_vma) (sec_hdr)->sh_offset > (segment)->p_offset \ |
&& ((sec_hdr)->sh_offset - (segment)->p_offset \ |
< (segment)->p_filesz))) \ |
&& (((sec_hdr)->sh_flags & SHF_ALLOC) == 0 \ |
|| ((sec_hdr)->sh_addr > (segment)->p_vaddr \ |
&& ((sec_hdr)->sh_addr - (segment)->p_vaddr \ |
< (segment)->p_memsz)))))) |
#define ELF_SECTION_IN_SEGMENT(sec_hdr, segment) \ |
(ELF_SECTION_IN_SEGMENT_1 (sec_hdr, segment, 1, 0)) |
#define ELF_SECTION_IN_SEGMENT_STRICT(sec_hdr, segment) \ |
(ELF_SECTION_IN_SEGMENT_1 (sec_hdr, segment, 1, 1)) |
#endif /* _ELF_INTERNAL_H */ |
/contrib/toolchain/binutils/include/elf/ip2k.h |
---|
0,0 → 1,62 |
/* IP2xxx ELF support for BFD. |
Copyright (C) 2000, 2002, 2010 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_IP2K_H |
#define _ELF_IP2K_H |
#include "elf/reloc-macros.h" |
/* Relocations. */ |
START_RELOC_NUMBERS (elf_ip2k_reloc_type) |
RELOC_NUMBER (R_IP2K_NONE, 0) |
RELOC_NUMBER (R_IP2K_16, 1) |
RELOC_NUMBER (R_IP2K_32, 2) |
RELOC_NUMBER (R_IP2K_FR9, 3) |
RELOC_NUMBER (R_IP2K_BANK, 4) |
RELOC_NUMBER (R_IP2K_ADDR16CJP, 5) |
RELOC_NUMBER (R_IP2K_PAGE3, 6) |
RELOC_NUMBER (R_IP2K_LO8DATA, 7) |
RELOC_NUMBER (R_IP2K_HI8DATA, 8) |
RELOC_NUMBER (R_IP2K_LO8INSN, 9) |
RELOC_NUMBER (R_IP2K_HI8INSN, 10) |
RELOC_NUMBER (R_IP2K_PC_SKIP, 11) |
RELOC_NUMBER (R_IP2K_TEXT, 12) |
RELOC_NUMBER (R_IP2K_FR_OFFSET, 13) |
RELOC_NUMBER (R_IP2K_EX8DATA, 14) |
END_RELOC_NUMBERS(R_IP2K_max) |
/* Define the data & instruction memory discriminator. In a linked |
executable, an symbol should be deemed to point to an instruction |
if ((address & IP2K_INSN_MASK) == IP2K_INSN_VALUE), and similarly |
for the data space. See also `ld/emulparams/elf32ip2k.sh'. */ |
/* ??? Consider extending the _MASK values to include all the |
intermediate bits that must be zero due to the limited physical |
memory size on the IP2K. */ |
#define IP2K_DATA_MASK 0xff000000 |
#define IP2K_DATA_VALUE 0x01000000 |
#define IP2K_INSN_MASK 0xff000000 |
#define IP2K_INSN_VALUE 0x02000000 |
/* The location of the memory mapped hardware stack. */ |
#define IP2K_STACK_VALUE 0x0f000000 |
#define IP2K_STACK_SIZE 0x20 |
#endif /* _ELF_IP2K_H */ |
/contrib/toolchain/binutils/include/elf/iq2000.h |
---|
0,0 → 1,58 |
/* IQ2000 ELF support for BFD. |
Copyright (C) 2002, 2003, 2010 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_IQ2000_H |
#define _ELF_IQ2000_H |
#include "elf/reloc-macros.h" |
/* Relocations. */ |
START_RELOC_NUMBERS (elf_iq2000_reloc_type) |
RELOC_NUMBER (R_IQ2000_NONE, 0) |
RELOC_NUMBER (R_IQ2000_16, 1) |
RELOC_NUMBER (R_IQ2000_32, 2) |
RELOC_NUMBER (R_IQ2000_26, 3) |
RELOC_NUMBER (R_IQ2000_PC16, 4) |
RELOC_NUMBER (R_IQ2000_HI16, 5) |
RELOC_NUMBER (R_IQ2000_LO16, 6) |
RELOC_NUMBER (R_IQ2000_OFFSET_16, 7) |
RELOC_NUMBER (R_IQ2000_OFFSET_21, 8) |
RELOC_NUMBER (R_IQ2000_UHI16, 9) |
RELOC_NUMBER (R_IQ2000_32_DEBUG, 10) |
RELOC_NUMBER (R_IQ2000_GNU_VTINHERIT, 200) |
RELOC_NUMBER (R_IQ2000_GNU_VTENTRY, 201) |
END_RELOC_NUMBERS(R_IQ2000_max) |
#define EF_IQ2000_CPU_IQ2000 0x00000001 /* default */ |
#define EF_IQ2000_CPU_IQ10 0x00000002 /* IQ10 */ |
#define EF_IQ2000_CPU_MASK 0x00000003 /* specific cpu bits */ |
#define EF_IQ2000_ALL_FLAGS (EF_IQ2000_CPU_MASK) |
/* Define the data & instruction memory discriminator. In a linked |
executable, an symbol should be deemed to point to an instruction |
if ((address & IQ2000_INSN_MASK) == IQ2000_INSN_VALUE), and similarly |
for the data space. */ |
#define IQ2000_DATA_MASK 0x80000000 |
#define IQ2000_DATA_VALUE 0x00000000 |
#define IQ2000_INSN_MASK 0x80000000 |
#define IQ2000_INSN_VALUE 0x80000000 |
#endif /* _ELF_IQ2000_H */ |
/contrib/toolchain/binutils/include/elf/lm32.h |
---|
0,0 → 1,56 |
/* Lattice Mico32 ELF support for BFD. |
Copyright 2008, 2010 Free Software Foundation, Inc. |
Contributed by Jon Beniston <jon@beniston.com> |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_LM32_H |
#define _ELF_LM32_H |
#include "elf/reloc-macros.h" |
/* Relocations. */ |
START_RELOC_NUMBERS (elf_lm32_reloc_type) |
RELOC_NUMBER (R_LM32_NONE, 0) |
RELOC_NUMBER (R_LM32_8, 1) |
RELOC_NUMBER (R_LM32_16, 2) |
RELOC_NUMBER (R_LM32_32, 3) |
RELOC_NUMBER (R_LM32_HI16, 4) |
RELOC_NUMBER (R_LM32_LO16, 5) |
RELOC_NUMBER (R_LM32_GPREL16, 6) |
RELOC_NUMBER (R_LM32_CALL, 7) |
RELOC_NUMBER (R_LM32_BRANCH, 8) |
RELOC_NUMBER (R_LM32_GNU_VTINHERIT, 9) |
RELOC_NUMBER (R_LM32_GNU_VTENTRY, 10) |
RELOC_NUMBER (R_LM32_16_GOT, 11) |
RELOC_NUMBER (R_LM32_GOTOFF_HI16, 12) |
RELOC_NUMBER (R_LM32_GOTOFF_LO16, 13) |
RELOC_NUMBER (R_LM32_COPY, 14) |
RELOC_NUMBER (R_LM32_GLOB_DAT, 15) |
RELOC_NUMBER (R_LM32_JMP_SLOT, 16) |
RELOC_NUMBER (R_LM32_RELATIVE, 17) |
END_RELOC_NUMBERS (R_LM32_max) |
/* Processor specific flags for the ELF header e_flags field. */ |
#define EF_LM32_MACH 0x00000001 |
/* Various CPU types. */ |
#define E_LM32_MACH 0x1 |
#endif /* _ELF_LM32_H */ |
/contrib/toolchain/binutils/include/elf/m32c.h |
---|
0,0 → 1,67 |
/* M32C ELF support for BFD. |
Copyright (C) 2004, 2010 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_M32C_H |
#define _ELF_M32C_H |
#include "elf/reloc-macros.h" |
/* Relocations. */ |
START_RELOC_NUMBERS (elf_m32c_reloc_type) |
RELOC_NUMBER (R_M32C_NONE, 0) |
RELOC_NUMBER (R_M32C_16, 1) |
RELOC_NUMBER (R_M32C_24, 2) |
RELOC_NUMBER (R_M32C_32, 3) |
RELOC_NUMBER (R_M32C_8_PCREL, 4) |
RELOC_NUMBER (R_M32C_16_PCREL, 5) |
/* 8 bit unsigned address, used for dsp8[a0] etc */ |
RELOC_NUMBER (R_M32C_8, 6) |
/* Bits 0..15 of an address, for SMOVF's A0, A1A0, etc. */ |
RELOC_NUMBER (R_M32C_LO16, 7) |
/* Bits 16..23 of an address, for SMOVF's R1H etc. */ |
RELOC_NUMBER (R_M32C_HI8, 8) |
/* Bits 16..31 of an address, for LDE's A1A0 etc. */ |
RELOC_NUMBER (R_M32C_HI16, 9) |
/* These are relocs we need when relaxing. */ |
/* Marks various jump opcodes. */ |
RELOC_NUMBER (R_M32C_RL_JUMP, 10) |
/* Marks standard one-address form. */ |
RELOC_NUMBER (R_M32C_RL_1ADDR, 11) |
/* Marks standard two-address form. */ |
RELOC_NUMBER (R_M32C_RL_2ADDR, 12) |
END_RELOC_NUMBERS (R_M32C_max) |
#define EF_M32C_CPU_M16C 0x00000075 /* default */ |
#define EF_M32C_CPU_M32C 0x00000078 /* m32c */ |
#define EF_M32C_CPU_MASK 0x0000007F /* specific cpu bits */ |
#define EF_M32C_ALL_FLAGS (EF_M32C_CPU_MASK) |
/* Define the data & instruction memory discriminator. In a linked |
executable, an symbol should be deemed to point to an instruction |
if ((address & M16C_INSN_MASK) == M16C_INSN_VALUE), and similarly |
for the data space. See also `ld/emulparams/elf32m32c.sh'. */ |
#define M32C_DATA_MASK 0xffc00000 |
#define M32C_DATA_VALUE 0x00000000 |
#define M32C_INSN_MASK 0xffc00000 |
#define M32C_INSN_VALUE 0x00400000 |
#endif /* _ELF_M32C_H */ |
/contrib/toolchain/binutils/include/elf/m32r.h |
---|
0,0 → 1,123 |
/* M32R ELF support for BFD. |
Copyright 1996, 1997, 1998, 1999, 2000, 2003, 2004, 2008, 2010 |
Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_M32R_H |
#define _ELF_M32R_H |
#include "elf/reloc-macros.h" |
/* Relocations. */ |
START_RELOC_NUMBERS (elf_m32r_reloc_type) |
RELOC_NUMBER (R_M32R_NONE, 0) |
/* REL relocations */ |
RELOC_NUMBER (R_M32R_16, 1) /* For backwards compatibility. */ |
RELOC_NUMBER (R_M32R_32, 2) /* For backwards compatibility. */ |
RELOC_NUMBER (R_M32R_24, 3) /* For backwards compatibility. */ |
RELOC_NUMBER (R_M32R_10_PCREL, 4) /* For backwards compatibility. */ |
RELOC_NUMBER (R_M32R_18_PCREL, 5) /* For backwards compatibility. */ |
RELOC_NUMBER (R_M32R_26_PCREL, 6) /* For backwards compatibility. */ |
RELOC_NUMBER (R_M32R_HI16_ULO, 7) /* For backwards compatibility. */ |
RELOC_NUMBER (R_M32R_HI16_SLO, 8) /* For backwards compatibility. */ |
RELOC_NUMBER (R_M32R_LO16, 9) /* For backwards compatibility. */ |
RELOC_NUMBER (R_M32R_SDA16, 10) /* For backwards compatibility. */ |
RELOC_NUMBER (R_M32R_GNU_VTINHERIT, 11)/* For backwards compatibility. */ |
RELOC_NUMBER (R_M32R_GNU_VTENTRY, 12) /* For backwards compatibility. */ |
/* RELA relocations */ |
RELOC_NUMBER (R_M32R_16_RELA, 33) |
RELOC_NUMBER (R_M32R_32_RELA, 34) |
RELOC_NUMBER (R_M32R_24_RELA, 35) |
RELOC_NUMBER (R_M32R_10_PCREL_RELA, 36) |
RELOC_NUMBER (R_M32R_18_PCREL_RELA, 37) |
RELOC_NUMBER (R_M32R_26_PCREL_RELA, 38) |
RELOC_NUMBER (R_M32R_HI16_ULO_RELA, 39) |
RELOC_NUMBER (R_M32R_HI16_SLO_RELA, 40) |
RELOC_NUMBER (R_M32R_LO16_RELA, 41) |
RELOC_NUMBER (R_M32R_SDA16_RELA, 42) |
RELOC_NUMBER (R_M32R_RELA_GNU_VTINHERIT, 43) |
RELOC_NUMBER (R_M32R_RELA_GNU_VTENTRY, 44) |
RELOC_NUMBER (R_M32R_REL32, 45) |
RELOC_NUMBER (R_M32R_GOT24, 48) |
RELOC_NUMBER (R_M32R_26_PLTREL, 49) |
RELOC_NUMBER (R_M32R_COPY, 50) |
RELOC_NUMBER (R_M32R_GLOB_DAT, 51) |
RELOC_NUMBER (R_M32R_JMP_SLOT, 52) |
RELOC_NUMBER (R_M32R_RELATIVE, 53) |
RELOC_NUMBER (R_M32R_GOTOFF, 54) |
RELOC_NUMBER (R_M32R_GOTPC24, 55) |
RELOC_NUMBER (R_M32R_GOT16_HI_ULO, 56) |
RELOC_NUMBER (R_M32R_GOT16_HI_SLO, 57) |
RELOC_NUMBER (R_M32R_GOT16_LO, 58) |
RELOC_NUMBER (R_M32R_GOTPC_HI_ULO, 59) |
RELOC_NUMBER (R_M32R_GOTPC_HI_SLO, 60) |
RELOC_NUMBER (R_M32R_GOTPC_LO, 61) |
RELOC_NUMBER (R_M32R_GOTOFF_HI_ULO, 62) |
RELOC_NUMBER (R_M32R_GOTOFF_HI_SLO, 63) |
RELOC_NUMBER (R_M32R_GOTOFF_LO, 64) |
END_RELOC_NUMBERS (R_M32R_max) |
/* Processor specific section indices. These sections do not actually |
exist. Symbols with a st_shndx field corresponding to one of these |
values have a special meaning. */ |
/* Small common symbol. */ |
#define SHN_M32R_SCOMMON SHN_LORESERVE |
/* Processor specific section flags. */ |
/* This section contains sufficient relocs to be relaxed. |
When relaxing, even relocs of branch instructions the assembler could |
complete must be present because relaxing may cause the branch target to |
move. */ |
#define SHF_M32R_CAN_RELAX 0x10000000 |
/* Processor specific flags for the ELF header e_flags field. */ |
/* Two bit m32r architecture field. */ |
#define EF_M32R_ARCH 0x30000000 |
/* m32r code. */ |
#define E_M32R_ARCH 0x00000000 |
/* m32rx code. */ |
#define E_M32RX_ARCH 0x10000000 |
/* m32r2 code. */ |
#define E_M32R2_ARCH 0x20000000 |
/* 12 bit m32r new instructions field. */ |
#define EF_M32R_INST 0x0FFF0000 |
/* Parallel instructions. */ |
#define E_M32R_HAS_PARALLEL 0x00010000 |
/* Hidden instructions for m32rx: |
jc, jnc, macwhi-a, macwlo-a, mulwhi-a, mulwlo-a, sth+, shb+, sat, pcmpbz, |
sc, snc. */ |
#define E_M32R_HAS_HIDDEN_INST 0x00020000 |
/* New bit instructions: |
clrpsw, setpsw, bset, bclr, btst. */ |
#define E_M32R_HAS_BIT_INST 0x00040000 |
/* Floating point instructions. */ |
#define E_M32R_HAS_FLOAT_INST 0x00080000 |
/* 4 bit m32r ignore to check field. */ |
#define EF_M32R_IGNORE 0x0000000F |
#endif |
/contrib/toolchain/binutils/include/elf/m68hc11.h |
---|
0,0 → 1,107 |
/* m68hc11 & m68hc12 ELF support for BFD. |
Copyright 1999, 2000, 2001, 2002, 2010, 2012 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_M68HC11_H |
#define _ELF_M68HC11_H |
#include "elf/reloc-macros.h" |
/* Relocation types. */ |
START_RELOC_NUMBERS (elf_m68hc11_reloc_type) |
RELOC_NUMBER (R_M68HC11_NONE, 0) |
RELOC_NUMBER (R_M68HC11_8, 1) |
RELOC_NUMBER (R_M68HC11_HI8, 2) |
RELOC_NUMBER (R_M68HC11_LO8, 3) |
RELOC_NUMBER (R_M68HC11_PCREL_8, 4) |
RELOC_NUMBER (R_M68HC11_16, 5) |
RELOC_NUMBER (R_M68HC11_32, 6) |
RELOC_NUMBER (R_M68HC11_3B, 7) |
RELOC_NUMBER (R_M68HC11_PCREL_16, 8) |
/* These are GNU extensions to enable C++ vtable garbage collection. */ |
RELOC_NUMBER (R_M68HC11_GNU_VTINHERIT, 9) |
RELOC_NUMBER (R_M68HC11_GNU_VTENTRY, 10) |
RELOC_NUMBER (R_M68HC11_24, 11) |
RELOC_NUMBER (R_M68HC11_LO16, 12) |
RELOC_NUMBER (R_M68HC11_PAGE, 13) |
RELOC_NUMBER (R_M68HC12_16B, 15) |
RELOC_NUMBER (R_M68HC12_PCREL_9, 16) |
RELOC_NUMBER (R_M68HC12_PCREL_10, 17) |
RELOC_NUMBER (R_M68HC12_HI8XG, 18) |
RELOC_NUMBER (R_M68HC12_LO8XG, 19) |
/* GNU extension for linker relaxation. |
Mark beginning of a jump instruction (any form). */ |
RELOC_NUMBER (R_M68HC11_RL_JUMP, 20) |
/* Mark beginning of Gcc relaxation group instruction. */ |
RELOC_NUMBER (R_M68HC11_RL_GROUP, 21) |
END_RELOC_NUMBERS (R_M68HC11_max) |
/* Processor specific flags for the ELF header e_flags field. */ |
/* ABI identification. */ |
#define EF_M68HC11_ABI 0x00000000F |
/* Integers are 32-bit long. */ |
#define E_M68HC11_I32 0x000000001 |
/* Doubles are 64-bit long. */ |
#define E_M68HC11_F64 0x000000002 |
/* Uses 68HC12 memory banks. */ |
#define E_M68HC12_BANKS 0x000000004 |
/* XGATE ram offsetting. */ |
#define E_M68HC11_XGATE_RAMOFFSET 0x000000100 |
/* Suppress warnings */ |
#define E_M68HC11_NO_BANK_WARNING 0x000000200 |
#define EF_M68HC11_MACH_MASK 0xF0 |
#define EF_M68HC11_GENERIC 0x00 /* Generic 68HC12/backward compatibility. */ |
#define EF_M68HC12_MACH 0x10 /* 68HC12 microcontroller. */ |
#define EF_M68HCS12_MACH 0x20 /* 68HCS12 microcontroller. */ |
#define EF_M68HC11_MACH(mach) ((mach) & EF_M68HC11_MACH_MASK) |
/* True if we can merge machines. A generic HC12 can work on any proc |
but once we have specific code, merge is not possible. */ |
#define EF_M68HC11_CAN_MERGE_MACH(mach1, mach2) \ |
((EF_M68HC11_MACH (mach1) == EF_M68HC11_MACH (mach2)) \ |
|| (EF_M68HC11_MACH (mach1) == EF_M68HC11_GENERIC) \ |
|| (EF_M68HC11_MACH (mach2) == EF_M68HC11_GENERIC)) |
#define EF_M68HC11_MERGE_MACH(mach1, mach2) \ |
(((EF_M68HC11_MACH (mach1) == EF_M68HC11_MACH (mach2)) \ |
|| (EF_M68HC11_MACH (mach1) == EF_M68HC11_GENERIC)) ? \ |
EF_M68HC11_MACH (mach2) : EF_M68HC11_MACH (mach1)) |
/* Special values for the st_other field in the symbol table. These |
are used for 68HC12 to identify far functions (must be called with |
'call' and returns with 'rtc'). */ |
#define STO_M68HC12_FAR 0x80 |
/* Identify interrupt handlers. This is used by the debugger to |
correctly compute the stack frame. */ |
#define STO_M68HC12_INTERRUPT 0x40 |
#endif |
/contrib/toolchain/binutils/include/elf/m68k.h |
---|
0,0 → 1,102 |
/* MC68k ELF support for BFD. |
Copyright 1998, 1999, 2000, 2002, 2005, 2006, 2007, 2009, 2010 |
Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_M68K_H |
#define _ELF_M68K_H |
#include "elf/reloc-macros.h" |
/* Relocation types. */ |
START_RELOC_NUMBERS (elf_m68k_reloc_type) |
RELOC_NUMBER (R_68K_NONE, 0) /* No reloc */ |
RELOC_NUMBER (R_68K_32, 1) /* Direct 32 bit */ |
RELOC_NUMBER (R_68K_16, 2) /* Direct 16 bit */ |
RELOC_NUMBER (R_68K_8, 3) /* Direct 8 bit */ |
RELOC_NUMBER (R_68K_PC32, 4) /* PC relative 32 bit */ |
RELOC_NUMBER (R_68K_PC16, 5) /* PC relative 16 bit */ |
RELOC_NUMBER (R_68K_PC8, 6) /* PC relative 8 bit */ |
RELOC_NUMBER (R_68K_GOT32, 7) /* 32 bit PC relative GOT entry */ |
RELOC_NUMBER (R_68K_GOT16, 8) /* 16 bit PC relative GOT entry */ |
RELOC_NUMBER (R_68K_GOT8, 9) /* 8 bit PC relative GOT entry */ |
RELOC_NUMBER (R_68K_GOT32O, 10) /* 32 bit GOT offset */ |
RELOC_NUMBER (R_68K_GOT16O, 11) /* 16 bit GOT offset */ |
RELOC_NUMBER (R_68K_GOT8O, 12) /* 8 bit GOT offset */ |
RELOC_NUMBER (R_68K_PLT32, 13) /* 32 bit PC relative PLT address */ |
RELOC_NUMBER (R_68K_PLT16, 14) /* 16 bit PC relative PLT address */ |
RELOC_NUMBER (R_68K_PLT8, 15) /* 8 bit PC relative PLT address */ |
RELOC_NUMBER (R_68K_PLT32O, 16) /* 32 bit PLT offset */ |
RELOC_NUMBER (R_68K_PLT16O, 17) /* 16 bit PLT offset */ |
RELOC_NUMBER (R_68K_PLT8O, 18) /* 8 bit PLT offset */ |
RELOC_NUMBER (R_68K_COPY, 19) /* Copy symbol at runtime */ |
RELOC_NUMBER (R_68K_GLOB_DAT, 20) /* Create GOT entry */ |
RELOC_NUMBER (R_68K_JMP_SLOT, 21) /* Create PLT entry */ |
RELOC_NUMBER (R_68K_RELATIVE, 22) /* Adjust by program base */ |
/* These are GNU extensions to enable C++ vtable garbage collection. */ |
RELOC_NUMBER (R_68K_GNU_VTINHERIT, 23) |
RELOC_NUMBER (R_68K_GNU_VTENTRY, 24) |
/* TLS static relocations. */ |
RELOC_NUMBER (R_68K_TLS_GD32, 25) |
RELOC_NUMBER (R_68K_TLS_GD16, 26) |
RELOC_NUMBER (R_68K_TLS_GD8, 27) |
RELOC_NUMBER (R_68K_TLS_LDM32, 28) |
RELOC_NUMBER (R_68K_TLS_LDM16, 29) |
RELOC_NUMBER (R_68K_TLS_LDM8, 30) |
RELOC_NUMBER (R_68K_TLS_LDO32, 31) |
RELOC_NUMBER (R_68K_TLS_LDO16, 32) |
RELOC_NUMBER (R_68K_TLS_LDO8, 33) |
RELOC_NUMBER (R_68K_TLS_IE32, 34) |
RELOC_NUMBER (R_68K_TLS_IE16, 35) |
RELOC_NUMBER (R_68K_TLS_IE8, 36) |
RELOC_NUMBER (R_68K_TLS_LE32, 37) |
RELOC_NUMBER (R_68K_TLS_LE16, 38) |
RELOC_NUMBER (R_68K_TLS_LE8, 39) |
RELOC_NUMBER (R_68K_TLS_DTPMOD32, 40) |
RELOC_NUMBER (R_68K_TLS_DTPREL32, 41) |
RELOC_NUMBER (R_68K_TLS_TPREL32, 42) |
END_RELOC_NUMBERS (R_68K_max) |
/* We use the top 24 bits to encode information about the |
architecture variant. */ |
#define EF_M68K_CPU32 0x00810000 |
#define EF_M68K_M68000 0x01000000 |
#define EF_M68K_CFV4E 0x00008000 |
#define EF_M68K_FIDO 0x02000000 |
#define EF_M68K_ARCH_MASK \ |
(EF_M68K_M68000 | EF_M68K_CPU32 | EF_M68K_CFV4E | EF_M68K_FIDO) |
/* We use the bottom 8 bits to encode information about the |
coldfire variant. If we use any of these bits, the top 24 bits are |
either 0 or EF_M68K_CFV4E. */ |
#define EF_M68K_CF_ISA_MASK 0x0F /* Which ISA */ |
#define EF_M68K_CF_ISA_A_NODIV 0x01 /* ISA A except for div */ |
#define EF_M68K_CF_ISA_A 0x02 |
#define EF_M68K_CF_ISA_A_PLUS 0x03 |
#define EF_M68K_CF_ISA_B_NOUSP 0x04 /* ISA_B except for USP */ |
#define EF_M68K_CF_ISA_B 0x05 |
#define EF_M68K_CF_ISA_C 0x06 |
#define EF_M68K_CF_ISA_C_NODIV 0x07 /* ISA C except for div */ |
#define EF_M68K_CF_MAC_MASK 0x30 |
#define EF_M68K_CF_MAC 0x10 /* MAC */ |
#define EF_M68K_CF_EMAC 0x20 /* EMAC */ |
#define EF_M68K_CF_EMAC_B 0x30 /* EMAC_B */ |
#define EF_M68K_CF_FLOAT 0x40 /* Has float insns */ |
#define EF_M68K_CF_MASK 0xFF |
#endif |
/contrib/toolchain/binutils/include/elf/mcore.h |
---|
0,0 → 1,47 |
/* Motorola MCore support for BFD. |
Copyright 1995, 1999, 2000, 2010 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* This file holds definitions specific to the MCore ELF ABI. */ |
#ifndef _ELF_MORE_H |
#define _ELF_MORE_H |
#include "elf/reloc-macros.h" |
/* Relocations. */ |
START_RELOC_NUMBERS (elf_mcore_reloc_type) |
RELOC_NUMBER (R_MCORE_NONE, 0) |
RELOC_NUMBER (R_MCORE_ADDR32, 1) |
RELOC_NUMBER (R_MCORE_PCRELIMM8BY4, 2) |
RELOC_NUMBER (R_MCORE_PCRELIMM11BY2, 3) |
RELOC_NUMBER (R_MCORE_PCRELIMM4BY2, 4) |
RELOC_NUMBER (R_MCORE_PCREL32, 5) |
RELOC_NUMBER (R_MCORE_PCRELJSR_IMM11BY2, 6) |
RELOC_NUMBER (R_MCORE_GNU_VTINHERIT, 7) |
RELOC_NUMBER (R_MCORE_GNU_VTENTRY, 8) |
RELOC_NUMBER (R_MCORE_RELATIVE, 9) |
RELOC_NUMBER (R_MCORE_COPY, 10) |
RELOC_NUMBER (R_MCORE_GLOB_DAT, 11) |
RELOC_NUMBER (R_MCORE_JUMP_SLOT, 12) |
END_RELOC_NUMBERS (R_MCORE_max) |
/* Section Attributes. */ |
#define SHF_MCORE_NOREAD 0x80000000 |
#endif /* _ELF_MCORE_H */ |
/contrib/toolchain/binutils/include/elf/mep.h |
---|
0,0 → 1,95 |
/* Toshiba MeP ELF support for BFD. |
Copyright (C) 2001, 2004, 2005, 2007, 2009, 2010 |
Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_MEP_H |
#define _ELF_MEP_H |
/* Bits in the sh_flags field of Elf32_Shdr: */ |
#define SHF_MEP_VLIW 0x10000000 /* contains vliw code */ |
/* This bit is reserved by BFD for processor specific stuff. Name |
it properly so that we can easily stay consistent elsewhere. */ |
#define SEC_MEP_VLIW SEC_TIC54X_BLOCK |
#include "elf/reloc-macros.h" |
/* Note: The comments in this file are used by bfd/mep-relocs.pl to |
build parts of bfd/elf32-mep.c. */ |
/* Relocations. */ |
START_RELOC_NUMBERS (elf_mep_reloc_type) |
/* These two must appear first so that they are not processed by bfd/mep-relocs.pl. */ |
RELOC_NUMBER (R_MEP_NONE, 0) |
RELOC_NUMBER (R_RELC, 1) |
RELOC_NUMBER (R_MEP_8, 2) /* 7654 3210 U */ |
RELOC_NUMBER (R_MEP_16, 3) /* fedc ba98 7654 3210 U */ |
RELOC_NUMBER (R_MEP_32, 4) /* vuts rqpo nmlk jihg fedc ba98 7654 3210 U */ |
RELOC_NUMBER (R_MEP_PCREL8A2, 5) /* ---- ---- 7654 321- S PC-REL */ |
RELOC_NUMBER (R_MEP_PCREL12A2, 6) /* ---- ba98 7654 321- S PC-REL */ |
RELOC_NUMBER (R_MEP_PCREL17A2, 7) /* ---- ---- ---- ---- gfed cba9 8765 4321 S PC-REL */ |
RELOC_NUMBER (R_MEP_PCREL24A2, 8) /* ---- -765 4321 ---- nmlk jihg fedc ba98 S PC-REL */ |
RELOC_NUMBER (R_MEP_PCABS24A2, 9) /* ---- -765 4321 ---- nmlk jihg fedc ba98 U */ |
RELOC_NUMBER (R_MEP_LOW16, 10) /* ---- ---- ---- ---- fedc ba98 7654 3210 U no-overflow */ |
RELOC_NUMBER (R_MEP_HI16U, 11) /* ---- ---- ---- ---- vuts rqpo nmlk jihg U no-overflow */ |
RELOC_NUMBER (R_MEP_HI16S, 12) /* ---- ---- ---- ---- vuts rqpo nmlk jihg S no-overflow */ |
RELOC_NUMBER (R_MEP_GPREL, 13) /* ---- ---- ---- ---- fedc ba98 7654 3210 S GP-REL*/ |
RELOC_NUMBER (R_MEP_TPREL, 14) /* ---- ---- ---- ---- fedc ba98 7654 3210 S TP-REL*/ |
RELOC_NUMBER (R_MEP_TPREL7, 15) /* ---- ---- -654 3210 U TP-REL */ |
RELOC_NUMBER (R_MEP_TPREL7A2, 16) /* ---- ---- -654 321- U TP-REL */ |
RELOC_NUMBER (R_MEP_TPREL7A4, 17) /* ---- ---- -654 32-- U TP-REL */ |
RELOC_NUMBER (R_MEP_UIMM24, 18) /* ---- ---- 7654 3210 nmlk jihg fedc ba98 U */ |
RELOC_NUMBER (R_MEP_ADDR24A4, 19) /* ---- ---- 7654 32-- nmlk jihg fedc ba98 U */ |
RELOC_NUMBER (R_MEP_GNU_VTINHERIT, 20) /* ---- ---- ---- ---- U no-overflow */ |
RELOC_NUMBER (R_MEP_GNU_VTENTRY, 21) /* ---- ---- ---- ---- U no-overflow */ |
END_RELOC_NUMBERS(R_MEP_max) |
#define EF_MEP_CPU_MASK 0xff000000 /* specific cpu bits */ |
#define EF_MEP_CPU_MEP 0x00000000 /* generic MEP */ |
#define EF_MEP_CPU_C2 0x01000000 /* MEP c2 */ |
#define EF_MEP_CPU_C3 0x02000000 /* MEP c3 */ |
#define EF_MEP_CPU_C4 0x04000000 /* MEP c4 */ |
/* 5..7 are reseved */ |
#define EF_MEP_CPU_C5 0x08000000 /* MEP c5 */ |
#define EF_MEP_CPU_H1 0x10000000 /* MEP h1 */ |
#define EF_MEP_COP_MASK 0x00ff0000 |
#define EF_MEP_COP_NONE 0x00000000 |
#define EF_MEP_COP_AVC 0x00010000 |
#define EF_MEP_COP_AVC2 0x00020000 |
#define EF_MEP_COP_FMAX 0x00030000 |
/* 4..5 are reserved. */ |
#define EF_MEP_COP_IVC2 0x00060000 |
#define EF_MEP_LIBRARY 0x00000100 /* Built as a library */ |
#define EF_MEP_INDEX_MASK 0x000000ff /* Configuration index */ |
#define EF_MEP_ALL_FLAGS 0xffff01ff |
#endif /* _ELF_MEP_H */ |
/contrib/toolchain/binutils/include/elf/metag.h |
---|
0,0 → 1,91 |
/* Meta ELF support for BFD. |
Copyright (C) 2013 Free Software Foundation, Inc. |
Contributed by Imagination Technologies Ltd. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_METAG_H |
#define _ELF_METAG_H |
#include "elf/reloc-macros.h" |
/* Relocation types. */ |
START_RELOC_NUMBERS (elf_metag_reloc_type) |
RELOC_NUMBER (R_METAG_HIADDR16, 0) |
RELOC_NUMBER (R_METAG_LOADDR16, 1) |
RELOC_NUMBER (R_METAG_ADDR32, 2) |
RELOC_NUMBER (R_METAG_NONE, 3) |
RELOC_NUMBER (R_METAG_RELBRANCH, 4) |
RELOC_NUMBER (R_METAG_GETSETOFF, 5) |
/* Backward compatability */ |
RELOC_NUMBER (R_METAG_REG32OP1, 6) |
RELOC_NUMBER (R_METAG_REG32OP2, 7) |
RELOC_NUMBER (R_METAG_REG32OP3, 8) |
RELOC_NUMBER (R_METAG_REG16OP1, 9) |
RELOC_NUMBER (R_METAG_REG16OP2, 10) |
RELOC_NUMBER (R_METAG_REG16OP3, 11) |
RELOC_NUMBER (R_METAG_REG32OP4, 12) |
RELOC_NUMBER (R_METAG_HIOG, 13) |
RELOC_NUMBER (R_METAG_LOOG, 14) |
RELOC_NUMBER (R_METAG_REL8, 15) |
RELOC_NUMBER (R_METAG_REL16, 16) |
/* GNU */ |
RELOC_NUMBER (R_METAG_GNU_VTINHERIT,30) |
RELOC_NUMBER (R_METAG_GNU_VTENTRY, 31) |
/* PIC relocations */ |
RELOC_NUMBER (R_METAG_HI16_GOTOFF, 32) |
RELOC_NUMBER (R_METAG_LO16_GOTOFF, 33) |
RELOC_NUMBER (R_METAG_GETSET_GOTOFF,34) |
RELOC_NUMBER (R_METAG_GETSET_GOT, 35) |
RELOC_NUMBER (R_METAG_HI16_GOTPC, 36) |
RELOC_NUMBER (R_METAG_LO16_GOTPC, 37) |
RELOC_NUMBER (R_METAG_HI16_PLT, 38) |
RELOC_NUMBER (R_METAG_LO16_PLT, 39) |
RELOC_NUMBER (R_METAG_RELBRANCH_PLT,40) |
RELOC_NUMBER (R_METAG_GOTOFF, 41) |
RELOC_NUMBER (R_METAG_PLT, 42) |
RELOC_NUMBER (R_METAG_COPY, 43) |
RELOC_NUMBER (R_METAG_JMP_SLOT, 44) |
RELOC_NUMBER (R_METAG_RELATIVE, 45) |
RELOC_NUMBER (R_METAG_GLOB_DAT, 46) |
/* TLS relocations */ |
RELOC_NUMBER (R_METAG_TLS_GD, 47) |
RELOC_NUMBER (R_METAG_TLS_LDM, 48) |
RELOC_NUMBER (R_METAG_TLS_LDO_HI16, 49) |
RELOC_NUMBER (R_METAG_TLS_LDO_LO16, 50) |
RELOC_NUMBER (R_METAG_TLS_LDO, 51) |
RELOC_NUMBER (R_METAG_TLS_IE, 52) |
RELOC_NUMBER (R_METAG_TLS_IENONPIC, 53) |
RELOC_NUMBER (R_METAG_TLS_IENONPIC_HI16,54) |
RELOC_NUMBER (R_METAG_TLS_IENONPIC_LO16,55) |
RELOC_NUMBER (R_METAG_TLS_TPOFF, 56) |
RELOC_NUMBER (R_METAG_TLS_DTPMOD, 57) |
RELOC_NUMBER (R_METAG_TLS_DTPOFF, 58) |
RELOC_NUMBER (R_METAG_TLS_LE, 59) |
RELOC_NUMBER (R_METAG_TLS_LE_HI16, 60) |
RELOC_NUMBER (R_METAG_TLS_LE_LO16, 61) |
END_RELOC_NUMBERS (R_METAG_MAX) |
#endif /* _ELF_METAG_H */ |
/contrib/toolchain/binutils/include/elf/microblaze.h |
---|
0,0 → 1,71 |
/* Xilinx MicroBlaze support for BFD. |
Copyright 2009, 2010 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA |
02110-1301, USA. */ |
/* This file holds definitions specific to the MICROBLAZE ELF ABI. */ |
#ifndef _ELF_MICROBLAZE_H |
#define _ELF_MICROBLAZE_H |
#include "elf/reloc-macros.h" |
/* Relocations. */ |
START_RELOC_NUMBERS (elf_microblaze_reloc_type) |
RELOC_NUMBER (R_MICROBLAZE_NONE, 0) |
RELOC_NUMBER (R_MICROBLAZE_32, 1) |
RELOC_NUMBER (R_MICROBLAZE_32_PCREL, 2) |
RELOC_NUMBER (R_MICROBLAZE_64_PCREL, 3) |
RELOC_NUMBER (R_MICROBLAZE_32_PCREL_LO, 4) |
RELOC_NUMBER (R_MICROBLAZE_64, 5) |
RELOC_NUMBER (R_MICROBLAZE_32_LO, 6) |
RELOC_NUMBER (R_MICROBLAZE_SRO32, 7) |
RELOC_NUMBER (R_MICROBLAZE_SRW32, 8) |
RELOC_NUMBER (R_MICROBLAZE_64_NONE, 9) |
RELOC_NUMBER (R_MICROBLAZE_32_SYM_OP_SYM, 10) |
RELOC_NUMBER (R_MICROBLAZE_GNU_VTINHERIT, 11) |
RELOC_NUMBER (R_MICROBLAZE_GNU_VTENTRY, 12) |
RELOC_NUMBER (R_MICROBLAZE_GOTPC_64, 13) /* PC-relative GOT offset. */ |
RELOC_NUMBER (R_MICROBLAZE_GOT_64, 14) /* GOT entry offset. */ |
RELOC_NUMBER (R_MICROBLAZE_PLT_64, 15) /* PLT offset (PC-relative). */ |
RELOC_NUMBER (R_MICROBLAZE_REL, 16) /* Adjust by program base. */ |
RELOC_NUMBER (R_MICROBLAZE_JUMP_SLOT, 17) /* Create PLT entry. */ |
RELOC_NUMBER (R_MICROBLAZE_GLOB_DAT, 18) /* Create GOT entry. */ |
RELOC_NUMBER (R_MICROBLAZE_GOTOFF_64, 19) /* Offset relative to GOT. */ |
RELOC_NUMBER (R_MICROBLAZE_GOTOFF_32, 20) /* Offset relative to GOT. */ |
RELOC_NUMBER (R_MICROBLAZE_COPY, 21) /* Runtime copy. */ |
RELOC_NUMBER (R_MICROBLAZE_TLS, 22) /* TLS Reloc */ |
RELOC_NUMBER (R_MICROBLAZE_TLSGD, 23) /* TLS General Dynamic */ |
RELOC_NUMBER (R_MICROBLAZE_TLSLD, 24) /* TLS Local Dynamic */ |
RELOC_NUMBER (R_MICROBLAZE_TLSDTPMOD32, 25) /* TLS Module ID */ |
RELOC_NUMBER (R_MICROBLAZE_TLSDTPREL32, 26) /* TLS Offset Within TLS Block */ |
RELOC_NUMBER (R_MICROBLAZE_TLSDTPREL64, 27) /* TLS Offset Within TLS Block */ |
RELOC_NUMBER (R_MICROBLAZE_TLSGOTTPREL32, 28) /* TLS Offset From Thread Pointer */ |
RELOC_NUMBER (R_MICROBLAZE_TLSTPREL32, 29) /* TLS Offset From Thread Pointer */ |
END_RELOC_NUMBERS (R_MICROBLAZE_max) |
/* Global base address names. */ |
#define RO_SDA_ANCHOR_NAME "_SDA2_BASE_" |
#define RW_SDA_ANCHOR_NAME "_SDA_BASE_" |
/* Section Attributes. */ |
#define SHF_MICROBLAZE_NOREAD 0x80000000 |
#endif /* _ELF_MICROBLAZE_H */ |
/contrib/toolchain/binutils/include/elf/mips.h |
---|
0,0 → 1,1161 |
/* MIPS ELF support for BFD. |
Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, |
2003, 2004, 2005, 2008, 2009, 2010, 2013 |
Free Software Foundation, Inc. |
By Ian Lance Taylor, Cygnus Support, <ian@cygnus.com>, from |
information in the System V Application Binary Interface, MIPS |
Processor Supplement. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* This file holds definitions specific to the MIPS ELF ABI. Note |
that most of this is not actually implemented by BFD. */ |
#ifndef _ELF_MIPS_H |
#define _ELF_MIPS_H |
#include "elf/reloc-macros.h" |
/* Relocation types. */ |
START_RELOC_NUMBERS (elf_mips_reloc_type) |
RELOC_NUMBER (R_MIPS_NONE, 0) |
RELOC_NUMBER (R_MIPS_16, 1) |
RELOC_NUMBER (R_MIPS_32, 2) /* In Elf 64: alias R_MIPS_ADD */ |
RELOC_NUMBER (R_MIPS_REL32, 3) /* In Elf 64: alias R_MIPS_REL */ |
RELOC_NUMBER (R_MIPS_26, 4) |
RELOC_NUMBER (R_MIPS_HI16, 5) |
RELOC_NUMBER (R_MIPS_LO16, 6) |
RELOC_NUMBER (R_MIPS_GPREL16, 7) /* In Elf 64: alias R_MIPS_GPREL */ |
RELOC_NUMBER (R_MIPS_LITERAL, 8) |
RELOC_NUMBER (R_MIPS_GOT16, 9) /* In Elf 64: alias R_MIPS_GOT */ |
RELOC_NUMBER (R_MIPS_PC16, 10) |
RELOC_NUMBER (R_MIPS_CALL16, 11) /* In Elf 64: alias R_MIPS_CALL */ |
RELOC_NUMBER (R_MIPS_GPREL32, 12) |
/* The remaining relocs are defined on Irix, although they are not |
in the MIPS ELF ABI. */ |
RELOC_NUMBER (R_MIPS_UNUSED1, 13) |
RELOC_NUMBER (R_MIPS_UNUSED2, 14) |
RELOC_NUMBER (R_MIPS_UNUSED3, 15) |
RELOC_NUMBER (R_MIPS_SHIFT5, 16) |
RELOC_NUMBER (R_MIPS_SHIFT6, 17) |
RELOC_NUMBER (R_MIPS_64, 18) |
RELOC_NUMBER (R_MIPS_GOT_DISP, 19) |
RELOC_NUMBER (R_MIPS_GOT_PAGE, 20) |
RELOC_NUMBER (R_MIPS_GOT_OFST, 21) |
RELOC_NUMBER (R_MIPS_GOT_HI16, 22) |
RELOC_NUMBER (R_MIPS_GOT_LO16, 23) |
RELOC_NUMBER (R_MIPS_SUB, 24) |
RELOC_NUMBER (R_MIPS_INSERT_A, 25) |
RELOC_NUMBER (R_MIPS_INSERT_B, 26) |
RELOC_NUMBER (R_MIPS_DELETE, 27) |
RELOC_NUMBER (R_MIPS_HIGHER, 28) |
RELOC_NUMBER (R_MIPS_HIGHEST, 29) |
RELOC_NUMBER (R_MIPS_CALL_HI16, 30) |
RELOC_NUMBER (R_MIPS_CALL_LO16, 31) |
RELOC_NUMBER (R_MIPS_SCN_DISP, 32) |
RELOC_NUMBER (R_MIPS_REL16, 33) |
RELOC_NUMBER (R_MIPS_ADD_IMMEDIATE, 34) |
RELOC_NUMBER (R_MIPS_PJUMP, 35) |
RELOC_NUMBER (R_MIPS_RELGOT, 36) |
RELOC_NUMBER (R_MIPS_JALR, 37) |
/* TLS relocations. */ |
RELOC_NUMBER (R_MIPS_TLS_DTPMOD32, 38) |
RELOC_NUMBER (R_MIPS_TLS_DTPREL32, 39) |
RELOC_NUMBER (R_MIPS_TLS_DTPMOD64, 40) |
RELOC_NUMBER (R_MIPS_TLS_DTPREL64, 41) |
RELOC_NUMBER (R_MIPS_TLS_GD, 42) |
RELOC_NUMBER (R_MIPS_TLS_LDM, 43) |
RELOC_NUMBER (R_MIPS_TLS_DTPREL_HI16, 44) |
RELOC_NUMBER (R_MIPS_TLS_DTPREL_LO16, 45) |
RELOC_NUMBER (R_MIPS_TLS_GOTTPREL, 46) |
RELOC_NUMBER (R_MIPS_TLS_TPREL32, 47) |
RELOC_NUMBER (R_MIPS_TLS_TPREL64, 48) |
RELOC_NUMBER (R_MIPS_TLS_TPREL_HI16, 49) |
RELOC_NUMBER (R_MIPS_TLS_TPREL_LO16, 50) |
RELOC_NUMBER (R_MIPS_GLOB_DAT, 51) |
FAKE_RELOC (R_MIPS_max, 52) |
/* These relocs are used for the mips16. */ |
FAKE_RELOC (R_MIPS16_min, 100) |
RELOC_NUMBER (R_MIPS16_26, 100) |
RELOC_NUMBER (R_MIPS16_GPREL, 101) |
RELOC_NUMBER (R_MIPS16_GOT16, 102) |
RELOC_NUMBER (R_MIPS16_CALL16, 103) |
RELOC_NUMBER (R_MIPS16_HI16, 104) |
RELOC_NUMBER (R_MIPS16_LO16, 105) |
RELOC_NUMBER (R_MIPS16_TLS_GD, 106) |
RELOC_NUMBER (R_MIPS16_TLS_LDM, 107) |
RELOC_NUMBER (R_MIPS16_TLS_DTPREL_HI16, 108) |
RELOC_NUMBER (R_MIPS16_TLS_DTPREL_LO16, 109) |
RELOC_NUMBER (R_MIPS16_TLS_GOTTPREL, 110) |
RELOC_NUMBER (R_MIPS16_TLS_TPREL_HI16, 111) |
RELOC_NUMBER (R_MIPS16_TLS_TPREL_LO16, 112) |
FAKE_RELOC (R_MIPS16_max, 113) |
/* These relocations are specific to VxWorks. */ |
RELOC_NUMBER (R_MIPS_COPY, 126) |
RELOC_NUMBER (R_MIPS_JUMP_SLOT, 127) |
/* These relocations are specific to microMIPS. */ |
FAKE_RELOC (R_MICROMIPS_min, 130) |
RELOC_NUMBER (R_MICROMIPS_26_S1, 133) |
RELOC_NUMBER (R_MICROMIPS_HI16, 134) |
RELOC_NUMBER (R_MICROMIPS_LO16, 135) |
RELOC_NUMBER (R_MICROMIPS_GPREL16, 136) /* In Elf 64: |
alias R_MICROMIPS_GPREL */ |
RELOC_NUMBER (R_MICROMIPS_LITERAL, 137) |
RELOC_NUMBER (R_MICROMIPS_GOT16, 138) /* In Elf 64: |
alias R_MICROMIPS_GOT */ |
RELOC_NUMBER (R_MICROMIPS_PC7_S1, 139) |
RELOC_NUMBER (R_MICROMIPS_PC10_S1, 140) |
RELOC_NUMBER (R_MICROMIPS_PC16_S1, 141) |
RELOC_NUMBER (R_MICROMIPS_CALL16, 142) /* In Elf 64: |
alias R_MICROMIPS_CALL */ |
RELOC_NUMBER (R_MICROMIPS_GOT_DISP, 145) |
RELOC_NUMBER (R_MICROMIPS_GOT_PAGE, 146) |
RELOC_NUMBER (R_MICROMIPS_GOT_OFST, 147) |
RELOC_NUMBER (R_MICROMIPS_GOT_HI16, 148) |
RELOC_NUMBER (R_MICROMIPS_GOT_LO16, 149) |
RELOC_NUMBER (R_MICROMIPS_SUB, 150) |
RELOC_NUMBER (R_MICROMIPS_HIGHER, 151) |
RELOC_NUMBER (R_MICROMIPS_HIGHEST, 152) |
RELOC_NUMBER (R_MICROMIPS_CALL_HI16, 153) |
RELOC_NUMBER (R_MICROMIPS_CALL_LO16, 154) |
RELOC_NUMBER (R_MICROMIPS_SCN_DISP, 155) |
RELOC_NUMBER (R_MICROMIPS_JALR, 156) |
RELOC_NUMBER (R_MICROMIPS_HI0_LO16, 157) |
/* TLS relocations. */ |
RELOC_NUMBER (R_MICROMIPS_TLS_GD, 162) |
RELOC_NUMBER (R_MICROMIPS_TLS_LDM, 163) |
RELOC_NUMBER (R_MICROMIPS_TLS_DTPREL_HI16, 164) |
RELOC_NUMBER (R_MICROMIPS_TLS_DTPREL_LO16, 165) |
RELOC_NUMBER (R_MICROMIPS_TLS_GOTTPREL, 166) |
RELOC_NUMBER (R_MICROMIPS_TLS_TPREL_HI16, 169) |
RELOC_NUMBER (R_MICROMIPS_TLS_TPREL_LO16, 170) |
/* microMIPS GP- and PC-relative relocations. */ |
RELOC_NUMBER (R_MICROMIPS_GPREL7_S2, 172) |
RELOC_NUMBER (R_MICROMIPS_PC23_S2, 173) |
FAKE_RELOC (R_MICROMIPS_max, 174) |
/* This was a GNU extension used by embedded-PIC. It was co-opted by |
mips-linux for exception-handling data. GCC stopped using it in |
May, 2004, then started using it again for compact unwind tables. */ |
RELOC_NUMBER (R_MIPS_PC32, 248) |
RELOC_NUMBER (R_MIPS_EH, 249) |
/* FIXME: this relocation is used internally by gas. */ |
RELOC_NUMBER (R_MIPS_GNU_REL16_S2, 250) |
/* These are GNU extensions to enable C++ vtable garbage collection. */ |
RELOC_NUMBER (R_MIPS_GNU_VTINHERIT, 253) |
RELOC_NUMBER (R_MIPS_GNU_VTENTRY, 254) |
END_RELOC_NUMBERS (R_MIPS_maxext) |
/* Processor specific flags for the ELF header e_flags field. */ |
/* At least one .noreorder directive appears in the source. */ |
#define EF_MIPS_NOREORDER 0x00000001 |
/* File contains position independent code. */ |
#define EF_MIPS_PIC 0x00000002 |
/* Code in file uses the standard calling sequence for calling |
position independent code. */ |
#define EF_MIPS_CPIC 0x00000004 |
/* ??? Unknown flag, set in IRIX 6's BSDdup2.o in libbsd.a. */ |
#define EF_MIPS_XGOT 0x00000008 |
/* Code in file uses UCODE (obsolete) */ |
#define EF_MIPS_UCODE 0x00000010 |
/* Code in file uses new ABI (-n32 on Irix 6). */ |
#define EF_MIPS_ABI2 0x00000020 |
/* Process the .MIPS.options section first by ld */ |
#define EF_MIPS_OPTIONS_FIRST 0x00000080 |
/* Indicates code compiled for a 64-bit machine in 32-bit mode |
(regs are 32-bits wide). */ |
#define EF_MIPS_32BITMODE 0x00000100 |
/* 32-bit machine but FP registers are 64 bit (-mfp64). */ |
#define EF_MIPS_FP64 0x00000200 |
/* Code in file uses the IEEE 754-2008 NaN encoding convention. */ |
#define EF_MIPS_NAN2008 0x00000400 |
/* Architectural Extensions used by this file */ |
#define EF_MIPS_ARCH_ASE 0x0f000000 |
/* Use MDMX multimedia extensions */ |
#define EF_MIPS_ARCH_ASE_MDMX 0x08000000 |
/* Use MIPS-16 ISA extensions */ |
#define EF_MIPS_ARCH_ASE_M16 0x04000000 |
/* Use MICROMIPS ISA extensions. */ |
#define EF_MIPS_ARCH_ASE_MICROMIPS 0x02000000 |
/* Four bit MIPS architecture field. */ |
#define EF_MIPS_ARCH 0xf0000000 |
/* -mips1 code. */ |
#define E_MIPS_ARCH_1 0x00000000 |
/* -mips2 code. */ |
#define E_MIPS_ARCH_2 0x10000000 |
/* -mips3 code. */ |
#define E_MIPS_ARCH_3 0x20000000 |
/* -mips4 code. */ |
#define E_MIPS_ARCH_4 0x30000000 |
/* -mips5 code. */ |
#define E_MIPS_ARCH_5 0x40000000 |
/* -mips32 code. */ |
#define E_MIPS_ARCH_32 0x50000000 |
/* -mips64 code. */ |
#define E_MIPS_ARCH_64 0x60000000 |
/* -mips32r2 code. */ |
#define E_MIPS_ARCH_32R2 0x70000000 |
/* -mips64r2 code. */ |
#define E_MIPS_ARCH_64R2 0x80000000 |
/* The ABI of the file. Also see EF_MIPS_ABI2 above. */ |
#define EF_MIPS_ABI 0x0000F000 |
/* The original o32 abi. */ |
#define E_MIPS_ABI_O32 0x00001000 |
/* O32 extended to work on 64 bit architectures */ |
#define E_MIPS_ABI_O64 0x00002000 |
/* EABI in 32 bit mode */ |
#define E_MIPS_ABI_EABI32 0x00003000 |
/* EABI in 64 bit mode */ |
#define E_MIPS_ABI_EABI64 0x00004000 |
/* Machine variant if we know it. This field was invented at Cygnus, |
but it is hoped that other vendors will adopt it. If some standard |
is developed, this code should be changed to follow it. */ |
#define EF_MIPS_MACH 0x00FF0000 |
/* Cygnus is choosing values between 80 and 9F; |
00 - 7F should be left for a future standard; |
the rest are open. */ |
#define E_MIPS_MACH_3900 0x00810000 |
#define E_MIPS_MACH_4010 0x00820000 |
#define E_MIPS_MACH_4100 0x00830000 |
#define E_MIPS_MACH_4650 0x00850000 |
#define E_MIPS_MACH_4120 0x00870000 |
#define E_MIPS_MACH_4111 0x00880000 |
#define E_MIPS_MACH_SB1 0x008a0000 |
#define E_MIPS_MACH_OCTEON 0x008b0000 |
#define E_MIPS_MACH_XLR 0x008c0000 |
#define E_MIPS_MACH_OCTEON2 0x008d0000 |
#define E_MIPS_MACH_5400 0x00910000 |
#define E_MIPS_MACH_5900 0x00920000 |
#define E_MIPS_MACH_5500 0x00980000 |
#define E_MIPS_MACH_9000 0x00990000 |
#define E_MIPS_MACH_LS2E 0x00A00000 |
#define E_MIPS_MACH_LS2F 0x00A10000 |
#define E_MIPS_MACH_LS3A 0x00A20000 |
/* Processor specific section indices. These sections do not actually |
exist. Symbols with a st_shndx field corresponding to one of these |
values have a special meaning. */ |
/* Defined and allocated common symbol. Value is virtual address. If |
relocated, alignment must be preserved. */ |
#define SHN_MIPS_ACOMMON SHN_LORESERVE |
/* Defined and allocated text symbol. Value is virtual address. |
Occur in the dynamic symbol table of Alpha OSF/1 and Irix 5 executables. */ |
#define SHN_MIPS_TEXT (SHN_LORESERVE + 1) |
/* Defined and allocated data symbol. Value is virtual address. |
Occur in the dynamic symbol table of Alpha OSF/1 and Irix 5 executables. */ |
#define SHN_MIPS_DATA (SHN_LORESERVE + 2) |
/* Small common symbol. */ |
#define SHN_MIPS_SCOMMON (SHN_LORESERVE + 3) |
/* Small undefined symbol. */ |
#define SHN_MIPS_SUNDEFINED (SHN_LORESERVE + 4) |
/* Processor specific section types. */ |
/* Section contains the set of dynamic shared objects used when |
statically linking. */ |
#define SHT_MIPS_LIBLIST 0x70000000 |
/* I'm not sure what this is, but it's used on Irix 5. */ |
#define SHT_MIPS_MSYM 0x70000001 |
/* Section contains list of symbols whose definitions conflict with |
symbols defined in shared objects. */ |
#define SHT_MIPS_CONFLICT 0x70000002 |
/* Section contains the global pointer table. */ |
#define SHT_MIPS_GPTAB 0x70000003 |
/* Section contains microcode information. The exact format is |
unspecified. */ |
#define SHT_MIPS_UCODE 0x70000004 |
/* Section contains some sort of debugging information. The exact |
format is unspecified. It's probably ECOFF symbols. */ |
#define SHT_MIPS_DEBUG 0x70000005 |
/* Section contains register usage information. */ |
#define SHT_MIPS_REGINFO 0x70000006 |
/* ??? */ |
#define SHT_MIPS_PACKAGE 0x70000007 |
/* ??? */ |
#define SHT_MIPS_PACKSYM 0x70000008 |
/* ??? */ |
#define SHT_MIPS_RELD 0x70000009 |
/* Section contains interface information. */ |
#define SHT_MIPS_IFACE 0x7000000b |
/* Section contains description of contents of another section. */ |
#define SHT_MIPS_CONTENT 0x7000000c |
/* Section contains miscellaneous options. */ |
#define SHT_MIPS_OPTIONS 0x7000000d |
/* ??? */ |
#define SHT_MIPS_SHDR 0x70000010 |
/* ??? */ |
#define SHT_MIPS_FDESC 0x70000011 |
/* ??? */ |
#define SHT_MIPS_EXTSYM 0x70000012 |
/* ??? */ |
#define SHT_MIPS_DENSE 0x70000013 |
/* ??? */ |
#define SHT_MIPS_PDESC 0x70000014 |
/* ??? */ |
#define SHT_MIPS_LOCSYM 0x70000015 |
/* ??? */ |
#define SHT_MIPS_AUXSYM 0x70000016 |
/* ??? */ |
#define SHT_MIPS_OPTSYM 0x70000017 |
/* ??? */ |
#define SHT_MIPS_LOCSTR 0x70000018 |
/* ??? */ |
#define SHT_MIPS_LINE 0x70000019 |
/* ??? */ |
#define SHT_MIPS_RFDESC 0x7000001a |
/* Delta C++: symbol table */ |
#define SHT_MIPS_DELTASYM 0x7000001b |
/* Delta C++: instance table */ |
#define SHT_MIPS_DELTAINST 0x7000001c |
/* Delta C++: class table */ |
#define SHT_MIPS_DELTACLASS 0x7000001d |
/* DWARF debugging section. */ |
#define SHT_MIPS_DWARF 0x7000001e |
/* Delta C++: declarations */ |
#define SHT_MIPS_DELTADECL 0x7000001f |
/* List of libraries the binary depends on. Includes a time stamp, version |
number. */ |
#define SHT_MIPS_SYMBOL_LIB 0x70000020 |
/* Events section. */ |
#define SHT_MIPS_EVENTS 0x70000021 |
/* ??? */ |
#define SHT_MIPS_TRANSLATE 0x70000022 |
/* Special pixie sections */ |
#define SHT_MIPS_PIXIE 0x70000023 |
/* Address translation table (for debug info) */ |
#define SHT_MIPS_XLATE 0x70000024 |
/* SGI internal address translation table (for debug info) */ |
#define SHT_MIPS_XLATE_DEBUG 0x70000025 |
/* Intermediate code */ |
#define SHT_MIPS_WHIRL 0x70000026 |
/* C++ exception handling region info */ |
#define SHT_MIPS_EH_REGION 0x70000027 |
/* Obsolete address translation table (for debug info) */ |
#define SHT_MIPS_XLATE_OLD 0x70000028 |
/* Runtime procedure descriptor table exception information (ucode) ??? */ |
#define SHT_MIPS_PDR_EXCEPTION 0x70000029 |
/* A section of type SHT_MIPS_LIBLIST contains an array of the |
following structure. The sh_link field is the section index of the |
string table. The sh_info field is the number of entries in the |
section. */ |
typedef struct |
{ |
/* String table index for name of shared object. */ |
unsigned long l_name; |
/* Time stamp. */ |
unsigned long l_time_stamp; |
/* Checksum of symbol names and common sizes. */ |
unsigned long l_checksum; |
/* String table index for version. */ |
unsigned long l_version; |
/* Flags. */ |
unsigned long l_flags; |
} Elf32_Lib; |
/* The external version of Elf32_Lib. */ |
typedef struct |
{ |
unsigned char l_name[4]; |
unsigned char l_time_stamp[4]; |
unsigned char l_checksum[4]; |
unsigned char l_version[4]; |
unsigned char l_flags[4]; |
} Elf32_External_Lib; |
/* The l_flags field of an Elf32_Lib structure may contain the |
following flags. */ |
/* Require an exact match at runtime. */ |
#define LL_EXACT_MATCH 0x00000001 |
/* Ignore version incompatibilities at runtime. */ |
#define LL_IGNORE_INT_VER 0x00000002 |
/* Require matching minor version number. */ |
#define LL_REQUIRE_MINOR 0x00000004 |
/* ??? */ |
#define LL_EXPORTS 0x00000008 |
/* Delay loading of this library until really needed. */ |
#define LL_DELAY_LOAD 0x00000010 |
/* ??? Delta C++ stuff ??? */ |
#define LL_DELTA 0x00000020 |
/* A section of type SHT_MIPS_CONFLICT is an array of indices into the |
.dynsym section. Each element has the following type. */ |
typedef unsigned long Elf32_Conflict; |
typedef unsigned char Elf32_External_Conflict[4]; |
typedef unsigned long Elf64_Conflict; |
typedef unsigned char Elf64_External_Conflict[8]; |
/* A section of type SHT_MIPS_GPTAB contains information about how |
much GP space would be required for different -G arguments. This |
information is only used so that the linker can provide informative |
suggestions as to the best -G value to use. The sh_info field is |
the index of the section for which this information applies. The |
contents of the section are an array of the following union. The |
first element uses the gt_header field. The remaining elements use |
the gt_entry field. */ |
typedef union |
{ |
struct |
{ |
/* -G value actually used for this object file. */ |
unsigned long gt_current_g_value; |
/* Unused. */ |
unsigned long gt_unused; |
} gt_header; |
struct |
{ |
/* If this -G argument has been used... */ |
unsigned long gt_g_value; |
/* ...this many GP section bytes would be required. */ |
unsigned long gt_bytes; |
} gt_entry; |
} Elf32_gptab; |
/* The external version of Elf32_gptab. */ |
typedef union |
{ |
struct |
{ |
unsigned char gt_current_g_value[4]; |
unsigned char gt_unused[4]; |
} gt_header; |
struct |
{ |
unsigned char gt_g_value[4]; |
unsigned char gt_bytes[4]; |
} gt_entry; |
} Elf32_External_gptab; |
/* A section of type SHT_MIPS_REGINFO contains the following |
structure. */ |
typedef struct |
{ |
/* Mask of general purpose registers used. */ |
unsigned long ri_gprmask; |
/* Mask of co-processor registers used. */ |
unsigned long ri_cprmask[4]; |
/* GP register value for this object file. */ |
long ri_gp_value; |
} Elf32_RegInfo; |
/* The external version of the Elf_RegInfo structure. */ |
typedef struct |
{ |
unsigned char ri_gprmask[4]; |
unsigned char ri_cprmask[4][4]; |
unsigned char ri_gp_value[4]; |
} Elf32_External_RegInfo; |
/* MIPS ELF .reginfo swapping routines. */ |
extern void bfd_mips_elf32_swap_reginfo_in |
(bfd *, const Elf32_External_RegInfo *, Elf32_RegInfo *); |
extern void bfd_mips_elf32_swap_reginfo_out |
(bfd *, const Elf32_RegInfo *, Elf32_External_RegInfo *); |
/* Processor specific section flags. */ |
/* This section must be in the global data area. */ |
#define SHF_MIPS_GPREL 0x10000000 |
/* This section should be merged. */ |
#define SHF_MIPS_MERGE 0x20000000 |
/* This section contains address data of size implied by section |
element size. */ |
#define SHF_MIPS_ADDR 0x40000000 |
/* This section contains string data. */ |
#define SHF_MIPS_STRING 0x80000000 |
/* This section may not be stripped. */ |
#define SHF_MIPS_NOSTRIP 0x08000000 |
/* This section is local to threads. */ |
#define SHF_MIPS_LOCAL 0x04000000 |
/* Linker should generate implicit weak names for this section. */ |
#define SHF_MIPS_NAMES 0x02000000 |
/* Section contais text/data which may be replicated in other sections. |
Linker should retain only one copy. */ |
#define SHF_MIPS_NODUPES 0x01000000 |
/* Processor specific program header types. */ |
/* Register usage information. Identifies one .reginfo section. */ |
#define PT_MIPS_REGINFO 0x70000000 |
/* Runtime procedure table. */ |
#define PT_MIPS_RTPROC 0x70000001 |
/* .MIPS.options section. */ |
#define PT_MIPS_OPTIONS 0x70000002 |
/* Processor specific dynamic array tags. */ |
/* 32 bit version number for runtime linker interface. */ |
#define DT_MIPS_RLD_VERSION 0x70000001 |
/* Time stamp. */ |
#define DT_MIPS_TIME_STAMP 0x70000002 |
/* Checksum of external strings and common sizes. */ |
#define DT_MIPS_ICHECKSUM 0x70000003 |
/* Index of version string in string table. */ |
#define DT_MIPS_IVERSION 0x70000004 |
/* 32 bits of flags. */ |
#define DT_MIPS_FLAGS 0x70000005 |
/* Base address of the segment. */ |
#define DT_MIPS_BASE_ADDRESS 0x70000006 |
/* ??? */ |
#define DT_MIPS_MSYM 0x70000007 |
/* Address of .conflict section. */ |
#define DT_MIPS_CONFLICT 0x70000008 |
/* Address of .liblist section. */ |
#define DT_MIPS_LIBLIST 0x70000009 |
/* Number of local global offset table entries. */ |
#define DT_MIPS_LOCAL_GOTNO 0x7000000a |
/* Number of entries in the .conflict section. */ |
#define DT_MIPS_CONFLICTNO 0x7000000b |
/* Number of entries in the .liblist section. */ |
#define DT_MIPS_LIBLISTNO 0x70000010 |
/* Number of entries in the .dynsym section. */ |
#define DT_MIPS_SYMTABNO 0x70000011 |
/* Index of first external dynamic symbol not referenced locally. */ |
#define DT_MIPS_UNREFEXTNO 0x70000012 |
/* Index of first dynamic symbol in global offset table. */ |
#define DT_MIPS_GOTSYM 0x70000013 |
/* Number of page table entries in global offset table. */ |
#define DT_MIPS_HIPAGENO 0x70000014 |
/* Address of run time loader map, used for debugging. */ |
#define DT_MIPS_RLD_MAP 0x70000016 |
/* Delta C++ class definition. */ |
#define DT_MIPS_DELTA_CLASS 0x70000017 |
/* Number of entries in DT_MIPS_DELTA_CLASS. */ |
#define DT_MIPS_DELTA_CLASS_NO 0x70000018 |
/* Delta C++ class instances. */ |
#define DT_MIPS_DELTA_INSTANCE 0x70000019 |
/* Number of entries in DT_MIPS_DELTA_INSTANCE. */ |
#define DT_MIPS_DELTA_INSTANCE_NO 0x7000001a |
/* Delta relocations. */ |
#define DT_MIPS_DELTA_RELOC 0x7000001b |
/* Number of entries in DT_MIPS_DELTA_RELOC. */ |
#define DT_MIPS_DELTA_RELOC_NO 0x7000001c |
/* Delta symbols that Delta relocations refer to. */ |
#define DT_MIPS_DELTA_SYM 0x7000001d |
/* Number of entries in DT_MIPS_DELTA_SYM. */ |
#define DT_MIPS_DELTA_SYM_NO 0x7000001e |
/* Delta symbols that hold class declarations. */ |
#define DT_MIPS_DELTA_CLASSSYM 0x70000020 |
/* Number of entries in DT_MIPS_DELTA_CLASSSYM. */ |
#define DT_MIPS_DELTA_CLASSSYM_NO 0x70000021 |
/* Flags indicating information about C++ flavor. */ |
#define DT_MIPS_CXX_FLAGS 0x70000022 |
/* Pixie information (???). */ |
#define DT_MIPS_PIXIE_INIT 0x70000023 |
/* Address of .MIPS.symlib */ |
#define DT_MIPS_SYMBOL_LIB 0x70000024 |
/* The GOT index of the first PTE for a segment */ |
#define DT_MIPS_LOCALPAGE_GOTIDX 0x70000025 |
/* The GOT index of the first PTE for a local symbol */ |
#define DT_MIPS_LOCAL_GOTIDX 0x70000026 |
/* The GOT index of the first PTE for a hidden symbol */ |
#define DT_MIPS_HIDDEN_GOTIDX 0x70000027 |
/* The GOT index of the first PTE for a protected symbol */ |
#define DT_MIPS_PROTECTED_GOTIDX 0x70000028 |
/* Address of `.MIPS.options'. */ |
#define DT_MIPS_OPTIONS 0x70000029 |
/* Address of `.interface'. */ |
#define DT_MIPS_INTERFACE 0x7000002a |
/* ??? */ |
#define DT_MIPS_DYNSTR_ALIGN 0x7000002b |
/* Size of the .interface section. */ |
#define DT_MIPS_INTERFACE_SIZE 0x7000002c |
/* Size of rld_text_resolve function stored in the GOT. */ |
#define DT_MIPS_RLD_TEXT_RESOLVE_ADDR 0x7000002d |
/* Default suffix of DSO to be added by rld on dlopen() calls. */ |
#define DT_MIPS_PERF_SUFFIX 0x7000002e |
/* Size of compact relocation section (O32). */ |
#define DT_MIPS_COMPACT_SIZE 0x7000002f |
/* GP value for auxiliary GOTs. */ |
#define DT_MIPS_GP_VALUE 0x70000030 |
/* Address of auxiliary .dynamic. */ |
#define DT_MIPS_AUX_DYNAMIC 0x70000031 |
/* Address of the base of the PLTGOT. */ |
#define DT_MIPS_PLTGOT 0x70000032 |
/* Points to the base of a writable PLT. */ |
#define DT_MIPS_RWPLT 0x70000034 |
/* Flags which may appear in a DT_MIPS_FLAGS entry. */ |
/* No flags. */ |
#define RHF_NONE 0x00000000 |
/* Uses shortcut pointers. */ |
#define RHF_QUICKSTART 0x00000001 |
/* Hash size is not a power of two. */ |
#define RHF_NOTPOT 0x00000002 |
/* Ignore LD_LIBRARY_PATH. */ |
#define RHS_NO_LIBRARY_REPLACEMENT 0x00000004 |
/* DSO address may not be relocated. */ |
#define RHF_NO_MOVE 0x00000008 |
/* SGI specific features. */ |
#define RHF_SGI_ONLY 0x00000010 |
/* Guarantee that .init will finish executing before any non-init |
code in DSO is called. */ |
#define RHF_GUARANTEE_INIT 0x00000020 |
/* Contains Delta C++ code. */ |
#define RHF_DELTA_C_PLUS_PLUS 0x00000040 |
/* Guarantee that .init will start executing before any non-init |
code in DSO is called. */ |
#define RHF_GUARANTEE_START_INIT 0x00000080 |
/* Generated by pixie. */ |
#define RHF_PIXIE 0x00000100 |
/* Delay-load DSO by default. */ |
#define RHF_DEFAULT_DELAY_LOAD 0x00000200 |
/* Object may be requickstarted */ |
#define RHF_REQUICKSTART 0x00000400 |
/* Object has been requickstarted */ |
#define RHF_REQUICKSTARTED 0x00000800 |
/* Generated by cord. */ |
#define RHF_CORD 0x00001000 |
/* Object contains no unresolved undef symbols. */ |
#define RHF_NO_UNRES_UNDEF 0x00002000 |
/* Symbol table is in a safe order. */ |
#define RHF_RLD_ORDER_SAFE 0x00004000 |
/* Special values for the st_other field in the symbol table. These |
are used in an Irix 5 dynamic symbol table. */ |
#define STO_DEFAULT STV_DEFAULT |
#define STO_INTERNAL STV_INTERNAL |
#define STO_HIDDEN STV_HIDDEN |
#define STO_PROTECTED STV_PROTECTED |
/* Two topmost bits denote the MIPS ISA for .text symbols: |
+ 00 -- standard MIPS code, |
+ 10 -- microMIPS code, |
+ 11 -- MIPS16 code; requires the following two bits to be set too. |
Note that one of the MIPS16 bits overlaps with STO_MIPS_PIC. See below |
for details. */ |
#define STO_MIPS_ISA (3 << 6) |
/* The mask spanning the rest of MIPS psABI flags. At most one is expected |
to be set except for STO_MIPS16. */ |
#define STO_MIPS_FLAGS (~(STO_MIPS_ISA | ELF_ST_VISIBILITY (-1))) |
/* The MIPS psABI was updated in 2008 with support for PLTs and copy |
relocs. There are therefore two types of nonzero SHN_UNDEF functions: |
PLT entries and traditional MIPS lazy binding stubs. We mark the former |
with STO_MIPS_PLT to distinguish them from the latter. */ |
#define STO_MIPS_PLT 0x8 |
#define ELF_ST_IS_MIPS_PLT(other) \ |
((ELF_ST_IS_MIPS16 (other) \ |
? ((other) & (~STO_MIPS16 & STO_MIPS_FLAGS)) \ |
: ((other) & STO_MIPS_FLAGS)) == STO_MIPS_PLT) |
#define ELF_ST_SET_MIPS_PLT(other) \ |
((ELF_ST_IS_MIPS16 (other) \ |
? ((other) & (STO_MIPS16 | ~STO_MIPS_FLAGS)) \ |
: ((other) & ~STO_MIPS_FLAGS)) | STO_MIPS_PLT) |
/* This value is used to mark PIC functions in an object that mixes |
PIC and non-PIC. Note that this bit overlaps with STO_MIPS16, |
although MIPS16 symbols are never considered to be MIPS_PIC. */ |
#define STO_MIPS_PIC 0x20 |
#define ELF_ST_IS_MIPS_PIC(other) (((other) & STO_MIPS_FLAGS) == STO_MIPS_PIC) |
#define ELF_ST_SET_MIPS_PIC(other) \ |
((ELF_ST_IS_MIPS16 (other) \ |
? ((other) & ~(STO_MIPS16 | STO_MIPS_FLAGS)) \ |
: ((other) & ~STO_MIPS_FLAGS)) | STO_MIPS_PIC) |
/* This value is used for a mips16 .text symbol. */ |
#define STO_MIPS16 0xf0 |
#define ELF_ST_IS_MIPS16(other) (((other) & STO_MIPS16) == STO_MIPS16) |
#define ELF_ST_SET_MIPS16(other) ((other) | STO_MIPS16) |
/* This value is used for a microMIPS .text symbol. To distinguish from |
STO_MIPS16, we set top two bits to be 10 to denote STO_MICROMIPS. The |
mask is STO_MIPS_ISA. */ |
#define STO_MICROMIPS (2 << 6) |
#define ELF_ST_IS_MICROMIPS(other) (((other) & STO_MIPS_ISA) == STO_MICROMIPS) |
#define ELF_ST_SET_MICROMIPS(other) (((other) & ~STO_MIPS_ISA) | STO_MICROMIPS) |
/* Whether code compression (either of the MIPS16 or the microMIPS ASEs) |
has been indicated for a .text symbol. */ |
#define ELF_ST_IS_COMPRESSED(other) \ |
(ELF_ST_IS_MIPS16 (other) || ELF_ST_IS_MICROMIPS (other)) |
/* This bit is used on Irix to indicate a symbol whose definition |
is optional - if, at final link time, it cannot be found, no |
error message should be produced. */ |
#define STO_OPTIONAL (1 << 2) |
/* A macro to examine the STO_OPTIONAL bit. */ |
#define ELF_MIPS_IS_OPTIONAL(other) ((other) & STO_OPTIONAL) |
/* The 64-bit MIPS ELF ABI uses an unusual reloc format. Each |
relocation entry specifies up to three actual relocations, all at |
the same address. The first relocation which required a symbol |
uses the symbol in the r_sym field. The second relocation which |
requires a symbol uses the symbol in the r_ssym field. If all |
three relocations require a symbol, the third one uses a zero |
value. */ |
/* An entry in a 64 bit SHT_REL section. */ |
typedef struct |
{ |
/* Address of relocation. */ |
unsigned char r_offset[8]; |
/* Symbol index. */ |
unsigned char r_sym[4]; |
/* Special symbol. */ |
unsigned char r_ssym[1]; |
/* Third relocation. */ |
unsigned char r_type3[1]; |
/* Second relocation. */ |
unsigned char r_type2[1]; |
/* First relocation. */ |
unsigned char r_type[1]; |
} Elf64_Mips_External_Rel; |
typedef struct |
{ |
/* Address of relocation. */ |
bfd_vma r_offset; |
/* Symbol index. */ |
unsigned long r_sym; |
/* Special symbol. */ |
unsigned char r_ssym; |
/* Third relocation. */ |
unsigned char r_type3; |
/* Second relocation. */ |
unsigned char r_type2; |
/* First relocation. */ |
unsigned char r_type; |
} Elf64_Mips_Internal_Rel; |
/* An entry in a 64 bit SHT_RELA section. */ |
typedef struct |
{ |
/* Address of relocation. */ |
unsigned char r_offset[8]; |
/* Symbol index. */ |
unsigned char r_sym[4]; |
/* Special symbol. */ |
unsigned char r_ssym[1]; |
/* Third relocation. */ |
unsigned char r_type3[1]; |
/* Second relocation. */ |
unsigned char r_type2[1]; |
/* First relocation. */ |
unsigned char r_type[1]; |
/* Addend. */ |
unsigned char r_addend[8]; |
} Elf64_Mips_External_Rela; |
typedef struct |
{ |
/* Address of relocation. */ |
bfd_vma r_offset; |
/* Symbol index. */ |
unsigned long r_sym; |
/* Special symbol. */ |
unsigned char r_ssym; |
/* Third relocation. */ |
unsigned char r_type3; |
/* Second relocation. */ |
unsigned char r_type2; |
/* First relocation. */ |
unsigned char r_type; |
/* Addend. */ |
bfd_signed_vma r_addend; |
} Elf64_Mips_Internal_Rela; |
/* MIPS ELF 64 relocation info access macros. */ |
#define ELF64_MIPS_R_SSYM(i) (((i) >> 24) & 0xff) |
#define ELF64_MIPS_R_TYPE3(i) (((i) >> 16) & 0xff) |
#define ELF64_MIPS_R_TYPE2(i) (((i) >> 8) & 0xff) |
#define ELF64_MIPS_R_TYPE(i) ((i) & 0xff) |
/* Values found in the r_ssym field of a relocation entry. */ |
/* No relocation. */ |
#define RSS_UNDEF 0 |
/* Value of GP. */ |
#define RSS_GP 1 |
/* Value of GP in object being relocated. */ |
#define RSS_GP0 2 |
/* Address of location being relocated. */ |
#define RSS_LOC 3 |
/* A SHT_MIPS_OPTIONS section contains a series of options, each of |
which starts with this header. */ |
typedef struct |
{ |
/* Type of option. */ |
unsigned char kind[1]; |
/* Size of option descriptor, including header. */ |
unsigned char size[1]; |
/* Section index of affected section, or 0 for global option. */ |
unsigned char section[2]; |
/* Information specific to this kind of option. */ |
unsigned char info[4]; |
} Elf_External_Options; |
typedef struct |
{ |
/* Type of option. */ |
unsigned char kind; |
/* Size of option descriptor, including header. */ |
unsigned char size; |
/* Section index of affected section, or 0 for global option. */ |
unsigned short section; |
/* Information specific to this kind of option. */ |
unsigned long info; |
} Elf_Internal_Options; |
/* MIPS ELF option header swapping routines. */ |
extern void bfd_mips_elf_swap_options_in |
(bfd *, const Elf_External_Options *, Elf_Internal_Options *); |
extern void bfd_mips_elf_swap_options_out |
(bfd *, const Elf_Internal_Options *, Elf_External_Options *); |
/* Values which may appear in the kind field of an Elf_Options |
structure. */ |
/* Undefined. */ |
#define ODK_NULL 0 |
/* Register usage and GP value. */ |
#define ODK_REGINFO 1 |
/* Exception processing information. */ |
#define ODK_EXCEPTIONS 2 |
/* Section padding information. */ |
#define ODK_PAD 3 |
/* Hardware workarounds performed. */ |
#define ODK_HWPATCH 4 |
/* Fill value used by the linker. */ |
#define ODK_FILL 5 |
/* Reserved space for desktop tools. */ |
#define ODK_TAGS 6 |
/* Hardware workarounds, AND bits when merging. */ |
#define ODK_HWAND 7 |
/* Hardware workarounds, OR bits when merging. */ |
#define ODK_HWOR 8 |
/* GP group to use for text/data sections. */ |
#define ODK_GP_GROUP 9 |
/* ID information. */ |
#define ODK_IDENT 10 |
/* In the 32 bit ABI, an ODK_REGINFO option is just a Elf32_RegInfo |
structure. In the 64 bit ABI, it is the following structure. The |
info field of the options header is not used. */ |
typedef struct |
{ |
/* Mask of general purpose registers used. */ |
unsigned char ri_gprmask[4]; |
/* Padding. */ |
unsigned char ri_pad[4]; |
/* Mask of co-processor registers used. */ |
unsigned char ri_cprmask[4][4]; |
/* GP register value for this object file. */ |
unsigned char ri_gp_value[8]; |
} Elf64_External_RegInfo; |
typedef struct |
{ |
/* Mask of general purpose registers used. */ |
unsigned long ri_gprmask; |
/* Padding. */ |
unsigned long ri_pad; |
/* Mask of co-processor registers used. */ |
unsigned long ri_cprmask[4]; |
/* GP register value for this object file. */ |
bfd_vma ri_gp_value; |
} Elf64_Internal_RegInfo; |
typedef struct |
{ |
/* The hash value computed from the name of the corresponding |
dynamic symbol. */ |
unsigned char ms_hash_value[4]; |
/* Contains both the dynamic relocation index and the symbol flags |
field. The macros ELF32_MS_REL_INDEX and ELF32_MS_FLAGS are used |
to access the individual values. The dynamic relocation index |
identifies the first entry in the .rel.dyn section that |
references the dynamic symbol corresponding to this msym entry. |
If the index is 0, no dynamic relocations are associated with the |
symbol. The symbol flags field is reserved for future use. */ |
unsigned char ms_info[4]; |
} Elf32_External_Msym; |
typedef struct |
{ |
/* The hash value computed from the name of the corresponding |
dynamic symbol. */ |
unsigned long ms_hash_value; |
/* Contains both the dynamic relocation index and the symbol flags |
field. The macros ELF32_MS_REL_INDEX and ELF32_MS_FLAGS are used |
to access the individual values. The dynamic relocation index |
identifies the first entry in the .rel.dyn section that |
references the dynamic symbol corresponding to this msym entry. |
If the index is 0, no dynamic relocations are associated with the |
symbol. The symbol flags field is reserved for future use. */ |
unsigned long ms_info; |
} Elf32_Internal_Msym; |
#define ELF32_MS_REL_INDEX(i) ((i) >> 8) |
#define ELF32_MS_FLAGS(i) (i) & 0xff) |
#define ELF32_MS_INFO(r, f) (((r) << 8) + ((f) & 0xff)) |
/* MIPS ELF reginfo swapping routines. */ |
extern void bfd_mips_elf64_swap_reginfo_in |
(bfd *, const Elf64_External_RegInfo *, Elf64_Internal_RegInfo *); |
extern void bfd_mips_elf64_swap_reginfo_out |
(bfd *, const Elf64_Internal_RegInfo *, Elf64_External_RegInfo *); |
/* Masks for the info work of an ODK_EXCEPTIONS descriptor. */ |
#define OEX_FPU_MIN 0x1f /* FPEs which must be enabled. */ |
#define OEX_FPU_MAX 0x1f00 /* FPEs which may be enabled. */ |
#define OEX_PAGE0 0x10000 /* Page zero must be mapped. */ |
#define OEX_SMM 0x20000 /* Force sequential memory mode. */ |
#define OEX_FPDBUG 0x40000 /* Force precise floating-point |
exceptions (debug mode). */ |
#define OEX_DISMISS 0x80000 /* Dismiss invalid address faults. */ |
/* Masks of the FP exceptions for OEX_FPU_MIN and OEX_FPU_MAX. */ |
#define OEX_FPU_INVAL 0x10 /* Invalid operation exception. */ |
#define OEX_FPU_DIV0 0x08 /* Division by zero exception. */ |
#define OEX_FPU_OFLO 0x04 /* Overflow exception. */ |
#define OEX_FPU_UFLO 0x02 /* Underflow exception. */ |
#define OEX_FPU_INEX 0x01 /* Inexact exception. */ |
/* Masks for the info word of an ODK_PAD descriptor. */ |
#define OPAD_PREFIX 0x01 |
#define OPAD_POSTFIX 0x02 |
#define OPAD_SYMBOL 0x04 |
/* Masks for the info word of an ODK_HWPATCH descriptor. */ |
#define OHW_R4KEOP 0x00000001 /* R4000 end-of-page patch. */ |
#define OHW_R8KPFETCH 0x00000002 /* May need R8000 prefetch patch. */ |
#define OHW_R5KEOP 0x00000004 /* R5000 end-of-page patch. */ |
#define OHW_R5KCVTL 0x00000008 /* R5000 cvt.[ds].l bug |
(clean == 1). */ |
#define OHW_R10KLDL 0x00000010 /* Needs R10K misaligned |
load patch. */ |
/* Masks for the info word of an ODK_IDENT/ODK_GP_GROUP descriptor. */ |
#define OGP_GROUP 0x0000ffff /* GP group number. */ |
#define OGP_SELF 0xffff0000 /* Self-contained GP groups. */ |
/* Masks for the info word of an ODK_HWAND/ODK_HWOR descriptor. */ |
#define OHWA0_R4KEOP_CHECKED 0x00000001 |
#define OHWA0_R4KEOP_CLEAN 0x00000002 |
/* Object attribute tags. */ |
enum |
{ |
/* 0-3 are generic. */ |
/* Floating-point ABI used by this object file. */ |
Tag_GNU_MIPS_ABI_FP = 4, |
}; |
/* Object attribute values. */ |
enum |
{ |
/* Values defined for Tag_GNU_MIPS_ABI_FP. */ |
/* Not tagged or not using any ABIs affected by the differences. */ |
Val_GNU_MIPS_ABI_FP_ANY = 0, |
/* Using hard-float -mdouble-float. */ |
Val_GNU_MIPS_ABI_FP_DOUBLE = 1, |
/* Using hard-float -msingle-float. */ |
Val_GNU_MIPS_ABI_FP_SINGLE = 2, |
/* Using soft-float. */ |
Val_GNU_MIPS_ABI_FP_SOFT = 3, |
/* Using -mips32r2 -mfp64. */ |
Val_GNU_MIPS_ABI_FP_64 = 4, |
}; |
#endif /* _ELF_MIPS_H */ |
/contrib/toolchain/binutils/include/elf/mmix.h |
---|
0,0 → 1,173 |
/* MMIX support for BFD. |
Copyright 2001, 2002, 2003, 2010 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* This file holds definitions specific to the MMIX ELF ABI. */ |
#ifndef ELF_MMIX_H |
#define ELF_MMIX_H |
#include "elf/reloc-macros.h" |
/* Relocations. See the reloc table in bfd/elf64-mmix.c for details. */ |
START_RELOC_NUMBERS (elf_mmix_reloc_type) |
RELOC_NUMBER (R_MMIX_NONE, 0) |
/* Standard absolute relocations. */ |
RELOC_NUMBER (R_MMIX_8, 1) |
RELOC_NUMBER (R_MMIX_16, 2) |
RELOC_NUMBER (R_MMIX_24, 3) |
RELOC_NUMBER (R_MMIX_32, 4) |
RELOC_NUMBER (R_MMIX_64, 5) |
/* Standard relative relocations. */ |
RELOC_NUMBER (R_MMIX_PC_8, 6) |
RELOC_NUMBER (R_MMIX_PC_16, 7) |
RELOC_NUMBER (R_MMIX_PC_24, 8) |
RELOC_NUMBER (R_MMIX_PC_32, 9) |
RELOC_NUMBER (R_MMIX_PC_64, 10) |
/* GNU extensions for C++ vtables. */ |
RELOC_NUMBER (R_MMIX_GNU_VTINHERIT, 11) |
RELOC_NUMBER (R_MMIX_GNU_VTENTRY, 12) |
/* A GETA instruction. */ |
RELOC_NUMBER (R_MMIX_GETA, 13) |
RELOC_NUMBER (R_MMIX_GETA_1, 14) |
RELOC_NUMBER (R_MMIX_GETA_2, 15) |
RELOC_NUMBER (R_MMIX_GETA_3, 16) |
/* A conditional branch instruction. */ |
RELOC_NUMBER (R_MMIX_CBRANCH, 17) |
RELOC_NUMBER (R_MMIX_CBRANCH_J, 18) |
RELOC_NUMBER (R_MMIX_CBRANCH_1, 19) |
RELOC_NUMBER (R_MMIX_CBRANCH_2, 20) |
RELOC_NUMBER (R_MMIX_CBRANCH_3, 21) |
/* A PUSHJ instruction. */ |
RELOC_NUMBER (R_MMIX_PUSHJ, 22) |
RELOC_NUMBER (R_MMIX_PUSHJ_1, 23) |
RELOC_NUMBER (R_MMIX_PUSHJ_2, 24) |
RELOC_NUMBER (R_MMIX_PUSHJ_3, 25) |
/* A JMP instruction. */ |
RELOC_NUMBER (R_MMIX_JMP, 26) |
RELOC_NUMBER (R_MMIX_JMP_1, 27) |
RELOC_NUMBER (R_MMIX_JMP_2, 28) |
RELOC_NUMBER (R_MMIX_JMP_3, 29) |
/* A relative address such as in a GETA or a branch. */ |
RELOC_NUMBER (R_MMIX_ADDR19, 30) |
/* A relative address such as in a JMP (only). */ |
RELOC_NUMBER (R_MMIX_ADDR27, 31) |
/* A general register or a number 0..255. */ |
RELOC_NUMBER (R_MMIX_REG_OR_BYTE, 32) |
/* A general register. */ |
RELOC_NUMBER (R_MMIX_REG, 33) |
/* A global register and an offset, the global register (allocated at |
link time) contents plus the offset made equivalent to the relocation |
expression at link time. The relocation must point at the Y field of |
an instruction. */ |
RELOC_NUMBER (R_MMIX_BASE_PLUS_OFFSET, 34) |
/* A LOCAL assertion. */ |
RELOC_NUMBER (R_MMIX_LOCAL, 35) |
/* A PUSHJ instruction, generating a stub if it does not reach. */ |
RELOC_NUMBER (R_MMIX_PUSHJ_STUBBABLE, 36) |
END_RELOC_NUMBERS (R_MMIX_max) |
/* Section Attributes. */ |
/* A section containing necessary information for relaxation. */ |
#define SHF_MMIX_CANRELAX 0x80000000 |
/* Symbol attributes. */ |
/* A symbol with this section-index is a register. */ |
#define SHN_REGISTER SHN_LOPROC |
/* This section holds contents for each initialized register, at VMA |
regno*8. A symbol relative to this section will be transformed to an |
absolute symbol with the value corresponding to the register number at |
final link time. A symbol with a value outside the inclusive range |
32*8 .. 254*8 is an error. It is highly recommended to only use an |
upper bound of 253*8 or lower as specified in the (currently |
unspecified) ABI. */ |
#define MMIX_REG_CONTENTS_SECTION_NAME ".MMIX.reg_contents" |
/* At link time, a section by this name is created, expected to be |
included in MMIX_REG_CONTENTS_SECTION_NAME in the output. */ |
#define MMIX_LD_ALLOCATED_REG_CONTENTS_SECTION_NAME \ |
".MMIX.reg_contents.linker_allocated" |
/* This is a faked section holding symbols with SHN_REGISTER. Don't |
confuse it with MMIX_REG_CONTENTS_SECTION_NAME; this one has no |
contents, just values. It is an error for a value in this section to |
be outside the range 32..255 and it must never become an actual section |
in an object file. */ |
#define MMIX_REG_SECTION_NAME "*REG*" |
/* Appended with a number N=0..65535, this is a representation of the |
mmixal "BSPEC N" ... "ESPEC" directive pair; the contents go into an |
ELF section by name ".MMIX.spec_data.N". */ |
#define MMIX_OTHER_SPEC_SECTION_PREFIX ".MMIX.spec_data." |
/* A section SECNAME is noted to start at "__.MMIX.start.SECNAME" by the |
presence of this symbol. Currently only implemented for ".text" |
through the symbol "__.MMIX.start..text". */ |
#define MMIX_LOC_SECTION_START_SYMBOL_PREFIX "__.MMIX.start." |
/* This symbol is always a function. */ |
#define MMIX_START_SYMBOL_NAME "Main" |
/* We smuggle in a few MMO specifics here. We don't make a specific MMO |
file, since we can't reasonably support MMO without ELF; we have to |
include this file anyway. */ |
#define MMO_TEXT_SECTION_NAME ".text" |
#define MMO_DATA_SECTION_NAME ".data" |
/* A definition for the flags we put in spec data in files. A copy of our |
own of some flags to keep immune to BFD flag changes. See section.c of |
2001-07-18 for flag documentation. */ |
#define MMO_SEC_ALLOC 0x001 |
#define MMO_SEC_LOAD 0x002 |
#define MMO_SEC_RELOC 0x004 |
#define MMO_SEC_READONLY 0x010 |
#define MMO_SEC_CODE 0x020 |
#define MMO_SEC_DATA 0x040 |
#define MMO_SEC_NEVER_LOAD 0x400 |
#define MMO_SEC_IS_COMMON 0x8000 |
#define MMO_SEC_DEBUGGING 0x10000 |
#ifdef BFD_ARCH_SIZE |
extern bfd_boolean _bfd_mmix_before_linker_allocation |
(bfd *, struct bfd_link_info *); |
extern bfd_boolean _bfd_mmix_after_linker_allocation |
(bfd *, struct bfd_link_info *); |
extern bfd_boolean _bfd_mmix_check_all_relocs |
(bfd *, struct bfd_link_info *); |
#endif |
#endif /* ELF_MMIX_H */ |
/contrib/toolchain/binutils/include/elf/mn10200.h |
---|
0,0 → 1,40 |
/* MN10200 ELF support for BFD. |
Copyright 1998, 2000, 2010 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* This file holds definitions specific to the MN10200 ELF ABI. */ |
#ifndef _ELF_MN10200_H |
#define _ELF_MN10200_H |
#include "elf/reloc-macros.h" |
/* Relocations. */ |
START_RELOC_NUMBERS (elf_mn10200_reloc_type) |
RELOC_NUMBER (R_MN10200_NONE, 0) |
RELOC_NUMBER (R_MN10200_32, 1) |
RELOC_NUMBER (R_MN10200_16, 2) |
RELOC_NUMBER (R_MN10200_8, 3) |
RELOC_NUMBER (R_MN10200_24, 4) |
RELOC_NUMBER (R_MN10200_PCREL8, 5) |
RELOC_NUMBER (R_MN10200_PCREL16, 6) |
RELOC_NUMBER (R_MN10200_PCREL24, 7) |
END_RELOC_NUMBERS (R_MN10200_max) |
#endif /* _ELF_MN10200_H */ |
/contrib/toolchain/binutils/include/elf/mn10300.h |
---|
0,0 → 1,80 |
/* MN10300 ELF support for BFD. |
Copyright 1998, 1999, 2000, 2003, 2007 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* This file holds definitions specific to the MN10300 ELF ABI. */ |
#ifndef _ELF_MN10300_H |
#define _ELF_MN10300_H |
#include "elf/reloc-macros.h" |
/* Relocations. */ |
START_RELOC_NUMBERS (elf_mn10300_reloc_type) |
RELOC_NUMBER (R_MN10300_NONE, 0) |
RELOC_NUMBER (R_MN10300_32, 1) |
RELOC_NUMBER (R_MN10300_16, 2) |
RELOC_NUMBER (R_MN10300_8, 3) |
RELOC_NUMBER (R_MN10300_PCREL32, 4) |
RELOC_NUMBER (R_MN10300_PCREL16, 5) |
RELOC_NUMBER (R_MN10300_PCREL8, 6) |
RELOC_NUMBER (R_MN10300_GNU_VTINHERIT, 7) |
RELOC_NUMBER (R_MN10300_GNU_VTENTRY, 8) |
RELOC_NUMBER (R_MN10300_24, 9) |
RELOC_NUMBER (R_MN10300_GOTPC32, 10) |
RELOC_NUMBER (R_MN10300_GOTPC16, 11) |
RELOC_NUMBER (R_MN10300_GOTOFF32, 12) |
RELOC_NUMBER (R_MN10300_GOTOFF24, 13) |
RELOC_NUMBER (R_MN10300_GOTOFF16, 14) |
RELOC_NUMBER (R_MN10300_PLT32, 15) |
RELOC_NUMBER (R_MN10300_PLT16, 16) |
RELOC_NUMBER (R_MN10300_GOT32, 17) |
RELOC_NUMBER (R_MN10300_GOT24, 18) |
RELOC_NUMBER (R_MN10300_GOT16, 19) |
RELOC_NUMBER (R_MN10300_COPY, 20) |
RELOC_NUMBER (R_MN10300_GLOB_DAT, 21) |
RELOC_NUMBER (R_MN10300_JMP_SLOT, 22) |
RELOC_NUMBER (R_MN10300_RELATIVE, 23) |
RELOC_NUMBER (R_MN10300_TLS_GD, 24) |
RELOC_NUMBER (R_MN10300_TLS_LD, 25) |
RELOC_NUMBER (R_MN10300_TLS_LDO, 26) |
RELOC_NUMBER (R_MN10300_TLS_GOTIE, 27) |
RELOC_NUMBER (R_MN10300_TLS_IE, 28) |
RELOC_NUMBER (R_MN10300_TLS_LE, 29) |
RELOC_NUMBER (R_MN10300_TLS_DTPMOD, 30) |
RELOC_NUMBER (R_MN10300_TLS_DTPOFF, 31) |
RELOC_NUMBER (R_MN10300_TLS_TPOFF, 32) |
RELOC_NUMBER (R_MN10300_SYM_DIFF, 33) |
RELOC_NUMBER (R_MN10300_ALIGN, 34) |
END_RELOC_NUMBERS (R_MN10300_MAX) |
/* Machine variant if we know it. This field was invented at Cygnus, |
but it is hoped that other vendors will adopt it. If some standard |
is developed, this code should be changed to follow it. */ |
#define EF_MN10300_MACH 0x00FF0000 |
/* Cygnus is choosing values between 80 and 9F; |
00 - 7F should be left for a future standard; |
the rest are open. */ |
#define E_MN10300_MACH_MN10300 0x00810000 |
#define E_MN10300_MACH_AM33 0x00820000 |
#define E_MN10300_MACH_AM33_2 0x00830000 |
#endif /* _ELF_MN10300_H */ |
/contrib/toolchain/binutils/include/elf/moxie.h |
---|
0,0 → 1,32 |
/* moxie ELF support for BFD. |
Copyright 2009, 2010 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_MOXIE_H |
#define _ELF_MOXIE_H |
#include "elf/reloc-macros.h" |
/* Relocation types. */ |
START_RELOC_NUMBERS (elf_moxie_reloc_type) |
RELOC_NUMBER (R_MOXIE_NONE, 0) |
RELOC_NUMBER (R_MOXIE_32, 1) |
RELOC_NUMBER (R_MOXIE_PCREL10, 2) |
END_RELOC_NUMBERS (R_MOXIE_max) |
#endif /* _ELF_MOXIE_H */ |
/contrib/toolchain/binutils/include/elf/msp430.h |
---|
0,0 → 1,101 |
/* MSP430 ELF support for BFD. |
Copyright (C) 2002-2013 Free Software Foundation, Inc. |
Contributed by Dmitry Diky <diwil@mail.ru> |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_MSP430_H |
#define _ELF_MSP430_H |
#include "elf/reloc-macros.h" |
/* Processor specific flags for the ELF header e_flags field. */ |
#define EF_MSP430_MACH 0xff |
#define E_MSP430_MACH_MSP430x11 11 |
#define E_MSP430_MACH_MSP430x11x1 110 |
#define E_MSP430_MACH_MSP430x12 12 |
#define E_MSP430_MACH_MSP430x13 13 |
#define E_MSP430_MACH_MSP430x14 14 |
#define E_MSP430_MACH_MSP430x15 15 |
#define E_MSP430_MACH_MSP430x16 16 |
#define E_MSP430_MACH_MSP430x20 20 |
#define E_MSP430_MACH_MSP430x22 22 |
#define E_MSP430_MACH_MSP430x23 23 |
#define E_MSP430_MACH_MSP430x24 24 |
#define E_MSP430_MACH_MSP430x26 26 |
#define E_MSP430_MACH_MSP430x31 31 |
#define E_MSP430_MACH_MSP430x32 32 |
#define E_MSP430_MACH_MSP430x33 33 |
#define E_MSP430_MACH_MSP430x41 41 |
#define E_MSP430_MACH_MSP430x42 42 |
#define E_MSP430_MACH_MSP430x43 43 |
#define E_MSP430_MACH_MSP430x44 44 |
#define E_MSP430_MACH_MSP430X 45 |
#define E_MSP430_MACH_MSP430x46 46 |
#define E_MSP430_MACH_MSP430x47 47 |
#define E_MSP430_MACH_MSP430x54 54 |
#define SHT_MSP430_ATTRIBUTES 0x70000003 /* Section holds ABI attributes. */ |
#define SHT_MSP430_SEC_FLAGS 0x7f000005 /* Holds TI compiler's section flags. */ |
#define SHT_MSP430_SYM_ALIASES 0x7f000006 /* Holds TI compiler's symbol aliases. */ |
/* Tag values for an attribute section. */ |
#define OFBA_MSPABI_Tag_ISA 4 |
#define OFBA_MSPABI_Tag_Code_Model 6 |
#define OFBA_MSPABI_Tag_Data_Model 8 |
/* Relocations. */ |
START_RELOC_NUMBERS (elf_msp430_reloc_type) |
RELOC_NUMBER (R_MSP430_NONE, 0) |
RELOC_NUMBER (R_MSP430_32, 1) |
RELOC_NUMBER (R_MSP430_10_PCREL, 2) |
RELOC_NUMBER (R_MSP430_16, 3) |
RELOC_NUMBER (R_MSP430_16_PCREL, 4) |
RELOC_NUMBER (R_MSP430_16_BYTE, 5) |
RELOC_NUMBER (R_MSP430_16_PCREL_BYTE, 6) |
RELOC_NUMBER (R_MSP430_2X_PCREL, 7) |
RELOC_NUMBER (R_MSP430_RL_PCREL, 8) |
RELOC_NUMBER (R_MSP430_8, 9) |
RELOC_NUMBER (R_MSP430_SYM_DIFF, 10) |
END_RELOC_NUMBERS (R_MSP430_max) |
START_RELOC_NUMBERS (elf_msp430x_reloc_type) |
RELOC_NUMBER (R_MSP430_ABS32, 1) /* aka R_MSP430_32 */ |
RELOC_NUMBER (R_MSP430_ABS16, 2) /* aka R_MSP430_16 */ |
RELOC_NUMBER (R_MSP430_ABS8, 3) |
RELOC_NUMBER (R_MSP430_PCR16, 4) /* aka R_MSP430_16_PCREL */ |
RELOC_NUMBER (R_MSP430X_PCR20_EXT_SRC, 5) |
RELOC_NUMBER (R_MSP430X_PCR20_EXT_DST, 6) |
RELOC_NUMBER (R_MSP430X_PCR20_EXT_ODST, 7) |
RELOC_NUMBER (R_MSP430X_ABS20_EXT_SRC, 8) |
RELOC_NUMBER (R_MSP430X_ABS20_EXT_DST, 9) |
RELOC_NUMBER (R_MSP430X_ABS20_EXT_ODST, 10) |
RELOC_NUMBER (R_MSP430X_ABS20_ADR_SRC, 11) |
RELOC_NUMBER (R_MSP430X_ABS20_ADR_DST, 12) |
RELOC_NUMBER (R_MSP430X_PCR16, 13) /* Like R_MSP430_PCR16 but with overflow checking. */ |
RELOC_NUMBER (R_MSP430X_PCR20_CALL, 14) |
RELOC_NUMBER (R_MSP430X_ABS16, 15) /* Like R_MSP430_ABS16 but with overflow checking. */ |
RELOC_NUMBER (R_MSP430_ABS_HI16, 16) |
RELOC_NUMBER (R_MSP430_PREL31, 17) |
RELOC_NUMBER (R_MSP430_EHTYPE, 18) /* Mentioned in ABI. */ |
RELOC_NUMBER (R_MSP430X_10_PCREL, 19) /* Red Hat invention. Used for Jump instructions. */ |
RELOC_NUMBER (R_MSP430X_2X_PCREL, 20) /* Red Hat invention. Used for relaxing jumps. */ |
RELOC_NUMBER (R_MSP430X_SYM_DIFF, 21) /* Red Hat invention. Used for relaxing debug info. */ |
END_RELOC_NUMBERS (R_MSP430x_max) |
#endif /* _ELF_MSP430_H */ |
/contrib/toolchain/binutils/include/elf/mt.h |
---|
0,0 → 1,46 |
/* MS1 ELF support for BFD. |
Copyright (C) 2000, 2005, 2010 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_MT_H |
#define _ELF_MT_H |
#include "elf/reloc-macros.h" |
/* Relocations. */ |
START_RELOC_NUMBERS (elf_mt_reloc_type) |
RELOC_NUMBER (R_MT_NONE, 0) |
RELOC_NUMBER (R_MT_16, 1) |
RELOC_NUMBER (R_MT_32, 2) |
RELOC_NUMBER (R_MT_32_PCREL, 3) |
RELOC_NUMBER (R_MT_PC16, 4) |
RELOC_NUMBER (R_MT_HI16, 5) |
RELOC_NUMBER (R_MT_LO16, 6) |
END_RELOC_NUMBERS(R_MT_max) |
#define EF_MT_CPU_MRISC 0x00000001 /* default */ |
#define EF_MT_CPU_MRISC2 0x00000002 /* MRISC2 */ |
#define EF_MT_CPU_MS2 0x00000003 /* MS2 */ |
#define EF_MT_CPU_MASK 0x00000003 /* specific cpu bits */ |
#define EF_MT_ALL_FLAGS (EF_MT_CPU_MASK) |
/* The location of the memory mapped hardware stack. */ |
#define MT_STACK_VALUE 0x0f000000 |
#define MT_STACK_SIZE 0x20 |
#endif /* _ELF_MT_H */ |
/contrib/toolchain/binutils/include/elf/nios2.h |
---|
0,0 → 1,91 |
/* Altera Nios II ELF support for BFD. |
Copyright (C) 2012, 2013 Free Software Foundation, Inc. |
Contributed by Nigel Gray (ngray@altera.com). |
Contributed by Mentor Graphics, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* This file holds definitions specific to the Altera Nios II ELF ABI. Note |
that most of this is not actually implemented by BFD. */ |
#ifndef _ELF_NIOS2_H |
#define _ELF_NIOS2_H |
#include "elf/reloc-macros.h" |
/* The order of these numbers must match the order in |
the elf_nios2_howto_table_rel table for the lookup |
function to work properly. */ |
START_RELOC_NUMBERS (elf_nios2_reloc_type) |
RELOC_NUMBER (R_NIOS2_NONE, 0) |
RELOC_NUMBER (R_NIOS2_S16, 1) |
RELOC_NUMBER (R_NIOS2_U16, 2) |
RELOC_NUMBER (R_NIOS2_PCREL16, 3) |
RELOC_NUMBER (R_NIOS2_CALL26, 4) |
RELOC_NUMBER (R_NIOS2_IMM5, 5) |
RELOC_NUMBER (R_NIOS2_CACHE_OPX, 6) |
RELOC_NUMBER (R_NIOS2_IMM6, 7) |
RELOC_NUMBER (R_NIOS2_IMM8, 8) |
RELOC_NUMBER (R_NIOS2_HI16, 9) |
RELOC_NUMBER (R_NIOS2_LO16, 10) |
RELOC_NUMBER (R_NIOS2_HIADJ16, 11) |
RELOC_NUMBER (R_NIOS2_BFD_RELOC_32, 12) |
RELOC_NUMBER (R_NIOS2_BFD_RELOC_16, 13) |
RELOC_NUMBER (R_NIOS2_BFD_RELOC_8, 14) |
RELOC_NUMBER (R_NIOS2_GPREL, 15) |
RELOC_NUMBER (R_NIOS2_GNU_VTINHERIT, 16) |
RELOC_NUMBER (R_NIOS2_GNU_VTENTRY, 17) |
RELOC_NUMBER (R_NIOS2_UJMP, 18) |
RELOC_NUMBER (R_NIOS2_CJMP, 19) |
RELOC_NUMBER (R_NIOS2_CALLR, 20) |
RELOC_NUMBER (R_NIOS2_ALIGN, 21) |
RELOC_NUMBER (R_NIOS2_GOT16, 22) |
RELOC_NUMBER (R_NIOS2_CALL16, 23) |
RELOC_NUMBER (R_NIOS2_GOTOFF_LO, 24) |
RELOC_NUMBER (R_NIOS2_GOTOFF_HA, 25) |
RELOC_NUMBER (R_NIOS2_PCREL_LO, 26) |
RELOC_NUMBER (R_NIOS2_PCREL_HA, 27) |
RELOC_NUMBER (R_NIOS2_TLS_GD16, 28) |
RELOC_NUMBER (R_NIOS2_TLS_LDM16, 29) |
RELOC_NUMBER (R_NIOS2_TLS_LDO16, 30) |
RELOC_NUMBER (R_NIOS2_TLS_IE16, 31) |
RELOC_NUMBER (R_NIOS2_TLS_LE16, 32) |
RELOC_NUMBER (R_NIOS2_TLS_DTPMOD, 33) |
RELOC_NUMBER (R_NIOS2_TLS_DTPREL, 34) |
RELOC_NUMBER (R_NIOS2_TLS_TPREL, 35) |
RELOC_NUMBER (R_NIOS2_COPY, 36) |
RELOC_NUMBER (R_NIOS2_GLOB_DAT, 37) |
RELOC_NUMBER (R_NIOS2_JUMP_SLOT, 38) |
RELOC_NUMBER (R_NIOS2_RELATIVE, 39) |
RELOC_NUMBER (R_NIOS2_GOTOFF, 40) |
RELOC_NUMBER (R_NIOS2_ILLEGAL, 41) |
END_RELOC_NUMBERS (R_NIOS2_maxext) |
/* Processor-specific section flags. */ |
/* This is used to mark gp-relative sections. */ |
#define SHF_NIOS2_GPREL 0x10000000 |
/* Processor-specific dynamic array tags. */ |
/* Address of _gp. */ |
#define DT_NIOS2_GP 0x70000002 |
#endif /* _ELF_NIOS2_H */ |
/contrib/toolchain/binutils/include/elf/openrisc.h |
---|
0,0 → 1,39 |
/* OpenRISC ELF support for BFD. |
Copyright 2001, 2010 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_OPENRISC_H |
#define _ELF_OPENRISC_H |
#include "elf/reloc-macros.h" |
/* Relocations. */ |
START_RELOC_NUMBERS (elf_openrisc_reloc_type) |
RELOC_NUMBER (R_OPENRISC_NONE, 0) |
RELOC_NUMBER (R_OPENRISC_INSN_REL_26, 1) |
RELOC_NUMBER (R_OPENRISC_INSN_ABS_26, 2) |
RELOC_NUMBER (R_OPENRISC_LO_16_IN_INSN, 3) |
RELOC_NUMBER (R_OPENRISC_HI_16_IN_INSN, 4) |
RELOC_NUMBER (R_OPENRISC_8, 5) |
RELOC_NUMBER (R_OPENRISC_16, 6) |
RELOC_NUMBER (R_OPENRISC_32, 7) |
RELOC_NUMBER (R_OPENRISC_GNU_VTINHERIT, 8) |
RELOC_NUMBER (R_OPENRISC_GNU_VTENTRY, 9) |
END_RELOC_NUMBERS (R_OPENRISC_max) |
#endif /* _ELF_OPENRISC_H */ |
/contrib/toolchain/binutils/include/elf/or32.h |
---|
0,0 → 1,56 |
/* OR1K ELF support for BFD. Derived from ppc.h. |
Copyright (C) 2002, 2010 Free Software Foundation, Inc. |
Contributed by Ivan Guzvinec <ivang@opencores.org> |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _ELF_OR1K_H |
#define _ELF_OR1K_H |
#include "elf/reloc-macros.h" |
/* Relocations. */ |
START_RELOC_NUMBERS (elf_or32_reloc_type) |
RELOC_NUMBER (R_OR32_NONE, 0) |
RELOC_NUMBER (R_OR32_32, 1) |
RELOC_NUMBER (R_OR32_16, 2) |
RELOC_NUMBER (R_OR32_8, 3) |
RELOC_NUMBER (R_OR32_CONST, 4) |
RELOC_NUMBER (R_OR32_CONSTH, 5) |
RELOC_NUMBER (R_OR32_JUMPTARG, 6) |
RELOC_NUMBER (R_OR32_GNU_VTENTRY, 7) |
RELOC_NUMBER (R_OR32_GNU_VTINHERIT, 8) |
END_RELOC_NUMBERS (R_OR32_max) |
/* Four bit OR32 machine type field. */ |
#define EF_OR32_MACH 0x0000000f |
/* Various CPU types. */ |
#define E_OR32_MACH_BASE 0x00000000 |
#define E_OR32_MACH_UNUSED1 0x00000001 |
#define E_OR32_MACH_UNUSED2 0x00000002 |
#define E_OR32_MACH_UNUSED4 0x00000003 |
/* Processor specific section headers, sh_type field */ |
#define SHT_ORDERED SHT_HIPROC /* Link editor is to sort the \ |
entries in this section \ |
based on the address \ |
specified in the associated \ |
symbol table entry. */ |
#endif /* _ELF_OR1K_H */ |
/contrib/toolchain/binutils/include/elf/pj.h |
---|
0,0 → 1,44 |
/* picoJava ELF support for BFD. |
Copyright 1999, 2000, 2010 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_PJ_H |
#define _ELF_PJ_H |
#include "elf/reloc-macros.h" |
/* Relocations. */ |
START_RELOC_NUMBERS (elf_pj_reloc_type) |
RELOC_NUMBER (R_PJ_NONE, 0) |
RELOC_NUMBER (R_PJ_DATA_DIR32, 1) |
RELOC_NUMBER (R_PJ_CODE_REL32, 2) |
RELOC_NUMBER (R_PJ_CODE_REL16, 3) |
RELOC_NUMBER (R_PJ_CODE_DIR32, 6) |
RELOC_NUMBER (R_PJ_CODE_DIR16, 7) |
RELOC_NUMBER (R_PJ_CODE_LO16, 13) |
RELOC_NUMBER (R_PJ_CODE_HI16, 14) |
RELOC_NUMBER (R_PJ_GNU_VTINHERIT, 15) |
RELOC_NUMBER (R_PJ_GNU_VTENTRY, 16) |
END_RELOC_NUMBERS (R_PJ_max) |
#define EF_PICOJAVA_ARCH 0x0000000f |
#define EF_PICOJAVA_NEWCALLS 0x00000010 |
#define EF_PICOJAVA_GNUCALLS 0x00000020 /* The (currently) non standard GNU calling convention */ |
#endif |
/contrib/toolchain/binutils/include/elf/ppc.h |
---|
0,0 → 1,224 |
/* PPC ELF support for BFD. |
Copyright 1995, 1996, 1998, 2000, 2001, 2002, 2003, 2005, 2007, 2008, |
2009, 2010 Free Software Foundation, Inc. |
By Michael Meissner, Cygnus Support, <meissner@cygnus.com>, |
from information in the System V Application Binary Interface, |
PowerPC Processor Supplement and the PowerPC Embedded Application |
Binary Interface (eabi). |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* This file holds definitions specific to the PPC ELF ABI. Note |
that most of this is not actually implemented by BFD. */ |
#ifndef _ELF_PPC_H |
#define _ELF_PPC_H |
#include "elf/reloc-macros.h" |
/* Relocations. */ |
START_RELOC_NUMBERS (elf_ppc_reloc_type) |
RELOC_NUMBER (R_PPC_NONE, 0) |
RELOC_NUMBER (R_PPC_ADDR32, 1) |
RELOC_NUMBER (R_PPC_ADDR24, 2) |
RELOC_NUMBER (R_PPC_ADDR16, 3) |
RELOC_NUMBER (R_PPC_ADDR16_LO, 4) |
RELOC_NUMBER (R_PPC_ADDR16_HI, 5) |
RELOC_NUMBER (R_PPC_ADDR16_HA, 6) |
RELOC_NUMBER (R_PPC_ADDR14, 7) |
RELOC_NUMBER (R_PPC_ADDR14_BRTAKEN, 8) |
RELOC_NUMBER (R_PPC_ADDR14_BRNTAKEN, 9) |
RELOC_NUMBER (R_PPC_REL24, 10) |
RELOC_NUMBER (R_PPC_REL14, 11) |
RELOC_NUMBER (R_PPC_REL14_BRTAKEN, 12) |
RELOC_NUMBER (R_PPC_REL14_BRNTAKEN, 13) |
RELOC_NUMBER (R_PPC_GOT16, 14) |
RELOC_NUMBER (R_PPC_GOT16_LO, 15) |
RELOC_NUMBER (R_PPC_GOT16_HI, 16) |
RELOC_NUMBER (R_PPC_GOT16_HA, 17) |
RELOC_NUMBER (R_PPC_PLTREL24, 18) |
RELOC_NUMBER (R_PPC_COPY, 19) |
RELOC_NUMBER (R_PPC_GLOB_DAT, 20) |
RELOC_NUMBER (R_PPC_JMP_SLOT, 21) |
RELOC_NUMBER (R_PPC_RELATIVE, 22) |
RELOC_NUMBER (R_PPC_LOCAL24PC, 23) |
RELOC_NUMBER (R_PPC_UADDR32, 24) |
RELOC_NUMBER (R_PPC_UADDR16, 25) |
RELOC_NUMBER (R_PPC_REL32, 26) |
RELOC_NUMBER (R_PPC_PLT32, 27) |
RELOC_NUMBER (R_PPC_PLTREL32, 28) |
RELOC_NUMBER (R_PPC_PLT16_LO, 29) |
RELOC_NUMBER (R_PPC_PLT16_HI, 30) |
RELOC_NUMBER (R_PPC_PLT16_HA, 31) |
RELOC_NUMBER (R_PPC_SDAREL16, 32) |
RELOC_NUMBER (R_PPC_SECTOFF, 33) |
RELOC_NUMBER (R_PPC_SECTOFF_LO, 34) |
RELOC_NUMBER (R_PPC_SECTOFF_HI, 35) |
RELOC_NUMBER (R_PPC_SECTOFF_HA, 36) |
RELOC_NUMBER (R_PPC_ADDR30, 37) |
#ifndef RELOC_MACROS_GEN_FUNC |
/* Fake relocations for branch stubs, only used internally by ld. */ |
RELOC_NUMBER (R_PPC_RELAX, 48) |
RELOC_NUMBER (R_PPC_RELAX_PLT, 49) |
RELOC_NUMBER (R_PPC_RELAX_PLTREL24, 50) |
#endif |
/* Relocs added to support TLS. */ |
RELOC_NUMBER (R_PPC_TLS, 67) |
RELOC_NUMBER (R_PPC_DTPMOD32, 68) |
RELOC_NUMBER (R_PPC_TPREL16, 69) |
RELOC_NUMBER (R_PPC_TPREL16_LO, 70) |
RELOC_NUMBER (R_PPC_TPREL16_HI, 71) |
RELOC_NUMBER (R_PPC_TPREL16_HA, 72) |
RELOC_NUMBER (R_PPC_TPREL32, 73) |
RELOC_NUMBER (R_PPC_DTPREL16, 74) |
RELOC_NUMBER (R_PPC_DTPREL16_LO, 75) |
RELOC_NUMBER (R_PPC_DTPREL16_HI, 76) |
RELOC_NUMBER (R_PPC_DTPREL16_HA, 77) |
RELOC_NUMBER (R_PPC_DTPREL32, 78) |
RELOC_NUMBER (R_PPC_GOT_TLSGD16, 79) |
RELOC_NUMBER (R_PPC_GOT_TLSGD16_LO, 80) |
RELOC_NUMBER (R_PPC_GOT_TLSGD16_HI, 81) |
RELOC_NUMBER (R_PPC_GOT_TLSGD16_HA, 82) |
RELOC_NUMBER (R_PPC_GOT_TLSLD16, 83) |
RELOC_NUMBER (R_PPC_GOT_TLSLD16_LO, 84) |
RELOC_NUMBER (R_PPC_GOT_TLSLD16_HI, 85) |
RELOC_NUMBER (R_PPC_GOT_TLSLD16_HA, 86) |
RELOC_NUMBER (R_PPC_GOT_TPREL16, 87) |
RELOC_NUMBER (R_PPC_GOT_TPREL16_LO, 88) |
RELOC_NUMBER (R_PPC_GOT_TPREL16_HI, 89) |
RELOC_NUMBER (R_PPC_GOT_TPREL16_HA, 90) |
RELOC_NUMBER (R_PPC_GOT_DTPREL16, 91) |
RELOC_NUMBER (R_PPC_GOT_DTPREL16_LO, 92) |
RELOC_NUMBER (R_PPC_GOT_DTPREL16_HI, 93) |
RELOC_NUMBER (R_PPC_GOT_DTPREL16_HA, 94) |
RELOC_NUMBER (R_PPC_TLSGD, 95) |
RELOC_NUMBER (R_PPC_TLSLD, 96) |
/* The remaining relocs are from the Embedded ELF ABI, and are not |
in the SVR4 ELF ABI. */ |
RELOC_NUMBER (R_PPC_EMB_NADDR32, 101) |
RELOC_NUMBER (R_PPC_EMB_NADDR16, 102) |
RELOC_NUMBER (R_PPC_EMB_NADDR16_LO, 103) |
RELOC_NUMBER (R_PPC_EMB_NADDR16_HI, 104) |
RELOC_NUMBER (R_PPC_EMB_NADDR16_HA, 105) |
RELOC_NUMBER (R_PPC_EMB_SDAI16, 106) |
RELOC_NUMBER (R_PPC_EMB_SDA2I16, 107) |
RELOC_NUMBER (R_PPC_EMB_SDA2REL, 108) |
RELOC_NUMBER (R_PPC_EMB_SDA21, 109) |
RELOC_NUMBER (R_PPC_EMB_MRKREF, 110) |
RELOC_NUMBER (R_PPC_EMB_RELSEC16, 111) |
RELOC_NUMBER (R_PPC_EMB_RELST_LO, 112) |
RELOC_NUMBER (R_PPC_EMB_RELST_HI, 113) |
RELOC_NUMBER (R_PPC_EMB_RELST_HA, 114) |
RELOC_NUMBER (R_PPC_EMB_BIT_FLD, 115) |
RELOC_NUMBER (R_PPC_EMB_RELSDA, 116) |
/* PowerPC VLE relocations. */ |
RELOC_NUMBER (R_PPC_VLE_REL8, 216) |
RELOC_NUMBER (R_PPC_VLE_REL15, 217) |
RELOC_NUMBER (R_PPC_VLE_REL24, 218) |
RELOC_NUMBER (R_PPC_VLE_LO16A, 219) |
RELOC_NUMBER (R_PPC_VLE_LO16D, 220) |
RELOC_NUMBER (R_PPC_VLE_HI16A, 221) |
RELOC_NUMBER (R_PPC_VLE_HI16D, 222) |
RELOC_NUMBER (R_PPC_VLE_HA16A, 223) |
RELOC_NUMBER (R_PPC_VLE_HA16D, 224) |
RELOC_NUMBER (R_PPC_VLE_SDA21, 225) |
RELOC_NUMBER (R_PPC_VLE_SDA21_LO, 226) |
RELOC_NUMBER (R_PPC_VLE_SDAREL_LO16A, 227) |
RELOC_NUMBER (R_PPC_VLE_SDAREL_LO16D, 228) |
RELOC_NUMBER (R_PPC_VLE_SDAREL_HI16A, 229) |
RELOC_NUMBER (R_PPC_VLE_SDAREL_HI16D, 230) |
RELOC_NUMBER (R_PPC_VLE_SDAREL_HA16A, 231) |
RELOC_NUMBER (R_PPC_VLE_SDAREL_HA16D, 232) |
/* Support STT_GNU_IFUNC plt calls. */ |
RELOC_NUMBER (R_PPC_IRELATIVE, 248) |
/* These are GNU extensions used in PIC code sequences. */ |
RELOC_NUMBER (R_PPC_REL16, 249) |
RELOC_NUMBER (R_PPC_REL16_LO, 250) |
RELOC_NUMBER (R_PPC_REL16_HI, 251) |
RELOC_NUMBER (R_PPC_REL16_HA, 252) |
/* These are GNU extensions to enable C++ vtable garbage collection. */ |
RELOC_NUMBER (R_PPC_GNU_VTINHERIT, 253) |
RELOC_NUMBER (R_PPC_GNU_VTENTRY, 254) |
/* This is a phony reloc to handle any old fashioned TOC16 references |
that may still be in object files. */ |
RELOC_NUMBER (R_PPC_TOC16, 255) |
END_RELOC_NUMBERS (R_PPC_max) |
#define IS_PPC_TLS_RELOC(R) \ |
((R) >= R_PPC_TLS && (R) <= R_PPC_GOT_DTPREL16_HA) |
/* Specify the value of _GLOBAL_OFFSET_TABLE_. */ |
#define DT_PPC_GOT (DT_LOPROC) |
/* Specify that tls descriptors should be optimized. */ |
#define DT_PPC_OPT (DT_LOPROC + 1) |
#define PPC_OPT_TLS 1 |
/* Processor specific flags for the ELF header e_flags field. */ |
#define EF_PPC_EMB 0x80000000 /* PowerPC embedded flag. */ |
#define EF_PPC_RELOCATABLE 0x00010000 /* PowerPC -mrelocatable flag. */ |
#define EF_PPC_RELOCATABLE_LIB 0x00008000 /* PowerPC -mrelocatable-lib flag. */ |
/* Processor specific program headers, p_flags field. */ |
#define PF_PPC_VLE 0x10000000 /* PowerPC VLE. */ |
/* Processor specific section headers, sh_flags field. */ |
#define SHF_PPC_VLE 0x10000000 /* PowerPC VLE text section. */ |
/* Processor specific section headers, sh_type field. */ |
#define SHT_ORDERED SHT_HIPROC /* Link editor is to sort the \ |
entries in this section \ |
based on the address \ |
specified in the associated \ |
symbol table entry. */ |
/* Object attribute tags. */ |
enum |
{ |
/* 0-3 are generic. */ |
Tag_GNU_Power_ABI_FP = 4, /* Value 1 for hard-float, 2 for |
soft-float, 3 for single=precision |
hard-float; 0 for not tagged or not |
using any ABIs affected by the |
differences. */ |
/* Value 1 for general purpose registers only, 2 for AltiVec |
registers, 3 for SPE registers; 0 for not tagged or not using any |
ABIs affected by the differences. */ |
Tag_GNU_Power_ABI_Vector = 8, |
/* Value 1 for ABIs using r3/r4 for returning structures <= 8 bytes, |
2 for ABIs using memory; 0 for not tagged or not using any ABIs |
affected by the differences. */ |
Tag_GNU_Power_ABI_Struct_Return = 12 |
}; |
#endif /* _ELF_PPC_H */ |
/contrib/toolchain/binutils/include/elf/ppc64.h |
---|
0,0 → 1,242 |
/* PPC64 ELF support for BFD. |
Copyright 2003, 2005, 2009, 2010, 2011 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _ELF_PPC64_H |
#define _ELF_PPC64_H |
#include "elf/reloc-macros.h" |
/* Relocations. */ |
START_RELOC_NUMBERS (elf_ppc64_reloc_type) |
RELOC_NUMBER (R_PPC64_NONE, 0) |
RELOC_NUMBER (R_PPC64_ADDR32, 1) |
RELOC_NUMBER (R_PPC64_ADDR24, 2) |
RELOC_NUMBER (R_PPC64_ADDR16, 3) |
RELOC_NUMBER (R_PPC64_ADDR16_LO, 4) |
RELOC_NUMBER (R_PPC64_ADDR16_HI, 5) |
RELOC_NUMBER (R_PPC64_ADDR16_HA, 6) |
RELOC_NUMBER (R_PPC64_ADDR14, 7) |
RELOC_NUMBER (R_PPC64_ADDR14_BRTAKEN, 8) |
RELOC_NUMBER (R_PPC64_ADDR14_BRNTAKEN, 9) |
RELOC_NUMBER (R_PPC64_REL24, 10) |
RELOC_NUMBER (R_PPC64_REL14, 11) |
RELOC_NUMBER (R_PPC64_REL14_BRTAKEN, 12) |
RELOC_NUMBER (R_PPC64_REL14_BRNTAKEN, 13) |
RELOC_NUMBER (R_PPC64_GOT16, 14) |
RELOC_NUMBER (R_PPC64_GOT16_LO, 15) |
RELOC_NUMBER (R_PPC64_GOT16_HI, 16) |
RELOC_NUMBER (R_PPC64_GOT16_HA, 17) |
/* 18 unused. 32-bit reloc is R_PPC_PLTREL24. */ |
RELOC_NUMBER (R_PPC64_COPY, 19) |
RELOC_NUMBER (R_PPC64_GLOB_DAT, 20) |
RELOC_NUMBER (R_PPC64_JMP_SLOT, 21) |
RELOC_NUMBER (R_PPC64_RELATIVE, 22) |
/* 23 unused. 32-bit reloc is R_PPC_LOCAL24PC. */ |
RELOC_NUMBER (R_PPC64_UADDR32, 24) |
RELOC_NUMBER (R_PPC64_UADDR16, 25) |
RELOC_NUMBER (R_PPC64_REL32, 26) |
RELOC_NUMBER (R_PPC64_PLT32, 27) |
RELOC_NUMBER (R_PPC64_PLTREL32, 28) |
RELOC_NUMBER (R_PPC64_PLT16_LO, 29) |
RELOC_NUMBER (R_PPC64_PLT16_HI, 30) |
RELOC_NUMBER (R_PPC64_PLT16_HA, 31) |
/* 32 unused. 32-bit reloc is R_PPC_SDAREL16. */ |
RELOC_NUMBER (R_PPC64_SECTOFF, 33) |
RELOC_NUMBER (R_PPC64_SECTOFF_LO, 34) |
RELOC_NUMBER (R_PPC64_SECTOFF_HI, 35) |
RELOC_NUMBER (R_PPC64_SECTOFF_HA, 36) |
RELOC_NUMBER (R_PPC64_REL30, 37) |
RELOC_NUMBER (R_PPC64_ADDR64, 38) |
RELOC_NUMBER (R_PPC64_ADDR16_HIGHER, 39) |
RELOC_NUMBER (R_PPC64_ADDR16_HIGHERA, 40) |
RELOC_NUMBER (R_PPC64_ADDR16_HIGHEST, 41) |
RELOC_NUMBER (R_PPC64_ADDR16_HIGHESTA, 42) |
RELOC_NUMBER (R_PPC64_UADDR64, 43) |
RELOC_NUMBER (R_PPC64_REL64, 44) |
RELOC_NUMBER (R_PPC64_PLT64, 45) |
RELOC_NUMBER (R_PPC64_PLTREL64, 46) |
RELOC_NUMBER (R_PPC64_TOC16, 47) |
RELOC_NUMBER (R_PPC64_TOC16_LO, 48) |
RELOC_NUMBER (R_PPC64_TOC16_HI, 49) |
RELOC_NUMBER (R_PPC64_TOC16_HA, 50) |
RELOC_NUMBER (R_PPC64_TOC, 51) |
RELOC_NUMBER (R_PPC64_PLTGOT16, 52) |
RELOC_NUMBER (R_PPC64_PLTGOT16_LO, 53) |
RELOC_NUMBER (R_PPC64_PLTGOT16_HI, 54) |
RELOC_NUMBER (R_PPC64_PLTGOT16_HA, 55) |
/* The following relocs were added in the 64-bit PowerPC ELF ABI |
revision 1.2. */ |
RELOC_NUMBER (R_PPC64_ADDR16_DS, 56) |
RELOC_NUMBER (R_PPC64_ADDR16_LO_DS, 57) |
RELOC_NUMBER (R_PPC64_GOT16_DS, 58) |
RELOC_NUMBER (R_PPC64_GOT16_LO_DS, 59) |
RELOC_NUMBER (R_PPC64_PLT16_LO_DS, 60) |
RELOC_NUMBER (R_PPC64_SECTOFF_DS, 61) |
RELOC_NUMBER (R_PPC64_SECTOFF_LO_DS, 62) |
RELOC_NUMBER (R_PPC64_TOC16_DS, 63) |
RELOC_NUMBER (R_PPC64_TOC16_LO_DS, 64) |
RELOC_NUMBER (R_PPC64_PLTGOT16_DS, 65) |
RELOC_NUMBER (R_PPC64_PLTGOT16_LO_DS, 66) |
/* Relocs added to support TLS. PowerPC64 ELF ABI revision 1.5. */ |
RELOC_NUMBER (R_PPC64_TLS, 67) |
RELOC_NUMBER (R_PPC64_DTPMOD64, 68) |
RELOC_NUMBER (R_PPC64_TPREL16, 69) |
RELOC_NUMBER (R_PPC64_TPREL16_LO, 70) |
RELOC_NUMBER (R_PPC64_TPREL16_HI, 71) |
RELOC_NUMBER (R_PPC64_TPREL16_HA, 72) |
RELOC_NUMBER (R_PPC64_TPREL64, 73) |
RELOC_NUMBER (R_PPC64_DTPREL16, 74) |
RELOC_NUMBER (R_PPC64_DTPREL16_LO, 75) |
RELOC_NUMBER (R_PPC64_DTPREL16_HI, 76) |
RELOC_NUMBER (R_PPC64_DTPREL16_HA, 77) |
RELOC_NUMBER (R_PPC64_DTPREL64, 78) |
RELOC_NUMBER (R_PPC64_GOT_TLSGD16, 79) |
RELOC_NUMBER (R_PPC64_GOT_TLSGD16_LO, 80) |
RELOC_NUMBER (R_PPC64_GOT_TLSGD16_HI, 81) |
RELOC_NUMBER (R_PPC64_GOT_TLSGD16_HA, 82) |
RELOC_NUMBER (R_PPC64_GOT_TLSLD16, 83) |
RELOC_NUMBER (R_PPC64_GOT_TLSLD16_LO, 84) |
RELOC_NUMBER (R_PPC64_GOT_TLSLD16_HI, 85) |
RELOC_NUMBER (R_PPC64_GOT_TLSLD16_HA, 86) |
RELOC_NUMBER (R_PPC64_GOT_TPREL16_DS, 87) |
RELOC_NUMBER (R_PPC64_GOT_TPREL16_LO_DS, 88) |
RELOC_NUMBER (R_PPC64_GOT_TPREL16_HI, 89) |
RELOC_NUMBER (R_PPC64_GOT_TPREL16_HA, 90) |
RELOC_NUMBER (R_PPC64_GOT_DTPREL16_DS, 91) |
RELOC_NUMBER (R_PPC64_GOT_DTPREL16_LO_DS, 92) |
RELOC_NUMBER (R_PPC64_GOT_DTPREL16_HI, 93) |
RELOC_NUMBER (R_PPC64_GOT_DTPREL16_HA, 94) |
RELOC_NUMBER (R_PPC64_TPREL16_DS, 95) |
RELOC_NUMBER (R_PPC64_TPREL16_LO_DS, 96) |
RELOC_NUMBER (R_PPC64_TPREL16_HIGHER, 97) |
RELOC_NUMBER (R_PPC64_TPREL16_HIGHERA, 98) |
RELOC_NUMBER (R_PPC64_TPREL16_HIGHEST, 99) |
RELOC_NUMBER (R_PPC64_TPREL16_HIGHESTA, 100) |
RELOC_NUMBER (R_PPC64_DTPREL16_DS, 101) |
RELOC_NUMBER (R_PPC64_DTPREL16_LO_DS, 102) |
RELOC_NUMBER (R_PPC64_DTPREL16_HIGHER, 103) |
RELOC_NUMBER (R_PPC64_DTPREL16_HIGHERA, 104) |
RELOC_NUMBER (R_PPC64_DTPREL16_HIGHEST, 105) |
RELOC_NUMBER (R_PPC64_DTPREL16_HIGHESTA, 106) |
RELOC_NUMBER (R_PPC64_TLSGD, 107) |
RELOC_NUMBER (R_PPC64_TLSLD, 108) |
RELOC_NUMBER (R_PPC64_TOCSAVE, 109) |
/* Added when HA and HI relocs were changed to report overflows. */ |
RELOC_NUMBER (R_PPC64_ADDR16_HIGH, 110) |
RELOC_NUMBER (R_PPC64_ADDR16_HIGHA, 111) |
RELOC_NUMBER (R_PPC64_TPREL16_HIGH, 112) |
RELOC_NUMBER (R_PPC64_TPREL16_HIGHA, 113) |
RELOC_NUMBER (R_PPC64_DTPREL16_HIGH, 114) |
RELOC_NUMBER (R_PPC64_DTPREL16_HIGHA, 115) |
#ifndef RELOC_MACROS_GEN_FUNC |
/* Fake relocation only used internally by ld. */ |
RELOC_NUMBER (R_PPC64_LO_DS_OPT, 128) |
#endif |
/* Support STT_GNU_IFUNC plt calls. */ |
RELOC_NUMBER (R_PPC64_JMP_IREL, 247) |
RELOC_NUMBER (R_PPC64_IRELATIVE, 248) |
/* These are GNU extensions used in PIC code sequences. */ |
RELOC_NUMBER (R_PPC64_REL16, 249) |
RELOC_NUMBER (R_PPC64_REL16_LO, 250) |
RELOC_NUMBER (R_PPC64_REL16_HI, 251) |
RELOC_NUMBER (R_PPC64_REL16_HA, 252) |
/* These are GNU extensions to enable C++ vtable garbage collection. */ |
RELOC_NUMBER (R_PPC64_GNU_VTINHERIT, 253) |
RELOC_NUMBER (R_PPC64_GNU_VTENTRY, 254) |
END_RELOC_NUMBERS (R_PPC64_max) |
#define IS_PPC64_TLS_RELOC(R) \ |
(((R) >= R_PPC64_TLS && (R) <= R_PPC64_DTPREL16_HIGHESTA) \ |
|| ((R) >= R_PPC64_TPREL16_HIGH && (R) <= R_PPC64_DTPREL16_HIGHA)) |
/* e_flags bits specifying ABI. |
1 for original function descriptor using ABI, |
2 for revised ABI without function descriptors, |
0 for unspecified or not using any features affected by the differences. */ |
#define EF_PPC64_ABI 3 |
/* The ELFv2 ABI uses three bits in the symbol st_other field of a |
function definition to specify the number of instructions between a |
function's global entry point and local entry point. |
The global entry point is used when it is necessary to set up the |
toc pointer (r2) for the function. Callers must enter the global |
entry point with r12 set to the global entry point address. On |
return from the function, r2 may have a different value to that |
which it had on entry. |
The local entry point is used when r2 is known to already be valid |
for the function. There is no requirement on r12 when using the |
local entry point, and on return r2 will contain the same value as |
at entry. |
A value of zero in these bits means that the function has a single |
entry point with no requirement on r12 or r2, and that on return r2 |
will contain the same value as at entry. |
Values of one and seven are reserved. */ |
#define STO_PPC64_LOCAL_BIT 5 |
#define STO_PPC64_LOCAL_MASK (7 << STO_PPC64_LOCAL_BIT) |
// 3 bit other field to bytes. |
static inline unsigned int |
ppc64_decode_local_entry(unsigned int other) |
{ |
return ((1 << other) >> 2) << 2; |
} |
// bytes to field value. |
static inline unsigned int |
ppc64_encode_local_entry(unsigned int val) |
{ |
return (val >= 4 * 4 |
? (val >= 8 * 4 |
? (val >= 16 * 4 ? 6 : 5) |
: 4) |
: (val >= 2 * 4 |
? 3 |
: (val >= 1 * 4 ? 2 : 0))); |
} |
/* st_other to number of bytes. */ |
#define PPC64_LOCAL_ENTRY_OFFSET(other) \ |
ppc64_decode_local_entry (((other) & STO_PPC64_LOCAL_MASK) \ |
>> STO_PPC64_LOCAL_BIT) |
/* number of bytes to st_other. */ |
#define PPC64_SET_LOCAL_ENTRY_OFFSET(val) \ |
ppc64_encode_local_entry (val) << STO_PPC64_LOCAL_BIT |
/* Specify the start of the .glink section. */ |
#define DT_PPC64_GLINK DT_LOPROC |
/* Specify the start and size of the .opd section. */ |
#define DT_PPC64_OPD (DT_LOPROC + 1) |
#define DT_PPC64_OPDSZ (DT_LOPROC + 2) |
/* Specify whether various optimisations are possible. */ |
#define DT_PPC64_OPT (DT_LOPROC + 3) |
#define PPC64_OPT_TLS 1 |
#define PPC64_OPT_MULTI_TOC 2 |
#endif /* _ELF_PPC64_H */ |
/contrib/toolchain/binutils/include/elf/reloc-macros.h |
---|
0,0 → 1,129 |
/* Generic relocation support for BFD. |
Copyright 1998, 1999, 2000, 2003, 2010, 2011 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
/* These macros are used by the various *.h target specific header |
files to either generate an enum containing all the known relocations |
for that target, or if RELOC_MACROS_GEN_FUNC is defined, a recognition |
function is generated instead. (This is used by binutils/readelf.c) |
Given a header file like this: |
START_RELOC_NUMBERS (foo) |
RELOC_NUMBER (R_foo_NONE, 0) |
RELOC_NUMBER (R_foo_32, 1) |
EMPTY_RELOC (R_foo_good) |
FAKE_RELOC (R_foo_illegal, 9) |
END_RELOC_NUMBERS (R_foo_count) |
Then the following will be produced by default (ie if |
RELOC_MACROS_GEN_FUNC is *not* defined). |
enum foo |
{ |
R_foo_NONE = 0, |
R_foo_32 = 1, |
R_foo_good, |
R_foo_illegal = 9, |
R_foo_count |
}; |
Note: The value of the symbol defined in the END_RELOC_NUMBERS |
macro (R_foo_count in the case of the example above) will be |
set to the value of the whichever *_RELOC macro precedes it plus |
one. Therefore if you intend to use the symbol as a sentinel for |
the highest valid macro value you should make sure that the |
preceding *_RELOC macro is the highest valid number. ie a |
declaration like this: |
START_RELOC_NUMBERS (foo) |
RELOC_NUMBER (R_foo_NONE, 0) |
RELOC_NUMBER (R_foo_32, 1) |
FAKE_RELOC (R_foo_illegal, 9) |
FAKE_RELOC (R_foo_synonym, 0) |
END_RELOC_NUMBERS (R_foo_count) |
will result in R_foo_count having a value of 1 (R_foo_synonym + 1) |
rather than 10 or 2 as might be expected. |
Alternatively you can assign a value to END_RELOC_NUMBERS symbol |
explicitly, like this: |
START_RELOC_NUMBERS (foo) |
RELOC_NUMBER (R_foo_NONE, 0) |
RELOC_NUMBER (R_foo_32, 1) |
FAKE_RELOC (R_foo_illegal, 9) |
FAKE_RELOC (R_foo_synonym, 0) |
END_RELOC_NUMBERS (R_foo_count = 2) |
If RELOC_MACROS_GEN_FUNC *is* defined, then instead the |
following function will be generated: |
static const char *foo (unsigned long rtype); |
static const char * |
foo (unsigned long rtype) |
{ |
switch (rtype) |
{ |
case 0: return "R_foo_NONE"; |
case 1: return "R_foo_32"; |
default: return NULL; |
} |
} |
*/ |
#ifndef _RELOC_MACROS_H |
#define _RELOC_MACROS_H |
#ifdef RELOC_MACROS_GEN_FUNC |
/* This function takes the relocation number and returns the |
string version name of the name of that relocation. If |
the relocation is not recognised, NULL is returned. */ |
#define START_RELOC_NUMBERS(name) \ |
static const char *name (unsigned long rtype); \ |
static const char * \ |
name (unsigned long rtype) \ |
{ \ |
switch (rtype) \ |
{ |
#define RELOC_NUMBER(name, number) \ |
case number: return #name; |
#define FAKE_RELOC(name, number) |
#define EMPTY_RELOC(name) |
#define END_RELOC_NUMBERS(name) \ |
default: return NULL; \ |
} \ |
} |
#else /* Default to generating enum. */ |
#define START_RELOC_NUMBERS(name) enum name { |
#define RELOC_NUMBER(name, number) name = number, |
#define FAKE_RELOC(name, number) name = number, |
#define EMPTY_RELOC(name) name, |
#define END_RELOC_NUMBERS(name) name }; |
#endif |
#endif /* _RELOC_MACROS_H */ |
/contrib/toolchain/binutils/include/elf/rl78.h |
---|
0,0 → 1,120 |
/* RL78 ELF support for BFD. |
Copyright (C) 2008-2013 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_RL78_H |
#define _ELF_RL78_H |
#include "elf/reloc-macros.h" |
/* Note that there are a few internal relocation types used by the |
linker to do link-time relaxation. If you update this file, please |
check elf32-rl78.c to see if any of the internal relocations need to |
be, er, relocated. */ |
/* Preliminary relocations. */ |
START_RELOC_NUMBERS (elf_rl78_reloc_type) |
RELOC_NUMBER (R_RL78_NONE, 0x00) |
/* These are for data, and are bi-endian. */ |
RELOC_NUMBER (R_RL78_DIR32, 0x01) /* Was: R_RL78_32. */ |
RELOC_NUMBER (R_RL78_DIR24S, 0x02) /* Was: R_RL78_24. */ |
RELOC_NUMBER (R_RL78_DIR16, 0x03) |
RELOC_NUMBER (R_RL78_DIR16U, 0x04) /* Was: R_RL78_16_UNS. */ |
RELOC_NUMBER (R_RL78_DIR16S, 0x05) /* Was: R_RL78_16. */ |
RELOC_NUMBER (R_RL78_DIR8, 0x06) |
RELOC_NUMBER (R_RL78_DIR8U, 0x07) /* Was: R_RL78_8_UNS. */ |
RELOC_NUMBER (R_RL78_DIR8S, 0x08) /* Was: R_RL78_8. */ |
/* Signed pc-relative values. */ |
RELOC_NUMBER (R_RL78_DIR24S_PCREL, 0x09) /* Was: R_RL78_24_PCREL. */ |
RELOC_NUMBER (R_RL78_DIR16S_PCREL, 0x0a) /* Was: R_RL78_16_PCREL. */ |
RELOC_NUMBER (R_RL78_DIR8S_PCREL, 0x0b) /* Was: R_RL78_8_PCREL. */ |
/* These are for fields in the instructions. */ |
RELOC_NUMBER (R_RL78_DIR16UL, 0x0c) |
RELOC_NUMBER (R_RL78_DIR16UW, 0x0d) |
RELOC_NUMBER (R_RL78_DIR8UL, 0x0e) |
RELOC_NUMBER (R_RL78_DIR8UW, 0x0f) |
RELOC_NUMBER (R_RL78_DIR32_REV, 0x10) |
RELOC_NUMBER (R_RL78_DIR16_REV, 0x11) |
RELOC_NUMBER (R_RL78_DIR3U_PCREL, 0x12) |
/* These are extensions added by Red Hat. */ |
RELOC_NUMBER (R_RL78_RH_RELAX, 0x2d) /* Marks opcodes suitable for linker relaxation. */ |
RELOC_NUMBER (R_RL78_RH_SFR, 0x2e) /* SFR addresses - internal use only. */ |
RELOC_NUMBER (R_RL78_RH_SADDR, 0x2f) /* SADDR addresses - internal use only.. */ |
/* These are for complex relocs. */ |
RELOC_NUMBER (R_RL78_ABS32, 0x41) |
RELOC_NUMBER (R_RL78_ABS24S, 0x42) |
RELOC_NUMBER (R_RL78_ABS16, 0x43) |
RELOC_NUMBER (R_RL78_ABS16U, 0x44) |
RELOC_NUMBER (R_RL78_ABS16S, 0x45) |
RELOC_NUMBER (R_RL78_ABS8, 0x46) |
RELOC_NUMBER (R_RL78_ABS8U, 0x47) |
RELOC_NUMBER (R_RL78_ABS8S, 0x48) |
RELOC_NUMBER (R_RL78_ABS24S_PCREL, 0x49) |
RELOC_NUMBER (R_RL78_ABS16S_PCREL, 0x4a) |
RELOC_NUMBER (R_RL78_ABS8S_PCREL, 0x4b) |
RELOC_NUMBER (R_RL78_ABS16UL, 0x4c) |
RELOC_NUMBER (R_RL78_ABS16UW, 0x4d) |
RELOC_NUMBER (R_RL78_ABS8UL, 0x4e) |
RELOC_NUMBER (R_RL78_ABS8UW, 0x4f) |
RELOC_NUMBER (R_RL78_ABS32_REV, 0x50) |
RELOC_NUMBER (R_RL78_ABS16_REV, 0x51) |
RELOC_NUMBER (R_RL78_SYM, 0x80) |
RELOC_NUMBER (R_RL78_OPneg, 0x81) |
RELOC_NUMBER (R_RL78_OPadd, 0x82) |
RELOC_NUMBER (R_RL78_OPsub, 0x83) |
RELOC_NUMBER (R_RL78_OPmul, 0x84) |
RELOC_NUMBER (R_RL78_OPdiv, 0x85) |
RELOC_NUMBER (R_RL78_OPshla, 0x86) |
RELOC_NUMBER (R_RL78_OPshra, 0x87) |
RELOC_NUMBER (R_RL78_OPsctsize, 0x88) |
RELOC_NUMBER (R_RL78_OPscttop, 0x8d) |
RELOC_NUMBER (R_RL78_OPand, 0x90) |
RELOC_NUMBER (R_RL78_OPor, 0x91) |
RELOC_NUMBER (R_RL78_OPxor, 0x92) |
RELOC_NUMBER (R_RL78_OPnot, 0x93) |
RELOC_NUMBER (R_RL78_OPmod, 0x94) |
RELOC_NUMBER (R_RL78_OPromtop, 0x95) |
RELOC_NUMBER (R_RL78_OPramtop, 0x96) |
END_RELOC_NUMBERS (R_RL78_max) |
#define EF_RL78_CPU_RL78 0x00000079 /* FIXME: correct value? */ |
#define EF_RL78_CPU_MASK 0x0000007F /* specific cpu bits. */ |
#define EF_RL78_ALL_FLAGS (EF_RL78_CPU_MASK) |
/* Values for the e_flags field in the ELF header. */ |
#define E_FLAG_RL78_64BIT_DOUBLES (1 << 0) |
#define E_FLAG_RL78_DSP (1 << 1) /* Defined in the RL78 CPU Object file specification, but not explained. */ |
#define E_FLAG_RL78_G10 (1 << 2) /* CPU is missing register banks 1-3, so uses different ABI. */ |
/* These define the addend field of R_RL78_RH_RELAX relocations. */ |
#define RL78_RELAXA_BRA 0x00000010 /* Any type of branch (must be decoded). */ |
#define RL78_RELAXA_ADDR16 0x00000020 /* addr16->sfr/saddr opportunity */ |
#define RL78_RELAXA_RNUM 0x0000000f /* Number of associated relocations. */ |
/* These mark the place where alignment is requested, and the place where the filler bytes end. */ |
#define RL78_RELAXA_ALIGN 0x10000000 /* Start alignment; the remaining bits are the alignment value. */ |
#define RL78_RELAXA_ELIGN 0x20000000 /* End alignment; the remaining bits are the alignment value. */ |
#define RL78_RELAXA_ANUM 0x00ffffff /* Alignment amount, in bytes (i.e. .balign). */ |
#endif /* _ELF_RL78_H */ |
/contrib/toolchain/binutils/include/elf/rx.h |
---|
0,0 → 1,136 |
/* RX ELF support for BFD. |
Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_RX_H |
#define _ELF_RX_H |
#include "elf/reloc-macros.h" |
/* Note that there are a few internal relocation types used by the |
linker to do link-time relaxation. If you update this file, please |
check elf32-rx.c to see if any of the internal relocations need to |
be, er, relocated. */ |
/* Preliminary relocations. */ |
START_RELOC_NUMBERS (elf_rx_reloc_type) |
RELOC_NUMBER (R_RX_NONE, 0x00) |
/* These are for data, and are bi-endian. */ |
RELOC_NUMBER (R_RX_DIR32, 0x01) /* Was: R_RX_32. */ |
RELOC_NUMBER (R_RX_DIR24S, 0x02) /* Was: R_RX_24. */ |
RELOC_NUMBER (R_RX_DIR16, 0x03) |
RELOC_NUMBER (R_RX_DIR16U, 0x04) /* Was: R_RX_16_UNS. */ |
RELOC_NUMBER (R_RX_DIR16S, 0x05) /* Was: R_RX_16. */ |
RELOC_NUMBER (R_RX_DIR8, 0x06) |
RELOC_NUMBER (R_RX_DIR8U, 0x07) /* Was: R_RX_8_UNS. */ |
RELOC_NUMBER (R_RX_DIR8S, 0x08) /* Was: R_RX_8. */ |
/* Signed pc-relative values. */ |
RELOC_NUMBER (R_RX_DIR24S_PCREL, 0x09) /* Was: R_RX_24_PCREL. */ |
RELOC_NUMBER (R_RX_DIR16S_PCREL, 0x0a) /* Was: R_RX_16_PCREL. */ |
RELOC_NUMBER (R_RX_DIR8S_PCREL, 0x0b) /* Was: R_RX_8_PCREL. */ |
/* These are for fields in the instructions. */ |
RELOC_NUMBER (R_RX_DIR16UL, 0x0c) |
RELOC_NUMBER (R_RX_DIR16UW, 0x0d) |
RELOC_NUMBER (R_RX_DIR8UL, 0x0e) |
RELOC_NUMBER (R_RX_DIR8UW, 0x0f) |
RELOC_NUMBER (R_RX_DIR32_REV, 0x10) |
RELOC_NUMBER (R_RX_DIR16_REV, 0x11) |
RELOC_NUMBER (R_RX_DIR3U_PCREL, 0x12) |
/* These are extensions added by Red Hat. */ |
RELOC_NUMBER (R_RX_RH_3_PCREL, 0x20) /* Like R_RX_DIR8S_PCREL but only 3-bits. */ |
RELOC_NUMBER (R_RX_RH_16_OP, 0x21) /* Like R_RX_DIR16 but for opcodes - always big endian. */ |
RELOC_NUMBER (R_RX_RH_24_OP, 0x22) /* Like R_RX_DIR24S but for opcodes - always big endian. */ |
RELOC_NUMBER (R_RX_RH_32_OP, 0x23) /* Like R_RX_DIR32 but for opcodes - always big endian. */ |
RELOC_NUMBER (R_RX_RH_24_UNS, 0x24) /* Like R_RX_DIR24S but for unsigned values. */ |
RELOC_NUMBER (R_RX_RH_8_NEG, 0x25) /* Like R_RX_DIR8 but -x is stored. */ |
RELOC_NUMBER (R_RX_RH_16_NEG, 0x26) /* Like R_RX_DIR16 but -x is stored. */ |
RELOC_NUMBER (R_RX_RH_24_NEG, 0x27) /* Like R_RX_DIR24S but -x is stored. */ |
RELOC_NUMBER (R_RX_RH_32_NEG, 0x28) /* Like R_RX_DIR32 but -x is stored. */ |
RELOC_NUMBER (R_RX_RH_DIFF, 0x29) /* Subtract from a previous relocation. */ |
RELOC_NUMBER (R_RX_RH_GPRELB, 0x2a) /* Byte value, relative to __gp. */ |
RELOC_NUMBER (R_RX_RH_GPRELW, 0x2b) /* Word value, relative to __gp. */ |
RELOC_NUMBER (R_RX_RH_GPRELL, 0x2c) /* Long value, relative to __gp. */ |
RELOC_NUMBER (R_RX_RH_RELAX, 0x2d) /* Marks opcodes suitable for linker relaxation. */ |
/* These are for complex relocs. */ |
RELOC_NUMBER (R_RX_ABS32, 0x41) |
RELOC_NUMBER (R_RX_ABS24S, 0x42) |
RELOC_NUMBER (R_RX_ABS16, 0x43) |
RELOC_NUMBER (R_RX_ABS16U, 0x44) |
RELOC_NUMBER (R_RX_ABS16S, 0x45) |
RELOC_NUMBER (R_RX_ABS8, 0x46) |
RELOC_NUMBER (R_RX_ABS8U, 0x47) |
RELOC_NUMBER (R_RX_ABS8S, 0x48) |
RELOC_NUMBER (R_RX_ABS24S_PCREL, 0x49) |
RELOC_NUMBER (R_RX_ABS16S_PCREL, 0x4a) |
RELOC_NUMBER (R_RX_ABS8S_PCREL, 0x4b) |
RELOC_NUMBER (R_RX_ABS16UL, 0x4c) |
RELOC_NUMBER (R_RX_ABS16UW, 0x4d) |
RELOC_NUMBER (R_RX_ABS8UL, 0x4e) |
RELOC_NUMBER (R_RX_ABS8UW, 0x4f) |
RELOC_NUMBER (R_RX_ABS32_REV, 0x50) |
RELOC_NUMBER (R_RX_ABS16_REV, 0x51) |
RELOC_NUMBER (R_RX_SYM, 0x80) |
RELOC_NUMBER (R_RX_OPneg, 0x81) |
RELOC_NUMBER (R_RX_OPadd, 0x82) |
RELOC_NUMBER (R_RX_OPsub, 0x83) |
RELOC_NUMBER (R_RX_OPmul, 0x84) |
RELOC_NUMBER (R_RX_OPdiv, 0x85) |
RELOC_NUMBER (R_RX_OPshla, 0x86) |
RELOC_NUMBER (R_RX_OPshra, 0x87) |
RELOC_NUMBER (R_RX_OPsctsize, 0x88) |
RELOC_NUMBER (R_RX_OPscttop, 0x8d) |
RELOC_NUMBER (R_RX_OPand, 0x90) |
RELOC_NUMBER (R_RX_OPor, 0x91) |
RELOC_NUMBER (R_RX_OPxor, 0x92) |
RELOC_NUMBER (R_RX_OPnot, 0x93) |
RELOC_NUMBER (R_RX_OPmod, 0x94) |
RELOC_NUMBER (R_RX_OPromtop, 0x95) |
RELOC_NUMBER (R_RX_OPramtop, 0x96) |
END_RELOC_NUMBERS (R_RX_max) |
#define EF_RX_CPU_RX 0x00000079 /* FIXME: this collides with the E_FLAG_RX_... values below. */ |
#define EF_RX_CPU_MASK 0x0000007F /* specific cpu bits. */ |
#define EF_RX_ALL_FLAGS (EF_RX_CPU_MASK) |
/* Values for the e_flags field in the ELF header. */ |
#define E_FLAG_RX_64BIT_DOUBLES (1 << 0) |
#define E_FLAG_RX_DSP (1 << 1) /* Defined in the RX CPU Object file specification, but not explained. */ |
#define E_FLAG_RX_PID (1 << 2) /* Unofficial - DJ */ |
#define E_FLAG_RX_ABI (1 << 3) /* Binary passes stacked arguments using natural alignment. Unofficial - NC. */ |
/* These define the addend field of R_RX_RH_RELAX relocations. */ |
#define RX_RELAXA_IMM6 0x00000010 /* Imm8/16/24/32 at bit offset 6. */ |
#define RX_RELAXA_IMM12 0x00000020 /* Imm8/16/24/32 at bit offset 12. */ |
#define RX_RELAXA_DSP4 0x00000040 /* Dsp0/8/16 at bit offset 4. */ |
#define RX_RELAXA_DSP6 0x00000080 /* Dsp0/8/16 at bit offset 6. */ |
#define RX_RELAXA_DSP14 0x00000100 /* Dsp0/8/16 at bit offset 14. */ |
#define RX_RELAXA_BRA 0x00000200 /* Any type of branch (must be decoded). */ |
#define RX_RELAXA_RNUM 0x0000000f /* Number of associated relocations. */ |
/* These mark the place where alignment is requested, and the place where the filler bytes end. */ |
#define RX_RELAXA_ALIGN 0x10000000 /* Start alignment; the remaining bits are the alignment value. */ |
#define RX_RELAXA_ELIGN 0x20000000 /* End alignment; the remaining bits are the alignment value. */ |
#define RX_RELAXA_ANUM 0x00ffffff /* Alignment amount, in bytes (i.e. .balign). */ |
#endif /* _ELF_RX_H */ |
/contrib/toolchain/binutils/include/elf/s390.h |
---|
0,0 → 1,134 |
/* 390 ELF support for BFD. |
Copyright 2000, 2001, 2003, 2010 Free Software Foundation, Inc. |
Contributed by Carl B. Pedersen and Martin Schwidefsky. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA |
02110-1301, USA. */ |
#ifndef _ELF_390_H |
#define _ELF_390_H |
/* Processor specific flags for the ELF header e_flags field. */ |
/* Symbol types. */ |
#define STACK_REG 15 /* Global Stack reg */ |
#define BACKL_REG 14 /* Global Backlink reg */ |
#define BASE_REG 13 /* Global Base reg */ |
#define GOT_REG 12 /* Holds addr of GOT */ |
#include "elf/reloc-macros.h" |
/* Processor specific flags for the ELF header e_flags field. */ |
#define EF_S390_HIGH_GPRS 0x00000001 |
/* Relocation types. */ |
START_RELOC_NUMBERS (elf_s390_reloc_type) |
RELOC_NUMBER (R_390_NONE, 0) /* No reloc. */ |
RELOC_NUMBER (R_390_8, 1) /* Direct 8 bit. */ |
RELOC_NUMBER (R_390_12, 2) /* Direct 12 bit. */ |
RELOC_NUMBER (R_390_16, 3) /* Direct 16 bit. */ |
RELOC_NUMBER (R_390_32, 4) /* Direct 32 bit. */ |
RELOC_NUMBER (R_390_PC32, 5) /* PC relative 32 bit. */ |
RELOC_NUMBER (R_390_GOT12, 6) /* 12 bit GOT offset. */ |
RELOC_NUMBER (R_390_GOT32, 7) /* 32 bit GOT offset. */ |
RELOC_NUMBER (R_390_PLT32, 8) /* 32 bit PC relative PLT address. */ |
RELOC_NUMBER (R_390_COPY, 9) /* Copy symbol at runtime. */ |
RELOC_NUMBER (R_390_GLOB_DAT, 10) /* Create GOT entry. */ |
RELOC_NUMBER (R_390_JMP_SLOT, 11) /* Create PLT entry. */ |
RELOC_NUMBER (R_390_RELATIVE, 12) /* Adjust by program base. */ |
RELOC_NUMBER (R_390_GOTOFF32, 13) /* 32 bit offset to GOT. */ |
RELOC_NUMBER (R_390_GOTPC, 14) /* 32 bit PC relative offset to GOT. */ |
RELOC_NUMBER (R_390_GOT16, 15) /* 16 bit GOT offset. */ |
RELOC_NUMBER (R_390_PC16, 16) /* PC relative 16 bit. */ |
RELOC_NUMBER (R_390_PC12DBL, 62) /* PC relative 12 bit shifted by 1. */ |
RELOC_NUMBER (R_390_PLT12DBL, 63) /* 12 bit PC rel. PLT shifted by 1. */ |
RELOC_NUMBER (R_390_PC16DBL, 17) /* PC relative 16 bit shifted by 1. */ |
RELOC_NUMBER (R_390_PLT16DBL, 18) /* 16 bit PC rel. PLT shifted by 1. */ |
RELOC_NUMBER (R_390_PC24DBL, 64) /* PC relative 24 bit shifted by 1. */ |
RELOC_NUMBER (R_390_PLT24DBL, 65) /* 24 bit PC rel. PLT shifted by 1. */ |
RELOC_NUMBER (R_390_PC32DBL, 19) /* PC relative 32 bit shifted by 1. */ |
RELOC_NUMBER (R_390_PLT32DBL, 20) /* 32 bit PC rel. PLT shifted by 1. */ |
RELOC_NUMBER (R_390_GOTPCDBL, 21) /* 32 bit PC rel. GOT shifted by 1. */ |
RELOC_NUMBER (R_390_64, 22) /* Direct 64 bit. */ |
RELOC_NUMBER (R_390_PC64, 23) /* PC relative 64 bit. */ |
RELOC_NUMBER (R_390_GOT64, 24) /* 64 bit GOT offset. */ |
RELOC_NUMBER (R_390_PLT64, 25) /* 64 bit PC relative PLT address. */ |
RELOC_NUMBER (R_390_GOTENT, 26) /* 32 bit PC rel. to GOT entry >> 1. */ |
RELOC_NUMBER (R_390_GOTOFF16, 27) /* 16 bit offset to GOT. */ |
RELOC_NUMBER (R_390_GOTOFF64, 28) /* 64 bit offset to GOT. */ |
RELOC_NUMBER (R_390_GOTPLT12, 29) /* 12 bit offset to jump slot. */ |
RELOC_NUMBER (R_390_GOTPLT16, 30) /* 16 bit offset to jump slot. */ |
RELOC_NUMBER (R_390_GOTPLT32, 31) /* 32 bit offset to jump slot. */ |
RELOC_NUMBER (R_390_GOTPLT64, 32) /* 64 bit offset to jump slot. */ |
RELOC_NUMBER (R_390_GOTPLTENT, 33) /* 32 bit rel. offset to jump slot. */ |
RELOC_NUMBER (R_390_PLTOFF16, 34) /* 16 bit offset from GOT to PLT. */ |
RELOC_NUMBER (R_390_PLTOFF32, 35) /* 32 bit offset from GOT to PLT. */ |
RELOC_NUMBER (R_390_PLTOFF64, 36) /* 16 bit offset from GOT to PLT. */ |
RELOC_NUMBER (R_390_TLS_LOAD, 37) /* Tag for load insn in TLS code. */ |
RELOC_NUMBER (R_390_TLS_GDCALL, 38) /* Tag for function call in general |
dynamic TLS code. */ |
RELOC_NUMBER (R_390_TLS_LDCALL, 39) /* Tag for function call in local |
dynamic TLS code. */ |
RELOC_NUMBER (R_390_TLS_GD32, 40) /* Direct 32 bit for general dynamic |
thread local data. */ |
RELOC_NUMBER (R_390_TLS_GD64, 41) /* Direct 64 bit for general dynamic |
thread local data. */ |
RELOC_NUMBER (R_390_TLS_GOTIE12, 42)/* 12 bit GOT offset for static TLS |
block offset. */ |
RELOC_NUMBER (R_390_TLS_GOTIE32, 43)/* 32 bit GOT offset for static TLS |
block offset. */ |
RELOC_NUMBER (R_390_TLS_GOTIE64, 44)/* 64 bit GOT offset for static TLS |
block offset. */ |
RELOC_NUMBER (R_390_TLS_LDM32, 45) /* Direct 32 bit for local dynamic |
thread local data in LD code. */ |
RELOC_NUMBER (R_390_TLS_LDM64, 46) /* Direct 64 bit for local dynamic |
thread local data in LD code. */ |
RELOC_NUMBER (R_390_TLS_IE32, 47) /* 32 bit address of GOT entry for |
negated static TLS block offset. */ |
RELOC_NUMBER (R_390_TLS_IE64, 48) /* 64 bit address of GOT entry for |
negated static TLS block offset. */ |
RELOC_NUMBER (R_390_TLS_IEENT, 49) /* 32 bit rel. offset to GOT entry for |
negated static TLS block offset. */ |
RELOC_NUMBER (R_390_TLS_LE32, 50) /* 32 bit negated offset relative to |
static TLS block. */ |
RELOC_NUMBER (R_390_TLS_LE64, 51) /* 64 bit negated offset relative to |
static TLS block. */ |
RELOC_NUMBER (R_390_TLS_LDO32, 52) /* 32 bit offset relative to TLS |
block. */ |
RELOC_NUMBER (R_390_TLS_LDO64, 53) /* 64 bit offset relative to TLS |
block. */ |
RELOC_NUMBER (R_390_TLS_DTPMOD, 54) /* ID of module containing symbol. */ |
RELOC_NUMBER (R_390_TLS_DTPOFF, 55) /* Offset in TLS block. */ |
RELOC_NUMBER (R_390_TLS_TPOFF, 56) /* Negate offset in static TLS |
block. */ |
RELOC_NUMBER (R_390_20, 57) /* Direct 20 bit. */ |
RELOC_NUMBER (R_390_GOT20, 58) /* 20 bit GOT offset. */ |
RELOC_NUMBER (R_390_GOTPLT20, 59) /* 20 bit offset to jump slot. */ |
RELOC_NUMBER (R_390_TLS_GOTIE20, 60)/* 20 bit GOT offset for statis TLS |
block offset. */ |
RELOC_NUMBER (R_390_IRELATIVE, 61) /* IFUNC relocation. */ |
/* These are GNU extensions to enable C++ vtable garbage collection. */ |
RELOC_NUMBER (R_390_GNU_VTINHERIT, 250) |
RELOC_NUMBER (R_390_GNU_VTENTRY, 251) |
END_RELOC_NUMBERS (R_390_max) |
#endif /* _ELF_390_H */ |
/contrib/toolchain/binutils/include/elf/score.h |
---|
0,0 → 1,130 |
/* Score ELF support for BFD. |
Copyright 2006, 2007, 2008, 2009 Free Software Foundation, Inc. |
Contributed by |
Brain.lin (brain.lin@sunplusct.com) |
Mei Ligang (ligang@sunnorth.com.cn) |
Pei-Lin Tsai (pltsai@sunplus.com) |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_SCORE_H |
#define _ELF_SCORE_H |
#include "elf/reloc-macros.h" |
#define SCORE_SIMULATOR_ACTIVE 1 |
#define OPC_PTMASK 0xc0000000 /* Parity-bit Mask. */ |
#define OPC16_PTMASK 0x00008000 |
/* The parity-bit denotes. */ |
#define OPC_32 0xc0000000 /* Denotes 32b instruction, (default). */ |
#define OPC_16 0x00000000 /* Denotes 16b instruction. */ |
#define OPC_PE 0x8000 /* Denotes parallel-execution instructions. */ |
#define GP_DISP_LABEL "_gp_disp" |
/* Processor specific flags for the ELF header e_flags field: */ |
#define EF_SCORE_MACH 0xffff0000 |
#define EF_OMIT_PIC_FIXDD 0x0fff0000 |
#define E_SCORE_MACH_SCORE3 0x00030000 |
#define E_SCORE_MACH_SCORE7 0x00070000 |
/* File contains position independent code. */ |
#define EF_SCORE_PIC 0x80000000 |
/* Fix data dependency. */ |
#define EF_SCORE_FIXDEP 0x40000000 |
/* Defined and allocated common symbol. Value is virtual address. If |
relocated, alignment must be preserved. */ |
#define SHN_SCORE_TEXT (SHN_LORESERVE + 1) |
#define SHN_SCORE_DATA (SHN_LORESERVE + 2) |
/* Small common symbol. */ |
#define SHN_SCORE_SCOMMON (SHN_LORESERVE + 3) |
/* Processor specific section flags. */ |
/* This section must be in the global data area. */ |
#define SHF_SCORE_GPREL 0x10000000 |
/* This section should be merged. */ |
#define SHF_SCORE_MERGE 0x20000000 |
/* This section contains address data of size implied by section |
element size. */ |
#define SHF_SCORE_ADDR 0x40000000 |
/* This section contains string data. */ |
#define SHF_SCORE_STRING 0x80000000 |
/* This section may not be stripped. */ |
#define SHF_SCORE_NOSTRIP 0x08000000 |
/* This section is local to threads. */ |
#define SHF_SCORE_LOCAL 0x04000000 |
/* Linker should generate implicit weak names for this section. */ |
#define SHF_SCORE_NAMES 0x02000000 |
/* Section contais text/data which may be replicated in other sections. |
Linker should retain only one copy. */ |
#define SHF_SCORE_NODUPES 0x01000000 |
/* Processor specific dynamic array tags. */ |
/* Base address of the segment. */ |
#define DT_SCORE_BASE_ADDRESS 0x70000001 |
/* Number of local global offset table entries. */ |
#define DT_SCORE_LOCAL_GOTNO 0x70000002 |
/* Number of entries in the .dynsym section. */ |
#define DT_SCORE_SYMTABNO 0x70000003 |
/* Index of first dynamic symbol in global offset table. */ |
#define DT_SCORE_GOTSYM 0x70000004 |
/* Index of first external dynamic symbol not referenced locally. */ |
#define DT_SCORE_UNREFEXTNO 0x70000005 |
/* Number of page table entries in global offset table. */ |
#define DT_SCORE_HIPAGENO 0x70000006 |
/* Processor specific section types. */ |
/* Relocation types. */ |
START_RELOC_NUMBERS (elf_score_reloc_type) |
RELOC_NUMBER (R_SCORE_NONE, 0) |
RELOC_NUMBER (R_SCORE_HI16, 1) |
RELOC_NUMBER (R_SCORE_LO16, 2) |
RELOC_NUMBER (R_SCORE_BCMP, 3) |
RELOC_NUMBER (R_SCORE_24, 4) |
RELOC_NUMBER (R_SCORE_PC19, 5) |
RELOC_NUMBER (R_SCORE16_11, 6) |
RELOC_NUMBER (R_SCORE16_PC8, 7) |
RELOC_NUMBER (R_SCORE_ABS32, 8) |
RELOC_NUMBER (R_SCORE_ABS16, 9) |
RELOC_NUMBER (R_SCORE_DUMMY2, 10) |
RELOC_NUMBER (R_SCORE_GP15, 11) |
RELOC_NUMBER (R_SCORE_GNU_VTINHERIT, 12) |
RELOC_NUMBER (R_SCORE_GNU_VTENTRY, 13) |
RELOC_NUMBER (R_SCORE_GOT15, 14) |
RELOC_NUMBER (R_SCORE_GOT_LO16, 15) |
RELOC_NUMBER (R_SCORE_CALL15, 16) |
RELOC_NUMBER (R_SCORE_GPREL32, 17) |
RELOC_NUMBER (R_SCORE_REL32, 18) |
RELOC_NUMBER (R_SCORE_DUMMY_HI16, 19) |
RELOC_NUMBER (R_SCORE_IMM30, 20) |
RELOC_NUMBER (R_SCORE_IMM32, 21) |
END_RELOC_NUMBERS (R_SCORE_max) |
#endif /* _ELF_SCORE_H */ |
/contrib/toolchain/binutils/include/elf/sh.h |
---|
0,0 → 1,250 |
/* SH ELF support for BFD. |
Copyright 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2010 |
Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_SH_H |
#define _ELF_SH_H |
/* Processor specific flags for the ELF header e_flags field. */ |
#define EF_SH_MACH_MASK 0x1f |
#define EF_SH_UNKNOWN 0 /* For backwards compatibility. */ |
#define EF_SH1 1 |
#define EF_SH2 2 |
#define EF_SH3 3 |
#define EF_SH_DSP 4 |
#define EF_SH3_DSP 5 |
#define EF_SH4AL_DSP 6 |
#define EF_SH3E 8 |
#define EF_SH4 9 |
#define EF_SH2E 11 |
#define EF_SH4A 12 |
#define EF_SH2A 13 |
#define EF_SH4_NOFPU 16 |
#define EF_SH4A_NOFPU 17 |
#define EF_SH4_NOMMU_NOFPU 18 |
#define EF_SH2A_NOFPU 19 |
#define EF_SH3_NOMMU 20 |
#define EF_SH2A_SH4_NOFPU 21 |
#define EF_SH2A_SH3_NOFPU 22 |
#define EF_SH2A_SH4 23 |
#define EF_SH2A_SH3E 24 |
/* This one can only mix in objects from other EF_SH5 objects. */ |
#define EF_SH5 10 |
/* Define the mapping from ELF to bfd mach numbers. |
bfd_mach_* are defined in bfd_in2.h (generated from |
archures.c). */ |
#define EF_SH_BFD_TABLE \ |
/* EF_SH_UNKNOWN */ bfd_mach_sh , \ |
/* EF_SH1 */ bfd_mach_sh , \ |
/* EF_SH2 */ bfd_mach_sh2 , \ |
/* EF_SH3 */ bfd_mach_sh3 , \ |
/* EF_SH_DSP */ bfd_mach_sh_dsp , \ |
/* EF_SH3_DSP */ bfd_mach_sh3_dsp , \ |
/* EF_SHAL_DSP */ bfd_mach_sh4al_dsp , \ |
/* 7 */ 0, \ |
/* EF_SH3E */ bfd_mach_sh3e , \ |
/* EF_SH4 */ bfd_mach_sh4 , \ |
/* EF_SH5 */ 0, \ |
/* EF_SH2E */ bfd_mach_sh2e , \ |
/* EF_SH4A */ bfd_mach_sh4a , \ |
/* EF_SH2A */ bfd_mach_sh2a , \ |
/* 14, 15 */ 0, 0, \ |
/* EF_SH4_NOFPU */ bfd_mach_sh4_nofpu , \ |
/* EF_SH4A_NOFPU */ bfd_mach_sh4a_nofpu , \ |
/* EF_SH4_NOMMU_NOFPU */ bfd_mach_sh4_nommu_nofpu, \ |
/* EF_SH2A_NOFPU */ bfd_mach_sh2a_nofpu , \ |
/* EF_SH3_NOMMU */ bfd_mach_sh3_nommu , \ |
/* EF_SH2A_SH4_NOFPU */ bfd_mach_sh2a_nofpu_or_sh4_nommu_nofpu, \ |
/* EF_SH2A_SH3_NOFPU */ bfd_mach_sh2a_nofpu_or_sh3_nommu, \ |
/* EF_SH2A_SH4 */ bfd_mach_sh2a_or_sh4 , \ |
/* EF_SH2A_SH3E */ bfd_mach_sh2a_or_sh3e |
/* Convert arch_sh* into EF_SH*. */ |
int sh_find_elf_flags (unsigned int arch_set); |
/* Convert bfd_mach_* into EF_SH*. */ |
int sh_elf_get_flags_from_mach (unsigned long mach); |
/* Other e_flags bits. */ |
#define EF_SH_PIC 0x100 /* Segments of an FDPIC binary may |
be relocated independently. */ |
#define EF_SH_FDPIC 0x8000 /* Uses the FDPIC ABI. */ |
/* Flags for the st_other symbol field. |
Keep away from the STV_ visibility flags (bit 0..1). */ |
/* A reference to this symbol should by default add 1. */ |
#define STO_SH5_ISA32 (1 << 2) |
/* Section contains only SHmedia code (no SHcompact code). */ |
#define SHF_SH5_ISA32 0x40000000 |
/* Section contains both SHmedia and SHcompact code, and possibly also |
constants. */ |
#define SHF_SH5_ISA32_MIXED 0x20000000 |
/* If applied to a .cranges section, marks that the section is sorted by |
increasing cr_addr values. */ |
#define SHT_SH5_CR_SORTED 0x80000001 |
/* Symbol should be handled as DataLabel (attached to global SHN_UNDEF |
symbols). */ |
#define STT_DATALABEL STT_LOPROC |
#include "elf/reloc-macros.h" |
/* Relocations. */ |
/* Relocations 10-32 and 128-255 are GNU extensions. |
25..32 and 10 are used for relaxation. */ |
START_RELOC_NUMBERS (elf_sh_reloc_type) |
RELOC_NUMBER (R_SH_NONE, 0) |
RELOC_NUMBER (R_SH_DIR32, 1) |
RELOC_NUMBER (R_SH_REL32, 2) |
RELOC_NUMBER (R_SH_DIR8WPN, 3) |
RELOC_NUMBER (R_SH_IND12W, 4) |
RELOC_NUMBER (R_SH_DIR8WPL, 5) |
RELOC_NUMBER (R_SH_DIR8WPZ, 6) |
RELOC_NUMBER (R_SH_DIR8BP, 7) |
RELOC_NUMBER (R_SH_DIR8W, 8) |
RELOC_NUMBER (R_SH_DIR8L, 9) |
RELOC_NUMBER (R_SH_LOOP_START, 10) |
RELOC_NUMBER (R_SH_LOOP_END, 11) |
FAKE_RELOC (R_SH_FIRST_INVALID_RELOC, 12) |
FAKE_RELOC (R_SH_LAST_INVALID_RELOC, 21) |
RELOC_NUMBER (R_SH_GNU_VTINHERIT, 22) |
RELOC_NUMBER (R_SH_GNU_VTENTRY, 23) |
RELOC_NUMBER (R_SH_SWITCH8, 24) |
RELOC_NUMBER (R_SH_SWITCH16, 25) |
RELOC_NUMBER (R_SH_SWITCH32, 26) |
RELOC_NUMBER (R_SH_USES, 27) |
RELOC_NUMBER (R_SH_COUNT, 28) |
RELOC_NUMBER (R_SH_ALIGN, 29) |
RELOC_NUMBER (R_SH_CODE, 30) |
RELOC_NUMBER (R_SH_DATA, 31) |
RELOC_NUMBER (R_SH_LABEL, 32) |
RELOC_NUMBER (R_SH_DIR16, 33) |
RELOC_NUMBER (R_SH_DIR8, 34) |
RELOC_NUMBER (R_SH_DIR8UL, 35) |
RELOC_NUMBER (R_SH_DIR8UW, 36) |
RELOC_NUMBER (R_SH_DIR8U, 37) |
RELOC_NUMBER (R_SH_DIR8SW, 38) |
RELOC_NUMBER (R_SH_DIR8S, 39) |
RELOC_NUMBER (R_SH_DIR4UL, 40) |
RELOC_NUMBER (R_SH_DIR4UW, 41) |
RELOC_NUMBER (R_SH_DIR4U, 42) |
RELOC_NUMBER (R_SH_PSHA, 43) |
RELOC_NUMBER (R_SH_PSHL, 44) |
RELOC_NUMBER (R_SH_DIR5U, 45) |
RELOC_NUMBER (R_SH_DIR6U, 46) |
RELOC_NUMBER (R_SH_DIR6S, 47) |
RELOC_NUMBER (R_SH_DIR10S, 48) |
RELOC_NUMBER (R_SH_DIR10SW, 49) |
RELOC_NUMBER (R_SH_DIR10SL, 50) |
RELOC_NUMBER (R_SH_DIR10SQ, 51) |
FAKE_RELOC (R_SH_FIRST_INVALID_RELOC_2, 52) |
FAKE_RELOC (R_SH_LAST_INVALID_RELOC_2, 52) |
RELOC_NUMBER (R_SH_DIR16S, 53) |
FAKE_RELOC (R_SH_FIRST_INVALID_RELOC_3, 54) |
FAKE_RELOC (R_SH_LAST_INVALID_RELOC_3, 143) |
RELOC_NUMBER (R_SH_TLS_GD_32, 144) |
RELOC_NUMBER (R_SH_TLS_LD_32, 145) |
RELOC_NUMBER (R_SH_TLS_LDO_32, 146) |
RELOC_NUMBER (R_SH_TLS_IE_32, 147) |
RELOC_NUMBER (R_SH_TLS_LE_32, 148) |
RELOC_NUMBER (R_SH_TLS_DTPMOD32, 149) |
RELOC_NUMBER (R_SH_TLS_DTPOFF32, 150) |
RELOC_NUMBER (R_SH_TLS_TPOFF32, 151) |
FAKE_RELOC (R_SH_FIRST_INVALID_RELOC_4, 152) |
FAKE_RELOC (R_SH_LAST_INVALID_RELOC_4, 159) |
RELOC_NUMBER (R_SH_GOT32, 160) |
RELOC_NUMBER (R_SH_PLT32, 161) |
RELOC_NUMBER (R_SH_COPY, 162) |
RELOC_NUMBER (R_SH_GLOB_DAT, 163) |
RELOC_NUMBER (R_SH_JMP_SLOT, 164) |
RELOC_NUMBER (R_SH_RELATIVE, 165) |
RELOC_NUMBER (R_SH_GOTOFF, 166) |
RELOC_NUMBER (R_SH_GOTPC, 167) |
RELOC_NUMBER (R_SH_GOTPLT32, 168) |
RELOC_NUMBER (R_SH_GOT_LOW16, 169) |
RELOC_NUMBER (R_SH_GOT_MEDLOW16, 170) |
RELOC_NUMBER (R_SH_GOT_MEDHI16, 171) |
RELOC_NUMBER (R_SH_GOT_HI16, 172) |
RELOC_NUMBER (R_SH_GOTPLT_LOW16, 173) |
RELOC_NUMBER (R_SH_GOTPLT_MEDLOW16, 174) |
RELOC_NUMBER (R_SH_GOTPLT_MEDHI16, 175) |
RELOC_NUMBER (R_SH_GOTPLT_HI16, 176) |
RELOC_NUMBER (R_SH_PLT_LOW16, 177) |
RELOC_NUMBER (R_SH_PLT_MEDLOW16, 178) |
RELOC_NUMBER (R_SH_PLT_MEDHI16, 179) |
RELOC_NUMBER (R_SH_PLT_HI16, 180) |
RELOC_NUMBER (R_SH_GOTOFF_LOW16, 181) |
RELOC_NUMBER (R_SH_GOTOFF_MEDLOW16, 182) |
RELOC_NUMBER (R_SH_GOTOFF_MEDHI16, 183) |
RELOC_NUMBER (R_SH_GOTOFF_HI16, 184) |
RELOC_NUMBER (R_SH_GOTPC_LOW16, 185) |
RELOC_NUMBER (R_SH_GOTPC_MEDLOW16, 186) |
RELOC_NUMBER (R_SH_GOTPC_MEDHI16, 187) |
RELOC_NUMBER (R_SH_GOTPC_HI16, 188) |
RELOC_NUMBER (R_SH_GOT10BY4, 189) |
RELOC_NUMBER (R_SH_GOTPLT10BY4, 190) |
RELOC_NUMBER (R_SH_GOT10BY8, 191) |
RELOC_NUMBER (R_SH_GOTPLT10BY8, 192) |
RELOC_NUMBER (R_SH_COPY64, 193) |
RELOC_NUMBER (R_SH_GLOB_DAT64, 194) |
RELOC_NUMBER (R_SH_JMP_SLOT64, 195) |
RELOC_NUMBER (R_SH_RELATIVE64, 196) |
FAKE_RELOC (R_SH_FIRST_INVALID_RELOC_5, 197) |
FAKE_RELOC (R_SH_LAST_INVALID_RELOC_5, 200) |
RELOC_NUMBER (R_SH_GOT20, 201) |
RELOC_NUMBER (R_SH_GOTOFF20, 202) |
RELOC_NUMBER (R_SH_GOTFUNCDESC, 203) |
RELOC_NUMBER (R_SH_GOTFUNCDESC20, 204) |
RELOC_NUMBER (R_SH_GOTOFFFUNCDESC, 205) |
RELOC_NUMBER (R_SH_GOTOFFFUNCDESC20, 206) |
RELOC_NUMBER (R_SH_FUNCDESC, 207) |
RELOC_NUMBER (R_SH_FUNCDESC_VALUE, 208) |
FAKE_RELOC (R_SH_FIRST_INVALID_RELOC_6, 209) |
FAKE_RELOC (R_SH_LAST_INVALID_RELOC_6, 241) |
RELOC_NUMBER (R_SH_SHMEDIA_CODE, 242) |
RELOC_NUMBER (R_SH_PT_16, 243) |
RELOC_NUMBER (R_SH_IMMS16, 244) |
RELOC_NUMBER (R_SH_IMMU16, 245) |
RELOC_NUMBER (R_SH_IMM_LOW16, 246) |
RELOC_NUMBER (R_SH_IMM_LOW16_PCREL, 247) |
RELOC_NUMBER (R_SH_IMM_MEDLOW16, 248) |
RELOC_NUMBER (R_SH_IMM_MEDLOW16_PCREL, 249) |
RELOC_NUMBER (R_SH_IMM_MEDHI16, 250) |
RELOC_NUMBER (R_SH_IMM_MEDHI16_PCREL, 251) |
RELOC_NUMBER (R_SH_IMM_HI16, 252) |
RELOC_NUMBER (R_SH_IMM_HI16_PCREL, 253) |
RELOC_NUMBER (R_SH_64, 254) |
RELOC_NUMBER (R_SH_64_PCREL, 255) |
END_RELOC_NUMBERS (R_SH_max) |
#endif |
/contrib/toolchain/binutils/include/elf/sparc.h |
---|
0,0 → 1,231 |
/* SPARC ELF support for BFD. |
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2008, 2010, |
2011 |
Free Software Foundation, Inc. |
By Doug Evans, Cygnus Support, <dje@cygnus.com>. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _ELF_SPARC_H |
#define _ELF_SPARC_H |
/* Processor specific flags for the ELF header e_flags field. */ |
/* These are defined by Sun. */ |
#define EF_SPARC_32PLUS_MASK 0xffff00 /* bits indicating V8+ type */ |
#define EF_SPARC_32PLUS 0x000100 /* generic V8+ features */ |
#define EF_SPARC_SUN_US1 0x000200 /* Sun UltraSPARC1 extensions */ |
#define EF_SPARC_HAL_R1 0x000400 /* HAL R1 extensions */ |
#define EF_SPARC_SUN_US3 0x000800 /* Sun UltraSPARCIII extensions */ |
#define EF_SPARC_LEDATA 0x800000 /* little endian data */ |
/* This name is used in the V9 ABI. */ |
#define EF_SPARC_EXT_MASK 0xffff00 /* reserved for vendor extensions */ |
/* V9 memory models */ |
#define EF_SPARCV9_MM 0x3 /* memory model mask */ |
#define EF_SPARCV9_TSO 0x0 /* total store ordering */ |
#define EF_SPARCV9_PSO 0x1 /* partial store ordering */ |
#define EF_SPARCV9_RMO 0x2 /* relaxed store ordering */ |
/* Section indices. */ |
#define SHN_BEFORE SHN_LORESERVE /* Used with SHF_ORDERED and... */ |
#define SHN_AFTER (SHN_LORESERVE + 1) /* SHF_LINK_ORDER section flags. */ |
/* Section flags. */ |
#define SHF_ORDERED 0x40000000 /* treat sh_link,sh_info specially */ |
/* Symbol types. */ |
#define STT_REGISTER 13 /* global reg reserved to app. */ |
#include "elf/reloc-macros.h" |
/* Relocation types. */ |
START_RELOC_NUMBERS (elf_sparc_reloc_type) |
RELOC_NUMBER (R_SPARC_NONE, 0) |
RELOC_NUMBER (R_SPARC_8, 1) |
RELOC_NUMBER (R_SPARC_16, 2) |
RELOC_NUMBER (R_SPARC_32, 3) |
RELOC_NUMBER (R_SPARC_DISP8, 4) |
RELOC_NUMBER (R_SPARC_DISP16, 5) |
RELOC_NUMBER (R_SPARC_DISP32, 6) |
RELOC_NUMBER (R_SPARC_WDISP30, 7) |
RELOC_NUMBER (R_SPARC_WDISP22, 8) |
RELOC_NUMBER (R_SPARC_HI22, 9) |
RELOC_NUMBER (R_SPARC_22, 10) |
RELOC_NUMBER (R_SPARC_13, 11) |
RELOC_NUMBER (R_SPARC_LO10, 12) |
RELOC_NUMBER (R_SPARC_GOT10, 13) |
RELOC_NUMBER (R_SPARC_GOT13, 14) |
RELOC_NUMBER (R_SPARC_GOT22, 15) |
RELOC_NUMBER (R_SPARC_PC10, 16) |
RELOC_NUMBER (R_SPARC_PC22, 17) |
RELOC_NUMBER (R_SPARC_WPLT30, 18) |
RELOC_NUMBER (R_SPARC_COPY, 19) |
RELOC_NUMBER (R_SPARC_GLOB_DAT, 20) |
RELOC_NUMBER (R_SPARC_JMP_SLOT, 21) |
RELOC_NUMBER (R_SPARC_RELATIVE, 22) |
RELOC_NUMBER (R_SPARC_UA32, 23) |
/* ??? These 6 relocs are new but not currently used. For binary |
compatibility in the sparc64-elf toolchain, we leave them out. |
A non-binary upward compatible change is expected for sparc64-elf. */ |
#ifndef SPARC64_OLD_RELOCS |
/* ??? New relocs on the UltraSPARC. Not sure what they're for yet. */ |
RELOC_NUMBER (R_SPARC_PLT32, 24) |
RELOC_NUMBER (R_SPARC_HIPLT22, 25) |
RELOC_NUMBER (R_SPARC_LOPLT10, 26) |
RELOC_NUMBER (R_SPARC_PCPLT32, 27) |
RELOC_NUMBER (R_SPARC_PCPLT22, 28) |
RELOC_NUMBER (R_SPARC_PCPLT10, 29) |
#endif |
/* v9 relocs */ |
RELOC_NUMBER (R_SPARC_10, 30) |
RELOC_NUMBER (R_SPARC_11, 31) |
RELOC_NUMBER (R_SPARC_64, 32) |
RELOC_NUMBER (R_SPARC_OLO10, 33) |
RELOC_NUMBER (R_SPARC_HH22, 34) |
RELOC_NUMBER (R_SPARC_HM10, 35) |
RELOC_NUMBER (R_SPARC_LM22, 36) |
RELOC_NUMBER (R_SPARC_PC_HH22, 37) |
RELOC_NUMBER (R_SPARC_PC_HM10, 38) |
RELOC_NUMBER (R_SPARC_PC_LM22, 39) |
RELOC_NUMBER (R_SPARC_WDISP16, 40) |
RELOC_NUMBER (R_SPARC_WDISP19, 41) |
RELOC_NUMBER (R_SPARC_UNUSED_42, 42) |
RELOC_NUMBER (R_SPARC_7, 43) |
RELOC_NUMBER (R_SPARC_5, 44) |
RELOC_NUMBER (R_SPARC_6, 45) |
RELOC_NUMBER (R_SPARC_DISP64, 46) |
RELOC_NUMBER (R_SPARC_PLT64, 47) |
RELOC_NUMBER (R_SPARC_HIX22, 48) |
RELOC_NUMBER (R_SPARC_LOX10, 49) |
RELOC_NUMBER (R_SPARC_H44, 50) |
RELOC_NUMBER (R_SPARC_M44, 51) |
RELOC_NUMBER (R_SPARC_L44, 52) |
RELOC_NUMBER (R_SPARC_REGISTER, 53) |
RELOC_NUMBER (R_SPARC_UA64, 54) |
RELOC_NUMBER (R_SPARC_UA16, 55) |
RELOC_NUMBER (R_SPARC_TLS_GD_HI22, 56) |
RELOC_NUMBER (R_SPARC_TLS_GD_LO10, 57) |
RELOC_NUMBER (R_SPARC_TLS_GD_ADD, 58) |
RELOC_NUMBER (R_SPARC_TLS_GD_CALL, 59) |
RELOC_NUMBER (R_SPARC_TLS_LDM_HI22, 60) |
RELOC_NUMBER (R_SPARC_TLS_LDM_LO10, 61) |
RELOC_NUMBER (R_SPARC_TLS_LDM_ADD, 62) |
RELOC_NUMBER (R_SPARC_TLS_LDM_CALL, 63) |
RELOC_NUMBER (R_SPARC_TLS_LDO_HIX22, 64) |
RELOC_NUMBER (R_SPARC_TLS_LDO_LOX10, 65) |
RELOC_NUMBER (R_SPARC_TLS_LDO_ADD, 66) |
RELOC_NUMBER (R_SPARC_TLS_IE_HI22, 67) |
RELOC_NUMBER (R_SPARC_TLS_IE_LO10, 68) |
RELOC_NUMBER (R_SPARC_TLS_IE_LD, 69) |
RELOC_NUMBER (R_SPARC_TLS_IE_LDX, 70) |
RELOC_NUMBER (R_SPARC_TLS_IE_ADD, 71) |
RELOC_NUMBER (R_SPARC_TLS_LE_HIX22, 72) |
RELOC_NUMBER (R_SPARC_TLS_LE_LOX10, 73) |
RELOC_NUMBER (R_SPARC_TLS_DTPMOD32, 74) |
RELOC_NUMBER (R_SPARC_TLS_DTPMOD64, 75) |
RELOC_NUMBER (R_SPARC_TLS_DTPOFF32, 76) |
RELOC_NUMBER (R_SPARC_TLS_DTPOFF64, 77) |
RELOC_NUMBER (R_SPARC_TLS_TPOFF32, 78) |
RELOC_NUMBER (R_SPARC_TLS_TPOFF64, 79) |
RELOC_NUMBER (R_SPARC_GOTDATA_HIX22, 80) |
RELOC_NUMBER (R_SPARC_GOTDATA_LOX10, 81) |
RELOC_NUMBER (R_SPARC_GOTDATA_OP_HIX22, 82) |
RELOC_NUMBER (R_SPARC_GOTDATA_OP_LOX10, 83) |
RELOC_NUMBER (R_SPARC_GOTDATA_OP, 84) |
RELOC_NUMBER (R_SPARC_H34, 85) |
RELOC_NUMBER (R_SPARC_SIZE32, 86) |
RELOC_NUMBER (R_SPARC_SIZE64, 87) |
RELOC_NUMBER (R_SPARC_WDISP10, 88) |
EMPTY_RELOC (R_SPARC_max_std) |
RELOC_NUMBER (R_SPARC_JMP_IREL, 248) |
RELOC_NUMBER (R_SPARC_IRELATIVE, 249) |
RELOC_NUMBER (R_SPARC_GNU_VTINHERIT, 250) |
RELOC_NUMBER (R_SPARC_GNU_VTENTRY, 251) |
RELOC_NUMBER (R_SPARC_REV32, 252) |
END_RELOC_NUMBERS (R_SPARC_max) |
/* Relocation macros. */ |
#define ELF64_R_TYPE_DATA(info) \ |
(((bfd_signed_vma)(ELF64_R_TYPE(info) >> 8) ^ 0x800000) - 0x800000) |
#define ELF64_R_TYPE_ID(info) \ |
((info) & 0xff) |
#define ELF64_R_TYPE_INFO(data, type) \ |
(((bfd_vma) ((data) & 0xffffff) << 8) | (bfd_vma) (type)) |
/* Values for Elf64_Dyn.d_tag. */ |
#define DT_SPARC_REGISTER 0x70000001 |
/* Object attribute tags. */ |
enum |
{ |
/* 0-3 are generic. */ |
Tag_GNU_Sparc_HWCAPS = 4, |
}; |
/* These values match the AV_SPARC_* hwcap bits defined under Solaris. */ |
#define ELF_SPARC_HWCAP_MUL32 0x00000001 /* umul/umulcc/smul/smulcc insns */ |
#define ELF_SPARC_HWCAP_DIV32 0x00000002 /* udiv/udivcc/sdiv/sdivcc insns */ |
#define ELF_SPARC_HWCAP_FSMULD 0x00000004 /* 'fsmuld' insn */ |
#define ELF_SPARC_HWCAP_V8PLUS 0x00000008 /* v9 insns available to 32bit */ |
#define ELF_SPARC_HWCAP_POPC 0x00000010 /* 'popc' insn */ |
#define ELF_SPARC_HWCAP_VIS 0x00000020 /* VIS insns */ |
#define ELF_SPARC_HWCAP_VIS2 0x00000040 /* VIS2 insns */ |
#define ELF_SPARC_HWCAP_ASI_BLK_INIT \ |
0x00000080 /* block init ASIs */ |
#define ELF_SPARC_HWCAP_FMAF 0x00000100 /* fused multiply-add */ |
#define ELF_SPARC_HWCAP_VIS3 0x00000400 /* VIS3 insns */ |
#define ELF_SPARC_HWCAP_HPC 0x00000800 /* HPC insns */ |
#define ELF_SPARC_HWCAP_RANDOM 0x00001000 /* 'random' insn */ |
#define ELF_SPARC_HWCAP_TRANS 0x00002000 /* transaction insns */ |
#define ELF_SPARC_HWCAP_FJFMAU 0x00004000 /* unfused multiply-add */ |
#define ELF_SPARC_HWCAP_IMA 0x00008000 /* integer multiply-add */ |
#define ELF_SPARC_HWCAP_ASI_CACHE_SPARING \ |
0x00010000 /* cache sparing ASIs */ |
#define ELF_SPARC_HWCAP_AES 0x00020000 /* AES crypto insns */ |
#define ELF_SPARC_HWCAP_DES 0x00040000 /* DES crypto insns */ |
#define ELF_SPARC_HWCAP_KASUMI 0x00080000 /* KASUMI crypto insns */ |
#define ELF_SPARC_HWCAP_CAMELLIA \ |
0x00100000 /* CAMELLIA crypto insns */ |
#define ELF_SPARC_HWCAP_MD5 0x00200000 /* MD5 hashing insns */ |
#define ELF_SPARC_HWCAP_SHA1 0x00400000 /* SHA1 hashing insns */ |
#define ELF_SPARC_HWCAP_SHA256 0x00800000 /* SHA256 hashing insns */ |
#define ELF_SPARC_HWCAP_SHA512 0x01000000 /* SHA512 hashing insns */ |
#define ELF_SPARC_HWCAP_MPMUL 0x02000000 /* Multiple Precision Multiply */ |
#define ELF_SPARC_HWCAP_MONT 0x04000000 /* Montgomery Mult/Sqrt */ |
#define ELF_SPARC_HWCAP_PAUSE 0x08000000 /* Pause insn */ |
#define ELF_SPARC_HWCAP_CBCOND 0x10000000 /* Compare and Branch insns */ |
#define ELF_SPARC_HWCAP_CRC32C 0x20000000 /* CRC32C insn */ |
#endif /* _ELF_SPARC_H */ |
/contrib/toolchain/binutils/include/elf/spu.h |
---|
0,0 → 1,61 |
/* SPU ELF support for BFD. |
Copyright 2006, 2007, 2009, 2010 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_SPU_H |
#define _ELF_SPU_H |
#include "elf/reloc-macros.h" |
/* elf32-spu.c depends on these being consecutive. */ |
START_RELOC_NUMBERS (elf_spu_reloc_type) |
RELOC_NUMBER (R_SPU_NONE, 0) |
RELOC_NUMBER (R_SPU_ADDR10, 1) |
RELOC_NUMBER (R_SPU_ADDR16, 2) |
RELOC_NUMBER (R_SPU_ADDR16_HI, 3) |
RELOC_NUMBER (R_SPU_ADDR16_LO, 4) |
RELOC_NUMBER (R_SPU_ADDR18, 5) |
RELOC_NUMBER (R_SPU_ADDR32, 6) |
RELOC_NUMBER (R_SPU_REL16, 7) |
RELOC_NUMBER (R_SPU_ADDR7, 8) |
RELOC_NUMBER (R_SPU_REL9, 9) |
RELOC_NUMBER (R_SPU_REL9I, 10) |
RELOC_NUMBER (R_SPU_ADDR10I, 11) |
RELOC_NUMBER (R_SPU_ADDR16I, 12) |
RELOC_NUMBER (R_SPU_REL32, 13) |
RELOC_NUMBER (R_SPU_ADDR16X, 14) |
RELOC_NUMBER (R_SPU_PPU32, 15) |
RELOC_NUMBER (R_SPU_PPU64, 16) |
RELOC_NUMBER (R_SPU_ADD_PIC, 17) |
END_RELOC_NUMBERS (R_SPU_max) |
/* Program header extensions */ |
/* Mark a PT_LOAD segment as containing an overlay which should not |
initially be loaded. */ |
#define PF_OVERLAY (1 << 27) |
/* SPU Dynamic Object Information. */ |
#define PT_SPU_INFO 0x70000000 |
/* SPU plugin information */ |
#define SPU_PLUGIN_NAME "SPUNAME" |
#define SPU_PTNOTE_SPUNAME ".note.spu_name" |
#endif /* _ELF_SPU_H */ |
/contrib/toolchain/binutils/include/elf/tic6x-attrs.h |
---|
0,0 → 1,35 |
/* TI C6X ELF attributes. |
Copyright 2010 |
Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* Define the TAG macro before including this file; it takes a tag |
name and value. */ |
TAG(Tag_ISA, 4) |
TAG(Tag_ABI_wchar_t, 6) |
TAG(Tag_ABI_stack_align_needed, 8) |
TAG(Tag_ABI_stack_align_preserved, 10) |
TAG(Tag_ABI_DSBT, 12) |
TAG(Tag_ABI_PID, 14) |
TAG(Tag_ABI_PIC, 16) |
TAG(Tag_ABI_array_object_alignment, 18) |
TAG(Tag_ABI_array_object_align_expected, 20) |
TAG(Tag_ABI_compatibility, 32) |
TAG(Tag_ABI_conformance, 67) |
/contrib/toolchain/binutils/include/elf/tic6x.h |
---|
0,0 → 1,167 |
/* TI C6X ELF support for BFD. |
Copyright 2010, 2011 |
Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _ELF_TIC6X_H |
#define _ELF_TIC6X_H |
#include "elf/reloc-macros.h" |
/* Relocation types. */ |
START_RELOC_NUMBERS (elf_tic6x_reloc_type) |
RELOC_NUMBER (R_C6000_NONE, 0) |
RELOC_NUMBER (R_C6000_ABS32, 1) |
RELOC_NUMBER (R_C6000_ABS16, 2) |
RELOC_NUMBER (R_C6000_ABS8, 3) |
RELOC_NUMBER (R_C6000_PCR_S21, 4) |
RELOC_NUMBER (R_C6000_PCR_S12, 5) |
RELOC_NUMBER (R_C6000_PCR_S10, 6) |
RELOC_NUMBER (R_C6000_PCR_S7, 7) |
RELOC_NUMBER (R_C6000_ABS_S16, 8) |
RELOC_NUMBER (R_C6000_ABS_L16, 9) |
RELOC_NUMBER (R_C6000_ABS_H16, 10) |
RELOC_NUMBER (R_C6000_SBR_U15_B, 11) |
RELOC_NUMBER (R_C6000_SBR_U15_H, 12) |
RELOC_NUMBER (R_C6000_SBR_U15_W, 13) |
RELOC_NUMBER (R_C6000_SBR_S16, 14) |
RELOC_NUMBER (R_C6000_SBR_L16_B, 15) |
RELOC_NUMBER (R_C6000_SBR_L16_H, 16) |
RELOC_NUMBER (R_C6000_SBR_L16_W, 17) |
RELOC_NUMBER (R_C6000_SBR_H16_B, 18) |
RELOC_NUMBER (R_C6000_SBR_H16_H, 19) |
RELOC_NUMBER (R_C6000_SBR_H16_W, 20) |
RELOC_NUMBER (R_C6000_SBR_GOT_U15_W, 21) |
RELOC_NUMBER (R_C6000_SBR_GOT_L16_W, 22) |
RELOC_NUMBER (R_C6000_SBR_GOT_H16_W, 23) |
RELOC_NUMBER (R_C6000_DSBT_INDEX, 24) |
RELOC_NUMBER (R_C6000_PREL31, 25) |
RELOC_NUMBER (R_C6000_COPY, 26) |
RELOC_NUMBER (R_C6000_JUMP_SLOT, 27) |
RELOC_NUMBER (R_C6000_EHTYPE, 28) |
RELOC_NUMBER (R_C6000_PCR_H16, 29) |
RELOC_NUMBER (R_C6000_PCR_L16, 30) |
RELOC_NUMBER (R_C6000_ALIGN, 253) |
RELOC_NUMBER (R_C6000_FPHEAD, 254) |
RELOC_NUMBER (R_C6000_NOCMP, 255) |
END_RELOC_NUMBERS (R_TIC6X_max) |
/* Processor-specific flags. */ |
/* File contains static relocation information. */ |
#define EF_C6000_REL 0x1 |
/* Processor-specific section types. */ |
/* Unwind function table for stack unwinding. */ |
#define SHT_C6000_UNWIND 0x70000001 |
/* DLL dynamic linking pre-emption map. */ |
#define SHT_C6000_PREEMPTMAP 0x70000002 |
/* Object file compatibility attributes. */ |
#define SHT_C6000_ATTRIBUTES 0x70000003 |
/* Intermediate code for link-time optimization. */ |
#define SHT_TI_ICODE 0x7F000000 |
/* Symbolic cross reference information. */ |
#define SHT_TI_XREF 0x7F000001 |
/* Reserved. */ |
#define SHT_TI_HANDLER 0x7F000002 |
/* Compressed data for initializing C variables. */ |
#define SHT_TI_INITINFO 0x7F000003 |
/* Extended program header attributes. */ |
#define SHT_TI_PHATTRS 0x7F000004 |
/* Processor specific section indices. These sections do not actually |
exist. Symbols with a st_shndx field corresponding to one of these |
values have a special meaning. */ |
/* Small data area common symbol. */ |
#define SHN_TIC6X_SCOMMON SHN_LORESERVE |
/* Processor-specific segment types. */ |
/* Extended Segment Attributes. */ |
#define PT_C6000_PHATTR 0x70000000 |
/* Processor-specific dynamic tags. */ |
/* Undocumented. */ |
#define DT_C6000_GSYM_OFFSET 0x6000000D |
/* Undocumented. */ |
#define DT_C6000_GSTR_OFFSET 0x6000000F |
/* Statically linked base address of data segment. */ |
#define DT_C6000_DSBT_BASE 0x70000000 |
/* Number of entries in this module's DSBT. */ |
#define DT_C6000_DSBT_SIZE 0x70000001 |
/* Undocumented. */ |
#define DT_C6000_PREEMPTMAP 0x70000002 |
/* The hard-coded DSBT index for this module, if any. */ |
#define DT_C6000_DSBT_INDEX 0x70000003 |
/* Extended program header attributes. */ |
/* Terminate a segment. */ |
#define PHA_NULL 0x0 |
/* Segment's address bound to the final address. */ |
#define PHA_BOUND 0x1 |
/* Segment cannot be further relocated. */ |
#define PHA_READONLY 0x2 |
/* Build attributes. */ |
enum |
{ |
#define TAG(tag, value) tag = value, |
#include "elf/tic6x-attrs.h" |
#undef TAG |
Tag_C6XABI_last |
}; |
/* Values for Tag_ISA. GNU-specific names; the ABI does not specify |
names for these values. */ |
enum |
{ |
C6XABI_Tag_ISA_none = 0, |
C6XABI_Tag_ISA_C62X = 1, |
C6XABI_Tag_ISA_C67X = 3, |
C6XABI_Tag_ISA_C67XP = 4, |
C6XABI_Tag_ISA_C64X = 6, |
C6XABI_Tag_ISA_C64XP = 7, |
C6XABI_Tag_ISA_C674X = 8 |
}; |
/* Special section names. */ |
#define ELF_STRING_C6000_unwind ".c6xabi.exidx" |
#define ELF_STRING_C6000_unwind_info ".c6xabi.extab" |
#define ELF_STRING_C6000_unwind_once ".gnu.linkonce.c6xabi.exidx." |
#define ELF_STRING_C6000_unwind_info_once ".gnu.linkonce.c6xabi.extab." |
#endif /* _ELF_TIC6X_H */ |
/contrib/toolchain/binutils/include/elf/tilegx.h |
---|
0,0 → 1,176 |
/* TILE-Gx ELF support for BFD. |
Copyright 2011 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _ELF_TILEGX_H |
#define _ELF_TILEGX_H |
#include "elf/reloc-macros.h" |
/* Relocations. */ |
START_RELOC_NUMBERS (elf_tilegx_reloc_type) |
RELOC_NUMBER (R_TILEGX_NONE, 0) |
/* Standard relocations */ |
RELOC_NUMBER (R_TILEGX_64, 1) |
RELOC_NUMBER (R_TILEGX_32, 2) |
RELOC_NUMBER (R_TILEGX_16, 3) |
RELOC_NUMBER (R_TILEGX_8, 4) |
RELOC_NUMBER (R_TILEGX_64_PCREL, 5) |
RELOC_NUMBER (R_TILEGX_32_PCREL, 6) |
RELOC_NUMBER (R_TILEGX_16_PCREL, 7) |
RELOC_NUMBER (R_TILEGX_8_PCREL, 8) |
/* Custom relocations */ |
RELOC_NUMBER (R_TILEGX_HW0, 9) |
RELOC_NUMBER (R_TILEGX_HW1, 10) |
RELOC_NUMBER (R_TILEGX_HW2, 11) |
RELOC_NUMBER (R_TILEGX_HW3, 12) |
RELOC_NUMBER (R_TILEGX_HW0_LAST, 13) |
RELOC_NUMBER (R_TILEGX_HW1_LAST, 14) |
RELOC_NUMBER (R_TILEGX_HW2_LAST, 15) |
RELOC_NUMBER (R_TILEGX_COPY, 16) |
RELOC_NUMBER (R_TILEGX_GLOB_DAT, 17) |
RELOC_NUMBER (R_TILEGX_JMP_SLOT, 18) |
RELOC_NUMBER (R_TILEGX_RELATIVE, 19) |
/* Branch/jump offsets */ |
RELOC_NUMBER (R_TILEGX_BROFF_X1, 20) |
RELOC_NUMBER (R_TILEGX_JUMPOFF_X1, 21) |
RELOC_NUMBER (R_TILEGX_JUMPOFF_X1_PLT, 22) |
/* Immediate operands. */ |
RELOC_NUMBER (R_TILEGX_IMM8_X0, 23) |
RELOC_NUMBER (R_TILEGX_IMM8_Y0, 24) |
RELOC_NUMBER (R_TILEGX_IMM8_X1, 25) |
RELOC_NUMBER (R_TILEGX_IMM8_Y1, 26) |
RELOC_NUMBER (R_TILEGX_DEST_IMM8_X1, 27) |
RELOC_NUMBER (R_TILEGX_MT_IMM14_X1, 28) |
RELOC_NUMBER (R_TILEGX_MF_IMM14_X1, 29) |
RELOC_NUMBER (R_TILEGX_MMSTART_X0, 30) |
RELOC_NUMBER (R_TILEGX_MMEND_X0, 31) |
RELOC_NUMBER (R_TILEGX_SHAMT_X0, 32) |
RELOC_NUMBER (R_TILEGX_SHAMT_X1, 33) |
RELOC_NUMBER (R_TILEGX_SHAMT_Y0, 34) |
RELOC_NUMBER (R_TILEGX_SHAMT_Y1, 35) |
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0, 36) |
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0, 37) |
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW1, 38) |
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW1, 39) |
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW2, 40) |
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW2, 41) |
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW3, 42) |
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW3, 43) |
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_LAST, 44) |
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_LAST, 45) |
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW1_LAST, 46) |
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW1_LAST, 47) |
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW2_LAST, 48) |
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW2_LAST, 49) |
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_PCREL, 50) |
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_PCREL, 51) |
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW1_PCREL, 52) |
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW1_PCREL, 53) |
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW2_PCREL, 54) |
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW2_PCREL, 55) |
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW3_PCREL, 56) |
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW3_PCREL, 57) |
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_LAST_PCREL, 58) |
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_LAST_PCREL, 59) |
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW1_LAST_PCREL, 60) |
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW1_LAST_PCREL, 61) |
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW2_LAST_PCREL, 62) |
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW2_LAST_PCREL, 63) |
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_GOT, 64) |
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_GOT, 65) |
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_PLT_PCREL, 66) |
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_PLT_PCREL, 67) |
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW1_PLT_PCREL, 68) |
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW1_PLT_PCREL, 69) |
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW2_PLT_PCREL, 70) |
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW2_PLT_PCREL, 71) |
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_LAST_GOT, 72) |
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_LAST_GOT, 73) |
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW1_LAST_GOT, 74) |
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW1_LAST_GOT, 75) |
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW3_PLT_PCREL, 76) |
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW3_PLT_PCREL, 77) |
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_TLS_GD, 78) |
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_TLS_GD, 79) |
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_TLS_LE, 80) |
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_TLS_LE, 81) |
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE, 82) |
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE, 83) |
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE, 84) |
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE, 85) |
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD, 86) |
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD, 87) |
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD, 88) |
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD, 89) |
/* Relocs 90-91 are currently not defined. */ |
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_TLS_IE, 92) |
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_TLS_IE, 93) |
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL, 94) |
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL, 95) |
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL, 96) |
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL, 97) |
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL, 98) |
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL, 99) |
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE, 100) |
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE, 101) |
RELOC_NUMBER (R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE, 102) |
RELOC_NUMBER (R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE, 103) |
/* Relocs 104-105 are currently not defined. */ |
RELOC_NUMBER (R_TILEGX_TLS_DTPMOD64, 106) |
RELOC_NUMBER (R_TILEGX_TLS_DTPOFF64, 107) |
RELOC_NUMBER (R_TILEGX_TLS_TPOFF64, 108) |
RELOC_NUMBER (R_TILEGX_TLS_DTPMOD32, 109) |
RELOC_NUMBER (R_TILEGX_TLS_DTPOFF32, 110) |
RELOC_NUMBER (R_TILEGX_TLS_TPOFF32, 111) |
RELOC_NUMBER (R_TILEGX_TLS_GD_CALL, 112) |
RELOC_NUMBER (R_TILEGX_IMM8_X0_TLS_GD_ADD, 113) |
RELOC_NUMBER (R_TILEGX_IMM8_X1_TLS_GD_ADD, 114) |
RELOC_NUMBER (R_TILEGX_IMM8_Y0_TLS_GD_ADD, 115) |
RELOC_NUMBER (R_TILEGX_IMM8_Y1_TLS_GD_ADD, 116) |
RELOC_NUMBER (R_TILEGX_TLS_IE_LOAD, 117) |
RELOC_NUMBER (R_TILEGX_IMM8_X0_TLS_ADD, 118) |
RELOC_NUMBER (R_TILEGX_IMM8_X1_TLS_ADD, 119) |
RELOC_NUMBER (R_TILEGX_IMM8_Y0_TLS_ADD, 120) |
RELOC_NUMBER (R_TILEGX_IMM8_Y1_TLS_ADD, 121) |
/* These are GNU extensions to enable C++ vtable garbage collection. */ |
RELOC_NUMBER (R_TILEGX_GNU_VTINHERIT, 128) |
RELOC_NUMBER (R_TILEGX_GNU_VTENTRY, 129) |
END_RELOC_NUMBERS (R_TILEGX_max) |
#endif /* _ELF_TILEGX_H */ |
/contrib/toolchain/binutils/include/elf/tilepro.h |
---|
0,0 → 1,144 |
/* TILEPro ELF support for BFD. |
Copyright 2011 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _ELF_TILEPRO_H |
#define _ELF_TILEPRO_H |
#include "elf/reloc-macros.h" |
/* Relocations. */ |
START_RELOC_NUMBERS (elf_tilepro_reloc_type) |
RELOC_NUMBER (R_TILEPRO_NONE, 0) |
/* Standard relocations */ |
RELOC_NUMBER (R_TILEPRO_32, 1) |
RELOC_NUMBER (R_TILEPRO_16, 2) |
RELOC_NUMBER (R_TILEPRO_8, 3) |
RELOC_NUMBER (R_TILEPRO_32_PCREL, 4) |
RELOC_NUMBER (R_TILEPRO_16_PCREL, 5) |
RELOC_NUMBER (R_TILEPRO_8_PCREL, 6) |
RELOC_NUMBER (R_TILEPRO_LO16, 7) |
RELOC_NUMBER (R_TILEPRO_HI16, 8) |
RELOC_NUMBER (R_TILEPRO_HA16, 9) |
RELOC_NUMBER (R_TILEPRO_COPY, 10) |
RELOC_NUMBER (R_TILEPRO_GLOB_DAT, 11) |
RELOC_NUMBER (R_TILEPRO_JMP_SLOT, 12) |
RELOC_NUMBER (R_TILEPRO_RELATIVE, 13) |
/* Branch/jump offsets */ |
RELOC_NUMBER (R_TILEPRO_BROFF_X1, 14) |
RELOC_NUMBER (R_TILEPRO_JOFFLONG_X1, 15) |
RELOC_NUMBER (R_TILEPRO_JOFFLONG_X1_PLT, 16) |
/* Immediate operands. */ |
RELOC_NUMBER (R_TILEPRO_IMM8_X0, 17) |
RELOC_NUMBER (R_TILEPRO_IMM8_Y0, 18) |
RELOC_NUMBER (R_TILEPRO_IMM8_X1, 19) |
RELOC_NUMBER (R_TILEPRO_IMM8_Y1, 20) |
RELOC_NUMBER (R_TILEPRO_MT_IMM15_X1, 21) |
RELOC_NUMBER (R_TILEPRO_MF_IMM15_X1, 22) |
RELOC_NUMBER (R_TILEPRO_IMM16_X0, 23) |
RELOC_NUMBER (R_TILEPRO_IMM16_X1, 24) |
RELOC_NUMBER (R_TILEPRO_IMM16_X0_LO, 25) |
RELOC_NUMBER (R_TILEPRO_IMM16_X1_LO, 26) |
RELOC_NUMBER (R_TILEPRO_IMM16_X0_HI, 27) |
RELOC_NUMBER (R_TILEPRO_IMM16_X1_HI, 28) |
RELOC_NUMBER (R_TILEPRO_IMM16_X0_HA, 29) |
RELOC_NUMBER (R_TILEPRO_IMM16_X1_HA, 30) |
RELOC_NUMBER (R_TILEPRO_IMM16_X0_PCREL, 31) |
RELOC_NUMBER (R_TILEPRO_IMM16_X1_PCREL, 32) |
RELOC_NUMBER (R_TILEPRO_IMM16_X0_LO_PCREL, 33) |
RELOC_NUMBER (R_TILEPRO_IMM16_X1_LO_PCREL, 34) |
RELOC_NUMBER (R_TILEPRO_IMM16_X0_HI_PCREL, 35) |
RELOC_NUMBER (R_TILEPRO_IMM16_X1_HI_PCREL, 36) |
RELOC_NUMBER (R_TILEPRO_IMM16_X0_HA_PCREL, 37) |
RELOC_NUMBER (R_TILEPRO_IMM16_X1_HA_PCREL, 38) |
RELOC_NUMBER (R_TILEPRO_IMM16_X0_GOT, 39) |
RELOC_NUMBER (R_TILEPRO_IMM16_X1_GOT, 40) |
RELOC_NUMBER (R_TILEPRO_IMM16_X0_GOT_LO, 41) |
RELOC_NUMBER (R_TILEPRO_IMM16_X1_GOT_LO, 42) |
RELOC_NUMBER (R_TILEPRO_IMM16_X0_GOT_HI, 43) |
RELOC_NUMBER (R_TILEPRO_IMM16_X1_GOT_HI, 44) |
RELOC_NUMBER (R_TILEPRO_IMM16_X0_GOT_HA, 45) |
RELOC_NUMBER (R_TILEPRO_IMM16_X1_GOT_HA, 46) |
RELOC_NUMBER (R_TILEPRO_MMSTART_X0, 47) |
RELOC_NUMBER (R_TILEPRO_MMEND_X0, 48) |
RELOC_NUMBER (R_TILEPRO_MMSTART_X1, 49) |
RELOC_NUMBER (R_TILEPRO_MMEND_X1, 50) |
RELOC_NUMBER (R_TILEPRO_SHAMT_X0, 51) |
RELOC_NUMBER (R_TILEPRO_SHAMT_X1, 52) |
RELOC_NUMBER (R_TILEPRO_SHAMT_Y0, 53) |
RELOC_NUMBER (R_TILEPRO_SHAMT_Y1, 54) |
RELOC_NUMBER (R_TILEPRO_DEST_IMM8_X1, 55) |
/* Relocs 56-59 are currently not defined. */ |
RELOC_NUMBER (R_TILEPRO_TLS_GD_CALL, 60) |
RELOC_NUMBER (R_TILEPRO_IMM8_X0_TLS_GD_ADD, 61) |
RELOC_NUMBER (R_TILEPRO_IMM8_X1_TLS_GD_ADD, 62) |
RELOC_NUMBER (R_TILEPRO_IMM8_Y0_TLS_GD_ADD, 63) |
RELOC_NUMBER (R_TILEPRO_IMM8_Y1_TLS_GD_ADD, 64) |
RELOC_NUMBER (R_TILEPRO_TLS_IE_LOAD, 65) |
RELOC_NUMBER (R_TILEPRO_IMM16_X0_TLS_GD, 66) |
RELOC_NUMBER (R_TILEPRO_IMM16_X1_TLS_GD, 67) |
RELOC_NUMBER (R_TILEPRO_IMM16_X0_TLS_GD_LO, 68) |
RELOC_NUMBER (R_TILEPRO_IMM16_X1_TLS_GD_LO, 69) |
RELOC_NUMBER (R_TILEPRO_IMM16_X0_TLS_GD_HI, 70) |
RELOC_NUMBER (R_TILEPRO_IMM16_X1_TLS_GD_HI, 71) |
RELOC_NUMBER (R_TILEPRO_IMM16_X0_TLS_GD_HA, 72) |
RELOC_NUMBER (R_TILEPRO_IMM16_X1_TLS_GD_HA, 73) |
RELOC_NUMBER (R_TILEPRO_IMM16_X0_TLS_IE, 74) |
RELOC_NUMBER (R_TILEPRO_IMM16_X1_TLS_IE, 75) |
RELOC_NUMBER (R_TILEPRO_IMM16_X0_TLS_IE_LO, 76) |
RELOC_NUMBER (R_TILEPRO_IMM16_X1_TLS_IE_LO, 77) |
RELOC_NUMBER (R_TILEPRO_IMM16_X0_TLS_IE_HI, 78) |
RELOC_NUMBER (R_TILEPRO_IMM16_X1_TLS_IE_HI, 79) |
RELOC_NUMBER (R_TILEPRO_IMM16_X0_TLS_IE_HA, 80) |
RELOC_NUMBER (R_TILEPRO_IMM16_X1_TLS_IE_HA, 81) |
RELOC_NUMBER (R_TILEPRO_TLS_DTPMOD32, 82) |
RELOC_NUMBER (R_TILEPRO_TLS_DTPOFF32, 83) |
RELOC_NUMBER (R_TILEPRO_TLS_TPOFF32, 84) |
RELOC_NUMBER (R_TILEPRO_IMM16_X0_TLS_LE, 85) |
RELOC_NUMBER (R_TILEPRO_IMM16_X1_TLS_LE, 86) |
RELOC_NUMBER (R_TILEPRO_IMM16_X0_TLS_LE_LO, 87) |
RELOC_NUMBER (R_TILEPRO_IMM16_X1_TLS_LE_LO, 88) |
RELOC_NUMBER (R_TILEPRO_IMM16_X0_TLS_LE_HI, 89) |
RELOC_NUMBER (R_TILEPRO_IMM16_X1_TLS_LE_HI, 90) |
RELOC_NUMBER (R_TILEPRO_IMM16_X0_TLS_LE_HA, 91) |
RELOC_NUMBER (R_TILEPRO_IMM16_X1_TLS_LE_HA, 92) |
/* These are GNU extensions to enable C++ vtable garbage collection. */ |
RELOC_NUMBER (R_TILEPRO_GNU_VTINHERIT, 128) |
RELOC_NUMBER (R_TILEPRO_GNU_VTENTRY, 129) |
END_RELOC_NUMBERS (R_TILEPRO_max) |
#endif /* _ELF_TILEPRO_H */ |
/contrib/toolchain/binutils/include/elf/v850.h |
---|
0,0 → 1,283 |
/* V850 ELF support for BFD. |
Copyright 1997-2013 Free Software Foundation, Inc. |
Created by Michael Meissner, Cygnus Support <meissner@cygnus.com> |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* This file holds definitions specific to the MIPS ELF ABI. Note |
that most of this is not actually implemented by BFD. */ |
#ifndef _ELF_V850_H |
#define _ELF_V850_H |
/* Processor specific flags for the ELF header e_flags field. */ |
/* Four bit V850 architecture field. */ |
#define EF_V850_ARCH 0xf0000000 |
/* v850 code. */ |
#define E_V850_ARCH 0x00000000 |
/* v850e code. */ |
#define E_V850E_ARCH 0x10000000 |
/* v850e1 code. */ |
#define E_V850E1_ARCH 0x20000000 |
/* v850e2 code. */ |
#define E_V850E2_ARCH 0x30000000 |
/* v850e2v3 code. */ |
#define E_V850E2V3_ARCH 0x40000000 |
/* v850e3v5 code. */ |
#define E_V850E3V5_ARCH 0x60000000 |
/* Flags for the st_other field. */ |
#define V850_OTHER_SDA 0x10 /* Symbol had SDA relocations. */ |
#define V850_OTHER_ZDA 0x20 /* Symbol had ZDA relocations. */ |
#define V850_OTHER_TDA 0x40 /* Symbol had TDA relocations. */ |
#define V850_OTHER_ERROR 0x80 /* Symbol had an error reported. */ |
/* V850 relocations. */ |
#include "elf/reloc-macros.h" |
START_RELOC_NUMBERS (v850_reloc_type) |
RELOC_NUMBER (R_V850_NONE, 0) |
RELOC_NUMBER (R_V850_9_PCREL, 1) |
RELOC_NUMBER (R_V850_22_PCREL, 2) |
RELOC_NUMBER (R_V850_HI16_S, 3) |
RELOC_NUMBER (R_V850_HI16, 4) |
RELOC_NUMBER (R_V850_LO16, 5) |
RELOC_NUMBER (R_V850_ABS32, 6) |
RELOC_NUMBER (R_V850_16, 7) |
RELOC_NUMBER (R_V850_8, 8) |
RELOC_NUMBER( R_V850_SDA_16_16_OFFSET, 9) /* For ld.b, st.b, set1, clr1, not1, tst1, movea, movhi */ |
RELOC_NUMBER( R_V850_SDA_15_16_OFFSET, 10) /* For ld.w, ld.h, ld.hu, st.w, st.h */ |
RELOC_NUMBER( R_V850_ZDA_16_16_OFFSET, 11) /* For ld.b, st.b, set1, clr1, not1, tst1, movea, movhi */ |
RELOC_NUMBER( R_V850_ZDA_15_16_OFFSET, 12) /* For ld.w, ld.h, ld.hu, st.w, st.h */ |
RELOC_NUMBER( R_V850_TDA_6_8_OFFSET, 13) /* For sst.w, sld.w */ |
RELOC_NUMBER( R_V850_TDA_7_8_OFFSET, 14) /* For sst.h, sld.h */ |
RELOC_NUMBER( R_V850_TDA_7_7_OFFSET, 15) /* For sst.b, sld.b */ |
RELOC_NUMBER( R_V850_TDA_16_16_OFFSET, 16) /* For set1, clr1, not1, tst1, movea, movhi */ |
RELOC_NUMBER( R_V850_TDA_4_5_OFFSET, 17) /* For sld.hu */ |
RELOC_NUMBER( R_V850_TDA_4_4_OFFSET, 18) /* For sld.bu */ |
RELOC_NUMBER( R_V850_SDA_16_16_SPLIT_OFFSET, 19) /* For ld.bu */ |
RELOC_NUMBER( R_V850_ZDA_16_16_SPLIT_OFFSET, 20) /* For ld.bu */ |
RELOC_NUMBER( R_V850_CALLT_6_7_OFFSET, 21) /* For callt */ |
RELOC_NUMBER( R_V850_CALLT_16_16_OFFSET, 22) /* For callt */ |
RELOC_NUMBER (R_V850_GNU_VTINHERIT, 23) |
RELOC_NUMBER (R_V850_GNU_VTENTRY, 24) |
RELOC_NUMBER (R_V850_LONGCALL, 25) |
RELOC_NUMBER (R_V850_LONGJUMP, 26) |
RELOC_NUMBER (R_V850_ALIGN, 27) |
RELOC_NUMBER (R_V850_REL32, 28) |
RELOC_NUMBER (R_V850_LO16_SPLIT_OFFSET, 29) /* For ld.bu */ |
RELOC_NUMBER (R_V850_16_PCREL, 30) /* For loop */ |
RELOC_NUMBER (R_V850_17_PCREL, 31) /* For br */ |
RELOC_NUMBER (R_V850_23, 32) /* For 23bit ld.[w,h,hu,b,bu],st.[w,h,b] */ |
RELOC_NUMBER (R_V850_32_PCREL, 33) /* For jr32, jarl32 */ |
RELOC_NUMBER (R_V850_32_ABS, 34) /* For jmp32 */ |
RELOC_NUMBER (R_V850_16_SPLIT_OFFSET, 35) /* For ld.bu */ |
RELOC_NUMBER (R_V850_16_S1, 36) /* For ld.w, ld.h st.w st.h */ |
RELOC_NUMBER (R_V850_LO16_S1, 37) /* For ld.w, ld.h st.w st.h */ |
RELOC_NUMBER (R_V850_CALLT_15_16_OFFSET, 38) /* For ld.w, ld.h, ld.hu, st.w, st.h */ |
RELOC_NUMBER (R_V850_32_GOTPCREL, 39) /* GLOBAL_OFFSET_TABLE from pc */ |
RELOC_NUMBER (R_V850_16_GOT, 40) /* GOT ENTRY from gp */ |
RELOC_NUMBER (R_V850_32_GOT, 41) |
RELOC_NUMBER (R_V850_22_PLT, 42) /* For jr */ |
RELOC_NUMBER (R_V850_32_PLT, 43) /* For jr32 */ |
RELOC_NUMBER (R_V850_COPY, 44) |
RELOC_NUMBER (R_V850_GLOB_DAT, 45) |
RELOC_NUMBER (R_V850_JMP_SLOT, 46) |
RELOC_NUMBER (R_V850_RELATIVE, 47) |
RELOC_NUMBER (R_V850_16_GOTOFF, 48) /* From gp */ |
RELOC_NUMBER (R_V850_32_GOTOFF, 49) |
RELOC_NUMBER (R_V850_CODE, 50) |
RELOC_NUMBER (R_V850_DATA, 51) /* For loop */ |
END_RELOC_NUMBERS (R_V850_max) |
/* Processor specific section indices. These sections do not actually |
exist. Symbols with a st_shndx field corresponding to one of these |
values have a special meaning. */ |
/* Small data area common symbol. */ |
#define SHN_V850_SCOMMON SHN_LORESERVE |
/* Tiny data area common symbol. */ |
#define SHN_V850_TCOMMON (SHN_LORESERVE + 1) |
/* Zero data area common symbol. */ |
#define SHN_V850_ZCOMMON (SHN_LORESERVE + 2) |
/* Processor specific section types. */ |
/* Section contains the .scommon data. */ |
#define SHT_V850_SCOMMON 0x70000000 |
/* Section contains the .scommon data. */ |
#define SHT_V850_TCOMMON 0x70000001 |
/* Section contains the .scommon data. */ |
#define SHT_V850_ZCOMMON 0x70000002 |
/* Processor specific section flags. */ |
/* This section must be in the small data area (pointed to by GP). */ |
#define SHF_V850_GPREL 0x10000000 |
/* This section must be in the tiny data area (pointed to by EP). */ |
#define SHF_V850_EPREL 0x20000000 |
/* This section must be in the zero data area (pointed to by R0). */ |
#define SHF_V850_R0REL 0x40000000 |
/* Alternative versions of the above definitions, as specified by the RH850 ABI. */ |
#define EF_RH850_ABI 0xF0000000 |
#define EF_V800_850E3 0x00100000 |
#define EF_RH850_FPU_DOUBLE 0x00000001 /* sizeof(double) == 8. */ |
#define EF_RH850_FPU_SINGLE 0x00000002 /* sizeof(double) == 4. */ |
#define EF_RH850_SIMD 0x00000004 |
#define EF_RH850_CACHE 0x00000008 |
#define EF_RH850_MMU 0x00000010 |
#define EF_RH850_REGMODE22 0x00000020 /* Registers r15-r24 (inclusive) are not used. */ |
#define EF_RH850_REGMODE32 0x00000040 |
#define EF_RH850_DATA_ALIGN8 0x00000080 /* 8-byte alignment supported. */ |
#define EF_RH850_GP_FIX 0x00000100 /* r4 is fixed. */ |
#define EF_RH850_GP_NOFIX 0x00000200 /* r4 is callee save. */ |
#define EF_RH850_EP_FIX 0x00000400 /* r30 is fixed. */ |
#define EF_RH850_EP_NOFIX 0x00000800 /* r30 is callee save. */ |
#define EF_RH850_TP_FIX 0x00001000 /* r5 is fixed. */ |
#define EF_RH850_TP_NOFIX 0x00002000 /* r5 is callee save. */ |
#define EF_RH850_REG2_RESERVE 0x00004000 /* r2 is fixed. */ |
#define EF_RH850_REG2_NORESERVE 0x00008000 /* r2 is callee saved. */ |
#define SHT_RNESAS_IOP SHT_LOUSER /* Used by Renesas linker. */ |
#define SHF_RENESAS_ABS 0x80000000 /* Absolute section. */ |
#define SHF_GHS_ABS 0x00000400 /* Use unknown. */ |
#define STT_RENESAS_ENTRY 14 /* Set for functions called at reset time. */ |
START_RELOC_NUMBERS (v800_reloc_type) |
RELOC_NUMBER (R_V800_NONE, 0x00) |
RELOC_NUMBER (R_V810_NONE, 0x30) |
RELOC_NUMBER (R_V810_BYTE, 0x31) |
RELOC_NUMBER (R_V810_HWORD, 0x32) |
RELOC_NUMBER (R_V810_WORD, 0x33) |
RELOC_NUMBER (R_V810_WLO, 0x34) |
RELOC_NUMBER (R_V810_WHI, 0x35) |
RELOC_NUMBER (R_V810_WHI1, 0x36) |
RELOC_NUMBER (R_V810_GPBYTE, 0x37) |
RELOC_NUMBER (R_V810_GPHWORD, 0x38) |
RELOC_NUMBER (R_V810_GPWORD, 0x39) |
RELOC_NUMBER (R_V810_GPWLO, 0x3a) |
RELOC_NUMBER (R_V810_GPWHI, 0x3b) |
RELOC_NUMBER (R_V810_GPWHI1, 0x3c) |
RELOC_NUMBER (R_V850_HWLO, 0x3d) |
FAKE_RELOC (R_V810_reserved1, 0x3e) |
RELOC_NUMBER (R_V850_EP7BIT, 0x3f) |
RELOC_NUMBER (R_V850_EPHBYTE, 0x40) |
RELOC_NUMBER (R_V850_EPWBYTE, 0x41) |
RELOC_NUMBER (R_V850_REGHWLO, 0x42) |
FAKE_RELOC (R_V810_reserved2, 0x43) |
RELOC_NUMBER (R_V850_GPHWLO, 0x44) |
FAKE_RELOC (R_V810_reserved3, 0x45) |
RELOC_NUMBER (R_V850_PCR22, 0x46) |
RELOC_NUMBER (R_V850_BLO, 0x47) |
RELOC_NUMBER (R_V850_EP4BIT, 0x48) |
RELOC_NUMBER (R_V850_EP5BIT, 0x49) |
RELOC_NUMBER (R_V850_REGBLO, 0x4a) |
RELOC_NUMBER (R_V850_GPBLO, 0x4b) |
RELOC_NUMBER (R_V810_WLO_1, 0x4c) |
RELOC_NUMBER (R_V810_GPWLO_1, 0x4d) |
RELOC_NUMBER (R_V850_BLO_1, 0x4e) |
RELOC_NUMBER (R_V850_HWLO_1, 0x4f) |
FAKE_RELOC (R_V810_reserved4, 0x50) |
RELOC_NUMBER (R_V850_GPBLO_1, 0x51) |
RELOC_NUMBER (R_V850_GPHWLO_1, 0x52) |
FAKE_RELOC (R_V810_reserved5, 0x53) |
RELOC_NUMBER (R_V850_EPBLO, 0x54) |
RELOC_NUMBER (R_V850_EPHWLO, 0x55) |
FAKE_RELOC (R_V810_reserved6, 0x56) |
RELOC_NUMBER (R_V850_EPWLO_N, 0x57) |
RELOC_NUMBER (R_V850_PC32, 0x58) |
RELOC_NUMBER (R_V850_W23BIT, 0x59) |
RELOC_NUMBER (R_V850_GPW23BIT, 0x5a) |
RELOC_NUMBER (R_V850_EPW23BIT, 0x5b) |
RELOC_NUMBER (R_V850_B23BIT, 0x5c) |
RELOC_NUMBER (R_V850_GPB23BIT, 0x5d) |
RELOC_NUMBER (R_V850_EPB23BIT, 0x5e) |
RELOC_NUMBER (R_V850_PC16U, 0x5f) |
RELOC_NUMBER (R_V850_PC17, 0x60) |
RELOC_NUMBER (R_V850_DW8, 0x61) |
RELOC_NUMBER (R_V850_GPDW8, 0x62) |
RELOC_NUMBER (R_V850_EPDW8, 0x63) |
RELOC_NUMBER (R_V850_PC9, 0x64) |
RELOC_NUMBER (R_V810_REGBYTE, 0x65) |
RELOC_NUMBER (R_V810_REGHWORD, 0x66) |
RELOC_NUMBER (R_V810_REGWORD, 0x67) |
RELOC_NUMBER (R_V810_REGWLO, 0x68) |
RELOC_NUMBER (R_V810_REGWHI, 0x69) |
RELOC_NUMBER (R_V810_REGWHI1, 0x6a) |
RELOC_NUMBER (R_V850_REGW23BIT, 0x6b) |
RELOC_NUMBER (R_V850_REGB23BIT, 0x6c) |
RELOC_NUMBER (R_V850_REGDW8, 0x6d) |
RELOC_NUMBER (R_V810_EPBYTE, 0x6e) |
RELOC_NUMBER (R_V810_EPHWORD, 0x6f) |
RELOC_NUMBER (R_V810_EPWORD, 0x70) |
RELOC_NUMBER (R_V850_WLO23, 0x71) |
RELOC_NUMBER (R_V850_WORD_E, 0x72) |
RELOC_NUMBER (R_V850_REGWORD_E, 0x73) |
RELOC_NUMBER (R_V850_WORD, 0x74) |
RELOC_NUMBER (R_V850_GPWORD, 0x75) |
RELOC_NUMBER (R_V850_REGWORD, 0x76) |
RELOC_NUMBER (R_V850_EPWORD, 0x77) |
RELOC_NUMBER (R_V810_TPBYTE, 0x78) |
RELOC_NUMBER (R_V810_TPHWORD, 0x79) |
RELOC_NUMBER (R_V810_TPWORD, 0x7a) |
RELOC_NUMBER (R_V810_TPWLO, 0x7b) |
RELOC_NUMBER (R_V810_TPWHI, 0x7c) |
RELOC_NUMBER (R_V810_TPWHI1, 0x7d) |
RELOC_NUMBER (R_V850_TPHWLO, 0x7e) |
RELOC_NUMBER (R_V850_TPBLO, 0x7f) |
RELOC_NUMBER (R_V810_TPWLO_1, 0x80) |
RELOC_NUMBER (R_V850_TPBLO_1, 0x81) |
RELOC_NUMBER (R_V850_TPHWLO_1, 0x82) |
RELOC_NUMBER (R_V850_TP23BIT, 0x83) |
RELOC_NUMBER (R_V850_TPW23BIT, 0x84) |
RELOC_NUMBER (R_V850_TPDW8, 0x85) |
/* These are defined by the RH850 ABI, but not used. */ |
RELOC_NUMBER (R_V810_ABS32, 0xa0) |
RELOC_NUMBER (R_V850_SYM, 0xe0) |
RELOC_NUMBER (R_V850_OPadd, 0xe1) |
RELOC_NUMBER (R_V850_OPsub, 0xe2) |
RELOC_NUMBER (R_V850_OPsctsize, 0xe3) |
RELOC_NUMBER (R_V850_OPscttop, 0xe4) |
END_RELOC_NUMBERS (R_V800_max) |
#endif /* _ELF_V850_H */ |
/contrib/toolchain/binutils/include/elf/vax.h |
---|
0,0 → 1,51 |
/* VAX ELF support for BFD. |
Copyright (C) 2002, 2010 Free Software Foundation, Inc. |
Contributed by Matt Thomas <matt@3am-software.com>. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_VAX_H |
#define _ELF_VAX_H |
#include "elf/reloc-macros.h" |
/* Relocation types. */ |
START_RELOC_NUMBERS (elf_vax_reloc_type) |
RELOC_NUMBER (R_VAX_NONE, 0) /* No reloc */ |
RELOC_NUMBER (R_VAX_32, 1) /* Direct 32 bit */ |
RELOC_NUMBER (R_VAX_16, 2) /* Direct 16 bit */ |
RELOC_NUMBER (R_VAX_8, 3) /* Direct 8 bit */ |
RELOC_NUMBER (R_VAX_PC32, 4) /* PC relative 32 bit */ |
RELOC_NUMBER (R_VAX_PC16, 5) /* PC relative 16 bit */ |
RELOC_NUMBER (R_VAX_PC8, 6) /* PC relative 8 bit */ |
RELOC_NUMBER (R_VAX_GOT32, 7) /* 32 bit PC relative GOT entry */ |
RELOC_NUMBER (R_VAX_PLT32, 13) /* 32 bit PC relative PLT address */ |
RELOC_NUMBER (R_VAX_COPY, 19) /* Copy symbol at runtime */ |
RELOC_NUMBER (R_VAX_GLOB_DAT, 20) /* Create GOT entry */ |
RELOC_NUMBER (R_VAX_JMP_SLOT, 21) /* Create PLT entry */ |
RELOC_NUMBER (R_VAX_RELATIVE, 22) /* Adjust by program base */ |
/* These are GNU extensions to enable C++ vtable garbage collection. */ |
RELOC_NUMBER (R_VAX_GNU_VTINHERIT, 23) |
RELOC_NUMBER (R_VAX_GNU_VTENTRY, 24) |
END_RELOC_NUMBERS (R_VAX_max) |
/* Processor specific flags for the ELF header e_flags field. */ |
#define EF_VAX_NONPIC 0x0001 /* Object contains non-PIC code */ |
#define EF_VAX_DFLOAT 0x0100 /* Object contains D-Float insn. */ |
#define EF_VAX_GFLOAT 0x0200 /* Object contains G-Float insn. */ |
#endif |
/contrib/toolchain/binutils/include/elf/vxworks.h |
---|
0,0 → 1,33 |
/* VxWorks ELF support for BFD. |
Copyright 2007, 2010 |
Free Software Foundation, Inc. |
Contributed by Nathan Sidwell <nathan@codesourcery.com> |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _ELF_VXWORKS_H |
#define _ELF_VXWORKS_H |
#define DT_VX_WRS_TLS_DATA_START 0x60000010 |
#define DT_VX_WRS_TLS_DATA_SIZE 0x60000011 |
#define DT_VX_WRS_TLS_DATA_ALIGN 0x60000015 |
#define DT_VX_WRS_TLS_VARS_START 0x60000012 |
#define DT_VX_WRS_TLS_VARS_SIZE 0x60000013 |
#endif /* _ELF_VXWORKS_H */ |
/contrib/toolchain/binutils/include/elf/x86-64.h |
---|
0,0 → 1,94 |
/* x86_64 ELF support for BFD. |
Copyright (C) 2000, 2001, 2002, 2004, 2005, 2006, 2008, 2009, 2010 |
Free Software Foundation, Inc. |
Contributed by Jan Hubicka <jh@suse.cz> |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_X86_64_H |
#define _ELF_X86_64_H |
#include "elf/reloc-macros.h" |
START_RELOC_NUMBERS (elf_x86_64_reloc_type) |
RELOC_NUMBER (R_X86_64_NONE, 0) /* No reloc */ |
RELOC_NUMBER (R_X86_64_64, 1) /* Direct 64 bit */ |
RELOC_NUMBER (R_X86_64_PC32, 2) /* PC relative 32 bit signed */ |
RELOC_NUMBER (R_X86_64_GOT32, 3) /* 32 bit GOT entry */ |
RELOC_NUMBER (R_X86_64_PLT32, 4) /* 32 bit PLT address */ |
RELOC_NUMBER (R_X86_64_COPY, 5) /* Copy symbol at runtime */ |
RELOC_NUMBER (R_X86_64_GLOB_DAT, 6) /* Create GOT entry */ |
RELOC_NUMBER (R_X86_64_JUMP_SLOT,7) /* Create PLT entry */ |
RELOC_NUMBER (R_X86_64_RELATIVE, 8) /* Adjust by program base */ |
RELOC_NUMBER (R_X86_64_GOTPCREL, 9) /* 32 bit signed pc relative |
offset to GOT entry */ |
RELOC_NUMBER (R_X86_64_32, 10) /* Direct 32 bit zero extended */ |
RELOC_NUMBER (R_X86_64_32S, 11) /* Direct 32 bit sign extended */ |
RELOC_NUMBER (R_X86_64_16, 12) /* Direct 16 bit zero extended */ |
RELOC_NUMBER (R_X86_64_PC16, 13) /* 16 bit sign extended pc relative*/ |
RELOC_NUMBER (R_X86_64_8, 14) /* Direct 8 bit sign extended */ |
RELOC_NUMBER (R_X86_64_PC8, 15) /* 8 bit sign extended pc relative*/ |
RELOC_NUMBER (R_X86_64_DTPMOD64, 16) /* ID of module containing symbol */ |
RELOC_NUMBER (R_X86_64_DTPOFF64, 17) /* Offset in TLS block */ |
RELOC_NUMBER (R_X86_64_TPOFF64, 18) /* Offset in initial TLS block */ |
RELOC_NUMBER (R_X86_64_TLSGD, 19) /* PC relative offset to GD GOT block */ |
RELOC_NUMBER (R_X86_64_TLSLD, 20) /* PC relative offset to LD GOT block */ |
RELOC_NUMBER (R_X86_64_DTPOFF32, 21) /* Offset in TLS block */ |
RELOC_NUMBER (R_X86_64_GOTTPOFF, 22) /* PC relative offset to IE GOT entry */ |
RELOC_NUMBER (R_X86_64_TPOFF32, 23) /* Offset in initial TLS block */ |
RELOC_NUMBER (R_X86_64_PC64, 24) /* PC relative 64 bit */ |
RELOC_NUMBER (R_X86_64_GOTOFF64, 25) /* 64 bit offset to GOT */ |
RELOC_NUMBER (R_X86_64_GOTPC32, 26) /* 32 bit signed pc relative |
offset to GOT */ |
RELOC_NUMBER (R_X86_64_GOT64, 27) /* 64 bit GOT entry offset */ |
RELOC_NUMBER (R_X86_64_GOTPCREL64, 28) /* 64 bit signed pc relative |
offset to GOT entry */ |
RELOC_NUMBER (R_X86_64_GOTPC64, 29) /* 64 bit signed pc relative |
offset to GOT */ |
RELOC_NUMBER (R_X86_64_GOTPLT64, 30) /* like GOT64, but indicates |
that PLT entry is needed */ |
RELOC_NUMBER (R_X86_64_PLTOFF64, 31) /* 64 bit GOT relative offset |
to PLT entry */ |
RELOC_NUMBER (R_X86_64_SIZE32, 32) /* 32-bit symbol size */ |
RELOC_NUMBER (R_X86_64_SIZE64, 33) /* 64-bit symbol size */ |
RELOC_NUMBER (R_X86_64_GOTPC32_TLSDESC, 34) |
/* 32 bit signed pc relative |
offset to TLS descriptor |
in the GOT. */ |
RELOC_NUMBER (R_X86_64_TLSDESC_CALL, 35) /* Relaxable call through TLS |
descriptor. */ |
RELOC_NUMBER (R_X86_64_TLSDESC, 36) /* 2x64-bit TLS descriptor. */ |
RELOC_NUMBER (R_X86_64_IRELATIVE, 37) /* Adjust indirectly by program base */ |
RELOC_NUMBER (R_X86_64_RELATIVE64, 38) /* 64bit adjust by program base */ |
RELOC_NUMBER (R_X86_64_PC32_BND, 39) /* PC relative 32 bit |
signed with BND prefix */ |
RELOC_NUMBER (R_X86_64_PLT32_BND, 40) /* 32 bit PLT address with |
BND prefix */ |
RELOC_NUMBER (R_X86_64_GNU_VTINHERIT, 250) /* GNU C++ hack */ |
RELOC_NUMBER (R_X86_64_GNU_VTENTRY, 251) /* GNU C++ hack */ |
END_RELOC_NUMBERS (R_X86_64_max) |
/* Processor specific section types. */ |
#define SHT_X86_64_UNWIND 0x70000001 /* unwind information */ |
/* Like SHN_COMMON but the symbol will be allocated in the .lbss |
section. */ |
#define SHN_X86_64_LCOMMON (SHN_LORESERVE + 2) |
#define SHF_X86_64_LARGE 0x10000000 |
#endif |
/contrib/toolchain/binutils/include/elf/xc16x.h |
---|
0,0 → 1,40 |
/* Infineon XC16X ELF support for BFD. |
Copyright 2006, 2010 Free Software Foundation, Inc. |
Contributed by KPIT Cummins Infosystems |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_XC16X_H |
#define _ELF_XC16X_H |
#include "elf/reloc-macros.h" |
/* Relocations. */ |
START_RELOC_NUMBERS (elf_xc16x_reloc_type) |
RELOC_NUMBER (R_XC16X_NONE, 0) |
RELOC_NUMBER (R_XC16X_ABS_8, 1) |
RELOC_NUMBER (R_XC16X_ABS_16, 2) |
RELOC_NUMBER (R_XC16X_ABS_32, 3) |
RELOC_NUMBER (R_XC16X_8_PCREL, 4) |
RELOC_NUMBER (R_XC16X_PAG, 5) |
RELOC_NUMBER (R_XC16X_POF, 6) |
RELOC_NUMBER (R_XC16X_SEG, 7) |
RELOC_NUMBER (R_XC16X_SOF, 8) |
END_RELOC_NUMBERS (R_XC16X_max) |
#endif /* _ELF_XC16X_H */ |
/contrib/toolchain/binutils/include/elf/xgate.h |
---|
0,0 → 1,77 |
/* XGATE ELF support for BFD. |
Copyright 2010, 2011, 2012 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_XGATE_H |
#define _ELF_XGATE_H |
#include "elf/reloc-macros.h" |
/* Relocation types. */ |
START_RELOC_NUMBERS (elf_xgate_reloc_type) |
RELOC_NUMBER (R_XGATE_NONE, 0) |
RELOC_NUMBER (R_XGATE_8, 1) |
RELOC_NUMBER (R_XGATE_PCREL_8, 2) |
RELOC_NUMBER (R_XGATE_16, 3) |
RELOC_NUMBER (R_XGATE_32, 4) |
RELOC_NUMBER (R_XGATE_PCREL_16, 5) |
/* These are GNU extensions to enable C++ vtable garbage collection. */ |
RELOC_NUMBER (R_XGATE_GNU_VTINHERIT, 6) |
RELOC_NUMBER (R_XGATE_GNU_VTENTRY, 7) |
RELOC_NUMBER (R_XGATE_24, 8) |
RELOC_NUMBER (R_XGATE_LO16, 9) |
RELOC_NUMBER (R_XGATE_GPAGE, 10) |
RELOC_NUMBER (R_XGATE_PCREL_9, 11) |
RELOC_NUMBER (R_XGATE_PCREL_10, 12) |
RELOC_NUMBER (R_XGATE_IMM8_LO, 13) |
RELOC_NUMBER (R_XGATE_IMM8_HI, 14) |
RELOC_NUMBER (R_XGATE_IMM3, 15) |
RELOC_NUMBER (R_XGATE_IMM4, 16) |
RELOC_NUMBER (R_XGATE_IMM5, 17) |
/* GNU extension for linker relaxation. |
Mark beginning of a jump instruction (any form). */ |
RELOC_NUMBER (R_XGATE_RL_JUMP, 18) |
/* Mark beginning of Gcc relaxation group instruction. */ |
RELOC_NUMBER (R_XGATE_RL_GROUP, 19) |
END_RELOC_NUMBERS (R_XGATE_max) |
/* Processor specific flags for the ELF header e_flags field. */ |
/* ABI identification. */ |
#define EF_XGATE_ABI 0x00000000F |
/* Integers are 32-bit long. */ |
#define E_XGATE_I32 0x000000001 |
/* Doubles are 64-bit long. */ |
#define E_XGATE_F64 0x000000002 |
#define EF_XGATE_MACH_MASK 0xF0 |
#define EF_XGATE_MACH 0x80 /* XGATE microcontroller. */ |
#define E_M68HCS12X_GLOBAL 0x100 |
/* Identify interrupt handlers. This is used by the debugger to |
correctly compute the stack frame. */ |
#define STO_XGATE_INTERRUPT 0x40 |
#endif |
/contrib/toolchain/binutils/include/elf/xstormy16.h |
---|
0,0 → 1,57 |
/* XSTORMY16 ELF support for BFD. |
Copyright (C) 2001, 2002, 2010 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _ELF_XSTORMY16_H |
#define _ELF_XSTORMY16_H |
#include "elf/reloc-macros.h" |
/* Relocations. */ |
START_RELOC_NUMBERS (elf_xstormy16_reloc_type) |
RELOC_NUMBER (R_XSTORMY16_NONE, 0) |
RELOC_NUMBER (R_XSTORMY16_32, 1) |
RELOC_NUMBER (R_XSTORMY16_16, 2) |
RELOC_NUMBER (R_XSTORMY16_8, 3) |
RELOC_NUMBER (R_XSTORMY16_PC32, 4) |
RELOC_NUMBER (R_XSTORMY16_PC16, 5) |
RELOC_NUMBER (R_XSTORMY16_PC8, 6) |
RELOC_NUMBER (R_XSTORMY16_REL_12, 7) |
RELOC_NUMBER (R_XSTORMY16_24, 8) |
RELOC_NUMBER (R_XSTORMY16_FPTR16, 9) |
RELOC_NUMBER (R_XSTORMY16_LO16, 10) |
RELOC_NUMBER (R_XSTORMY16_HI16, 11) |
RELOC_NUMBER (R_XSTORMY16_12, 12) |
RELOC_NUMBER (R_XSTORMY16_GNU_VTINHERIT, 128) |
RELOC_NUMBER (R_XSTORMY16_GNU_VTENTRY, 129) |
END_RELOC_NUMBERS (R_XSTORMY16_max) |
/* Define the data & instruction memory discriminator. In a linked |
executable, an symbol should be deemed to point to an instruction |
if ((address & XSTORMY16_INSN_MASK) == XSTORMY16_INSN_VALUE), and similarly |
for the data space. See also `ld/emulparams/elf32xstormy16.sh'. */ |
#define XSTORMY16_DATA_MASK 0xffc00000 |
#define XSTORMY16_DATA_VALUE 0x00000000 |
#define XSTORMY16_INSN_MASK 0xffc00000 |
#define XSTORMY16_INSN_VALUE 0x00400000 |
#endif /* _ELF_XSTORMY16_H */ |
/contrib/toolchain/binutils/include/elf/xtensa.h |
---|
0,0 → 1,208 |
/* Xtensa ELF support for BFD. |
Copyright 2003, 2004, 2007, 2008, 2010 Free Software Foundation, Inc. |
Contributed by Bob Wilson (bwilson@tensilica.com) at Tensilica. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, |
USA. */ |
/* This file holds definitions specific to the Xtensa ELF ABI. */ |
#ifndef _ELF_XTENSA_H |
#define _ELF_XTENSA_H |
#include "elf/reloc-macros.h" |
/* Relocations. */ |
START_RELOC_NUMBERS (elf_xtensa_reloc_type) |
RELOC_NUMBER (R_XTENSA_NONE, 0) |
RELOC_NUMBER (R_XTENSA_32, 1) |
RELOC_NUMBER (R_XTENSA_RTLD, 2) |
RELOC_NUMBER (R_XTENSA_GLOB_DAT, 3) |
RELOC_NUMBER (R_XTENSA_JMP_SLOT, 4) |
RELOC_NUMBER (R_XTENSA_RELATIVE, 5) |
RELOC_NUMBER (R_XTENSA_PLT, 6) |
RELOC_NUMBER (R_XTENSA_OP0, 8) |
RELOC_NUMBER (R_XTENSA_OP1, 9) |
RELOC_NUMBER (R_XTENSA_OP2, 10) |
RELOC_NUMBER (R_XTENSA_ASM_EXPAND, 11) |
RELOC_NUMBER (R_XTENSA_ASM_SIMPLIFY, 12) |
RELOC_NUMBER (R_XTENSA_32_PCREL, 14) |
RELOC_NUMBER (R_XTENSA_GNU_VTINHERIT, 15) |
RELOC_NUMBER (R_XTENSA_GNU_VTENTRY, 16) |
RELOC_NUMBER (R_XTENSA_DIFF8, 17) |
RELOC_NUMBER (R_XTENSA_DIFF16, 18) |
RELOC_NUMBER (R_XTENSA_DIFF32, 19) |
RELOC_NUMBER (R_XTENSA_SLOT0_OP, 20) |
RELOC_NUMBER (R_XTENSA_SLOT1_OP, 21) |
RELOC_NUMBER (R_XTENSA_SLOT2_OP, 22) |
RELOC_NUMBER (R_XTENSA_SLOT3_OP, 23) |
RELOC_NUMBER (R_XTENSA_SLOT4_OP, 24) |
RELOC_NUMBER (R_XTENSA_SLOT5_OP, 25) |
RELOC_NUMBER (R_XTENSA_SLOT6_OP, 26) |
RELOC_NUMBER (R_XTENSA_SLOT7_OP, 27) |
RELOC_NUMBER (R_XTENSA_SLOT8_OP, 28) |
RELOC_NUMBER (R_XTENSA_SLOT9_OP, 29) |
RELOC_NUMBER (R_XTENSA_SLOT10_OP, 30) |
RELOC_NUMBER (R_XTENSA_SLOT11_OP, 31) |
RELOC_NUMBER (R_XTENSA_SLOT12_OP, 32) |
RELOC_NUMBER (R_XTENSA_SLOT13_OP, 33) |
RELOC_NUMBER (R_XTENSA_SLOT14_OP, 34) |
RELOC_NUMBER (R_XTENSA_SLOT0_ALT, 35) |
RELOC_NUMBER (R_XTENSA_SLOT1_ALT, 36) |
RELOC_NUMBER (R_XTENSA_SLOT2_ALT, 37) |
RELOC_NUMBER (R_XTENSA_SLOT3_ALT, 38) |
RELOC_NUMBER (R_XTENSA_SLOT4_ALT, 39) |
RELOC_NUMBER (R_XTENSA_SLOT5_ALT, 40) |
RELOC_NUMBER (R_XTENSA_SLOT6_ALT, 41) |
RELOC_NUMBER (R_XTENSA_SLOT7_ALT, 42) |
RELOC_NUMBER (R_XTENSA_SLOT8_ALT, 43) |
RELOC_NUMBER (R_XTENSA_SLOT9_ALT, 44) |
RELOC_NUMBER (R_XTENSA_SLOT10_ALT, 45) |
RELOC_NUMBER (R_XTENSA_SLOT11_ALT, 46) |
RELOC_NUMBER (R_XTENSA_SLOT12_ALT, 47) |
RELOC_NUMBER (R_XTENSA_SLOT13_ALT, 48) |
RELOC_NUMBER (R_XTENSA_SLOT14_ALT, 49) |
RELOC_NUMBER (R_XTENSA_TLSDESC_FN, 50) |
RELOC_NUMBER (R_XTENSA_TLSDESC_ARG, 51) |
RELOC_NUMBER (R_XTENSA_TLS_DTPOFF, 52) |
RELOC_NUMBER (R_XTENSA_TLS_TPOFF, 53) |
RELOC_NUMBER (R_XTENSA_TLS_FUNC, 54) |
RELOC_NUMBER (R_XTENSA_TLS_ARG, 55) |
RELOC_NUMBER (R_XTENSA_TLS_CALL, 56) |
END_RELOC_NUMBERS (R_XTENSA_max) |
/* Processor-specific flags for the ELF header e_flags field. */ |
/* Four-bit Xtensa machine type field. */ |
#define EF_XTENSA_MACH 0x0000000f |
/* Various CPU types. */ |
#define E_XTENSA_MACH 0x00000000 |
/* Leave bits 0xf0 alone in case we ever have more than 16 cpu types. |
Highly unlikely, but what the heck. */ |
#define EF_XTENSA_XT_INSN 0x00000100 |
#define EF_XTENSA_XT_LIT 0x00000200 |
/* Processor-specific dynamic array tags. */ |
/* Offset of the table that records the GOT location(s). */ |
#define DT_XTENSA_GOT_LOC_OFF 0x70000000 |
/* Number of entries in the GOT location table. */ |
#define DT_XTENSA_GOT_LOC_SZ 0x70000001 |
/* Definitions for instruction and literal property tables. The |
tables for ".gnu.linkonce.*" sections are placed in the following |
sections: |
instruction tables: .gnu.linkonce.x.* |
literal tables: .gnu.linkonce.p.* |
*/ |
#define XTENSA_INSN_SEC_NAME ".xt.insn" |
#define XTENSA_LIT_SEC_NAME ".xt.lit" |
#define XTENSA_PROP_SEC_NAME ".xt.prop" |
typedef struct property_table_entry_t |
{ |
bfd_vma address; |
bfd_vma size; |
flagword flags; |
} property_table_entry; |
/* Flags in the property tables to specify whether blocks of memory are |
literals, instructions, data, or unreachable. For instructions, |
blocks that begin loop targets and branch targets are designated. |
Blocks that do not allow density instructions, instruction reordering |
or transformation are also specified. Finally, for branch targets, |
branch target alignment priority is included. Alignment of the next |
block is specified in the current block and the size of the current |
block does not include any fill required to align to the next |
block. */ |
#define XTENSA_PROP_LITERAL 0x00000001 |
#define XTENSA_PROP_INSN 0x00000002 |
#define XTENSA_PROP_DATA 0x00000004 |
#define XTENSA_PROP_UNREACHABLE 0x00000008 |
/* Instruction-only properties at beginning of code. */ |
#define XTENSA_PROP_INSN_LOOP_TARGET 0x00000010 |
#define XTENSA_PROP_INSN_BRANCH_TARGET 0x00000020 |
/* Instruction-only properties about code. */ |
#define XTENSA_PROP_INSN_NO_DENSITY 0x00000040 |
#define XTENSA_PROP_INSN_NO_REORDER 0x00000080 |
/* Historically, NO_TRANSFORM was a property of instructions, |
but it should apply to literals under certain circumstances. */ |
#define XTENSA_PROP_NO_TRANSFORM 0x00000100 |
/* Branch target alignment information. This transmits information |
to the linker optimization about the priority of aligning a |
particular block for branch target alignment: None, low priority, |
high priority, or required. These only need to be checked in |
instruction blocks marked as XTENSA_PROP_INSN_BRANCH_TARGET. |
Common usage is: |
switch (GET_XTENSA_PROP_BT_ALIGN(flags)) |
case XTENSA_PROP_BT_ALIGN_NONE: |
case XTENSA_PROP_BT_ALIGN_LOW: |
case XTENSA_PROP_BT_ALIGN_HIGH: |
case XTENSA_PROP_BT_ALIGN_REQUIRE: |
*/ |
#define XTENSA_PROP_BT_ALIGN_MASK 0x00000600 |
/* No branch target alignment. */ |
#define XTENSA_PROP_BT_ALIGN_NONE 0x0 |
/* Low priority branch target alignment. */ |
#define XTENSA_PROP_BT_ALIGN_LOW 0x1 |
/* High priority branch target alignment. */ |
#define XTENSA_PROP_BT_ALIGN_HIGH 0x2 |
/* Required branch target alignment. */ |
#define XTENSA_PROP_BT_ALIGN_REQUIRE 0x3 |
#define GET_XTENSA_PROP_BT_ALIGN(flag) \ |
(((unsigned)((flag) & (XTENSA_PROP_BT_ALIGN_MASK))) >> 9) |
#define SET_XTENSA_PROP_BT_ALIGN(flag, align) \ |
(((flag) & (~XTENSA_PROP_BT_ALIGN_MASK)) | \ |
(((align) << 9) & XTENSA_PROP_BT_ALIGN_MASK)) |
/* Alignment is specified in the block BEFORE the one that needs |
alignment. Up to 5 bits. Use GET_XTENSA_PROP_ALIGNMENT(flags) to |
get the required alignment specified as a power of 2. Use |
SET_XTENSA_PROP_ALIGNMENT(flags, pow2) to set the required |
alignment. Be careful of side effects since the SET will evaluate |
flags twice. Also, note that the SIZE of a block in the property |
table does not include the alignment size, so the alignment fill |
must be calculated to determine if two blocks are contiguous. |
TEXT_ALIGN is not currently implemented but is a placeholder for a |
possible future implementation. */ |
#define XTENSA_PROP_ALIGN 0x00000800 |
#define XTENSA_PROP_ALIGNMENT_MASK 0x0001f000 |
#define GET_XTENSA_PROP_ALIGNMENT(flag) \ |
(((unsigned)((flag) & (XTENSA_PROP_ALIGNMENT_MASK))) >> 12) |
#define SET_XTENSA_PROP_ALIGNMENT(flag, align) \ |
(((flag) & (~XTENSA_PROP_ALIGNMENT_MASK)) | \ |
(((align) << 12) & XTENSA_PROP_ALIGNMENT_MASK)) |
#define XTENSA_PROP_INSN_ABSLIT 0x00020000 |
#endif /* _ELF_XTENSA_H */ |
/contrib/toolchain/binutils/include/fibheap.h |
---|
0,0 → 1,95 |
/* A Fibonacci heap datatype. |
Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2009 |
Free Software Foundation, Inc. |
Contributed by Daniel Berlin (dan@cgsoftware.com). |
This file is part of GCC. |
GCC is free software; you can redistribute it and/or modify it |
under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2, or (at your option) |
any later version. |
GCC is distributed in the hope that it will be useful, but |
WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with GCC; see the file COPYING. If not, write to |
the Free Software Foundation, 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
/* Fibonacci heaps are somewhat complex, but, there's an article in |
DDJ that explains them pretty well: |
http://www.ddj.com/articles/1997/9701/9701o/9701o.htm?topic=algoritms |
Introduction to algorithms by Corman and Rivest also goes over them. |
The original paper that introduced them is "Fibonacci heaps and their |
uses in improved network optimization algorithms" by Tarjan and |
Fredman (JACM 34(3), July 1987). |
Amortized and real worst case time for operations: |
ExtractMin: O(lg n) amortized. O(n) worst case. |
DecreaseKey: O(1) amortized. O(lg n) worst case. |
Insert: O(2) amortized. O(1) actual. |
Union: O(1) amortized. O(1) actual. */ |
#ifndef _FIBHEAP_H_ |
#define _FIBHEAP_H_ |
#include "ansidecl.h" |
#ifdef __cplusplus |
extern "C" { |
#endif |
typedef long fibheapkey_t; |
typedef struct fibheap |
{ |
size_t nodes; |
struct fibnode *min; |
struct fibnode *root; |
} *fibheap_t; |
typedef struct fibnode |
{ |
struct fibnode *parent; |
struct fibnode *child; |
struct fibnode *left; |
struct fibnode *right; |
fibheapkey_t key; |
void *data; |
#if defined (__GNUC__) && (!defined (SIZEOF_INT) || SIZEOF_INT < 4) |
__extension__ unsigned long int degree : 31; |
__extension__ unsigned long int mark : 1; |
#else |
unsigned int degree : 31; |
unsigned int mark : 1; |
#endif |
} *fibnode_t; |
extern fibheap_t fibheap_new (void); |
extern fibnode_t fibheap_insert (fibheap_t, fibheapkey_t, void *); |
extern int fibheap_empty (fibheap_t); |
extern fibheapkey_t fibheap_min_key (fibheap_t); |
extern fibheapkey_t fibheap_replace_key (fibheap_t, fibnode_t, |
fibheapkey_t); |
extern void *fibheap_replace_key_data (fibheap_t, fibnode_t, |
fibheapkey_t, void *); |
extern void *fibheap_extract_min (fibheap_t); |
extern void *fibheap_min (fibheap_t); |
extern void *fibheap_replace_data (fibheap_t, fibnode_t, void *); |
extern void *fibheap_delete_node (fibheap_t, fibnode_t); |
extern void fibheap_delete (fibheap_t); |
extern fibheap_t fibheap_union (fibheap_t, fibheap_t); |
#ifdef __cplusplus |
} |
#endif |
#endif /* _FIBHEAP_H_ */ |
/contrib/toolchain/binutils/include/filenames.h |
---|
0,0 → 1,97 |
/* Macros for taking apart, interpreting and processing file names. |
These are here because some non-Posix (a.k.a. DOSish) systems have |
drive letter brain-damage at the beginning of an absolute file name, |
use forward- and back-slash in path names interchangeably, and |
some of them have case-insensitive file names. |
Copyright 2000, 2001, 2007, 2010 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef FILENAMES_H |
#define FILENAMES_H |
#include "hashtab.h" /* for hashval_t */ |
#ifdef __cplusplus |
extern "C" { |
#endif |
#if defined(__MSDOS__) || defined(_WIN32) || defined(__OS2__) || defined (__CYGWIN__) |
# ifndef HAVE_DOS_BASED_FILE_SYSTEM |
# define HAVE_DOS_BASED_FILE_SYSTEM 1 |
# endif |
# ifndef HAVE_CASE_INSENSITIVE_FILE_SYSTEM |
# define HAVE_CASE_INSENSITIVE_FILE_SYSTEM 1 |
# endif |
# define HAS_DRIVE_SPEC(f) HAS_DOS_DRIVE_SPEC (f) |
# define IS_DIR_SEPARATOR(c) IS_DOS_DIR_SEPARATOR (c) |
# define IS_ABSOLUTE_PATH(f) IS_DOS_ABSOLUTE_PATH (f) |
#else /* not DOSish */ |
# if defined(__APPLE__) |
# ifndef HAVE_CASE_INSENSITIVE_FILE_SYSTEM |
# define HAVE_CASE_INSENSITIVE_FILE_SYSTEM 1 |
# endif |
# endif /* __APPLE__ */ |
# define HAS_DRIVE_SPEC(f) (0) |
# define IS_DIR_SEPARATOR(c) IS_UNIX_DIR_SEPARATOR (c) |
# define IS_ABSOLUTE_PATH(f) IS_UNIX_ABSOLUTE_PATH (f) |
#endif |
#define IS_DIR_SEPARATOR_1(dos_based, c) \ |
(((c) == '/') \ |
|| (((c) == '\\') && (dos_based))) |
#define HAS_DRIVE_SPEC_1(dos_based, f) \ |
((f)[0] && ((f)[1] == ':') && (dos_based)) |
/* Remove the drive spec from F, assuming HAS_DRIVE_SPEC (f). |
The result is a pointer to the remainder of F. */ |
#define STRIP_DRIVE_SPEC(f) ((f) + 2) |
#define IS_DOS_DIR_SEPARATOR(c) IS_DIR_SEPARATOR_1 (1, c) |
#define IS_DOS_ABSOLUTE_PATH(f) IS_ABSOLUTE_PATH_1 (1, f) |
#define HAS_DOS_DRIVE_SPEC(f) HAS_DRIVE_SPEC_1 (1, f) |
#define IS_UNIX_DIR_SEPARATOR(c) IS_DIR_SEPARATOR_1 (0, c) |
#define IS_UNIX_ABSOLUTE_PATH(f) IS_ABSOLUTE_PATH_1 (0, f) |
/* Note that when DOS_BASED is true, IS_ABSOLUTE_PATH accepts d:foo as |
well, although it is only semi-absolute. This is because the users |
of IS_ABSOLUTE_PATH want to know whether to prepend the current |
working directory to a file name, which should not be done with a |
name like d:foo. */ |
#define IS_ABSOLUTE_PATH_1(dos_based, f) \ |
(IS_DIR_SEPARATOR_1 (dos_based, (f)[0]) \ |
|| HAS_DRIVE_SPEC_1 (dos_based, f)) |
extern int filename_cmp (const char *s1, const char *s2); |
#define FILENAME_CMP(s1, s2) filename_cmp(s1, s2) |
extern int filename_ncmp (const char *s1, const char *s2, |
size_t n); |
extern hashval_t filename_hash (const void *s); |
extern int filename_eq (const void *s1, const void *s2); |
#ifdef __cplusplus |
} |
#endif |
#endif /* FILENAMES_H */ |
/contrib/toolchain/binutils/include/floatformat.h |
---|
0,0 → 1,152 |
/* IEEE floating point support declarations, for GDB, the GNU Debugger. |
Copyright 1991, 1994, 1995, 1997, 2000, 2003, 2005, 2010 |
Free Software Foundation, Inc. |
This file is part of GDB. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#if !defined (FLOATFORMAT_H) |
#define FLOATFORMAT_H 1 |
#include "ansidecl.h" |
/* A floatformat consists of a sign bit, an exponent and a mantissa. Once the |
bytes are concatenated according to the byteorder flag, then each of those |
fields is contiguous. We number the bits with 0 being the most significant |
(i.e. BITS_BIG_ENDIAN type numbering), and specify which bits each field |
contains with the *_start and *_len fields. */ |
/* What is the order of the bytes? */ |
enum floatformat_byteorders { |
/* Standard little endian byte order. |
EX: 1.2345678e10 => 00 00 80 c5 e0 fe 06 42 */ |
floatformat_little, |
/* Standard big endian byte order. |
EX: 1.2345678e10 => 42 06 fe e0 c5 80 00 00 */ |
floatformat_big, |
/* Little endian byte order but big endian word order. |
EX: 1.2345678e10 => e0 fe 06 42 00 00 80 c5 */ |
floatformat_littlebyte_bigword, |
/* VAX byte order. Little endian byte order with 16-bit words. The |
following example is an illustration of the byte order only; VAX |
doesn't have a fully IEEE compliant floating-point format. |
EX: 1.2345678e10 => 80 c5 00 00 06 42 e0 fe */ |
floatformat_vax |
}; |
enum floatformat_intbit { floatformat_intbit_yes, floatformat_intbit_no }; |
struct floatformat |
{ |
enum floatformat_byteorders byteorder; |
unsigned int totalsize; /* Total size of number in bits */ |
/* Sign bit is always one bit long. 1 means negative, 0 means positive. */ |
unsigned int sign_start; |
unsigned int exp_start; |
unsigned int exp_len; |
/* Bias added to a "true" exponent to form the biased exponent. It |
is intentionally signed as, otherwize, -exp_bias can turn into a |
very large number (e.g., given the exp_bias of 0x3fff and a 64 |
bit long, the equation (long)(1 - exp_bias) evaluates to |
4294950914) instead of -16382). */ |
int exp_bias; |
/* Exponent value which indicates NaN. This is the actual value stored in |
the float, not adjusted by the exp_bias. This usually consists of all |
one bits. */ |
unsigned int exp_nan; |
unsigned int man_start; |
unsigned int man_len; |
/* Is the integer bit explicit or implicit? */ |
enum floatformat_intbit intbit; |
/* Internal name for debugging. */ |
const char *name; |
/* Validator method. */ |
int (*is_valid) (const struct floatformat *fmt, const void *from); |
/* Is the format actually the sum of two smaller floating point |
formats (IBM long double, as described in |
gcc/config/rs6000/darwin-ldouble-format)? If so, this is the |
smaller format in question, and the fields sign_start through |
intbit describe the first half. If not, this is NULL. */ |
const struct floatformat *split_half; |
}; |
/* floatformats for IEEE single and double, big and little endian. */ |
extern const struct floatformat floatformat_ieee_half_big; |
extern const struct floatformat floatformat_ieee_half_little; |
extern const struct floatformat floatformat_ieee_single_big; |
extern const struct floatformat floatformat_ieee_single_little; |
extern const struct floatformat floatformat_ieee_double_big; |
extern const struct floatformat floatformat_ieee_double_little; |
/* floatformat for ARM IEEE double, little endian bytes and big endian words */ |
extern const struct floatformat floatformat_ieee_double_littlebyte_bigword; |
/* floatformats for VAX. */ |
extern const struct floatformat floatformat_vax_f; |
extern const struct floatformat floatformat_vax_d; |
extern const struct floatformat floatformat_vax_g; |
/* floatformats for various extendeds. */ |
extern const struct floatformat floatformat_i387_ext; |
extern const struct floatformat floatformat_m68881_ext; |
extern const struct floatformat floatformat_i960_ext; |
extern const struct floatformat floatformat_m88110_ext; |
extern const struct floatformat floatformat_m88110_harris_ext; |
extern const struct floatformat floatformat_arm_ext_big; |
extern const struct floatformat floatformat_arm_ext_littlebyte_bigword; |
/* IA-64 Floating Point register spilt into memory. */ |
extern const struct floatformat floatformat_ia64_spill_big; |
extern const struct floatformat floatformat_ia64_spill_little; |
extern const struct floatformat floatformat_ia64_quad_big; |
extern const struct floatformat floatformat_ia64_quad_little; |
/* IBM long double (double+double). */ |
extern const struct floatformat floatformat_ibm_long_double_big; |
extern const struct floatformat floatformat_ibm_long_double_little; |
/* Convert from FMT to a double. |
FROM is the address of the extended float. |
Store the double in *TO. */ |
extern void |
floatformat_to_double (const struct floatformat *, const void *, double *); |
/* The converse: convert the double *FROM to FMT |
and store where TO points. */ |
extern void |
floatformat_from_double (const struct floatformat *, const double *, void *); |
/* Return non-zero iff the data at FROM is a valid number in format FMT. */ |
extern int |
floatformat_is_valid (const struct floatformat *fmt, const void *from); |
#endif /* defined (FLOATFORMAT_H) */ |
/contrib/toolchain/binutils/include/fnmatch.h |
---|
0,0 → 1,70 |
/* Copyright 1991, 1992, 1993, 1996 Free Software Foundation, Inc. |
NOTE: The canonical source of this file is maintained with the GNU C Library. |
Bugs can be reported to bug-glibc@prep.ai.mit.edu. |
This program is free software; you can redistribute it and/or modify it |
under the terms of the GNU General Public License as published by the |
Free Software Foundation; either version 2, or (at your option) any |
later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
#ifndef _FNMATCH_H |
#define _FNMATCH_H 1 |
#ifdef __cplusplus |
extern "C" { |
#endif |
#if defined (__cplusplus) || (defined (__STDC__) && __STDC__) |
#undef __P |
#define __P(args) args |
#else /* Not C++ or ANSI C. */ |
#undef __P |
#define __P(args) () |
/* We can get away without defining `const' here only because in this file |
it is used only inside the prototype for `fnmatch', which is elided in |
non-ANSI C where `const' is problematical. */ |
#endif /* C++ or ANSI C. */ |
/* We #undef these before defining them because some losing systems |
(HP-UX A.08.07 for example) define these in <unistd.h>. */ |
#undef FNM_PATHNAME |
#undef FNM_NOESCAPE |
#undef FNM_PERIOD |
/* Bits set in the FLAGS argument to `fnmatch'. */ |
#define FNM_PATHNAME (1 << 0) /* No wildcard can ever match `/'. */ |
#define FNM_NOESCAPE (1 << 1) /* Backslashes don't quote special chars. */ |
#define FNM_PERIOD (1 << 2) /* Leading `.' is matched only explicitly. */ |
#if !defined (_POSIX_C_SOURCE) || _POSIX_C_SOURCE < 2 || defined (_GNU_SOURCE) |
#define FNM_FILE_NAME FNM_PATHNAME /* Preferred GNU name. */ |
#define FNM_LEADING_DIR (1 << 3) /* Ignore `/...' after a match. */ |
#define FNM_CASEFOLD (1 << 4) /* Compare without regard to case. */ |
#endif |
/* Value returned by `fnmatch' if STRING does not match PATTERN. */ |
#define FNM_NOMATCH 1 |
/* Match STRING against the filename pattern PATTERN, |
returning zero if it matches, FNM_NOMATCH if not. */ |
extern int fnmatch __P ((const char *__pattern, const char *__string, |
int __flags)); |
#ifdef __cplusplus |
} |
#endif |
#endif /* fnmatch.h */ |
/contrib/toolchain/binutils/include/fopen-bin.h |
---|
0,0 → 1,44 |
/* Macros for the 'type' part of an fopen, freopen or fdopen. |
<Read|Write>[Update]<Binary file|text file> |
This version is for "binary" systems, where text and binary files are |
different. An example is Mess-Dose. Many Unix systems could also |
cope with a "b" in the string, indicating binary files, but some reject this |
(and thereby don't conform to ANSI C, but what else is new?). |
Copyright 1996-2012 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2, or (at your option) |
any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
/* This file is designed for inclusion by host-dependent .h files. No |
user application should include it directly, since that would make |
the application unable to be configured for both "same" and "binary" |
variant systems. */ |
#define FOPEN_RB "rb" |
#define FOPEN_WB "wb" |
#define FOPEN_AB "ab" |
#define FOPEN_RUB "r+b" |
#define FOPEN_WUB "w+b" |
#define FOPEN_AUB "a+b" |
#define FOPEN_RT "r" |
#define FOPEN_WT "w" |
#define FOPEN_AT "a" |
#define FOPEN_RUT "r+" |
#define FOPEN_WUT "w+" |
#define FOPEN_AUT "a+" |
/contrib/toolchain/binutils/include/fopen-same.h |
---|
0,0 → 1,44 |
/* Macros for the 'type' part of an fopen, freopen or fdopen. |
<Read|Write>[Update]<Binary file|text file> |
This version is for "same" systems, where text and binary files are |
the same. An example is Unix. Many Unix systems could also add a |
"b" to the string, indicating binary files, but some reject this |
(and thereby don't conform to ANSI C, but what else is new?). |
Copyright 1996-2012 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2, or (at your option) |
any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
/* This file is designed for inclusion by host-dependent .h files. No |
user application should include it directly, since that would make |
the application unable to be configured for both "same" and "binary" |
variant systems. */ |
#define FOPEN_RB "r" |
#define FOPEN_WB "w" |
#define FOPEN_AB "a" |
#define FOPEN_RUB "r+" |
#define FOPEN_WUB "w+" |
#define FOPEN_AUB "a+" |
#define FOPEN_RT "r" |
#define FOPEN_WT "w" |
#define FOPEN_AT "a" |
#define FOPEN_RUT "r+" |
#define FOPEN_WUT "w+" |
#define FOPEN_AUT "a+" |
/contrib/toolchain/binutils/include/fopen-vms.h |
---|
0,0 → 1,42 |
/* Macros for the 'type' part of an fopen, freopen or fdopen. |
<Read|Write>[Update]<Binary file|text file> |
This version is for VMS systems, where text and binary files are |
different. |
Copyright 1996-2012 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2, or (at your option) |
any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
/* This file is designed for inclusion by host-dependent .h files. No |
user application should include it directly, since that would make |
the application unable to be configured for both "same" and "binary" |
variant systems. */ |
#define FOPEN_RB "rb,rfm=udf,rat=none" |
#define FOPEN_WB "wb,rfm=udf,rat=none" |
#define FOPEN_AB "ab,rfm=udf,rat=none" |
#define FOPEN_RUB "r+b,rfm=udf,rat=none" |
#define FOPEN_WUB "w+b,rfm=udf,rat=none" |
#define FOPEN_AUB "a+b,rfm=udf,rat=none" |
#define FOPEN_RT "r" |
#define FOPEN_WT "w" |
#define FOPEN_AT "a" |
#define FOPEN_RUT "r+" |
#define FOPEN_WUT "w+" |
#define FOPEN_AUT "a+" |
/contrib/toolchain/binutils/include/gdb/ChangeLog |
---|
0,0 → 1,272 |
2013-03-15 Steve Ellcey <sellcey@mips.com> |
* gdb/remote-sim.h (sim_command_completer): Make char arguments const. |
2013-01-01 Joel Brobecker <brobecker@adacore.com> |
Update year range in copyright notice of all files. |
2012-06-23 Doug Evans <dje@google.com> |
* gdb-index.h: New file. |
2012-05-24 Pedro Alves <palves@redhat.com> |
PR gdb/7205 |
Replace TARGET_SIGNAL_ with GDB_SIGNAL_ throughout. |
2012-05-24 Pedro Alves <palves@redhat.com> |
PR gdb/7205 |
Replace target_signal with gdb_signal throughout. |
2012-04-12 Mike Frysinger <vapier@gentoo.org> |
* callback.h (CB_SYS_argc, CB_SYS_argnlen, CB_SYS_argn): Define. |
2012-02-03 Kevin Buettner <kevinb@redhat.com> |
* sim-rl78.h: New file. |
2011-12-03 Mike Frysinger <vapier@gentoo.org> |
* callback.h (cb_get_string): New prototype. |
2011-04-14 Mike Frysinger <vapier@gentoo.org> |
* remote-sim.h (sim_complete_command): New prototype. |
2011-03-05 Mike Frysinger <vapier@gentoo.org> |
* sim-bfin.h: New file. |
2011-01-11 Andrew Burgess <aburgess@broadcom.com> |
* remote-sim.h (sim_store_register): Update the API |
documentation for this function. |
2010-09-06 Pedro Alves <pedro@codesourcery.com> |
* signals.def: Replace all ANY uses by SET with specific numbers. |
* signals.h (ANY): Remove. |
2010-07-31 Jan Kratochvil <jan.kratochvil@redhat.com> |
* signals.h (enum target_signal): Move the content to signals.def. |
Include it. |
* signals.def: New file. |
2010-06-24 Kevin Buettner <kevinb@redhat.com> |
* sim-rx.h (sim_rx_regnum): Add sim_rx_acc_regnum. Adjust |
register order. |
2010-04-13 Mike Frysinger <vapier@gentoo.org> |
* callback.h: Strip PARAMS from prototypes. |
* remote-sim.h: Likewise. |
2010-04-13 Mike Frysinger <vapier@gentoo.org> |
* remote-sim.h (sim_write): Add const to buf arg. |
2009-11-24 DJ Delorie <dj@redhat.com> |
* sim-rx.h: New. |
2009-05-18 Jon Beniston <jon@beniston.com> |
* sim-lm32.h: New file. |
2009-01-07 Hans-Peter Nilsson <hp@axis.com> |
* callback.h (struct host_callback_struct): Mark member error as |
pointing to a noreturn function. |
2008-02-12 M Ranga Swami Reddy <MR.Swami.Reddy@nsc.com> |
* sim-cr16.h: New file. |
2008-01-01 Daniel Jacobowitz <dan@codesourcery.com> |
Updated copyright notices for most files. |
2007-10-15 Daniel Jacobowitz <dan@codesourcery.com> |
* sim-ppc.h (sim_spr_register_name): New prototype. |
2007-10-11 Jesper Nilsson <jesper.nilsson@axis.com> |
* callback.h (cb_is_stdin, cb_is_stdout, cb_is_stderr): Add prototypes. |
2007-08-23 Joel Brobecker <brobecker@adacore.com> |
Switch the license of all .h files to GPLv3. |
2007-01-09 Daniel Jacobowitz <dan@codesourcery.com> |
Updated copyright notices for most files. |
2005-07-08 Ben Elliston <bje@au.ibm.com> |
* callback.h: Remove ANSI_PROTOTYPES conditional code. |
2005-01-28 Hans-Peter Nilsson <hp@axis.com> |
* callback.h (struct host_callback_struct): New members pipe, |
pipe_empty, pipe_nonempty, ispipe, pipe_buffer and |
target_sizeof_int. |
(CB_SYS_pipe): New macro. |
* callback.h: Include "bfd.h". |
(struct host_callback_struct): New member target_endian. |
(cb_store_target_endian): Declare. |
2004-12-15 Hans-Peter Nilsson <hp@axis.com> |
* callback.h (CB_SYS_truncate, CB_SYS_ftruncate): New macros. |
2004-12-13 Hans-Peter Nilsson <hp@axis.com> |
* callback.h (struct host_callback_struct): New member lstat. |
(CB_SYS_lstat): New macro. |
(CB_SYS_rename): New macro. |
2004-09-08 Michael Snyder <msnyder@redhat.com> |
Commited by Corinna Vinschen <vinschen@redhat.com> |
* sim-sh.h: Add new sh2a banked registers. |
2004-08-04 Andrew Cagney <cagney@gnu.org> |
* sim-ppc.h: Add extern "C" wrapper. |
(enum sim_ppc_regnum): Add full list of SPRs. |
2004-08-04 Jim Blandy <jimb@redhat.com> |
* sim-ppc.h: New file. |
2004-06-25 J"orn Rennecke <joern.rennecke@superh.com> |
* callback.h (host_callback_struct): Replace members fdopen and |
alwaysopen with fd_buddy. |
[sim/common: * callback.c: Changed all users. ] |
2003-10-31 Kevin Buettner <kevin@redhat.com> |
* sim-frv.h: New file. |
2003-10-15 J"orn Rennecke <joern.rennecke@superh.com> |
* callback.h (struct host_callback_struct): New members ftruncate |
and truncate. |
2003-06-10 Corinna Vinschen <vinschen@redhat.com> |
* gdb/fileio.h: New file. |
2003-05-07 Andrew Cagney <cagney@redhat.com> |
* sim-d10v.h (sim_d10v_translate_addr): Add regcache parameter. |
(sim_d10v_translate_imap_addr): Add regcache parameter. |
(sim_d10v_translate_dmap_addr): Ditto. |
2003-03-27 Nick Clifton <nickc@redhat.com> |
* sim-arm.h (sim_arm_regs): Add iWMMXt registers. |
2003-03-20 Nick Clifton <nickc@redhat.com> |
* sim-arm.h (sim_arm_regs): Add Maverick co-processor |
registers. |
2003-02-27 Andrew Cagney <cagney@redhat.com> |
* remote-sim.h (sim_open, sim_load, sim_create_inferior): Rename |
_bfd to bfd. |
2003-02-20 Andrew Cagney <ac131313@redhat.com> |
* remote-sim.h (SIM_RC): Delete unused SIM_RC_UNKNOWN_BREAKPOINT, |
SIM_RC_INSUFFICIENT_RESOURCES and SIM_RC_DUPLICATE_BREAKPOINT. |
(sim_set_breakpoint, sim_clear_breakpoint): Delete declarations. |
(sim_clear_all_breakpoints, sim_enable_breakpoint): Ditto. |
(sim_enable_all_breakpoints, sim_disable_breakpoint): Ditto. |
(sim_disable_all_breakpoints): Ditto. |
2002-12-26 Kazu Hirata <kazu@cs.umass.edu> |
* sim-h8300.h: Remove ^M. |
2002-07-29 Andrey Volkov <avolkov@transas.com> |
* sim-h8300.h: Rename all enums from H8300_ to SIM_H8300_ |
prefix. |
2002-07-23 Andrey Volkov <avolkov@transas.com> |
* sim-h8300.h: New file. |
2002-07-17 Andrew Cagney <cagney@redhat.com> |
* remote-sim.h: Update copyright. |
(sim_set_callbacks, sim_size, sim_trace) |
(sim_set_trace, sim_set_profile_size, sim_kill): Delete. Moved to |
"sim/common/run-sim.h". |
Wed Jul 17 19:36:38 2002 J"orn Rennecke <joern.rennecke@superh.com> |
* sim-sh.h: Add enum constants for sh[1-4], sh3e, sh3?-dsp, |
renumbering the sh-dsp registers to use distinct numbers. |
2002-06-15 Andrew Cagney <ac131313@redhat.com> |
* sim-arm.h (enum sim_arm_regs): Rename sim_arm_regnum. |
2002-06-12 Andrew Cagney <ac131313@redhat.com> |
* sim-arm.h: New file. |
2002-06-08 Andrew Cagney <cagney@redhat.com> |
* callback.h: Copy to here from directory above. |
* remote-sim.h: Copy to here from directory above. |
2002-06-01 Andrew Cagney <ac131313@redhat.com> |
* sim-d10v.h (sim_d10v_regs): Expand to include all registers. |
Update copyright. |
2002-05-23 Andrew Cagney <ac131313@redhat.com> |
* sim-d10v.h: New file. Moved from include/sim-d10v.h. |
2002-05-10 Elena Zannoni <ezannoni@redhat.com> |
* sim-sh.h: New file, for sh gdb<->sim interface. |
2002-05-09 Daniel Jacobowitz <drow@mvista.com> |
* signals.h: Update comments. |
(enum target_signal): Remove conditional compilation around |
Mach-specific signals. Move them to after TARGET_SIGNAL_DEFAULT. |
2002-03-10 Daniel Jacobowitz <drow@mvista.com> |
* signals.h: New file, from gdb/defs.h. |
Copyright (C) 2002-2013 Free Software Foundation, Inc. |
Copying and distribution of this file, with or without modification, |
are permitted in any medium without royalty provided the copyright |
notice and this notice are preserved. |
Local Variables: |
mode: change-log |
left-margin: 8 |
fill-column: 74 |
version-control: never |
End: |
/contrib/toolchain/binutils/include/gdb/callback.h |
---|
0,0 → 1,338 |
/* Remote target system call callback support. |
Copyright 1997-2013 Free Software Foundation, Inc. |
Contributed by Cygnus Solutions. |
This file is part of GDB. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
/* This interface isn't intended to be specific to any particular kind |
of remote (hardware, simulator, whatever). As such, support for it |
(e.g. sim/common/callback.c) should *not* live in the simulator source |
tree, nor should it live in the gdb source tree. */ |
/* There are various ways to handle system calls: |
1) Have a simulator intercept the appropriate trap instruction and |
directly perform the system call on behalf of the target program. |
This is the typical way of handling system calls for embedded targets. |
[Handling system calls for embedded targets isn't that much of an |
oxymoron as running compiler testsuites make use of the capability.] |
This method of system call handling is done when STATE_ENVIRONMENT |
is ENVIRONMENT_USER. |
2) Have a simulator emulate the hardware as much as possible. |
If the program running on the real hardware communicates with some sort |
of target manager, one would want to be able to run this program on the |
simulator as well. |
This method of system call handling is done when STATE_ENVIRONMENT |
is ENVIRONMENT_OPERATING. |
*/ |
#ifndef CALLBACK_H |
#define CALLBACK_H |
/* ??? The reason why we check for va_start here should be documented. */ |
#ifndef va_start |
#include <ansidecl.h> |
#include <stdarg.h> |
#endif |
/* Needed for enum bfd_endian. */ |
#include "bfd.h" |
/* Mapping of host/target values. */ |
/* ??? For debugging purposes, one might want to add a string of the |
name of the symbol. */ |
typedef struct { |
int host_val; |
int target_val; |
} CB_TARGET_DEFS_MAP; |
#define MAX_CALLBACK_FDS 10 |
/* Forward decl for stat/fstat. */ |
struct stat; |
typedef struct host_callback_struct host_callback; |
struct host_callback_struct |
{ |
int (*close) (host_callback *,int); |
int (*get_errno) (host_callback *); |
int (*isatty) (host_callback *, int); |
int (*lseek) (host_callback *, int, long , int); |
int (*open) (host_callback *, const char*, int mode); |
int (*read) (host_callback *,int, char *, int); |
int (*read_stdin) ( host_callback *, char *, int); |
int (*rename) (host_callback *, const char *, const char *); |
int (*system) (host_callback *, const char *); |
long (*time) (host_callback *, long *); |
int (*unlink) (host_callback *, const char *); |
int (*write) (host_callback *,int, const char *, int); |
int (*write_stdout) (host_callback *, const char *, int); |
void (*flush_stdout) (host_callback *); |
int (*write_stderr) (host_callback *, const char *, int); |
void (*flush_stderr) (host_callback *); |
int (*stat) (host_callback *, const char *, struct stat *); |
int (*fstat) (host_callback *, int, struct stat *); |
int (*lstat) (host_callback *, const char *, struct stat *); |
int (*ftruncate) (host_callback *, int, long); |
int (*truncate) (host_callback *, const char *, long); |
int (*pipe) (host_callback *, int *); |
/* Called by the framework when a read call has emptied a pipe buffer. */ |
void (*pipe_empty) (host_callback *, int read_fd, int write_fd); |
/* Called by the framework when a write call makes a pipe buffer |
non-empty. */ |
void (*pipe_nonempty) (host_callback *, int read_fd, int write_fd); |
/* When present, call to the client to give it the oportunity to |
poll any io devices for a request to quit (indicated by a nonzero |
return value). */ |
int (*poll_quit) (host_callback *); |
/* Used when the target has gone away, so we can close open |
handles and free memory etc etc. */ |
int (*shutdown) (host_callback *); |
int (*init) (host_callback *); |
/* depreciated, use vprintf_filtered - Talk to the user on a console. */ |
void (*printf_filtered) (host_callback *, const char *, ...); |
/* Talk to the user on a console. */ |
void (*vprintf_filtered) (host_callback *, const char *, va_list); |
/* Same as vprintf_filtered but to stderr. */ |
void (*evprintf_filtered) (host_callback *, const char *, va_list); |
/* Print an error message and "exit". |
In the case of gdb "exiting" means doing a longjmp back to the main |
command loop. */ |
void (*error) (host_callback *, const char *, ...) |
#ifdef __GNUC__ |
__attribute__ ((__noreturn__)) |
#endif |
; |
int last_errno; /* host format */ |
int fdmap[MAX_CALLBACK_FDS]; |
/* fd_buddy is used to contruct circular lists of target fds that point to |
the same host fd. A uniquely mapped fd points to itself; for a closed |
one, fd_buddy has the value -1. The host file descriptors for stdin / |
stdout / stderr are never closed by the simulators, so they are put |
in a special fd_buddy circular list which also has MAX_CALLBACK_FDS |
as a member. */ |
/* ??? We don't have a callback entry for dup, although it is trival to |
implement now. */ |
short fd_buddy[MAX_CALLBACK_FDS+1]; |
/* 0 = none, >0 = reader (index of writer), |
<0 = writer (negative index of reader). |
If abs (ispipe[N]) == N, then N is an end of a pipe whose other |
end is closed. */ |
short ispipe[MAX_CALLBACK_FDS]; |
/* A writer stores the buffer at its index. Consecutive writes |
realloc the buffer and add to the size. The reader indicates the |
read part in its .size, until it has consumed it all, at which |
point it deallocates the buffer and zeroes out both sizes. */ |
struct pipe_write_buffer |
{ |
int size; |
char *buffer; |
} pipe_buffer[MAX_CALLBACK_FDS]; |
/* System call numbers. */ |
CB_TARGET_DEFS_MAP *syscall_map; |
/* Errno values. */ |
CB_TARGET_DEFS_MAP *errno_map; |
/* Flags to the open system call. */ |
CB_TARGET_DEFS_MAP *open_map; |
/* Signal numbers. */ |
CB_TARGET_DEFS_MAP *signal_map; |
/* Layout of `stat' struct. |
The format is a series of "name,length" pairs separated by colons. |
Empty space is indicated with a `name' of "space". |
All padding must be explicitly mentioned. |
Lengths are in bytes. If this needs to be extended to bits, |
use "name.bits". |
Example: "st_dev,4:st_ino,4:st_mode,4:..." */ |
const char *stat_map; |
enum bfd_endian target_endian; |
/* Size of an "int" on the target (for syscalls whose ABI uses "int"). |
This must include padding, and only padding-at-higher-address is |
supported. For example, a 64-bit target with 32-bit int:s which |
are padded to 64 bits when in an array, should supposedly set this |
to 8. The default is 4 which matches ILP32 targets and 64-bit |
targets with 32-bit ints and no padding. */ |
int target_sizeof_int; |
/* Marker for those wanting to do sanity checks. |
This should remain the last member of this struct to help catch |
miscompilation errors. */ |
#define HOST_CALLBACK_MAGIC 4705 /* teds constant */ |
int magic; |
}; |
extern host_callback default_callback; |
/* Canonical versions of system call numbers. |
It's not intended to willy-nilly throw every system call ever heard |
of in here. Only include those that have an important use. |
??? One can certainly start a discussion over the ones that are currently |
here, but that will always be true. */ |
/* These are used by the ANSI C support of libc. */ |
#define CB_SYS_exit 1 |
#define CB_SYS_open 2 |
#define CB_SYS_close 3 |
#define CB_SYS_read 4 |
#define CB_SYS_write 5 |
#define CB_SYS_lseek 6 |
#define CB_SYS_unlink 7 |
#define CB_SYS_getpid 8 |
#define CB_SYS_kill 9 |
#define CB_SYS_fstat 10 |
/*#define CB_SYS_sbrk 11 - not currently a system call, but reserved. */ |
/* ARGV support. */ |
#define CB_SYS_argvlen 12 |
#define CB_SYS_argv 13 |
/* These are extras added for one reason or another. */ |
#define CB_SYS_chdir 14 |
#define CB_SYS_stat 15 |
#define CB_SYS_chmod 16 |
#define CB_SYS_utime 17 |
#define CB_SYS_time 18 |
/* More standard syscalls. */ |
#define CB_SYS_lstat 19 |
#define CB_SYS_rename 20 |
#define CB_SYS_truncate 21 |
#define CB_SYS_ftruncate 22 |
#define CB_SYS_pipe 23 |
/* New ARGV support. */ |
#define CB_SYS_argc 24 |
#define CB_SYS_argnlen 25 |
#define CB_SYS_argn 26 |
/* Struct use to pass and return information necessary to perform a |
system call. */ |
/* FIXME: Need to consider target word size. */ |
typedef struct cb_syscall { |
/* The target's value of what system call to perform. */ |
int func; |
/* The arguments to the syscall. */ |
long arg1, arg2, arg3, arg4; |
/* The result. */ |
long result; |
/* Some system calls have two results. */ |
long result2; |
/* The target's errno value, or 0 if success. |
This is converted to the target's value with host_to_target_errno. */ |
int errcode; |
/* Working space to be used by memory read/write callbacks. */ |
PTR p1; |
PTR p2; |
long x1,x2; |
/* Callbacks for reading/writing memory (e.g. for read/write syscalls). |
??? long or unsigned long might be better to use for the `count' |
argument here. We mimic sim_{read,write} for now. Be careful to |
test any changes with -Wall -Werror, mixed signed comparisons |
will get you. */ |
int (*read_mem) (host_callback * /*cb*/, struct cb_syscall * /*sc*/, |
unsigned long /*taddr*/, char * /*buf*/, |
int /*bytes*/); |
int (*write_mem) (host_callback * /*cb*/, struct cb_syscall * /*sc*/, |
unsigned long /*taddr*/, const char * /*buf*/, |
int /*bytes*/); |
/* For sanity checking, should be last entry. */ |
int magic; |
} CB_SYSCALL; |
/* Magic number sanity checker. */ |
#define CB_SYSCALL_MAGIC 0x12344321 |
/* Macro to initialize CB_SYSCALL. Called first, before filling in |
any fields. */ |
#define CB_SYSCALL_INIT(sc) \ |
do { \ |
memset ((sc), 0, sizeof (*(sc))); \ |
(sc)->magic = CB_SYSCALL_MAGIC; \ |
} while (0) |
/* Return codes for various interface routines. */ |
typedef enum { |
CB_RC_OK = 0, |
/* generic error */ |
CB_RC_ERR, |
/* either file not found or no read access */ |
CB_RC_ACCESS, |
CB_RC_NO_MEM |
} CB_RC; |
/* Read in target values for system call numbers, errno values, signals. */ |
CB_RC cb_read_target_syscall_maps (host_callback *, const char *); |
/* Translate target to host syscall function numbers. */ |
int cb_target_to_host_syscall (host_callback *, int); |
/* Translate host to target errno value. */ |
int cb_host_to_target_errno (host_callback *, int); |
/* Translate target to host open flags. */ |
int cb_target_to_host_open (host_callback *, int); |
/* Translate target signal number to host. */ |
int cb_target_to_host_signal (host_callback *, int); |
/* Translate host signal number to target. */ |
int cb_host_to_gdb_signal (host_callback *, int); |
/* Translate host stat struct to target. |
If stat struct ptr is NULL, just compute target stat struct size. |
Result is size of target stat struct or 0 if error. */ |
int cb_host_to_target_stat (host_callback *, const struct stat *, PTR); |
/* Translate a value to target endian. */ |
void cb_store_target_endian (host_callback *, char *, int, long); |
/* Tests for special fds. */ |
int cb_is_stdin (host_callback *, int); |
int cb_is_stdout (host_callback *, int); |
int cb_is_stderr (host_callback *, int); |
/* Read a string out of the target. */ |
int cb_get_string (host_callback *, CB_SYSCALL *, char *, int, unsigned long); |
/* Perform a system call. */ |
CB_RC cb_syscall (host_callback *, CB_SYSCALL *); |
#endif |
/contrib/toolchain/binutils/include/gdb/fileio.h |
---|
0,0 → 1,144 |
/* Hosted File I/O interface definitions, for GDB, the GNU Debugger. |
Copyright 2003-2013 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
#ifndef GDB_FILEIO_H_ |
#define GDB_FILEIO_H_ |
/* The following flags are defined to be independent of the host |
as well as the target side implementation of these constants. |
All constants are defined with a leading FILEIO_ in the name |
to allow the usage of these constants together with the |
corresponding implementation dependent constants in one module. */ |
/* open(2) flags */ |
#define FILEIO_O_RDONLY 0x0 |
#define FILEIO_O_WRONLY 0x1 |
#define FILEIO_O_RDWR 0x2 |
#define FILEIO_O_APPEND 0x8 |
#define FILEIO_O_CREAT 0x200 |
#define FILEIO_O_TRUNC 0x400 |
#define FILEIO_O_EXCL 0x800 |
#define FILEIO_O_SUPPORTED (FILEIO_O_RDONLY | FILEIO_O_WRONLY| \ |
FILEIO_O_RDWR | FILEIO_O_APPEND| \ |
FILEIO_O_CREAT | FILEIO_O_TRUNC| \ |
FILEIO_O_EXCL) |
/* mode_t bits */ |
#define FILEIO_S_IFREG 0100000 |
#define FILEIO_S_IFDIR 040000 |
#define FILEIO_S_IFCHR 020000 |
#define FILEIO_S_IRUSR 0400 |
#define FILEIO_S_IWUSR 0200 |
#define FILEIO_S_IXUSR 0100 |
#define FILEIO_S_IRWXU 0700 |
#define FILEIO_S_IRGRP 040 |
#define FILEIO_S_IWGRP 020 |
#define FILEIO_S_IXGRP 010 |
#define FILEIO_S_IRWXG 070 |
#define FILEIO_S_IROTH 04 |
#define FILEIO_S_IWOTH 02 |
#define FILEIO_S_IXOTH 01 |
#define FILEIO_S_IRWXO 07 |
#define FILEIO_S_SUPPORTED (FILEIO_S_IFREG|FILEIO_S_IFDIR| \ |
FILEIO_S_IRWXU|FILEIO_S_IRWXG| \ |
FILEIO_S_IRWXO) |
/* lseek(2) flags */ |
#define FILEIO_SEEK_SET 0 |
#define FILEIO_SEEK_CUR 1 |
#define FILEIO_SEEK_END 2 |
/* errno values */ |
#define FILEIO_EPERM 1 |
#define FILEIO_ENOENT 2 |
#define FILEIO_EINTR 4 |
#define FILEIO_EIO 5 |
#define FILEIO_EBADF 9 |
#define FILEIO_EACCES 13 |
#define FILEIO_EFAULT 14 |
#define FILEIO_EBUSY 16 |
#define FILEIO_EEXIST 17 |
#define FILEIO_ENODEV 19 |
#define FILEIO_ENOTDIR 20 |
#define FILEIO_EISDIR 21 |
#define FILEIO_EINVAL 22 |
#define FILEIO_ENFILE 23 |
#define FILEIO_EMFILE 24 |
#define FILEIO_EFBIG 27 |
#define FILEIO_ENOSPC 28 |
#define FILEIO_ESPIPE 29 |
#define FILEIO_EROFS 30 |
#define FILEIO_ENOSYS 88 |
#define FILEIO_ENAMETOOLONG 91 |
#define FILEIO_EUNKNOWN 9999 |
/* limits */ |
#define FILEIO_INT_MIN -2147483648L |
#define FILEIO_INT_MAX 2147483647L |
#define FILEIO_UINT_MAX 4294967295UL |
#define FILEIO_LONG_MIN -9223372036854775808LL |
#define FILEIO_LONG_MAX 9223372036854775807LL |
#define FILEIO_ULONG_MAX 18446744073709551615ULL |
/* Integral types as used in protocol. */ |
#if 0 |
typedef __int32_t fio_int_t; |
typedef __uint32_t fio_uint_t, fio_mode_t, fio_time_t; |
typedef __int64_t fio_long_t; |
typedef __uint64_t fio_ulong_t; |
#endif |
#define FIO_INT_LEN 4 |
#define FIO_UINT_LEN 4 |
#define FIO_MODE_LEN 4 |
#define FIO_TIME_LEN 4 |
#define FIO_LONG_LEN 8 |
#define FIO_ULONG_LEN 8 |
typedef char fio_int_t[FIO_INT_LEN]; |
typedef char fio_uint_t[FIO_UINT_LEN]; |
typedef char fio_mode_t[FIO_MODE_LEN]; |
typedef char fio_time_t[FIO_TIME_LEN]; |
typedef char fio_long_t[FIO_LONG_LEN]; |
typedef char fio_ulong_t[FIO_ULONG_LEN]; |
/* Struct stat as used in protocol. For complete independence |
of host/target systems, it's defined as an array with offsets |
to the members. */ |
struct fio_stat { |
fio_uint_t fst_dev; |
fio_uint_t fst_ino; |
fio_mode_t fst_mode; |
fio_uint_t fst_nlink; |
fio_uint_t fst_uid; |
fio_uint_t fst_gid; |
fio_uint_t fst_rdev; |
fio_ulong_t fst_size; |
fio_ulong_t fst_blksize; |
fio_ulong_t fst_blocks; |
fio_time_t fst_atime; |
fio_time_t fst_mtime; |
fio_time_t fst_ctime; |
}; |
struct fio_timeval { |
fio_time_t ftv_sec; |
fio_long_t ftv_usec; |
}; |
#endif /* GDB_FILEIO_H_ */ |
/contrib/toolchain/binutils/include/gdb/gdb-index.h |
---|
0,0 → 1,99 |
/* Public attributes of the .gdb_index section. |
Copyright 2012-2013 Free Software Foundation, Inc. |
This file is part of GDB. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
/* This file contains values for understanding the .gdb_index section |
needed by more than just GDB, e.g. readelf. */ |
#ifndef GDB_INDEX_H |
#define GDB_INDEX_H |
/* Each symbol in .gdb_index refers to a set of CUs that defines the symbol. |
Each CU is represented by a 32 bit number that is the index of the CU in |
the CU table, plus some attributes of the use of the symbol in that CU. |
The values are defined such that if all the bits are zero, then no |
special meaning is assigned to any of them. This is done to preserve |
compatibility with older indices. The way this is done is to specify |
that if the GDB_INDEX_SYMBOL_KIND value is zero then all other attribute |
bits must be zero. |
0-23 CU index |
24-27 reserved |
28-30 symbol kind |
31 0 == global, 1 == static |
Bits 24-27 are reserved because it's easier to relax restrictions than |
it is to impose them after the fact. At present 24 bits to represent |
the CU index is plenty. If we need more bits for the CU index or for |
attributes then we have them. */ |
/* Whether the symbol is in GLOBAL_BLOCK (== 0) or STATIC_BLOCK (== 1). */ |
#define GDB_INDEX_SYMBOL_STATIC_SHIFT 31 |
#define GDB_INDEX_SYMBOL_STATIC_MASK 1 |
#define GDB_INDEX_SYMBOL_STATIC_VALUE(cu_index) \ |
(((cu_index) >> GDB_INDEX_SYMBOL_STATIC_SHIFT) & GDB_INDEX_SYMBOL_STATIC_MASK) |
#define GDB_INDEX_SYMBOL_STATIC_SET_VALUE(cu_index, value) \ |
do { \ |
(cu_index) |= (((value) & GDB_INDEX_SYMBOL_STATIC_MASK) \ |
<< GDB_INDEX_SYMBOL_STATIC_SHIFT); \ |
} while (0) |
/* The kind of the symbol. |
We don't use GDB's internal values as these numbers are published |
so that other tools can build and read .gdb_index. */ |
typedef enum { |
/* Special value to indicate no attributes are present. */ |
GDB_INDEX_SYMBOL_KIND_NONE = 0, |
GDB_INDEX_SYMBOL_KIND_TYPE = 1, |
GDB_INDEX_SYMBOL_KIND_VARIABLE = 2, |
GDB_INDEX_SYMBOL_KIND_FUNCTION = 3, |
GDB_INDEX_SYMBOL_KIND_OTHER = 4, |
/* We currently allocate 3 bits to record the symbol kind. |
Give the unused bits a value so gdb will print them sensibly. */ |
GDB_INDEX_SYMBOL_KIND_UNUSED5 = 5, |
GDB_INDEX_SYMBOL_KIND_UNUSED6 = 6, |
GDB_INDEX_SYMBOL_KIND_UNUSED7 = 7, |
} gdb_index_symbol_kind; |
#define GDB_INDEX_SYMBOL_KIND_SHIFT 28 |
#define GDB_INDEX_SYMBOL_KIND_MASK 7 |
#define GDB_INDEX_SYMBOL_KIND_VALUE(cu_index) \ |
((gdb_index_symbol_kind) (((cu_index) >> GDB_INDEX_SYMBOL_KIND_SHIFT) \ |
& GDB_INDEX_SYMBOL_KIND_MASK)) |
#define GDB_INDEX_SYMBOL_KIND_SET_VALUE(cu_index, value) \ |
do { \ |
(cu_index) |= (((value) & GDB_INDEX_SYMBOL_KIND_MASK) \ |
<< GDB_INDEX_SYMBOL_KIND_SHIFT); \ |
} while (0) |
#define GDB_INDEX_RESERVED_SHIFT 24 |
#define GDB_INDEX_RESERVED_MASK 15 |
#define GDB_INDEX_RESERVED_VALUE(cu_index) \ |
(((cu_index) >> GDB_INDEX_RESERVED_SHIFT) & GDB_INDEX_RESERVED_MASK) |
/* CU index. */ |
#define GDB_INDEX_CU_BITSIZE 24 |
#define GDB_INDEX_CU_MASK ((1 << GDB_INDEX_CU_BITSIZE) - 1) |
#define GDB_INDEX_CU_VALUE(cu_index) ((cu_index) & GDB_INDEX_CU_MASK) |
#define GDB_INDEX_CU_SET_VALUE(cu_index, value) \ |
do { \ |
(cu_index) |= (value) & GDB_INDEX_CU_MASK; \ |
} while (0) |
#endif /* GDB_INDEX_H */ |
/contrib/toolchain/binutils/include/gdb/remote-sim.h |
---|
0,0 → 1,287 |
/* This file defines the interface between the simulator and gdb. |
Copyright 1993-2013 Free Software Foundation, Inc. |
This file is part of GDB. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
#if !defined (REMOTE_SIM_H) |
#define REMOTE_SIM_H 1 |
#ifdef __cplusplus |
extern "C" { |
#endif |
/* This file is used when building stand-alone simulators, so isolate this |
file from gdb. */ |
/* Pick up CORE_ADDR_TYPE if defined (from gdb), otherwise use same value as |
gdb does (unsigned int - from defs.h). */ |
#ifndef CORE_ADDR_TYPE |
typedef unsigned int SIM_ADDR; |
#else |
typedef CORE_ADDR_TYPE SIM_ADDR; |
#endif |
/* Semi-opaque type used as result of sim_open and passed back to all |
other routines. "desc" is short for "descriptor". |
It is up to each simulator to define `sim_state'. */ |
typedef struct sim_state *SIM_DESC; |
/* Values for `kind' arg to sim_open. */ |
typedef enum { |
SIM_OPEN_STANDALONE, /* simulator used standalone (run.c) */ |
SIM_OPEN_DEBUG /* simulator used by debugger (gdb) */ |
} SIM_OPEN_KIND; |
/* Return codes from various functions. */ |
typedef enum { |
SIM_RC_FAIL = 0, |
SIM_RC_OK = 1 |
} SIM_RC; |
/* The bfd struct, as an opaque type. */ |
struct bfd; |
/* Main simulator entry points. */ |
/* Create a fully initialized simulator instance. |
(This function is called when the simulator is selected from the |
gdb command line.) |
KIND specifies how the simulator shall be used. Currently there |
are only two kinds: stand-alone and debug. |
CALLBACK specifies a standard host callback (defined in callback.h). |
ABFD, when non NULL, designates a target program. The program is |
not loaded. |
ARGV is a standard ARGV pointer such as that passed from the |
command line. The syntax of the argument list is is assumed to be |
``SIM-PROG { SIM-OPTION } [ TARGET-PROGRAM { TARGET-OPTION } ]''. |
The trailing TARGET-PROGRAM and args are only valid for a |
stand-alone simulator. |
On success, the result is a non NULL descriptor that shall be |
passed to the other sim_foo functions. While the simulator |
configuration can be parameterized by (in decreasing precedence) |
ARGV's SIM-OPTION, ARGV's TARGET-PROGRAM and the ABFD argument, the |
successful creation of the simulator shall not dependent on the |
presence of any of these arguments/options. |
Hardware simulator: The created simulator shall be sufficiently |
initialized to handle, with out restrictions any client requests |
(including memory reads/writes, register fetch/stores and a |
resume). |
Process simulator: that process is not created until a call to |
sim_create_inferior. FIXME: What should the state of the simulator |
be? */ |
SIM_DESC sim_open (SIM_OPEN_KIND kind, struct host_callback_struct *callback, struct bfd *abfd, char **argv); |
/* Destory a simulator instance. |
QUITTING is non-zero if we cannot hang on errors. |
This may involve freeing target memory and closing any open files |
and mmap'd areas. You cannot assume sim_kill has already been |
called. */ |
void sim_close (SIM_DESC sd, int quitting); |
/* Load program PROG into the simulators memory. |
If ABFD is non-NULL, the bfd for the file has already been opened. |
The result is a return code indicating success. |
Hardware simulator: Normally, each program section is written into |
memory according to that sections LMA using physical (direct) |
addressing. The exception being systems, such as PPC/CHRP, which |
support more complicated program loaders. A call to this function |
should not effect the state of the processor registers. Multiple |
calls to this function are permitted and have an accumulative |
effect. |
Process simulator: Calls to this function may be ignored. |
FIXME: Most hardware simulators load the image at the VMA using |
virtual addressing. |
FIXME: For some hardware targets, before a loaded program can be |
executed, it requires the manipulation of VM registers and tables. |
Such manipulation should probably (?) occure in |
sim_create_inferior. */ |
SIM_RC sim_load (SIM_DESC sd, char *prog, struct bfd *abfd, int from_tty); |
/* Prepare to run the simulated program. |
ABFD, if not NULL, provides initial processor state information. |
ARGV and ENV, if non NULL, are NULL terminated lists of pointers. |
Hardware simulator: This function shall initialize the processor |
registers to a known value. The program counter and possibly stack |
pointer shall be set using information obtained from ABFD (or |
hardware reset defaults). ARGV and ENV, dependant on the target |
ABI, may be written to memory. |
Process simulator: After a call to this function, a new process |
instance shall exist. The TEXT, DATA, BSS and stack regions shall |
all be initialized, ARGV and ENV shall be written to process |
address space (according to the applicable ABI) and the program |
counter and stack pointer set accordingly. */ |
SIM_RC sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char **argv, char **env); |
/* Fetch LENGTH bytes of the simulated program's memory. Start fetch |
at virtual address MEM and store in BUF. Result is number of bytes |
read, or zero if error. */ |
int sim_read (SIM_DESC sd, SIM_ADDR mem, unsigned char *buf, int length); |
/* Store LENGTH bytes from BUF into the simulated program's |
memory. Store bytes starting at virtual address MEM. Result is |
number of bytes write, or zero if error. */ |
int sim_write (SIM_DESC sd, SIM_ADDR mem, const unsigned char *buf, int length); |
/* Fetch register REGNO storing its raw (target endian) value in the |
LENGTH byte buffer BUF. Return the actual size of the register or |
zero if REGNO is not applicable. |
Legacy implementations ignore LENGTH and always return -1. |
If LENGTH does not match the size of REGNO no data is transfered |
(the actual register size is still returned). */ |
int sim_fetch_register (SIM_DESC sd, int regno, unsigned char *buf, int length); |
/* Store register REGNO from the raw (target endian) value in BUF. |
Return the actual size of the register, any size not equal to |
LENGTH indicates the register was not updated correctly. |
Return a LENGTH of -1 to indicate the register was not updated |
and an error has occurred. |
Return a LENGTH of 0 to indicate the register was not updated |
but no error has occurred. */ |
int sim_store_register (SIM_DESC sd, int regno, unsigned char *buf, int length); |
/* Print whatever statistics the simulator has collected. |
VERBOSE is currently unused and must always be zero. */ |
void sim_info (SIM_DESC sd, int verbose); |
/* Run (or resume) the simulated program. |
STEP, when non-zero indicates that only a single simulator cycle |
should be emulated. |
SIGGNAL, if non-zero is a (HOST) SIGRC value indicating the type of |
event (hardware interrupt, signal) to be delivered to the simulated |
program. |
Hardware simulator: If the SIGRC value returned by |
sim_stop_reason() is passed back to the simulator via SIGGNAL then |
the hardware simulator shall correctly deliver the hardware event |
indicated by that signal. If a value of zero is passed in then the |
simulation will continue as if there were no outstanding signal. |
The effect of any other SIGGNAL value is is implementation |
dependant. |
Process simulator: If SIGRC is non-zero then the corresponding |
signal is delivered to the simulated program and execution is then |
continued. A zero SIGRC value indicates that the program should |
continue as normal. */ |
void sim_resume (SIM_DESC sd, int step, int siggnal); |
/* Asynchronous request to stop the simulation. |
A nonzero return indicates that the simulator is able to handle |
the request */ |
int sim_stop (SIM_DESC sd); |
/* Fetch the REASON why the program stopped. |
SIM_EXITED: The program has terminated. SIGRC indicates the target |
dependant exit status. |
SIM_STOPPED: The program has stopped. SIGRC uses the host's signal |
numbering as a way of identifying the reaon: program interrupted by |
user via a sim_stop request (SIGINT); a breakpoint instruction |
(SIGTRAP); a completed single step (SIGTRAP); an internal error |
condition (SIGABRT); an illegal instruction (SIGILL); Access to an |
undefined memory region (SIGSEGV); Mis-aligned memory access |
(SIGBUS). For some signals information in addition to the signal |
number may be retained by the simulator (e.g. offending address), |
that information is not directly accessable via this interface. |
SIM_SIGNALLED: The program has been terminated by a signal. The |
simulator has encountered target code that causes the the program |
to exit with signal SIGRC. |
SIM_RUNNING, SIM_POLLING: The return of one of these values |
indicates a problem internal to the simulator. */ |
enum sim_stop { sim_running, sim_polling, sim_exited, sim_stopped, sim_signalled }; |
void sim_stop_reason (SIM_DESC sd, enum sim_stop *reason, int *sigrc); |
/* Passthru for other commands that the simulator might support. |
Simulators should be prepared to deal with any combination of NULL |
or empty CMD. */ |
void sim_do_command (SIM_DESC sd, char *cmd); |
/* Complete a command based on the available sim commands. Returns an |
array of possible matches. */ |
char **sim_complete_command (SIM_DESC sd, const char *text, const char *word); |
#ifdef __cplusplus |
} |
#endif |
#endif /* !defined (REMOTE_SIM_H) */ |
/contrib/toolchain/binutils/include/gdb/signals.def |
---|
0,0 → 1,200 |
/* Target signal numbers for GDB and the GDB remote protocol. |
Copyright 2010-2013 Free Software Foundation, Inc. |
This file is part of GDB. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
/* Used some places (e.g. stop_signal) to record the concept that |
there is no signal. */ |
SET (GDB_SIGNAL_0, 0, "0", "Signal 0") |
#define GDB_SIGNAL_FIRST GDB_SIGNAL_0 |
SET (GDB_SIGNAL_HUP, 1, "SIGHUP", "Hangup") |
SET (GDB_SIGNAL_INT, 2, "SIGINT", "Interrupt") |
SET (GDB_SIGNAL_QUIT, 3, "SIGQUIT", "Quit") |
SET (GDB_SIGNAL_ILL, 4, "SIGILL", "Illegal instruction") |
SET (GDB_SIGNAL_TRAP, 5, "SIGTRAP", "Trace/breakpoint trap") |
SET (GDB_SIGNAL_ABRT, 6, "SIGABRT", "Aborted") |
SET (GDB_SIGNAL_EMT, 7, "SIGEMT", "Emulation trap") |
SET (GDB_SIGNAL_FPE, 8, "SIGFPE", "Arithmetic exception") |
SET (GDB_SIGNAL_KILL, 9, "SIGKILL", "Killed") |
SET (GDB_SIGNAL_BUS, 10, "SIGBUS", "Bus error") |
SET (GDB_SIGNAL_SEGV, 11, "SIGSEGV", "Segmentation fault") |
SET (GDB_SIGNAL_SYS, 12, "SIGSYS", "Bad system call") |
SET (GDB_SIGNAL_PIPE, 13, "SIGPIPE", "Broken pipe") |
SET (GDB_SIGNAL_ALRM, 14, "SIGALRM", "Alarm clock") |
SET (GDB_SIGNAL_TERM, 15, "SIGTERM", "Terminated") |
SET (GDB_SIGNAL_URG, 16, "SIGURG", "Urgent I/O condition") |
SET (GDB_SIGNAL_STOP, 17, "SIGSTOP", "Stopped (signal)") |
SET (GDB_SIGNAL_TSTP, 18, "SIGTSTP", "Stopped (user)") |
SET (GDB_SIGNAL_CONT, 19, "SIGCONT", "Continued") |
SET (GDB_SIGNAL_CHLD, 20, "SIGCHLD", "Child status changed") |
SET (GDB_SIGNAL_TTIN, 21, "SIGTTIN", "Stopped (tty input)") |
SET (GDB_SIGNAL_TTOU, 22, "SIGTTOU", "Stopped (tty output)") |
SET (GDB_SIGNAL_IO, 23, "SIGIO", "I/O possible") |
SET (GDB_SIGNAL_XCPU, 24, "SIGXCPU", "CPU time limit exceeded") |
SET (GDB_SIGNAL_XFSZ, 25, "SIGXFSZ", "File size limit exceeded") |
SET (GDB_SIGNAL_VTALRM, 26, "SIGVTALRM", "Virtual timer expired") |
SET (GDB_SIGNAL_PROF, 27, "SIGPROF", "Profiling timer expired") |
SET (GDB_SIGNAL_WINCH, 28, "SIGWINCH", "Window size changed") |
SET (GDB_SIGNAL_LOST, 29, "SIGLOST", "Resource lost") |
SET (GDB_SIGNAL_USR1, 30, "SIGUSR1", "User defined signal 1") |
SET (GDB_SIGNAL_USR2, 31, "SIGUSR2", "User defined signal 2") |
SET (GDB_SIGNAL_PWR, 32, "SIGPWR", "Power fail/restart") |
/* Similar to SIGIO. Perhaps they should have the same number. */ |
SET (GDB_SIGNAL_POLL, 33, "SIGPOLL", "Pollable event occurred") |
SET (GDB_SIGNAL_WIND, 34, "SIGWIND", "SIGWIND") |
SET (GDB_SIGNAL_PHONE, 35, "SIGPHONE", "SIGPHONE") |
SET (GDB_SIGNAL_WAITING, 36, "SIGWAITING", "Process's LWPs are blocked") |
SET (GDB_SIGNAL_LWP, 37, "SIGLWP", "Signal LWP") |
SET (GDB_SIGNAL_DANGER, 38, "SIGDANGER", "Swap space dangerously low") |
SET (GDB_SIGNAL_GRANT, 39, "SIGGRANT", "Monitor mode granted") |
SET (GDB_SIGNAL_RETRACT, 40, "SIGRETRACT", |
"Need to relinquish monitor mode") |
SET (GDB_SIGNAL_MSG, 41, "SIGMSG", "Monitor mode data available") |
SET (GDB_SIGNAL_SOUND, 42, "SIGSOUND", "Sound completed") |
SET (GDB_SIGNAL_SAK, 43, "SIGSAK", "Secure attention") |
SET (GDB_SIGNAL_PRIO, 44, "SIGPRIO", "SIGPRIO") |
SET (GDB_SIGNAL_REALTIME_33, 45, "SIG33", "Real-time event 33") |
SET (GDB_SIGNAL_REALTIME_34, 46, "SIG34", "Real-time event 34") |
SET (GDB_SIGNAL_REALTIME_35, 47, "SIG35", "Real-time event 35") |
SET (GDB_SIGNAL_REALTIME_36, 48, "SIG36", "Real-time event 36") |
SET (GDB_SIGNAL_REALTIME_37, 49, "SIG37", "Real-time event 37") |
SET (GDB_SIGNAL_REALTIME_38, 50, "SIG38", "Real-time event 38") |
SET (GDB_SIGNAL_REALTIME_39, 51, "SIG39", "Real-time event 39") |
SET (GDB_SIGNAL_REALTIME_40, 52, "SIG40", "Real-time event 40") |
SET (GDB_SIGNAL_REALTIME_41, 53, "SIG41", "Real-time event 41") |
SET (GDB_SIGNAL_REALTIME_42, 54, "SIG42", "Real-time event 42") |
SET (GDB_SIGNAL_REALTIME_43, 55, "SIG43", "Real-time event 43") |
SET (GDB_SIGNAL_REALTIME_44, 56, "SIG44", "Real-time event 44") |
SET (GDB_SIGNAL_REALTIME_45, 57, "SIG45", "Real-time event 45") |
SET (GDB_SIGNAL_REALTIME_46, 58, "SIG46", "Real-time event 46") |
SET (GDB_SIGNAL_REALTIME_47, 59, "SIG47", "Real-time event 47") |
SET (GDB_SIGNAL_REALTIME_48, 60, "SIG48", "Real-time event 48") |
SET (GDB_SIGNAL_REALTIME_49, 61, "SIG49", "Real-time event 49") |
SET (GDB_SIGNAL_REALTIME_50, 62, "SIG50", "Real-time event 50") |
SET (GDB_SIGNAL_REALTIME_51, 63, "SIG51", "Real-time event 51") |
SET (GDB_SIGNAL_REALTIME_52, 64, "SIG52", "Real-time event 52") |
SET (GDB_SIGNAL_REALTIME_53, 65, "SIG53", "Real-time event 53") |
SET (GDB_SIGNAL_REALTIME_54, 66, "SIG54", "Real-time event 54") |
SET (GDB_SIGNAL_REALTIME_55, 67, "SIG55", "Real-time event 55") |
SET (GDB_SIGNAL_REALTIME_56, 68, "SIG56", "Real-time event 56") |
SET (GDB_SIGNAL_REALTIME_57, 69, "SIG57", "Real-time event 57") |
SET (GDB_SIGNAL_REALTIME_58, 70, "SIG58", "Real-time event 58") |
SET (GDB_SIGNAL_REALTIME_59, 71, "SIG59", "Real-time event 59") |
SET (GDB_SIGNAL_REALTIME_60, 72, "SIG60", "Real-time event 60") |
SET (GDB_SIGNAL_REALTIME_61, 73, "SIG61", "Real-time event 61") |
SET (GDB_SIGNAL_REALTIME_62, 74, "SIG62", "Real-time event 62") |
SET (GDB_SIGNAL_REALTIME_63, 75, "SIG63", "Real-time event 63") |
/* Used internally by Solaris threads. See signal(5) on Solaris. */ |
SET (GDB_SIGNAL_CANCEL, 76, "SIGCANCEL", "LWP internal signal") |
/* Yes, this pains me, too. But LynxOS didn't have SIG32, and now |
GNU/Linux does, and we can't disturb the numbering, since it's |
part of the remote protocol. Note that in some GDB's |
GDB_SIGNAL_REALTIME_32 is number 76. */ |
SET (GDB_SIGNAL_REALTIME_32, 77, "SIG32", "Real-time event 32") |
/* Yet another pain, IRIX 6 has SIG64. */ |
SET (GDB_SIGNAL_REALTIME_64, 78, "SIG64", "Real-time event 64") |
/* Yet another pain, GNU/Linux MIPS might go up to 128. */ |
SET (GDB_SIGNAL_REALTIME_65, 79, "SIG65", "Real-time event 65") |
SET (GDB_SIGNAL_REALTIME_66, 80, "SIG66", "Real-time event 66") |
SET (GDB_SIGNAL_REALTIME_67, 81, "SIG67", "Real-time event 67") |
SET (GDB_SIGNAL_REALTIME_68, 82, "SIG68", "Real-time event 68") |
SET (GDB_SIGNAL_REALTIME_69, 83, "SIG69", "Real-time event 69") |
SET (GDB_SIGNAL_REALTIME_70, 84, "SIG70", "Real-time event 70") |
SET (GDB_SIGNAL_REALTIME_71, 85, "SIG71", "Real-time event 71") |
SET (GDB_SIGNAL_REALTIME_72, 86, "SIG72", "Real-time event 72") |
SET (GDB_SIGNAL_REALTIME_73, 87, "SIG73", "Real-time event 73") |
SET (GDB_SIGNAL_REALTIME_74, 88, "SIG74", "Real-time event 74") |
SET (GDB_SIGNAL_REALTIME_75, 89, "SIG75", "Real-time event 75") |
SET (GDB_SIGNAL_REALTIME_76, 90, "SIG76", "Real-time event 76") |
SET (GDB_SIGNAL_REALTIME_77, 91, "SIG77", "Real-time event 77") |
SET (GDB_SIGNAL_REALTIME_78, 92, "SIG78", "Real-time event 78") |
SET (GDB_SIGNAL_REALTIME_79, 93, "SIG79", "Real-time event 79") |
SET (GDB_SIGNAL_REALTIME_80, 94, "SIG80", "Real-time event 80") |
SET (GDB_SIGNAL_REALTIME_81, 95, "SIG81", "Real-time event 81") |
SET (GDB_SIGNAL_REALTIME_82, 96, "SIG82", "Real-time event 82") |
SET (GDB_SIGNAL_REALTIME_83, 97, "SIG83", "Real-time event 83") |
SET (GDB_SIGNAL_REALTIME_84, 98, "SIG84", "Real-time event 84") |
SET (GDB_SIGNAL_REALTIME_85, 99, "SIG85", "Real-time event 85") |
SET (GDB_SIGNAL_REALTIME_86, 100, "SIG86", "Real-time event 86") |
SET (GDB_SIGNAL_REALTIME_87, 101, "SIG87", "Real-time event 87") |
SET (GDB_SIGNAL_REALTIME_88, 102, "SIG88", "Real-time event 88") |
SET (GDB_SIGNAL_REALTIME_89, 103, "SIG89", "Real-time event 89") |
SET (GDB_SIGNAL_REALTIME_90, 104, "SIG90", "Real-time event 90") |
SET (GDB_SIGNAL_REALTIME_91, 105, "SIG91", "Real-time event 91") |
SET (GDB_SIGNAL_REALTIME_92, 106, "SIG92", "Real-time event 92") |
SET (GDB_SIGNAL_REALTIME_93, 107, "SIG93", "Real-time event 93") |
SET (GDB_SIGNAL_REALTIME_94, 108, "SIG94", "Real-time event 94") |
SET (GDB_SIGNAL_REALTIME_95, 109, "SIG95", "Real-time event 95") |
SET (GDB_SIGNAL_REALTIME_96, 110, "SIG96", "Real-time event 96") |
SET (GDB_SIGNAL_REALTIME_97, 111, "SIG97", "Real-time event 97") |
SET (GDB_SIGNAL_REALTIME_98, 112, "SIG98", "Real-time event 98") |
SET (GDB_SIGNAL_REALTIME_99, 113, "SIG99", "Real-time event 99") |
SET (GDB_SIGNAL_REALTIME_100, 114, "SIG100", "Real-time event 100") |
SET (GDB_SIGNAL_REALTIME_101, 115, "SIG101", "Real-time event 101") |
SET (GDB_SIGNAL_REALTIME_102, 116, "SIG102", "Real-time event 102") |
SET (GDB_SIGNAL_REALTIME_103, 117, "SIG103", "Real-time event 103") |
SET (GDB_SIGNAL_REALTIME_104, 118, "SIG104", "Real-time event 104") |
SET (GDB_SIGNAL_REALTIME_105, 119, "SIG105", "Real-time event 105") |
SET (GDB_SIGNAL_REALTIME_106, 120, "SIG106", "Real-time event 106") |
SET (GDB_SIGNAL_REALTIME_107, 121, "SIG107", "Real-time event 107") |
SET (GDB_SIGNAL_REALTIME_108, 122, "SIG108", "Real-time event 108") |
SET (GDB_SIGNAL_REALTIME_109, 123, "SIG109", "Real-time event 109") |
SET (GDB_SIGNAL_REALTIME_110, 124, "SIG110", "Real-time event 110") |
SET (GDB_SIGNAL_REALTIME_111, 125, "SIG111", "Real-time event 111") |
SET (GDB_SIGNAL_REALTIME_112, 126, "SIG112", "Real-time event 112") |
SET (GDB_SIGNAL_REALTIME_113, 127, "SIG113", "Real-time event 113") |
SET (GDB_SIGNAL_REALTIME_114, 128, "SIG114", "Real-time event 114") |
SET (GDB_SIGNAL_REALTIME_115, 129, "SIG115", "Real-time event 115") |
SET (GDB_SIGNAL_REALTIME_116, 130, "SIG116", "Real-time event 116") |
SET (GDB_SIGNAL_REALTIME_117, 131, "SIG117", "Real-time event 117") |
SET (GDB_SIGNAL_REALTIME_118, 132, "SIG118", "Real-time event 118") |
SET (GDB_SIGNAL_REALTIME_119, 133, "SIG119", "Real-time event 119") |
SET (GDB_SIGNAL_REALTIME_120, 134, "SIG120", "Real-time event 120") |
SET (GDB_SIGNAL_REALTIME_121, 135, "SIG121", "Real-time event 121") |
SET (GDB_SIGNAL_REALTIME_122, 136, "SIG122", "Real-time event 122") |
SET (GDB_SIGNAL_REALTIME_123, 137, "SIG123", "Real-time event 123") |
SET (GDB_SIGNAL_REALTIME_124, 138, "SIG124", "Real-time event 124") |
SET (GDB_SIGNAL_REALTIME_125, 139, "SIG125", "Real-time event 125") |
SET (GDB_SIGNAL_REALTIME_126, 140, "SIG126", "Real-time event 126") |
SET (GDB_SIGNAL_REALTIME_127, 141, "SIG127", "Real-time event 127") |
SET (GDB_SIGNAL_INFO, 142, "SIGINFO", "Information request") |
/* Some signal we don't know about. */ |
SET (GDB_SIGNAL_UNKNOWN, 143, NULL, "Unknown signal") |
/* Use whatever signal we use when one is not specifically specified |
(for passing to proceed and so on). */ |
SET (GDB_SIGNAL_DEFAULT, 144, NULL, |
"Internal error: printing GDB_SIGNAL_DEFAULT") |
/* Mach exceptions. In versions of GDB before 5.2, these were just before |
GDB_SIGNAL_INFO if you were compiling on a Mach host (and missing |
otherwise). */ |
SET (TARGET_EXC_BAD_ACCESS, 145, "EXC_BAD_ACCESS", "Could not access memory") |
SET (TARGET_EXC_BAD_INSTRUCTION, 146, "EXC_BAD_INSTRUCTION", |
"Illegal instruction/operand") |
SET (TARGET_EXC_ARITHMETIC, 147, "EXC_ARITHMETIC", "Arithmetic exception") |
SET (TARGET_EXC_EMULATION, 148, "EXC_EMULATION", "Emulation instruction") |
SET (TARGET_EXC_SOFTWARE, 149, "EXC_SOFTWARE", "Software generated exception") |
SET (TARGET_EXC_BREAKPOINT, 150, "EXC_BREAKPOINT", "Breakpoint") |
/* If you are adding a new signal, add it just above this comment. */ |
/* Last and unused enum value, for sizing arrays, etc. */ |
SET (GDB_SIGNAL_LAST, 151, NULL, "GDB_SIGNAL_MAGIC") |
/contrib/toolchain/binutils/include/gdb/signals.h |
---|
0,0 → 1,58 |
/* Target signal numbers for GDB and the GDB remote protocol. |
Copyright 1986-2013 Free Software Foundation, Inc. |
This file is part of GDB. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
#ifndef GDB_SIGNALS_H |
#define GDB_SIGNALS_H |
/* The numbering of these signals is chosen to match traditional unix |
signals (insofar as various unices use the same numbers, anyway). |
It is also the numbering of the GDB remote protocol. Other remote |
protocols, if they use a different numbering, should make sure to |
translate appropriately. |
Since these numbers have actually made it out into other software |
(stubs, etc.), you mustn't disturb the assigned numbering. If you |
need to add new signals here, add them to the end of the explicitly |
numbered signals, at the comment marker. Add them unconditionally, |
not within any #if or #ifdef. |
This is based strongly on Unix/POSIX signals for several reasons: |
(1) This set of signals represents a widely-accepted attempt to |
represent events of this sort in a portable fashion, (2) we want a |
signal to make it from wait to child_wait to the user intact, (3) many |
remote protocols use a similar encoding. However, it is |
recognized that this set of signals has limitations (such as not |
distinguishing between various kinds of SIGSEGV, or not |
distinguishing hitting a breakpoint from finishing a single step). |
So in the future we may get around this either by adding additional |
signals for breakpoint, single-step, etc., or by adding signal |
codes; the latter seems more in the spirit of what BSD, System V, |
etc. are doing to address these issues. */ |
/* For an explanation of what each signal means, see |
gdb_signal_to_string. */ |
enum gdb_signal |
{ |
#define SET(symbol, constant, name, string) \ |
symbol = constant, |
#include "gdb/signals.def" |
#undef SET |
}; |
#endif /* #ifndef GDB_SIGNALS_H */ |
/contrib/toolchain/binutils/include/gdb/sim-arm.h |
---|
0,0 → 1,112 |
/* This file defines the interface between the Arm simulator and GDB. |
Copyright 2002-2013 Free Software Foundation, Inc. |
Contributed by Red Hat. |
This file is part of GDB. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
#if !defined (SIM_ARM_H) |
#define SIM_ARM_H |
#ifdef __cplusplus |
extern "C" { // } |
#endif |
enum sim_arm_regs |
{ |
SIM_ARM_R0_REGNUM, |
SIM_ARM_R1_REGNUM, |
SIM_ARM_R2_REGNUM, |
SIM_ARM_R3_REGNUM, |
SIM_ARM_R4_REGNUM, |
SIM_ARM_R5_REGNUM, |
SIM_ARM_R6_REGNUM, |
SIM_ARM_R7_REGNUM, |
SIM_ARM_R8_REGNUM, |
SIM_ARM_R9_REGNUM, |
SIM_ARM_R10_REGNUM, |
SIM_ARM_R11_REGNUM, |
SIM_ARM_R12_REGNUM, |
SIM_ARM_R13_REGNUM, |
SIM_ARM_R14_REGNUM, |
SIM_ARM_R15_REGNUM, /* PC */ |
SIM_ARM_FP0_REGNUM, |
SIM_ARM_FP1_REGNUM, |
SIM_ARM_FP2_REGNUM, |
SIM_ARM_FP3_REGNUM, |
SIM_ARM_FP4_REGNUM, |
SIM_ARM_FP5_REGNUM, |
SIM_ARM_FP6_REGNUM, |
SIM_ARM_FP7_REGNUM, |
SIM_ARM_FPS_REGNUM, |
SIM_ARM_PS_REGNUM, |
SIM_ARM_MAVERIC_COP0R0_REGNUM, |
SIM_ARM_MAVERIC_COP0R1_REGNUM, |
SIM_ARM_MAVERIC_COP0R2_REGNUM, |
SIM_ARM_MAVERIC_COP0R3_REGNUM, |
SIM_ARM_MAVERIC_COP0R4_REGNUM, |
SIM_ARM_MAVERIC_COP0R5_REGNUM, |
SIM_ARM_MAVERIC_COP0R6_REGNUM, |
SIM_ARM_MAVERIC_COP0R7_REGNUM, |
SIM_ARM_MAVERIC_COP0R8_REGNUM, |
SIM_ARM_MAVERIC_COP0R9_REGNUM, |
SIM_ARM_MAVERIC_COP0R10_REGNUM, |
SIM_ARM_MAVERIC_COP0R11_REGNUM, |
SIM_ARM_MAVERIC_COP0R12_REGNUM, |
SIM_ARM_MAVERIC_COP0R13_REGNUM, |
SIM_ARM_MAVERIC_COP0R14_REGNUM, |
SIM_ARM_MAVERIC_COP0R15_REGNUM, |
SIM_ARM_MAVERIC_DSPSC_REGNUM, |
SIM_ARM_IWMMXT_COP0R0_REGNUM, |
SIM_ARM_IWMMXT_COP0R1_REGNUM, |
SIM_ARM_IWMMXT_COP0R2_REGNUM, |
SIM_ARM_IWMMXT_COP0R3_REGNUM, |
SIM_ARM_IWMMXT_COP0R4_REGNUM, |
SIM_ARM_IWMMXT_COP0R5_REGNUM, |
SIM_ARM_IWMMXT_COP0R6_REGNUM, |
SIM_ARM_IWMMXT_COP0R7_REGNUM, |
SIM_ARM_IWMMXT_COP0R8_REGNUM, |
SIM_ARM_IWMMXT_COP0R9_REGNUM, |
SIM_ARM_IWMMXT_COP0R10_REGNUM, |
SIM_ARM_IWMMXT_COP0R11_REGNUM, |
SIM_ARM_IWMMXT_COP0R12_REGNUM, |
SIM_ARM_IWMMXT_COP0R13_REGNUM, |
SIM_ARM_IWMMXT_COP0R14_REGNUM, |
SIM_ARM_IWMMXT_COP0R15_REGNUM, |
SIM_ARM_IWMMXT_COP1R0_REGNUM, |
SIM_ARM_IWMMXT_COP1R1_REGNUM, |
SIM_ARM_IWMMXT_COP1R2_REGNUM, |
SIM_ARM_IWMMXT_COP1R3_REGNUM, |
SIM_ARM_IWMMXT_COP1R4_REGNUM, |
SIM_ARM_IWMMXT_COP1R5_REGNUM, |
SIM_ARM_IWMMXT_COP1R6_REGNUM, |
SIM_ARM_IWMMXT_COP1R7_REGNUM, |
SIM_ARM_IWMMXT_COP1R8_REGNUM, |
SIM_ARM_IWMMXT_COP1R9_REGNUM, |
SIM_ARM_IWMMXT_COP1R10_REGNUM, |
SIM_ARM_IWMMXT_COP1R11_REGNUM, |
SIM_ARM_IWMMXT_COP1R12_REGNUM, |
SIM_ARM_IWMMXT_COP1R13_REGNUM, |
SIM_ARM_IWMMXT_COP1R14_REGNUM, |
SIM_ARM_IWMMXT_COP1R15_REGNUM |
}; |
#ifdef __cplusplus |
} |
#endif |
#endif |
/contrib/toolchain/binutils/include/gdb/sim-bfin.h |
---|
0,0 → 1,82 |
/* This file defines the interface between the Blackfin simulator and GDB. |
Copyright (C) 2005-2013 Free Software Foundation, Inc. |
Contributed by Analog Devices. |
This file is part of GDB. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
enum sim_bfin_regnum { |
SIM_BFIN_R0_REGNUM = 0, |
SIM_BFIN_R1_REGNUM, |
SIM_BFIN_R2_REGNUM, |
SIM_BFIN_R3_REGNUM, |
SIM_BFIN_R4_REGNUM, |
SIM_BFIN_R5_REGNUM, |
SIM_BFIN_R6_REGNUM, |
SIM_BFIN_R7_REGNUM, |
SIM_BFIN_P0_REGNUM, |
SIM_BFIN_P1_REGNUM, |
SIM_BFIN_P2_REGNUM, |
SIM_BFIN_P3_REGNUM, |
SIM_BFIN_P4_REGNUM, |
SIM_BFIN_P5_REGNUM, |
SIM_BFIN_SP_REGNUM, |
SIM_BFIN_FP_REGNUM, |
SIM_BFIN_I0_REGNUM, |
SIM_BFIN_I1_REGNUM, |
SIM_BFIN_I2_REGNUM, |
SIM_BFIN_I3_REGNUM, |
SIM_BFIN_M0_REGNUM, |
SIM_BFIN_M1_REGNUM, |
SIM_BFIN_M2_REGNUM, |
SIM_BFIN_M3_REGNUM, |
SIM_BFIN_B0_REGNUM, |
SIM_BFIN_B1_REGNUM, |
SIM_BFIN_B2_REGNUM, |
SIM_BFIN_B3_REGNUM, |
SIM_BFIN_L0_REGNUM, |
SIM_BFIN_L1_REGNUM, |
SIM_BFIN_L2_REGNUM, |
SIM_BFIN_L3_REGNUM, |
SIM_BFIN_A0_DOT_X_REGNUM, |
SIM_BFIN_A0_DOT_W_REGNUM, |
SIM_BFIN_A1_DOT_X_REGNUM, |
SIM_BFIN_A1_DOT_W_REGNUM, |
SIM_BFIN_ASTAT_REGNUM, |
SIM_BFIN_RETS_REGNUM, |
SIM_BFIN_LC0_REGNUM, |
SIM_BFIN_LT0_REGNUM, |
SIM_BFIN_LB0_REGNUM, |
SIM_BFIN_LC1_REGNUM, |
SIM_BFIN_LT1_REGNUM, |
SIM_BFIN_LB1_REGNUM, |
SIM_BFIN_CYCLES_REGNUM, |
SIM_BFIN_CYCLES2_REGNUM, |
SIM_BFIN_USP_REGNUM, |
SIM_BFIN_SEQSTAT_REGNUM, |
SIM_BFIN_SYSCFG_REGNUM, |
SIM_BFIN_RETI_REGNUM, |
SIM_BFIN_RETX_REGNUM, |
SIM_BFIN_RETN_REGNUM, |
SIM_BFIN_RETE_REGNUM, |
SIM_BFIN_PC_REGNUM, |
SIM_BFIN_CC_REGNUM, |
SIM_BFIN_TEXT_ADDR, |
SIM_BFIN_TEXT_END_ADDR, |
SIM_BFIN_DATA_ADDR, |
SIM_BFIN_IPEND_REGNUM |
}; |
/contrib/toolchain/binutils/include/gdb/sim-cr16.h |
---|
0,0 → 1,106 |
/* This file defines the interface between the cr16 simulator and gdb. |
Copyright 2008-2013 Free Software Foundation, Inc. |
This file is part of GDB. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, see <http://www.gnu.org/licenses/>. */ |
#if !defined (SIM_CR16_H) |
#define SIM_CR16_H |
#ifdef __cplusplus |
extern "C" { // } |
#endif |
enum |
{ |
SIM_CR16_MEMORY_UNIFIED = 0x00000000, |
SIM_CR16_MEMORY_INSN = 0x10000000, |
SIM_CR16_MEMORY_DATA = 0x10000000, |
SIM_CR16_MEMORY_DMAP = 0x10000000, |
SIM_CR16_MEMORY_IMAP = 0x10000000 |
}; |
extern unsigned long sim_cr16_translate_dmap_addr |
(unsigned long offset, |
int nr_bytes, |
unsigned long *phys, |
void *regcache, |
unsigned long (*dmap_register) (void *regcache, int reg_nr)); |
extern unsigned long sim_cr16_translate_imap_addr |
(unsigned long offset, |
int nr_bytes, |
unsigned long *phys, |
void *regcache, |
unsigned long (*imap_register) (void *regcache, int reg_nr)); |
extern unsigned long sim_cr16_translate_addr |
(unsigned long vaddr, |
int nr_bytes, |
unsigned long *phys, |
void *regcache, |
unsigned long (*dmap_register) (void *regcache, int reg_nr), |
unsigned long (*imap_register) (void *regcache, int reg_nr)); |
/* The simulator makes use of the following register information. */ |
enum sim_cr16_regs |
{ |
SIM_CR16_R0_REGNUM, |
SIM_CR16_R1_REGNUM, |
SIM_CR16_R2_REGNUM, |
SIM_CR16_R3_REGNUM, |
SIM_CR16_R4_REGNUM, |
SIM_CR16_R5_REGNUM, |
SIM_CR16_R6_REGNUM, |
SIM_CR16_R7_REGNUM, |
SIM_CR16_R8_REGNUM, |
SIM_CR16_R9_REGNUM, |
SIM_CR16_R10_REGNUM, |
SIM_CR16_R11_REGNUM, |
SIM_CR16_R12_REGNUM, |
SIM_CR16_R13_REGNUM, |
SIM_CR16_R14_REGNUM, |
SIM_CR16_R15_REGNUM, |
SIM_CR16_PC_REGNUM, |
SIM_CR16_ISP_REGNUM, |
SIM_CR16_USP_REGNUM, |
SIM_CR16_INTBASE_REGNUM, |
SIM_CR16_PSR_REGNUM, |
SIM_CR16_CFG_REGNUM, |
SIM_CR16_DBS_REGNUM, |
SIM_CR16_DCR_REGNUM, |
SIM_CR16_DSR_REGNUM, |
SIM_CR16_CAR0_REGNUM, |
SIM_CR16_CAR1_REGNUM |
}; |
enum |
{ |
SIM_CR16_NR_R_REGS = 16, |
SIM_CR16_NR_A_REGS = 2, |
SIM_CR16_NR_IMAP_REGS = 2, |
SIM_CR16_NR_DMAP_REGS = 4, |
SIM_CR16_NR_CR_REGS = 11 |
}; |
#ifdef __cplusplus |
} |
#endif |
#endif |
/contrib/toolchain/binutils/include/gdb/sim-d10v.h |
---|
0,0 → 1,141 |
/* This file defines the interface between the d10v simulator and gdb. |
Copyright 1999-2013 Free Software Foundation, Inc. |
This file is part of GDB. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
#if !defined (SIM_D10V_H) |
#define SIM_D10V_H |
#ifdef __cplusplus |
extern "C" { // } |
#endif |
/* GDB interprets addresses as: |
0x00xxxxxx: Physical unified memory segment (Unified memory) |
0x01xxxxxx: Physical instruction memory segment (On-chip insn memory) |
0x02xxxxxx: Physical data memory segment (On-chip data memory) |
0x10xxxxxx: Logical data address segment (DMAP translated memory) |
0x11xxxxxx: Logical instruction address segment (IMAP translated memory) |
The remote d10v board interprets addresses as: |
0x00xxxxxx: Physical unified memory segment (Unified memory) |
0x01xxxxxx: Physical instruction memory segment (On-chip insn memory) |
0x02xxxxxx: Physical data memory segment (On-chip data memory) |
The following translate a virtual DMAP/IMAP offset into a physical |
memory segment assigning the translated address to PHYS. Since a |
memory access may cross a page boundrary the number of bytes for |
which the translation is applicable (or 0 for an invalid virtual |
offset) is returned. */ |
enum |
{ |
SIM_D10V_MEMORY_UNIFIED = 0x00000000, |
SIM_D10V_MEMORY_INSN = 0x01000000, |
SIM_D10V_MEMORY_DATA = 0x02000000, |
SIM_D10V_MEMORY_DMAP = 0x10000000, |
SIM_D10V_MEMORY_IMAP = 0x11000000 |
}; |
extern unsigned long sim_d10v_translate_dmap_addr |
(unsigned long offset, |
int nr_bytes, |
unsigned long *phys, |
void *regcache, |
unsigned long (*dmap_register) (void *regcache, int reg_nr)); |
extern unsigned long sim_d10v_translate_imap_addr |
(unsigned long offset, |
int nr_bytes, |
unsigned long *phys, |
void *regcache, |
unsigned long (*imap_register) (void *regcache, int reg_nr)); |
extern unsigned long sim_d10v_translate_addr |
(unsigned long vaddr, |
int nr_bytes, |
unsigned long *phys, |
void *regcache, |
unsigned long (*dmap_register) (void *regcache, int reg_nr), |
unsigned long (*imap_register) (void *regcache, int reg_nr)); |
/* The simulator makes use of the following register information. */ |
enum sim_d10v_regs |
{ |
SIM_D10V_R0_REGNUM, |
SIM_D10V_R1_REGNUM, |
SIM_D10V_R2_REGNUM, |
SIM_D10V_R3_REGNUM, |
SIM_D10V_R4_REGNUM, |
SIM_D10V_R5_REGNUM, |
SIM_D10V_R6_REGNUM, |
SIM_D10V_R7_REGNUM, |
SIM_D10V_R8_REGNUM, |
SIM_D10V_R9_REGNUM, |
SIM_D10V_R10_REGNUM, |
SIM_D10V_R11_REGNUM, |
SIM_D10V_R12_REGNUM, |
SIM_D10V_R13_REGNUM, |
SIM_D10V_R14_REGNUM, |
SIM_D10V_R15_REGNUM, |
SIM_D10V_CR0_REGNUM, |
SIM_D10V_CR1_REGNUM, |
SIM_D10V_CR2_REGNUM, |
SIM_D10V_CR3_REGNUM, |
SIM_D10V_CR4_REGNUM, |
SIM_D10V_CR5_REGNUM, |
SIM_D10V_CR6_REGNUM, |
SIM_D10V_CR7_REGNUM, |
SIM_D10V_CR8_REGNUM, |
SIM_D10V_CR9_REGNUM, |
SIM_D10V_CR10_REGNUM, |
SIM_D10V_CR11_REGNUM, |
SIM_D10V_CR12_REGNUM, |
SIM_D10V_CR13_REGNUM, |
SIM_D10V_CR14_REGNUM, |
SIM_D10V_CR15_REGNUM, |
SIM_D10V_A0_REGNUM, |
SIM_D10V_A1_REGNUM, |
SIM_D10V_SPI_REGNUM, |
SIM_D10V_SPU_REGNUM, |
SIM_D10V_IMAP0_REGNUM, |
SIM_D10V_IMAP1_REGNUM, |
SIM_D10V_DMAP0_REGNUM, |
SIM_D10V_DMAP1_REGNUM, |
SIM_D10V_DMAP2_REGNUM, |
SIM_D10V_DMAP3_REGNUM, |
SIM_D10V_TS2_DMAP_REGNUM |
}; |
enum |
{ |
SIM_D10V_NR_R_REGS = 16, |
SIM_D10V_NR_A_REGS = 2, |
SIM_D10V_NR_IMAP_REGS = 2, |
SIM_D10V_NR_DMAP_REGS = 4, |
SIM_D10V_NR_CR_REGS = 16 |
}; |
#ifdef __cplusplus |
} |
#endif |
#endif |
/contrib/toolchain/binutils/include/gdb/sim-frv.h |
---|
0,0 → 1,51 |
/* This file defines the interface between the FR-V simulator and GDB. |
Copyright 2003-2013 Free Software Foundation, Inc. |
Contributed by Red Hat. |
This file is part of GDB. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
#if !defined (SIM_FRV_H) |
#define SIM_FRV_H |
#ifdef __cplusplus |
extern "C" { // } |
#endif |
enum sim_frv_regs |
{ |
SIM_FRV_GR0_REGNUM = 0, |
SIM_FRV_GR63_REGNUM = 63, |
SIM_FRV_FR0_REGNUM = 64, |
SIM_FRV_FR63_REGNUM = 127, |
SIM_FRV_PC_REGNUM = 128, |
/* An FR-V architecture may have up to 4096 special purpose registers |
(SPRs). In order to determine a specific constant used to access |
a particular SPR, one of the H_SPR_ prefixed offsets defined in |
opcodes/frv-desc.h should be added to SIM_FRV_SPR0_REGNUM. So, |
for example, the number that GDB uses to fetch the link register |
from the simulator is (SIM_FRV_SPR0_REGNUM + H_SPR_LR). */ |
SIM_FRV_SPR0_REGNUM = 129, |
SIM_FRV_SPR4095_REGNUM = SIM_FRV_SPR0_REGNUM + 4095 |
}; |
#ifdef __cplusplus |
} |
#endif |
#endif |
/contrib/toolchain/binutils/include/gdb/sim-h8300.h |
---|
0,0 → 1,77 |
/* This file defines the interface between the h8300 simulator and gdb. |
Copyright (C) 2002-2013 Free Software Foundation, Inc. |
This file is part of GDB. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
#if !defined (SIM_H8300_H) |
#define SIM_H8300_H |
#ifdef __cplusplus |
extern "C" { //} |
#endif |
/* The simulator makes use of the following register information. */ |
enum sim_h8300_regs |
{ |
/* Registers common to all the H8 variants. */ |
/* Start here: */ |
SIM_H8300_R0_REGNUM, |
SIM_H8300_R1_REGNUM, |
SIM_H8300_R2_REGNUM, |
SIM_H8300_R3_REGNUM, |
SIM_H8300_R4_REGNUM, |
SIM_H8300_R5_REGNUM, |
SIM_H8300_R6_REGNUM, |
SIM_H8300_R7_REGNUM, |
SIM_H8300_CCR_REGNUM, /* Contains processor status */ |
SIM_H8300_PC_REGNUM, /* Contains program counter */ |
/* End here */ |
SIM_H8300_EXR_REGNUM, /* Contains extended processor status |
H8S and higher */ |
SIM_H8300_MACL_REGNUM, /* Lower part of MAC register (26xx only)*/ |
SIM_H8300_MACH_REGNUM, /* High part of MAC register (26xx only) */ |
SIM_H8300_CYCLE_REGNUM, |
SIM_H8300_INST_REGNUM, |
SIM_H8300_TICK_REGNUM |
}; |
enum |
{ |
SIM_H8300_ARG_FIRST_REGNUM = SIM_H8300_R0_REGNUM, /* first reg in which an arg |
may be passed */ |
SIM_H8300_ARG_LAST_REGNUM = SIM_H8300_R3_REGNUM, /* last reg in which an arg |
may be passed */ |
SIM_H8300_FP_REGNUM = SIM_H8300_R6_REGNUM, /* Contain address of executing |
stack frame */ |
SIM_H8300_SP_REGNUM = SIM_H8300_R7_REGNUM /* Contains address of top of stack */ |
}; |
enum |
{ |
SIM_H8300_NUM_COMMON_REGS = 10, |
SIM_H8300_S_NUM_REGS = 13, |
SIM_H8300_NUM_REGS = 16 |
}; |
#ifdef __cplusplus |
} |
#endif |
#endif /* SIM_H8300_H */ |
/contrib/toolchain/binutils/include/gdb/sim-lm32.h |
---|
0,0 → 1,76 |
/* This file defines the interface between the LM32 simulator and GDB. |
Contributed by Jon Beniston <jon@beniston.com> |
Copyright (C) 2009-2013 Free Software Foundation, Inc. |
This file is part of GDB. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
#ifndef SIM_LM32_H |
#define SIM_LM32_H |
#ifdef __cplusplus |
extern "C" { // } |
#endif |
enum sim_lm32_regs |
{ |
SIM_LM32_R0_REGNUM, |
SIM_LM32_R1_REGNUM, |
SIM_LM32_R2_REGNUM, |
SIM_LM32_R3_REGNUM, |
SIM_LM32_R4_REGNUM, |
SIM_LM32_R5_REGNUM, |
SIM_LM32_R6_REGNUM, |
SIM_LM32_R7_REGNUM, |
SIM_LM32_R8_REGNUM, |
SIM_LM32_R9_REGNUM, |
SIM_LM32_R10_REGNUM, |
SIM_LM32_R11_REGNUM, |
SIM_LM32_R12_REGNUM, |
SIM_LM32_R13_REGNUM, |
SIM_LM32_R14_REGNUM, |
SIM_LM32_R15_REGNUM, |
SIM_LM32_R16_REGNUM, |
SIM_LM32_R17_REGNUM, |
SIM_LM32_R18_REGNUM, |
SIM_LM32_R19_REGNUM, |
SIM_LM32_R20_REGNUM, |
SIM_LM32_R21_REGNUM, |
SIM_LM32_R22_REGNUM, |
SIM_LM32_R23_REGNUM, |
SIM_LM32_R24_REGNUM, |
SIM_LM32_R25_REGNUM, |
SIM_LM32_GP_REGNUM, |
SIM_LM32_FP_REGNUM, |
SIM_LM32_SP_REGNUM, |
SIM_LM32_RA_REGNUM, |
SIM_LM32_BA_REGNUM, |
SIM_LM32_EA_REGNUM, |
SIM_LM32_PC_REGNUM, |
SIM_LM32_EID_REGNUM, |
SIM_LM32_EBA_REGNUM, |
SIM_LM32_DEBA_REGNUM, |
SIM_LM32_IE_REGNUM, |
SIM_LM32_IM_REGNUM, |
SIM_LM32_IP_REGNUM, |
SIM_LM32_NUM_REGS |
}; |
#ifdef __cplusplus |
} |
#endif |
#endif |
/contrib/toolchain/binutils/include/gdb/sim-m32c.h |
---|
0,0 → 1,62 |
/* This file defines the interface between the m32c simulator and gdb. |
Copyright (C) 2005-2013 Free Software Foundation, Inc. |
This file is part of GDB. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
#ifndef SIM_M32C_H |
#define SIM_M32C_H |
enum m32c_sim_reg { |
m32c_sim_reg_r0_bank0, |
m32c_sim_reg_r1_bank0, |
m32c_sim_reg_r2_bank0, |
m32c_sim_reg_r3_bank0, |
m32c_sim_reg_a0_bank0, |
m32c_sim_reg_a1_bank0, |
m32c_sim_reg_fb_bank0, |
m32c_sim_reg_sb_bank0, |
m32c_sim_reg_r0_bank1, |
m32c_sim_reg_r1_bank1, |
m32c_sim_reg_r2_bank1, |
m32c_sim_reg_r3_bank1, |
m32c_sim_reg_a0_bank1, |
m32c_sim_reg_a1_bank1, |
m32c_sim_reg_fb_bank1, |
m32c_sim_reg_sb_bank1, |
m32c_sim_reg_usp, |
m32c_sim_reg_isp, |
m32c_sim_reg_pc, |
m32c_sim_reg_intb, |
m32c_sim_reg_flg, |
m32c_sim_reg_svf, |
m32c_sim_reg_svp, |
m32c_sim_reg_vct, |
m32c_sim_reg_dmd0, |
m32c_sim_reg_dmd1, |
m32c_sim_reg_dct0, |
m32c_sim_reg_dct1, |
m32c_sim_reg_drc0, |
m32c_sim_reg_drc1, |
m32c_sim_reg_dma0, |
m32c_sim_reg_dma1, |
m32c_sim_reg_dsa0, |
m32c_sim_reg_dsa1, |
m32c_sim_reg_dra0, |
m32c_sim_reg_dra1, |
m32c_sim_reg_num_regs |
}; |
#endif /* SIM_M32C_H */ |
/contrib/toolchain/binutils/include/gdb/sim-ppc.h |
---|
0,0 → 1,773 |
/* sim-ppc.h --- interface between PowerPC simulator and GDB. |
Copyright 2004-2013 Free Software Foundation, Inc. |
Contributed by Red Hat. |
This file is part of GDB. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
#if !defined (SIM_PPC_H) |
#define SIM_PPC_H |
#ifdef __cplusplus |
extern "C" { |
#endif |
/* The register access functions, sim_fetch_register and |
sim_store_register, use the following numbering for PowerPC |
registers. */ |
enum sim_ppc_regnum |
{ |
/* General-purpose registers, r0 -- r31. */ |
sim_ppc_r0_regnum, |
sim_ppc_r1_regnum, |
sim_ppc_r2_regnum, |
sim_ppc_r3_regnum, |
sim_ppc_r4_regnum, |
sim_ppc_r5_regnum, |
sim_ppc_r6_regnum, |
sim_ppc_r7_regnum, |
sim_ppc_r8_regnum, |
sim_ppc_r9_regnum, |
sim_ppc_r10_regnum, |
sim_ppc_r11_regnum, |
sim_ppc_r12_regnum, |
sim_ppc_r13_regnum, |
sim_ppc_r14_regnum, |
sim_ppc_r15_regnum, |
sim_ppc_r16_regnum, |
sim_ppc_r17_regnum, |
sim_ppc_r18_regnum, |
sim_ppc_r19_regnum, |
sim_ppc_r20_regnum, |
sim_ppc_r21_regnum, |
sim_ppc_r22_regnum, |
sim_ppc_r23_regnum, |
sim_ppc_r24_regnum, |
sim_ppc_r25_regnum, |
sim_ppc_r26_regnum, |
sim_ppc_r27_regnum, |
sim_ppc_r28_regnum, |
sim_ppc_r29_regnum, |
sim_ppc_r30_regnum, |
sim_ppc_r31_regnum, |
/* Floating-point registers, f0 -- f31. */ |
sim_ppc_f0_regnum, |
sim_ppc_f1_regnum, |
sim_ppc_f2_regnum, |
sim_ppc_f3_regnum, |
sim_ppc_f4_regnum, |
sim_ppc_f5_regnum, |
sim_ppc_f6_regnum, |
sim_ppc_f7_regnum, |
sim_ppc_f8_regnum, |
sim_ppc_f9_regnum, |
sim_ppc_f10_regnum, |
sim_ppc_f11_regnum, |
sim_ppc_f12_regnum, |
sim_ppc_f13_regnum, |
sim_ppc_f14_regnum, |
sim_ppc_f15_regnum, |
sim_ppc_f16_regnum, |
sim_ppc_f17_regnum, |
sim_ppc_f18_regnum, |
sim_ppc_f19_regnum, |
sim_ppc_f20_regnum, |
sim_ppc_f21_regnum, |
sim_ppc_f22_regnum, |
sim_ppc_f23_regnum, |
sim_ppc_f24_regnum, |
sim_ppc_f25_regnum, |
sim_ppc_f26_regnum, |
sim_ppc_f27_regnum, |
sim_ppc_f28_regnum, |
sim_ppc_f29_regnum, |
sim_ppc_f30_regnum, |
sim_ppc_f31_regnum, |
/* Altivec vector registers, vr0 -- vr31. */ |
sim_ppc_vr0_regnum, |
sim_ppc_vr1_regnum, |
sim_ppc_vr2_regnum, |
sim_ppc_vr3_regnum, |
sim_ppc_vr4_regnum, |
sim_ppc_vr5_regnum, |
sim_ppc_vr6_regnum, |
sim_ppc_vr7_regnum, |
sim_ppc_vr8_regnum, |
sim_ppc_vr9_regnum, |
sim_ppc_vr10_regnum, |
sim_ppc_vr11_regnum, |
sim_ppc_vr12_regnum, |
sim_ppc_vr13_regnum, |
sim_ppc_vr14_regnum, |
sim_ppc_vr15_regnum, |
sim_ppc_vr16_regnum, |
sim_ppc_vr17_regnum, |
sim_ppc_vr18_regnum, |
sim_ppc_vr19_regnum, |
sim_ppc_vr20_regnum, |
sim_ppc_vr21_regnum, |
sim_ppc_vr22_regnum, |
sim_ppc_vr23_regnum, |
sim_ppc_vr24_regnum, |
sim_ppc_vr25_regnum, |
sim_ppc_vr26_regnum, |
sim_ppc_vr27_regnum, |
sim_ppc_vr28_regnum, |
sim_ppc_vr29_regnum, |
sim_ppc_vr30_regnum, |
sim_ppc_vr31_regnum, |
/* SPE APU GPR upper halves. These are the upper 32 bits of the |
gprs; there is one upper-half register for each gpr, so it is |
appropriate to use sim_ppc_num_gprs for iterating through |
these. */ |
sim_ppc_rh0_regnum, |
sim_ppc_rh1_regnum, |
sim_ppc_rh2_regnum, |
sim_ppc_rh3_regnum, |
sim_ppc_rh4_regnum, |
sim_ppc_rh5_regnum, |
sim_ppc_rh6_regnum, |
sim_ppc_rh7_regnum, |
sim_ppc_rh8_regnum, |
sim_ppc_rh9_regnum, |
sim_ppc_rh10_regnum, |
sim_ppc_rh11_regnum, |
sim_ppc_rh12_regnum, |
sim_ppc_rh13_regnum, |
sim_ppc_rh14_regnum, |
sim_ppc_rh15_regnum, |
sim_ppc_rh16_regnum, |
sim_ppc_rh17_regnum, |
sim_ppc_rh18_regnum, |
sim_ppc_rh19_regnum, |
sim_ppc_rh20_regnum, |
sim_ppc_rh21_regnum, |
sim_ppc_rh22_regnum, |
sim_ppc_rh23_regnum, |
sim_ppc_rh24_regnum, |
sim_ppc_rh25_regnum, |
sim_ppc_rh26_regnum, |
sim_ppc_rh27_regnum, |
sim_ppc_rh28_regnum, |
sim_ppc_rh29_regnum, |
sim_ppc_rh30_regnum, |
sim_ppc_rh31_regnum, |
/* SPE APU GPR full registers. Each of these registers is the |
64-bit concatenation of a 32-bit GPR (providing the lower bits) |
and a 32-bit upper-half register (providing the higher bits). |
As for the upper-half registers, it is appropriate to use |
sim_ppc_num_gprs with these. */ |
sim_ppc_ev0_regnum, |
sim_ppc_ev1_regnum, |
sim_ppc_ev2_regnum, |
sim_ppc_ev3_regnum, |
sim_ppc_ev4_regnum, |
sim_ppc_ev5_regnum, |
sim_ppc_ev6_regnum, |
sim_ppc_ev7_regnum, |
sim_ppc_ev8_regnum, |
sim_ppc_ev9_regnum, |
sim_ppc_ev10_regnum, |
sim_ppc_ev11_regnum, |
sim_ppc_ev12_regnum, |
sim_ppc_ev13_regnum, |
sim_ppc_ev14_regnum, |
sim_ppc_ev15_regnum, |
sim_ppc_ev16_regnum, |
sim_ppc_ev17_regnum, |
sim_ppc_ev18_regnum, |
sim_ppc_ev19_regnum, |
sim_ppc_ev20_regnum, |
sim_ppc_ev21_regnum, |
sim_ppc_ev22_regnum, |
sim_ppc_ev23_regnum, |
sim_ppc_ev24_regnum, |
sim_ppc_ev25_regnum, |
sim_ppc_ev26_regnum, |
sim_ppc_ev27_regnum, |
sim_ppc_ev28_regnum, |
sim_ppc_ev29_regnum, |
sim_ppc_ev30_regnum, |
sim_ppc_ev31_regnum, |
/* Segment registers, sr0 -- sr15. */ |
sim_ppc_sr0_regnum, |
sim_ppc_sr1_regnum, |
sim_ppc_sr2_regnum, |
sim_ppc_sr3_regnum, |
sim_ppc_sr4_regnum, |
sim_ppc_sr5_regnum, |
sim_ppc_sr6_regnum, |
sim_ppc_sr7_regnum, |
sim_ppc_sr8_regnum, |
sim_ppc_sr9_regnum, |
sim_ppc_sr10_regnum, |
sim_ppc_sr11_regnum, |
sim_ppc_sr12_regnum, |
sim_ppc_sr13_regnum, |
sim_ppc_sr14_regnum, |
sim_ppc_sr15_regnum, |
/* Miscellaneous --- but non-SPR --- registers. */ |
sim_ppc_pc_regnum, |
sim_ppc_ps_regnum, |
sim_ppc_cr_regnum, |
sim_ppc_fpscr_regnum, |
sim_ppc_acc_regnum, |
sim_ppc_vscr_regnum, |
/* Special-purpose registers. */ |
sim_ppc_spr0_regnum, sim_ppc_spr1_regnum, |
sim_ppc_spr2_regnum, sim_ppc_spr3_regnum, |
sim_ppc_spr4_regnum, sim_ppc_spr5_regnum, |
sim_ppc_spr6_regnum, sim_ppc_spr7_regnum, |
sim_ppc_spr8_regnum, sim_ppc_spr9_regnum, |
sim_ppc_spr10_regnum, sim_ppc_spr11_regnum, |
sim_ppc_spr12_regnum, sim_ppc_spr13_regnum, |
sim_ppc_spr14_regnum, sim_ppc_spr15_regnum, |
sim_ppc_spr16_regnum, sim_ppc_spr17_regnum, |
sim_ppc_spr18_regnum, sim_ppc_spr19_regnum, |
sim_ppc_spr20_regnum, sim_ppc_spr21_regnum, |
sim_ppc_spr22_regnum, sim_ppc_spr23_regnum, |
sim_ppc_spr24_regnum, sim_ppc_spr25_regnum, |
sim_ppc_spr26_regnum, sim_ppc_spr27_regnum, |
sim_ppc_spr28_regnum, sim_ppc_spr29_regnum, |
sim_ppc_spr30_regnum, sim_ppc_spr31_regnum, |
sim_ppc_spr32_regnum, sim_ppc_spr33_regnum, |
sim_ppc_spr34_regnum, sim_ppc_spr35_regnum, |
sim_ppc_spr36_regnum, sim_ppc_spr37_regnum, |
sim_ppc_spr38_regnum, sim_ppc_spr39_regnum, |
sim_ppc_spr40_regnum, sim_ppc_spr41_regnum, |
sim_ppc_spr42_regnum, sim_ppc_spr43_regnum, |
sim_ppc_spr44_regnum, sim_ppc_spr45_regnum, |
sim_ppc_spr46_regnum, sim_ppc_spr47_regnum, |
sim_ppc_spr48_regnum, sim_ppc_spr49_regnum, |
sim_ppc_spr50_regnum, sim_ppc_spr51_regnum, |
sim_ppc_spr52_regnum, sim_ppc_spr53_regnum, |
sim_ppc_spr54_regnum, sim_ppc_spr55_regnum, |
sim_ppc_spr56_regnum, sim_ppc_spr57_regnum, |
sim_ppc_spr58_regnum, sim_ppc_spr59_regnum, |
sim_ppc_spr60_regnum, sim_ppc_spr61_regnum, |
sim_ppc_spr62_regnum, sim_ppc_spr63_regnum, |
sim_ppc_spr64_regnum, sim_ppc_spr65_regnum, |
sim_ppc_spr66_regnum, sim_ppc_spr67_regnum, |
sim_ppc_spr68_regnum, sim_ppc_spr69_regnum, |
sim_ppc_spr70_regnum, sim_ppc_spr71_regnum, |
sim_ppc_spr72_regnum, sim_ppc_spr73_regnum, |
sim_ppc_spr74_regnum, sim_ppc_spr75_regnum, |
sim_ppc_spr76_regnum, sim_ppc_spr77_regnum, |
sim_ppc_spr78_regnum, sim_ppc_spr79_regnum, |
sim_ppc_spr80_regnum, sim_ppc_spr81_regnum, |
sim_ppc_spr82_regnum, sim_ppc_spr83_regnum, |
sim_ppc_spr84_regnum, sim_ppc_spr85_regnum, |
sim_ppc_spr86_regnum, sim_ppc_spr87_regnum, |
sim_ppc_spr88_regnum, sim_ppc_spr89_regnum, |
sim_ppc_spr90_regnum, sim_ppc_spr91_regnum, |
sim_ppc_spr92_regnum, sim_ppc_spr93_regnum, |
sim_ppc_spr94_regnum, sim_ppc_spr95_regnum, |
sim_ppc_spr96_regnum, sim_ppc_spr97_regnum, |
sim_ppc_spr98_regnum, sim_ppc_spr99_regnum, |
sim_ppc_spr100_regnum, sim_ppc_spr101_regnum, |
sim_ppc_spr102_regnum, sim_ppc_spr103_regnum, |
sim_ppc_spr104_regnum, sim_ppc_spr105_regnum, |
sim_ppc_spr106_regnum, sim_ppc_spr107_regnum, |
sim_ppc_spr108_regnum, sim_ppc_spr109_regnum, |
sim_ppc_spr110_regnum, sim_ppc_spr111_regnum, |
sim_ppc_spr112_regnum, sim_ppc_spr113_regnum, |
sim_ppc_spr114_regnum, sim_ppc_spr115_regnum, |
sim_ppc_spr116_regnum, sim_ppc_spr117_regnum, |
sim_ppc_spr118_regnum, sim_ppc_spr119_regnum, |
sim_ppc_spr120_regnum, sim_ppc_spr121_regnum, |
sim_ppc_spr122_regnum, sim_ppc_spr123_regnum, |
sim_ppc_spr124_regnum, sim_ppc_spr125_regnum, |
sim_ppc_spr126_regnum, sim_ppc_spr127_regnum, |
sim_ppc_spr128_regnum, sim_ppc_spr129_regnum, |
sim_ppc_spr130_regnum, sim_ppc_spr131_regnum, |
sim_ppc_spr132_regnum, sim_ppc_spr133_regnum, |
sim_ppc_spr134_regnum, sim_ppc_spr135_regnum, |
sim_ppc_spr136_regnum, sim_ppc_spr137_regnum, |
sim_ppc_spr138_regnum, sim_ppc_spr139_regnum, |
sim_ppc_spr140_regnum, sim_ppc_spr141_regnum, |
sim_ppc_spr142_regnum, sim_ppc_spr143_regnum, |
sim_ppc_spr144_regnum, sim_ppc_spr145_regnum, |
sim_ppc_spr146_regnum, sim_ppc_spr147_regnum, |
sim_ppc_spr148_regnum, sim_ppc_spr149_regnum, |
sim_ppc_spr150_regnum, sim_ppc_spr151_regnum, |
sim_ppc_spr152_regnum, sim_ppc_spr153_regnum, |
sim_ppc_spr154_regnum, sim_ppc_spr155_regnum, |
sim_ppc_spr156_regnum, sim_ppc_spr157_regnum, |
sim_ppc_spr158_regnum, sim_ppc_spr159_regnum, |
sim_ppc_spr160_regnum, sim_ppc_spr161_regnum, |
sim_ppc_spr162_regnum, sim_ppc_spr163_regnum, |
sim_ppc_spr164_regnum, sim_ppc_spr165_regnum, |
sim_ppc_spr166_regnum, sim_ppc_spr167_regnum, |
sim_ppc_spr168_regnum, sim_ppc_spr169_regnum, |
sim_ppc_spr170_regnum, sim_ppc_spr171_regnum, |
sim_ppc_spr172_regnum, sim_ppc_spr173_regnum, |
sim_ppc_spr174_regnum, sim_ppc_spr175_regnum, |
sim_ppc_spr176_regnum, sim_ppc_spr177_regnum, |
sim_ppc_spr178_regnum, sim_ppc_spr179_regnum, |
sim_ppc_spr180_regnum, sim_ppc_spr181_regnum, |
sim_ppc_spr182_regnum, sim_ppc_spr183_regnum, |
sim_ppc_spr184_regnum, sim_ppc_spr185_regnum, |
sim_ppc_spr186_regnum, sim_ppc_spr187_regnum, |
sim_ppc_spr188_regnum, sim_ppc_spr189_regnum, |
sim_ppc_spr190_regnum, sim_ppc_spr191_regnum, |
sim_ppc_spr192_regnum, sim_ppc_spr193_regnum, |
sim_ppc_spr194_regnum, sim_ppc_spr195_regnum, |
sim_ppc_spr196_regnum, sim_ppc_spr197_regnum, |
sim_ppc_spr198_regnum, sim_ppc_spr199_regnum, |
sim_ppc_spr200_regnum, sim_ppc_spr201_regnum, |
sim_ppc_spr202_regnum, sim_ppc_spr203_regnum, |
sim_ppc_spr204_regnum, sim_ppc_spr205_regnum, |
sim_ppc_spr206_regnum, sim_ppc_spr207_regnum, |
sim_ppc_spr208_regnum, sim_ppc_spr209_regnum, |
sim_ppc_spr210_regnum, sim_ppc_spr211_regnum, |
sim_ppc_spr212_regnum, sim_ppc_spr213_regnum, |
sim_ppc_spr214_regnum, sim_ppc_spr215_regnum, |
sim_ppc_spr216_regnum, sim_ppc_spr217_regnum, |
sim_ppc_spr218_regnum, sim_ppc_spr219_regnum, |
sim_ppc_spr220_regnum, sim_ppc_spr221_regnum, |
sim_ppc_spr222_regnum, sim_ppc_spr223_regnum, |
sim_ppc_spr224_regnum, sim_ppc_spr225_regnum, |
sim_ppc_spr226_regnum, sim_ppc_spr227_regnum, |
sim_ppc_spr228_regnum, sim_ppc_spr229_regnum, |
sim_ppc_spr230_regnum, sim_ppc_spr231_regnum, |
sim_ppc_spr232_regnum, sim_ppc_spr233_regnum, |
sim_ppc_spr234_regnum, sim_ppc_spr235_regnum, |
sim_ppc_spr236_regnum, sim_ppc_spr237_regnum, |
sim_ppc_spr238_regnum, sim_ppc_spr239_regnum, |
sim_ppc_spr240_regnum, sim_ppc_spr241_regnum, |
sim_ppc_spr242_regnum, sim_ppc_spr243_regnum, |
sim_ppc_spr244_regnum, sim_ppc_spr245_regnum, |
sim_ppc_spr246_regnum, sim_ppc_spr247_regnum, |
sim_ppc_spr248_regnum, sim_ppc_spr249_regnum, |
sim_ppc_spr250_regnum, sim_ppc_spr251_regnum, |
sim_ppc_spr252_regnum, sim_ppc_spr253_regnum, |
sim_ppc_spr254_regnum, sim_ppc_spr255_regnum, |
sim_ppc_spr256_regnum, sim_ppc_spr257_regnum, |
sim_ppc_spr258_regnum, sim_ppc_spr259_regnum, |
sim_ppc_spr260_regnum, sim_ppc_spr261_regnum, |
sim_ppc_spr262_regnum, sim_ppc_spr263_regnum, |
sim_ppc_spr264_regnum, sim_ppc_spr265_regnum, |
sim_ppc_spr266_regnum, sim_ppc_spr267_regnum, |
sim_ppc_spr268_regnum, sim_ppc_spr269_regnum, |
sim_ppc_spr270_regnum, sim_ppc_spr271_regnum, |
sim_ppc_spr272_regnum, sim_ppc_spr273_regnum, |
sim_ppc_spr274_regnum, sim_ppc_spr275_regnum, |
sim_ppc_spr276_regnum, sim_ppc_spr277_regnum, |
sim_ppc_spr278_regnum, sim_ppc_spr279_regnum, |
sim_ppc_spr280_regnum, sim_ppc_spr281_regnum, |
sim_ppc_spr282_regnum, sim_ppc_spr283_regnum, |
sim_ppc_spr284_regnum, sim_ppc_spr285_regnum, |
sim_ppc_spr286_regnum, sim_ppc_spr287_regnum, |
sim_ppc_spr288_regnum, sim_ppc_spr289_regnum, |
sim_ppc_spr290_regnum, sim_ppc_spr291_regnum, |
sim_ppc_spr292_regnum, sim_ppc_spr293_regnum, |
sim_ppc_spr294_regnum, sim_ppc_spr295_regnum, |
sim_ppc_spr296_regnum, sim_ppc_spr297_regnum, |
sim_ppc_spr298_regnum, sim_ppc_spr299_regnum, |
sim_ppc_spr300_regnum, sim_ppc_spr301_regnum, |
sim_ppc_spr302_regnum, sim_ppc_spr303_regnum, |
sim_ppc_spr304_regnum, sim_ppc_spr305_regnum, |
sim_ppc_spr306_regnum, sim_ppc_spr307_regnum, |
sim_ppc_spr308_regnum, sim_ppc_spr309_regnum, |
sim_ppc_spr310_regnum, sim_ppc_spr311_regnum, |
sim_ppc_spr312_regnum, sim_ppc_spr313_regnum, |
sim_ppc_spr314_regnum, sim_ppc_spr315_regnum, |
sim_ppc_spr316_regnum, sim_ppc_spr317_regnum, |
sim_ppc_spr318_regnum, sim_ppc_spr319_regnum, |
sim_ppc_spr320_regnum, sim_ppc_spr321_regnum, |
sim_ppc_spr322_regnum, sim_ppc_spr323_regnum, |
sim_ppc_spr324_regnum, sim_ppc_spr325_regnum, |
sim_ppc_spr326_regnum, sim_ppc_spr327_regnum, |
sim_ppc_spr328_regnum, sim_ppc_spr329_regnum, |
sim_ppc_spr330_regnum, sim_ppc_spr331_regnum, |
sim_ppc_spr332_regnum, sim_ppc_spr333_regnum, |
sim_ppc_spr334_regnum, sim_ppc_spr335_regnum, |
sim_ppc_spr336_regnum, sim_ppc_spr337_regnum, |
sim_ppc_spr338_regnum, sim_ppc_spr339_regnum, |
sim_ppc_spr340_regnum, sim_ppc_spr341_regnum, |
sim_ppc_spr342_regnum, sim_ppc_spr343_regnum, |
sim_ppc_spr344_regnum, sim_ppc_spr345_regnum, |
sim_ppc_spr346_regnum, sim_ppc_spr347_regnum, |
sim_ppc_spr348_regnum, sim_ppc_spr349_regnum, |
sim_ppc_spr350_regnum, sim_ppc_spr351_regnum, |
sim_ppc_spr352_regnum, sim_ppc_spr353_regnum, |
sim_ppc_spr354_regnum, sim_ppc_spr355_regnum, |
sim_ppc_spr356_regnum, sim_ppc_spr357_regnum, |
sim_ppc_spr358_regnum, sim_ppc_spr359_regnum, |
sim_ppc_spr360_regnum, sim_ppc_spr361_regnum, |
sim_ppc_spr362_regnum, sim_ppc_spr363_regnum, |
sim_ppc_spr364_regnum, sim_ppc_spr365_regnum, |
sim_ppc_spr366_regnum, sim_ppc_spr367_regnum, |
sim_ppc_spr368_regnum, sim_ppc_spr369_regnum, |
sim_ppc_spr370_regnum, sim_ppc_spr371_regnum, |
sim_ppc_spr372_regnum, sim_ppc_spr373_regnum, |
sim_ppc_spr374_regnum, sim_ppc_spr375_regnum, |
sim_ppc_spr376_regnum, sim_ppc_spr377_regnum, |
sim_ppc_spr378_regnum, sim_ppc_spr379_regnum, |
sim_ppc_spr380_regnum, sim_ppc_spr381_regnum, |
sim_ppc_spr382_regnum, sim_ppc_spr383_regnum, |
sim_ppc_spr384_regnum, sim_ppc_spr385_regnum, |
sim_ppc_spr386_regnum, sim_ppc_spr387_regnum, |
sim_ppc_spr388_regnum, sim_ppc_spr389_regnum, |
sim_ppc_spr390_regnum, sim_ppc_spr391_regnum, |
sim_ppc_spr392_regnum, sim_ppc_spr393_regnum, |
sim_ppc_spr394_regnum, sim_ppc_spr395_regnum, |
sim_ppc_spr396_regnum, sim_ppc_spr397_regnum, |
sim_ppc_spr398_regnum, sim_ppc_spr399_regnum, |
sim_ppc_spr400_regnum, sim_ppc_spr401_regnum, |
sim_ppc_spr402_regnum, sim_ppc_spr403_regnum, |
sim_ppc_spr404_regnum, sim_ppc_spr405_regnum, |
sim_ppc_spr406_regnum, sim_ppc_spr407_regnum, |
sim_ppc_spr408_regnum, sim_ppc_spr409_regnum, |
sim_ppc_spr410_regnum, sim_ppc_spr411_regnum, |
sim_ppc_spr412_regnum, sim_ppc_spr413_regnum, |
sim_ppc_spr414_regnum, sim_ppc_spr415_regnum, |
sim_ppc_spr416_regnum, sim_ppc_spr417_regnum, |
sim_ppc_spr418_regnum, sim_ppc_spr419_regnum, |
sim_ppc_spr420_regnum, sim_ppc_spr421_regnum, |
sim_ppc_spr422_regnum, sim_ppc_spr423_regnum, |
sim_ppc_spr424_regnum, sim_ppc_spr425_regnum, |
sim_ppc_spr426_regnum, sim_ppc_spr427_regnum, |
sim_ppc_spr428_regnum, sim_ppc_spr429_regnum, |
sim_ppc_spr430_regnum, sim_ppc_spr431_regnum, |
sim_ppc_spr432_regnum, sim_ppc_spr433_regnum, |
sim_ppc_spr434_regnum, sim_ppc_spr435_regnum, |
sim_ppc_spr436_regnum, sim_ppc_spr437_regnum, |
sim_ppc_spr438_regnum, sim_ppc_spr439_regnum, |
sim_ppc_spr440_regnum, sim_ppc_spr441_regnum, |
sim_ppc_spr442_regnum, sim_ppc_spr443_regnum, |
sim_ppc_spr444_regnum, sim_ppc_spr445_regnum, |
sim_ppc_spr446_regnum, sim_ppc_spr447_regnum, |
sim_ppc_spr448_regnum, sim_ppc_spr449_regnum, |
sim_ppc_spr450_regnum, sim_ppc_spr451_regnum, |
sim_ppc_spr452_regnum, sim_ppc_spr453_regnum, |
sim_ppc_spr454_regnum, sim_ppc_spr455_regnum, |
sim_ppc_spr456_regnum, sim_ppc_spr457_regnum, |
sim_ppc_spr458_regnum, sim_ppc_spr459_regnum, |
sim_ppc_spr460_regnum, sim_ppc_spr461_regnum, |
sim_ppc_spr462_regnum, sim_ppc_spr463_regnum, |
sim_ppc_spr464_regnum, sim_ppc_spr465_regnum, |
sim_ppc_spr466_regnum, sim_ppc_spr467_regnum, |
sim_ppc_spr468_regnum, sim_ppc_spr469_regnum, |
sim_ppc_spr470_regnum, sim_ppc_spr471_regnum, |
sim_ppc_spr472_regnum, sim_ppc_spr473_regnum, |
sim_ppc_spr474_regnum, sim_ppc_spr475_regnum, |
sim_ppc_spr476_regnum, sim_ppc_spr477_regnum, |
sim_ppc_spr478_regnum, sim_ppc_spr479_regnum, |
sim_ppc_spr480_regnum, sim_ppc_spr481_regnum, |
sim_ppc_spr482_regnum, sim_ppc_spr483_regnum, |
sim_ppc_spr484_regnum, sim_ppc_spr485_regnum, |
sim_ppc_spr486_regnum, sim_ppc_spr487_regnum, |
sim_ppc_spr488_regnum, sim_ppc_spr489_regnum, |
sim_ppc_spr490_regnum, sim_ppc_spr491_regnum, |
sim_ppc_spr492_regnum, sim_ppc_spr493_regnum, |
sim_ppc_spr494_regnum, sim_ppc_spr495_regnum, |
sim_ppc_spr496_regnum, sim_ppc_spr497_regnum, |
sim_ppc_spr498_regnum, sim_ppc_spr499_regnum, |
sim_ppc_spr500_regnum, sim_ppc_spr501_regnum, |
sim_ppc_spr502_regnum, sim_ppc_spr503_regnum, |
sim_ppc_spr504_regnum, sim_ppc_spr505_regnum, |
sim_ppc_spr506_regnum, sim_ppc_spr507_regnum, |
sim_ppc_spr508_regnum, sim_ppc_spr509_regnum, |
sim_ppc_spr510_regnum, sim_ppc_spr511_regnum, |
sim_ppc_spr512_regnum, sim_ppc_spr513_regnum, |
sim_ppc_spr514_regnum, sim_ppc_spr515_regnum, |
sim_ppc_spr516_regnum, sim_ppc_spr517_regnum, |
sim_ppc_spr518_regnum, sim_ppc_spr519_regnum, |
sim_ppc_spr520_regnum, sim_ppc_spr521_regnum, |
sim_ppc_spr522_regnum, sim_ppc_spr523_regnum, |
sim_ppc_spr524_regnum, sim_ppc_spr525_regnum, |
sim_ppc_spr526_regnum, sim_ppc_spr527_regnum, |
sim_ppc_spr528_regnum, sim_ppc_spr529_regnum, |
sim_ppc_spr530_regnum, sim_ppc_spr531_regnum, |
sim_ppc_spr532_regnum, sim_ppc_spr533_regnum, |
sim_ppc_spr534_regnum, sim_ppc_spr535_regnum, |
sim_ppc_spr536_regnum, sim_ppc_spr537_regnum, |
sim_ppc_spr538_regnum, sim_ppc_spr539_regnum, |
sim_ppc_spr540_regnum, sim_ppc_spr541_regnum, |
sim_ppc_spr542_regnum, sim_ppc_spr543_regnum, |
sim_ppc_spr544_regnum, sim_ppc_spr545_regnum, |
sim_ppc_spr546_regnum, sim_ppc_spr547_regnum, |
sim_ppc_spr548_regnum, sim_ppc_spr549_regnum, |
sim_ppc_spr550_regnum, sim_ppc_spr551_regnum, |
sim_ppc_spr552_regnum, sim_ppc_spr553_regnum, |
sim_ppc_spr554_regnum, sim_ppc_spr555_regnum, |
sim_ppc_spr556_regnum, sim_ppc_spr557_regnum, |
sim_ppc_spr558_regnum, sim_ppc_spr559_regnum, |
sim_ppc_spr560_regnum, sim_ppc_spr561_regnum, |
sim_ppc_spr562_regnum, sim_ppc_spr563_regnum, |
sim_ppc_spr564_regnum, sim_ppc_spr565_regnum, |
sim_ppc_spr566_regnum, sim_ppc_spr567_regnum, |
sim_ppc_spr568_regnum, sim_ppc_spr569_regnum, |
sim_ppc_spr570_regnum, sim_ppc_spr571_regnum, |
sim_ppc_spr572_regnum, sim_ppc_spr573_regnum, |
sim_ppc_spr574_regnum, sim_ppc_spr575_regnum, |
sim_ppc_spr576_regnum, sim_ppc_spr577_regnum, |
sim_ppc_spr578_regnum, sim_ppc_spr579_regnum, |
sim_ppc_spr580_regnum, sim_ppc_spr581_regnum, |
sim_ppc_spr582_regnum, sim_ppc_spr583_regnum, |
sim_ppc_spr584_regnum, sim_ppc_spr585_regnum, |
sim_ppc_spr586_regnum, sim_ppc_spr587_regnum, |
sim_ppc_spr588_regnum, sim_ppc_spr589_regnum, |
sim_ppc_spr590_regnum, sim_ppc_spr591_regnum, |
sim_ppc_spr592_regnum, sim_ppc_spr593_regnum, |
sim_ppc_spr594_regnum, sim_ppc_spr595_regnum, |
sim_ppc_spr596_regnum, sim_ppc_spr597_regnum, |
sim_ppc_spr598_regnum, sim_ppc_spr599_regnum, |
sim_ppc_spr600_regnum, sim_ppc_spr601_regnum, |
sim_ppc_spr602_regnum, sim_ppc_spr603_regnum, |
sim_ppc_spr604_regnum, sim_ppc_spr605_regnum, |
sim_ppc_spr606_regnum, sim_ppc_spr607_regnum, |
sim_ppc_spr608_regnum, sim_ppc_spr609_regnum, |
sim_ppc_spr610_regnum, sim_ppc_spr611_regnum, |
sim_ppc_spr612_regnum, sim_ppc_spr613_regnum, |
sim_ppc_spr614_regnum, sim_ppc_spr615_regnum, |
sim_ppc_spr616_regnum, sim_ppc_spr617_regnum, |
sim_ppc_spr618_regnum, sim_ppc_spr619_regnum, |
sim_ppc_spr620_regnum, sim_ppc_spr621_regnum, |
sim_ppc_spr622_regnum, sim_ppc_spr623_regnum, |
sim_ppc_spr624_regnum, sim_ppc_spr625_regnum, |
sim_ppc_spr626_regnum, sim_ppc_spr627_regnum, |
sim_ppc_spr628_regnum, sim_ppc_spr629_regnum, |
sim_ppc_spr630_regnum, sim_ppc_spr631_regnum, |
sim_ppc_spr632_regnum, sim_ppc_spr633_regnum, |
sim_ppc_spr634_regnum, sim_ppc_spr635_regnum, |
sim_ppc_spr636_regnum, sim_ppc_spr637_regnum, |
sim_ppc_spr638_regnum, sim_ppc_spr639_regnum, |
sim_ppc_spr640_regnum, sim_ppc_spr641_regnum, |
sim_ppc_spr642_regnum, sim_ppc_spr643_regnum, |
sim_ppc_spr644_regnum, sim_ppc_spr645_regnum, |
sim_ppc_spr646_regnum, sim_ppc_spr647_regnum, |
sim_ppc_spr648_regnum, sim_ppc_spr649_regnum, |
sim_ppc_spr650_regnum, sim_ppc_spr651_regnum, |
sim_ppc_spr652_regnum, sim_ppc_spr653_regnum, |
sim_ppc_spr654_regnum, sim_ppc_spr655_regnum, |
sim_ppc_spr656_regnum, sim_ppc_spr657_regnum, |
sim_ppc_spr658_regnum, sim_ppc_spr659_regnum, |
sim_ppc_spr660_regnum, sim_ppc_spr661_regnum, |
sim_ppc_spr662_regnum, sim_ppc_spr663_regnum, |
sim_ppc_spr664_regnum, sim_ppc_spr665_regnum, |
sim_ppc_spr666_regnum, sim_ppc_spr667_regnum, |
sim_ppc_spr668_regnum, sim_ppc_spr669_regnum, |
sim_ppc_spr670_regnum, sim_ppc_spr671_regnum, |
sim_ppc_spr672_regnum, sim_ppc_spr673_regnum, |
sim_ppc_spr674_regnum, sim_ppc_spr675_regnum, |
sim_ppc_spr676_regnum, sim_ppc_spr677_regnum, |
sim_ppc_spr678_regnum, sim_ppc_spr679_regnum, |
sim_ppc_spr680_regnum, sim_ppc_spr681_regnum, |
sim_ppc_spr682_regnum, sim_ppc_spr683_regnum, |
sim_ppc_spr684_regnum, sim_ppc_spr685_regnum, |
sim_ppc_spr686_regnum, sim_ppc_spr687_regnum, |
sim_ppc_spr688_regnum, sim_ppc_spr689_regnum, |
sim_ppc_spr690_regnum, sim_ppc_spr691_regnum, |
sim_ppc_spr692_regnum, sim_ppc_spr693_regnum, |
sim_ppc_spr694_regnum, sim_ppc_spr695_regnum, |
sim_ppc_spr696_regnum, sim_ppc_spr697_regnum, |
sim_ppc_spr698_regnum, sim_ppc_spr699_regnum, |
sim_ppc_spr700_regnum, sim_ppc_spr701_regnum, |
sim_ppc_spr702_regnum, sim_ppc_spr703_regnum, |
sim_ppc_spr704_regnum, sim_ppc_spr705_regnum, |
sim_ppc_spr706_regnum, sim_ppc_spr707_regnum, |
sim_ppc_spr708_regnum, sim_ppc_spr709_regnum, |
sim_ppc_spr710_regnum, sim_ppc_spr711_regnum, |
sim_ppc_spr712_regnum, sim_ppc_spr713_regnum, |
sim_ppc_spr714_regnum, sim_ppc_spr715_regnum, |
sim_ppc_spr716_regnum, sim_ppc_spr717_regnum, |
sim_ppc_spr718_regnum, sim_ppc_spr719_regnum, |
sim_ppc_spr720_regnum, sim_ppc_spr721_regnum, |
sim_ppc_spr722_regnum, sim_ppc_spr723_regnum, |
sim_ppc_spr724_regnum, sim_ppc_spr725_regnum, |
sim_ppc_spr726_regnum, sim_ppc_spr727_regnum, |
sim_ppc_spr728_regnum, sim_ppc_spr729_regnum, |
sim_ppc_spr730_regnum, sim_ppc_spr731_regnum, |
sim_ppc_spr732_regnum, sim_ppc_spr733_regnum, |
sim_ppc_spr734_regnum, sim_ppc_spr735_regnum, |
sim_ppc_spr736_regnum, sim_ppc_spr737_regnum, |
sim_ppc_spr738_regnum, sim_ppc_spr739_regnum, |
sim_ppc_spr740_regnum, sim_ppc_spr741_regnum, |
sim_ppc_spr742_regnum, sim_ppc_spr743_regnum, |
sim_ppc_spr744_regnum, sim_ppc_spr745_regnum, |
sim_ppc_spr746_regnum, sim_ppc_spr747_regnum, |
sim_ppc_spr748_regnum, sim_ppc_spr749_regnum, |
sim_ppc_spr750_regnum, sim_ppc_spr751_regnum, |
sim_ppc_spr752_regnum, sim_ppc_spr753_regnum, |
sim_ppc_spr754_regnum, sim_ppc_spr755_regnum, |
sim_ppc_spr756_regnum, sim_ppc_spr757_regnum, |
sim_ppc_spr758_regnum, sim_ppc_spr759_regnum, |
sim_ppc_spr760_regnum, sim_ppc_spr761_regnum, |
sim_ppc_spr762_regnum, sim_ppc_spr763_regnum, |
sim_ppc_spr764_regnum, sim_ppc_spr765_regnum, |
sim_ppc_spr766_regnum, sim_ppc_spr767_regnum, |
sim_ppc_spr768_regnum, sim_ppc_spr769_regnum, |
sim_ppc_spr770_regnum, sim_ppc_spr771_regnum, |
sim_ppc_spr772_regnum, sim_ppc_spr773_regnum, |
sim_ppc_spr774_regnum, sim_ppc_spr775_regnum, |
sim_ppc_spr776_regnum, sim_ppc_spr777_regnum, |
sim_ppc_spr778_regnum, sim_ppc_spr779_regnum, |
sim_ppc_spr780_regnum, sim_ppc_spr781_regnum, |
sim_ppc_spr782_regnum, sim_ppc_spr783_regnum, |
sim_ppc_spr784_regnum, sim_ppc_spr785_regnum, |
sim_ppc_spr786_regnum, sim_ppc_spr787_regnum, |
sim_ppc_spr788_regnum, sim_ppc_spr789_regnum, |
sim_ppc_spr790_regnum, sim_ppc_spr791_regnum, |
sim_ppc_spr792_regnum, sim_ppc_spr793_regnum, |
sim_ppc_spr794_regnum, sim_ppc_spr795_regnum, |
sim_ppc_spr796_regnum, sim_ppc_spr797_regnum, |
sim_ppc_spr798_regnum, sim_ppc_spr799_regnum, |
sim_ppc_spr800_regnum, sim_ppc_spr801_regnum, |
sim_ppc_spr802_regnum, sim_ppc_spr803_regnum, |
sim_ppc_spr804_regnum, sim_ppc_spr805_regnum, |
sim_ppc_spr806_regnum, sim_ppc_spr807_regnum, |
sim_ppc_spr808_regnum, sim_ppc_spr809_regnum, |
sim_ppc_spr810_regnum, sim_ppc_spr811_regnum, |
sim_ppc_spr812_regnum, sim_ppc_spr813_regnum, |
sim_ppc_spr814_regnum, sim_ppc_spr815_regnum, |
sim_ppc_spr816_regnum, sim_ppc_spr817_regnum, |
sim_ppc_spr818_regnum, sim_ppc_spr819_regnum, |
sim_ppc_spr820_regnum, sim_ppc_spr821_regnum, |
sim_ppc_spr822_regnum, sim_ppc_spr823_regnum, |
sim_ppc_spr824_regnum, sim_ppc_spr825_regnum, |
sim_ppc_spr826_regnum, sim_ppc_spr827_regnum, |
sim_ppc_spr828_regnum, sim_ppc_spr829_regnum, |
sim_ppc_spr830_regnum, sim_ppc_spr831_regnum, |
sim_ppc_spr832_regnum, sim_ppc_spr833_regnum, |
sim_ppc_spr834_regnum, sim_ppc_spr835_regnum, |
sim_ppc_spr836_regnum, sim_ppc_spr837_regnum, |
sim_ppc_spr838_regnum, sim_ppc_spr839_regnum, |
sim_ppc_spr840_regnum, sim_ppc_spr841_regnum, |
sim_ppc_spr842_regnum, sim_ppc_spr843_regnum, |
sim_ppc_spr844_regnum, sim_ppc_spr845_regnum, |
sim_ppc_spr846_regnum, sim_ppc_spr847_regnum, |
sim_ppc_spr848_regnum, sim_ppc_spr849_regnum, |
sim_ppc_spr850_regnum, sim_ppc_spr851_regnum, |
sim_ppc_spr852_regnum, sim_ppc_spr853_regnum, |
sim_ppc_spr854_regnum, sim_ppc_spr855_regnum, |
sim_ppc_spr856_regnum, sim_ppc_spr857_regnum, |
sim_ppc_spr858_regnum, sim_ppc_spr859_regnum, |
sim_ppc_spr860_regnum, sim_ppc_spr861_regnum, |
sim_ppc_spr862_regnum, sim_ppc_spr863_regnum, |
sim_ppc_spr864_regnum, sim_ppc_spr865_regnum, |
sim_ppc_spr866_regnum, sim_ppc_spr867_regnum, |
sim_ppc_spr868_regnum, sim_ppc_spr869_regnum, |
sim_ppc_spr870_regnum, sim_ppc_spr871_regnum, |
sim_ppc_spr872_regnum, sim_ppc_spr873_regnum, |
sim_ppc_spr874_regnum, sim_ppc_spr875_regnum, |
sim_ppc_spr876_regnum, sim_ppc_spr877_regnum, |
sim_ppc_spr878_regnum, sim_ppc_spr879_regnum, |
sim_ppc_spr880_regnum, sim_ppc_spr881_regnum, |
sim_ppc_spr882_regnum, sim_ppc_spr883_regnum, |
sim_ppc_spr884_regnum, sim_ppc_spr885_regnum, |
sim_ppc_spr886_regnum, sim_ppc_spr887_regnum, |
sim_ppc_spr888_regnum, sim_ppc_spr889_regnum, |
sim_ppc_spr890_regnum, sim_ppc_spr891_regnum, |
sim_ppc_spr892_regnum, sim_ppc_spr893_regnum, |
sim_ppc_spr894_regnum, sim_ppc_spr895_regnum, |
sim_ppc_spr896_regnum, sim_ppc_spr897_regnum, |
sim_ppc_spr898_regnum, sim_ppc_spr899_regnum, |
sim_ppc_spr900_regnum, sim_ppc_spr901_regnum, |
sim_ppc_spr902_regnum, sim_ppc_spr903_regnum, |
sim_ppc_spr904_regnum, sim_ppc_spr905_regnum, |
sim_ppc_spr906_regnum, sim_ppc_spr907_regnum, |
sim_ppc_spr908_regnum, sim_ppc_spr909_regnum, |
sim_ppc_spr910_regnum, sim_ppc_spr911_regnum, |
sim_ppc_spr912_regnum, sim_ppc_spr913_regnum, |
sim_ppc_spr914_regnum, sim_ppc_spr915_regnum, |
sim_ppc_spr916_regnum, sim_ppc_spr917_regnum, |
sim_ppc_spr918_regnum, sim_ppc_spr919_regnum, |
sim_ppc_spr920_regnum, sim_ppc_spr921_regnum, |
sim_ppc_spr922_regnum, sim_ppc_spr923_regnum, |
sim_ppc_spr924_regnum, sim_ppc_spr925_regnum, |
sim_ppc_spr926_regnum, sim_ppc_spr927_regnum, |
sim_ppc_spr928_regnum, sim_ppc_spr929_regnum, |
sim_ppc_spr930_regnum, sim_ppc_spr931_regnum, |
sim_ppc_spr932_regnum, sim_ppc_spr933_regnum, |
sim_ppc_spr934_regnum, sim_ppc_spr935_regnum, |
sim_ppc_spr936_regnum, sim_ppc_spr937_regnum, |
sim_ppc_spr938_regnum, sim_ppc_spr939_regnum, |
sim_ppc_spr940_regnum, sim_ppc_spr941_regnum, |
sim_ppc_spr942_regnum, sim_ppc_spr943_regnum, |
sim_ppc_spr944_regnum, sim_ppc_spr945_regnum, |
sim_ppc_spr946_regnum, sim_ppc_spr947_regnum, |
sim_ppc_spr948_regnum, sim_ppc_spr949_regnum, |
sim_ppc_spr950_regnum, sim_ppc_spr951_regnum, |
sim_ppc_spr952_regnum, sim_ppc_spr953_regnum, |
sim_ppc_spr954_regnum, sim_ppc_spr955_regnum, |
sim_ppc_spr956_regnum, sim_ppc_spr957_regnum, |
sim_ppc_spr958_regnum, sim_ppc_spr959_regnum, |
sim_ppc_spr960_regnum, sim_ppc_spr961_regnum, |
sim_ppc_spr962_regnum, sim_ppc_spr963_regnum, |
sim_ppc_spr964_regnum, sim_ppc_spr965_regnum, |
sim_ppc_spr966_regnum, sim_ppc_spr967_regnum, |
sim_ppc_spr968_regnum, sim_ppc_spr969_regnum, |
sim_ppc_spr970_regnum, sim_ppc_spr971_regnum, |
sim_ppc_spr972_regnum, sim_ppc_spr973_regnum, |
sim_ppc_spr974_regnum, sim_ppc_spr975_regnum, |
sim_ppc_spr976_regnum, sim_ppc_spr977_regnum, |
sim_ppc_spr978_regnum, sim_ppc_spr979_regnum, |
sim_ppc_spr980_regnum, sim_ppc_spr981_regnum, |
sim_ppc_spr982_regnum, sim_ppc_spr983_regnum, |
sim_ppc_spr984_regnum, sim_ppc_spr985_regnum, |
sim_ppc_spr986_regnum, sim_ppc_spr987_regnum, |
sim_ppc_spr988_regnum, sim_ppc_spr989_regnum, |
sim_ppc_spr990_regnum, sim_ppc_spr991_regnum, |
sim_ppc_spr992_regnum, sim_ppc_spr993_regnum, |
sim_ppc_spr994_regnum, sim_ppc_spr995_regnum, |
sim_ppc_spr996_regnum, sim_ppc_spr997_regnum, |
sim_ppc_spr998_regnum, sim_ppc_spr999_regnum, |
sim_ppc_spr1000_regnum, sim_ppc_spr1001_regnum, |
sim_ppc_spr1002_regnum, sim_ppc_spr1003_regnum, |
sim_ppc_spr1004_regnum, sim_ppc_spr1005_regnum, |
sim_ppc_spr1006_regnum, sim_ppc_spr1007_regnum, |
sim_ppc_spr1008_regnum, sim_ppc_spr1009_regnum, |
sim_ppc_spr1010_regnum, sim_ppc_spr1011_regnum, |
sim_ppc_spr1012_regnum, sim_ppc_spr1013_regnum, |
sim_ppc_spr1014_regnum, sim_ppc_spr1015_regnum, |
sim_ppc_spr1016_regnum, sim_ppc_spr1017_regnum, |
sim_ppc_spr1018_regnum, sim_ppc_spr1019_regnum, |
sim_ppc_spr1020_regnum, sim_ppc_spr1021_regnum, |
sim_ppc_spr1022_regnum, sim_ppc_spr1023_regnum |
}; |
/* Sizes of various register sets. */ |
enum |
{ |
sim_ppc_num_gprs = 32, |
sim_ppc_num_fprs = 32, |
sim_ppc_num_vrs = 32, |
sim_ppc_num_srs = 16, |
sim_ppc_num_sprs = 1024, |
}; |
/* Return the register name for the supplied SPR number if any, or |
NULL if none. */ |
extern const char *sim_spr_register_name (int); |
#ifdef __cplusplus |
} |
#endif |
#endif /* SIM_PPC_H */ |
/contrib/toolchain/binutils/include/gdb/sim-rl78.h |
---|
0,0 → 1,76 |
/* sim-rx.h --- interface between rl78 simulator and GDB. |
Copyright 2011-2013 Free Software Foundation, Inc. |
Contributed by Red Hat. |
This file is part of GDB. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
#if !defined (SIM_RL78_H) |
#define SIM_RL78_H |
enum sim_rl78_regnum |
{ |
sim_rl78_bank0_r0_regnum, |
sim_rl78_bank0_r1_regnum, |
sim_rl78_bank0_r2_regnum, |
sim_rl78_bank0_r3_regnum, |
sim_rl78_bank0_r4_regnum, |
sim_rl78_bank0_r5_regnum, |
sim_rl78_bank0_r6_regnum, |
sim_rl78_bank0_r7_regnum, |
sim_rl78_bank1_r0_regnum, |
sim_rl78_bank1_r1_regnum, |
sim_rl78_bank1_r2_regnum, |
sim_rl78_bank1_r3_regnum, |
sim_rl78_bank1_r4_regnum, |
sim_rl78_bank1_r5_regnum, |
sim_rl78_bank1_r6_regnum, |
sim_rl78_bank1_r7_regnum, |
sim_rl78_bank2_r0_regnum, |
sim_rl78_bank2_r1_regnum, |
sim_rl78_bank2_r2_regnum, |
sim_rl78_bank2_r3_regnum, |
sim_rl78_bank2_r4_regnum, |
sim_rl78_bank2_r5_regnum, |
sim_rl78_bank2_r6_regnum, |
sim_rl78_bank2_r7_regnum, |
sim_rl78_bank3_r0_regnum, |
sim_rl78_bank3_r1_regnum, |
sim_rl78_bank3_r2_regnum, |
sim_rl78_bank3_r3_regnum, |
sim_rl78_bank3_r4_regnum, |
sim_rl78_bank3_r5_regnum, |
sim_rl78_bank3_r6_regnum, |
sim_rl78_bank3_r7_regnum, |
sim_rl78_psw_regnum, |
sim_rl78_es_regnum, |
sim_rl78_cs_regnum, |
sim_rl78_pc_regnum, |
sim_rl78_spl_regnum, |
sim_rl78_sph_regnum, |
sim_rl78_pmc_regnum, |
sim_rl78_mem_regnum, |
sim_rl78_num_regs |
}; |
#endif /* SIM_RL78_H */ |
/contrib/toolchain/binutils/include/gdb/sim-rx.h |
---|
0,0 → 1,56 |
/* sim-rx.h --- interface between RX simulator and GDB. |
Copyright 2008-2013 Free Software Foundation, Inc. |
Contributed by Red Hat. |
This file is part of GDB. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
#if !defined (SIM_RX_H) |
#define SIM_RX_H |
enum sim_rx_regnum |
{ |
sim_rx_r0_regnum, |
sim_rx_r1_regnum, |
sim_rx_r2_regnum, |
sim_rx_r3_regnum, |
sim_rx_r4_regnum, |
sim_rx_r5_regnum, |
sim_rx_r6_regnum, |
sim_rx_r7_regnum, |
sim_rx_r8_regnum, |
sim_rx_r9_regnum, |
sim_rx_r10_regnum, |
sim_rx_r11_regnum, |
sim_rx_r12_regnum, |
sim_rx_r13_regnum, |
sim_rx_r14_regnum, |
sim_rx_r15_regnum, |
sim_rx_usp_regnum, |
sim_rx_isp_regnum, |
sim_rx_ps_regnum, |
sim_rx_pc_regnum, |
sim_rx_intb_regnum, |
sim_rx_bpsw_regnum, |
sim_rx_bpc_regnum, |
sim_rx_fintv_regnum, |
sim_rx_fpsw_regnum, |
sim_rx_acc_regnum, |
sim_rx_num_regs |
}; |
#endif /* SIM_RX_H */ |
/contrib/toolchain/binutils/include/gdb/sim-sh.h |
---|
0,0 → 1,169 |
/* This file defines the interface between the sh simulator and gdb. |
Copyright (C) 2000-2013 Free Software Foundation, Inc. |
This file is part of GDB. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
#if !defined (SIM_SH_H) |
#define SIM_SH_H |
#ifdef __cplusplus |
extern "C" { // } |
#endif |
/* The simulator makes use of the following register information. */ |
enum |
{ |
SIM_SH_R0_REGNUM = 0, |
SIM_SH_R1_REGNUM, |
SIM_SH_R2_REGNUM, |
SIM_SH_R3_REGNUM, |
SIM_SH_R4_REGNUM, |
SIM_SH_R5_REGNUM, |
SIM_SH_R6_REGNUM, |
SIM_SH_R7_REGNUM, |
SIM_SH_R8_REGNUM, |
SIM_SH_R9_REGNUM, |
SIM_SH_R10_REGNUM, |
SIM_SH_R11_REGNUM, |
SIM_SH_R12_REGNUM, |
SIM_SH_R13_REGNUM, |
SIM_SH_R14_REGNUM, |
SIM_SH_R15_REGNUM, |
SIM_SH_PC_REGNUM, |
SIM_SH_PR_REGNUM, |
SIM_SH_GBR_REGNUM, |
SIM_SH_VBR_REGNUM, |
SIM_SH_MACH_REGNUM, |
SIM_SH_MACL_REGNUM, |
SIM_SH_SR_REGNUM, |
SIM_SH_FPUL_REGNUM, |
SIM_SH_FPSCR_REGNUM, |
SIM_SH_FR0_REGNUM, /* FRn registers: sh3e / sh4 */ |
SIM_SH_FR1_REGNUM, |
SIM_SH_FR2_REGNUM, |
SIM_SH_FR3_REGNUM, |
SIM_SH_FR4_REGNUM, |
SIM_SH_FR5_REGNUM, |
SIM_SH_FR6_REGNUM, |
SIM_SH_FR7_REGNUM, |
SIM_SH_FR8_REGNUM, |
SIM_SH_FR9_REGNUM, |
SIM_SH_FR10_REGNUM, |
SIM_SH_FR11_REGNUM, |
SIM_SH_FR12_REGNUM, |
SIM_SH_FR13_REGNUM, |
SIM_SH_FR14_REGNUM, |
SIM_SH_FR15_REGNUM, |
SIM_SH_SSR_REGNUM, /* sh3{,e,-dsp}, sh4 */ |
SIM_SH_SPC_REGNUM, /* sh3{,e,-dsp}, sh4 */ |
SIM_SH_R0_BANK0_REGNUM, /* SIM_SH_Rn_BANKm_REGNUM: sh3[e] / sh4 */ |
SIM_SH_R1_BANK0_REGNUM, |
SIM_SH_R2_BANK0_REGNUM, |
SIM_SH_R3_BANK0_REGNUM, |
SIM_SH_R4_BANK0_REGNUM, |
SIM_SH_R5_BANK0_REGNUM, |
SIM_SH_R6_BANK0_REGNUM, |
SIM_SH_R7_BANK0_REGNUM, |
SIM_SH_R0_BANK1_REGNUM, |
SIM_SH_R1_BANK1_REGNUM, |
SIM_SH_R2_BANK1_REGNUM, |
SIM_SH_R3_BANK1_REGNUM, |
SIM_SH_R4_BANK1_REGNUM, |
SIM_SH_R5_BANK1_REGNUM, |
SIM_SH_R6_BANK1_REGNUM, |
SIM_SH_R7_BANK1_REGNUM, |
SIM_SH_XF0_REGNUM, |
SIM_SH_XF1_REGNUM, |
SIM_SH_XF2_REGNUM, |
SIM_SH_XF3_REGNUM, |
SIM_SH_XF4_REGNUM, |
SIM_SH_XF5_REGNUM, |
SIM_SH_XF6_REGNUM, |
SIM_SH_XF7_REGNUM, |
SIM_SH_XF8_REGNUM, |
SIM_SH_XF9_REGNUM, |
SIM_SH_XF10_REGNUM, |
SIM_SH_XF11_REGNUM, |
SIM_SH_XF12_REGNUM, |
SIM_SH_XF13_REGNUM, |
SIM_SH_XF14_REGNUM, |
SIM_SH_XF15_REGNUM, |
SIM_SH_SGR_REGNUM, |
SIM_SH_DBR_REGNUM, |
SIM_SH4_NUM_REGS, /* 77 */ |
/* sh[3]-dsp */ |
SIM_SH_DSR_REGNUM, |
SIM_SH_A0G_REGNUM, |
SIM_SH_A0_REGNUM, |
SIM_SH_A1G_REGNUM, |
SIM_SH_A1_REGNUM, |
SIM_SH_M0_REGNUM, |
SIM_SH_M1_REGNUM, |
SIM_SH_X0_REGNUM, |
SIM_SH_X1_REGNUM, |
SIM_SH_Y0_REGNUM, |
SIM_SH_Y1_REGNUM, |
SIM_SH_MOD_REGNUM, |
SIM_SH_RS_REGNUM, |
SIM_SH_RE_REGNUM, |
SIM_SH_R0_BANK_REGNUM, |
SIM_SH_R1_BANK_REGNUM, |
SIM_SH_R2_BANK_REGNUM, |
SIM_SH_R3_BANK_REGNUM, |
SIM_SH_R4_BANK_REGNUM, |
SIM_SH_R5_BANK_REGNUM, |
SIM_SH_R6_BANK_REGNUM, |
SIM_SH_R7_BANK_REGNUM, |
/* 109..127: room for expansion. */ |
SIM_SH_TBR_REGNUM, |
SIM_SH_IBNR_REGNUM, |
SIM_SH_IBCR_REGNUM, |
SIM_SH_BANK_REGNUM, |
SIM_SH_BANK_MACL_REGNUM, |
SIM_SH_BANK_GBR_REGNUM, |
SIM_SH_BANK_PR_REGNUM, |
SIM_SH_BANK_IVN_REGNUM, |
SIM_SH_BANK_MACH_REGNUM |
}; |
enum |
{ |
SIM_SH64_R0_REGNUM = 0, |
SIM_SH64_SP_REGNUM = 15, |
SIM_SH64_PC_REGNUM = 64, |
SIM_SH64_SR_REGNUM = 65, |
SIM_SH64_SSR_REGNUM = 66, |
SIM_SH64_SPC_REGNUM = 67, |
SIM_SH64_TR0_REGNUM = 68, |
SIM_SH64_FPCSR_REGNUM = 76, |
SIM_SH64_FR0_REGNUM = 77 |
}; |
enum |
{ |
SIM_SH64_NR_REGS = 141, /* total number of architectural registers */ |
SIM_SH64_NR_R_REGS = 64, /* number of general registers */ |
SIM_SH64_NR_TR_REGS = 8, /* number of target registers */ |
SIM_SH64_NR_FP_REGS = 64 /* number of floating point registers */ |
}; |
#ifdef __cplusplus |
} |
#endif |
#endif |
/contrib/toolchain/binutils/include/gdbm.h |
---|
0,0 → 1,91 |
/* GNU DBM - DataBase Manager include file |
Copyright 1989, 1991 Free Software Foundation, Inc. |
Written by Philip A. Nelson. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
/* You may contact the author by: |
e-mail: phil@wwu.edu |
us-mail: Philip A. Nelson |
Computer Science Department |
Western Washington University |
Bellingham, WA 98226 |
phone: (206) 676-3035 |
*************************************************************************/ |
/* Parameters to gdbm_open for READERS, WRITERS, and WRITERS who |
can create the database. */ |
#define GDBM_READER 0 |
#define GDBM_WRITER 1 |
#define GDBM_WRCREAT 2 |
#define GDBM_NEWDB 3 |
/* Parameters to gdbm_store for simple insertion or replacement. */ |
#define GDBM_INSERT 0 |
#define GDBM_REPLACE 1 |
/* The data and key structure. This structure is defined for compatibility. */ |
typedef struct { |
char *dptr; |
int dsize; |
} datum; |
/* The file information header. This is good enough for most applications. */ |
typedef struct {int dummy[10];} *GDBM_FILE; |
/* These are the routines! */ |
extern GDBM_FILE gdbm_open (); |
extern void gdbm_close (); |
extern datum gdbm_fetch (); |
extern int gdbm_store (); |
extern int gdbm_delete (); |
extern datum gdbm_firstkey (); |
extern datum gdbm_nextkey (); |
extern int gdbm_reorganize (); |
/* gdbm sends back the following error codes in the variable gdbm_errno. */ |
typedef enum { NO_ERROR, |
MALLOC_ERROR, |
BLOCK_SIZE_ERROR, |
FILE_OPEN_ERROR, |
FILE_WRITE_ERROR, |
FILE_SEEK_ERROR, |
FILE_READ_ERROR, |
BAD_MAGIC_NUMBER, |
EMPTY_DATABASE, |
CANT_BE_READER, |
CANT_BE_WRITER, |
READER_CANT_RECOVER, |
READER_CANT_DELETE, |
READER_CANT_STORE, |
READER_CANT_REORGANIZE, |
UNKNOWN_UPDATE, |
ITEM_NOT_FOUND, |
REORGANIZE_FAILED, |
CANNOT_REPLACE} |
gdbm_error; |
/contrib/toolchain/binutils/include/getopt.h |
---|
0,0 → 1,144 |
/* Declarations for getopt. |
Copyright 1989, 1990, 1991, 1992, 1993, 1994, 1996, 1997, 1998, 2000, |
2002 Free Software Foundation, Inc. |
NOTE: The canonical source of this file is maintained with the GNU C Library. |
Bugs can be reported to bug-glibc@gnu.org. |
This program is free software; you can redistribute it and/or modify it |
under the terms of the GNU General Public License as published by the |
Free Software Foundation; either version 2, or (at your option) any |
later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, |
USA. */ |
#ifndef _GETOPT_H |
#define _GETOPT_H 1 |
#ifdef __cplusplus |
extern "C" { |
#endif |
/* For communication from `getopt' to the caller. |
When `getopt' finds an option that takes an argument, |
the argument value is returned here. |
Also, when `ordering' is RETURN_IN_ORDER, |
each non-option ARGV-element is returned here. */ |
extern char *optarg; |
/* Index in ARGV of the next element to be scanned. |
This is used for communication to and from the caller |
and for communication between successive calls to `getopt'. |
On entry to `getopt', zero means this is the first call; initialize. |
When `getopt' returns -1, this is the index of the first of the |
non-option elements that the caller should itself scan. |
Otherwise, `optind' communicates from one call to the next |
how much of ARGV has been scanned so far. */ |
extern int optind; |
/* Callers store zero here to inhibit the error message `getopt' prints |
for unrecognized options. */ |
extern int opterr; |
/* Set to an option character which was unrecognized. */ |
extern int optopt; |
/* Describe the long-named options requested by the application. |
The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector |
of `struct option' terminated by an element containing a name which is |
zero. |
The field `has_arg' is: |
no_argument (or 0) if the option does not take an argument, |
required_argument (or 1) if the option requires an argument, |
optional_argument (or 2) if the option takes an optional argument. |
If the field `flag' is not NULL, it points to a variable that is set |
to the value given in the field `val' when the option is found, but |
left unchanged if the option is not found. |
To have a long-named option do something other than set an `int' to |
a compiled-in constant, such as set a value from `optarg', set the |
option's `flag' field to zero and its `val' field to a nonzero |
value (the equivalent single-letter option character, if there is |
one). For long options that have a zero `flag' field, `getopt' |
returns the contents of the `val' field. */ |
struct option |
{ |
#if defined (__STDC__) && __STDC__ |
const char *name; |
#else |
char *name; |
#endif |
/* has_arg can't be an enum because some compilers complain about |
type mismatches in all the code that assumes it is an int. */ |
int has_arg; |
int *flag; |
int val; |
}; |
/* Names for the values of the `has_arg' field of `struct option'. */ |
#define no_argument 0 |
#define required_argument 1 |
#define optional_argument 2 |
#if defined (__STDC__) && __STDC__ |
/* HAVE_DECL_* is a three-state macro: undefined, 0 or 1. If it is |
undefined, we haven't run the autoconf check so provide the |
declaration without arguments. If it is 0, we checked and failed |
to find the declaration so provide a fully prototyped one. If it |
is 1, we found it so don't provide any declaration at all. */ |
#if !HAVE_DECL_GETOPT |
#if defined (__GNU_LIBRARY__) || defined (HAVE_DECL_GETOPT) |
/* Many other libraries have conflicting prototypes for getopt, with |
differences in the consts, in unistd.h. To avoid compilation |
errors, only prototype getopt for the GNU C library. */ |
extern int getopt (int argc, char *const *argv, const char *shortopts); |
#else |
#ifndef __cplusplus |
extern int getopt (); |
#endif /* __cplusplus */ |
#endif |
#endif /* !HAVE_DECL_GETOPT */ |
extern int getopt_long (int argc, char *const *argv, const char *shortopts, |
const struct option *longopts, int *longind); |
extern int getopt_long_only (int argc, char *const *argv, |
const char *shortopts, |
const struct option *longopts, int *longind); |
/* Internal only. Users should not call this directly. */ |
extern int _getopt_internal (int argc, char *const *argv, |
const char *shortopts, |
const struct option *longopts, int *longind, |
int long_only); |
#else /* not __STDC__ */ |
extern int getopt (); |
extern int getopt_long (); |
extern int getopt_long_only (); |
extern int _getopt_internal (); |
#endif /* __STDC__ */ |
#ifdef __cplusplus |
} |
#endif |
#endif /* getopt.h */ |
/contrib/toolchain/binutils/include/hashtab.h |
---|
0,0 → 1,209 |
/* An expandable hash tables datatype. |
Copyright (C) 1999, 2000, 2002, 2003, 2004, 2005, 2009, 2010 |
Free Software Foundation, Inc. |
Contributed by Vladimir Makarov (vmakarov@cygnus.com). |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
/* This package implements basic hash table functionality. It is possible |
to search for an entry, create an entry and destroy an entry. |
Elements in the table are generic pointers. |
The size of the table is not fixed; if the occupancy of the table |
grows too high the hash table will be expanded. |
The abstract data implementation is based on generalized Algorithm D |
from Knuth's book "The art of computer programming". Hash table is |
expanded by creation of new hash table and transferring elements from |
the old table to the new table. */ |
#ifndef __HASHTAB_H__ |
#define __HASHTAB_H__ |
#ifdef __cplusplus |
extern "C" { |
#endif /* __cplusplus */ |
#include "ansidecl.h" |
#ifndef GTY |
#define GTY(X) |
#endif |
/* The type for a hash code. */ |
typedef unsigned int hashval_t; |
/* Callback function pointer types. */ |
/* Calculate hash of a table entry. */ |
typedef hashval_t (*htab_hash) (const void *); |
/* Compare a table entry with a possible entry. The entry already in |
the table always comes first, so the second element can be of a |
different type (but in this case htab_find and htab_find_slot |
cannot be used; instead the variants that accept a hash value |
must be used). */ |
typedef int (*htab_eq) (const void *, const void *); |
/* Cleanup function called whenever a live element is removed from |
the hash table. */ |
typedef void (*htab_del) (void *); |
/* Function called by htab_traverse for each live element. The first |
arg is the slot of the element (which can be passed to htab_clear_slot |
if desired), the second arg is the auxiliary pointer handed to |
htab_traverse. Return 1 to continue scan, 0 to stop. */ |
typedef int (*htab_trav) (void **, void *); |
/* Memory-allocation function, with the same functionality as calloc(). |
Iff it returns NULL, the hash table implementation will pass an error |
code back to the user, so if your code doesn't handle errors, |
best if you use xcalloc instead. */ |
typedef void *(*htab_alloc) (size_t, size_t); |
/* We also need a free() routine. */ |
typedef void (*htab_free) (void *); |
/* Memory allocation and deallocation; variants which take an extra |
argument. */ |
typedef void *(*htab_alloc_with_arg) (void *, size_t, size_t); |
typedef void (*htab_free_with_arg) (void *, void *); |
/* This macro defines reserved value for empty table entry. */ |
#define HTAB_EMPTY_ENTRY ((PTR) 0) |
/* This macro defines reserved value for table entry which contained |
a deleted element. */ |
#define HTAB_DELETED_ENTRY ((PTR) 1) |
/* Hash tables are of the following type. The structure |
(implementation) of this type is not needed for using the hash |
tables. All work with hash table should be executed only through |
functions mentioned below. The size of this structure is subject to |
change. */ |
struct GTY(()) htab { |
/* Pointer to hash function. */ |
htab_hash hash_f; |
/* Pointer to comparison function. */ |
htab_eq eq_f; |
/* Pointer to cleanup function. */ |
htab_del del_f; |
/* Table itself. */ |
void ** GTY ((use_param, length ("%h.size"))) entries; |
/* Current size (in entries) of the hash table. */ |
size_t size; |
/* Current number of elements including also deleted elements. */ |
size_t n_elements; |
/* Current number of deleted elements in the table. */ |
size_t n_deleted; |
/* The following member is used for debugging. Its value is number |
of all calls of `htab_find_slot' for the hash table. */ |
unsigned int searches; |
/* The following member is used for debugging. Its value is number |
of collisions fixed for time of work with the hash table. */ |
unsigned int collisions; |
/* Pointers to allocate/free functions. */ |
htab_alloc alloc_f; |
htab_free free_f; |
/* Alternate allocate/free functions, which take an extra argument. */ |
void * GTY((skip)) alloc_arg; |
htab_alloc_with_arg alloc_with_arg_f; |
htab_free_with_arg free_with_arg_f; |
/* Current size (in entries) of the hash table, as an index into the |
table of primes. */ |
unsigned int size_prime_index; |
}; |
typedef struct htab *htab_t; |
/* An enum saying whether we insert into the hash table or not. */ |
enum insert_option {NO_INSERT, INSERT}; |
/* The prototypes of the package functions. */ |
extern htab_t htab_create_alloc (size_t, htab_hash, |
htab_eq, htab_del, |
htab_alloc, htab_free); |
extern htab_t htab_create_alloc_ex (size_t, htab_hash, |
htab_eq, htab_del, |
void *, htab_alloc_with_arg, |
htab_free_with_arg); |
extern htab_t htab_create_typed_alloc (size_t, htab_hash, htab_eq, htab_del, |
htab_alloc, htab_alloc, htab_free); |
/* Backward-compatibility functions. */ |
extern htab_t htab_create (size_t, htab_hash, htab_eq, htab_del); |
extern htab_t htab_try_create (size_t, htab_hash, htab_eq, htab_del); |
extern void htab_set_functions_ex (htab_t, htab_hash, |
htab_eq, htab_del, |
void *, htab_alloc_with_arg, |
htab_free_with_arg); |
extern void htab_delete (htab_t); |
extern void htab_empty (htab_t); |
extern void * htab_find (htab_t, const void *); |
extern void ** htab_find_slot (htab_t, const void *, enum insert_option); |
extern void * htab_find_with_hash (htab_t, const void *, hashval_t); |
extern void ** htab_find_slot_with_hash (htab_t, const void *, |
hashval_t, enum insert_option); |
extern void htab_clear_slot (htab_t, void **); |
extern void htab_remove_elt (htab_t, void *); |
extern void htab_remove_elt_with_hash (htab_t, void *, hashval_t); |
extern void htab_traverse (htab_t, htab_trav, void *); |
extern void htab_traverse_noresize (htab_t, htab_trav, void *); |
extern size_t htab_size (htab_t); |
extern size_t htab_elements (htab_t); |
extern double htab_collisions (htab_t); |
/* A hash function for pointers. */ |
extern htab_hash htab_hash_pointer; |
/* An equality function for pointers. */ |
extern htab_eq htab_eq_pointer; |
/* A hash function for null-terminated strings. */ |
extern hashval_t htab_hash_string (const void *); |
/* An iterative hash function for arbitrary data. */ |
extern hashval_t iterative_hash (const void *, size_t, hashval_t); |
/* Shorthand for hashing something with an intrinsic size. */ |
#define iterative_hash_object(OB,INIT) iterative_hash (&OB, sizeof (OB), INIT) |
#ifdef __cplusplus |
} |
#endif /* __cplusplus */ |
#endif /* __HASHTAB_H */ |
/contrib/toolchain/binutils/include/hp-symtab.h |
---|
0,0 → 1,1867 |
/* Definitions and structures for reading debug symbols from the |
native HP C compiler. |
Written by the Center for Software Science at the University of Utah |
and by Cygnus Support. |
Copyright 1994, 1995, 1998, 1999, 2003 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef HP_SYMTAB_INCLUDED |
#define HP_SYMTAB_INCLUDED |
/* General information: |
This header file defines and describes only the data structures |
necessary to read debug symbols produced by the HP C compiler, |
HP ANSI C++ compiler, and HP FORTRAN 90 compiler using the |
SOM object file format. |
(For a full description of the debug format, ftp hpux-symtab.h from |
jaguar.cs.utah.edu:/dist). |
Additional notes (Rich Title) |
This file is a reverse-engineered version of a file called |
"symtab.h" which exists internal to HP's Computer Languages Organization |
in /CLO/Components/DDE/obj/som/symtab.h. Because HP's version of |
the file is copyrighted and not distributed, it is necessary for |
GDB to use the reverse-engineered version that follows. |
Work was done by Cygnus to reverse-engineer the C subset of symtab.h. |
The WDB project has extended this to also contain the C++ |
symbol definitions, the F90 symbol definitions, |
and the DOC (debugging-optimized-code) symbol definitions. |
In some cases (the C++ symbol definitions) |
I have added internal documentation here that |
goes beyond what is supplied in HP's symtab.h. If we someday |
unify these files again, the extra comments should be merged back |
into HP's symtab.h. |
------------------------------------------------------------------- |
Debug symbols are contained entirely within an unloadable space called |
$DEBUG$. $DEBUG$ contains several subspaces which group related |
debug symbols. |
$GNTT$ contains information for global variables, types and contants. |
$LNTT$ contains information for procedures (including nesting), scoping |
information, local variables, types, and constants. |
$SLT$ contains source line information so that code addresses may be |
mapped to source lines. |
$VT$ contains various strings and constants for named objects (variables, |
typedefs, functions, etc). Strings are stored as null-terminated character |
lists. Constants always begin on word boundaries. The first byte of |
the VT must be zero (a null string). |
$XT$ is not currently used by GDB. |
Many structures within the subspaces point to other structures within |
the same subspace, or to structures within a different subspace. These |
pointers are represented as a structure index from the beginning of |
the appropriate subspace. */ |
/* Used to describe where a constant is stored. */ |
enum location_type |
{ |
LOCATION_IMMEDIATE, |
LOCATION_PTR, |
LOCATION_VT, |
}; |
/* Languages supported by this debug format. Within the data structures |
this type is limited to 4 bits for a maximum of 16 languages. */ |
enum hp_language |
{ |
HP_LANGUAGE_UNKNOWN, |
HP_LANGUAGE_C, |
HP_LANGUAGE_FORTRAN, |
HP_LANGUAGE_F77 = HP_LANGUAGE_FORTRAN, |
HP_LANGUAGE_PASCAL, |
HP_LANGUAGE_MODCAL, |
HP_LANGUAGE_COBOL, |
HP_LANGUAGE_BASIC, |
HP_LANGUAGE_ADA, |
HP_LANGUAGE_CPLUSPLUS, |
HP_LANGUAGE_DMPASCAL |
}; |
/* Basic data types available in this debug format. Within the data |
structures this type is limited to 5 bits for a maximum of 32 basic |
data types. */ |
enum hp_type |
{ |
HP_TYPE_UNDEFINED, /* 0 */ |
HP_TYPE_BOOLEAN, /* 1 */ |
HP_TYPE_CHAR, /* 2 */ |
HP_TYPE_INT, /* 3 */ |
HP_TYPE_UNSIGNED_INT, /* 4 */ |
HP_TYPE_REAL, /* 5 */ |
HP_TYPE_COMPLEX, /* 6 */ |
HP_TYPE_STRING200, /* 7 */ |
HP_TYPE_LONGSTRING200, /* 8 */ |
HP_TYPE_TEXT, /* 9 */ |
HP_TYPE_FLABEL, /* 10 */ |
HP_TYPE_FTN_STRING_SPEC, /* 11 */ |
HP_TYPE_MOD_STRING_SPEC, /* 12 */ |
HP_TYPE_PACKED_DECIMAL, /* 13 */ |
HP_TYPE_REAL_3000, /* 14 */ |
HP_TYPE_MOD_STRING_3000, /* 15 */ |
HP_TYPE_ANYPOINTER, /* 16 */ |
HP_TYPE_GLOBAL_ANYPOINTER, /* 17 */ |
HP_TYPE_LOCAL_ANYPOINTER, /* 18 */ |
HP_TYPE_COMPLEXS3000, /* 19 */ |
HP_TYPE_FTN_STRING_S300_COMPAT, /* 20 */ |
HP_TYPE_FTN_STRING_VAX_COMPAT, /* 21 */ |
HP_TYPE_BOOLEAN_S300_COMPAT, /* 22 */ |
HP_TYPE_BOOLEAN_VAX_COMPAT, /* 23 */ |
HP_TYPE_WIDE_CHAR, /* 24 */ |
HP_TYPE_LONG, /* 25 */ |
HP_TYPE_UNSIGNED_LONG, /* 26 */ |
HP_TYPE_DOUBLE, /* 27 */ |
HP_TYPE_TEMPLATE_ARG, /* 28 */ |
HP_TYPE_VOID /* 29 */ |
}; |
/* An immediate name and type table entry. |
extension and immediate will always be one. |
global will always be zero. |
hp_type is the basic type this entry describes. |
bitlength is the length in bits for the basic type. */ |
struct dnttp_immediate |
{ |
unsigned int extension: 1; |
unsigned int immediate: 1; |
unsigned int global: 1; |
unsigned int type: 5; |
unsigned int bitlength: 24; |
}; |
/* A nonimmediate name and type table entry. |
extension will always be one. |
immediate will always be zero. |
if global is zero, this entry points into the LNTT |
if global is one, this entry points into the GNTT |
index is the index within the GNTT or LNTT for this entry. */ |
struct dnttp_nonimmediate |
{ |
unsigned int extension: 1; |
unsigned int immediate: 1; |
unsigned int global: 1; |
unsigned int index: 29; |
}; |
/* A pointer to an entry in the GNTT and LNTT tables. It has two |
forms depending on the type being described. |
The immediate form is used for simple entries and is one |
word. |
The nonimmediate form is used for complex entries and contains |
an index into the LNTT or GNTT which describes the entire type. |
If a dnttpointer is -1, then it is a NIL entry. */ |
#define DNTTNIL (-1) |
typedef union dnttpointer |
{ |
struct dnttp_immediate dntti; |
struct dnttp_nonimmediate dnttp; |
int word; |
} dnttpointer; |
/* An index into the source line table. As with dnttpointers, a sltpointer |
of -1 indicates a NIL entry. */ |
#define SLTNIL (-1) |
typedef int sltpointer; |
/* Index into DOC (= "Debugging Optimized Code") line table. */ |
#define LTNIL (-1) |
typedef int ltpointer; |
/* Index into context table. */ |
#define CTXTNIL (-1) |
typedef int ctxtpointer; |
/* Unsigned byte offset into the VT. */ |
typedef unsigned int vtpointer; |
/* A DNTT entry (used within the GNTT and LNTT). |
DNTT entries are variable sized objects, but are always a multiple |
of 3 words (we call each group of 3 words a "block"). |
The first bit in each block is an extension bit. This bit is zero |
for the first block of a DNTT entry. If the entry requires more |
than one block, then this bit is set to one in all blocks after |
the first one. */ |
/* Each DNTT entry describes a particular debug symbol (beginning of |
a source file, a function, variables, structures, etc. |
The type of the DNTT entry is stored in the "kind" field within the |
DNTT entry itself. */ |
enum dntt_entry_type |
{ |
DNTT_TYPE_NIL = -1, |
DNTT_TYPE_SRCFILE, |
DNTT_TYPE_MODULE, |
DNTT_TYPE_FUNCTION, |
DNTT_TYPE_ENTRY, |
DNTT_TYPE_BEGIN, |
DNTT_TYPE_END, |
DNTT_TYPE_IMPORT, |
DNTT_TYPE_LABEL, |
DNTT_TYPE_FPARAM, |
DNTT_TYPE_SVAR, |
DNTT_TYPE_DVAR, |
DNTT_TYPE_HOLE1, |
DNTT_TYPE_CONST, |
DNTT_TYPE_TYPEDEF, |
DNTT_TYPE_TAGDEF, |
DNTT_TYPE_POINTER, |
DNTT_TYPE_ENUM, |
DNTT_TYPE_MEMENUM, |
DNTT_TYPE_SET, |
DNTT_TYPE_SUBRANGE, |
DNTT_TYPE_ARRAY, |
DNTT_TYPE_STRUCT, |
DNTT_TYPE_UNION, |
DNTT_TYPE_FIELD, |
DNTT_TYPE_VARIANT, |
DNTT_TYPE_FILE, |
DNTT_TYPE_FUNCTYPE, |
DNTT_TYPE_WITH, |
DNTT_TYPE_COMMON, |
DNTT_TYPE_COBSTRUCT, |
DNTT_TYPE_XREF, |
DNTT_TYPE_SA, |
DNTT_TYPE_MACRO, |
DNTT_TYPE_BLOCKDATA, |
DNTT_TYPE_CLASS_SCOPE, |
DNTT_TYPE_REFERENCE, |
DNTT_TYPE_PTRMEM, |
DNTT_TYPE_PTRMEMFUNC, |
DNTT_TYPE_CLASS, |
DNTT_TYPE_GENFIELD, |
DNTT_TYPE_VFUNC, |
DNTT_TYPE_MEMACCESS, |
DNTT_TYPE_INHERITANCE, |
DNTT_TYPE_FRIEND_CLASS, |
DNTT_TYPE_FRIEND_FUNC, |
DNTT_TYPE_MODIFIER, |
DNTT_TYPE_OBJECT_ID, |
DNTT_TYPE_MEMFUNC, |
DNTT_TYPE_TEMPLATE, |
DNTT_TYPE_TEMPLATE_ARG, |
DNTT_TYPE_FUNC_TEMPLATE, |
DNTT_TYPE_LINK, |
DNTT_TYPE_DYN_ARRAY_DESC, |
DNTT_TYPE_DESC_SUBRANGE, |
DNTT_TYPE_BEGIN_EXT, |
DNTT_TYPE_INLN, |
DNTT_TYPE_INLN_LIST, |
DNTT_TYPE_ALIAS, |
DNTT_TYPE_DOC_FUNCTION, |
DNTT_TYPE_DOC_MEMFUNC, |
DNTT_TYPE_MAX |
}; |
/* DNTT_TYPE_SRCFILE: |
One DNTT_TYPE_SRCFILE symbol is output for the start of each source |
file and at the begin and end of an included file. A DNTT_TYPE_SRCFILE |
entry is also output before each DNTT_TYPE_FUNC symbol so that debuggers |
can determine what file a function was defined in. |
LANGUAGE describes the source file's language. |
NAME points to an VT entry providing the source file's name. |
Note the name used for DNTT_TYPE_SRCFILE entries are exactly as seen |
by the compiler (ie they may be relative or absolute). C include files |
via <> inclusion must use absolute paths. |
ADDRESS points to an SLT entry from which line number and code locations |
may be determined. */ |
struct dntt_type_srcfile |
{ |
unsigned int extension: 1; |
unsigned int kind: 10; /* DNTT_TYPE_SRCFILE */ |
unsigned int language: 4; |
unsigned int unused: 17; |
vtpointer name; |
sltpointer address; |
}; |
/* DNTT_TYPE_MODULE: |
A DNTT_TYPE_MODULE symbol is emitted for the start of a pascal |
module or C source file. A module indicates a compilation unit |
for name-scoping purposes; in that regard there should be |
a 1-1 correspondence between GDB "symtab"'s and MODULE symbol records. |
Each DNTT_TYPE_MODULE must have an associated DNTT_TYPE_END symbol. |
NAME points to a VT entry providing the module's name. Note C |
source files are considered nameless modules. |
ALIAS point to a VT entry providing a secondary name. |
ADDRESS points to an SLT entry from which line number and code locations |
may be determined. */ |
struct dntt_type_module |
{ |
unsigned int extension: 1; |
unsigned int kind: 10; /* DNTT_TYPE_MODULE */ |
unsigned int unused: 21; |
vtpointer name; |
vtpointer alias; |
dnttpointer unused2; |
sltpointer address; |
}; |
/* DNTT_TYPE_FUNCTION, |
DNTT_TYPE_ENTRY, |
DNTT_TYPE_BLOCKDATA, |
DNTT_TYPE_MEMFUNC: |
A DNTT_TYPE_FUNCTION symbol is emitted for each function definition; |
a DNTT_TYPE_ENTRY symbols is used for secondary entry points. Both |
symbols used the dntt_type_function structure. |
A DNTT_TYPE_BLOCKDATA symbol is emitted ...? |
A DNTT_TYPE_MEMFUNC symbol is emitted for inlined member functions (C++). |
Each of DNTT_TYPE_FUNCTION must have a matching DNTT_TYPE_END. |
GLOBAL is nonzero if the function has global scope. |
LANGUAGE describes the function's source language. |
OPT_LEVEL describes the optimization level the function was compiled |
with. |
VARARGS is nonzero if the function uses varargs. |
NAME points to a VT entry providing the function's name. |
ALIAS points to a VT entry providing a secondary name for the function. |
FIRSTPARAM points to a LNTT entry which describes the parameter list. |
ADDRESS points to an SLT entry from which line number and code locations |
may be determined. |
ENTRYADDR is the memory address corresponding the function's entry point |
RETVAL points to a LNTT entry describing the function's return value. |
LOWADDR is the lowest memory address associated with this function. |
HIADDR is the highest memory address associated with this function. */ |
struct dntt_type_function |
{ |
unsigned int extension: 1; |
unsigned int kind: 10; /* DNTT_TYPE_FUNCTION, |
DNTT_TYPE_ENTRY, |
DNTT_TYPE_BLOCKDATA |
or DNTT_TYPE_MEMFUNC */ |
unsigned int global: 1; |
unsigned int language: 4; |
unsigned int nest_level: 5; |
unsigned int opt_level: 2; |
unsigned int varargs: 1; |
unsigned int lang_info: 4; |
unsigned int inlined: 1; |
unsigned int localalloc: 1; |
unsigned int expansion: 1; |
unsigned int unused: 1; |
vtpointer name; |
vtpointer alias; |
dnttpointer firstparam; |
sltpointer address; |
CORE_ADDR entryaddr; |
dnttpointer retval; |
CORE_ADDR lowaddr; |
CORE_ADDR hiaddr; |
}; |
/* DNTT_TYPE_BEGIN: |
A DNTT_TYPE_BEGIN symbol is emitted to begin a new nested scope. |
Every DNTT_TYPE_BEGIN symbol must have a matching DNTT_TYPE_END symbol. |
CLASSFLAG is nonzero if this is the beginning of a c++ class definition. |
ADDRESS points to an SLT entry from which line number and code locations |
may be determined. */ |
struct dntt_type_begin |
{ |
unsigned int extension: 1; |
unsigned int kind: 10; |
unsigned int classflag: 1; |
unsigned int unused: 20; |
sltpointer address; |
}; |
/* DNTT_TYPE_END: |
A DNTT_TYPE_END symbol is emitted when closing a scope started by |
a DNTT_TYPE_MODULE, DNTT_TYPE_FUNCTION, DNTT_TYPE_WITH, |
DNTT_TYPE_COMMON, DNTT_TYPE_BEGIN, and DNTT_TYPE_CLASS_SCOPE symbols. |
ENDKIND describes what type of scope the DNTT_TYPE_END is closing |
(one of the above 6 kinds). |
CLASSFLAG is nonzero if this is the end of a c++ class definition. |
ADDRESS points to an SLT entry from which line number and code locations |
may be determined. |
BEGINSCOPE points to the LNTT entry which opened the scope. */ |
struct dntt_type_end |
{ |
unsigned int extension: 1; |
unsigned int kind: 10; |
unsigned int endkind: 10; |
unsigned int classflag: 1; |
unsigned int unused: 10; |
sltpointer address; |
dnttpointer beginscope; |
}; |
/* DNTT_TYPE_IMPORT is unused by GDB. */ |
/* DNTT_TYPE_LABEL is unused by GDB. */ |
/* DNTT_TYPE_FPARAM: |
A DNTT_TYPE_FPARAM symbol is emitted for a function argument. When |
chained together the symbols represent an argument list for a function. |
REGPARAM is nonzero if this parameter was passed in a register. |
INDIRECT is nonzero if this parameter is a pointer to the parameter |
(pass by reference or pass by value for large items). |
LONGADDR is nonzero if the parameter is a 64bit pointer. |
NAME is a pointer into the VT for the parameter's name. |
LOCATION describes where the parameter is stored. Depending on the |
parameter type LOCATION could be a register number, or an offset |
from the stack pointer. |
TYPE points to a NTT entry describing the type of this parameter. |
NEXTPARAM points to the LNTT entry describing the next parameter. */ |
struct dntt_type_fparam |
{ |
unsigned int extension: 1; |
unsigned int kind: 10; |
unsigned int regparam: 1; |
unsigned int indirect: 1; |
unsigned int longaddr: 1; |
unsigned int copyparam: 1; |
unsigned int dflt: 1; |
unsigned int doc_ranges: 1; |
unsigned int misc_kind: 1; |
unsigned int unused: 14; |
vtpointer name; |
CORE_ADDR location; |
dnttpointer type; |
dnttpointer nextparam; |
int misc; |
}; |
/* DNTT_TYPE_SVAR: |
A DNTT_TYPE_SVAR is emitted to describe a variable in static storage. |
GLOBAL is nonzero if the variable has global scope. |
INDIRECT is nonzero if the variable is a pointer to an object. |
LONGADDR is nonzero if the variable is in long pointer space. |
STATICMEM is nonzero if the variable is a member of a class. |
A_UNION is nonzero if the variable is an anonymous union member. |
NAME is a pointer into the VT for the variable's name. |
LOCATION provides the memory address for the variable. |
TYPE is a pointer into either the GNTT or LNTT which describes |
the type of this variable. */ |
struct dntt_type_svar |
{ |
unsigned int extension: 1; |
unsigned int kind: 10; |
unsigned int global: 1; |
unsigned int indirect: 1; |
unsigned int longaddr: 1; |
unsigned int staticmem: 1; |
unsigned int a_union: 1; |
unsigned int unused1: 1; |
unsigned int thread_specific: 1; |
unsigned int unused2: 14; |
vtpointer name; |
CORE_ADDR location; |
dnttpointer type; |
unsigned int offset; |
unsigned int displacement; |
}; |
/* DNTT_TYPE_DVAR: |
A DNTT_TYPE_DVAR is emitted to describe automatic variables and variables |
held in registers. |
GLOBAL is nonzero if the variable has global scope. |
INDIRECT is nonzero if the variable is a pointer to an object. |
REGVAR is nonzero if the variable is in a register. |
A_UNION is nonzero if the variable is an anonymous union member. |
NAME is a pointer into the VT for the variable's name. |
LOCATION provides the memory address or register number for the variable. |
TYPE is a pointer into either the GNTT or LNTT which describes |
the type of this variable. */ |
struct dntt_type_dvar |
{ |
unsigned int extension: 1; |
unsigned int kind: 10; |
unsigned int global: 1; |
unsigned int indirect: 1; |
unsigned int regvar: 1; |
unsigned int a_union: 1; |
unsigned int unused: 17; |
vtpointer name; |
int location; |
dnttpointer type; |
unsigned int offset; |
}; |
/* DNTT_TYPE_CONST: |
A DNTT_TYPE_CONST symbol is emitted for program constants. |
GLOBAL is nonzero if the constant has global scope. |
INDIRECT is nonzero if the constant is a pointer to an object. |
LOCATION_TYPE describes where to find the constant's value |
(in the VT, memory, or embedded in an instruction). |
CLASSMEM is nonzero if the constant is a member of a class. |
NAME is a pointer into the VT for the constant's name. |
LOCATION provides the memory address, register number or pointer |
into the VT for the constant's value. |
TYPE is a pointer into either the GNTT or LNTT which describes |
the type of this variable. */ |
struct dntt_type_const |
{ |
unsigned int extension: 1; |
unsigned int kind: 10; |
unsigned int global: 1; |
unsigned int indirect: 1; |
unsigned int location_type: 3; |
unsigned int classmem: 1; |
unsigned int unused: 15; |
vtpointer name; |
CORE_ADDR location; |
dnttpointer type; |
unsigned int offset; |
unsigned int displacement; |
}; |
/* DNTT_TYPE_TYPEDEF and DNTT_TYPE_TAGDEF: |
The same structure is used to describe typedefs and tagdefs. |
DNTT_TYPE_TYPEDEFS are associated with C "typedefs". |
DNTT_TYPE_TAGDEFs are associated with C "struct", "union", and "enum" |
tags, which may have the same name as a typedef in the same scope. |
Also they are associated with C++ "class" tags, which implicitly have |
the same name as the class type. |
GLOBAL is nonzero if the typedef/tagdef has global scope. |
TYPEINFO is used to determine if full type information is available |
for a tag. (usually 1, but can be zero for opaque types in C). |
NAME is a pointer into the VT for the constant's name. |
TYPE points to the underlying type for the typedef/tagdef in the |
GNTT or LNTT. */ |
struct dntt_type_type |
{ |
unsigned int extension: 1; |
unsigned int kind: 10; /* DNTT_TYPE_TYPEDEF or |
DNTT_TYPE_TAGDEF. */ |
unsigned int global: 1; |
unsigned int typeinfo: 1; |
unsigned int unused: 19; |
vtpointer name; |
dnttpointer type; /* Underlying type, which for TAGDEF's may be |
DNTT_TYPE_STRUCT, DNTT_TYPE_UNION, |
DNTT_TYPE_ENUM, or DNTT_TYPE_CLASS. |
For TYPEDEF's other underlying types |
are also possible. */ |
}; |
/* DNTT_TYPE_POINTER: |
Used to describe a pointer to an underlying type. |
POINTSTO is a pointer into the GNTT or LNTT for the type which this |
pointer points to. |
BITLENGTH is the length of the pointer (not the underlying type). */ |
struct dntt_type_pointer |
{ |
unsigned int extension: 1; |
unsigned int kind: 10; |
unsigned int unused: 21; |
dnttpointer pointsto; |
unsigned int bitlength; |
}; |
/* DNTT_TYPE_ENUM: |
Used to describe enumerated types. |
FIRSTMEM is a pointer to a DNTT_TYPE_MEMENUM in the GNTT/LNTT which |
describes the first member (and contains a pointer to the chain of |
members). |
BITLENGTH is the number of bits used to hold the values of the enum's |
members. */ |
struct dntt_type_enum |
{ |
unsigned int extension: 1; |
unsigned int kind: 10; |
unsigned int unused: 21; |
dnttpointer firstmem; |
unsigned int bitlength; |
}; |
/* DNTT_TYPE_MEMENUM |
Used to describe members of an enumerated type. |
CLASSMEM is nonzero if this member is part of a class. |
NAME points into the VT for the name of this member. |
VALUE is the value of this enumeration member. |
NEXTMEM points to the next DNTT_TYPE_MEMENUM in the chain. */ |
struct dntt_type_memenum |
{ |
unsigned int extension: 1; |
unsigned int kind: 10; |
unsigned int classmem: 1; |
unsigned int unused: 20; |
vtpointer name; |
unsigned int value; |
dnttpointer nextmem; |
}; |
/* DNTT_TYPE_SET |
Used to describe PASCAL "set" type. |
DECLARATION describes the bitpacking of the set. |
SUBTYPE points to a DNTT entry describing the type of the members. |
BITLENGTH is the size of the set. */ |
struct dntt_type_set |
{ |
unsigned int extension: 1; |
unsigned int kind: 10; |
unsigned int declaration: 2; |
unsigned int unused: 19; |
dnttpointer subtype; |
unsigned int bitlength; |
}; |
/* DNTT_TYPE_SUBRANGE |
Used to describe subrange type. |
DYN_LOW describes the lower bound of the subrange: |
00 for a constant lower bound (found in LOWBOUND). |
01 for a dynamic lower bound with the lower bound found in the |
memory address pointed to by LOWBOUND. |
10 for a dynamic lower bound described by an variable found in the |
DNTT/LNTT (LOWBOUND would be a pointer into the DNTT/LNTT). |
DYN_HIGH is similar to DYN_LOW, except it describes the upper bound. |
SUBTYPE points to the type of the subrange. |
BITLENGTH is the length in bits needed to describe the subrange's |
values. */ |
struct dntt_type_subrange |
{ |
unsigned int extension: 1; |
unsigned int kind: 10; |
unsigned int dyn_low: 2; |
unsigned int dyn_high: 2; |
unsigned int unused: 17; |
int lowbound; |
int highbound; |
dnttpointer subtype; |
unsigned int bitlength; |
}; |
/* DNTT_TYPE_ARRAY |
Used to describe an array type. |
DECLARATION describes the bit packing used in the array. |
ARRAYISBYTES is nonzero if the field in arraylength describes the |
length in bytes rather than in bits. A value of zero is used to |
describe an array with size 2**32. |
ELEMISBYTES is nonzero if the length if each element in the array |
is describes in bytes rather than bits. A value of zero is used |
to an element with size 2**32. |
ELEMORDER is nonzero if the elements are indexed in increasing order. |
JUSTIFIED if the elements are left justified to index zero. |
ARRAYLENGTH is the length of the array. |
INDEXTYPE is a DNTT pointer to the type used to index the array. |
ELEMTYPE is a DNTT pointer to the type for the array elements. |
ELEMLENGTH is the length of each element in the array (including |
any padding). |
Multi-dimensional arrays are represented by ELEMTYPE pointing to |
another DNTT_TYPE_ARRAY. */ |
struct dntt_type_array |
{ |
unsigned int extension: 1; |
unsigned int kind: 10; |
unsigned int declaration: 2; |
unsigned int dyn_low: 2; |
unsigned int dyn_high: 2; |
unsigned int arrayisbytes: 1; |
unsigned int elemisbytes: 1; |
unsigned int elemorder: 1; |
unsigned int justified: 1; |
unsigned int unused: 11; |
unsigned int arraylength; |
dnttpointer indextype; |
dnttpointer elemtype; |
unsigned int elemlength; |
}; |
/* DNTT_TYPE_STRUCT |
DNTT_TYPE_STRUCT is used to describe a C structure. |
DECLARATION describes the bitpacking used. |
FIRSTFIELD is a DNTT pointer to the first field of the structure |
(each field contains a pointer to the next field, walk the list |
to access all fields of the structure). |
VARTAGFIELD and VARLIST are used for Pascal variant records. |
BITLENGTH is the size of the structure in bits. */ |
struct dntt_type_struct |
{ |
unsigned int extension: 1; |
unsigned int kind: 10; |
unsigned int declaration: 2; |
unsigned int unused: 19; |
dnttpointer firstfield; |
dnttpointer vartagfield; |
dnttpointer varlist; |
unsigned int bitlength; |
}; |
/* DNTT_TYPE_UNION |
DNTT_TYPE_UNION is used to describe a C union. |
FIRSTFIELD is a DNTT pointer to the beginning of the field chain. |
BITLENGTH is the size of the union in bits. */ |
struct dntt_type_union |
{ |
unsigned int extension: 1; |
unsigned int kind: 10; |
unsigned int unused: 21; |
dnttpointer firstfield; |
unsigned int bitlength; |
}; |
/* DNTT_TYPE_FIELD |
DNTT_TYPE_FIELD describes one field in a structure or union |
or C++ class. |
VISIBILITY is used to describe the visibility of the field |
(for c++. public = 0, protected = 1, private = 2). |
A_UNION is nonzero if this field is a member of an anonymous union. |
STATICMEM is nonzero if this field is a static member of a template. |
NAME is a pointer into the VT for the name of the field. |
BITOFFSET gives the offset of this field in bits from the beginning |
of the structure or union this field is a member of. |
TYPE is a DNTT pointer to the type describing this field. |
BITLENGTH is the size of the entry in bits. |
NEXTFIELD is a DNTT pointer to the next field in the chain. */ |
struct dntt_type_field |
{ |
unsigned int extension: 1; |
unsigned int kind: 10; |
unsigned int visibility: 2; |
unsigned int a_union: 1; |
unsigned int staticmem: 1; |
unsigned int unused: 17; |
vtpointer name; |
unsigned int bitoffset; |
dnttpointer type; |
unsigned int bitlength; |
dnttpointer nextfield; |
}; |
/* DNTT_TYPE_VARIANT is unused by GDB. */ |
/* DNTT_TYPE_FILE is unused by GDB. */ |
/* DNTT_TYPE_FUNCTYPE |
I think this is used to describe a function type (e.g., would |
be emitted as part of a function-pointer description). |
VARARGS is nonzero if this function uses varargs. |
FIRSTPARAM is a DNTT pointer to the first entry in the parameter |
chain. |
RETVAL is a DNTT pointer to the type of the return value. */ |
struct dntt_type_functype |
{ |
unsigned int extension: 1; |
unsigned int kind: 10; |
unsigned int varargs: 1; |
unsigned int info: 4; |
unsigned int unused: 16; |
unsigned int bitlength; |
dnttpointer firstparam; |
dnttpointer retval; |
}; |
/* DNTT_TYPE_WITH is emitted by C++ to indicate "with" scoping semantics. |
(Probably also emitted by PASCAL to support "with"...). |
C++ example: Say "memfunc" is a method of class "c", and say |
"m" is a data member of class "c". Then from within "memfunc", |
it is legal to reference "m" directly (e.g. you don't have to |
say "this->m". The symbol table indicates |
this by emitting a DNTT_TYPE_WITH symbol within the function "memfunc", |
pointing to the type symbol for class "c". |
In GDB, this symbol record is unnecessary, |
because GDB's symbol lookup algorithm |
infers the "with" semantics when it sees a "this" argument to the member |
function. So GDB can safely ignore the DNTT_TYPE_WITH record. |
A DNTT_TYPE_WITH has a matching DNTT_TYPE_END symbol. */ |
struct dntt_type_with |
{ |
unsigned int extension: 1; /* always zero */ |
unsigned int kind: 10; /* always DNTT_TYPE_WITH */ |
unsigned int addrtype: 2; /* 0 => STATTYPE */ |
/* 1 => DYNTYPE */ |
/* 2 => REGTYPE */ |
unsigned int indirect: 1; /* 1 => pointer to object */ |
unsigned int longaddr: 1; /* 1 => in long pointer space */ |
unsigned int nestlevel: 6; /* # of nesting levels back */ |
unsigned int doc_ranges: 1; /* 1 => location is range list */ |
unsigned int unused: 10; |
long location; /* where stored (allocated) */ |
sltpointer address; |
dnttpointer type; /* type of with expression */ |
vtpointer name; /* name of with expression */ |
unsigned long offset; /* byte offset from location */ |
}; |
/* DNTT_TYPE_COMMON is unsupported by GDB. */ |
/* A DNTT_TYPE_COMMON symbol must have a matching DNTT_TYPE_END symbol */ |
/* DNTT_TYPE_COBSTRUCT is unsupported by GDB. */ |
/* DNTT_TYPE_XREF is unsupported by GDB. */ |
/* DNTT_TYPE_SA is unsupported by GDB. */ |
/* DNTT_TYPE_MACRO is unsupported by GDB */ |
/* DNTT_TYPE_BLOCKDATA has the same structure as DNTT_TYPE_FUNCTION */ |
/* The following are the C++ specific SOM records */ |
/* The purpose of the DNTT_TYPE_CLASS_SCOPE is to bracket C++ methods |
and indicate the method name belongs in the "class scope" rather |
than in the module they are being defined in. For example: |
class c { |
... |
void memfunc(); // member function |
}; |
void c::memfunc() // definition of class c's "memfunc" |
{ |
... |
} |
main() |
{ |
... |
} |
In the above, the name "memfunc" is not directly visible from "main". |
I.e., you have to say "break c::memfunc". |
If it were a normal function (not a method), it would be visible |
via the simple "break memfunc". Since "memfunc" otherwise looks |
like a normal FUNCTION in the symbol table, the bracketing |
CLASS_SCOPE is what is used to indicate it is really a method. |
A DNTT_TYPE_CLASS_SCOPE symbol must have a matching DNTT_TYPE_END symbol. */ |
struct dntt_type_class_scope |
{ |
unsigned int extension: 1; /* Always zero. */ |
unsigned int kind: 10; /* Always DNTT_TYPE_CLASS_SCOPE. */ |
unsigned int unused: 21; |
sltpointer address ; /* Pointer to SLT entry. */ |
dnttpointer type ; /* Pointer to class type DNTT. */ |
}; |
/* C++ reference parameter. |
The structure of this record is the same as DNTT_TYPE_POINTER - |
refer to struct dntt_type_pointer. */ |
/* The next two describe C++ pointer-to-data-member type, and |
pointer-to-member-function type, respectively. |
DNTT_TYPE_PTRMEM and DNTT_TYPE_PTRMEMFUNC have the same structure. */ |
struct dntt_type_ptrmem |
{ |
unsigned int extension: 1; /* Always zero. */ |
unsigned int kind: 10; /* Always DNTT_TYPE_PTRMEM. */ |
unsigned int unused: 21; |
dnttpointer pointsto ; /* Pointer to class DNTT. */ |
dnttpointer memtype ; /* Type of member. */ |
}; |
struct dntt_type_ptrmemfunc |
{ |
unsigned int extension: 1; /* Always zero. */ |
unsigned int kind: 10; /* Always DNTT_TYPE_PTRMEMFUNC. */ |
unsigned int unused: 21; |
dnttpointer pointsto ; /* Pointer to class DNTT. */ |
dnttpointer memtype ; /* Type of member. */ |
}; |
/* The DNTT_TYPE_CLASS symbol is emitted to describe a class type. |
"memberlist" points to a chained list of FIELD or GENFIELD records |
indicating the class members. "parentlist" points to a chained list |
of INHERITANCE records indicating classes from which we inherit |
fields. */ |
struct dntt_type_class |
{ |
unsigned int extension: 1; /* Always zero. */ |
unsigned int kind: 10; /* Always DNTT_TYPE_CLASS. */ |
unsigned int abstract: 1; /* Is this an abstract class? */ |
unsigned int class_decl: 2; /* 0=class,1=union,2=struct. */ |
unsigned int expansion: 1; /* 1=template expansion. */ |
unsigned int unused: 17; |
dnttpointer memberlist ; /* Ptr to chain of [GEN]FIELDs. */ |
unsigned long vtbl_loc ; /* Offset in obj of ptr to vtbl. */ |
dnttpointer parentlist ; /* Ptr to K_INHERITANCE list. */ |
unsigned long bitlength ; /* Total at this level. */ |
dnttpointer identlist ; /* Ptr to chain of class ident's. */ |
dnttpointer friendlist ; /* Ptr to K_FRIEND list. */ |
dnttpointer templateptr ; /* Ptr to template. */ |
dnttpointer nextexp ; /* Ptr to next expansion. */ |
}; |
/* Class members are indicated via either the FIELD record (for |
data members, same as for C struct fields), or by the GENFIELD record |
(for member functions). */ |
struct dntt_type_genfield |
{ |
unsigned int extension: 1; /* Always zero. */ |
unsigned int kind: 10; /* Always DNTT_TYPE_GENFIELD. */ |
unsigned int visibility: 2; /* Pub = 0, prot = 1, priv = 2. */ |
unsigned int a_union: 1; /* 1 => anonymous union member. */ |
unsigned int unused: 18; |
dnttpointer field ; /* Pointer to field or qualifier. */ |
dnttpointer nextfield ; /* Pointer to next field. */ |
}; |
/* C++ virtual functions. */ |
struct dntt_type_vfunc |
{ |
unsigned int extension: 1; /* always zero */ |
unsigned int kind: 10; /* always DNTT_TYPE_VFUNC */ |
unsigned int pure: 1; /* pure virtual function ? */ |
unsigned int unused: 20; |
dnttpointer funcptr ; /* points to FUNCTION symbol */ |
unsigned long vtbl_offset ; /* offset into vtbl for virtual */ |
}; |
/* Not precisely sure what this is intended for - DDE ignores it. */ |
struct dntt_type_memaccess |
{ |
unsigned int extension: 1; /* always zero */ |
unsigned int kind: 10; /* always DNTT_TYPE_MEMACCESS */ |
unsigned int unused: 21; |
dnttpointer classptr ; /* pointer to base class */ |
dnttpointer field ; /* pointer field */ |
}; |
/* The DNTT_TYPE_INHERITANCE record describes derived classes. |
In particular, the "parentlist" field of the CLASS record points |
to a list of INHERITANCE records for classes from which we |
inherit members. */ |
struct dntt_type_inheritance |
{ |
unsigned int extension: 1; /* always zero */ |
unsigned int kind: 10; /* always DNTT_TYPE_INHERITANCE */ |
unsigned int Virtual: 1; /* virtual base class ? */ |
unsigned int visibility: 2; /* pub = 0, prot = 1, priv = 2 */ |
unsigned int unused: 18; |
dnttpointer classname ; /* first parent class, if any */ |
unsigned long offset ; /* offset to start of base class */ |
dnttpointer next ; /* pointer to next K_INHERITANCE */ |
unsigned long future[2] ; /* padding to 3-word block end */ |
}; |
/* C++ "friend" classes ... */ |
struct dntt_type_friend_class |
{ |
unsigned int extension: 1; /* always zero */ |
unsigned int kind: 10; /* always DNTT_TYPE_FRIEND_CLASS */ |
unsigned int unused: 21; |
dnttpointer classptr ; /* pointer to class DNTT */ |
dnttpointer next ; /* next DNTT_FRIEND */ |
}; |
struct dntt_type_friend_func |
{ |
unsigned int extension: 1; /* always zero */ |
unsigned int kind: 10; /* always DNTT_TYPE_FRIEND_FUNC */ |
unsigned int unused: 21; |
dnttpointer funcptr ; /* pointer to function */ |
dnttpointer classptr ; /* pointer to class DNTT */ |
dnttpointer next ; /* next DNTT_FRIEND */ |
unsigned long future[2] ; /* padding to 3-word block end */ |
}; |
/* DDE appears to ignore the DNTT_TYPE_MODIFIER record. |
It could perhaps be used to give better "ptype" output in GDB; |
otherwise it is probably safe for GDB to ignore it also. */ |
struct dntt_type_modifier |
{ |
unsigned int extension: 1; /* always zero */ |
unsigned int kind: 10; /* always DNTT_TYPE_MODIFIER */ |
unsigned int m_const: 1; /* const */ |
unsigned int m_static: 1; /* static */ |
unsigned int m_void: 1; /* void */ |
unsigned int m_volatile: 1; /* volatile */ |
unsigned int m_duplicate: 1; /* duplicate */ |
unsigned int unused: 16; |
dnttpointer type ; /* subtype */ |
unsigned long future ; /* padding to 3-word block end */ |
}; |
/* I'm not sure what this was intended for - DDE ignores it. */ |
struct dntt_type_object_id |
{ |
unsigned int extension: 1; /* always zero */ |
unsigned int kind: 10; /* always DNTT_TYPE_OBJECT_ID */ |
unsigned int indirect: 1; /* Is object_ident addr of addr? */ |
unsigned int unused: 20; |
unsigned long object_ident ; /* object identifier */ |
unsigned long offset ; /* offset to start of base class */ |
dnttpointer next ; /* pointer to next K_OBJECT_ID */ |
unsigned long segoffset ; /* for linker fixup */ |
unsigned long future ; /* padding to 3-word block end */ |
}; |
/* No separate dntt_type_memfunc; same as dntt_type_func */ |
/* Symbol records to support templates. These only get used |
in DDE's "describe" output (like GDB's "ptype"). */ |
/* The TEMPLATE record is the header for a template-class. |
Like the CLASS record, a TEMPLATE record has a memberlist that |
points to a list of template members. It also has an arglist |
pointing to a list of TEMPLATE_ARG records. */ |
struct dntt_type_template |
{ |
unsigned int extension: 1; /* always zero */ |
unsigned int kind: 10; /* always DNTT_TYPE_TEMPLATE */ |
unsigned int abstract: 1; /* is this an abstract class? */ |
unsigned int class_decl: 2; /* 0=class,1=union,2=struct */ |
unsigned int unused: 18; |
dnttpointer memberlist ; /* ptr to chain of K_[GEN]FIELDs */ |
long unused2 ; /* offset in obj of ptr to vtbl */ |
dnttpointer parentlist ; /* ptr to K_INHERITANCE list */ |
unsigned long bitlength ; /* total at this level */ |
dnttpointer identlist ; /* ptr to chain of class ident's */ |
dnttpointer friendlist ; /* ptr to K_FRIEND list */ |
dnttpointer arglist ; /* ptr to argument list */ |
dnttpointer expansions ; /* ptr to expansion list */ |
}; |
/* Template-class arguments are a list of TEMPL_ARG records |
chained together. The "name" field is the name of the formal. |
E.g.: |
template <class T> class q { ... }; |
Then "T" is the name of the formal argument. */ |
struct dntt_type_templ_arg |
{ |
unsigned int extension: 1; /* always zero */ |
unsigned int kind: 10; /* always DNTT_TYPE_TEMPL_ARG */ |
unsigned int usagetype: 1; /* 0 type-name 1 expression */ |
unsigned int unused: 20; |
vtpointer name ; /* name of argument */ |
dnttpointer type ; /* for non type arguments */ |
dnttpointer nextarg ; /* Next argument if any */ |
long future[2] ; /* padding to 3-word block end */ |
}; |
/* FUNC_TEMPLATE records are sort of like FUNCTION, but are emitted |
for template member functions. E.g., |
template <class T> class q |
{ |
... |
void f(); |
... |
}; |
Within the list of FIELDs/GENFIELDs defining the member list |
of the template "q", "f" would appear as a FUNC_TEMPLATE. |
We'll also see instances of FUNCTION "f" records for each |
instantiation of the template. */ |
struct dntt_type_func_template |
{ |
unsigned int extension: 1; /* always zero */ |
unsigned int kind: 10; /* always DNTT_TYPE_FUNC_TEMPLATE */ |
unsigned int public: 1; /* 1 => globally visible */ |
unsigned int language: 4; /* type of language */ |
unsigned int level: 5; /* nesting level (top level = 0)*/ |
unsigned int optimize: 2; /* level of optimization */ |
unsigned int varargs: 1; /* ellipses. Pascal/800 later */ |
unsigned int info: 4; /* lang-specific stuff; F_xxxx */ |
unsigned int inlined: 1; |
unsigned int localloc: 1; /* 0 at top, 1 at end of block */ |
unsigned int unused: 2; |
vtpointer name ; /* name of function */ |
vtpointer alias ; /* alternate name, if any */ |
dnttpointer firstparam ; /* first FPARAM, if any */ |
dnttpointer retval ; /* return type, if any */ |
dnttpointer arglist ; /* ptr to argument list */ |
}; |
/* LINK is apparently intended to link together function template |
definitions with their instantiations. However, it is not clear |
why this would be needed, except to provide the information on |
a "ptype" command. And as far as I can tell, aCC does not |
generate this record. */ |
struct dntt_type_link |
{ |
unsigned int extension: 1; /* always zero */ |
unsigned int kind: 10; /* always DNTT_TYPE_LINK */ |
unsigned int linkKind: 4; /* always LINK_UNKNOWN */ |
unsigned int unused: 17; |
long future1 ; /* expansion */ |
dnttpointer ptr1 ; /* link from template */ |
dnttpointer ptr2 ; /* to expansion */ |
long future[2] ; /* padding to 3-word block end */ |
}; |
/* end of C++ specific SOM's. */ |
/* DNTT_TYPE_DYN_ARRAY_DESC is unused by GDB */ |
/* DNTT_TYPE_DESC_SUBRANGE is unused by GDB */ |
/* DNTT_TYPE_BEGIN_EXT is unused by GDB */ |
/* DNTT_TYPE_INLN is unused by GDB */ |
/* DNTT_TYPE_INLN_LIST is unused by GDB */ |
/* DNTT_TYPE_ALIAS is unused by GDB */ |
struct dntt_type_doc_function |
{ |
unsigned int extension: 1; /* always zero */ |
unsigned int kind: 10; /* K_DOC_FUNCTION or */ |
/* K_DOC_MEMFUNC */ |
unsigned int global: 1; /* 1 => globally visible */ |
unsigned int language: 4; /* type of language */ |
unsigned int level: 5; /* nesting level (top level = 0)*/ |
unsigned int optimize: 2; /* level of optimization */ |
unsigned int varargs: 1; /* ellipses. Pascal/800 later */ |
unsigned int info: 4; /* lang-specific stuff; F_xxxx */ |
unsigned int inlined: 1; |
unsigned int localloc: 1; /* 0 at top, 1 at end of block */ |
unsigned int expansion: 1; /* 1 = function expansion */ |
unsigned int doc_clone: 1; |
vtpointer name; /* name of function */ |
vtpointer alias; /* alternate name, if any */ |
dnttpointer firstparam; /* first FPARAM, if any */ |
sltpointer address; /* code and text locations */ |
CORE_ADDR entryaddr; /* address of entry point */ |
dnttpointer retval; /* return type, if any */ |
CORE_ADDR lowaddr; /* lowest address of function */ |
CORE_ADDR hiaddr; /* highest address of function */ |
dnttpointer inline_list; /* pointer to first inline */ |
ltpointer lt_offset; /* start of frag/cp line table */ |
ctxtpointer ctxt_offset; /* start of context table for this routine */ |
}; |
/* DNTT_TYPE_DOC_MEMFUNC is unused by GDB */ |
/* DNTT_TYPE_GENERIC and DNTT_TYPE_BLOCK are convience structures |
so we can examine a DNTT entry in a generic fashion. */ |
struct dntt_type_generic |
{ |
unsigned int word[9]; |
}; |
struct dntt_type_block |
{ |
unsigned int extension: 1; |
unsigned int kind: 10; |
unsigned int unused: 21; |
unsigned int word[2]; |
}; |
/* One entry in a DNTT (either the LNTT or GNTT). |
This is a union of the above 60 or so structure definitions. */ |
union dnttentry |
{ |
struct dntt_type_srcfile dsfile; |
struct dntt_type_module dmodule; |
struct dntt_type_function dfunc; |
struct dntt_type_function dentry; |
struct dntt_type_begin dbegin; |
struct dntt_type_end dend; |
struct dntt_type_fparam dfparam; |
struct dntt_type_svar dsvar; |
struct dntt_type_dvar ddvar; |
struct dntt_type_const dconst; |
struct dntt_type_type dtype; |
struct dntt_type_type dtag; |
struct dntt_type_pointer dptr; |
struct dntt_type_enum denum; |
struct dntt_type_memenum dmember; |
struct dntt_type_set dset; |
struct dntt_type_subrange dsubr; |
struct dntt_type_array darray; |
struct dntt_type_struct dstruct; |
struct dntt_type_union dunion; |
struct dntt_type_field dfield; |
struct dntt_type_functype dfunctype; |
struct dntt_type_with dwith; |
struct dntt_type_function dblockdata; |
struct dntt_type_class_scope dclass_scope; |
struct dntt_type_pointer dreference; |
struct dntt_type_ptrmem dptrmem; |
struct dntt_type_ptrmemfunc dptrmemfunc; |
struct dntt_type_class dclass; |
struct dntt_type_genfield dgenfield; |
struct dntt_type_vfunc dvfunc; |
struct dntt_type_memaccess dmemaccess; |
struct dntt_type_inheritance dinheritance; |
struct dntt_type_friend_class dfriend_class; |
struct dntt_type_friend_func dfriend_func; |
struct dntt_type_modifier dmodifier; |
struct dntt_type_object_id dobject_id; |
struct dntt_type_template dtemplate; |
struct dntt_type_templ_arg dtempl_arg; |
struct dntt_type_func_template dfunc_template; |
struct dntt_type_link dlink; |
struct dntt_type_doc_function ddocfunc; |
struct dntt_type_generic dgeneric; |
struct dntt_type_block dblock; |
}; |
/* Source line entry types. */ |
enum slttype |
{ |
SLT_NORMAL, |
SLT_SRCFILE, |
SLT_MODULE, |
SLT_FUNCTION, |
SLT_ENTRY, |
SLT_BEGIN, |
SLT_END, |
SLT_WITH, |
SLT_EXIT, |
SLT_ASSIST, |
SLT_MARKER, |
SLT_CLASS_SCOPE, |
SLT_INLN, |
SLT_NORMAL_OFFSET, |
}; |
/* A normal source line entry. Simply provides a mapping of a source |
line number to a code address. |
SLTDESC will always be SLT_NORMAL or SLT_EXIT. */ |
struct slt_normal |
{ |
unsigned int sltdesc: 4; |
unsigned int line: 28; |
CORE_ADDR address; |
}; |
struct slt_normal_off |
{ |
unsigned int sltdesc: 4; |
unsigned int offset: 6; |
unsigned int line: 22; |
CORE_ADDR address; |
}; |
/* A special source line entry. Provides a mapping of a declaration |
to a line number. These entries point back into the DNTT which |
references them. */ |
struct slt_special |
{ |
unsigned int sltdesc: 4; |
unsigned int line: 28; |
dnttpointer backptr; |
}; |
/* Used to describe nesting. |
For nested languages, an slt_assist entry must follow each SLT_FUNC |
entry in the SLT. The address field will point forward to the |
first slt_normal entry within the function's scope. */ |
struct slt_assist |
{ |
unsigned int sltdesc: 4; |
unsigned int unused: 28; |
sltpointer address; |
}; |
struct slt_generic |
{ |
unsigned int word[2]; |
}; |
union sltentry |
{ |
struct slt_normal snorm; |
struct slt_normal_off snormoff; |
struct slt_special sspec; |
struct slt_assist sasst; |
struct slt_generic sgeneric; |
}; |
/* $LINES$ declarations |
This is the line table used for optimized code, which is only present |
in the new $PROGRAM_INFO$ debug space. */ |
#define DST_LN_ESCAPE_FLAG1 15 |
#define DST_LN_ESCAPE_FLAG2 14 |
#define DST_LN_CTX_SPEC1 13 |
#define DST_LN_CTX_SPEC2 12 |
/* Escape function codes: */ |
typedef enum |
{ |
dst_ln_pad, /* pad byte */ |
dst_ln_escape_1, /* reserved */ |
dst_ln_dpc1_dln1, /* 1 byte line delta, 1 byte pc delta */ |
dst_ln_dpc2_dln2, /* 2 bytes line delta, 2 bytes pc delta */ |
dst_ln_pc4_ln4, /* 4 bytes ABSOLUTE line number, 4 bytes ABSOLUTE pc */ |
dst_ln_dpc0_dln1, /* 1 byte line delta, pc delta = 0 */ |
dst_ln_ln_off_1, /* statement escape, stmt # = 1 (2nd stmt on line) */ |
dst_ln_ln_off, /* statement escape, stmt # = next byte */ |
dst_ln_entry, /* entry escape, next byte is entry number */ |
dst_ln_exit, /* exit escape */ |
dst_ln_stmt_end, /* gap escape, 4 bytes pc delta */ |
dst_ln_stmt_cp, /* current stmt is a critical point */ |
dst_ln_escape_12, /* reserved */ |
dst_ln_escape_13, /* this is an exception site record */ |
dst_ln_nxt_byte, /* next byte contains the real escape code */ |
dst_ln_end, /* end escape, final entry follows */ |
dst_ln_escape1_END_OF_ENUM |
} |
dst_ln_escape1_t; |
typedef enum |
{ |
dst_ln_ctx_1, /* next byte describes context switch with 5-bit */ |
/* index into the image table and 3-bit run length. */ |
/* If run length is 0, end with another cxt specifier or ctx_end */ |
dst_ln_ctx_2, /* next 2 bytes switch context: 13 bit index, 3 bit run length */ |
dst_ln_ctx_4, /* next 4 bytes switch context: 29 bit index, 3 bit run length */ |
dst_ln_ctx_end, /* end current context */ |
dst_ln_col_run_1, /* next byte is column position of start of next statement, */ |
/* following byte is length of statement */ |
dst_ln_col_run_2, /* next 2 bytes is column position of start of next statement, */ |
/* following 2 bytes is length of statement */ |
dst_ln_init_base1, /* next 4 bytes are absolute PC, followed by 1 byte of line number */ |
dst_ln_init_base2, /* next 4 bytes are absolute PC, followed by 2 bytes of line number */ |
dst_ln_init_base3, /* next 4 bytes are absolute PC, followed by 3 bytes of line number */ |
dst_ln_escape2_END_OF_ENUM |
} |
dst_ln_escape2_t; |
typedef union |
{ |
struct |
{ |
unsigned int pc_delta : 4; /* 4 bit pc delta */ |
int ln_delta : 4; /* 4 bit line number delta */ |
} |
delta; |
struct |
{ |
unsigned int esc_flag : 4; /* alias for pc_delta */ |
unsigned int esc_code : 4; /* escape function code (dst_ln_escape1_t, or ...2_t */ |
} |
esc; |
struct |
{ |
unsigned int esc_flag : 4; /* dst_ln_ctx_spec1, or dst_ln_ctx_spec2 */ |
unsigned int run_length : 2; |
unsigned int ctx_index : 2; /* ...spec2 contains index; ...spec1, index - 4 */ |
} |
ctx_spec; |
char sdata; /* signed data byte */ |
unsigned char udata; /* unsigned data byte */ |
} |
dst_ln_entry_t, |
* dst_ln_entry_ptr_t; |
/* Warning: although the above union occupies only 1 byte the compiler treats |
it as having size 2 (the minimum size of a struct). Therefore a sequence of |
dst_ln_entry_t's cannot be described as an array, and walking through such a |
sequence requires convoluted code such as |
ln_ptr = (dst_ln_entry_ptr_t) (char*) ln_ptr + 1 |
We regret the inconvenience. */ |
/* Structure for interpreting the byte following a dst_ln_ctx1 entry. */ |
typedef struct |
{ |
unsigned int ctx1_index : 5; /* 5 bit index into context table */ |
unsigned int ctx1_run_length : 3; /* 3 bit run length */ |
} dst_ln_ctx1_t, |
*dst_ln_ctx1_ptr_t; |
/* Structure for interpreting the bytes following a dst_ln_ctx2 entry. */ |
typedef struct |
{ |
unsigned int ctx2_index : 13; /* 13 bit index into context table */ |
unsigned int ctx2_run_length : 3; /* 3 bit run length */ |
} dst_ln_ctx2_t, |
*dst_ln_ctx2_ptr_t; |
/* Structure for interpreting the bytes following a dst_ln_ctx4 entry. */ |
typedef struct |
{ |
unsigned int ctx4_index : 29; /* 29 bit index into context table */ |
unsigned int ctx4_run_length : 3; /* 3 bit run length */ |
} dst_ln_ctx4_t, |
*dst_ln_ctx4_ptr_t; |
/* PXDB definitions. |
PXDB is a post-processor which takes the executable file |
and massages the debug information so that the debugger may |
start up and run more efficiently. Some of the tasks |
performed by PXDB are: |
o Remove duplicate global type and variable information |
from the GNTT, |
o Append the GNTT onto the end of the LNTT and place both |
back in the LNTT section, |
o Build quick look-up tables (description follows) for |
files, procedures, modules, and paragraphs (for Cobol), |
placing these in the GNTT section, |
o Reconstruct the header appearing in the header section |
to access this information. |
The "quick look-up" tables are in the $GNTT$ sub-space, in |
the following order: |
Procedures -sorted by address |
Source files -sorted by address (of the |
generated code from routines) |
Modules -sorted by address |
Classes -<unsorted?> |
Address Alias -sorted by index <?> |
Object IDs -sorted by object identifier |
Most quick entries have (0-based) indices into the LNTT tables to |
the full entries for the item it describes. |
The post-PXDB header is in the $HEADER$ sub-space. Alas, it |
occurs in different forms, depending on the optimization level |
in the compilation step and whether PXDB was run or not. The |
worst part is the forms aren't self-describing, so we'll have |
to grovel in the bits to figure out what kind we're looking at |
(see hp_get_header in hp-psymtab-read.c). */ |
/* PXDB versions. */ |
#define PXDB_VERSION_CPLUSPLUS 1 |
#define PXDB_VERSION_7_4 2 |
#define PXDB_VERSION_CPP_30 3 |
#define PXDB_VERSION_DDE_3_2A 4 |
#define PXDB_VERSION_DDE_3_2 5 |
#define PXDB_VERSION_DDE_4_0 6 |
#define PXDB_VERSION_2_1 1 |
/* Header version for the case that there is no DOC info |
but the executable has been processed by pxdb (the easy |
case, from "cc -g"). */ |
typedef struct PXDB_struct |
{ |
int pd_entries; /* # of entries in function look-up table */ |
int fd_entries; /* # of entries in file look-up table */ |
int md_entries; /* # of entries in module look-up table */ |
unsigned int pxdbed : 1; /* 1 => file has been preprocessed */ |
unsigned int bighdr : 1; /* 1 => this header contains 'time' word */ |
unsigned int sa_header : 1;/* 1 => created by SA version of pxdb */ |
/* used for version check in xdb */ |
unsigned int inlined: 1; /* one or more functions have been inlined */ |
unsigned int spare:12; |
short version; /* pxdb header version */ |
int globals; /* index into the DNTT where GNTT begins */ |
unsigned int time; /* modify time of file before being pxdbed */ |
int pg_entries; /* # of entries in label look-up table */ |
int functions; /* actual number of functions */ |
int files; /* actual number of files */ |
int cd_entries; /* # of entries in class look-up table */ |
int aa_entries; /* # of entries in addr alias look-up table */ |
int oi_entries; /* # of entries in object id look-up table */ |
} PXDB_header, *PXDB_header_ptr; |
/* Header version for the case that there is no DOC info and the |
executable has NOT been processed by pxdb. */ |
typedef struct XDB_header_struct |
{ |
long gntt_length; |
long lntt_length; |
long slt_length; |
long vt_length; |
long xt_length; |
} XDB_header; |
/* Header version for the case that there is DOC info and the |
executable has been processed by pxdb. */ |
typedef struct DOC_info_PXDB_header_struct |
{ |
unsigned int xdb_header: 1; /* bit set if this is post-3.1 xdb */ |
unsigned int doc_header: 1; /* bit set if this is doc-style header */ |
unsigned int version: 8; /* version of pxdb see defines |
PXDB_VERSION_* in this file. */ |
unsigned int reserved_for_flags: 16;/* for future use; -- must be |
set to zero. */ |
unsigned int has_aux_pd_table: 1; /* $GNTT$ has aux PD table */ |
unsigned int has_expr_table: 1; /* space has $EXPR$ */ |
unsigned int has_range_table: 1; /* space has $RANGE$ */ |
unsigned int has_context_table: 1; /* space has $SRC_CTXT$ */ |
unsigned int has_lines_table: 1; /* space contains a $LINES$ |
subspace for line tables. */ |
unsigned int has_lt_offset_map: 1; /* space contains an lt_offset |
subspace for line table mapping. */ |
/* The following fields are the same as those in the PXDB_header in $DEBUG$ */ |
int pd_entries; /* # of entries in function look-up table */ |
int fd_entries; /* # of entries in file look-up table */ |
int md_entries; /* # of entries in module look-up table */ |
unsigned int pxdbed : 1; /* 1 => file has been preprocessed */ |
unsigned int bighdr : 1; /* 1 => this header contains 'time' word */ |
unsigned int sa_header : 1;/* 1 => created by SA version of pxdb */ |
/* used for version check in xdb */ |
unsigned int inlined: 1; /* one or more functions have been inlined */ |
unsigned int spare : 28; |
int globals; /* index into the DNTT where GNTT begins */ |
unsigned int time; /* modify time of file before being pxdbed */ |
int pg_entries; /* # of entries in label look-up table */ |
int functions; /* actual number of functions */ |
int files; /* actual number of files */ |
int cd_entries; /* # of entries in class look-up table */ |
int aa_entries; /* # of entries in addr alias look-up table */ |
int oi_entries; /* # of entries in object id look-up table */ |
} DOC_info_PXDB_header; |
/* Header version for the case that there is DOC info and the |
executable has NOT been processed by pxdb. */ |
typedef struct DOC_info_header_struct |
{ |
unsigned int xdb_header: 1; /* bit set if this is post-3.1 xdb */ |
unsigned int doc_header: 1; /* bit set if this is doc-style header*/ |
unsigned int version: 8; /* version of debug/header |
format. For 10.0 the value |
will be 1. For "Davis" the value is 2. */ |
unsigned int reserved_for_flags: 18; /* for future use; -- must be set to zero. */ |
unsigned int has_range_table: 1; /* space contains a $RANGE$ subspace for variable ranges. */ |
unsigned int has_context_table: 1; /* space contains a $CTXT$ subspace for context/inline table. */ |
unsigned int has_lines_table: 1; /* space contains a $LINES$ subspace for line tables. */ |
unsigned int has_lt_offset_map: 1; /* space contains an lt_offset subspace for line table mapping. */ |
long gntt_length; /* same as old header */ |
long lntt_length; /* same as old header */ |
long slt_length; /* same as old header */ |
long vt_length; /* same as old header */ |
long xt_length; /* same as old header */ |
long ctxt_length; /* present only if version >= 2 */ |
long range_length; /* present only if version >= 2 */ |
long expr_length; /* present only if version >= 2 */ |
} DOC_info_header; |
typedef union GenericDebugHeader_union |
{ |
PXDB_header no_doc; |
DOC_info_PXDB_header doc; |
XDB_header no_pxdb_no_doc; |
DOC_info_header no_pxdb_doc; |
} GenericDebugHeader; |
/* Procedure Descriptor: |
An element of the procedure quick look-up table. */ |
typedef struct quick_procedure |
{ |
long isym; /* 0-based index of first symbol |
for procedure in $LNTT$, |
i.e. the procedure itself. */ |
CORE_ADDR adrStart; /* memory adr of start of proc */ |
CORE_ADDR adrEnd; /* memory adr of end of proc */ |
char *sbAlias; /* alias name of procedure */ |
char *sbProc; /* real name of procedure */ |
CORE_ADDR adrBp; /* address of entry breakpoint */ |
CORE_ADDR adrExitBp; /* address of exit breakpoint */ |
int icd; /* member of this class (index) */ |
unsigned int ipd; /* index of template for this */ |
/* function (index) */ |
unsigned int unused: 5; |
unsigned int no_lt_offset: 1;/* no entry in lt_offset table */ |
unsigned int fTemplate: 1; /* function template */ |
unsigned int fExpansion: 1; /* function expansion */ |
unsigned int linked : 1; /* linked with other expansions */ |
unsigned int duplicate: 1; /* clone of another procedure */ |
unsigned int overloaded:1; /* overloaded function */ |
unsigned int member: 1; /* class member function */ |
unsigned int constructor:1; /* constructor function */ |
unsigned int destructor:1; /* destructor function */ |
unsigned int Static: 1; /* static function */ |
unsigned int Virtual: 1; /* virtual function */ |
unsigned int constant: 1; /* constant function */ |
unsigned int pure: 1; /* pure (virtual) function */ |
unsigned int language: 4; /* procedure's language */ |
unsigned int inlined: 1; /* function has been inlined */ |
unsigned int Operator: 1; /* operator function */ |
unsigned int stub: 1; /* bodyless function */ |
unsigned int optimize: 2; /* optimization level */ |
unsigned int level: 5; /* nesting level (top=0) */ |
} quick_procedure_entry, *quick_procedure_entry_ptr; |
/* Source File Descriptor: |
An element of the source file quick look-up table. */ |
typedef struct quick_source |
{ |
long isym; /* 0-based index in $LNTT$ of |
first symbol for this file. */ |
CORE_ADDR adrStart; /* mem adr of start of file's code */ |
CORE_ADDR adrEnd; /* mem adr of end of file's code */ |
char *sbFile; /* name of source file */ |
unsigned int fHasDecl: 1; /* do we have a .d file? */ |
unsigned int fWarned: 1; /* have warned about age problems? */ |
unsigned int fSrcfile: 1; /* 0 => include 1=> source */ |
unsigned short ilnMac; /* lines in file (0 if don't know) */ |
int ipd; /* 0-based index of first procedure |
in this file, in the quick |
look-up table of procedures. */ |
unsigned int *rgLn; /* line pointer array, if any */ |
} quick_file_entry, *quick_file_entry_ptr; |
/* Module Descriptor: |
An element of the module quick reference table. */ |
typedef struct quick_module |
{ |
long isym; /* 0-based index of first |
symbol for module. */ |
CORE_ADDR adrStart; /* adr of start of mod. */ |
CORE_ADDR adrEnd; /* adr of end of mod. */ |
char *sbAlias; /* alias name of module */ |
char *sbMod; /* real name of module */ |
unsigned int imports: 1; /* module have any imports? */ |
unsigned int vars_in_front: 1; /* module globals in front? */ |
unsigned int vars_in_gaps: 1; /* module globals in gaps? */ |
unsigned int language: 4; /* type of language */ |
unsigned int unused : 25; |
unsigned int unused2; /* space for future stuff */ |
} quick_module_entry, *quick_module_entry_ptr; |
/* Auxiliary Procedure Descriptor: |
An element of the auxiliary procedure quick look-up table. */ |
typedef struct quick_aux_procedure |
{ |
long isym_inln; /* start on inline list for proc */ |
long spare; |
} quick_aux_procedure_entry, *quick_aux_procedure_entry_ptr; |
/* Paragraph Descriptor: |
An element of the paragraph quick look-up table. */ |
typedef struct quick_paragraph |
{ |
long isym; /* first symbol for label (index) */ |
CORE_ADDR adrStart; /* memory adr of start of label */ |
CORE_ADDR adrEnd; /* memory adr of end of label */ |
char *sbLab; /* name of label */ |
unsigned int inst; /* Used in xdb to store inst @ bp */ |
unsigned int sect: 1; /* true = section, false = parag. */ |
unsigned int unused: 31; /* future use */ |
} quick_paragraph_entry, *quick_paragraph_entry_ptr; |
/* Class Descriptor: |
An element of the class quick look-up table. */ |
typedef struct quick_class |
{ |
char *sbClass; /* name of class */ |
long isym; /* class symbol (tag) */ |
unsigned int type : 2; /* 0=class, 1=union, 2=struct */ |
unsigned int fTemplate : 1;/* class template */ |
unsigned int expansion : 1;/* template expansion */ |
unsigned int unused :28; |
sltpointer lowscope; /* beginning of defined scope */ |
sltpointer hiscope; /* end of defined scope */ |
} quick_class_entry, *quick_class_entry_ptr; |
/* Address Alias Entry |
An element of the address alias quick look-up table. */ |
typedef struct quick_alias |
{ |
CORE_ADDR low; |
CORE_ADDR high; |
int index; |
unsigned int unused : 31; |
unsigned int alternate : 1; /* alternate unnamed aliases? */ |
} quick_alias_entry, *quick_alias_entry_ptr; |
/* Object Identification Entry |
An element of the object identification quick look-up table. */ |
typedef struct quick_obj_ID |
{ |
CORE_ADDR obj_ident; /* class identifier */ |
long isym; /* class symbol */ |
long offset; /* offset to object start */ |
} quick_obj_ID_entry, *quick_obj_ID_entry_ptr; |
#endif /* HP_SYMTAB_INCLUDED */ |
/contrib/toolchain/binutils/include/ieee.h |
---|
0,0 → 1,165 |
/* IEEE Standard 695-1980 "Universal Format for Object Modules" header file |
Copyright 2001 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2, or (at your option) |
any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. |
Contributed by Cygnus Support. */ |
#define N_W_VARIABLES 8 |
#define Module_Beginning 0xe0 |
typedef struct ieee_module |
{ |
char *processor; |
char *module_name; |
} |
ieee_module_begin_type; |
#define Address_Descriptor 0xec |
typedef struct ieee_address |
{ |
bfd_vma number_of_bits_mau; |
bfd_vma number_of_maus_in_address; |
unsigned char byte_order; |
#define IEEE_LITTLE 0xcc |
#define IEEE_BIG 0xcd |
} |
ieee_address_descriptor_type; |
typedef union ieee_w_variable |
{ |
file_ptr offset[N_W_VARIABLES]; |
struct |
{ |
file_ptr extension_record; |
file_ptr environmental_record; |
file_ptr section_part; |
file_ptr external_part; |
file_ptr debug_information_part; |
file_ptr data_part; |
file_ptr trailer_part; |
file_ptr me_record; |
} |
r; |
} |
ieee_w_variable_type; |
typedef enum ieee_record |
{ |
ieee_number_start_enum = 0x00, |
ieee_number_end_enum=0x7f, |
ieee_number_repeat_start_enum = 0x80, |
ieee_number_repeat_end_enum = 0x88, |
ieee_number_repeat_4_enum = 0x84, |
ieee_number_repeat_3_enum = 0x83, |
ieee_number_repeat_2_enum = 0x82, |
ieee_number_repeat_1_enum = 0x81, |
ieee_module_beginning_enum = 0xe0, |
ieee_module_end_enum = 0xe1, |
ieee_extension_length_1_enum = 0xde, |
ieee_extension_length_2_enum = 0xdf, |
ieee_section_type_enum = 0xe6, |
ieee_section_alignment_enum = 0xe7, |
ieee_external_symbol_enum = 0xe8, |
ieee_comma = 0x90, |
ieee_external_reference_enum = 0xe9, |
ieee_set_current_section_enum = 0xe5, |
ieee_address_descriptor_enum = 0xec, |
ieee_load_constant_bytes_enum = 0xed, |
ieee_load_with_relocation_enum = 0xe4, |
ieee_variable_A_enum = 0xc1, |
ieee_variable_B_enum = 0xc2, |
ieee_variable_C_enum = 0xc3, |
ieee_variable_D_enum = 0xc4, |
ieee_variable_E_enum = 0xc5, |
ieee_variable_F_enum = 0xc6, |
ieee_variable_G_enum = 0xc7, |
ieee_variable_H_enum = 0xc8, |
ieee_variable_I_enum = 0xc9, |
ieee_variable_J_enum = 0xca, |
ieee_variable_K_enum = 0xcb, |
ieee_variable_L_enum = 0xcc, |
ieee_variable_M_enum = 0xcd, |
ieee_variable_N_enum = 0xce, |
ieee_variable_O_enum = 0xcf, |
ieee_variable_P_enum = 0xd0, |
ieee_variable_Q_enum = 0xd1, |
ieee_variable_R_enum = 0xd2, |
ieee_variable_S_enum = 0xd3, |
ieee_variable_T_enum = 0xd4, |
ieee_variable_U_enum = 0xd5, |
ieee_variable_V_enum = 0xd6, |
ieee_variable_W_enum = 0xd7, |
ieee_variable_X_enum = 0xd8, |
ieee_variable_Y_enum = 0xd9, |
ieee_variable_Z_enum = 0xda, |
ieee_function_plus_enum = 0xa5, |
ieee_function_minus_enum = 0xa6, |
ieee_function_signed_open_b_enum = 0xba, |
ieee_function_signed_close_b_enum = 0xbb, |
ieee_function_unsigned_open_b_enum = 0xbc, |
ieee_function_unsigned_close_b_enum = 0xbd, |
ieee_function_either_open_b_enum = 0xbe, |
ieee_function_either_close_b_enum = 0xbf, |
ieee_record_seperator_enum = 0xdb, |
ieee_e2_first_byte_enum = 0xe2, |
ieee_section_size_enum = 0xe2d3, |
ieee_physical_region_size_enum = 0xe2c1, |
ieee_region_base_address_enum = 0xe2c2, |
ieee_mau_size_enum = 0xe2c6, |
ieee_m_value_enum = 0xe2cd, |
ieee_section_base_address_enum = 0xe2cc, |
ieee_asn_record_enum = 0xe2ce, |
ieee_section_offset_enum = 0xe2d2, |
ieee_value_starting_address_enum = 0xe2c7, |
ieee_assign_value_to_variable_enum = 0xe2d7, |
ieee_set_current_pc_enum = 0xe2d0, |
ieee_value_record_enum = 0xe2c9, |
ieee_nn_record = 0xf0, |
ieee_at_record_enum = 0xf1, |
ieee_ty_record_enum = 0xf2, |
ieee_attribute_record_enum = 0xf1c9, |
ieee_atn_record_enum = 0xf1ce, |
ieee_external_reference_info_record_enum = 0xf1d8, |
ieee_weak_external_reference_enum= 0xf4, |
ieee_repeat_data_enum = 0xf7, |
ieee_bb_record_enum = 0xf8, |
ieee_be_record_enum = 0xf9 |
} |
ieee_record_enum_type; |
typedef struct ieee_section |
{ |
unsigned int section_index; |
unsigned int section_type; |
char * section_name; |
unsigned int parent_section_index; |
unsigned int sibling_section_index; |
unsigned int context_index; |
} |
ieee_section_type; |
#define IEEE_REFERENCE_BASE 11 |
#define IEEE_PUBLIC_BASE 32 |
#define IEEE_SECTION_NUMBER_BASE 1 |
/contrib/toolchain/binutils/include/leb128.h |
---|
0,0 → 1,136 |
/* Utilities for reading leb128 values. |
Copyright (C) 2012 Free Software Foundation, Inc. |
This file is part of the libiberty library. |
Libiberty is free software; you can redistribute it and/or |
modify it under the terms of the GNU Library General Public |
License as published by the Free Software Foundation; either |
version 2 of the License, or (at your option) any later version. |
Libiberty is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
Library General Public License for more details. |
You should have received a copy of the GNU Library General Public |
License along with libiberty; see the file COPYING.LIB. If not, write |
to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
/* The functions defined here can be speed critical. |
Since they are all pretty small we keep things simple and just define |
them all as "static inline". |
WARNING: This file is used by GDB which is stuck at C90. :-( |
Though it can use stdint.h, inttypes.h. |
Therefore if you want to add support for "long long" you need |
to wrap it in #ifdef CC_HAS_LONG_LONG. */ |
#ifndef LEB128_H |
#define LEB128_H |
/* Get a definition for inline. */ |
#include "ansidecl.h" |
/* Get a definition for NULL, size_t. */ |
#include <stddef.h> |
#ifdef HAVE_STDINT_H |
#include <stdint.h> |
#endif |
#ifdef HAVE_INTTYPES_H |
#include <inttypes.h> |
#endif |
/* Decode the unsigned LEB128 constant at BUF into the variable pointed to |
by R, and return the number of bytes read. |
If we read off the end of the buffer, zero is returned, |
and nothing is stored in R. |
Note: The result is an int instead of a pointer to the next byte to be |
read to avoid const-vs-non-const problems. */ |
static inline size_t |
read_uleb128_to_uint64 (const unsigned char *buf, const unsigned char *buf_end, |
uint64_t *r) |
{ |
const unsigned char *p = buf; |
unsigned int shift = 0; |
uint64_t result = 0; |
unsigned char byte; |
while (1) |
{ |
if (p >= buf_end) |
return 0; |
byte = *p++; |
result |= ((uint64_t) (byte & 0x7f)) << shift; |
if ((byte & 0x80) == 0) |
break; |
shift += 7; |
} |
*r = result; |
return p - buf; |
} |
/* Decode the signed LEB128 constant at BUF into the variable pointed to |
by R, and return the number of bytes read. |
If we read off the end of the buffer, zero is returned, |
and nothing is stored in R. |
Note: The result is an int instead of a pointer to the next byte to be |
read to avoid const-vs-non-const problems. */ |
static inline size_t |
read_sleb128_to_int64 (const unsigned char *buf, const unsigned char *buf_end, |
int64_t *r) |
{ |
const unsigned char *p = buf; |
unsigned int shift = 0; |
int64_t result = 0; |
unsigned char byte; |
while (1) |
{ |
if (p >= buf_end) |
return 0; |
byte = *p++; |
result |= ((uint64_t) (byte & 0x7f)) << shift; |
shift += 7; |
if ((byte & 0x80) == 0) |
break; |
} |
if (shift < (sizeof (*r) * 8) && (byte & 0x40) != 0) |
result |= -(((uint64_t) 1) << shift); |
*r = result; |
return p - buf; |
} |
/* Return the number of bytes to read to skip past an LEB128 number in BUF. |
If the end isn't found before reaching BUF_END, return zero. |
Note: The result is an int instead of a pointer to the next byte to be |
read to avoid const-vs-non-const problems. */ |
static inline size_t |
skip_leb128 (const unsigned char *buf, const unsigned char *buf_end) |
{ |
const unsigned char *p = buf; |
unsigned char byte; |
while (1) |
{ |
if (p == buf_end) |
return 0; |
byte = *p++; |
if ((byte & 0x80) == 0) |
return p - buf; |
} |
} |
#endif /* LEB128_H */ |
/contrib/toolchain/binutils/include/libiberty.h |
---|
0,0 → 1,686 |
/* Function declarations for libiberty. |
Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, |
2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. |
Note - certain prototypes declared in this header file are for |
functions whoes implementation copyright does not belong to the |
FSF. Those prototypes are present in this file for reference |
purposes only and their presence in this file should not construed |
as an indication of ownership by the FSF of the implementation of |
those functions in any way or form whatsoever. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2, or (at your option) |
any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. |
Written by Cygnus Support, 1994. |
The libiberty library provides a number of functions which are |
missing on some operating systems. We do not declare those here, |
to avoid conflicts with the system header files on operating |
systems that do support those functions. In this file we only |
declare those functions which are specific to libiberty. */ |
#ifndef LIBIBERTY_H |
#define LIBIBERTY_H |
#ifdef __cplusplus |
extern "C" { |
#endif |
#include "ansidecl.h" |
/* Get a definition for size_t. */ |
#include <stddef.h> |
/* Get a definition for va_list. */ |
#include <stdarg.h> |
#include <stdio.h> |
/* If the OS supports it, ensure that the supplied stream is setup to |
avoid any multi-threaded locking. Otherwise leave the FILE pointer |
unchanged. If the stream is NULL do nothing. */ |
extern void unlock_stream (FILE *); |
/* If the OS supports it, ensure that the standard I/O streams, stdin, |
stdout and stderr are setup to avoid any multi-threaded locking. |
Otherwise do nothing. */ |
extern void unlock_std_streams (void); |
/* Open and return a FILE pointer. If the OS supports it, ensure that |
the stream is setup to avoid any multi-threaded locking. Otherwise |
return the FILE pointer unchanged. */ |
extern FILE *fopen_unlocked (const char *, const char *); |
extern FILE *fdopen_unlocked (int, const char *); |
extern FILE *freopen_unlocked (const char *, const char *, FILE *); |
/* Build an argument vector from a string. Allocates memory using |
malloc. Use freeargv to free the vector. */ |
extern char **buildargv (const char *) ATTRIBUTE_MALLOC; |
/* Free a vector returned by buildargv. */ |
extern void freeargv (char **); |
/* Duplicate an argument vector. Allocates memory using malloc. Use |
freeargv to free the vector. */ |
extern char **dupargv (char **) ATTRIBUTE_MALLOC; |
/* Expand "@file" arguments in argv. */ |
extern void expandargv PARAMS ((int *, char ***)); |
/* Write argv to an @-file, inserting necessary quoting. */ |
extern int writeargv PARAMS ((char **, FILE *)); |
/* Return the number of elements in argv. */ |
extern int countargv (char**); |
/* Return the last component of a path name. Note that we can't use a |
prototype here because the parameter is declared inconsistently |
across different systems, sometimes as "char *" and sometimes as |
"const char *" */ |
/* HAVE_DECL_* is a three-state macro: undefined, 0 or 1. If it is |
undefined, we haven't run the autoconf check so provide the |
declaration without arguments. If it is 0, we checked and failed |
to find the declaration so provide a fully prototyped one. If it |
is 1, we found it so don't provide any declaration at all. */ |
#if !HAVE_DECL_BASENAME |
#if defined (__GNU_LIBRARY__ ) || defined (__linux__) || defined (__FreeBSD__) || defined (__OpenBSD__) || defined(__NetBSD__) || defined (__CYGWIN__) || defined (__CYGWIN32__) || defined (__MINGW32__) || defined (HAVE_DECL_BASENAME) |
extern char *basename (const char *); |
#else |
/* Do not allow basename to be used if there is no prototype seen. We |
either need to use the above prototype or have one from |
autoconf which would result in HAVE_DECL_BASENAME being set. */ |
#define basename basename_cannot_be_used_without_a_prototype |
#endif |
#endif |
/* A well-defined basename () that is always compiled in. */ |
extern const char *lbasename (const char *); |
/* Same, but assumes DOS semantics (drive name, backslash is also a |
dir separator) regardless of host. */ |
extern const char *dos_lbasename (const char *); |
/* Same, but assumes Unix semantics (absolute paths always start with |
a slash, only forward slash is accepted as dir separator) |
regardless of host. */ |
extern const char *unix_lbasename (const char *); |
/* A well-defined realpath () that is always compiled in. */ |
extern char *lrealpath (const char *); |
/* Concatenate an arbitrary number of strings. You must pass NULL as |
the last argument of this function, to terminate the list of |
strings. Allocates memory using xmalloc. */ |
extern char *concat (const char *, ...) ATTRIBUTE_MALLOC ATTRIBUTE_SENTINEL; |
/* Concatenate an arbitrary number of strings. You must pass NULL as |
the last argument of this function, to terminate the list of |
strings. Allocates memory using xmalloc. The first argument is |
not one of the strings to be concatenated, but if not NULL is a |
pointer to be freed after the new string is created, similar to the |
way xrealloc works. */ |
extern char *reconcat (char *, const char *, ...) ATTRIBUTE_MALLOC ATTRIBUTE_SENTINEL; |
/* Determine the length of concatenating an arbitrary number of |
strings. You must pass NULL as the last argument of this function, |
to terminate the list of strings. */ |
extern unsigned long concat_length (const char *, ...) ATTRIBUTE_SENTINEL; |
/* Concatenate an arbitrary number of strings into a SUPPLIED area of |
memory. You must pass NULL as the last argument of this function, |
to terminate the list of strings. The supplied memory is assumed |
to be large enough. */ |
extern char *concat_copy (char *, const char *, ...) ATTRIBUTE_SENTINEL; |
/* Concatenate an arbitrary number of strings into a GLOBAL area of |
memory. You must pass NULL as the last argument of this function, |
to terminate the list of strings. The supplied memory is assumed |
to be large enough. */ |
extern char *concat_copy2 (const char *, ...) ATTRIBUTE_SENTINEL; |
/* This is the global area used by concat_copy2. */ |
extern char *libiberty_concat_ptr; |
/* Concatenate an arbitrary number of strings. You must pass NULL as |
the last argument of this function, to terminate the list of |
strings. Allocates memory using alloca. The arguments are |
evaluated twice! */ |
#define ACONCAT(ACONCAT_PARAMS) \ |
(libiberty_concat_ptr = (char *) alloca (concat_length ACONCAT_PARAMS + 1), \ |
concat_copy2 ACONCAT_PARAMS) |
/* Check whether two file descriptors refer to the same file. */ |
extern int fdmatch (int fd1, int fd2); |
/* Return the position of the first bit set in the argument. */ |
/* Prototypes vary from system to system, so we only provide a |
prototype on systems where we know that we need it. */ |
#if defined (HAVE_DECL_FFS) && !HAVE_DECL_FFS |
extern int ffs(int); |
#endif |
/* Get the working directory. The result is cached, so don't call |
chdir() between calls to getpwd(). */ |
extern char * getpwd (void); |
/* Get the current time. */ |
/* Prototypes vary from system to system, so we only provide a |
prototype on systems where we know that we need it. */ |
#ifdef __MINGW32__ |
/* Forward declaration to avoid #include <sys/time.h>. */ |
struct timeval; |
extern int gettimeofday (struct timeval *, void *); |
#endif |
/* Get the amount of time the process has run, in microseconds. */ |
extern long get_run_time (void); |
/* Generate a relocated path to some installation directory. Allocates |
return value using malloc. */ |
extern char *make_relative_prefix (const char *, const char *, |
const char *) ATTRIBUTE_MALLOC; |
/* Generate a relocated path to some installation directory without |
attempting to follow any soft links. Allocates |
return value using malloc. */ |
extern char *make_relative_prefix_ignore_links (const char *, const char *, |
const char *) ATTRIBUTE_MALLOC; |
/* Choose a temporary directory to use for scratch files. */ |
extern char *choose_temp_base (void) ATTRIBUTE_MALLOC; |
/* Return a temporary file name or NULL if unable to create one. */ |
extern char *make_temp_file (const char *) ATTRIBUTE_MALLOC; |
/* Remove a link to a file unless it is special. */ |
extern int unlink_if_ordinary (const char *); |
/* Allocate memory filled with spaces. Allocates using malloc. */ |
extern const char *spaces (int count); |
/* Return the maximum error number for which strerror will return a |
string. */ |
extern int errno_max (void); |
/* Return the name of an errno value (e.g., strerrno (EINVAL) returns |
"EINVAL"). */ |
extern const char *strerrno (int); |
/* Given the name of an errno value, return the value. */ |
extern int strtoerrno (const char *); |
/* ANSI's strerror(), but more robust. */ |
extern char *xstrerror (int); |
/* Return the maximum signal number for which strsignal will return a |
string. */ |
extern int signo_max (void); |
/* Return a signal message string for a signal number |
(e.g., strsignal (SIGHUP) returns something like "Hangup"). */ |
/* This is commented out as it can conflict with one in system headers. |
We still document its existence though. */ |
/*extern const char *strsignal (int);*/ |
/* Return the name of a signal number (e.g., strsigno (SIGHUP) returns |
"SIGHUP"). */ |
extern const char *strsigno (int); |
/* Given the name of a signal, return its number. */ |
extern int strtosigno (const char *); |
/* Register a function to be run by xexit. Returns 0 on success. */ |
extern int xatexit (void (*fn) (void)); |
/* Exit, calling all the functions registered with xatexit. */ |
extern void xexit (int status) ATTRIBUTE_NORETURN; |
/* Set the program name used by xmalloc. */ |
extern void xmalloc_set_program_name (const char *); |
/* Report an allocation failure. */ |
extern void xmalloc_failed (size_t) ATTRIBUTE_NORETURN; |
/* Allocate memory without fail. If malloc fails, this will print a |
message to stderr (using the name set by xmalloc_set_program_name, |
if any) and then call xexit. */ |
extern void *xmalloc (size_t) ATTRIBUTE_MALLOC; |
/* Reallocate memory without fail. This works like xmalloc. Note, |
realloc type functions are not suitable for attribute malloc since |
they may return the same address across multiple calls. */ |
extern void *xrealloc (void *, size_t); |
/* Allocate memory without fail and set it to zero. This works like |
xmalloc. */ |
extern void *xcalloc (size_t, size_t) ATTRIBUTE_MALLOC; |
/* Copy a string into a memory buffer without fail. */ |
extern char *xstrdup (const char *) ATTRIBUTE_MALLOC; |
/* Copy at most N characters from string into a buffer without fail. */ |
extern char *xstrndup (const char *, size_t) ATTRIBUTE_MALLOC; |
/* Copy an existing memory buffer to a new memory buffer without fail. */ |
extern void *xmemdup (const void *, size_t, size_t) ATTRIBUTE_MALLOC; |
/* Physical memory routines. Return values are in BYTES. */ |
extern double physmem_total (void); |
extern double physmem_available (void); |
/* Compute the 32-bit CRC of a block of memory. */ |
extern unsigned int xcrc32 (const unsigned char *, int, unsigned int); |
/* These macros provide a K&R/C89/C++-friendly way of allocating structures |
with nice encapsulation. The XDELETE*() macros are technically |
superfluous, but provided here for symmetry. Using them consistently |
makes it easier to update client code to use different allocators such |
as new/delete and new[]/delete[]. */ |
/* Scalar allocators. */ |
#define XALLOCA(T) ((T *) alloca (sizeof (T))) |
#define XNEW(T) ((T *) xmalloc (sizeof (T))) |
#define XCNEW(T) ((T *) xcalloc (1, sizeof (T))) |
#define XDUP(T, P) ((T *) xmemdup ((P), sizeof (T), sizeof (T))) |
#define XDELETE(P) free ((void*) (P)) |
/* Array allocators. */ |
#define XALLOCAVEC(T, N) ((T *) alloca (sizeof (T) * (N))) |
#define XNEWVEC(T, N) ((T *) xmalloc (sizeof (T) * (N))) |
#define XCNEWVEC(T, N) ((T *) xcalloc ((N), sizeof (T))) |
#define XDUPVEC(T, P, N) ((T *) xmemdup ((P), sizeof (T) * (N), sizeof (T) * (N))) |
#define XRESIZEVEC(T, P, N) ((T *) xrealloc ((void *) (P), sizeof (T) * (N))) |
#define XDELETEVEC(P) free ((void*) (P)) |
/* Allocators for variable-sized structures and raw buffers. */ |
#define XALLOCAVAR(T, S) ((T *) alloca ((S))) |
#define XNEWVAR(T, S) ((T *) xmalloc ((S))) |
#define XCNEWVAR(T, S) ((T *) xcalloc (1, (S))) |
#define XDUPVAR(T, P, S1, S2) ((T *) xmemdup ((P), (S1), (S2))) |
#define XRESIZEVAR(T, P, S) ((T *) xrealloc ((P), (S))) |
/* Type-safe obstack allocator. */ |
#define XOBNEW(O, T) ((T *) obstack_alloc ((O), sizeof (T))) |
#define XOBNEWVEC(O, T, N) ((T *) obstack_alloc ((O), sizeof (T) * (N))) |
#define XOBNEWVAR(O, T, S) ((T *) obstack_alloc ((O), (S))) |
#define XOBFINISH(O, T) ((T) obstack_finish ((O))) |
/* hex character manipulation routines */ |
#define _hex_array_size 256 |
#define _hex_bad 99 |
extern const unsigned char _hex_value[_hex_array_size]; |
extern void hex_init (void); |
#define hex_p(c) (hex_value (c) != _hex_bad) |
/* If you change this, note well: Some code relies on side effects in |
the argument being performed exactly once. */ |
#define hex_value(c) ((unsigned int) _hex_value[(unsigned char) (c)]) |
/* Flags for pex_init. These are bits to be or'ed together. */ |
/* Record subprocess times, if possible. */ |
#define PEX_RECORD_TIMES 0x1 |
/* Use pipes for communication between processes, if possible. */ |
#define PEX_USE_PIPES 0x2 |
/* Save files used for communication between processes. */ |
#define PEX_SAVE_TEMPS 0x4 |
/* Prepare to execute one or more programs, with standard output of |
each program fed to standard input of the next. |
FLAGS As above. |
PNAME The name of the program to report in error messages. |
TEMPBASE A base name to use for temporary files; may be NULL to |
use a random name. |
Returns NULL on error. */ |
extern struct pex_obj *pex_init (int flags, const char *pname, |
const char *tempbase); |
/* Flags for pex_run. These are bits to be or'ed together. */ |
/* Last program in pipeline. Standard output of program goes to |
OUTNAME, or, if OUTNAME is NULL, to standard output of caller. Do |
not set this if you want to call pex_read_output. After this is |
set, pex_run may no longer be called with the same struct |
pex_obj. */ |
#define PEX_LAST 0x1 |
/* Search for program in executable search path. */ |
#define PEX_SEARCH 0x2 |
/* OUTNAME is a suffix. */ |
#define PEX_SUFFIX 0x4 |
/* Send program's standard error to standard output. */ |
#define PEX_STDERR_TO_STDOUT 0x8 |
/* Input file should be opened in binary mode. This flag is ignored |
on Unix. */ |
#define PEX_BINARY_INPUT 0x10 |
/* Output file should be opened in binary mode. This flag is ignored |
on Unix. For proper behaviour PEX_BINARY_INPUT and |
PEX_BINARY_OUTPUT have to match appropriately--i.e., a call using |
PEX_BINARY_OUTPUT should be followed by a call using |
PEX_BINARY_INPUT. */ |
#define PEX_BINARY_OUTPUT 0x20 |
/* Capture stderr to a pipe. The output can be read by |
calling pex_read_err and reading from the returned |
FILE object. This flag may be specified only for |
the last program in a pipeline. |
This flag is supported only on Unix and Windows. */ |
#define PEX_STDERR_TO_PIPE 0x40 |
/* Capture stderr in binary mode. This flag is ignored |
on Unix. */ |
#define PEX_BINARY_ERROR 0x80 |
/* Execute one program. Returns NULL on success. On error returns an |
error string (typically just the name of a system call); the error |
string is statically allocated. |
OBJ Returned by pex_init. |
FLAGS As above. |
EXECUTABLE The program to execute. |
ARGV NULL terminated array of arguments to pass to the program. |
OUTNAME Sets the output file name as follows: |
PEX_SUFFIX set (OUTNAME may not be NULL): |
TEMPBASE parameter to pex_init not NULL: |
Output file name is the concatenation of TEMPBASE |
and OUTNAME. |
TEMPBASE is NULL: |
Output file name is a random file name ending in |
OUTNAME. |
PEX_SUFFIX not set: |
OUTNAME not NULL: |
Output file name is OUTNAME. |
OUTNAME NULL, TEMPBASE not NULL: |
Output file name is randomly chosen using |
TEMPBASE. |
OUTNAME NULL, TEMPBASE NULL: |
Output file name is randomly chosen. |
If PEX_LAST is not set, the output file name is the |
name to use for a temporary file holding stdout, if |
any (there will not be a file if PEX_USE_PIPES is set |
and the system supports pipes). If a file is used, it |
will be removed when no longer needed unless |
PEX_SAVE_TEMPS is set. |
If PEX_LAST is set, and OUTNAME is not NULL, standard |
output is written to the output file name. The file |
will not be removed. If PEX_LAST and PEX_SUFFIX are |
both set, TEMPBASE may not be NULL. |
ERRNAME If not NULL, this is the name of a file to which |
standard error is written. If NULL, standard error of |
the program is standard error of the caller. |
ERR On an error return, *ERR is set to an errno value, or |
to 0 if there is no relevant errno. |
*/ |
extern const char *pex_run (struct pex_obj *obj, int flags, |
const char *executable, char * const *argv, |
const char *outname, const char *errname, |
int *err); |
/* As for pex_run (), but takes an extra parameter to enable the |
environment for the child process to be specified. |
ENV The environment for the child process, specified as |
an array of character pointers. Each element of the |
array should point to a string of the form VAR=VALUE, |
with the exception of the last element which must be |
a null pointer. |
*/ |
extern const char *pex_run_in_environment (struct pex_obj *obj, int flags, |
const char *executable, |
char * const *argv, |
char * const *env, |
const char *outname, |
const char *errname, int *err); |
/* Return a stream for a temporary file to pass to the first program |
in the pipeline as input. The file name is chosen as for pex_run. |
pex_run closes the file automatically; don't close it yourself. */ |
extern FILE *pex_input_file (struct pex_obj *obj, int flags, |
const char *in_name); |
/* Return a stream for a pipe connected to the standard input of the |
first program in the pipeline. You must have passed |
`PEX_USE_PIPES' to `pex_init'. Close the returned stream |
yourself. */ |
extern FILE *pex_input_pipe (struct pex_obj *obj, int binary); |
/* Read the standard output of the last program to be executed. |
pex_run can not be called after this. BINARY should be non-zero if |
the file should be opened in binary mode; this is ignored on Unix. |
Returns NULL on error. Don't call fclose on the returned FILE; it |
will be closed by pex_free. */ |
extern FILE *pex_read_output (struct pex_obj *, int binary); |
/* Read the standard error of the last program to be executed. |
pex_run can not be called after this. BINARY should be non-zero if |
the file should be opened in binary mode; this is ignored on Unix. |
Returns NULL on error. Don't call fclose on the returned FILE; it |
will be closed by pex_free. */ |
extern FILE *pex_read_err (struct pex_obj *, int binary); |
/* Return exit status of all programs in VECTOR. COUNT indicates the |
size of VECTOR. The status codes in the vector are in the order of |
the calls to pex_run. Returns 0 on error, 1 on success. */ |
extern int pex_get_status (struct pex_obj *, int count, int *vector); |
/* Return times of all programs in VECTOR. COUNT indicates the size |
of VECTOR. struct pex_time is really just struct timeval, but that |
is not portable to all systems. Returns 0 on error, 1 on |
success. */ |
struct pex_time |
{ |
unsigned long user_seconds; |
unsigned long user_microseconds; |
unsigned long system_seconds; |
unsigned long system_microseconds; |
}; |
extern int pex_get_times (struct pex_obj *, int count, |
struct pex_time *vector); |
/* Clean up a pex_obj. If you have not called pex_get_times or |
pex_get_status, this will try to kill the subprocesses. */ |
extern void pex_free (struct pex_obj *); |
/* Just execute one program. Return value is as for pex_run. |
FLAGS Combination of PEX_SEARCH and PEX_STDERR_TO_STDOUT. |
EXECUTABLE As for pex_run. |
ARGV As for pex_run. |
PNAME As for pex_init. |
OUTNAME As for pex_run when PEX_LAST is set. |
ERRNAME As for pex_run. |
STATUS Set to exit status on success. |
ERR As for pex_run. |
*/ |
extern const char *pex_one (int flags, const char *executable, |
char * const *argv, const char *pname, |
const char *outname, const char *errname, |
int *status, int *err); |
/* pexecute and pwait are the old pexecute interface, still here for |
backward compatibility. Don't use these for new code. Instead, |
use pex_init/pex_run/pex_get_status/pex_free, or pex_one. */ |
/* Definitions used by the pexecute routine. */ |
#define PEXECUTE_FIRST 1 |
#define PEXECUTE_LAST 2 |
#define PEXECUTE_ONE (PEXECUTE_FIRST + PEXECUTE_LAST) |
#define PEXECUTE_SEARCH 4 |
#define PEXECUTE_VERBOSE 8 |
/* Execute a program. */ |
extern int pexecute (const char *, char * const *, const char *, |
const char *, char **, char **, int); |
/* Wait for pexecute to finish. */ |
extern int pwait (int, int *, int); |
#if !HAVE_DECL_ASPRINTF |
/* Like sprintf but provides a pointer to malloc'd storage, which must |
be freed by the caller. */ |
extern int asprintf (char **, const char *, ...) ATTRIBUTE_PRINTF_2; |
#endif |
#if !HAVE_DECL_VASPRINTF |
/* Like vsprintf but provides a pointer to malloc'd storage, which |
must be freed by the caller. */ |
extern int vasprintf (char **, const char *, va_list) ATTRIBUTE_PRINTF(2,0); |
#endif |
#if defined(HAVE_DECL_SNPRINTF) && !HAVE_DECL_SNPRINTF |
/* Like sprintf but prints at most N characters. */ |
extern int snprintf (char *, size_t, const char *, ...) ATTRIBUTE_PRINTF_3; |
#endif |
#if defined(HAVE_DECL_VSNPRINTF) && !HAVE_DECL_VSNPRINTF |
/* Like vsprintf but prints at most N characters. */ |
extern int vsnprintf (char *, size_t, const char *, va_list) ATTRIBUTE_PRINTF(3,0); |
#endif |
#if defined(HAVE_DECL_STRVERSCMP) && !HAVE_DECL_STRVERSCMP |
/* Compare version strings. */ |
extern int strverscmp (const char *, const char *); |
#endif |
/* Set the title of a process */ |
extern void setproctitle (const char *name, ...); |
/* Increase stack limit if possible. */ |
extern void stack_limit_increase (unsigned long); |
#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0])) |
/* Drastically simplified alloca configurator. If we're using GCC, |
we use __builtin_alloca; otherwise we use the C alloca. The C |
alloca is always available. You can override GCC by defining |
USE_C_ALLOCA yourself. The canonical autoconf macro C_ALLOCA is |
also set/unset as it is often used to indicate whether code needs |
to call alloca(0). */ |
extern void *C_alloca (size_t) ATTRIBUTE_MALLOC; |
#undef alloca |
#if GCC_VERSION >= 2000 && !defined USE_C_ALLOCA |
# define alloca(x) __builtin_alloca(x) |
# undef C_ALLOCA |
# define ASTRDUP(X) \ |
(__extension__ ({ const char *const libiberty_optr = (X); \ |
const unsigned long libiberty_len = strlen (libiberty_optr) + 1; \ |
char *const libiberty_nptr = (char *const) alloca (libiberty_len); \ |
(char *) memcpy (libiberty_nptr, libiberty_optr, libiberty_len); })) |
#else |
# define alloca(x) C_alloca(x) |
# undef USE_C_ALLOCA |
# define USE_C_ALLOCA 1 |
# undef C_ALLOCA |
# define C_ALLOCA 1 |
extern const char *libiberty_optr; |
extern char *libiberty_nptr; |
extern unsigned long libiberty_len; |
# define ASTRDUP(X) \ |
(libiberty_optr = (X), \ |
libiberty_len = strlen (libiberty_optr) + 1, \ |
libiberty_nptr = (char *) alloca (libiberty_len), \ |
(char *) memcpy (libiberty_nptr, libiberty_optr, libiberty_len)) |
#endif |
#ifdef __cplusplus |
} |
#endif |
#endif /* ! defined (LIBIBERTY_H) */ |
/contrib/toolchain/binutils/include/lto-symtab.h |
---|
0,0 → 1,41 |
/* Data types used in the IL symbol table. |
Copyright (C) 2009 Free Software Foundation, Inc. |
Contributed by Rafael Espindola <espindola@google.com> |
This file is part of GCC. |
GCC is free software; you can redistribute it and/or modify it under |
the terms of the GNU General Public License as published by the Free |
Software Foundation; either version 3, or (at your option) any later |
version. |
GCC is distributed in the hope that it will be useful, but WITHOUT ANY |
WARRANTY; without even the implied warranty of MERCHANTABILITY or |
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
for more details. |
You should have received a copy of the GNU General Public License |
along with GCC; see the file COPYING3. If not see |
<http://www.gnu.org/licenses/>. */ |
#ifndef GCC_LTO_SYMTAB_H |
#define GCC_LTO_SYMTAB_H |
enum gcc_plugin_symbol_kind |
{ |
GCCPK_DEF, |
GCCPK_WEAKDEF, |
GCCPK_UNDEF, |
GCCPK_WEAKUNDEF, |
GCCPK_COMMON |
}; |
enum gcc_plugin_symbol_visibility |
{ |
GCCPV_DEFAULT, |
GCCPV_PROTECTED, |
GCCPV_INTERNAL, |
GCCPV_HIDDEN |
}; |
#endif /* GCC_LTO_SYMTAB_H */ |
/contrib/toolchain/binutils/include/mach-o/ChangeLog |
---|
0,0 → 1,81 |
2012-11-14 Tristan Gingold <gingold@adacore.com> |
* external.h (mach_o_entry_point_command_external) |
(mach_o_source_version_command_external) |
(mach_o_data_in_code_entry_external): New structures. |
* loader.h (bfd_mach_o_load_command_type): Add |
BFD_MACH_O_LC_MAIN, BFD_MACH_O_LC_DATA_IN_CODE, |
BFD_MACH_O_LC_SOURCE_VERSION and BFD_MACH_O_LC_DYLIB_CODE_SIGN_DRS. |
(BFD_MACH_O_REFERENCE_MASK): Adjust value. |
(BFD_MACH_O_N_REF_TO_WEAK): New definition. |
(BFD_MACH_O_N_ARM_THUMB_DEF, BFD_MACH_O_N_SYMBOL_RESOLVER): Likewise. |
(bfd_mach_o_data_in_code_entry_kind): New enum. |
2012-11-14 Tristan Gingold <gingold@adacore.com> |
* arm.h: New file. |
2012-02-23 Iain Sandoe <idsandoe@googlemail.com> |
* external.h: Add comments about relocations fields. Add macros |
for non-scattered relocations. Move scattered relocation macros to |
here. |
* reloc.h: Remove macros related to external representation of reloc |
fields. |
2012-01-12 Iain Sandoe <idsandoe@googlemail.com> |
* loader.h (BFD_MACH_O_INDIRECT_SYM_LOCAL): New. |
(BFD_MACH_O_INDIRECT_SYM_ABS): New |
2012-01-04 Tristan Gingold <gingold@adacore.com> |
* external.h (mach_o_fvmlib_command_external): New structure. |
2012-01-04 Tristan Gingold <gingold@adacore.com> |
* loader.h: Update copyright year. |
(bfd_mach_o_cpu_subtype): Add ARM subtypes. |
2012-01-04 Tristan Gingold <gingold@adacore.com> |
* external.h: Update copyright year. |
(mach_o_symtab_command_external): Add comments. |
(mach_o_encryption_info_command_external): New structure. |
2011-12-16 Tristan Gingold <gingold@adacore.com> |
* codesign.h: New file. |
2011-08-08 Tristan Gingold <gingold@adacore.com> |
* loader.h (bfd_mach_o_load_command_type): Add |
BFD_MACH_O_LC_LOAD_UPWARD_DYLIB, BFD_MACH_O_LC_VERSION_MIN_MACOSX, |
BFD_MACH_O_LC_VERSION_MIN_IPHONEOS, BFD_MACH_O_LC_FUNCTION_STARTS, |
and BFD_MACH_O_LC_DYLD_ENVIRONMENT. |
* external.h (mach_o_version_min_command_external): New structure. |
2011-08-08 Tristan Gingold <gingold@adacore.com> |
* loader.h: Reorder declarations. |
* x86-64.h: New file. |
* external.h: New file. |
* reloc.h: New file. |
2011-07-06 Tristan Gingold <gingold@adacore.com> |
* loader.h: New file. |
Copyright (C) 2011-2012 Free Software Foundation, Inc. |
Copying and distribution of this file, with or without modification, |
are permitted in any medium without royalty provided the copyright |
notice and this notice are preserved. |
Local Variables: |
mode: change-log |
left-margin: 8 |
fill-column: 74 |
version-control: never |
End: |
/contrib/toolchain/binutils/include/mach-o/arm.h |
---|
0,0 → 1,37 |
/* Mach-O arm declarations for BFD. |
Copyright 2012 |
Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _MACH_O_ARM_H |
#define _MACH_O_ARM_H |
/* ARM relocations. */ |
#define BFD_MACH_O_ARM_RELOC_VANILLA 0 /* Generic relocation. */ |
#define BFD_MACH_O_ARM_RELOC_PAIR 1 /* Second entry in a pair. */ |
#define BFD_MACH_O_ARM_RELOC_SECTDIFF 2 /* Substract with a PAIR. */ |
#define BFD_MACH_O_ARM_RELOC_LOCAL_SECTDIFF 3 /* Like above, but local ref. */ |
#define BFD_MACH_O_ARM_RELOC_PB_LA_PTR 4 /* Prebound lazy pointer. */ |
#define BFD_MACH_O_ARM_RELOC_BR24 5 /* 24bit branch. */ |
#define BFD_MACH_O_THUMB_RELOC_BR22 6 /* 22bit branch. */ |
#define BFD_MACH_O_THUMB_32BIT_BRANCH 7 /* Obselete. */ |
#define BFD_MACH_O_ARM_RELOC_HALF 8 |
#define BFD_MACH_O_ARM_RELOC_HALF_SECTDIFF 9 |
#endif /* _MACH_O_ARM_H */ |
/contrib/toolchain/binutils/include/mach-o/codesign.h |
---|
0,0 → 1,85 |
/* Mach-O support for BFD. |
Copyright 2011 |
Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _MACH_O_CODESIGN_H |
#define _MACH_O_CODESIGN_H |
/* Codesign blob magics. */ |
/* Superblob containing all the components. */ |
#define BFD_MACH_O_CS_MAGIC_EMBEDDED_SIGNATURE 0xfade0cc0 |
/* Individual code requirement. */ |
#define BFD_MACH_O_CS_MAGIC_REQUIREMENT 0xfade0c00 |
/* Collection of code requirements, indexed by type. */ |
#define BFD_MACH_O_CS_MAGIC_REQUIREMENTS 0xfade0c01 |
/* Directory. */ |
#define BFD_MACH_O_CS_MAGIC_CODEDIRECTORY 0xfade0c02 |
/* Entitlements blob. */ |
#define BFD_MACH_O_CS_MAGIC_EMBEDDED_ENTITLEMENTS 0xfade7171 |
/* Blob container. */ |
#define BFD_MACH_O_CS_MAGIC_BLOB_WRAPPER 0xfade0b01 |
struct mach_o_codesign_codedirectory_external_v1 |
{ |
/* All the fields are in network byte order (big endian). */ |
unsigned char version[4]; |
unsigned char flags[4]; |
unsigned char hash_offset[4]; |
unsigned char ident_offset[4]; |
unsigned char nbr_special_slots[4]; |
unsigned char nbr_code_slots[4]; |
unsigned char code_limit[4]; |
unsigned char hash_size[1]; |
unsigned char hash_type[1]; |
unsigned char spare1[1]; |
unsigned char page_size[1]; |
unsigned char spare2[4]; |
}; |
struct mach_o_codesign_codedirectory_v1 |
{ |
unsigned int version; |
unsigned int flags; |
unsigned int hash_offset; |
unsigned int ident_offset; |
unsigned int nbr_special_slots; |
unsigned int nbr_code_slots; |
unsigned int code_limit; |
unsigned char hash_size; |
unsigned char hash_type; |
unsigned char spare1; |
unsigned char page_size; |
unsigned int spare2; |
}; |
/* Value for hash_type. */ |
#define BFD_MACH_O_CS_NO_HASH 0 |
#define BFD_MACH_O_CS_HASH_SHA1 1 |
#define BFD_MACH_O_CS_HASH_SHA256 2 |
#define BFD_MACH_O_CS_HASH_PRESTANDARD_SKEIN_160x256 32 /* Skein, 160 bits */ |
#define BFD_MACH_O_CS_HASH_PRESTANDARD_SKEIN_256x512 33 /* Skein, 256 bits */ |
#endif /* _MACH_O_CODESIGN_H */ |
/contrib/toolchain/binutils/include/mach-o/external.h |
---|
0,0 → 1,348 |
/* Mach-O support for BFD. |
Copyright 2011, 2012 |
Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _MACH_O_EXTERNAL_H |
#define _MACH_O_EXTERNAL_H |
struct mach_o_header_external |
{ |
unsigned char magic[4]; /* Magic number. */ |
unsigned char cputype[4]; /* CPU that this object is for. */ |
unsigned char cpusubtype[4]; /* CPU subtype. */ |
unsigned char filetype[4]; /* Type of file. */ |
unsigned char ncmds[4]; /* Number of load commands. */ |
unsigned char sizeofcmds[4]; /* Total size of load commands. */ |
unsigned char flags[4]; /* Flags. */ |
unsigned char reserved[4]; /* Reserved (on 64-bit version only). */ |
}; |
#define BFD_MACH_O_HEADER_SIZE 28 |
#define BFD_MACH_O_HEADER_64_SIZE 32 |
/* 32-bit section header. */ |
struct mach_o_section_32_external |
{ |
unsigned char sectname[16]; /* Section name. */ |
unsigned char segname[16]; /* Segment that the section belongs to. */ |
unsigned char addr[4]; /* Address of this section in memory. */ |
unsigned char size[4]; /* Size in bytes of this section. */ |
unsigned char offset[4]; /* File offset of this section. */ |
unsigned char align[4]; /* log2 of this section's alignment. */ |
unsigned char reloff[4]; /* File offset of this section's relocs. */ |
unsigned char nreloc[4]; /* Number of relocs for this section. */ |
unsigned char flags[4]; /* Section flags/attributes. */ |
unsigned char reserved1[4]; |
unsigned char reserved2[4]; |
}; |
#define BFD_MACH_O_SECTION_SIZE 68 |
/* 64-bit section header. */ |
struct mach_o_section_64_external |
{ |
unsigned char sectname[16]; /* Section name. */ |
unsigned char segname[16]; /* Segment that the section belongs to. */ |
unsigned char addr[8]; /* Address of this section in memory. */ |
unsigned char size[8]; /* Size in bytes of this section. */ |
unsigned char offset[4]; /* File offset of this section. */ |
unsigned char align[4]; /* log2 of this section's alignment. */ |
unsigned char reloff[4]; /* File offset of this section's relocs. */ |
unsigned char nreloc[4]; /* Number of relocs for this section. */ |
unsigned char flags[4]; /* Section flags/attributes. */ |
unsigned char reserved1[4]; |
unsigned char reserved2[4]; |
unsigned char reserved3[4]; |
}; |
#define BFD_MACH_O_SECTION_64_SIZE 80 |
struct mach_o_load_command_external |
{ |
unsigned char cmd[4]; /* The type of load command. */ |
unsigned char cmdsize[4]; /* Size in bytes of entire command. */ |
}; |
#define BFD_MACH_O_LC_SIZE 8 |
struct mach_o_segment_command_32_external |
{ |
unsigned char segname[16]; /* Name of this segment. */ |
unsigned char vmaddr[4]; /* Virtual memory address of this segment. */ |
unsigned char vmsize[4]; /* Size there, in bytes. */ |
unsigned char fileoff[4]; /* Offset in bytes of the data to be mapped. */ |
unsigned char filesize[4]; /* Size in bytes on disk. */ |
unsigned char maxprot[4]; /* Maximum permitted vm protection. */ |
unsigned char initprot[4]; /* Initial vm protection. */ |
unsigned char nsects[4]; /* Number of sections in this segment. */ |
unsigned char flags[4]; /* Flags that affect the loading. */ |
}; |
#define BFD_MACH_O_LC_SEGMENT_SIZE 56 /* Include the header. */ |
struct mach_o_segment_command_64_external |
{ |
unsigned char segname[16]; /* Name of this segment. */ |
unsigned char vmaddr[8]; /* Virtual memory address of this segment. */ |
unsigned char vmsize[8]; /* Size there, in bytes. */ |
unsigned char fileoff[8]; /* Offset in bytes of the data to be mapped. */ |
unsigned char filesize[8]; /* Size in bytes on disk. */ |
unsigned char maxprot[4]; /* Maximum permitted vm protection. */ |
unsigned char initprot[4]; /* Initial vm protection. */ |
unsigned char nsects[4]; /* Number of sections in this segment. */ |
unsigned char flags[4]; /* Flags that affect the loading. */ |
}; |
#define BFD_MACH_O_LC_SEGMENT_64_SIZE 72 /* Include the header. */ |
struct mach_o_reloc_info_external |
{ |
unsigned char r_address[4]; |
unsigned char r_symbolnum[4]; |
}; |
#define BFD_MACH_O_RELENT_SIZE 8 |
/* Relocations are based on 'address' being a section offset and an assumption |
that sections are never more than 2^24-1 bytes in size. Relocation data |
also carry information on type/size/PC-relative/extern and whether scattered |
or not [stored in the MSB of the r_address]. */ |
#define BFD_MACH_O_SR_SCATTERED 0x80000000 |
/* For a non-scattered reloc, the relocation info is found in r_symbolnum. |
Bytes 1 to 3 contain the symbol number (0xffffff, in a non-scattered PAIR). |
Byte 4 contains the relocation info - but with differing bit-positions |
dependent on target endian-ness - as below. */ |
#define BFD_MACH_O_LE_PCREL 0x01 |
#define BFD_MACH_O_LE_LENGTH_SHIFT 1 |
#define BFD_MACH_O_LE_EXTERN 0x08 |
#define BFD_MACH_O_LE_TYPE_SHIFT 4 |
#define BFD_MACH_O_BE_PCREL 0x80 |
#define BFD_MACH_O_BE_LENGTH_SHIFT 5 |
#define BFD_MACH_O_BE_EXTERN 0x10 |
#define BFD_MACH_O_BE_TYPE_SHIFT 0 |
/* The field sizes are the same for both BE and LE. */ |
#define BFD_MACH_O_LENGTH_MASK 0x03 |
#define BFD_MACH_O_TYPE_MASK 0x0f |
/* For a scattered reloc entry the info is contained in r_address. There |
is no need to discriminate on target endian-ness, since the design was |
arranged to produce the same layout on both. Scattered relocations are |
only used for local items, therefore there is no 'extern' field. */ |
#define BFD_MACH_O_SR_PCREL 0x40000000 |
#define BFD_MACH_O_GET_SR_LENGTH(s) (((s) >> 28) & 0x3) |
#define BFD_MACH_O_GET_SR_TYPE(s) (((s) >> 24) & 0x0f) |
#define BFD_MACH_O_GET_SR_ADDRESS(s) ((s) & 0x00ffffff) |
#define BFD_MACH_O_SET_SR_LENGTH(l) (((l) & 0x3) << 28) |
#define BFD_MACH_O_SET_SR_TYPE(t) (((t) & 0xf) << 24) |
#define BFD_MACH_O_SET_SR_ADDRESS(s) ((s) & 0x00ffffff) |
struct mach_o_symtab_command_external |
{ |
unsigned char symoff[4]; /* File offset of the symbol table. */ |
unsigned char nsyms[4]; /* Number of symbols. */ |
unsigned char stroff[4]; /* File offset of the string table. */ |
unsigned char strsize[4]; /* String table size. */ |
}; |
struct mach_o_nlist_external |
{ |
unsigned char n_strx[4]; |
unsigned char n_type[1]; |
unsigned char n_sect[1]; |
unsigned char n_desc[2]; |
unsigned char n_value[4]; |
}; |
#define BFD_MACH_O_NLIST_SIZE 12 |
struct mach_o_nlist_64_external |
{ |
unsigned char n_strx[4]; |
unsigned char n_type[1]; |
unsigned char n_sect[1]; |
unsigned char n_desc[2]; |
unsigned char n_value[8]; |
}; |
#define BFD_MACH_O_NLIST_64_SIZE 16 |
struct mach_o_thread_command_external |
{ |
unsigned char flavour[4]; |
unsigned char count[4]; |
}; |
/* For commands that just have a string or a path. */ |
struct mach_o_str_command_external |
{ |
unsigned char str[4]; |
}; |
struct mach_o_dylib_command_external |
{ |
unsigned char name[4]; |
unsigned char timestamp[4]; |
unsigned char current_version[4]; |
unsigned char compatibility_version[4]; |
}; |
struct mach_o_dysymtab_command_external |
{ |
unsigned char ilocalsym[4]; /* Index of. */ |
unsigned char nlocalsym[4]; /* Number of. */ |
unsigned char iextdefsym[4]; |
unsigned char nextdefsym[4]; |
unsigned char iundefsym[4]; |
unsigned char nundefsym[4]; |
unsigned char tocoff[4]; |
unsigned char ntoc[4]; |
unsigned char modtaboff[4]; |
unsigned char nmodtab[4]; |
unsigned char extrefsymoff[4]; |
unsigned char nextrefsyms[4]; |
unsigned char indirectsymoff[4]; |
unsigned char nindirectsyms[4]; |
unsigned char extreloff[4]; |
unsigned char nextrel[4]; |
unsigned char locreloff[4]; |
unsigned char nlocrel[4]; |
}; |
struct mach_o_dylib_module_external |
{ |
unsigned char module_name[4]; |
unsigned char iextdefsym[4]; |
unsigned char nextdefsym[4]; |
unsigned char irefsym[4]; |
unsigned char nrefsym[4]; |
unsigned char ilocalsym[4]; |
unsigned char nlocalsym[4]; |
unsigned char iextrel[4]; |
unsigned char nextrel[4]; |
unsigned char iinit_iterm[4]; |
unsigned char ninit_nterm[4]; |
unsigned char objc_module_info_addr[4]; |
unsigned char objc_module_info_size[4]; |
}; |
#define BFD_MACH_O_DYLIB_MODULE_SIZE 52 |
struct mach_o_dylib_module_64_external |
{ |
unsigned char module_name[4]; |
unsigned char iextdefsym[4]; |
unsigned char nextdefsym[4]; |
unsigned char irefsym[4]; |
unsigned char nrefsym[4]; |
unsigned char ilocalsym[4]; |
unsigned char nlocalsym[4]; |
unsigned char iextrel[4]; |
unsigned char nextrel[4]; |
unsigned char iinit_iterm[4]; |
unsigned char ninit_nterm[4]; |
unsigned char objc_module_info_size[4]; |
unsigned char objc_module_info_addr[8]; |
}; |
#define BFD_MACH_O_DYLIB_MODULE_64_SIZE 56 |
struct mach_o_dylib_table_of_contents_external |
{ |
unsigned char symbol_index[4]; |
unsigned char module_index[4]; |
}; |
#define BFD_MACH_O_TABLE_OF_CONTENT_SIZE 8 |
struct mach_o_linkedit_data_command_external |
{ |
unsigned char dataoff[4]; |
unsigned char datasize[4]; |
}; |
struct mach_o_dyld_info_command_external |
{ |
unsigned char rebase_off[4]; |
unsigned char rebase_size[4]; |
unsigned char bind_off[4]; |
unsigned char bind_size[4]; |
unsigned char weak_bind_off[4]; |
unsigned char weak_bind_size[4]; |
unsigned char lazy_bind_off[4]; |
unsigned char lazy_bind_size[4]; |
unsigned char export_off[4]; |
unsigned char export_size[4]; |
}; |
struct mach_o_version_min_command_external |
{ |
unsigned char version[4]; |
unsigned char reserved[4]; |
}; |
struct mach_o_encryption_info_command_external |
{ |
unsigned char cryptoff[4]; /* File offset of the encrypted area. */ |
unsigned char cryptsize[4]; /* Size of the encrypted area. */ |
unsigned char cryptid[4]; /* Encryption method. */ |
}; |
struct mach_o_fvmlib_command_external |
{ |
unsigned char name[4]; /* Offset of the name. */ |
unsigned char minor_version[4]; |
unsigned char header_addr[4]; |
}; |
struct mach_o_entry_point_command_external |
{ |
unsigned char entryoff[8]; /* File offset of the entry point. */ |
unsigned char stacksize[8]; /* Initial stack size, if no null. */ |
}; |
struct mach_o_source_version_command_external |
{ |
unsigned char version[8]; /* Version A.B.C.D.E, with 10 bits for B-E, |
and 24 bits for A. */ |
}; |
/* The LD_DATA_IN_CODE command use a linkedit_data_command that points to |
a table of entries. */ |
struct mach_o_data_in_code_entry_external |
{ |
unsigned char offset[4]; /* Offset from the mach_header. */ |
unsigned char length[2]; /* Number of bytes. */ |
unsigned char kind[2]; /* Kind. See BFD_MACH_O_DICE_ values. */ |
}; |
struct mach_o_fat_header_external |
{ |
unsigned char magic[4]; |
unsigned char nfat_arch[4]; /* Number of components. */ |
}; |
struct mach_o_fat_arch_external |
{ |
unsigned char cputype[4]; |
unsigned char cpusubtype[4]; |
unsigned char offset[4]; /* File offset of the member. */ |
unsigned char size[4]; /* Size of the member. */ |
unsigned char align[4]; /* Power of 2. */ |
}; |
#endif /* _MACH_O_EXTERNAL_H */ |
/contrib/toolchain/binutils/include/mach-o/loader.h |
---|
0,0 → 1,378 |
/* Mach-O support for BFD. |
Copyright 2011, 2012 |
Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _MACH_O_LOADER_H |
#define _MACH_O_LOADER_H |
/* Constants for header. */ |
typedef enum bfd_mach_o_mach_header_magic |
{ |
BFD_MACH_O_MH_MAGIC = 0xfeedface, |
BFD_MACH_O_MH_CIGAM = 0xcefaedfe, |
BFD_MACH_O_MH_MAGIC_64 = 0xfeedfacf, |
BFD_MACH_O_MH_CIGAM_64 = 0xcffaedfe |
} |
bfd_mach_o_mach_header_magic; |
#define BFD_MACH_O_CPU_IS64BIT 0x1000000 |
typedef enum bfd_mach_o_cpu_type |
{ |
BFD_MACH_O_CPU_TYPE_VAX = 1, |
BFD_MACH_O_CPU_TYPE_MC680x0 = 6, |
BFD_MACH_O_CPU_TYPE_I386 = 7, |
BFD_MACH_O_CPU_TYPE_MIPS = 8, |
BFD_MACH_O_CPU_TYPE_MC98000 = 10, |
BFD_MACH_O_CPU_TYPE_HPPA = 11, |
BFD_MACH_O_CPU_TYPE_ARM = 12, |
BFD_MACH_O_CPU_TYPE_MC88000 = 13, |
BFD_MACH_O_CPU_TYPE_SPARC = 14, |
BFD_MACH_O_CPU_TYPE_I860 = 15, |
BFD_MACH_O_CPU_TYPE_ALPHA = 16, |
BFD_MACH_O_CPU_TYPE_POWERPC = 18, |
BFD_MACH_O_CPU_TYPE_POWERPC_64 = (BFD_MACH_O_CPU_TYPE_POWERPC | BFD_MACH_O_CPU_IS64BIT), |
BFD_MACH_O_CPU_TYPE_X86_64 = (BFD_MACH_O_CPU_TYPE_I386 | BFD_MACH_O_CPU_IS64BIT) |
} |
bfd_mach_o_cpu_type; |
typedef enum bfd_mach_o_cpu_subtype |
{ |
/* i386. */ |
BFD_MACH_O_CPU_SUBTYPE_X86_ALL = 3, |
/* arm. */ |
BFD_MACH_O_CPU_SUBTYPE_ARM_ALL = 0, |
BFD_MACH_O_CPU_SUBTYPE_ARM_V4T = 5, |
BFD_MACH_O_CPU_SUBTYPE_ARM_V6 = 6, |
BFD_MACH_O_CPU_SUBTYPE_ARM_V5TEJ = 7, |
BFD_MACH_O_CPU_SUBTYPE_ARM_XSCALE = 8, |
BFD_MACH_O_CPU_SUBTYPE_ARM_V7 = 9 |
} |
bfd_mach_o_cpu_subtype; |
typedef enum bfd_mach_o_filetype |
{ |
BFD_MACH_O_MH_OBJECT = 0x01, |
BFD_MACH_O_MH_EXECUTE = 0x02, |
BFD_MACH_O_MH_FVMLIB = 0x03, |
BFD_MACH_O_MH_CORE = 0x04, |
BFD_MACH_O_MH_PRELOAD = 0x05, |
BFD_MACH_O_MH_DYLIB = 0x06, |
BFD_MACH_O_MH_DYLINKER = 0x07, |
BFD_MACH_O_MH_BUNDLE = 0x08, |
BFD_MACH_O_MH_DYLIB_STUB = 0x09, |
BFD_MACH_O_MH_DSYM = 0x0a, |
BFD_MACH_O_MH_KEXT_BUNDLE = 0x0b |
} |
bfd_mach_o_filetype; |
typedef enum bfd_mach_o_header_flags |
{ |
BFD_MACH_O_MH_NOUNDEFS = 0x0000001, |
BFD_MACH_O_MH_INCRLINK = 0x0000002, |
BFD_MACH_O_MH_DYLDLINK = 0x0000004, |
BFD_MACH_O_MH_BINDATLOAD = 0x0000008, |
BFD_MACH_O_MH_PREBOUND = 0x0000010, |
BFD_MACH_O_MH_SPLIT_SEGS = 0x0000020, |
BFD_MACH_O_MH_LAZY_INIT = 0x0000040, |
BFD_MACH_O_MH_TWOLEVEL = 0x0000080, |
BFD_MACH_O_MH_FORCE_FLAT = 0x0000100, |
BFD_MACH_O_MH_NOMULTIDEFS = 0x0000200, |
BFD_MACH_O_MH_NOFIXPREBINDING = 0x0000400, |
BFD_MACH_O_MH_PREBINDABLE = 0x0000800, |
BFD_MACH_O_MH_ALLMODSBOUND = 0x0001000, |
BFD_MACH_O_MH_SUBSECTIONS_VIA_SYMBOLS = 0x0002000, |
BFD_MACH_O_MH_CANONICAL = 0x0004000, |
BFD_MACH_O_MH_WEAK_DEFINES = 0x0008000, |
BFD_MACH_O_MH_BINDS_TO_WEAK = 0x0010000, |
BFD_MACH_O_MH_ALLOW_STACK_EXECUTION = 0x0020000, |
BFD_MACH_O_MH_ROOT_SAFE = 0x0040000, |
BFD_MACH_O_MH_SETUID_SAFE = 0x0080000, |
BFD_MACH_O_MH_NO_REEXPORTED_DYLIBS = 0x0100000, |
BFD_MACH_O_MH_PIE = 0x0200000, |
BFD_MACH_O_MH_DEAD_STRIPPABLE_DYLIB = 0x0400000, |
BFD_MACH_O_MH_HAS_TLV_DESCRIPTORS = 0x0800000, |
BFD_MACH_O_MH_NO_HEAP_EXECUTION = 0x1000000 |
} |
bfd_mach_o_header_flags; |
/* Load command constants. */ |
#define BFD_MACH_O_LC_REQ_DYLD 0x80000000 |
typedef enum bfd_mach_o_load_command_type |
{ |
BFD_MACH_O_LC_SEGMENT = 0x1, /* File segment to be mapped. */ |
BFD_MACH_O_LC_SYMTAB = 0x2, /* Link-edit stab symbol table info (obsolete). */ |
BFD_MACH_O_LC_SYMSEG = 0x3, /* Link-edit gdb symbol table info. */ |
BFD_MACH_O_LC_THREAD = 0x4, /* Thread. */ |
BFD_MACH_O_LC_UNIXTHREAD = 0x5, /* UNIX thread (includes a stack). */ |
BFD_MACH_O_LC_LOADFVMLIB = 0x6, /* Load a fixed VM shared library. */ |
BFD_MACH_O_LC_IDFVMLIB = 0x7, /* Fixed VM shared library id. */ |
BFD_MACH_O_LC_IDENT = 0x8, /* Object identification information (obsolete). */ |
BFD_MACH_O_LC_FVMFILE = 0x9, /* Fixed VM file inclusion. */ |
BFD_MACH_O_LC_PREPAGE = 0xa, /* Prepage command (internal use). */ |
BFD_MACH_O_LC_DYSYMTAB = 0xb, /* Dynamic link-edit symbol table info. */ |
BFD_MACH_O_LC_LOAD_DYLIB = 0xc, /* Load a dynamically linked shared library. */ |
BFD_MACH_O_LC_ID_DYLIB = 0xd, /* Dynamically linked shared lib identification. */ |
BFD_MACH_O_LC_LOAD_DYLINKER = 0xe, /* Load a dynamic linker. */ |
BFD_MACH_O_LC_ID_DYLINKER = 0xf, /* Dynamic linker identification. */ |
BFD_MACH_O_LC_PREBOUND_DYLIB = 0x10, /* Modules prebound for a dynamically. */ |
BFD_MACH_O_LC_ROUTINES = 0x11, /* Image routines. */ |
BFD_MACH_O_LC_SUB_FRAMEWORK = 0x12, /* Sub framework. */ |
BFD_MACH_O_LC_SUB_UMBRELLA = 0x13, /* Sub umbrella. */ |
BFD_MACH_O_LC_SUB_CLIENT = 0x14, /* Sub client. */ |
BFD_MACH_O_LC_SUB_LIBRARY = 0x15, /* Sub library. */ |
BFD_MACH_O_LC_TWOLEVEL_HINTS = 0x16, /* Two-level namespace lookup hints. */ |
BFD_MACH_O_LC_PREBIND_CKSUM = 0x17, /* Prebind checksum. */ |
/* Load a dynamically linked shared library that is allowed to be |
missing (weak). */ |
BFD_MACH_O_LC_LOAD_WEAK_DYLIB = 0x18, |
BFD_MACH_O_LC_SEGMENT_64 = 0x19, /* 64-bit segment of this file to be |
mapped. */ |
BFD_MACH_O_LC_ROUTINES_64 = 0x1a, /* Address of the dyld init routine |
in a dylib. */ |
BFD_MACH_O_LC_UUID = 0x1b, /* 128-bit UUID of the executable. */ |
BFD_MACH_O_LC_RPATH = 0x1c, /* Run path addiions. */ |
BFD_MACH_O_LC_CODE_SIGNATURE = 0x1d, /* Local of code signature. */ |
BFD_MACH_O_LC_SEGMENT_SPLIT_INFO = 0x1e, /* Local of info to split seg. */ |
BFD_MACH_O_LC_REEXPORT_DYLIB = 0x1f, /* Load and re-export lib. */ |
BFD_MACH_O_LC_LAZY_LOAD_DYLIB = 0x20, /* Delay load of lib until use. */ |
BFD_MACH_O_LC_ENCRYPTION_INFO = 0x21, /* Encrypted segment info. */ |
BFD_MACH_O_LC_DYLD_INFO = 0x22, /* Compressed dyld information. */ |
BFD_MACH_O_LC_LOAD_UPWARD_DYLIB = 0x23, /* Load upward dylib. */ |
BFD_MACH_O_LC_VERSION_MIN_MACOSX = 0x24, /* Minimal MacOSX version. */ |
BFD_MACH_O_LC_VERSION_MIN_IPHONEOS = 0x25, /* Minimal IOS version. */ |
BFD_MACH_O_LC_FUNCTION_STARTS = 0x26, /* Compressed table of func start. */ |
BFD_MACH_O_LC_DYLD_ENVIRONMENT = 0x27, /* Env variable string for dyld. */ |
BFD_MACH_O_LC_MAIN = 0x28, /* Entry point. */ |
BFD_MACH_O_LC_DATA_IN_CODE = 0x29, /* Table of non-instructions. */ |
BFD_MACH_O_LC_SOURCE_VERSION = 0x2a, /* Source version. */ |
BFD_MACH_O_LC_DYLIB_CODE_SIGN_DRS = 0x2b /* DRs from dylibs. */ |
} |
bfd_mach_o_load_command_type; |
/* Section constants. */ |
/* Constants for the type of a section. */ |
typedef enum bfd_mach_o_section_type |
{ |
/* Regular section. */ |
BFD_MACH_O_S_REGULAR = 0x0, |
/* Zero fill on demand section. */ |
BFD_MACH_O_S_ZEROFILL = 0x1, |
/* Section with only literal C strings. */ |
BFD_MACH_O_S_CSTRING_LITERALS = 0x2, |
/* Section with only 4 byte literals. */ |
BFD_MACH_O_S_4BYTE_LITERALS = 0x3, |
/* Section with only 8 byte literals. */ |
BFD_MACH_O_S_8BYTE_LITERALS = 0x4, |
/* Section with only pointers to literals. */ |
BFD_MACH_O_S_LITERAL_POINTERS = 0x5, |
/* For the two types of symbol pointers sections and the symbol stubs |
section they have indirect symbol table entries. For each of the |
entries in the section the indirect symbol table entries, in |
corresponding order in the indirect symbol table, start at the index |
stored in the reserved1 field of the section structure. Since the |
indirect symbol table entries correspond to the entries in the |
section the number of indirect symbol table entries is inferred from |
the size of the section divided by the size of the entries in the |
section. For symbol pointers sections the size of the entries in |
the section is 4 bytes and for symbol stubs sections the byte size |
of the stubs is stored in the reserved2 field of the section |
structure. */ |
/* Section with only non-lazy symbol pointers. */ |
BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS = 0x6, |
/* Section with only lazy symbol pointers. */ |
BFD_MACH_O_S_LAZY_SYMBOL_POINTERS = 0x7, |
/* Section with only symbol stubs, byte size of stub in the reserved2 |
field. */ |
BFD_MACH_O_S_SYMBOL_STUBS = 0x8, |
/* Section with only function pointers for initialization. */ |
BFD_MACH_O_S_MOD_INIT_FUNC_POINTERS = 0x9, |
/* Section with only function pointers for termination. */ |
BFD_MACH_O_S_MOD_FINI_FUNC_POINTERS = 0xa, |
/* Section contains symbols that are coalesced by the linkers. */ |
BFD_MACH_O_S_COALESCED = 0xb, |
/* Zero fill on demand section (possibly larger than 4 GB). */ |
BFD_MACH_O_S_GB_ZEROFILL = 0xc, |
/* Section with only pairs of function pointers for interposing. */ |
BFD_MACH_O_S_INTERPOSING = 0xd, |
/* Section with only 16 byte literals. */ |
BFD_MACH_O_S_16BYTE_LITERALS = 0xe, |
/* Section contains DTrace Object Format. */ |
BFD_MACH_O_S_DTRACE_DOF = 0xf, |
/* Section with only lazy symbol pointers to lazy loaded dylibs. */ |
BFD_MACH_O_S_LAZY_DYLIB_SYMBOL_POINTERS = 0x10 |
} |
bfd_mach_o_section_type; |
/* The flags field of a section structure is separated into two parts a section |
type and section attributes. The section types are mutually exclusive (it |
can only have one type) but the section attributes are not (it may have more |
than one attribute). */ |
#define BFD_MACH_O_SECTION_TYPE_MASK 0x000000ff |
/* Constants for the section attributes part of the flags field of a section |
structure. */ |
#define BFD_MACH_O_SECTION_ATTRIBUTES_MASK 0xffffff00 |
/* System setable attributes. */ |
#define BFD_MACH_O_SECTION_ATTRIBUTES_SYS 0x00ffff00 |
/* User attributes. */ |
#define BFD_MACH_O_SECTION_ATTRIBUTES_USR 0xff000000 |
typedef enum bfd_mach_o_section_attribute |
{ |
/* Section has no specified attibutes. */ |
BFD_MACH_O_S_ATTR_NONE = 0, |
/* Section has local relocation entries. */ |
BFD_MACH_O_S_ATTR_LOC_RELOC = 0x00000100, |
/* Section has external relocation entries. */ |
BFD_MACH_O_S_ATTR_EXT_RELOC = 0x00000200, |
/* Section contains some machine instructions. */ |
BFD_MACH_O_S_ATTR_SOME_INSTRUCTIONS = 0x00000400, |
/* A debug section. */ |
BFD_MACH_O_S_ATTR_DEBUG = 0x02000000, |
/* Used with i386 stubs. */ |
BFD_MACH_O_S_SELF_MODIFYING_CODE = 0x04000000, |
/* Blocks are live if they reference live blocks. */ |
BFD_MACH_O_S_ATTR_LIVE_SUPPORT = 0x08000000, |
/* No dead stripping. */ |
BFD_MACH_O_S_ATTR_NO_DEAD_STRIP = 0x10000000, |
/* Section symbols can be stripped in files with MH_DYLDLINK flag. */ |
BFD_MACH_O_S_ATTR_STRIP_STATIC_SYMS = 0x20000000, |
/* Section contains coalesced symbols that are not to be in the TOC of an |
archive. */ |
BFD_MACH_O_S_ATTR_NO_TOC = 0x40000000, |
/* Section contains only true machine instructions. */ |
BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS = 0x80000000 |
} |
bfd_mach_o_section_attribute; |
/* Symbol constants. */ |
/* Symbol n_type values. */ |
#define BFD_MACH_O_N_STAB 0xe0 /* If any of these bits set, a symbolic debugging entry. */ |
#define BFD_MACH_O_N_PEXT 0x10 /* Private external symbol bit. */ |
#define BFD_MACH_O_N_TYPE 0x0e /* Mask for the type bits. */ |
#define BFD_MACH_O_N_EXT 0x01 /* External symbol bit, set for external symbols. */ |
#define BFD_MACH_O_N_UNDF 0x00 /* Undefined, n_sect == NO_SECT. */ |
#define BFD_MACH_O_N_ABS 0x02 /* Absolute, n_sect == NO_SECT. */ |
#define BFD_MACH_O_N_INDR 0x0a /* Indirect. */ |
#define BFD_MACH_O_N_PBUD 0x0c /* Prebound undefined (defined in a dylib). */ |
#define BFD_MACH_O_N_SECT 0x0e /* Defined in section number n_sect. */ |
#define BFD_MACH_O_NO_SECT 0 /* Symbol not in any section of the image. */ |
/* Symbol n_desc reference flags. */ |
#define BFD_MACH_O_REFERENCE_MASK 0x07 |
#define BFD_MACH_O_REFERENCE_FLAG_UNDEFINED_NON_LAZY 0x00 |
#define BFD_MACH_O_REFERENCE_FLAG_UNDEFINED_LAZY 0x01 |
#define BFD_MACH_O_REFERENCE_FLAG_DEFINED 0x02 |
#define BFD_MACH_O_REFERENCE_FLAG_PRIVATE_DEFINED 0x03 |
#define BFD_MACH_O_REFERENCE_FLAG_PRIVATE_UNDEFINED_NON_LAZY 0x04 |
#define BFD_MACH_O_REFERENCE_FLAG_PRIVATE_UNDEFINED_LAZY 0x05 |
#define BFD_MACH_O_REFERENCED_DYNAMICALLY 0x10 |
#define BFD_MACH_O_N_DESC_DISCARDED 0x20 |
#define BFD_MACH_O_N_NO_DEAD_STRIP 0x20 |
#define BFD_MACH_O_N_WEAK_REF 0x40 |
#define BFD_MACH_O_N_WEAK_DEF 0x80 |
#define BFD_MACH_O_N_REF_TO_WEAK 0x80 |
#define BFD_MACH_O_N_ARM_THUMB_DEF 0x08 |
#define BFD_MACH_O_N_SYMBOL_RESOLVER 0x100 |
#define BFD_MACH_O_INDIRECT_SYM_LOCAL 0x80000000 |
#define BFD_MACH_O_INDIRECT_SYM_ABS 0x40000000 |
/* Constants for DATA_IN_CODE entries. */ |
typedef enum bfd_mach_o_data_in_code_entry_kind |
{ |
BFD_MACH_O_DICE_KIND_DATA = 0x0001, /* Data */ |
BFD_MACH_O_DICE_JUMP_TABLES8 = 0x0002, /* 1 byte jump tables. */ |
BFD_MACH_O_DICE_JUMP_TABLES16 = 0x0003, /* 2 bytes. */ |
BFD_MACH_O_DICE_JUMP_TABLES32 = 0x0004, /* 4 bytes. */ |
BFD_MACH_O_DICE_ABS_JUMP_TABLES32 = 0x0005 /* Absolute jump table. */ |
} bfd_mach_o_data_in_code_entry_kind; |
/* Thread constants. */ |
typedef enum bfd_mach_o_ppc_thread_flavour |
{ |
BFD_MACH_O_PPC_THREAD_STATE = 1, |
BFD_MACH_O_PPC_FLOAT_STATE = 2, |
BFD_MACH_O_PPC_EXCEPTION_STATE = 3, |
BFD_MACH_O_PPC_VECTOR_STATE = 4, |
BFD_MACH_O_PPC_THREAD_STATE64 = 5, |
BFD_MACH_O_PPC_EXCEPTION_STATE64 = 6, |
BFD_MACH_O_PPC_THREAD_STATE_NONE = 7 |
} |
bfd_mach_o_ppc_thread_flavour; |
/* Defined in <mach/i386/thread_status.h> */ |
typedef enum bfd_mach_o_i386_thread_flavour |
{ |
BFD_MACH_O_x86_THREAD_STATE32 = 1, |
BFD_MACH_O_x86_FLOAT_STATE32 = 2, |
BFD_MACH_O_x86_EXCEPTION_STATE32 = 3, |
BFD_MACH_O_x86_THREAD_STATE64 = 4, |
BFD_MACH_O_x86_FLOAT_STATE64 = 5, |
BFD_MACH_O_x86_EXCEPTION_STATE64 = 6, |
BFD_MACH_O_x86_THREAD_STATE = 7, |
BFD_MACH_O_x86_FLOAT_STATE = 8, |
BFD_MACH_O_x86_EXCEPTION_STATE = 9, |
BFD_MACH_O_x86_DEBUG_STATE32 = 10, |
BFD_MACH_O_x86_DEBUG_STATE64 = 11, |
BFD_MACH_O_x86_DEBUG_STATE = 12, |
BFD_MACH_O_x86_THREAD_STATE_NONE = 13 |
} |
bfd_mach_o_i386_thread_flavour; |
#endif /* _MACH_O_LOADER_H */ |
/contrib/toolchain/binutils/include/mach-o/reloc.h |
---|
0,0 → 1,33 |
/* Mach-O support for BFD. |
Copyright 2011, 2012 |
Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _MACH_O_RELOC_H |
#define _MACH_O_RELOC_H |
/* Generic relocation types (used by i386). */ |
#define BFD_MACH_O_GENERIC_RELOC_VANILLA 0 |
#define BFD_MACH_O_GENERIC_RELOC_PAIR 1 |
#define BFD_MACH_O_GENERIC_RELOC_SECTDIFF 2 |
#define BFD_MACH_O_GENERIC_RELOC_PB_LA_PTR 3 |
#define BFD_MACH_O_GENERIC_RELOC_LOCAL_SECTDIFF 4 |
#define BFD_MACH_O_GENERIC_RELOC_TLV 5 |
#endif /* _MACH_O_RELOC_H */ |
/contrib/toolchain/binutils/include/mach-o/x86-64.h |
---|
0,0 → 1,37 |
/* Mach-O support for BFD. |
Copyright 2011 |
Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _MACH_O_X86_64_H |
#define _MACH_O_X86_64_H |
/* X86-64 relocations. */ |
#define BFD_MACH_O_X86_64_RELOC_UNSIGNED 0 /* Absolute addresses. */ |
#define BFD_MACH_O_X86_64_RELOC_SIGNED 1 /* 32-bit disp. */ |
#define BFD_MACH_O_X86_64_RELOC_BRANCH 2 /* 32-bit pcrel disp. */ |
#define BFD_MACH_O_X86_64_RELOC_GOT_LOAD 3 /* Movq load of a GOT entry. */ |
#define BFD_MACH_O_X86_64_RELOC_GOT 4 /* GOT reference. */ |
#define BFD_MACH_O_X86_64_RELOC_SUBTRACTOR 5 /* Symbol difference. */ |
#define BFD_MACH_O_X86_64_RELOC_SIGNED_1 6 /* 32-bit signed disp -1. */ |
#define BFD_MACH_O_X86_64_RELOC_SIGNED_2 7 /* 32-bit signed disp -2. */ |
#define BFD_MACH_O_X86_64_RELOC_SIGNED_4 8 /* 32-bit signed disp -4. */ |
#define BFD_MACH_O_X86_64_RELOC_TLV 9 /* Thread local variables. */ |
#endif /* _MACH_O_X86_64_H */ |
/contrib/toolchain/binutils/include/md5.h |
---|
0,0 → 1,154 |
/* md5.h - Declaration of functions and data types used for MD5 sum |
computing library functions. |
Copyright 1995, 1996, 2000 Free Software Foundation, Inc. |
NOTE: The canonical source of this file is maintained with the GNU C |
Library. Bugs can be reported to bug-glibc@prep.ai.mit.edu. |
This program is free software; you can redistribute it and/or modify it |
under the terms of the GNU General Public License as published by the |
Free Software Foundation; either version 2, or (at your option) any |
later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _MD5_H |
#define _MD5_H 1 |
#include <stdio.h> |
#if defined HAVE_LIMITS_H || _LIBC |
# include <limits.h> |
#endif |
#include "ansidecl.h" |
/* The following contortions are an attempt to use the C preprocessor |
to determine an unsigned integral type that is 32 bits wide. An |
alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but |
doing that would require that the configure script compile and *run* |
the resulting executable. Locally running cross-compiled executables |
is usually not possible. */ |
#ifdef _LIBC |
# include <sys/types.h> |
typedef u_int32_t md5_uint32; |
typedef uintptr_t md5_uintptr; |
#elif defined (HAVE_SYS_TYPES_H) && defined (HAVE_STDINT_H) |
#include <stdint.h> |
#include <sys/types.h> |
typedef uint32_t md5_uint32; |
typedef uintptr_t md5_uintptr; |
#else |
# define INT_MAX_32_BITS 2147483647 |
/* If UINT_MAX isn't defined, assume it's a 32-bit type. |
This should be valid for all systems GNU cares about because |
that doesn't include 16-bit systems, and only modern systems |
(that certainly have <limits.h>) have 64+-bit integral types. */ |
# ifndef INT_MAX |
# define INT_MAX INT_MAX_32_BITS |
# endif |
# if INT_MAX == INT_MAX_32_BITS |
typedef unsigned int md5_uint32; |
# else |
# if SHRT_MAX == INT_MAX_32_BITS |
typedef unsigned short md5_uint32; |
# else |
# if LONG_MAX == INT_MAX_32_BITS |
typedef unsigned long md5_uint32; |
# else |
/* The following line is intended to evoke an error. |
Using #error is not portable enough. */ |
"Cannot determine unsigned 32-bit data type." |
# endif |
# endif |
# endif |
/* We have to make a guess about the integer type equivalent in size |
to pointers which should always be correct. */ |
typedef unsigned long int md5_uintptr; |
#endif |
#ifdef __cplusplus |
extern "C" { |
#endif |
/* Structure to save state of computation between the single steps. */ |
struct md5_ctx |
{ |
md5_uint32 A; |
md5_uint32 B; |
md5_uint32 C; |
md5_uint32 D; |
md5_uint32 total[2]; |
md5_uint32 buflen; |
char buffer[128] ATTRIBUTE_ALIGNED_ALIGNOF(md5_uint32); |
}; |
/* |
* The following three functions are build up the low level used in |
* the functions `md5_stream' and `md5_buffer'. |
*/ |
/* Initialize structure containing state of computation. |
(RFC 1321, 3.3: Step 3) */ |
extern void md5_init_ctx (struct md5_ctx *ctx); |
/* Starting with the result of former calls of this function (or the |
initialization function update the context for the next LEN bytes |
starting at BUFFER. |
It is necessary that LEN is a multiple of 64!!! */ |
extern void md5_process_block (const void *buffer, size_t len, |
struct md5_ctx *ctx); |
/* Starting with the result of former calls of this function (or the |
initialization function update the context for the next LEN bytes |
starting at BUFFER. |
It is NOT required that LEN is a multiple of 64. */ |
extern void md5_process_bytes (const void *buffer, size_t len, |
struct md5_ctx *ctx); |
/* Process the remaining bytes in the buffer and put result from CTX |
in first 16 bytes following RESBUF. The result is always in little |
endian byte order, so that a byte-wise output yields to the wanted |
ASCII representation of the message digest. |
IMPORTANT: On some systems it is required that RESBUF is correctly |
aligned for a 32 bits value. */ |
extern void *md5_finish_ctx (struct md5_ctx *ctx, void *resbuf); |
/* Put result from CTX in first 16 bytes following RESBUF. The result is |
always in little endian byte order, so that a byte-wise output yields |
to the wanted ASCII representation of the message digest. |
IMPORTANT: On some systems it is required that RESBUF is correctly |
aligned for a 32 bits value. */ |
extern void *md5_read_ctx (const struct md5_ctx *ctx, void *resbuf); |
/* Compute MD5 message digest for bytes read from STREAM. The |
resulting message digest number will be written into the 16 bytes |
beginning at RESBLOCK. */ |
extern int md5_stream (FILE *stream, void *resblock); |
/* Compute MD5 message digest for LEN bytes beginning at BUFFER. The |
result is always in little endian byte order, so that a byte-wise |
output yields to the wanted ASCII representation of the message |
digest. */ |
extern void *md5_buffer (const char *buffer, size_t len, void *resblock); |
#ifdef __cplusplus |
} |
#endif |
#endif |
/contrib/toolchain/binutils/include/nlm/ChangeLog |
---|
0,0 → 1,119 |
2010-04-15 Nick Clifton <nickc@redhat.com> |
* alpha-ext.h: Update copyright notice to use GPLv3. |
* common.h: Likewise. |
* external.h: Likewise. |
* i386-ext.h: Likewise. |
* internal.h: Likewise. |
* ppc-ext.h: Likewise. |
* sparc32-ext.h: Likewise. |
2005-05-10 Nick Clifton <nickc@redhat.com> |
* Update the address and phone number of the FSF organization in |
the GPL notices in the following files: |
alpha-ext.h, common.h, external.h, i386-ext.h, internal.h, |
ppc-ext.h, sparc32-ext.h |
2003-08-07 Alan Modra <amodra@bigpond.net.au> |
* internal.h (Nlm_Internal_Custom_Header): Replace PTR with void *. |
2001-10-02 Alan Modra <amodra@bigpond.net.au> |
* common.h (NLM_CAT, NLM_CAT3): Don't define. |
(NLM_CAT4): Update conditions under which this is defined. Document |
why CONCAT4 can't be used. |
1994-05-06 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* external.h (nlmNAME(External_Custom_Header)): Add length, |
dataOffset, and dataStamp field. |
(nlmNAME(External_Cygnus_Ext_Header)): Remove. |
* internal.h (Nlm_Internal_Custom_Header): Add hdrLength, |
dataOffset, dataStamp and hdr fields. |
1994-04-22 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* external.h (struct nlmNAME(external_cygnus_ext_header)): Rename |
from nlmNAME(external_cygnus_section_header). Change stamp field |
to 8 bytes. Add bytes field. |
* internal.h (nlm_internal_cygnus_ext_header): Rename from |
nlm_internal_cygnus_section_header. Change stamp field to 8 |
bytes. |
1994-04-21 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* internal.h (struct nlm_internal_cygnus_section_header): Define. |
* external.h (struct nlmNAME(external_cygnus_section_header): |
Define. |
1994-04-20 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* internal.h (struct nlm_internal_custom_header): Remove |
debugRecOffset and debugRecLength fields. Add data field. |
* external.h (struct nlmNAME(external_custom_header)): Remove |
debugRecOffset and debugRecLength fields. |
1994-02-07 Jim Kingdon (kingdon@lioth.cygnus.com) |
* internal.h: Change HOST_64_BIT to BFD_HOST_64_BIT. |
1993-12-02 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* alpha-ext.h: New file describing formats of information in Alpha |
NetWare files. |
* common.h: Define some non-external Alpha information. |
1993-11-17 Sean Eric Fagan (sef@cygnus.com) |
* external.h: Don't define external_fixed_header here. |
* i386-ext.h, sparc32-ext.h: New header files to define |
external_fixed_header for particular CPU's. |
1993-10-27 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* internal.h (Nlm_Internal_Extended_Header): Added fields |
sharedDebugRecordOffset and sharedDebugRecordCount. |
* external.h (NlmNAME(External_Extended_Header)): Likewise. |
* common.h (NLM_SIGNATURE): Do not define (it's different for each |
backend). |
1993-08-31 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* internal.h: Change length fields of type char to type unsigned |
char. |
1993-07-31 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* common.h (NLM_HIBIT, NLM_HEADER_VERSION): Define. |
1993-07-22 Fred Fish (fnf@deneb.cygnus.com) |
* common.h (NLM_CAT*, NLM_ARCH_SIZE, NLM_TARGET_LONG_SIZE, |
NLM_TARGET_ADDRESS_SIZE, NLM_NAME, NlmNAME, nlmNAME): New |
macros. |
* external.h (TARGET_LONG_SIZE, TARGET_ADDRESS_SIZE): Remove |
macros, convert usages to NLM_ equivalents. |
* external.h: Use nlmNAME and NlmNAME macros to derive both |
32 and 64 bit versions. |
1993-07-20 Fred Fish (fnf@deneb.cygnus.com) |
* (common.h, external.h, internal.h): New files for NLM/NetWare |
support. |
Copyright (C) 1993-2012 Free Software Foundation, Inc. |
Copying and distribution of this file, with or without modification, |
are permitted in any medium without royalty provided the copyright |
notice and this notice are preserved. |
Local Variables: |
mode: change-log |
left-margin: 8 |
fill-column: 74 |
version-control: never |
End: |
/contrib/toolchain/binutils/include/nlm/alpha-ext.h |
---|
0,0 → 1,167 |
/* Alpha NLM (NetWare Loadable Module) support for BFD. |
Copyright 1993, 2005, 2010 Free Software Foundation, Inc. |
By Ian Lance Taylor, Cygnus Support |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* An Alpha NLM starts with an instance of this structure. */ |
struct nlm32_alpha_external_prefix_header |
{ |
/* Magic number. Must be NLM32_ALPHA_MAGIC. */ |
unsigned char magic[4]; |
/* Format descriptor. Current value is 2. */ |
unsigned char format[4]; |
/* Size of prefix header. */ |
unsigned char size[4]; |
/* Padding. */ |
unsigned char pad1[4]; |
/* More fields may be added later, supposedly. */ |
}; |
/* The external format of an Alpha NLM reloc. This is the same as an |
Alpha ECOFF reloc. */ |
struct nlm32_alpha_external_reloc |
{ |
unsigned char r_vaddr[8]; |
unsigned char r_symndx[4]; |
unsigned char r_bits[4]; |
}; |
/* Constants to unpack the r_bits field of a reloc. */ |
#define RELOC_BITS0_TYPE_LITTLE 0xff |
#define RELOC_BITS0_TYPE_SH_LITTLE 0 |
#define RELOC_BITS1_EXTERN_LITTLE 0x01 |
#define RELOC_BITS1_OFFSET_LITTLE 0x7e |
#define RELOC_BITS1_OFFSET_SH_LITTLE 1 |
#define RELOC_BITS1_RESERVED_LITTLE 0x80 |
#define RELOC_BITS1_RESERVED_SH_LITTLE 7 |
#define RELOC_BITS2_RESERVED_LITTLE 0xff |
#define RELOC_BITS2_RESERVED_SH_LEFT_LITTLE 1 |
#define RELOC_BITS3_RESERVED_LITTLE 0x03 |
#define RELOC_BITS3_RESERVED_SH_LEFT_LITTLE 9 |
#define RELOC_BITS3_SIZE_LITTLE 0xfc |
#define RELOC_BITS3_SIZE_SH_LITTLE 2 |
/* The external format of the fixed header. */ |
typedef struct nlm32_alpha_external_fixed_header |
{ |
/* The signature field identifies the file as an NLM. It must contain |
the signature string, which depends upon the NLM target. */ |
unsigned char signature[24]; |
/* The version of the header. At this time, the highest version number |
is 4. */ |
unsigned char version[4]; |
/* The name of the module, which must be a DOS name (1-8 characters followed |
by a period and a 1-3 character extension). The first byte is the byte |
length of the name and the last byte is a null terminator byte. This |
field is fixed length, and any unused bytes should be null bytes. The |
value is set by the OUTPUT keyword to NLMLINK. */ |
unsigned char moduleName[14]; |
/* Padding to make it come out correct. */ |
unsigned char pad1[2]; |
/* The byte offset of the code image from the start of the file. */ |
unsigned char codeImageOffset[4]; |
/* The size of the code image, in bytes. */ |
unsigned char codeImageSize[4]; |
/* The byte offset of the data image from the start of the file. */ |
unsigned char dataImageOffset[4]; |
/* The size of the data image, in bytes. */ |
unsigned char dataImageSize[4]; |
/* The size of the uninitialized data region that the loader is to be |
allocated at load time. Uninitialized data follows the initialized |
data in the NLM address space. */ |
unsigned char uninitializedDataSize[4]; |
/* The byte offset of the custom data from the start of the file. The |
custom data is set by the CUSTOM keyword to NLMLINK. It is possible |
for this to be EOF if there is no custom data. */ |
unsigned char customDataOffset[4]; |
/* The size of the custom data, in bytes. */ |
unsigned char customDataSize[4]; |
/* The byte offset of the module dependencies from the start of the file. |
The module dependencies are determined by the MODULE keyword in |
NLMLINK. */ |
unsigned char moduleDependencyOffset[4]; |
/* The number of module dependencies at the moduleDependencyOffset. */ |
unsigned char numberOfModuleDependencies[4]; |
/* The byte offset of the relocation fixup data from the start of the file */ |
unsigned char relocationFixupOffset[4]; |
unsigned char numberOfRelocationFixups[4]; |
unsigned char externalReferencesOffset[4]; |
unsigned char numberOfExternalReferences[4]; |
unsigned char publicsOffset[4]; |
unsigned char numberOfPublics[4]; |
/* The byte offset of the internal debug info from the start of the file. |
It is possible for this to be EOF if there is no debug info. */ |
unsigned char debugInfoOffset[4]; |
unsigned char numberOfDebugRecords[4]; |
unsigned char codeStartOffset[4]; |
unsigned char exitProcedureOffset[4]; |
unsigned char checkUnloadProcedureOffset[4]; |
unsigned char moduleType[4]; |
unsigned char flags[4]; |
} Nlm32_alpha_External_Fixed_Header; |
/contrib/toolchain/binutils/include/nlm/common.h |
---|
0,0 → 1,123 |
/* NLM (NetWare Loadable Module) support for BFD. |
Copyright 1993, 2001, 2005, 2010 Free Software Foundation, Inc. |
Written by Fred Fish @ Cygnus Support |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* This file is part of NLM support for BFD, and contains the portions |
that are common to both the internal and external representations. */ |
/* If NLM_ARCH_SIZE is not defined, default to 32. NLM_ARCH_SIZE is |
optionally defined by the application. */ |
#ifndef NLM_ARCH_SIZE |
# define NLM_ARCH_SIZE 32 |
#endif |
/* Due to horrible details of ANSI macro expansion, we can't use CONCAT4 |
for NLM_NAME. CONCAT2 is used in BFD_JUMP_TABLE macros, and some of |
them will expand to tokens that themselves are macros defined in terms |
of NLM_NAME. If NLM_NAME were defined using CONCAT4 (which is itself |
defined in bfd-in.h using CONCAT2), ANSI preprocessor rules say that |
the CONCAT2 within NLM_NAME should not be expanded. |
So use another name. */ |
#if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE) |
#ifdef SABER |
#define NLM_CAT4(a,b,c,d) a##b##c##d |
#else |
/* This hack is to avoid a problem with some strict ANSI C preprocessors. |
The problem is, "32_" is not a valid preprocessing token, and we don't |
want extra underscores (e.g., "nlm_32_"). The NLM_XCAT2 macro will |
cause the inner CAT2 macros to be evaluated first, producing |
still-valid pp-tokens. Then the final concatenation can be done. */ |
#define NLM_CAT2(a,b) a##b |
#define NLM_XCAT2(a,b) NLM_CAT2(a,b) |
#define NLM_CAT4(a,b,c,d) NLM_XCAT2(NLM_CAT2(a,b),NLM_CAT2(c,d)) |
#endif |
#else |
#define NLM_CAT4(a,b,c,d) a/**/b/**/c/**/d |
#endif |
#if NLM_ARCH_SIZE == 32 |
# define NLM_TARGET_LONG_SIZE 4 |
# define NLM_TARGET_ADDRESS_SIZE 4 |
# define NLM_NAME(x,y) NLM_CAT4(x,32,_,y) |
# define NLM_HIBIT (((bfd_vma) 1) << 31) |
#endif |
#if NLM_ARCH_SIZE == 64 |
# define NLM_TARGET_LONG_SIZE 8 |
# define NLM_TARGET_ADDRESS_SIZE 8 |
# define NLM_NAME(x,y) NLM_CAT4(x,64,_,y) |
# define NLM_HIBIT (((bfd_vma) 1) << 63) |
#endif |
#define NlmNAME(X) NLM_NAME(Nlm,X) |
#define nlmNAME(X) NLM_NAME(nlm,X) |
/* Give names to things that should not change. */ |
#define NLM_MAX_DESCRIPTION_LENGTH 127 |
#define NLM_MAX_SCREEN_NAME_LENGTH 71 |
#define NLM_MAX_THREAD_NAME_LENGTH 71 |
#define NLM_MAX_COPYRIGHT_MESSAGE_LENGTH 255 |
#define NLM_OTHER_DATA_LENGTH 400 /* FIXME */ |
#define NLM_OLD_THREAD_NAME_LENGTH 5 |
#define NLM_SIGNATURE_SIZE 24 |
#define NLM_HEADER_VERSION 4 |
#define NLM_MODULE_NAME_SIZE 14 |
#define NLM_DEFAULT_STACKSIZE (8 * 1024) |
/* Alpha information. This should probably be in a separate Alpha |
header file, but it can't go in alpha-ext.h because some of it is |
needed by nlmconv.c. */ |
/* Magic number in Alpha prefix header. */ |
#define NLM32_ALPHA_MAGIC (0x83561840) |
/* The r_type field in an Alpha reloc is one of the following values. */ |
#define ALPHA_R_IGNORE 0 |
#define ALPHA_R_REFLONG 1 |
#define ALPHA_R_REFQUAD 2 |
#define ALPHA_R_GPREL32 3 |
#define ALPHA_R_LITERAL 4 |
#define ALPHA_R_LITUSE 5 |
#define ALPHA_R_GPDISP 6 |
#define ALPHA_R_BRADDR 7 |
#define ALPHA_R_HINT 8 |
#define ALPHA_R_SREL16 9 |
#define ALPHA_R_SREL32 10 |
#define ALPHA_R_SREL64 11 |
#define ALPHA_R_OP_PUSH 12 |
#define ALPHA_R_OP_STORE 13 |
#define ALPHA_R_OP_PSUB 14 |
#define ALPHA_R_OP_PRSHIFT 15 |
#define ALPHA_R_GPVALUE 16 |
#define ALPHA_R_NW_RELOC 250 |
/* A local reloc, other than ALPHA_R_GPDISP or ALPHA_R_IGNORE, must be |
against one of these symbol indices. */ |
#define ALPHA_RELOC_SECTION_TEXT 1 |
#define ALPHA_RELOC_SECTION_DATA 3 |
/* An ALPHA_R_NW_RELOC has one of these values in the size field. If |
it is SETGP, the r_vaddr field holds the GP value to use. If it is |
LITA, the r_vaddr field holds the address of the .lita section and |
the r_symndx field holds the size of the .lita section. */ |
#define ALPHA_R_NW_RELOC_SETGP 1 |
#define ALPHA_R_NW_RELOC_LITA 2 |
/contrib/toolchain/binutils/include/nlm/external.h |
---|
0,0 → 1,172 |
/* NLM (NetWare Loadable Module) support for BFD. |
Copyright 1993, 1994, 2005, 2010 Free Software Foundation, Inc. |
Written by Fred Fish @ Cygnus Support |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* This file is part of NLM support for BFD, and contains the portions |
that describe how NLM is represented externally by the BFD library. |
I.E. it describes the in-file representation of NLM. It requires |
the nlm/common.h file which contains the portions that are common to |
both the internal and external representations. |
Note that an NLM header consists of three parts: |
(1) A fixed length header that has specific fields of known length, |
at specific offsets in the file. |
(2) A variable length header that has specific fields in a specific |
order, but some fields may be variable length. |
(3) A auxiliary header that has various optional fields in no specific |
order. There is no way to identify the end of the auxiliary headers |
except by finding a header without a recognized 'stamp'. |
The exact format of the fixed length header unfortunately varies |
from one NLM target to another, due to padding. Each target |
defines the correct external format in a separate header file. */ |
/* NLM Header. */ |
/* The version header is one of the optional auxiliary headers and |
follows the fixed length and variable length NLM headers. */ |
typedef struct nlmNAME(external_version_header) |
{ |
/* The header is recognized by "VeRsIoN#" in the stamp field. */ |
char stamp[8]; |
unsigned char majorVersion[NLM_TARGET_LONG_SIZE]; |
unsigned char minorVersion[NLM_TARGET_LONG_SIZE]; |
unsigned char revision[NLM_TARGET_LONG_SIZE]; |
unsigned char year[NLM_TARGET_LONG_SIZE]; |
unsigned char month[NLM_TARGET_LONG_SIZE]; |
unsigned char day[NLM_TARGET_LONG_SIZE]; |
} NlmNAME(External_Version_Header); |
typedef struct nlmNAME(external_copyright_header) |
{ |
/* The header is recognized by "CoPyRiGhT=" in the stamp field. */ |
char stamp[10]; |
unsigned char copyrightMessageLength[1]; |
/* There is a variable length field here called 'copyrightMessage' |
that is the length specified by copyrightMessageLength. */ |
} NlmNAME(External_Copyright_Header); |
typedef struct nlmNAME(external_extended_header) |
{ |
/* The header is recognized by "MeSsAgEs" in the stamp field. */ |
char stamp[8]; |
unsigned char languageID[NLM_TARGET_LONG_SIZE]; |
unsigned char messageFileOffset[NLM_TARGET_LONG_SIZE]; |
unsigned char messageFileLength[NLM_TARGET_LONG_SIZE]; |
unsigned char messageCount[NLM_TARGET_LONG_SIZE]; |
unsigned char helpFileOffset[NLM_TARGET_LONG_SIZE]; |
unsigned char helpFileLength[NLM_TARGET_LONG_SIZE]; |
unsigned char RPCDataOffset[NLM_TARGET_LONG_SIZE]; |
unsigned char RPCDataLength[NLM_TARGET_LONG_SIZE]; |
unsigned char sharedCodeOffset[NLM_TARGET_LONG_SIZE]; |
unsigned char sharedCodeLength[NLM_TARGET_LONG_SIZE]; |
unsigned char sharedDataOffset[NLM_TARGET_LONG_SIZE]; |
unsigned char sharedDataLength[NLM_TARGET_LONG_SIZE]; |
unsigned char sharedRelocationFixupOffset[NLM_TARGET_LONG_SIZE]; |
unsigned char sharedRelocationFixupCount[NLM_TARGET_LONG_SIZE]; |
unsigned char sharedExternalReferenceOffset[NLM_TARGET_LONG_SIZE]; |
unsigned char sharedExternalReferenceCount[NLM_TARGET_LONG_SIZE]; |
unsigned char sharedPublicsOffset[NLM_TARGET_LONG_SIZE]; |
unsigned char sharedPublicsCount[NLM_TARGET_LONG_SIZE]; |
unsigned char sharedDebugRecordOffset[NLM_TARGET_LONG_SIZE]; |
unsigned char sharedDebugRecordCount[NLM_TARGET_LONG_SIZE]; |
unsigned char sharedInitializationOffset[NLM_TARGET_ADDRESS_SIZE]; |
unsigned char SharedExitProcedureOffset[NLM_TARGET_ADDRESS_SIZE]; |
unsigned char productID[NLM_TARGET_LONG_SIZE]; |
unsigned char reserved0[NLM_TARGET_LONG_SIZE]; |
unsigned char reserved1[NLM_TARGET_LONG_SIZE]; |
unsigned char reserved2[NLM_TARGET_LONG_SIZE]; |
unsigned char reserved3[NLM_TARGET_LONG_SIZE]; |
unsigned char reserved4[NLM_TARGET_LONG_SIZE]; |
unsigned char reserved5[NLM_TARGET_LONG_SIZE]; |
} NlmNAME(External_Extended_Header); |
typedef struct nlmNAME(external_custom_header) |
{ |
/* The header is recognized by "CuStHeAd" in the stamp field. */ |
char stamp[8]; |
/* Length of this header. */ |
unsigned char length[NLM_TARGET_LONG_SIZE]; |
/* Offset to data. */ |
unsigned char dataOffset[NLM_TARGET_LONG_SIZE]; |
/* Length of data. */ |
unsigned char dataLength[NLM_TARGET_LONG_SIZE]; |
/* Stamp for this customer header--we recognize "CyGnUsEx". */ |
char dataStamp[8]; |
} NlmNAME(External_Custom_Header); |
/contrib/toolchain/binutils/include/nlm/i386-ext.h |
---|
0,0 → 1,117 |
/* i386 NLM (NetWare Loadable Module) support for BFD. |
Copyright 1993, 2005, 2010 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* The external format of the fixed header. */ |
typedef struct nlm32_i386_external_fixed_header |
{ |
/* The signature field identifies the file as an NLM. It must contain |
the signature string, which depends upon the NLM target. */ |
unsigned char signature[24]; |
/* The version of the header. At this time, the highest version number |
is 4. */ |
unsigned char version[4]; |
/* The name of the module, which must be a DOS name (1-8 characters followed |
by a period and a 1-3 character extension). The first byte is the byte |
length of the name and the last byte is a null terminator byte. This |
field is fixed length, and any unused bytes should be null bytes. The |
value is set by the OUTPUT keyword to NLMLINK. */ |
unsigned char moduleName[14]; |
/* The byte offset of the code image from the start of the file. */ |
unsigned char codeImageOffset[4]; |
/* The size of the code image, in bytes. */ |
unsigned char codeImageSize[4]; |
/* The byte offset of the data image from the start of the file. */ |
unsigned char dataImageOffset[4]; |
/* The size of the data image, in bytes. */ |
unsigned char dataImageSize[4]; |
/* The size of the uninitialized data region that the loader is to be |
allocated at load time. Uninitialized data follows the initialized |
data in the NLM address space. */ |
unsigned char uninitializedDataSize[4]; |
/* The byte offset of the custom data from the start of the file. The |
custom data is set by the CUSTOM keyword to NLMLINK. It is possible |
for this to be EOF if there is no custom data. */ |
unsigned char customDataOffset[4]; |
/* The size of the custom data, in bytes. */ |
unsigned char customDataSize[4]; |
/* The byte offset of the module dependencies from the start of the file. |
The module dependencies are determined by the MODULE keyword in |
NLMLINK. */ |
unsigned char moduleDependencyOffset[4]; |
/* The number of module dependencies at the moduleDependencyOffset. */ |
unsigned char numberOfModuleDependencies[4]; |
/* The byte offset of the relocation fixup data from the start of the file */ |
unsigned char relocationFixupOffset[4]; |
unsigned char numberOfRelocationFixups[4]; |
unsigned char externalReferencesOffset[4]; |
unsigned char numberOfExternalReferences[4]; |
unsigned char publicsOffset[4]; |
unsigned char numberOfPublics[4]; |
/* The byte offset of the internal debug info from the start of the file. |
It is possible for this to be EOF if there is no debug info. */ |
unsigned char debugInfoOffset[4]; |
unsigned char numberOfDebugRecords[4]; |
unsigned char codeStartOffset[4]; |
unsigned char exitProcedureOffset[4]; |
unsigned char checkUnloadProcedureOffset[4]; |
unsigned char moduleType[4]; |
unsigned char flags[4]; |
} Nlm32_i386_External_Fixed_Header; |
/contrib/toolchain/binutils/include/nlm/internal.h |
---|
0,0 → 1,309 |
/* NLM (NetWare Loadable Module) support for BFD. |
Copyright 1993, 1994, 2003, 2005, 2010 Free Software Foundation, Inc. |
Written by Fred Fish @ Cygnus Support. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* This file is part of NLM support for BFD, and contains the portions |
that describe how NLM is represented internally in the BFD library. |
I.E. it describes the in-memory representation of NLM. It requires |
the nlm/common.h file which contains the portions that are common to |
both the internal and external representations. */ |
#if 0 |
/* Types used by various structures, functions, etc. */ |
typedef unsigned long Nlm32_Addr; /* Unsigned program address */ |
typedef unsigned long Nlm32_Off; /* Unsigned file offset */ |
typedef long Nlm32_Sword; /* Signed large integer */ |
typedef unsigned long Nlm32_Word; /* Unsigned large integer */ |
typedef unsigned short Nlm32_Half; /* Unsigned medium integer */ |
typedef unsigned char Nlm32_Char; /* Unsigned tiny integer */ |
#ifdef BFD_HOST_64_BIT |
typedef unsigned BFD_HOST_64_BIT Nlm64_Addr; |
typedef unsigned BFD_HOST_64_BIT Nlm64_Off; |
typedef BFD_HOST_64_BIT Nlm64_Sxword; |
typedef unsigned BFD_HOST_64_BIT Nlm64_Xword; |
#endif |
typedef long Nlm64_Sword; |
typedef unsigned long Nlm64_Word; |
typedef unsigned short Nlm64_Half; |
#endif /* 0 */ |
/* This structure contains the internal form of the portion of the NLM |
header that is fixed length. */ |
typedef struct nlm_internal_fixed_header |
{ |
/* The signature field identifies the file as an NLM. It must contain |
the signature string, which depends upon the NLM target. */ |
char signature[NLM_SIGNATURE_SIZE]; |
/* The version of the header. At this time, the highest version number |
is 4. */ |
long version; |
/* The name of the module, which must be a DOS name (1-8 characters followed |
by a period and a 1-3 character extension. The first byte is the byte |
length of the name and the last byte is a null terminator byte. This |
field is fixed length, and any unused bytes should be null bytes. The |
value is set by the OUTPUT keyword to NLMLINK. */ |
char moduleName[NLM_MODULE_NAME_SIZE]; |
/* The byte offset of the code image from the start of the file. */ |
file_ptr codeImageOffset; |
/* The size of the code image, in bytes. */ |
bfd_size_type codeImageSize; |
/* The byte offset of the data image from the start of the file. */ |
file_ptr dataImageOffset; |
/* The size of the data image, in bytes. */ |
bfd_size_type dataImageSize; |
/* The size of the uninitialized data region that the loader is to be |
allocated at load time. Uninitialized data follows the initialized |
data in the NLM address space. */ |
bfd_size_type uninitializedDataSize; |
/* The byte offset of the custom data from the start of the file. The |
custom data is set by the CUSTOM keyword to NLMLINK. */ |
file_ptr customDataOffset; |
/* The size of the custom data, in bytes. */ |
bfd_size_type customDataSize; |
/* The byte offset of the module dependencies from the start of the file. |
The module dependencies are determined by the MODULE keyword in |
NLMLINK. */ |
file_ptr moduleDependencyOffset; |
/* The number of module dependencies at the moduleDependencyOffset. */ |
long numberOfModuleDependencies; |
/* The byte offset of the relocation fixup data from the start of the file */ |
file_ptr relocationFixupOffset; |
long numberOfRelocationFixups; |
file_ptr externalReferencesOffset; |
long numberOfExternalReferences; |
file_ptr publicsOffset; |
long numberOfPublics; |
file_ptr debugInfoOffset; |
long numberOfDebugRecords; |
file_ptr codeStartOffset; |
file_ptr exitProcedureOffset; |
file_ptr checkUnloadProcedureOffset; |
long moduleType; |
long flags; |
} Nlm_Internal_Fixed_Header; |
#define nlm32_internal_fixed_header nlm_internal_fixed_header |
#define Nlm32_Internal_Fixed_Header Nlm_Internal_Fixed_Header |
#define nlm64_internal_fixed_header nlm_internal_fixed_header |
#define Nlm64_Internal_Fixed_Header Nlm_Internal_Fixed_Header |
/* This structure contains the portions of the NLM header that are either |
variable in size in the external representation, or else are not at a |
fixed offset relative to the start of the NLM header due to preceding |
variable sized fields. |
Note that all the fields must exist in the external header, and in |
the order used here (the same order is used in the internal form |
for consistency, not out of necessity). */ |
typedef struct nlm_internal_variable_header |
{ |
/* The descriptionLength field contains the length of the text in |
descriptionText, excluding the null terminator. The descriptionText |
field contains the NLM description obtained from the DESCRIPTION |
keyword in NLMLINK plus the null byte terminator. The descriptionText |
can be up to NLM_MAX_DESCRIPTION_LENGTH characters. */ |
unsigned char descriptionLength; |
char descriptionText[NLM_MAX_DESCRIPTION_LENGTH + 1]; |
/* The stackSize field contains the size of the stack in bytes, as |
specified by the STACK or STACKSIZE keyword in NLMLINK. If no size |
is specified, the default is NLM_DEFAULT_STACKSIZE. */ |
long stackSize; |
/* The reserved field is included only for completeness. It should contain |
zero. */ |
long reserved; |
/* This field is fixed length, should contain " LONG" (note leading |
space), and is unused. */ |
char oldThreadName[NLM_OLD_THREAD_NAME_LENGTH]; |
/* The screenNameLength field contains the length of the actual text stored |
in the screenName field, excluding the null byte terminator. The |
screenName field contains the screen name as specified by the SCREENNAME |
keyword in NLMLINK, and can be up to NLM_MAX_SCREEN_NAME_LENGTH |
characters. */ |
unsigned char screenNameLength; |
char screenName[NLM_MAX_SCREEN_NAME_LENGTH + 1]; |
/* The threadNameLength field contains the length of the actual text stored |
in the threadName field, excluding the null byte terminator. The |
threadName field contains the thread name as specified by the THREADNAME |
keyword in NLMLINK, and can be up to NLM_MAX_THREAD_NAME_LENGTH |
characters. */ |
unsigned char threadNameLength; |
char threadName[NLM_MAX_THREAD_NAME_LENGTH + 1]; |
} Nlm_Internal_Variable_Header; |
#define nlm32_internal_variable_header nlm_internal_variable_header |
#define Nlm32_Internal_Variable_Header Nlm_Internal_Variable_Header |
#define nlm64_internal_variable_header nlm_internal_variable_header |
#define Nlm64_Internal_Variable_Header Nlm_Internal_Variable_Header |
/* The version header is one of the optional auxiliary headers and |
follows the fixed length and variable length NLM headers. */ |
typedef struct nlm_internal_version_header |
{ |
/* The header is recognized by "VeRsIoN#" in the stamp field. */ |
char stamp[8]; |
long majorVersion; |
long minorVersion; |
long revision; |
long year; |
long month; |
long day; |
} Nlm_Internal_Version_Header; |
#define nlm32_internal_version_header nlm_internal_version_header |
#define Nlm32_Internal_Version_Header Nlm_Internal_Version_Header |
#define nlm64_internal_version_header nlm_internal_version_header |
#define Nlm64_Internal_Version_Header Nlm_Internal_Version_Header |
typedef struct nlm_internal_copyright_header |
{ |
/* The header is recognized by "CoPyRiGhT=" in the stamp field. */ |
char stamp[10]; |
unsigned char copyrightMessageLength; |
char copyrightMessage[NLM_MAX_COPYRIGHT_MESSAGE_LENGTH]; |
} Nlm_Internal_Copyright_Header; |
#define nlm32_internal_copyright_header nlm_internal_copyright_header |
#define Nlm32_Internal_Copyright_Header Nlm_Internal_Copyright_Header |
#define nlm64_internal_copyright_header nlm_internal_copyright_header |
#define Nlm64_Internal_Copyright_Header Nlm_Internal_Copyright_Header |
typedef struct nlm_internal_extended_header |
{ |
/* The header is recognized by "MeSsAgEs" in the stamp field. */ |
char stamp[8]; |
long languageID; |
file_ptr messageFileOffset; |
bfd_size_type messageFileLength; |
long messageCount; |
file_ptr helpFileOffset; |
bfd_size_type helpFileLength; |
file_ptr RPCDataOffset; |
bfd_size_type RPCDataLength; |
file_ptr sharedCodeOffset; |
bfd_size_type sharedCodeLength; |
file_ptr sharedDataOffset; |
bfd_size_type sharedDataLength; |
file_ptr sharedRelocationFixupOffset; |
long sharedRelocationFixupCount; |
file_ptr sharedExternalReferenceOffset; |
long sharedExternalReferenceCount; |
file_ptr sharedPublicsOffset; |
long sharedPublicsCount; |
file_ptr sharedDebugRecordOffset; |
long sharedDebugRecordCount; |
bfd_vma SharedInitializationOffset; |
bfd_vma SharedExitProcedureOffset; |
long productID; |
long reserved0; |
long reserved1; |
long reserved2; |
long reserved3; |
long reserved4; |
long reserved5; |
} Nlm_Internal_Extended_Header; |
#define nlm32_internal_extended_header nlm_internal_extended_header |
#define Nlm32_Internal_Extended_Header Nlm_Internal_Extended_Header |
#define nlm64_internal_extended_header nlm_internal_extended_header |
#define Nlm64_Internal_Extended_Header Nlm_Internal_Extended_Header |
/* The format of a custom header as stored internally is different |
from the external format. This is how we store a custom header |
which we do not recognize. */ |
typedef struct nlm_internal_custom_header |
{ |
/* The header is recognized by "CuStHeAd" in the stamp field. */ |
char stamp[8]; |
bfd_size_type hdrLength; |
file_ptr dataOffset; |
bfd_size_type dataLength; |
char dataStamp[8]; |
void *hdr; |
} Nlm_Internal_Custom_Header; |
#define nlm32_internal_custom_header nlm_internal_custom_header |
#define Nlm32_Internal_Custom_Header Nlm_Internal_Custom_Header |
#define nlm64_internal_custom_header nlm_internal_custom_header |
#define Nlm64_Internal_Custom_Header Nlm_Internal_Custom_Header |
/* The internal Cygnus header is written out externally as a custom |
header. We don't try to replicate that structure here. */ |
typedef struct nlm_internal_cygnus_ext_header |
{ |
/* The header is recognized by "CyGnUsEx" in the stamp field. */ |
char stamp[8]; |
/* File location of debugging information. */ |
file_ptr offset; |
/* Length of debugging information. */ |
bfd_size_type length; |
} Nlm_Internal_Cygnus_Ext_Header; |
#define nlm32_internal_cygnus_ext_header nlm_internal_cygnus_ext_header |
#define Nlm32_Internal_Cygnus_Ext_Header Nlm_Internal_Cygnus_Ext_Header |
#define nlm64_internal_cygnus_ext_header nlm_internal_cygnus_ext_header |
#define Nlm64_Internal_Cygnus_Ext_Header Nlm_Internal_Cygnus_Ext_Header |
/contrib/toolchain/binutils/include/nlm/ppc-ext.h |
---|
0,0 → 1,164 |
/* PowerPC NLM (NetWare Loadable Module) support for BFD. |
Copyright (C) 1994, 2005, 2010 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifdef OLDFORMAT |
/* The format of a PowerPC NLM changed. These structures are only |
used in the old format. */ |
/* A PowerPC NLM starts with an instance of this structure. */ |
struct nlm32_powerpc_external_prefix_header |
{ |
/* Signature. Must be "AppleNLM". */ |
char signature[8]; |
/* Version number. Current value is 1. */ |
unsigned char headerVersion[4]; |
/* ??. Should be set to 0. */ |
unsigned char origins[4]; |
/* File creation date in standard Unix time format (seconds since |
1/1/70). */ |
unsigned char date[4]; |
}; |
#define NLM32_POWERPC_SIGNATURE "AppleNLM" |
#define NLM32_POWERPC_HEADER_VERSION 1 |
/* The external format of a PowerPC NLM reloc. This is the same as an |
XCOFF dynamic reloc. */ |
struct nlm32_powerpc_external_reloc |
{ |
/* Address. */ |
unsigned char l_vaddr[4]; |
/* Symbol table index. This is 0 for .text and 1 for .data. 2 |
means .bss, but I don't know if it is used. In XCOFF, larger |
numbers are indices into the dynamic symbol table, but they are |
presumably not used in an NLM. */ |
unsigned char l_symndx[4]; |
/* Relocation type. */ |
unsigned char l_rtype[2]; |
/* Section number being relocated. */ |
unsigned char l_rsecnm[2]; |
}; |
#endif /* OLDFORMAT */ |
/* The external format of the fixed header. */ |
typedef struct nlm32_powerpc_external_fixed_header |
{ |
/* The signature field identifies the file as an NLM. It must contain |
the signature string, which depends upon the NLM target. */ |
unsigned char signature[24]; |
/* The version of the header. At this time, the highest version number |
is 4. */ |
unsigned char version[4]; |
/* The name of the module, which must be a DOS name (1-8 characters followed |
by a period and a 1-3 character extension). The first byte is the byte |
length of the name and the last byte is a null terminator byte. This |
field is fixed length, and any unused bytes should be null bytes. The |
value is set by the OUTPUT keyword to NLMLINK. */ |
unsigned char moduleName[14]; |
/* Padding to make it come out correct. */ |
unsigned char pad1[2]; |
/* The byte offset of the code image from the start of the file. */ |
unsigned char codeImageOffset[4]; |
/* The size of the code image, in bytes. */ |
unsigned char codeImageSize[4]; |
/* The byte offset of the data image from the start of the file. */ |
unsigned char dataImageOffset[4]; |
/* The size of the data image, in bytes. */ |
unsigned char dataImageSize[4]; |
/* The size of the uninitialized data region that the loader is to be |
allocated at load time. Uninitialized data follows the initialized |
data in the NLM address space. */ |
unsigned char uninitializedDataSize[4]; |
/* The byte offset of the custom data from the start of the file. The |
custom data is set by the CUSTOM keyword to NLMLINK. It is possible |
for this to be EOF if there is no custom data. */ |
unsigned char customDataOffset[4]; |
/* The size of the custom data, in bytes. */ |
unsigned char customDataSize[4]; |
/* The byte offset of the module dependencies from the start of the file. |
The module dependencies are determined by the MODULE keyword in |
NLMLINK. */ |
unsigned char moduleDependencyOffset[4]; |
/* The number of module dependencies at the moduleDependencyOffset. */ |
unsigned char numberOfModuleDependencies[4]; |
/* The byte offset of the relocation fixup data from the start of the file */ |
unsigned char relocationFixupOffset[4]; |
unsigned char numberOfRelocationFixups[4]; |
unsigned char externalReferencesOffset[4]; |
unsigned char numberOfExternalReferences[4]; |
unsigned char publicsOffset[4]; |
unsigned char numberOfPublics[4]; |
/* The byte offset of the internal debug info from the start of the file. |
It is possible for this to be EOF if there is no debug info. */ |
unsigned char debugInfoOffset[4]; |
unsigned char numberOfDebugRecords[4]; |
unsigned char codeStartOffset[4]; |
unsigned char exitProcedureOffset[4]; |
unsigned char checkUnloadProcedureOffset[4]; |
unsigned char moduleType[4]; |
unsigned char flags[4]; |
} Nlm32_powerpc_External_Fixed_Header; |
/contrib/toolchain/binutils/include/nlm/sparc32-ext.h |
---|
0,0 → 1,121 |
/* SPARC NLM (NetWare Loadable Module) support for BFD. |
Copyright 1993, 2005, 2010 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* The external format of the fixed header. */ |
typedef struct nlm32_sparc_external_fixed_header |
{ |
/* The signature field identifies the file as an NLM. It must contain |
the signature string, which depends upon the NLM target. */ |
unsigned char signature[24]; |
/* The version of the header. At this time, the highest version number |
is 4. */ |
unsigned char version[4]; |
/* The name of the module, which must be a DOS name (1-8 characters followed |
by a period and a 1-3 character extension). The first byte is the byte |
length of the name and the last byte is a null terminator byte. This |
field is fixed length, and any unused bytes should be null bytes. The |
value is set by the OUTPUT keyword to NLMLINK. */ |
unsigned char moduleName[14]; |
/* Padding to make it come out correct. */ |
unsigned char pad1[2]; |
/* The byte offset of the code image from the start of the file. */ |
unsigned char codeImageOffset[4]; |
/* The size of the code image, in bytes. */ |
unsigned char codeImageSize[4]; |
/* The byte offset of the data image from the start of the file. */ |
unsigned char dataImageOffset[4]; |
/* The size of the data image, in bytes. */ |
unsigned char dataImageSize[4]; |
/* The size of the uninitialized data region that the loader is to be |
allocated at load time. Uninitialized data follows the initialized |
data in the NLM address space. */ |
unsigned char uninitializedDataSize[4]; |
/* The byte offset of the custom data from the start of the file. The |
custom data is set by the CUSTOM keyword to NLMLINK. It is possible |
for this to be EOF if there is no custom data. */ |
unsigned char customDataOffset[4]; |
/* The size of the custom data, in bytes. */ |
unsigned char customDataSize[4]; |
/* The byte offset of the module dependencies from the start of the file. |
The module dependencies are determined by the MODULE keyword in |
NLMLINK. */ |
unsigned char moduleDependencyOffset[4]; |
/* The number of module dependencies at the moduleDependencyOffset. */ |
unsigned char numberOfModuleDependencies[4]; |
/* The byte offset of the relocation fixup data from the start of the file */ |
unsigned char relocationFixupOffset[4]; |
unsigned char numberOfRelocationFixups[4]; |
unsigned char externalReferencesOffset[4]; |
unsigned char numberOfExternalReferences[4]; |
unsigned char publicsOffset[4]; |
unsigned char numberOfPublics[4]; |
/* The byte offset of the internal debug info from the start of the file. |
It is possible for this to be EOF if there is no debug info. */ |
unsigned char debugInfoOffset[4]; |
unsigned char numberOfDebugRecords[4]; |
unsigned char codeStartOffset[4]; |
unsigned char exitProcedureOffset[4]; |
unsigned char checkUnloadProcedureOffset[4]; |
unsigned char moduleType[4]; |
unsigned char flags[4]; |
} Nlm32_sparc_External_Fixed_Header; |
/contrib/toolchain/binutils/include/oasys.h |
---|
0,0 → 1,192 |
/* Oasys object format header file for BFD. |
Copyright 2001, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3, or (at your option) |
any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. |
Contributed by Cygnus Support. */ |
#define OASYS_MAX_SEC_COUNT 16 |
/* **** */ |
typedef struct oasys_archive_header |
{ |
unsigned int version; |
char create_date[12]; |
char revision_date[12]; |
unsigned int mod_count; |
file_ptr mod_tbl_offset; |
unsigned int sym_tbl_size; |
unsigned int sym_count; |
file_ptr sym_tbl_offset; |
unsigned int xref_count; |
file_ptr xref_lst_offset; |
} |
oasys_archive_header_type; |
typedef struct oasys_extarchive_header |
{ |
bfd_byte version[4]; |
bfd_byte create_date[12]; |
bfd_byte revision_date[12]; |
bfd_byte mod_count[4]; |
bfd_byte mod_tbl_offset[4]; |
bfd_byte sym_tbl_size[4]; |
bfd_byte sym_count[4]; |
bfd_byte sym_tbl_offset[4]; |
bfd_byte xref_count[4]; |
bfd_byte xref_lst_offset[4]; |
} |
oasys_extarchive_header_type; |
typedef struct oasys_module_table |
{ |
int mod_number; |
char mod_date[12]; |
unsigned int mod_size; |
unsigned int dep_count; |
unsigned int depee_count; |
file_ptr file_offset; |
unsigned int sect_count; |
char *module_name; |
unsigned int module_name_size; |
} |
oasys_module_table_type; |
typedef struct oasys_extmodule_table_a |
{ |
bfd_byte mod_number[4]; |
bfd_byte mod_date[12]; |
bfd_byte mod_size[4]; |
bfd_byte dep_count[4]; |
bfd_byte depee_count[4]; |
bfd_byte sect_count[4]; |
bfd_byte file_offset[4]; |
bfd_byte mod_name[32]; |
} |
oasys_extmodule_table_type_a_type; |
typedef struct oasys_extmodule_table_b |
{ |
bfd_byte mod_number[4]; |
bfd_byte mod_date[12]; |
bfd_byte mod_size[4]; |
bfd_byte dep_count[4]; |
bfd_byte depee_count[4]; |
bfd_byte sect_count[4]; |
bfd_byte file_offset[4]; |
bfd_byte mod_name_length[4]; |
} |
oasys_extmodule_table_type_b_type; |
typedef enum oasys_record |
{ |
oasys_record_is_end_enum = 0, |
oasys_record_is_data_enum = 1, |
oasys_record_is_symbol_enum = 2, |
oasys_record_is_header_enum = 3, |
oasys_record_is_named_section_enum = 4, |
oasys_record_is_com_enum = 5, |
oasys_record_is_debug_enum = 6, |
oasys_record_is_section_enum = 7, |
oasys_record_is_debug_file_enum = 8, |
oasys_record_is_module_enum = 9, |
oasys_record_is_local_enum = 10 |
} |
oasys_record_enum_type; |
typedef struct oasys_record_header |
{ |
unsigned char length; |
unsigned char check_sum; |
unsigned char type; |
unsigned char fill; |
} |
oasys_record_header_type; |
typedef struct oasys_data_record |
{ |
oasys_record_header_type header; |
unsigned char relb; |
bfd_byte addr[4]; |
/* maximum total size of data record is 255 bytes */ |
bfd_byte data[246]; |
} |
oasys_data_record_type; |
typedef struct oasys_header_record |
{ |
oasys_record_header_type header; |
unsigned char version_number; |
unsigned char rev_number; |
char module_name[26-6]; |
char description[64-26]; |
} |
oasys_header_record_type; |
#define OASYS_VERSION_NUMBER 0 |
#define OASYS_REV_NUMBER 0 |
typedef struct oasys_symbol_record |
{ |
oasys_record_header_type header; |
unsigned char relb; |
bfd_byte value[4]; |
bfd_byte refno[2]; |
char name[64]; |
} |
oasys_symbol_record_type; |
#define RELOCATION_PCREL_BIT 0x80 |
#define RELOCATION_32BIT_BIT 0x40 |
#define RELOCATION_TYPE_BITS 0x30 |
#define RELOCATION_TYPE_ABS 0x00 |
#define RELOCATION_TYPE_REL 0x10 |
#define RELOCATION_TYPE_UND 0x20 |
#define RELOCATION_TYPE_COM 0x30 |
#define RELOCATION_SECT_BITS 0x0f |
typedef struct oasys_section_record |
{ |
oasys_record_header_type header; |
unsigned char relb; |
bfd_byte value[4]; |
bfd_byte vma[4]; |
bfd_byte fill[3]; |
} |
oasys_section_record_type; |
typedef struct oasys_end_record |
{ |
oasys_record_header_type header; |
unsigned char relb; |
bfd_byte entry[4]; |
bfd_byte fill[2]; |
bfd_byte zero; |
} |
oasys_end_record_type; |
typedef union oasys_record_union |
{ |
oasys_record_header_type header; |
oasys_data_record_type data; |
oasys_section_record_type section; |
oasys_symbol_record_type symbol; |
oasys_header_record_type first; |
oasys_end_record_type end; |
bfd_byte pad[256]; |
} |
oasys_record_union_type; |
/contrib/toolchain/binutils/include/objalloc.h |
---|
0,0 → 1,115 |
/* objalloc.h -- routines to allocate memory for objects |
Copyright 1997-2012 Free Software Foundation, Inc. |
Written by Ian Lance Taylor, Cygnus Solutions. |
This program is free software; you can redistribute it and/or modify it |
under the terms of the GNU General Public License as published by the |
Free Software Foundation; either version 2, or (at your option) any |
later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
#ifndef OBJALLOC_H |
#define OBJALLOC_H |
#include "ansidecl.h" |
/* These routines allocate space for an object. The assumption is |
that the object will want to allocate space as it goes along, but |
will never want to free any particular block. There is a function |
to free a block, which also frees all more recently allocated |
blocks. There is also a function to free all the allocated space. |
This is essentially a specialization of obstacks. The main |
difference is that a block may not be allocated a bit at a time. |
Another difference is that these routines are always built on top |
of malloc, and always pass an malloc failure back to the caller, |
unlike more recent versions of obstacks. */ |
/* This is what an objalloc structure looks like. Callers should not |
refer to these fields, nor should they allocate these structure |
themselves. Instead, they should only create them via |
objalloc_init, and only access them via the functions and macros |
listed below. The structure is only defined here so that we can |
access it via macros. */ |
struct objalloc |
{ |
char *current_ptr; |
unsigned int current_space; |
void *chunks; |
}; |
/* Work out the required alignment. */ |
struct objalloc_align { char x; double d; }; |
#if defined (__STDC__) && __STDC__ |
#ifndef offsetof |
#include <stddef.h> |
#endif |
#endif |
#ifndef offsetof |
#define offsetof(TYPE, MEMBER) ((unsigned long) &((TYPE *)0)->MEMBER) |
#endif |
#define OBJALLOC_ALIGN offsetof (struct objalloc_align, d) |
/* Create an objalloc structure. Returns NULL if malloc fails. */ |
extern struct objalloc *objalloc_create (void); |
/* Allocate space from an objalloc structure. Returns NULL if malloc |
fails. */ |
extern void *_objalloc_alloc (struct objalloc *, unsigned long); |
/* The macro version of objalloc_alloc. We only define this if using |
gcc, because otherwise we would have to evaluate the arguments |
multiple times, or use a temporary field as obstack.h does. */ |
#if defined (__GNUC__) && defined (__STDC__) && __STDC__ |
/* NextStep 2.0 cc is really gcc 1.93 but it defines __GNUC__ = 2 and |
does not implement __extension__. But that compiler doesn't define |
__GNUC_MINOR__. */ |
#if __GNUC__ < 2 || (__NeXT__ && !__GNUC_MINOR__) |
#define __extension__ |
#endif |
#define objalloc_alloc(o, l) \ |
__extension__ \ |
({ struct objalloc *__o = (o); \ |
unsigned long __len = (l); \ |
if (__len == 0) \ |
__len = 1; \ |
__len = (__len + OBJALLOC_ALIGN - 1) &~ (OBJALLOC_ALIGN - 1); \ |
(__len != 0 && __len <= __o->current_space \ |
? (__o->current_ptr += __len, \ |
__o->current_space -= __len, \ |
(void *) (__o->current_ptr - __len)) \ |
: _objalloc_alloc (__o, __len)); }) |
#else /* ! __GNUC__ */ |
#define objalloc_alloc(o, l) _objalloc_alloc ((o), (l)) |
#endif /* ! __GNUC__ */ |
/* Free an entire objalloc structure. */ |
extern void objalloc_free (struct objalloc *); |
/* Free a block allocated by objalloc_alloc. This also frees all more |
recently allocated blocks. */ |
extern void objalloc_free_block (struct objalloc *, void *); |
#endif /* OBJALLOC_H */ |
/contrib/toolchain/binutils/include/obstack.h |
---|
0,0 → 1,545 |
/* obstack.h - object stack macros |
Copyright 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1996, 1997, 1998, |
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 |
Free Software Foundation, Inc. |
NOTE: The canonical source of this file is maintained with the GNU C Library. |
Bugs can be reported to bug-glibc@gnu.org. |
This program is free software; you can redistribute it and/or modify it |
under the terms of the GNU General Public License as published by the |
Free Software Foundation; either version 2, or (at your option) any |
later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, |
USA. */ |
/* Summary: |
All the apparent functions defined here are macros. The idea |
is that you would use these pre-tested macros to solve a |
very specific set of problems, and they would run fast. |
Caution: no side-effects in arguments please!! They may be |
evaluated MANY times!! |
These macros operate a stack of objects. Each object starts life |
small, and may grow to maturity. (Consider building a word syllable |
by syllable.) An object can move while it is growing. Once it has |
been "finished" it never changes address again. So the "top of the |
stack" is typically an immature growing object, while the rest of the |
stack is of mature, fixed size and fixed address objects. |
These routines grab large chunks of memory, using a function you |
supply, called `obstack_chunk_alloc'. On occasion, they free chunks, |
by calling `obstack_chunk_free'. You must define them and declare |
them before using any obstack macros. |
Each independent stack is represented by a `struct obstack'. |
Each of the obstack macros expects a pointer to such a structure |
as the first argument. |
One motivation for this package is the problem of growing char strings |
in symbol tables. Unless you are "fascist pig with a read-only mind" |
--Gosper's immortal quote from HAKMEM item 154, out of context--you |
would not like to put any arbitrary upper limit on the length of your |
symbols. |
In practice this often means you will build many short symbols and a |
few long symbols. At the time you are reading a symbol you don't know |
how long it is. One traditional method is to read a symbol into a |
buffer, realloc()ating the buffer every time you try to read a symbol |
that is longer than the buffer. This is beaut, but you still will |
want to copy the symbol from the buffer to a more permanent |
symbol-table entry say about half the time. |
With obstacks, you can work differently. Use one obstack for all symbol |
names. As you read a symbol, grow the name in the obstack gradually. |
When the name is complete, finalize it. Then, if the symbol exists already, |
free the newly read name. |
The way we do this is to take a large chunk, allocating memory from |
low addresses. When you want to build a symbol in the chunk you just |
add chars above the current "high water mark" in the chunk. When you |
have finished adding chars, because you got to the end of the symbol, |
you know how long the chars are, and you can create a new object. |
Mostly the chars will not burst over the highest address of the chunk, |
because you would typically expect a chunk to be (say) 100 times as |
long as an average object. |
In case that isn't clear, when we have enough chars to make up |
the object, THEY ARE ALREADY CONTIGUOUS IN THE CHUNK (guaranteed) |
so we just point to it where it lies. No moving of chars is |
needed and this is the second win: potentially long strings need |
never be explicitly shuffled. Once an object is formed, it does not |
change its address during its lifetime. |
When the chars burst over a chunk boundary, we allocate a larger |
chunk, and then copy the partly formed object from the end of the old |
chunk to the beginning of the new larger chunk. We then carry on |
accreting characters to the end of the object as we normally would. |
A special macro is provided to add a single char at a time to a |
growing object. This allows the use of register variables, which |
break the ordinary 'growth' macro. |
Summary: |
We allocate large chunks. |
We carve out one object at a time from the current chunk. |
Once carved, an object never moves. |
We are free to append data of any size to the currently |
growing object. |
Exactly one object is growing in an obstack at any one time. |
You can run one obstack per control block. |
You may have as many control blocks as you dare. |
Because of the way we do it, you can `unwind' an obstack |
back to a previous state. (You may remove objects much |
as you would with a stack.) |
*/ |
/* Don't do the contents of this file more than once. */ |
#ifndef _OBSTACK_H |
#define _OBSTACK_H 1 |
#ifdef __cplusplus |
extern "C" { |
#endif |
/* We use subtraction of (char *) 0 instead of casting to int |
because on word-addressable machines a simple cast to int |
may ignore the byte-within-word field of the pointer. */ |
#ifndef __PTR_TO_INT |
# define __PTR_TO_INT(P) ((P) - (char *) 0) |
#endif |
#ifndef __INT_TO_PTR |
# define __INT_TO_PTR(P) ((P) + (char *) 0) |
#endif |
/* We need the type of the resulting object. If __PTRDIFF_TYPE__ is |
defined, as with GNU C, use that; that way we don't pollute the |
namespace with <stddef.h>'s symbols. Otherwise, if <stddef.h> is |
available, include it and use ptrdiff_t. In traditional C, long is |
the best that we can do. */ |
#ifdef __PTRDIFF_TYPE__ |
# define PTR_INT_TYPE __PTRDIFF_TYPE__ |
#else |
# ifdef HAVE_STDDEF_H |
# include <stddef.h> |
# define PTR_INT_TYPE ptrdiff_t |
# else |
# define PTR_INT_TYPE long |
# endif |
#endif |
#if defined _LIBC || defined HAVE_STRING_H |
# include <string.h> |
# define _obstack_memcpy(To, From, N) memcpy ((To), (From), (N)) |
#else |
# ifdef memcpy |
# define _obstack_memcpy(To, From, N) memcpy ((To), (char *)(From), (N)) |
# else |
# define _obstack_memcpy(To, From, N) bcopy ((char *)(From), (To), (N)) |
# endif |
#endif |
struct _obstack_chunk /* Lives at front of each chunk. */ |
{ |
char *limit; /* 1 past end of this chunk */ |
struct _obstack_chunk *prev; /* address of prior chunk or NULL */ |
char contents[4]; /* objects begin here */ |
}; |
struct obstack /* control current object in current chunk */ |
{ |
long chunk_size; /* preferred size to allocate chunks in */ |
struct _obstack_chunk *chunk; /* address of current struct obstack_chunk */ |
char *object_base; /* address of object we are building */ |
char *next_free; /* where to add next char to current object */ |
char *chunk_limit; /* address of char after current chunk */ |
PTR_INT_TYPE temp; /* Temporary for some macros. */ |
int alignment_mask; /* Mask of alignment for each object. */ |
/* These prototypes vary based on `use_extra_arg', and we use |
casts to the prototypeless function type in all assignments, |
but having prototypes here quiets -Wstrict-prototypes. */ |
struct _obstack_chunk *(*chunkfun) (void *, long); |
void (*freefun) (void *, struct _obstack_chunk *); |
void *extra_arg; /* first arg for chunk alloc/dealloc funcs */ |
unsigned use_extra_arg:1; /* chunk alloc/dealloc funcs take extra arg */ |
unsigned maybe_empty_object:1;/* There is a possibility that the current |
chunk contains a zero-length object. This |
prevents freeing the chunk if we allocate |
a bigger chunk to replace it. */ |
unsigned alloc_failed:1; /* No longer used, as we now call the failed |
handler on error, but retained for binary |
compatibility. */ |
}; |
/* Declare the external functions we use; they are in obstack.c. */ |
extern void _obstack_newchunk (struct obstack *, int); |
extern void _obstack_free (struct obstack *, void *); |
extern int _obstack_begin (struct obstack *, int, int, |
void *(*) (long), void (*) (void *)); |
extern int _obstack_begin_1 (struct obstack *, int, int, |
void *(*) (void *, long), |
void (*) (void *, void *), void *); |
extern int _obstack_memory_used (struct obstack *); |
/* Do the function-declarations after the structs |
but before defining the macros. */ |
void obstack_init (struct obstack *obstack); |
void * obstack_alloc (struct obstack *obstack, int size); |
void * obstack_copy (struct obstack *obstack, void *address, int size); |
void * obstack_copy0 (struct obstack *obstack, void *address, int size); |
void obstack_free (struct obstack *obstack, void *block); |
void obstack_blank (struct obstack *obstack, int size); |
void obstack_grow (struct obstack *obstack, void *data, int size); |
void obstack_grow0 (struct obstack *obstack, void *data, int size); |
void obstack_1grow (struct obstack *obstack, int data_char); |
void obstack_ptr_grow (struct obstack *obstack, void *data); |
void obstack_int_grow (struct obstack *obstack, int data); |
void * obstack_finish (struct obstack *obstack); |
int obstack_object_size (struct obstack *obstack); |
int obstack_room (struct obstack *obstack); |
void obstack_make_room (struct obstack *obstack, int size); |
void obstack_1grow_fast (struct obstack *obstack, int data_char); |
void obstack_ptr_grow_fast (struct obstack *obstack, void *data); |
void obstack_int_grow_fast (struct obstack *obstack, int data); |
void obstack_blank_fast (struct obstack *obstack, int size); |
void * obstack_base (struct obstack *obstack); |
void * obstack_next_free (struct obstack *obstack); |
int obstack_alignment_mask (struct obstack *obstack); |
int obstack_chunk_size (struct obstack *obstack); |
int obstack_memory_used (struct obstack *obstack); |
/* Error handler called when `obstack_chunk_alloc' failed to allocate |
more memory. This can be set to a user defined function. The |
default action is to print a message and abort. */ |
extern void (*obstack_alloc_failed_handler) (void); |
/* Exit value used when `print_and_abort' is used. */ |
extern int obstack_exit_failure; |
/* Pointer to beginning of object being allocated or to be allocated next. |
Note that this might not be the final address of the object |
because a new chunk might be needed to hold the final size. */ |
#define obstack_base(h) ((h)->object_base) |
/* Size for allocating ordinary chunks. */ |
#define obstack_chunk_size(h) ((h)->chunk_size) |
/* Pointer to next byte not yet allocated in current chunk. */ |
#define obstack_next_free(h) ((h)->next_free) |
/* Mask specifying low bits that should be clear in address of an object. */ |
#define obstack_alignment_mask(h) ((h)->alignment_mask) |
/* To prevent prototype warnings provide complete argument list in |
standard C version. */ |
# define obstack_init(h) \ |
_obstack_begin ((h), 0, 0, \ |
(void *(*) (long)) obstack_chunk_alloc, (void (*) (void *)) obstack_chunk_free) |
# define obstack_begin(h, size) \ |
_obstack_begin ((h), (size), 0, \ |
(void *(*) (long)) obstack_chunk_alloc, (void (*) (void *)) obstack_chunk_free) |
# define obstack_specify_allocation(h, size, alignment, chunkfun, freefun) \ |
_obstack_begin ((h), (size), (alignment), \ |
(void *(*) (long)) (chunkfun), (void (*) (void *)) (freefun)) |
# define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \ |
_obstack_begin_1 ((h), (size), (alignment), \ |
(void *(*) (void *, long)) (chunkfun), \ |
(void (*) (void *, void *)) (freefun), (arg)) |
# define obstack_chunkfun(h, newchunkfun) \ |
((h) -> chunkfun = (struct _obstack_chunk *(*)(void *, long)) (newchunkfun)) |
# define obstack_freefun(h, newfreefun) \ |
((h) -> freefun = (void (*)(void *, struct _obstack_chunk *)) (newfreefun)) |
#define obstack_1grow_fast(h,achar) (*((h)->next_free)++ = (achar)) |
#define obstack_blank_fast(h,n) ((h)->next_free += (n)) |
#define obstack_memory_used(h) _obstack_memory_used (h) |
#if defined __GNUC__ && defined __STDC__ && __STDC__ |
/* NextStep 2.0 cc is really gcc 1.93 but it defines __GNUC__ = 2 and |
does not implement __extension__. But that compiler doesn't define |
__GNUC_MINOR__. */ |
# if __GNUC__ < 2 || (__NeXT__ && !__GNUC_MINOR__) |
# define __extension__ |
# endif |
/* For GNU C, if not -traditional, |
we can define these macros to compute all args only once |
without using a global variable. |
Also, we can avoid using the `temp' slot, to make faster code. */ |
# define obstack_object_size(OBSTACK) \ |
__extension__ \ |
({ struct obstack *__o = (OBSTACK); \ |
(unsigned) (__o->next_free - __o->object_base); }) |
# define obstack_room(OBSTACK) \ |
__extension__ \ |
({ struct obstack *__o = (OBSTACK); \ |
(unsigned) (__o->chunk_limit - __o->next_free); }) |
# define obstack_make_room(OBSTACK,length) \ |
__extension__ \ |
({ struct obstack *__o = (OBSTACK); \ |
int __len = (length); \ |
if (__o->chunk_limit - __o->next_free < __len) \ |
_obstack_newchunk (__o, __len); \ |
(void) 0; }) |
# define obstack_empty_p(OBSTACK) \ |
__extension__ \ |
({ struct obstack *__o = (OBSTACK); \ |
(__o->chunk->prev == 0 && __o->next_free - __o->chunk->contents == 0); }) |
# define obstack_grow(OBSTACK,where,length) \ |
__extension__ \ |
({ struct obstack *__o = (OBSTACK); \ |
int __len = (length); \ |
if (__o->next_free + __len > __o->chunk_limit) \ |
_obstack_newchunk (__o, __len); \ |
_obstack_memcpy (__o->next_free, (where), __len); \ |
__o->next_free += __len; \ |
(void) 0; }) |
# define obstack_grow0(OBSTACK,where,length) \ |
__extension__ \ |
({ struct obstack *__o = (OBSTACK); \ |
int __len = (length); \ |
if (__o->next_free + __len + 1 > __o->chunk_limit) \ |
_obstack_newchunk (__o, __len + 1); \ |
_obstack_memcpy (__o->next_free, (where), __len); \ |
__o->next_free += __len; \ |
*(__o->next_free)++ = 0; \ |
(void) 0; }) |
# define obstack_1grow(OBSTACK,datum) \ |
__extension__ \ |
({ struct obstack *__o = (OBSTACK); \ |
if (__o->next_free + 1 > __o->chunk_limit) \ |
_obstack_newchunk (__o, 1); \ |
obstack_1grow_fast (__o, datum); \ |
(void) 0; }) |
/* These assume that the obstack alignment is good enough for pointers or ints, |
and that the data added so far to the current object |
shares that much alignment. */ |
# define obstack_ptr_grow(OBSTACK,datum) \ |
__extension__ \ |
({ struct obstack *__o = (OBSTACK); \ |
if (__o->next_free + sizeof (void *) > __o->chunk_limit) \ |
_obstack_newchunk (__o, sizeof (void *)); \ |
obstack_ptr_grow_fast (__o, datum); }) |
# define obstack_int_grow(OBSTACK,datum) \ |
__extension__ \ |
({ struct obstack *__o = (OBSTACK); \ |
if (__o->next_free + sizeof (int) > __o->chunk_limit) \ |
_obstack_newchunk (__o, sizeof (int)); \ |
obstack_int_grow_fast (__o, datum); }) |
# define obstack_ptr_grow_fast(OBSTACK,aptr) \ |
__extension__ \ |
({ struct obstack *__o1 = (OBSTACK); \ |
*(const void **) __o1->next_free = (aptr); \ |
__o1->next_free += sizeof (const void *); \ |
(void) 0; }) |
# define obstack_int_grow_fast(OBSTACK,aint) \ |
__extension__ \ |
({ struct obstack *__o1 = (OBSTACK); \ |
*(int *) __o1->next_free = (aint); \ |
__o1->next_free += sizeof (int); \ |
(void) 0; }) |
# define obstack_blank(OBSTACK,length) \ |
__extension__ \ |
({ struct obstack *__o = (OBSTACK); \ |
int __len = (length); \ |
if (__o->chunk_limit - __o->next_free < __len) \ |
_obstack_newchunk (__o, __len); \ |
obstack_blank_fast (__o, __len); \ |
(void) 0; }) |
# define obstack_alloc(OBSTACK,length) \ |
__extension__ \ |
({ struct obstack *__h = (OBSTACK); \ |
obstack_blank (__h, (length)); \ |
obstack_finish (__h); }) |
# define obstack_copy(OBSTACK,where,length) \ |
__extension__ \ |
({ struct obstack *__h = (OBSTACK); \ |
obstack_grow (__h, (where), (length)); \ |
obstack_finish (__h); }) |
# define obstack_copy0(OBSTACK,where,length) \ |
__extension__ \ |
({ struct obstack *__h = (OBSTACK); \ |
obstack_grow0 (__h, (where), (length)); \ |
obstack_finish (__h); }) |
/* The local variable is named __o1 to avoid a name conflict |
when obstack_blank is called. */ |
# define obstack_finish(OBSTACK) \ |
__extension__ \ |
({ struct obstack *__o1 = (OBSTACK); \ |
void *value; \ |
value = (void *) __o1->object_base; \ |
if (__o1->next_free == value) \ |
__o1->maybe_empty_object = 1; \ |
__o1->next_free \ |
= __INT_TO_PTR ((__PTR_TO_INT (__o1->next_free)+__o1->alignment_mask)\ |
& ~ (__o1->alignment_mask)); \ |
if (__o1->next_free - (char *)__o1->chunk \ |
> __o1->chunk_limit - (char *)__o1->chunk) \ |
__o1->next_free = __o1->chunk_limit; \ |
__o1->object_base = __o1->next_free; \ |
value; }) |
# define obstack_free(OBSTACK, OBJ) \ |
__extension__ \ |
({ struct obstack *__o = (OBSTACK); \ |
void *__obj = (void *) (OBJ); \ |
if (__obj > (void *)__o->chunk && __obj < (void *)__o->chunk_limit) \ |
__o->next_free = __o->object_base = (char *) __obj; \ |
else (obstack_free) (__o, __obj); }) |
#else /* not __GNUC__ or not __STDC__ */ |
# define obstack_object_size(h) \ |
(unsigned) ((h)->next_free - (h)->object_base) |
# define obstack_room(h) \ |
(unsigned) ((h)->chunk_limit - (h)->next_free) |
# define obstack_empty_p(h) \ |
((h)->chunk->prev == 0 && (h)->next_free - (h)->chunk->contents == 0) |
/* Note that the call to _obstack_newchunk is enclosed in (..., 0) |
so that we can avoid having void expressions |
in the arms of the conditional expression. |
Casting the third operand to void was tried before, |
but some compilers won't accept it. */ |
# define obstack_make_room(h,length) \ |
( (h)->temp = (length), \ |
(((h)->next_free + (h)->temp > (h)->chunk_limit) \ |
? (_obstack_newchunk ((h), (h)->temp), 0) : 0)) |
# define obstack_grow(h,where,length) \ |
( (h)->temp = (length), \ |
(((h)->next_free + (h)->temp > (h)->chunk_limit) \ |
? (_obstack_newchunk ((h), (h)->temp), 0) : 0), \ |
_obstack_memcpy ((h)->next_free, (where), (h)->temp), \ |
(h)->next_free += (h)->temp) |
# define obstack_grow0(h,where,length) \ |
( (h)->temp = (length), \ |
(((h)->next_free + (h)->temp + 1 > (h)->chunk_limit) \ |
? (_obstack_newchunk ((h), (h)->temp + 1), 0) : 0), \ |
_obstack_memcpy ((h)->next_free, (where), (h)->temp), \ |
(h)->next_free += (h)->temp, \ |
*((h)->next_free)++ = 0) |
# define obstack_1grow(h,datum) \ |
( (((h)->next_free + 1 > (h)->chunk_limit) \ |
? (_obstack_newchunk ((h), 1), 0) : 0), \ |
obstack_1grow_fast (h, datum)) |
# define obstack_ptr_grow(h,datum) \ |
( (((h)->next_free + sizeof (char *) > (h)->chunk_limit) \ |
? (_obstack_newchunk ((h), sizeof (char *)), 0) : 0), \ |
obstack_ptr_grow_fast (h, datum)) |
# define obstack_int_grow(h,datum) \ |
( (((h)->next_free + sizeof (int) > (h)->chunk_limit) \ |
? (_obstack_newchunk ((h), sizeof (int)), 0) : 0), \ |
obstack_int_grow_fast (h, datum)) |
# define obstack_ptr_grow_fast(h,aptr) \ |
(((const void **) ((h)->next_free += sizeof (void *)))[-1] = (aptr)) |
# define obstack_int_grow_fast(h,aint) \ |
(((int *) ((h)->next_free += sizeof (int)))[-1] = (aptr)) |
# define obstack_blank(h,length) \ |
( (h)->temp = (length), \ |
(((h)->chunk_limit - (h)->next_free < (h)->temp) \ |
? (_obstack_newchunk ((h), (h)->temp), 0) : 0), \ |
obstack_blank_fast (h, (h)->temp)) |
# define obstack_alloc(h,length) \ |
(obstack_blank ((h), (length)), obstack_finish ((h))) |
# define obstack_copy(h,where,length) \ |
(obstack_grow ((h), (where), (length)), obstack_finish ((h))) |
# define obstack_copy0(h,where,length) \ |
(obstack_grow0 ((h), (where), (length)), obstack_finish ((h))) |
# define obstack_finish(h) \ |
( ((h)->next_free == (h)->object_base \ |
? (((h)->maybe_empty_object = 1), 0) \ |
: 0), \ |
(h)->temp = __PTR_TO_INT ((h)->object_base), \ |
(h)->next_free \ |
= __INT_TO_PTR ((__PTR_TO_INT ((h)->next_free)+(h)->alignment_mask) \ |
& ~ ((h)->alignment_mask)), \ |
(((h)->next_free - (char *) (h)->chunk \ |
> (h)->chunk_limit - (char *) (h)->chunk) \ |
? ((h)->next_free = (h)->chunk_limit) : 0), \ |
(h)->object_base = (h)->next_free, \ |
(void *) __INT_TO_PTR ((h)->temp)) |
# define obstack_free(h,obj) \ |
( (h)->temp = (char *) (obj) - (char *) (h)->chunk, \ |
(((h)->temp > 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\ |
? (((h)->next_free = (h)->object_base \ |
= (h)->temp + (char *) (h)->chunk), 0) \ |
: ((obstack_free) ((h), (h)->temp + (char *) (h)->chunk), 0))) |
#endif /* not __GNUC__ or not __STDC__ */ |
#ifdef __cplusplus |
} /* C++ */ |
#endif |
#endif /* obstack.h */ |
/contrib/toolchain/binutils/include/opcode/ChangeLog |
---|
0,0 → 1,1939 |
2013-11-20 Yufeng Zhang <yufeng.zhang@arm.com> |
* aarch64.h (aarch64_pstatefields): Change element type to |
aarch64_sys_reg. |
2013-11-18 Renlin Li <Renlin.Li@arm.com> |
* arm.h (ARM_AEXT_V7VE): New define. |
(ARM_ARCH_V7VE): New define. |
(ARM_ARCH_V7A_IDIV_MP_SEC_VIRT): Removed. |
2013-11-18 Yufeng Zhang <yufeng.zhang@arm.com> |
Revert |
2013-11-15 Yufeng Zhang <yufeng.zhang@arm.com> |
* aarch64.h (aarch64_sys_reg_readonly_p): New declaration. |
(aarch64_sys_reg_writeonly_p): Ditto. |
2013-11-15 Yufeng Zhang <yufeng.zhang@arm.com> |
* aarch64.h (aarch64_sys_reg_readonly_p): New declaration. |
(aarch64_sys_reg_writeonly_p): Ditto. |
2013-11-05 Yufeng Zhang <yufeng.zhang@arm.com> |
* aarch64.h (aarch64_sys_reg): New typedef. |
(aarch64_sys_regs): Change to define with the new type. |
(aarch64_sys_reg_deprecated_p): Declare. |
2013-11-05 Yufeng Zhang <yufeng.zhang@arm.com> |
* aarch64.h (enum aarch64_operand_class): Add AARCH64_OPND_CLASS_COND. |
(enum aarch64_opnd): Add AARCH64_OPND_COND1. |
2013-08-23 Yuri Chornoivan <yurchor@ukr.net> |
PR binutils/15834 |
* i960.h: Fix typos. |
2013-08-19 Richard Sandiford <rdsandiford@googlemail.com> |
* mips.h: Remove references to "+I" and imm2_expr. |
2013-08-19 Richard Sandiford <rdsandiford@googlemail.com> |
* mips.h (M_DEXT, M_DINS): Delete. |
2013-08-19 Richard Sandiford <rdsandiford@googlemail.com> |
* mips.h (OP_OPTIONAL_REG): New mips_operand_type. |
(mips_optional_operand_p): New function. |
2013-08-04 Jürgen Urban <JuergenUrban@gmx.de> |
Richard Sandiford <rdsandiford@googlemail.com> |
* mips.h: Document new VU0 operand characters. |
(OP_VU0_SUFFIX, OP_VU0_MATCH_SUFFIX): New mips_operand_types. |
(OP_REG_VF, OP_REG_VI, OP_REG_R5900_I, OP_REG_R5900_Q, OP_REG_R5900_R) |
(OP_REG_R5900_ACC): New mips_reg_operand_types. |
(INSN2_VU0_CHANNEL_SUFFIX): New macro. |
(mips_vu0_channel_mask): Declare. |
2013-08-03 Richard Sandiford <rdsandiford@googlemail.com> |
* mips.h (mips_pcrel_operand): Inherit from mips_int_operand. |
(mips_int_operand_min, mips_int_operand_max): New functions. |
(mips_decode_pcrel_operand): Use mips_decode_int_operand. |
2013-08-01 Richard Sandiford <rdsandiford@googlemail.com> |
* mips.h (mips_decode_reg_operand): New function. |
(INSN_WRITE_SHIFT, INSN_WRITE_1, INSN_WRITE_2, INSN_WRITE_ALL) |
(INSN_READ_SHIFT, INSN_READ_1, INSN_READ_2, INSN_READ_3, INSN_READ_4) |
(INSN_READ_ALL, INSN_READ_GPR_24, INSN_WRITE_GPR_24, INSN_UDI): |
New macros. |
(INSN_WRITE_GPR_D, INSN_WRITE_GPR_T, INSN_WRITE_FPR_D) |
(INSN_WRITE_FPR_S, INSN_WRITE_FPR_T, INSN_READ_GPR_S, INSN_READ_GPR_T) |
(INSN_READ_FPR_S, INSN_READ_FPR_T, INSN_READ_FPR_R, INSN_WRITE_GPR_S) |
(INSN2_WRITE_GPR_Z, INSN2_WRITE_FPR_Z, INSN2_READ_GPR_Z) |
(INSN2_READ_FPR_Z, INSN2_READ_GPR_D, INSN2_READ_FPR_D) |
(INSN2_WRITE_GPR_MB, INSN2_READ_GPR_MC, INSN2_MOD_GPR_MD) |
(INSN2_READ_GPR_ME, INSN2_MOD_GPR_MF, INSN2_READ_GPR_MG) |
(INSN2_READ_GPR_MJ, INSN2_WRITE_GPR_MJ, INSN2_READ_GPR_MP) |
(INSN2_WRITE_GPR_MP, INSN2_READ_GPR_MQ, INSN2_READ_GP) |
(INSN2_WRITE_GPR_MH, INSN2_READ_GPR_MMN): Delete. Renumber other |
macros to cover the gaps. |
(INSN2_MOD_SP): Replace with... |
(INSN2_WRITE_SP, INSN2_READ_SP): ...these new macros. |
(MIPS16_INSN_WRITE_X, MIPS16_INSN_WRITE_Y, MIPS16_INSN_WRITE_Z) |
(MIPS16_INSN_WRITE_T, MIPS16_INSN_WRITE_31, MIPS16_INSN_WRITE_GPR_Y) |
(MIPS16_INSN_READ_X, MIPS16_INSN_READ_Y, MIPS16_INSN_READ_Z) |
(MIPS16_INSN_READ_T, MIPS16_INSN_READ_SP, MIPS16_INSN_READ_GPR_X): |
Delete. |
2013-08-01 Richard Sandiford <rdsandiford@googlemail.com> |
* mips.h (MIPS16_INSN_WRITE_SP, MIPS16_INSN_READ_31) |
(MIPS16_INSN_READ_PC, MIPS16_INSN_UNCOND_BRANCH) |
(MIPS16_INSN_COND_BRANCH): Delete. |
2013-07-24 Anna Tikhonova <anna.tikhonova@intel.com> |
Kirill Yukhin <kirill.yukhin@intel.com> |
Michael Zolotukhin <michael.v.zolotukhin@intel.com> |
* i386.h (BND_PREFIX_OPCODE): New. |
2013-07-14 Richard Sandiford <rdsandiford@googlemail.com> |
* mips.h (mips_operand_type): Add OP_ENTRY_EXIT_LIST and |
OP_SAVE_RESTORE_LIST. |
(decode_mips16_operand): Declare. |
2013-07-14 Richard Sandiford <rdsandiford@googlemail.com> |
* mips.h (mips_operand_type, mips_reg_operand_type): New enums. |
(mips_operand, mips_int_operand, mips_mapped_int_operand) |
(mips_msb_operand, mips_reg_operand, mips_reg_pair_operand) |
(mips_pcrel_operand): New structures. |
(mips_insert_operand, mips_extract_operand, mips_signed_operand) |
(mips_decode_int_operand, mips_decode_pcrel_operand): New functions. |
(decode_mips_operand, decode_micromips_operand): Declare. |
2013-07-14 Richard Sandiford <rdsandiford@googlemail.com> |
* mips.h: Document MIPS16 "I" opcode. |
2013-07-07 Richard Sandiford <rdsandiford@googlemail.com> |
* mips.h (M_ACLR_OB, M_ASET_OB, M_CACHE_OB, M_CACHEE_OB, M_L_DOB) |
(M_LB_A, M_LBE_OB, M_LBU_A, M_LBUE_OB, M_LD_A, M_LD_OB, M_LDC2_OB) |
(M_LDL_OB, M_LDM_OB, M_LDP_OB, M_LDR_OB, M_LH_A, M_LHE_OB, M_LHU_A) |
(M_LHUE_OB, M_LL_OB, M_LLD_OB, M_LLE_OB, M_LS_A, M_LW_A, M_LWE_OB) |
(M_LWC0_A, M_LWC1_A, M_LWC2_A, M_LWC2_OB, M_LWC3_A, M_LWL_A, M_LWL_OB) |
(M_LWLE_OB, M_LWM_OB, M_LWP_OB, M_LWR_A, M_LWR_OB, M_LWRE_OB, M_LWU_OB) |
(M_PREF_OB, M_PREFE_OB, M_S_DOB, M_SAA_OB, M_SAAD_OB, M_SC_OB) |
(M_SCD_OB, M_SCE_OB, M_SD_A, M_SD_OB, M_SDC2_OB, M_SDL_OB, M_SDM_OB) |
(M_SDP_OB, M_SDR_OB, M_SB_A, M_SBE_OB, M_SH_A, M_SHE_OB, M_SW_A) |
(M_SWE_OB, M_SWC0_A, M_SWC1_A, M_SWC2_A, M_SWC2_OB, M_SWC3_A, M_SWL_A) |
(M_SWL_OB, M_SWLE_OB, M_SWM_OB, M_SWP_OB, M_SWR_A, M_SWR_OB, M_SWRE_OB) |
(M_ULD, M_ULH, M_ULHU, M_ULW, M_USH, M_USW, M_USD): Delete. |
(M_ULD_A, M_ULH_A, M_ULHU_A, M_ULW_A, M_USH_A, M_USW_A, M_USD_A): |
Rename to... |
(M_ULD_AB, M_ULH_AB, M_ULHU_AB, M_ULW_AB, M_USH_AB, M_USW_AB) |
(M_USD_AB): ...these. |
2013-07-07 Richard Sandiford <rdsandiford@googlemail.com> |
* mips.h: Remove documentation of "[" and "]". Update documentation |
of "k" and the MDMX formats. |
2013-07-07 Richard Sandiford <rdsandiford@googlemail.com> |
* mips.h: Update documentation of "+s" and "+S". |
2013-07-07 Richard Sandiford <rdsandiford@googlemail.com> |
* mips.h: Document "+i". |
2013-07-07 Richard Sandiford <rdsandiford@googlemail.com> |
* mips.h: Remove "mi" documentation. Update "mh" documentation. |
(OP_MASK_MI, OP_SH_MI, MICROMIPSOP_MASK_MI, MICROMIPSOP_MASK_MI): |
Delete. |
(INSN2_WRITE_GPR_MHI): Rename to... |
(INSN2_WRITE_GPR_MH): ...this. |
2013-07-07 Richard Sandiford <rdsandiford@googlemail.com> |
* mips.h: Remove documentation of "+D" and "+T". |
2013-06-26 Richard Sandiford <rdsandiford@googlemail.com> |
* mips.h: Fix comment for "1": it is now STYPE rather than SHAMT. |
Use "source" rather than "destination" for microMIPS "G". |
2013-06-25 Maciej W. Rozycki <macro@codesourcery.com> |
* mips.h: Add M_JRADDIUSP, M_JRC and M_MOVEP anonymous enum |
values. |
2013-06-23 Richard Sandiford <rdsandiford@googlemail.com> |
* mips.h: Fix comment typo: "G" is _RS rather than _RD for microMIPS. |
2013-06-17 Catherine Moore <clm@codesourcery.com> |
Maciej W. Rozycki <macro@codesourcery.com> |
Chao-Ying Fu <fu@mips.com> |
* mips.h (OP_SH_EVAOFFSET): Define. |
(OP_MASK_EVAOFFSET): Define. |
(INSN_ASE_MASK): Delete. |
(ASE_EVA): Define. |
(M_CACHEE_AB, M_CACHEE_OB): New. |
(M_LBE_OB, M_LBE_AB): New. |
(M_LBUE_OB, M_LBUE_AB): New. |
(M_LHE_OB, M_LHE_AB): New. |
(M_LHUE_OB, M_LHUE_AB): New. |
(M_LLE_AB, M_LLE_OB): New. |
(M_LWE_OB, M_LWE_AB): New. |
(M_LWLE_AB, M_LWLE_OB): New. |
(M_LWRE_AB, M_LWRE_OB): New. |
(M_PREFE_AB, M_PREFE_OB): New. |
(M_SCE_AB, M_SCE_OB): New. |
(M_SBE_OB, M_SBE_AB): New. |
(M_SHE_OB, M_SHE_AB): New. |
(M_SWE_OB, M_SWE_AB): New. |
(M_SWLE_AB, M_SWLE_OB): New. |
(M_SWRE_AB, M_SWRE_OB): New. |
(MICROMIPSOP_SH_EVAOFFSET): Define. |
(MICROMIPSOP_MASK_EVAOFFSET): Define. |
2013-06-12 Sandra Loosemore <sandra@codesourcery.com> |
* nios2.h (OP_MATCH_ERET): Correct eret encoding. |
2013-05-22 Jürgen Urban <JuergenUrban@gmx.de> |
* mips.h (M_LQC2_AB, M_SQC2_AB): New macros. |
2013-05-09 Andrew Pinski <apinski@cavium.com> |
* mips.h (OP_MASK_CODE10): Correct definition. |
(OP_SH_CODE10): Likewise. |
Add a comment that "+J" is used now for OP_*CODE10. |
(INSN_ASE_MASK): Update. |
(INSN_VIRT): New macro. |
(INSN_VIRT64): New macro |
2013-05-02 Nick Clifton <nickc@redhat.com> |
* msp430.h: Add patterns for MSP430X instructions. |
2013-04-06 David S. Miller <davem@davemloft.net> |
* sparc.h (F_PREFERRED): Define. |
(F_PREF_ALIAS): Define. |
2013-04-03 Nick Clifton <nickc@redhat.com> |
* v850.h (V850_INVERSE_PCREL): Define. |
2013-03-27 Alexis Deruelle <alexis.deruelle@gmail.com> |
PR binutils/15068 |
* tic6x-opcode-table.h: Fix patterns for add, ldnw and xor. |
2013-03-27 Alexis Deruelle <alexis.deruelle@gmail.com> |
PR binutils/15068 |
* tic6xc-insn-formats.h (FLD): Add use of bitfield array. |
Add 16-bit opcodes. |
* tic6xc-opcode-table.h: Add 16-bit insns. |
* tic6x.h: Add support for 16-bit insns. |
2013-03-21 Michael Schewe <michael.schewe@gmx.net> |
* h8300.h: Add MEMRELAX flag for mov.b/w/l @(d:32,ERs),Rd |
and mov.b/w/l Rs,@(d:32,ERd). |
2013-03-20 Alexis Deruelle <alexis.deruelle@gmail.com> |
PR gas/15082 |
* tic6x-opcode-table.h: Rename mpydp's specific operand type macro |
from ORREGD1324 to ORXREGD1324 and make it cross-path-able through |
tic6x_operand_xregpair operand coding type. |
Make mpydp instruction cross-path-able, ie: remove the FIXed 'x' |
opcode field, usu ORXREGD1324 for the src2 operand and remove the |
TIC6X_FLAG_NO_CROSS. |
2013-03-20 Alexis Deruelle <alexis.deruelle@gmail.com> |
PR gas/15095 |
* tic6x.h (enum tic6x_coding_method): Add |
tic6x_coding_dreg_(msb|lsb) field coding type in order to encode |
separately the msb and lsb of a register pair. This is needed to |
encode the opcodes in the same way as TI assembler does. |
* tic6x-opcode-table.h: Modify absdp, dpint, dpsp, dptrunc, rcpdp |
and rsqrdp opcodes to use the new field coding types. |
2013-03-11 Kyrylo Tkachov <kyrylo.tkachov@arm.com> |
* arm.h (CRC_EXT_ARMV8): New constant. |
(ARCH_CRC_ARMV8): New macro. |
2013-02-28 Yufeng Zhang <yufeng.zhang@arm.com> |
* aarch64.h (AARCH64_FEATURE_CRC): New macro. |
2013-02-06 Sandra Loosemore <sandra@codesourcery.com> |
Andrew Jenner <andrew@codesourcery.com> |
Based on patches from Altera Corporation. |
* nios2.h: New file. |
2013-01-30 Yufeng Zhang <yufeng.zhang@arm.com> |
* aarch64.h (aarch64_op): Add OP_SXTL, OP_SXTL2, OP_UXTL and OP_UXTL2. |
2013-01-28 Alexis Deruelle <alexis.deruelle@gmail.com> |
PR gas/15069 |
* tic6x-opcode-table.h: Fix encoding of BNOP instruction. |
2013-01-24 Nick Clifton <nickc@redhat.com> |
* v850.h: Add e3v5 support. |
2013-01-17 Yufeng Zhang <yufeng.zhang@arm.com> |
* aarch64.h (aarch64_op): Remove OP_V_MOVI_B. |
2013-01-10 Peter Bergner <bergner@vnet.ibm.com> |
* ppc.h (PPC_OPCODE_POWER8): New define. |
(PPC_OPCODE_HTM): Likewise. |
2013-01-10 Will Newton <will.newton@imgtec.com> |
* metag.h: New file. |
2013-01-07 Kaushik Phatak <kaushik.phatak@kpitcummins.com> |
* cr16.h (make_instruction): Rename to cr16_make_instruction. |
(match_opcode): Rename to cr16_match_opcode. |
2013-01-04 Juergen Urban <JuergenUrban@gmx.de> |
* mips.h: Add support for r5900 instructions including lq and sq. |
2013-01-02 Kaushik Phatak <kaushik.phatak@kpitcummins.com> |
* cr16.h (dwordU,wordU): Moved typedefs from cr16-dis.c |
(make_instruction,match_opcode): Added function prototypes. |
(cr16_words,cr16_allWords,cr16_currInsn): Declare as extern. |
2012-11-23 Alan Modra <amodra@gmail.com> |
* ppc.h (ppc_parse_cpu): Update prototype. |
2012-10-14 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> |
* hppa.h (pa_opcodes): Use "cX" completer instead of "cx" in fstqx |
opcodes. Likewise, use "cM" instead of "cm" in fstqs opcodes. |
2012-10-04 Andreas Krebbel <Andreas.Krebbel@de.ibm.com> |
* s390.h (s390_opcode_cpu_val): Add S390_OPCODE_ZEC12. |
2012-09-04 Sergey A. Guriev <sergey.a.guriev@intel.com> |
* ia64.h (ia64_opnd): Add new operand types. |
2012-08-21 David S. Miller <davem@davemloft.net> |
* sparc.h (F3F4): New macro. |
2012-08-13 Ian Bolton <ian.bolton@arm.com> |
Laurent Desnogues <laurent.desnogues@arm.com> |
Jim MacArthur <jim.macarthur@arm.com> |
Marcus Shawcroft <marcus.shawcroft@arm.com> |
Nigel Stephens <nigel.stephens@arm.com> |
Ramana Radhakrishnan <ramana.radhakrishnan@arm.com> |
Richard Earnshaw <rearnsha@arm.com> |
Sofiane Naci <sofiane.naci@arm.com> |
Tejas Belagod <tejas.belagod@arm.com> |
Yufeng Zhang <yufeng.zhang@arm.com> |
* aarch64.h: New file. |
2012-08-13 Richard Sandiford <rdsandiford@googlemail.com> |
Maciej W. Rozycki <macro@codesourcery.com> |
* mips.h (mips_opcode): Add the exclusions field. |
(OPCODE_IS_MEMBER): Remove macro. |
(cpu_is_member): New inline function. |
(opcode_is_member): Likewise. |
2012-07-31 Chao-Ying Fu <fu@mips.com> |
Catherine Moore <clm@codesourcery.com> |
Maciej W. Rozycki <macro@codesourcery.com> |
* mips.h: Document microMIPS DSP ASE usage. |
(MICROMIPSOP_MASK_DSPACC, MICROMIPSOP_SH_DSPACC): Update for |
microMIPS DSP ASE support. |
(MICROMIPSOP_MASK_DSPSFT, MICROMIPSOP_SH_DSPSFT): Likewise. |
(MICROMIPSOP_MASK_SA3, MICROMIPSOP_SH_SA3): Likewise. |
(MICROMIPSOP_MASK_SA4, MICROMIPSOP_SH_SA4): Likewise. |
(MICROMIPSOP_MASK_IMM8, MICROMIPSOP_SH_IMM8): Likewise. |
(MICROMIPSOP_MASK_IMM10, MICROMIPSOP_SH_IMM10): Likewise. |
(MICROMIPSOP_MASK_WRDSP, MICROMIPSOP_SH_WRDSP): Likewise. |
(MICROMIPSOP_MASK_BP, MICROMIPSOP_SH_BP): Likewise. |
2012-07-06 Maciej W. Rozycki <macro@codesourcery.com> |
* mips.h: Fix a typo in description. |
2012-06-07 Georg-Johann Lay <avr@gjlay.de> |
* avr.h: (AVR_ISA_XCH): New define. |
(AVR_ISA_XMEGA): Use it. |
(XCH, LAS, LAT, LAC): New XMEGA opcodes. |
2012-05-15 James Murray <jsm@jsm-net.demon.co.uk> |
* m68hc11.h: Add XGate definitions. |
(struct m68hc11_opcode): Add xg_mask field. |
2012-05-14 Catherine Moore <clm@codesourcery.com> |
Maciej W. Rozycki <macro@codesourcery.com> |
Rhonda Wittels <rhonda@codesourcery.com> |
* ppc.h (PPC_OPCODE_VLE): New definition. |
(PPC_OP_SA): New macro. |
(PPC_OP_SE_VLE): New macro. |
(PPC_OP): Use a variable shift amount. |
(powerpc_operand): Update comments. |
(PPC_OPSHIFT_INV): New macro. |
(PPC_OPERAND_CR): Replace with... |
(PPC_OPERAND_CR_BIT): ...this and |
(PPC_OPERAND_CR_REG): ...this. |
2012-05-03 Sean Keys <skeys@ipdatasys.com> |
* xgate.h: Header file for XGATE assembler. |
2012-04-27 David S. Miller <davem@davemloft.net> |
* sparc.h: Document new arg code' )' for crypto RS3 |
immediates. |
* sparc.h (struct sparc_opcode): New field 'hwcaps'. |
F_MUL32, F_DIV32, F_FDMULD, F_V8PLUS, F_POPC, F_VIS, F_VIS2, |
F_ASI_BLK_INIT, F_FMAF, F_VIS3, F_HPC, F_RANDOM, F_TRANS, |
F_FJFMAU, F_IMA, F_ASI_CACHE_SPARING, F_HWCAP_MASK): Delete. |
(HWCAP_MUL32, HWCAP_DIV32, HWCAP_FSMULD, HWCAP_V8PLUS, HWCAP_POPC, |
HWCAP_VIS, HWCAP_VIS2, HWCAP_ASI_BLK_INIT, HWCAP_FMAF, |
HWCAP_VIS3, HWCAP_HPC, HWCAP_RANDOM, HWCAP_TRANS, HWCAP_FJFMAU, |
HWCAP_IMA, HWCAP_ASI_CACHE_SPARING, HWCAP_AES, HWCAP_DES, |
HWCAP_KASUMI, HWCAP_CAMELLIA, HWCAP_MD5, HWCAP_SHA1, |
HWCAP_SHA256, HWCAP_SHA512, HWCAP_MPMUL, HWCAP_MONT, HWCAP_PAUSE, |
HWCAP_CBCOND, HWCAP_CRC32): New defines. |
2012-03-10 Edmar Wienskoski <edmar@freescale.com> |
* ppc.h: Add PPC_OPCODE_ALTIVEC2, PPC_OPCODE_E6500, PPC_OPCODE_TMR. |
2012-02-27 Alan Modra <amodra@gmail.com> |
* crx.h (cst4_map): Update declaration. |
2012-02-25 Walter Lee <walt@tilera.com> |
* tilegx.h (tilegx_mnemonic): Add TILEGX_OPC_LD4S_TLS, |
TILEGX_OPC_LD_TLS. |
* tilepro.h (tilepro_mnemonic): Add TILEPRO_OPC_LW_TLS, |
TILEPRO_OPC_LW_TLS_SN. |
2012-02-08 H.J. Lu <hongjiu.lu@intel.com> |
* i386.h (XACQUIRE_PREFIX_OPCODE): New. |
(XRELEASE_PREFIX_OPCODE): Likewise. |
2011-12-08 Andrew Pinski <apinski@cavium.com> |
Adam Nemet <anemet@caviumnetworks.com> |
* mips.h (INSN_CHIP_MASK): Update according to INSN_OCTEON2. |
(INSN_OCTEON2): New macro. |
(CPU_OCTEON2): New macro. |
(OPCODE_IS_MEMBER): Add Octeon2. |
2011-11-29 Andrew Pinski <apinski@cavium.com> |
* mips.h (INSN_CHIP_MASK): Update according to INSN_OCTEONP. |
(INSN_OCTEONP): New macro. |
(CPU_OCTEONP): New macro. |
(OPCODE_IS_MEMBER): Add Octeon+. |
(M_SAA_AB, M_SAAD_AB, M_SAA_OB, M_SAAD_OB): New enum values. |
2011-11-01 DJ Delorie <dj@redhat.com> |
* rl78.h: New file. |
2011-10-24 Maciej W. Rozycki <macro@codesourcery.com> |
* mips.h: Fix a typo in description. |
2011-09-21 David S. Miller <davem@davemloft.net> |
* sparc.h (struct sparc_opcode): Expand 'flags' to unsigned int. |
(F_MUL32, F_DIV32, F_FSMULD, F_V8PLUS, F_POPC, F_VIS, F_VIS2, |
F_ASI_BLK_INIT, F_FMAF, F_VIS3, F_HPC, F_RANDOM, F_TRANS, |
F_FJFMAU, F_IMA, F_ASI_CACHE_SPARING): New flag bits. |
2011-08-09 Chao-ying Fu <fu@mips.com> |
Maciej W. Rozycki <macro@codesourcery.com> |
* mips.h (OP_MASK_3BITPOS, OP_SH_3BITPOS): New macros. |
(OP_MASK_OFFSET12, OP_SH_OFFSET12): Redefine. |
(INSN_ASE_MASK): Add the MCU bit. |
(INSN_MCU): New macro. |
(M_ACLR_AB, M_ACLR_OB, M_ASET_AB, M_ASET_OB): New enum values. |
(MICROMIPSOP_MASK_3BITPOS, MICROMIPSOP_SH_3BITPOS): New macros. |
2011-08-09 Maciej W. Rozycki <macro@codesourcery.com> |
* mips.h (INSN_WRITE_GPR_S, INSN2_WRITE_GPR_MB): New macros. |
(INSN2_READ_GPR_MC, INSN2_READ_GPR_ME): Likewise. |
(INSN2_WRITE_GPR_MF, INSN2_READ_GPR_MG): Likewise. |
(INSN2_READ_GPR_MJ, INSN2_WRITE_GPR_MJ): Likewise. |
(INSN2_READ_GPR_MP, INSN2_WRITE_GPR_MP): Likewise. |
(INSN2_READ_GPR_MQ, INSN2_WRITE_GPR_MHI): Likewise. |
(INSN2_READ_GPR_MMN): Likewise. |
(INSN2_READ_FPR_D): Change the bit used. |
(INSN2_MOD_GPR_MD, INSN2_MOD_GPR_MF): Likewise. |
(INSN2_MOD_SP, INSN2_READ_GPR_31, INSN2_READ_GP): Likewise. |
(INSN2_READ_PC, INSN2_UNCOND_BRANCH): Likewise. |
(INSN2_COND_BRANCH): Likewise. |
(INSN2_WRITE_GPR_S, INSN2_MOD_GPR_MB): Remove macros. |
(INSN2_MOD_GPR_MC, INSN2_MOD_GPR_ME, INSN2_MOD_GPR_MG): Likewise. |
(INSN2_MOD_GPR_MJ, INSN2_MOD_GPR_MP, INSN2_MOD_GPR_MQ): Likewise. |
(INSN2_MOD_GPR_MHI, INSN2_MOD_GPR_MM): Likewise. |
(INSN2_MOD_GPR_MN): Likewise. |
2011-08-05 David S. Miller <davem@davemloft.net> |
* sparc.h: Document new format codes '4', '5', and '('. |
(OPF_LOW4, RS3): New macros. |
2011-08-03 Maciej W. Rozycki <macro@codesourcery.com> |
* mips.h: Document the use of FP_D in MIPS16 mode. Adjust the |
order of flags documented. |
2011-07-29 Maciej W. Rozycki <macro@codesourcery.com> |
* mips.h: Clarify the description of microMIPS instruction |
manipulation macros. |
(MICROMIPSOP_MASK_MAJOR, MICROMIPSOP_SH_MAJOR): Remove macros. |
2011-07-24 Chao-ying Fu <fu@mips.com> |
Maciej W. Rozycki <macro@codesourcery.com> |
* mips.h (OP_MASK_EXTLSB, OP_SH_EXTLSB): New macros. |
(OP_MASK_STYPE, OP_SH_STYPE): Likewise. |
(OP_MASK_CODE10, OP_SH_CODE10): Likewise. |
(OP_MASK_TRAP, OP_SH_TRAP): Likewise. |
(OP_MASK_OFFSET12, OP_SH_OFFSET12): Likewise. |
(OP_MASK_OFFSET10, OP_SH_OFFSET10): Likewise. |
(OP_MASK_RS3, OP_SH_RS3): Likewise. |
(OP_MASK_MB, OP_SH_MB, OP_MASK_MC, OP_SH_MC): Likewise. |
(OP_MASK_MD, OP_SH_MD, OP_MASK_ME, OP_SH_ME): Likewise. |
(OP_MASK_MF, OP_SH_MF, OP_MASK_MG, OP_SH_MG): Likewise. |
(OP_MASK_MJ, OP_SH_MJ, OP_MASK_ML, OP_SH_ML): Likewise. |
(OP_MASK_MP, OP_SH_MP, OP_MASK_MQ, OP_SH_MQ): Likewise. |
(OP_MASK_IMMA, OP_SH_IMMA, OP_MASK_IMMB, OP_SH_IMMB): Likewise. |
(OP_MASK_IMMC, OP_SH_IMMC, OP_MASK_IMMF, OP_SH_IMMF): Likewise. |
(OP_MASK_IMMG, OP_SH_IMMG, OP_MASK_IMMH, OP_SH_IMMH): Likewise. |
(OP_MASK_IMMI, OP_SH_IMMI, OP_MASK_IMMJ, OP_SH_IMMJ): Likewise. |
(OP_MASK_IMML, OP_SH_IMML, OP_MASK_IMMM, OP_SH_IMMM): Likewise. |
(OP_MASK_IMMN, OP_SH_IMMN, OP_MASK_IMMO, OP_SH_IMMO): Likewise. |
(OP_MASK_IMMP, OP_SH_IMMP, OP_MASK_IMMQ, OP_SH_IMMQ): Likewise. |
(OP_MASK_IMMU, OP_SH_IMMU, OP_MASK_IMMW, OP_SH_IMMW): Likewise. |
(OP_MASK_IMMX, OP_SH_IMMX, OP_MASK_IMMY, OP_SH_IMMY): Likewise. |
(INSN_WRITE_GPR_S): New macro. |
(INSN2_BRANCH_DELAY_16BIT, INSN2_BRANCH_DELAY_32BIT): Likewise. |
(INSN2_READ_FPR_D): Likewise. |
(INSN2_MOD_GPR_MB, INSN2_MOD_GPR_MC): Likewise. |
(INSN2_MOD_GPR_MD, INSN2_MOD_GPR_ME): Likewise. |
(INSN2_MOD_GPR_MF, INSN2_MOD_GPR_MG): Likewise. |
(INSN2_MOD_GPR_MJ, INSN2_MOD_GPR_MP): Likewise. |
(INSN2_MOD_GPR_MQ, INSN2_MOD_SP): Likewise. |
(INSN2_READ_GPR_31, INSN2_READ_GP, INSN2_READ_PC): Likewise. |
(INSN2_UNCOND_BRANCH, INSN2_COND_BRANCH): Likewise. |
(INSN2_MOD_GPR_MHI, INSN2_MOD_GPR_MM, INSN2_MOD_GPR_MN): Likewise. |
(CPU_MICROMIPS): New macro. |
(M_BC1FL, M_BC1TL, M_BC2FL, M_BC2TL): New enum values. |
(M_BEQL, M_BGEZ, M_BGEZL, M_BGEZALL, M_BGTZ, M_BGTZL): Likewise. |
(M_BLEZ, M_BLEZL, M_BLTZ, M_BLTZL, M_BLTZALL, M_BNEL): Likewise. |
(M_CACHE_OB, M_JALS_1, M_JALS_2, M_JALS_A): Likewise. |
(M_LDC2_OB, M_LDL_OB, M_LDM_AB, M_LDM_OB): Likewise. |
(M_LDP_AB, M_LDP_OB, M_LDR_OB, M_LL_OB, M_LLD_OB): Likewise. |
(M_LWC2_OB, M_LWL_OB, M_LWM_AB, M_LWM_OB): Likewise. |
(M_LWP_AB, M_LWP_OB, M_LWR_OB): Likewise. |
(M_LWU_OB, M_PREF_OB, M_SC_OB, M_SCD_OB): Likewise. |
(M_SDC2_OB, M_SDL_OB, M_SDM_AB, M_SDM_OB): Likewise. |
(M_SDP_AB, M_SDP_OB, M_SDR_OB): Likewise. |
(M_SWC2_OB, M_SWL_OB, M_SWM_AB, M_SWM_OB): Likewise. |
(M_SWP_AB, M_SWP_OB, M_SWR_OB): Likewise. |
(MICROMIPSOP_MASK_MAJOR, MICROMIPSOP_SH_MAJOR): New macros. |
(MICROMIPSOP_MASK_IMMEDIATE, MICROMIPSOP_SH_IMMEDIATE): Likewise. |
(MICROMIPSOP_MASK_DELTA, MICROMIPSOP_SH_DELTA): Likewise. |
(MICROMIPSOP_MASK_CODE10, MICROMIPSOP_SH_CODE10): Likewise. |
(MICROMIPSOP_MASK_TRAP, MICROMIPSOP_SH_TRAP): Likewise. |
(MICROMIPSOP_MASK_SHAMT, MICROMIPSOP_SH_SHAMT): Likewise. |
(MICROMIPSOP_MASK_TARGET, MICROMIPSOP_SH_TARGET): Likewise. |
(MICROMIPSOP_MASK_EXTLSB, MICROMIPSOP_SH_EXTLSB): Likewise. |
(MICROMIPSOP_MASK_EXTMSBD, MICROMIPSOP_SH_EXTMSBD): Likewise. |
(MICROMIPSOP_MASK_INSMSB, MICROMIPSOP_SH_INSMSB): Likewise. |
(MICROMIPSOP_MASK_CODE, MICROMIPSOP_SH_CODE): Likewise. |
(MICROMIPSOP_MASK_CODE2, MICROMIPSOP_SH_CODE2): Likewise. |
(MICROMIPSOP_MASK_CACHE, MICROMIPSOP_SH_CACHE): Likewise. |
(MICROMIPSOP_MASK_SEL, MICROMIPSOP_SH_SEL): Likewise. |
(MICROMIPSOP_MASK_OFFSET12, MICROMIPSOP_SH_OFFSET12): Likewise. |
(MICROMIPSOP_MASK_3BITPOS, MICROMIPSOP_SH_3BITPOS): Likewise. |
(MICROMIPSOP_MASK_STYPE, MICROMIPSOP_SH_STYPE): Likewise. |
(MICROMIPSOP_MASK_OFFSET10, MICROMIPSOP_SH_OFFSET10): Likewise. |
(MICROMIPSOP_MASK_RS, MICROMIPSOP_SH_RS): Likewise. |
(MICROMIPSOP_MASK_RT, MICROMIPSOP_SH_RT): Likewise. |
(MICROMIPSOP_MASK_RD, MICROMIPSOP_SH_RD): Likewise. |
(MICROMIPSOP_MASK_FS, MICROMIPSOP_SH_FS): Likewise. |
(MICROMIPSOP_MASK_FT, MICROMIPSOP_SH_FT): Likewise. |
(MICROMIPSOP_MASK_FD, MICROMIPSOP_SH_FD): Likewise. |
(MICROMIPSOP_MASK_FR, MICROMIPSOP_SH_FR): Likewise. |
(MICROMIPSOP_MASK_RS3, MICROMIPSOP_SH_RS3): Likewise. |
(MICROMIPSOP_MASK_PREFX, MICROMIPSOP_SH_PREFX): Likewise. |
(MICROMIPSOP_MASK_BCC, MICROMIPSOP_SH_BCC): Likewise. |
(MICROMIPSOP_MASK_CCC, MICROMIPSOP_SH_CCC): Likewise. |
(MICROMIPSOP_MASK_COPZ, MICROMIPSOP_SH_COPZ): Likewise. |
(MICROMIPSOP_MASK_MB, MICROMIPSOP_SH_MB): Likewise. |
(MICROMIPSOP_MASK_MC, MICROMIPSOP_SH_MC): Likewise. |
(MICROMIPSOP_MASK_MD, MICROMIPSOP_SH_MD): Likewise. |
(MICROMIPSOP_MASK_ME, MICROMIPSOP_SH_ME): Likewise. |
(MICROMIPSOP_MASK_MF, MICROMIPSOP_SH_MF): Likewise. |
(MICROMIPSOP_MASK_MG, MICROMIPSOP_SH_MG): Likewise. |
(MICROMIPSOP_MASK_MH, MICROMIPSOP_SH_MH): Likewise. |
(MICROMIPSOP_MASK_MI, MICROMIPSOP_SH_MI): Likewise. |
(MICROMIPSOP_MASK_MJ, MICROMIPSOP_SH_MJ): Likewise. |
(MICROMIPSOP_MASK_ML, MICROMIPSOP_SH_ML): Likewise. |
(MICROMIPSOP_MASK_MM, MICROMIPSOP_SH_MM): Likewise. |
(MICROMIPSOP_MASK_MN, MICROMIPSOP_SH_MN): Likewise. |
(MICROMIPSOP_MASK_MP, MICROMIPSOP_SH_MP): Likewise. |
(MICROMIPSOP_MASK_MQ, MICROMIPSOP_SH_MQ): Likewise. |
(MICROMIPSOP_MASK_IMMA, MICROMIPSOP_SH_IMMA): Likewise. |
(MICROMIPSOP_MASK_IMMB, MICROMIPSOP_SH_IMMB): Likewise. |
(MICROMIPSOP_MASK_IMMC, MICROMIPSOP_SH_IMMC): Likewise. |
(MICROMIPSOP_MASK_IMMD, MICROMIPSOP_SH_IMMD): Likewise. |
(MICROMIPSOP_MASK_IMME, MICROMIPSOP_SH_IMME): Likewise. |
(MICROMIPSOP_MASK_IMMF, MICROMIPSOP_SH_IMMF): Likewise. |
(MICROMIPSOP_MASK_IMMG, MICROMIPSOP_SH_IMMG): Likewise. |
(MICROMIPSOP_MASK_IMMH, MICROMIPSOP_SH_IMMH): Likewise. |
(MICROMIPSOP_MASK_IMMI, MICROMIPSOP_SH_IMMI): Likewise. |
(MICROMIPSOP_MASK_IMMJ, MICROMIPSOP_SH_IMMJ): Likewise. |
(MICROMIPSOP_MASK_IMML, MICROMIPSOP_SH_IMML): Likewise. |
(MICROMIPSOP_MASK_IMMM, MICROMIPSOP_SH_IMMM): Likewise. |
(MICROMIPSOP_MASK_IMMN, MICROMIPSOP_SH_IMMN): Likewise. |
(MICROMIPSOP_MASK_IMMO, MICROMIPSOP_SH_IMMO): Likewise. |
(MICROMIPSOP_MASK_IMMP, MICROMIPSOP_SH_IMMP): Likewise. |
(MICROMIPSOP_MASK_IMMQ, MICROMIPSOP_SH_IMMQ): Likewise. |
(MICROMIPSOP_MASK_IMMU, MICROMIPSOP_SH_IMMU): Likewise. |
(MICROMIPSOP_MASK_IMMW, MICROMIPSOP_SH_IMMW): Likewise. |
(MICROMIPSOP_MASK_IMMX, MICROMIPSOP_SH_IMMX): Likewise. |
(MICROMIPSOP_MASK_IMMY, MICROMIPSOP_SH_IMMY): Likewise. |
(MICROMIPSOP_MASK_CODE, MICROMIPSOP_SH_CODE): Likewise. |
(MICROMIPSOP_MASK_CODE2, MICROMIPSOP_SH_CODE2): Likewise. |
(MICROMIPSOP_MASK_CACHE, MICROMIPSOP_SH_CACHE): Likewise. |
(MICROMIPSOP_MASK_CODE20, MICROMIPSOP_SH_CODE20): Likewise. |
(MICROMIPSOP_MASK_PERFREG, MICROMIPSOP_SH_PERFREG): Likewise. |
(MICROMIPSOP_MASK_CODE19, MICROMIPSOP_SH_CODE19): Likewise. |
(MICROMIPSOP_MASK_ALN, MICROMIPSOP_SH_ALN): Likewise. |
(MICROMIPSOP_MASK_VECBYTE, MICROMIPSOP_SH_VECBYTE): Likewise. |
(MICROMIPSOP_MASK_VECALIGN, MICROMIPSOP_SH_VECALIGN): Likewise. |
(MICROMIPSOP_MASK_DSPACC, MICROMIPSOP_SH_DSPACC): Likewise. |
(MICROMIPSOP_MASK_DSPACC_S, MICROMIPSOP_SH_DSPACC_S): Likewise. |
(MICROMIPSOP_MASK_DSPSFT, MICROMIPSOP_SH_DSPSFT): Likewise. |
(MICROMIPSOP_MASK_DSPSFT_7, MICROMIPSOP_SH_DSPSFT_7): Likewise. |
(MICROMIPSOP_MASK_SA3, MICROMIPSOP_SH_SA3): Likewise. |
(MICROMIPSOP_MASK_SA4, MICROMIPSOP_SH_SA4): Likewise. |
(MICROMIPSOP_MASK_IMM8, MICROMIPSOP_SH_IMM8): Likewise. |
(MICROMIPSOP_MASK_IMM10, MICROMIPSOP_SH_IMM10): Likewise. |
(MICROMIPSOP_MASK_WRDSP, MICROMIPSOP_SH_WRDSP): Likewise. |
(MICROMIPSOP_MASK_RDDSP, MICROMIPSOP_SH_RDDSP): Likewise. |
(MICROMIPSOP_MASK_BP, MICROMIPSOP_SH_BP): Likewise. |
(MICROMIPSOP_MASK_MT_U, MICROMIPSOP_SH_MT_U): Likewise. |
(MICROMIPSOP_MASK_MT_H, MICROMIPSOP_SH_MT_H): Likewise. |
(MICROMIPSOP_MASK_MTACC_T, MICROMIPSOP_SH_MTACC_T): Likewise. |
(MICROMIPSOP_MASK_MTACC_D, MICROMIPSOP_SH_MTACC_D): Likewise. |
(MICROMIPSOP_MASK_BBITIND, MICROMIPSOP_SH_BBITIND): Likewise. |
(MICROMIPSOP_MASK_CINSPOS, MICROMIPSOP_SH_CINSPOS): Likewise. |
(MICROMIPSOP_MASK_CINSLM1, MICROMIPSOP_SH_CINSLM1): Likewise. |
(MICROMIPSOP_MASK_SEQI, MICROMIPSOP_SH_SEQI): Likewise. |
(micromips_opcodes): New declaration. |
(bfd_micromips_num_opcodes): Likewise. |
2011-07-24 Maciej W. Rozycki <macro@codesourcery.com> |
* mips.h (INSN_TRAP): Rename to... |
(INSN_NO_DELAY_SLOT): ... this. |
(INSN_SYNC): Remove macro. |
2011-07-01 Eric B. Weddington <eric.weddington@atmel.com> |
* avr.h (AVR_ISA_AVR6): Remove AVR_ISA_SPMX as it was actually |
a duplicate of AVR_ISA_SPM. |
2011-07-01 Nick Clifton <nickc@redhat.com> |
* avr.h (AVR_ISA_AVR6): Fix typo, adding AVR_ISA_SPMX. |
2011-06-18 Robin Getz <robin.getz@analog.com> |
* bfin.h (is_macmod_signed): New func |
2011-06-18 Mike Frysinger <vapier@gentoo.org> |
* bfin.h (is_macmod_pmove): Add missing space before func args. |
(is_macmod_hmove): Likewise. |
2011-06-13 Walter Lee <walt@tilera.com> |
* tilegx.h: New file. |
* tilepro.h: New file. |
2011-05-31 Paul Brook <paul@codesourcery.com> |
* arm.h (ARM_ARCH_V7R_IDIV): Define. |
2011-05-24 Andreas Krebbel <Andreas.Krebbel@de.ibm.com> |
* s390.h: Replace S390_OPERAND_REG_EVEN with |
S390_OPERAND_REG_PAIR. |
2011-05-24 Andreas Krebbel <Andreas.Krebbel@de.ibm.com> |
* s390.h: Add S390_OPCODE_REG_EVEN flag. |
2011-04-18 Julian Brown <julian@codesourcery.com> |
* arm.h (ARM_AEXT_V7_ARM): Remove ARM_EXT_OS from bitmask. |
2011-04-11 Dan McDonald <dan@wellkeeper.com> |
PR gas/12296 |
* arm.h (ARM_AEXT_V7_ARM): Add ARM_EXT_OS. |
2011-03-22 Eric B. Weddington <eric.weddington@atmel.com> |
* avr.h (AVR_ISA_SPMX,AVR_ISA_DES,AVR_ISA_M256,AVR_ISA_XMEGA): |
New instruction set flags. |
(AVR_INSN): Add new instructions for SPM Z+, DES for XMEGA. |
2011-02-28 Maciej W. Rozycki <macro@codesourcery.com> |
* mips.h (M_PREF_AB): New enum value. |
2011-02-12 Mike Frysinger <vapier@gentoo.org> |
* bfin.h (M_S2RND, M_T, M_W32, M_FU, M_TFU, M_IS, M_ISS2, M_IH, |
M_IU): Define. |
(is_macmod_pmove, is_macmod_hmove): New functions. |
2011-02-11 Mike Frysinger <vapier@gentoo.org> |
* bfin.h: Add OPCODE_BFIN_H ifdef multiple include protection. |
2011-02-04 Bernd Schmidt <bernds@codesourcery.com> |
* tic6x-opcode-table.h (cmtl, ll, sl): Available on C64XP. |
* tic6x.h (TIC6X_INSN_ATOMIC): Remove. |
2010-12-31 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> |
PR gas/11395 |
* hppa.h (pa_opcodes): Revert last change. Exchange 32 and 64-bit |
"bb" entries. |
2010-12-26 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> |
PR gas/11395 |
* hppa.h: Clear "d" bit in "add" and "sub" patterns. |
2010-12-18 Richard Sandiford <rdsandiford@googlemail.com> |
* mips.h: Update commentary after last commit. |
2010-12-18 Mingjie Xing <mingjie.xing@gmail.com> |
* mips.h (OP_*_OFFSET_A, OP_*_OFFSET_B, OP_*_OFFSET_C) |
(OP_*_RZ, OP_*_FZ, INSN2_M_FP_D, INSN2_WRITE_GPR_Z, INSN2_WRITE_FPR_Z) |
(INSN2_READ_GPR_Z, INSN2_READ_FPR_Z, INSN2_READ_GPR_D): Define. |
2010-11-25 Andreas Krebbel <Andreas.Krebbel@de.ibm.com> |
* s390.h (enum s390_opcode_cpu_val): Add S390_OPCODE_MAXCPU. |
2010-11-23 Richard Sandiford <rdsandiford@googlemail.com> |
* mips.h: Fix previous commit. |
2010-11-23 Maciej W. Rozycki <macro@linux-mips.org> |
* mips.h (INSN_CHIP_MASK): Update according to INSN_LOONGSON_3A. |
(INSN_LOONGSON_3A): Clear bit 31. |
2010-11-15 Matthew Gretton-Dann <matthew.gretton-dann@arm.com> |
PR gas/12198 |
* arm.h (ARM_AEXT_V6M_ONLY): New define. |
(ARM_AEXT_V6M): Rewrite in terms of ARM_AEXT_V6M_ONLY. |
(ARM_ARCH_V6M_ONLY): New define. |
2010-11-11 Mingming Sun <mingm.sun@gmail.com> |
* mips.h (INSN_LOONGSON_3A): Defined. |
(CPU_LOONGSON_3A): Defined. |
(OPCODE_IS_MEMBER): Add LOONGSON_3A. |
2010-10-09 Matt Rice <ratmice@gmail.com> |
* cgen.h (CGEN_ATTR, CGEN_ATTR_TYPE): Rename bool attribute to bool_. |
(CGEN_ATTR_BOOLS, CGEN_ATTR_CGEN_INSN_ALIAS_VALUE): Likewise. |
2010-09-23 Matthew Gretton-Dann <matthew.gretton-dann@arm.com> |
* arm.h (ARM_EXT_VIRT): New define. |
(ARM_ARCH_V7A_IDIV_MP_SEC): Rename... |
(ARM_ARCH_V7A_IDIV_MP_SEC_VIRT): ...to this and include Virtualization |
Extensions. |
2010-09-23 Matthew Gretton-Dann <matthew.gretton-dann@arm.com> |
* arm.h (ARM_AEXT_ADIV): New define. |
(ARM_ARCH_V7A_IDIV_MP_SEC): Likewise. |
2010-09-23 Matthew Gretton-Dann <matthew.gretton-dann@arm.com> |
* arm.h (ARM_EXT_OS): New define. |
(ARM_AEXT_V6SM): Likewise. |
(ARM_ARCH_V6SM): Likewise. |
2010-09-23 Matthew Gretton-Dann <matthew.gretton-dann@arm.com> |
* arm.h (ARM_EXT_MP): Add. |
(ARM_ARCH_V7A_MP): Likewise. |
2010-09-22 Mike Frysinger <vapier@gentoo.org> |
* bfin.h: Declare pseudoChr structs/defines. |
2010-09-21 Mike Frysinger <vapier@gentoo.org> |
* bfin.h: Strip trailing whitespace. |
2010-07-29 DJ Delorie <dj@redhat.com> |
* rx.h (RX_Operand_Type): Add TwoReg. |
(RX_Opcode_ID): Remove ediv and ediv2. |
2010-07-27 DJ Delorie <dj@redhat.com> |
* rx.h (RX_Opcode_ID): Add nop2 and nop3 for statistics. |
2010-07-23 Naveen.H.S <naveen.S@kpitcummins.com> |
Ina Pandit <ina.pandit@kpitcummins.com> |
* v850.h: Define PROCESSOR_MASK, PROCESSOR_OPTION_EXTENSION, |
PROCESSOR_OPTION_ALIAS, PROCESSOR_V850E2, PROCESSOR_V850E2V3 and |
PROCESSOR_V850E2_ALL. |
Remove PROCESSOR_V850EA support. |
(v850_operand): Define V850_OPERAND_EP, V850_OPERAND_FLOAT_CC, |
V850_OPERAND_VREG, V850E_IMMEDIATE16, V850E_IMMEDIATE16HI, |
V850E_IMMEDIATE23, V850E_IMMEDIATE32, V850_OPERAND_SIGNED, |
V850_OPERAND_DISP, V850_PCREL, V850_REG_EVEN, V850E_PUSH_POP, |
V850_NOT_IMM0, V850_NOT_SA, V850_OPERAND_BANG and |
V850_OPERAND_PERCENT. |
Update V850_OPERAND_SRG, V850_OPERAND_CC, V850_OPERAND_RELAX and |
V850_NOT_R0. |
Remove V850_OPERAND_SIGNED, V850_OPERAND_EP, V850_OPERAND_DISP |
and V850E_PUSH_POP |
2010-07-06 Maciej W. Rozycki <macro@codesourcery.com> |
* mips.h (MIPS16_INSN_UNCOND_BRANCH): New macro. |
(MIPS16_INSN_BRANCH): Rename to... |
(MIPS16_INSN_COND_BRANCH): ... this. |
2010-07-03 Alan Modra <amodra@gmail.com> |
* ppc.h (PPC_OPCODE_32, PPC_OPCODE_BOOKE64, PPC_OPCODE_CLASSIC): Delete. |
Renumber other PPC_OPCODE defines. |
2010-07-03 Alan Modra <amodra@gmail.com> |
* ppc.h (PPC_OPCODE_COMMON): Expand comment. |
2010-06-29 Alan Modra <amodra@gmail.com> |
* maxq.h: Delete file. |
2010-06-14 Sebastian Andrzej Siewior <bigeasy@linutronix.de> |
* ppc.h (PPC_OPCODE_E500): Define. |
2010-05-26 Catherine Moore <clm@codesourcery.com> |
* opcode/mips.h (INSN_MIPS16): Remove. |
2010-04-21 Joseph Myers <joseph@codesourcery.com> |
* tic6x-insn-formats.h (s_branch): Correct typo in bitmask. |
2010-04-15 Nick Clifton <nickc@redhat.com> |
* alpha.h: Update copyright notice to use GPLv3. |
* arc.h: Likewise. |
* arm.h: Likewise. |
* avr.h: Likewise. |
* bfin.h: Likewise. |
* cgen.h: Likewise. |
* convex.h: Likewise. |
* cr16.h: Likewise. |
* cris.h: Likewise. |
* crx.h: Likewise. |
* d10v.h: Likewise. |
* d30v.h: Likewise. |
* dlx.h: Likewise. |
* h8300.h: Likewise. |
* hppa.h: Likewise. |
* i370.h: Likewise. |
* i386.h: Likewise. |
* i860.h: Likewise. |
* i960.h: Likewise. |
* ia64.h: Likewise. |
* m68hc11.h: Likewise. |
* m68k.h: Likewise. |
* m88k.h: Likewise. |
* maxq.h: Likewise. |
* mips.h: Likewise. |
* mmix.h: Likewise. |
* mn10200.h: Likewise. |
* mn10300.h: Likewise. |
* msp430.h: Likewise. |
* np1.h: Likewise. |
* ns32k.h: Likewise. |
* or32.h: Likewise. |
* pdp11.h: Likewise. |
* pj.h: Likewise. |
* pn.h: Likewise. |
* ppc.h: Likewise. |
* pyr.h: Likewise. |
* rx.h: Likewise. |
* s390.h: Likewise. |
* score-datadep.h: Likewise. |
* score-inst.h: Likewise. |
* sparc.h: Likewise. |
* spu-insns.h: Likewise. |
* spu.h: Likewise. |
* tic30.h: Likewise. |
* tic4x.h: Likewise. |
* tic54x.h: Likewise. |
* tic80.h: Likewise. |
* v850.h: Likewise. |
* vax.h: Likewise. |
2010-03-25 Joseph Myers <joseph@codesourcery.com> |
* tic6x-control-registers.h, tic6x-insn-formats.h, |
tic6x-opcode-table.h, tic6x.h: New. |
2010-02-25 Wu Zhangjin <wuzhangjin@gmail.com> |
* mips.h: (LOONGSON2F_NOP_INSN): New macro. |
2010-02-08 Philipp Tomsich <philipp.tomsich@theobroma-systems.com> |
* opcode/ppc.h (PPC_OPCODE_TITAN): Define. |
2010-01-14 H.J. Lu <hongjiu.lu@intel.com> |
* ia64.h (ia64_find_opcode): Remove argument name. |
(ia64_find_next_opcode): Likewise. |
(ia64_dis_opcode): Likewise. |
(ia64_free_opcode): Likewise. |
(ia64_find_dependency): Likewise. |
2009-11-22 Doug Evans <dje@sebabeach.org> |
* cgen.h: Include bfd_stdint.h. |
(CGEN_INSN_LGSINT, CGEN_INSN_LGUINT): New types. |
2009-11-18 Paul Brook <paul@codesourcery.com> |
* arm.h (FPU_VFP_V4_SP_D16, FPU_ARCH_VFP_V4_SP_D16): Define. |
2009-11-17 Paul Brook <paul@codesourcery.com> |
Daniel Jacobowitz <dan@codesourcery.com> |
* arm.h (ARM_EXT_V6_DSP): Define. |
(ARM_AEXT_V6T2, ARM_AEXT_NOTM): Include ARM_EXT_V6_DSP. |
(ARM_AEXT_V7EM, ARM_ARCH_V7EM): Define. |
2009-11-04 DJ Delorie <dj@redhat.com> |
* rx.h (rx_decode_opcode) (mvtipl): Add. |
(mvtcp, mvfcp, opecp): Remove. |
2009-11-02 Paul Brook <paul@codesourcery.com> |
* arm.h (FPU_VFP_EXT_V3xD, FPU_VFP_EXT_FP16, FPU_NEON_EXT_FMA, |
FPU_VFP_EXT_FMA, FPU_VFP_V3xD, FPU_VFP_V4D16, FPU_VFP_V4): Define. |
(FPU_ARCH_VFP_V3D16_FP16, FPU_ARCH_VFP_V3_FP16, FPU_ARCH_VFP_V3xD, |
FPU_ARCH_VFP_V3xD_FP16, FPU_ARCH_VFP_V4, FPU_ARCH_VFP_V4D16, |
FPU_ARCH_NEON_VFP_V4): Define. |
2009-10-23 Doug Evans <dje@sebabeach.org> |
* cgen-bitset.h: Delete, moved to ../cgen/bitset.h. |
* cgen.h: Update. Improve multi-inclusion macro name. |
2009-10-02 Peter Bergner <bergner@vnet.ibm.com> |
* ppc.h (PPC_OPCODE_476): Define. |
2009-10-01 Peter Bergner <bergner@vnet.ibm.com> |
* ppc.h (PPC_OPCODE_A2): Rename from PPC_OPCODE_PPCA2. |
2009-09-29 DJ Delorie <dj@redhat.com> |
* rx.h: New file. |
2009-09-22 Peter Bergner <bergner@vnet.ibm.com> |
* ppc.h (ppc_cpu_t): Typedef to uint64_t. |
2009-09-21 Ben Elliston <bje@au.ibm.com> |
* ppc.h (PPC_OPCODE_PPCA2): New. |
2009-09-05 Martin Thuresson <martin@mtme.org> |
* ia64.h (struct ia64_operand): Renamed member class to op_class. |
2009-08-29 Martin Thuresson <martin@mtme.org> |
* tic30.h (template): Rename type template to |
insn_template. Updated code to use new name. |
* tic54x.h (template): Rename type template to |
insn_template. |
2009-08-20 Nick Hudson <nick.hudson@gmx.co.uk> |
* hppa.h (pa_opcodes): Add a pa10 bb without FLAG_STRICT. |
2009-06-11 Anthony Green <green@moxielogic.com> |
* moxie.h (MOXIE_F3_PCREL): Define. |
(moxie_form3_opc_info): Grow. |
2009-06-06 Anthony Green <green@moxielogic.com> |
* moxie.h (MOXIE_F1_M): Define. |
2009-04-15 Anthony Green <green@moxielogic.com> |
* moxie.h: Created. |
2009-04-06 DJ Delorie <dj@redhat.com> |
* h8300.h: Add relaxation attributes to MOVA opcodes. |
2009-03-10 Alan Modra <amodra@bigpond.net.au> |
* ppc.h (ppc_parse_cpu): Declare. |
2009-03-02 Qinwei <qinwei@sunnorth.com.cn> |
* score-inst.h (score_insn_type, score_data_type): Add Ra_I9_I5 |
and _IMM11 for mbitclr and mbitset. |
* score-datadep.h: Update dependency information. |
2009-02-26 Peter Bergner <bergner@vnet.ibm.com> |
* ppc.h (PPC_OPCODE_POWER7): New. |
2009-02-06 Doug Evans <dje@google.com> |
* i386.h: Add comment regarding sse* insns and prefixes. |
2009-02-03 Sandip Matte <sandip@rmicorp.com> |
* mips.h (INSN_XLR): Define. |
(INSN_CHIP_MASK): Update. |
(CPU_XLR): Define. |
(OPCODE_IS_MEMBER): Update. |
(M_MSGSND, M_MSGLD, M_MSGLD_T, M_MSGWAIT, M_MSGWAIT_T): Define. |
2009-01-28 Doug Evans <dje@google.com> |
* opcode/i386.h: Add multiple inclusion protection. |
(EAX_REG_NUM,ECX_REG_NUM,EDX_REGNUM,EBX_REG_NUM,ESI_REG_NUM) |
(EDI_REG_NUM): New macros. |
(MODRM_MOD_FIELD,MODRM_REG_FIELD,MODRM_RM_FIELD): New macros. |
(SIB_SCALE_FIELD,SIB_INDEX_FIELD,SIB_BASE_FIELD): New macros. |
(REX_PREFIX_P): New macro. |
2009-01-09 Peter Bergner <bergner@vnet.ibm.com> |
* ppc.h (struct powerpc_opcode): New field "deprecated". |
(PPC_OPCODE_NOPOWER4): Delete. |
2008-11-28 Joshua Kinard <kumba@gentoo.org> |
* mips.h: Define CPU_R14000, CPU_R16000. |
(OPCODE_IS_MEMBER): Include R14000, R16000 in test. |
2008-11-18 Catherine Moore <clm@codesourcery.com> |
* arm.h (FPU_NEON_FP16): New. |
(FPU_ARCH_NEON_FP16): New. |
2008-11-06 Chao-ying Fu <fu@mips.com> |
* mips.h: Doucument '1' for 5-bit sync type. |
2008-08-28 H.J. Lu <hongjiu.lu@intel.com> |
* ia64.h (ia64_resource_specifier): Add IA64_RS_CR_IIB. Update |
IA64_RS_CR. |
2008-08-01 Peter Bergner <bergner@vnet.ibm.com> |
* ppc.h (PPC_OPCODE_VSX, PPC_OPERAND_VSR): New. |
2008-07-30 Michael J. Eager <eager@eagercon.com> |
* ppc.h (PPC_OPCODE_405): Define. |
(PPC_OPERAND_FSL, PPC_OPERAND_FCR, PPC_OPERAND_UDI): Define. |
2008-06-13 Peter Bergner <bergner@vnet.ibm.com> |
* ppc.h (ppc_cpu_t): New typedef. |
(struct powerpc_opcode <flags>): Use it. |
(struct powerpc_operand <insert, extract>): Likewise. |
(struct powerpc_macro <flags>): Likewise. |
2008-06-12 Adam Nemet <anemet@caviumnetworks.com> |
* mips.h: Document new field descriptors +x, +X, +p, +P, +s, +S. |
Update comment before MIPS16 field descriptors to mention MIPS16. |
(OP_SH_BBITIND, OP_MASK_BBITIND): New bit mask and shift count for |
BBIT. |
(OP_SH_CINSPOS, OP_MASK_CINSPOS, OP_SH_CINSLM1, OP_MASK_CINSLM1): |
New bit masks and shift counts for cins and exts. |
* mips.h: Document new field descriptors +Q. |
(OP_SH_SEQI, OP_MASK_SEQI): New bit mask and shift count for SEQI. |
2008-04-28 Adam Nemet <anemet@caviumnetworks.com> |
* mips.h (INSN_MACRO): Move it up to the pinfo macros. |
(INSN2_M_FP_S, INSN2_M_FP_D): New pinfo2 macros. |
2008-04-14 Edmar Wienskoski <edmar@freescale.com> |
* ppc.h: (PPC_OPCODE_E500MC): New. |
2008-04-03 H.J. Lu <hongjiu.lu@intel.com> |
* i386.h (MAX_OPERANDS): Set to 5. |
(MAX_MNEM_SIZE): Changed to 20. |
2008-03-28 Eric B. Weddington <eric.weddington@atmel.com> |
* avr.h (AVR_ISA_TINY3): Define new opcode set for attiny167. |
2008-03-09 Paul Brook <paul@codesourcery.com> |
* arm.h (FPU_VFP_EXT_D32, FPU_VFP_V3D16, FPU_ARCH_VFP_V3D16): Define. |
2008-03-04 Paul Brook <paul@codesourcery.com> |
* arm.h (ARM_EXT_V6M, ARM_EXT_BARRIER, ARM_EXT_THUMB_MSR): Define. |
(ARM_AEXT_V6T2, ARM_AEXT_V7_ARM, ARM_AEXT_V7M): Use new flags. |
(ARM_AEXT_V6M, ARM_ARCH_V6M): Define. |
2008-02-27 Denis Vlasenko <vda.linux@googlemail.com> |
Nick Clifton <nickc@redhat.com> |
PR 3134 |
* h8300.h (h8_opcodes): Add an encoding for a mov.l instruction |
with a 32-bit displacement but without the top bit of the 4th byte |
set. |
2008-02-18 M R Swami Reddy <MR.Swami.Reddy@nsc.com> |
* cr16.h (cr16_num_optab): Declared. |
2008-02-14 Hakan Ardo <hakan@debian.org> |
PR gas/2626 |
* avr.h (AVR_ISA_2xxe): Define. |
2008-02-04 Adam Nemet <anemet@caviumnetworks.com> |
* mips.h: Update copyright. |
(INSN_CHIP_MASK): New macro. |
(INSN_OCTEON): New macro. |
(CPU_OCTEON): New macro. |
(OPCODE_IS_MEMBER): Handle Octeon instructions. |
2008-01-23 Eric B. Weddington <eric.weddington@atmel.com> |
* avr.h (AVR_ISA_RF401): Add new opcode set for at86rf401. |
2008-01-03 Eric B. Weddington <eric.weddington@atmel.com> |
* avr.h (AVR_ISA_USB162): Add new opcode set. |
(AVR_ISA_AVR3): Likewise. |
2007-11-29 Mark Shinwell <shinwell@codesourcery.com> |
* mips.h (INSN_LOONGSON_2E): New. |
(INSN_LOONGSON_2F): New. |
(CPU_LOONGSON_2E): New. |
(CPU_LOONGSON_2F): New. |
(OPCODE_IS_MEMBER): Update for Loongson-2E and -2F flags. |
2007-11-29 Mark Shinwell <shinwell@codesourcery.com> |
* mips.h (INSN_ISA*): Redefine certain values as an |
enumeration. Update comments. |
(mips_isa_table): New. |
(ISA_MIPS*): Redefine to match enumeration. |
(OPCODE_IS_MEMBER): Modify to correctly test new INSN_ISA* |
values. |
2007-08-08 Ben Elliston <bje@au.ibm.com> |
* ppc.h (PPC_OPCODE_PPCPS): New. |
2007-07-03 Nathan Sidwell <nathan@codesourcery.com> |
* m68k.h: Document j K & E. |
2007-06-29 M R Swami Reddy <MR.Swami.Reddy@nsc.com> |
* cr16.h: New file for CR16 target. |
2007-05-02 Alan Modra <amodra@bigpond.net.au> |
* ppc.h (PPC_OPERAND_PLUS1): Update comment. |
2007-04-23 Nathan Sidwell <nathan@codesourcery.com> |
* m68k.h (mcfisa_c): New. |
(mcfusp, mcf_mask): Adjust. |
2007-04-20 Alan Modra <amodra@bigpond.net.au> |
* ppc.h (struct powerpc_operand): Replace "bits" with "bitm". |
(num_powerpc_operands): Declare. |
(PPC_OPERAND_SIGNED et al): Redefine as hex. |
(PPC_OPERAND_PLUS1): Define. |
2007-03-21 H.J. Lu <hongjiu.lu@intel.com> |
* i386.h (REX_MODE64): Renamed to ... |
(REX_W): This. |
(REX_EXTX): Renamed to ... |
(REX_R): This. |
(REX_EXTY): Renamed to ... |
(REX_X): This. |
(REX_EXTZ): Renamed to ... |
(REX_B): This. |
2007-03-15 H.J. Lu <hongjiu.lu@intel.com> |
* i386.h: Add entries from config/tc-i386.h and move tables |
to opcodes/i386-opc.h. |
2007-03-13 H.J. Lu <hongjiu.lu@intel.com> |
* i386.h (FloatDR): Removed. |
(i386_optab): Use FloatD and FloatD|FloatR instead of FloatDR. |
2007-03-01 Alan Modra <amodra@bigpond.net.au> |
* spu-insns.h: Add soma double-float insns. |
2007-02-20 Thiemo Seufer <ths@mips.com> |
Chao-Ying Fu <fu@mips.com> |
* mips.h (OP_SH_BP, OP_MASK_BP): Add support for balign instruction. |
(INSN_DSPR2): Add flag for DSP R2 instructions. |
(M_BALIGN): New macro. |
2007-02-14 Alan Modra <amodra@bigpond.net.au> |
* i386.h (i386_optab): Replace all occurrences of Seg2ShortForm |
and Seg3ShortFrom with Shortform. |
2007-02-11 H.J. Lu <hongjiu.lu@intel.com> |
PR gas/4027 |
* i386.h (i386_optab): Put the real "test" before the pseudo |
one. |
2007-01-08 Kazu Hirata <kazu@codesourcery.com> |
* m68k.h (m68010up): OR fido_a. |
2006-12-25 Kazu Hirata <kazu@codesourcery.com> |
* m68k.h (fido_a): New. |
2006-12-24 Kazu Hirata <kazu@codesourcery.com> |
* m68k.h (mcfmac, mcfemac, cfloat, mcfhwdiv, mcfisa_a, |
mcfisa_aa, mcfisa_b, mcfusp, mcf_mask): Double the defined |
values. |
2006-11-08 H.J. Lu <hongjiu.lu@intel.com> |
* i386.h (i386_optab): Replace CpuPNI with CpuSSE3. |
2006-10-31 Mei Ligang <ligang@sunnorth.com.cn> |
* score-inst.h (enum score_insn_type): Add Insn_internal. |
2006-10-25 Trevor Smigiel <Trevor_Smigiel@playstation.sony.com> |
Yukishige Shibata <shibata@rd.scei.sony.co.jp> |
Nobuhisa Fujinami <fnami@rd.scei.sony.co.jp> |
Takeaki Fukuoka <fukuoka@rd.scei.sony.co.jp> |
Alan Modra <amodra@bigpond.net.au> |
* spu-insns.h: New file. |
* spu.h: New file. |
2006-10-24 Andrew Pinski <andrew_pinski@playstation.sony.com> |
* ppc.h (PPC_OPCODE_CELL): Define. |
2006-10-23 Dwarakanath Rajagopal <dwarak.rajagopal@amd.com> |
* i386.h : Modify opcode to support for the change in POPCNT opcode |
in amdfam10 architecture. |
2006-09-28 H.J. Lu <hongjiu.lu@intel.com> |
* i386.h: Replace CpuMNI with CpuSSSE3. |
2006-09-26 Mark Shinwell <shinwell@codesourcery.com> |
Joseph Myers <joseph@codesourcery.com> |
Ian Lance Taylor <ian@wasabisystems.com> |
Ben Elliston <bje@wasabisystems.com> |
* arm.h (ARM_CEXT_IWMMXT2, ARM_ARCH_IWMMXT2): Define. |
2006-09-17 Mei Ligang <ligang@sunnorth.com.cn> |
* score-datadep.h: New file. |
* score-inst.h: New file. |
2006-07-14 H.J. Lu <hongjiu.lu@intel.com> |
* i386.h (i386_optab): Remove InvMem from maskmovq, movhlps, |
movlhps, movmskps, pextrw, pmovmskb, movmskpd, maskmovdqu, |
movdq2q and movq2dq. |
2006-07-10 Dwarakanath Rajagopal <dwarak.rajagopal@amd.com> |
Michael Meissner <michael.meissner@amd.com> |
* i386.h: Add amdfam10 new instructions (SSE4a and ABM instructions). |
2006-06-12 H.J. Lu <hongjiu.lu@intel.com> |
* i386.h (i386_optab): Add "nop" with memory reference. |
2006-06-12 H.J. Lu <hongjiu.lu@intel.com> |
* i386.h (i386_optab): Update comment for 64bit NOP. |
2006-06-06 Ben Elliston <bje@au.ibm.com> |
Anton Blanchard <anton@samba.org> |
* ppc.h (PPC_OPCODE_POWER6): Define. |
Adjust whitespace. |
2006-06-05 Thiemo Seufer <ths@mips.com> |
* mips.h: Improve description of MT flags. |
2006-05-25 Richard Sandiford <richard@codesourcery.com> |
* m68k.h (mcf_mask): Define. |
2006-05-05 Thiemo Seufer <ths@mips.com> |
David Ung <davidu@mips.com> |
* mips.h (enum): Add macro M_CACHE_AB. |
2006-05-04 Thiemo Seufer <ths@mips.com> |
Nigel Stephens <nigel@mips.com> |
David Ung <davidu@mips.com> |
* mips.h: Add INSN_SMARTMIPS define. |
2006-04-30 Thiemo Seufer <ths@mips.com> |
David Ung <davidu@mips.com> |
* mips.h: Defines udi bits and masks. Add description of |
characters which may appear in the args field of udi |
instructions. |
2006-04-26 Thiemo Seufer <ths@networkno.de> |
* mips.h: Improve comments describing the bitfield instruction |
fields. |
2006-04-26 Julian Brown <julian@codesourcery.com> |
* arm.h (FPU_VFP_EXT_V3): Define constant. |
(FPU_NEON_EXT_V1): Likewise. |
(FPU_VFP_HARD): Update. |
(FPU_VFP_V3): Define macro. |
(FPU_ARCH_VFP_V3, FPU_ARCH_VFP_V3_PLUS_NEON_V1): Define macros. |
2006-04-07 Joerg Wunsch <j.gnu@uriah.heep.sax.de> |
* avr.h (AVR_ISA_PWMx): New. |
2006-03-28 Nathan Sidwell <nathan@codesourcery.com> |
* m68k.h (cpu_m68k, cpu_cf, cpu_m68000, cpu_m68008, cpu_m68010, |
cpu_m68020, cpu_m68ec030, cpu_m68040, cpu_m68060, cpu_m68851, |
cpu_m68881, cpu_m68882, cpu_cpu32, cpu_cf5200, cpu_cf5206e, |
cpu_cf5208, cpu_cf521x, cpu_cf5213, cpu_cf5249, cpu_cf528x, |
cpu_cf5307, cpu_cf5329, cpu_cf5407, cpu_cf547x, cpu_cf548x): Remove. |
2006-03-10 Paul Brook <paul@codesourcery.com> |
* arm.h (ARM_AEXT_V7_ARM): Include v6ZK extensions. |
2006-03-04 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> |
* hppa.h (pa_opcodes): Reorder bb opcodes so that pa10 opcodes come |
first. Correct mask of bb "B" opcode. |
2006-02-27 H.J. Lu <hongjiu.lu@intel.com> |
* i386.h (i386_optab): Support Intel Merom New Instructions. |
2006-02-24 Paul Brook <paul@codesourcery.com> |
* arm.h: Add V7 feature bits. |
2006-02-23 H.J. Lu <hongjiu.lu@intel.com> |
* ia64.h (ia64_opnd): Add IA64_OPND_IMMU5b. |
2006-01-31 Paul Brook <paul@codesourcery.com> |
Richard Earnshaw <rearnsha@arm.com> |
* arm.h: Use ARM_CPU_FEATURE. |
(ARM_AEXT_*, FPU_ENDIAN_PURE, FPU_VFP_HARD): New. |
(arm_feature_set): Change to a structure. |
(ARM_CPU_HAS_FEATURE, ARM_MERGE_FEATURE_SETS, ARM_CLEAR_FEATURE, |
ARM_FEATURE): New macros. |
2005-12-07 Hans-Peter Nilsson <hp@axis.com> |
* cris.h (MOVE_M_TO_PREG_OPCODE, MOVE_M_TO_PREG_ZBITS) |
(MOVE_PC_INCR_OPCODE_PREFIX, MOVE_PC_INCR_OPCODE_SUFFIX): New macros. |
(ADD_PC_INCR_OPCODE): Don't define. |
2005-12-06 H.J. Lu <hongjiu.lu@intel.com> |
PR gas/1874 |
* i386.h (i386_optab): Add 64bit support for monitor and mwait. |
2005-11-14 David Ung <davidu@mips.com> |
* mips.h: Assign 'm'/'M' codes to MIPS16e save/restore |
instructions. Define MIPS16_ALL_ARGS and MIPS16_ALL_STATICS for |
save/restore encoding of the args field. |
2005-10-28 Dave Brolley <brolley@redhat.com> |
Contribute the following changes: |
2005-02-16 Dave Brolley <brolley@redhat.com> |
* cgen-bitset.h: Rename CGEN_ISA_MASK to CGEN_BITSET. Rename |
cgen_isa_mask_* to cgen_bitset_*. |
* cgen.h: Likewise. |
2003-10-21 Richard Sandiford <rsandifo@redhat.com> |
* cgen.h (CGEN_BITSET_ATTR_VALUE): Fix definition. |
(CGEN_ATTR_ENTRY): Change "value" to type "unsigned". |
(CGEN_CPU_TABLE): Make isas a ponter. |
2003-09-29 Dave Brolley <brolley@redhat.com> |
* cgen.h (CGEN_ATTR_VALUE_BITSET_TYPE): New typedef. |
(CGEN_ATTR_VALUE_ENUM_TYPE): Ditto. |
(CGEN_ATTR_VALUE_TYPE): Use these new typedefs. |
2002-12-13 Dave Brolley <brolley@redhat.com> |
* cgen.h (symcat.h): #include it. |
(cgen-bitset.h): #include it. |
(CGEN_ATTR_VALUE_TYPE): Now a union. |
(CGEN_ATTR_VALUE): Reference macros generated in opcodes/<arch>-desc.h. |
(CGEN_ATTR_ENTRY): 'value' now unsigned. |
(cgen_cpu_desc): 'isas' now (CGEN_ISA_MASK*). |
* cgen-bitset.h: New file. |
2005-09-30 Catherine Moore <clm@cm00re.com> |
* bfin.h: New file. |
2005-10-24 Jan Beulich <jbeulich@novell.com> |
* ia64.h (enum ia64_opnd): Move memory operand out of set of |
indirect operands. |
2005-10-16 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> |
* hppa.h (pa_opcodes): Add two fcmp opcodes. Reorder ftest opcodes. |
Add FLAG_STRICT to pa10 ftest opcode. |
2005-10-12 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> |
* hppa.h (pa_opcodes): Remove lha entries. |
2005-10-08 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> |
* hppa.h (FLAG_STRICT): Revise comment. |
(pa_opcode): Revise ordering rules. Add/move strict pa10 variants |
before corresponding pa11 opcodes. Add strict pa10 register-immediate |
entries for "fdc". |
2005-09-30 Catherine Moore <clm@cm00re.com> |
* bfin.h: New file. |
2005-09-24 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> |
* hppa.h (pa_opcodes): Add new "fdc" and "fic" opcode entries. |
2005-09-06 Chao-ying Fu <fu@mips.com> |
* mips.h (OP_SH_MT_U, OP_MASK_MT_U, OP_SH_MT_H, OP_MASK_MT_H, |
OP_SH_MTACC_T, OP_MASK_MTACC_T, OP_SH_MTACC_D, OP_MASK_MTACC_D): New |
define. |
Document !, $, *, &, g, +t, +T operand formats for MT instructions. |
(INSN_ASE_MASK): Update to include INSN_MT. |
(INSN_MT): New define for MT ASE. |
2005-08-25 Chao-ying Fu <fu@mips.com> |
* mips.h (OP_SH_DSPACC, OP_MASK_DSPACC, OP_SH_DSPACC_S, |
OP_MASK_DSPACC_S, OP_SH_DSPSFT, OP_MASK_DSPSFT, OP_SH_DSPSFT_7, |
OP_MASK_DSPSFT_7, OP_SH_SA3, OP_MASK_SA3, OP_SH_SA4, OP_MASK_SA4, |
OP_SH_IMM8, OP_MASK_IMM8, OP_SH_IMM10, OP_MASK_IMM10, OP_SH_WRDSP, |
OP_MASK_WRDSP, OP_SH_RDDSP, OP_MASK_RDDSP): New define. |
Document 3, 4, 5, 6, 7, 8, 9, 0, :, ', @ operand formats for DSP |
instructions. |
(INSN_DSP): New define for DSP ASE. |
2005-08-18 Alan Modra <amodra@bigpond.net.au> |
* a29k.h: Delete. |
2005-08-15 Daniel Jacobowitz <dan@codesourcery.com> |
* ppc.h (PPC_OPCODE_E300): Define. |
2005-08-12 Martin Schwidefsky <schwidefsky@de.ibm.com> |
* s390.h (s390_opcode_cpu_val): Add enum for cpu type z9-109. |
2005-07-28 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> |
PR gas/336 |
* hppa.h (pa_opcodes): Allow 0 immediates in PA 2.0 variants of pdtlb |
and pitlb. |
2005-07-27 Jan Beulich <jbeulich@novell.com> |
* i386.h (i386_optab): Add comment to movd. Use LongMem for all |
movd-s. Add NoRex64 to movq-s dealing only with mmx or xmm registers. |
Add movq-s as 64-bit variants of movd-s. |
2005-07-18 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> |
* hppa.h: Fix punctuation in comment. |
* hppa.h (pa_opcode): Add rules for opcode ordering. Check first for |
implicit space-register addressing. Set space-register bits on opcodes |
using implicit space-register addressing. Add various missing pa20 |
long-immediate opcodes. Remove various opcodes using implicit 3-bit |
space-register addressing. Use "fE" instead of "fe" in various |
fstw opcodes. |
2005-07-18 Jan Beulich <jbeulich@novell.com> |
* i386.h (i386_optab): Operands of aam and aad are unsigned. |
2007-07-15 H.J. Lu <hongjiu.lu@intel.com> |
* i386.h (i386_optab): Support Intel VMX Instructions. |
2005-07-10 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> |
* hppa.h (pa_opcode): Don't set FLAG_STRICT in pa10 loads and stores. |
2005-07-05 Jan Beulich <jbeulich@novell.com> |
* i386.h (i386_optab): Add new insns. |
2005-07-01 Nick Clifton <nickc@redhat.com> |
* sparc.h: Add typedefs to structure declarations. |
2005-06-20 H.J. Lu <hongjiu.lu@intel.com> |
PR 1013 |
* i386.h (i386_optab): Update comments for 64bit addressing on |
mov. Allow 64bit addressing for mov and movq. |
2005-06-11 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> |
* hppa.h (pa_opcodes): Use cM and cX instead of cm and cx, |
respectively, in various floating-point load and store patterns. |
2005-05-23 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> |
* hppa.h (FLAG_STRICT): Correct comment. |
(pa_opcodes): Update load and store entries to allow both PA 1.X and |
PA 2.0 mneumonics when equivalent. Entries with cache control |
completers now require PA 1.1. Adjust whitespace. |
2005-05-19 Anton Blanchard <anton@samba.org> |
* ppc.h (PPC_OPCODE_POWER5): Define. |
2005-05-10 Nick Clifton <nickc@redhat.com> |
* Update the address and phone number of the FSF organization in |
the GPL notices in the following files: |
a29k.h, alpha.h, arc.h, arm.h, avr.h, cgen.h, convex.h, cris.h, |
crx.h, d10v.h, d30v.h, dlx.h, h8300.h, hppa.h, i370.h, i386.h, |
i860.h, i960.h, m68hc11.h, m68k.h, m88k.h, maxq.h, mips.h, mmix.h, |
mn10200.h, mn10300.h, msp430.h, np1.h, ns32k.h, or32.h, pdp11.h, |
pj.h, pn.h, ppc.h, pyr.h, s390.h, sparc.h, tic30.h, tic4x.h, |
tic54x.h, tic80.h, v850.h, vax.h |
2005-05-09 Jan Beulich <jbeulich@novell.com> |
* i386.h (i386_optab): Add ht and hnt. |
2005-04-18 Mark Kettenis <kettenis@gnu.org> |
* i386.h: Insert hyphens into selected VIA PadLock extensions. |
Add xcrypt-ctr. Provide aliases without hyphens. |
2005-04-13 H.J. Lu <hongjiu.lu@intel.com> |
Moved from ../ChangeLog |
2005-04-12 Paul Brook <paul@codesourcery.com> |
* m88k.h: Rename psr macros to avoid conflicts. |
2005-03-12 Zack Weinberg <zack@codesourcery.com> |
* arm.h: Adjust comments for ARM_EXT_V4T and ARM_EXT_V5T. |
Add ARM_EXT_V6T2, ARM_ARCH_V6T2, ARM_ARCH_V6KT2, ARM_ARCH_V6ZT2, |
and ARM_ARCH_V6ZKT2. |
2004-11-29 Tomer Levi <Tomer.Levi@nsc.com> |
* crx.h (enum operand_type): Rename rbase_cst4 to rbase_dispu4. |
Remove redundant instruction types. |
(struct argument): X_op - new field. |
(struct cst4_entry): Remove. |
(no_op_insn): Declare. |
2004-11-05 Tomer Levi <Tomer.Levi@nsc.com> |
* crx.h (enum argtype): Rename types, remove unused types. |
2004-10-27 Tomer Levi <Tomer.Levi@nsc.com> |
* crx.h (enum reg): Rearrange registers, remove 'ccfg' and `'pc'. |
(enum reg_type): Remove CRX_PC_REGTYPE, CRX_MTPR_REGTYPE. |
(enum operand_type): Rearrange operands, edit comments. |
replace us<N> with ui<N> for unsigned immediate. |
replace d<N> with disps<N>/dispu<N>/dispe<N> for signed/unsigned/escaped |
displacements (respectively). |
replace rbase_ridx_scl2_dispu<N> with rindex_disps<N> for register index. |
(instruction type): Add NO_TYPE_INS. |
(instruction flags): Add USER_REG, CST4MAP, NO_SP, NO_RPTR. |
(operand_entry): New field - 'flags'. |
(operand flags): New. |
2004-10-21 Tomer Levi <Tomer.Levi@nsc.com> |
* crx.h (operand_type): Remove redundant types i3, i4, |
i5, i8, i12. |
Add new unsigned immediate types us3, us4, us5, us16. |
2005-04-12 Mark Kettenis <kettenis@gnu.org> |
* i386.h (i386_optab): Mark VIA PadLock instructions as ImmExt and |
adjust them accordingly. |
2005-04-01 Jan Beulich <jbeulich@novell.com> |
* i386.h (i386_optab): Add rdtscp. |
2005-03-29 H.J. Lu <hongjiu.lu@intel.com> |
* i386.h (i386_optab): Don't allow the `l' suffix for moving |
between memory and segment register. Allow movq for moving between |
general-purpose register and segment register. |
2005-02-09 Jan Beulich <jbeulich@novell.com> |
PR gas/707 |
* i386.h (i386_optab): Add x_Suf to fbld and fbstp. Add w_Suf and |
FloatMF to fldcw, fstcw, fnstcw, and the memory formas of fstsw and |
fnstsw. |
2006-02-07 Nathan Sidwell <nathan@codesourcery.com> |
* m68k.h (m68008, m68ec030, m68882): Remove. |
(m68k_mask): New. |
(cpu_m68k, cpu_cf): New. |
(mcf5200, mcf5206e, mcf521x, mcf5249, mcf528x, mcf5307, mcf5407, |
mcf5470, mcf5480): Rename to cpu_<foo>. Add m680x0 variants. |
2005-01-25 Alexandre Oliva <aoliva@redhat.com> |
2004-11-10 Alexandre Oliva <aoliva@redhat.com> |
* cgen.h (enum cgen_parse_operand_type): Add |
CGEN_PARSE_OPERAND_SYMBOLIC. |
2005-01-21 Fred Fish <fnf@specifixinc.com> |
* mips.h: Change INSN_ALIAS to INSN2_ALIAS. |
Change INSN_WRITE_MDMX_ACC to INSN2_WRITE_MDMX_ACC. |
Change INSN_READ_MDMX_ACC to INSN2_READ_MDMX_ACC. |
2005-01-19 Fred Fish <fnf@specifixinc.com> |
* mips.h (struct mips_opcode): Add new pinfo2 member. |
(INSN_ALIAS): New define for opcode table entries that are |
specific instances of another entry, such as 'move' for an 'or' |
with a zero operand. |
(INSN_READ_MDMX_ACC): Redefine from 0 to 0x2. |
(INSN_WRITE_MDMX_ACC): Redefine from 0 to 0x4. |
2004-12-09 Ian Lance Taylor <ian@wasabisystems.com> |
* mips.h (CPU_RM9000): Define. |
(OPCODE_IS_MEMBER): Handle CPU_RM9000. |
2004-11-25 Jan Beulich <jbeulich@novell.com> |
* i386.h: CpuNo64 mov can't reasonably have a 'q' suffix. Moves |
to/from test registers are illegal in 64-bit mode. Add missing |
NoRex64 to sidt. fxsave/fxrstor now allow for a 'q' suffix |
(previously one had to explicitly encode a rex64 prefix). Re-enable |
lahf/sahf in 64-bit mode as at least some Athlon64/Opteron steppings |
support it there. Add cmpxchg16b as per Intel's 64-bit documentation. |
2004-11-23 Jan Beulich <jbeulich@novell.com> |
* i386.h (i386_optab): paddq and psubq, even in their MMX form, are |
available only with SSE2. Change the MMX additions introduced by SSE |
and 3DNow!A to CpuMMX2 (rather than CpuMMX). Indicate the 3DNow!A |
instructions by their now designated identifier (since combining i686 |
and 3DNow! does not really imply 3DNow!A). |
2004-11-19 Alan Modra <amodra@bigpond.net.au> |
* msp430.h (struct rcodes_s, MSP430_RLC, msp430_rcodes, |
struct hcodes_s, msp430_hcodes): Move to gas/config/tc-msp430.c. |
2004-11-08 Inderpreet Singh <inderpreetb@nioda.hcltech.com> |
Vineet Sharma <vineets@noida.hcltech.com> |
* maxq.h: New file: Disassembly information for the maxq port. |
2004-11-05 H.J. Lu <hongjiu.lu@intel.com> |
* i386.h (i386_optab): Put back "movzb". |
2004-11-04 Hans-Peter Nilsson <hp@axis.com> |
* cris.h (enum cris_insn_version_usage): Tweak formatting and |
comments. Remove member cris_ver_sim. Add members |
cris_ver_sim_v0_10, cris_ver_v0_10, cris_ver_v3_10, |
cris_ver_v8_10, cris_ver_v10, cris_ver_v10p. |
(struct cris_support_reg, struct cris_cond15): New types. |
(cris_conds15): Declare. |
(JUMP_PC_INCR_OPCODE_V32, BA_DWORD_OPCODE, NOP_OPCODE_COMMON) |
(NOP_OPCODE_ZBITS_COMMON, LAPC_DWORD_OPCODE, LAPC_DWORD_Z_BITS) |
(NOP_OPCODE_V32, NOP_Z_BITS_V32): New macros. |
(NOP_Z_BITS): Define in terms of NOP_OPCODE. |
(cris_imm_oprnd_size_type): New members SIZE_FIELD_SIGNED and |
SIZE_FIELD_UNSIGNED. |
2004-11-04 Jan Beulich <jbeulich@novell.com> |
* i386.h (sldx_Suf): Remove. |
(FP, l_FP, sl_FP, x_FP): Don't imply IgnoreSize. |
(q_FP): Define, implying no REX64. |
(x_FP, sl_FP): Imply FloatMF. |
(i386_optab): Split reg and mem forms of moving from segment registers |
so that the memory forms can ignore the 16-/32-bit operand size |
distinction. Adjust a few others for Intel mode. Remove *FP uses from |
all non-floating-point instructions. Unite 32- and 64-bit forms of |
movsx, movzx, and movd. Adjust floating point operations for the above |
changes to the *FP macros. Add DefaultSize to floating point control |
insns operating on larger memory ranges. Remove left over comments |
hinting at certain insns being Intel-syntax ones where the ones |
actually meant are already gone. |
2004-10-07 Tomer Levi <Tomer.Levi@nsc.com> |
* crx.h: Add COPS_REG_INS - Coprocessor Special register |
instruction type. |
2004-09-30 Paul Brook <paul@codesourcery.com> |
* arm.h (ARM_EXT_V6K, ARM_EXT_V6Z): Define. |
(ARM_ARCH_V6K, ARM_ARCH_V6Z, ARM_ARCH_V6ZK): Define. |
2004-09-11 Theodore A. Roth <troth@openavr.org> |
* avr.h: Add support for |
atmega48, atmega88, atmega168, attiny13, attiny2313, at90can128. |
2004-09-09 Segher Boessenkool <segher@kernel.crashing.org> |
* ppc.h (PPC_OPERAND_OPTIONAL): Fix comment. |
2004-08-24 Dmitry Diky <diwil@spec.ru> |
* msp430.h (msp430_opc): Add new instructions. |
(msp430_rcodes): Declare new instructions. |
(msp430_hcodes): Likewise.. |
2004-08-13 Nick Clifton <nickc@redhat.com> |
PR/301 |
* h8300.h (O_JSR): Do not allow VECIND addressing for non-SX |
processors. |
2004-08-30 Michal Ludvig <mludvig@suse.cz> |
* i386.h (i386_optab): Added montmul/xsha1/xsha256 insns. |
2004-07-22 H.J. Lu <hongjiu.lu@intel.com> |
* i386.h (i386_optab): Allow cs/ds in 64bit for branch hints. |
2004-07-21 Jan Beulich <jbeulich@novell.com> |
* i386.h: Adjust instruction descriptions to better match the |
specification. |
2004-07-16 Richard Earnshaw <rearnsha@arm.com> |
* arm.h: Remove all old content. Replace with architecture defines |
from gas/config/tc-arm.c. |
2004-07-09 Andreas Schwab <schwab@suse.de> |
* m68k.h: Fix comment. |
2004-07-07 Tomer Levi <Tomer.Levi@nsc.com> |
* crx.h: New file. |
2004-06-24 Alan Modra <amodra@bigpond.net.au> |
* i386.h (i386_optab): Remove fildd, fistpd and fisttpd. |
2004-05-24 Peter Barada <peter@the-baradas.com> |
* m68k.h: Add 'size' to m68k_opcode. |
2004-05-05 Peter Barada <peter@the-baradas.com> |
* m68k.h: Switch from ColdFire chip name to core variant. |
2004-04-22 Peter Barada <peter@the-baradas.com> |
* m68k.h: Add mcfmac/mcfemac definitions. Update operand |
descriptions for new EMAC cases. |
Remove ColdFire macmw/macml/msacmw/msacmw hacks and properly |
handle Motorola MAC syntax. |
Allow disassembly of ColdFire V4e object files. |
2004-03-16 Alan Modra <amodra@bigpond.net.au> |
* ppc.h (PPC_OPERAND_GPR_0): Define. Bump other operand defines. |
2004-03-12 Jakub Jelinek <jakub@redhat.com> |
* i386.h (i386_optab): Remove CpuNo64 from sysenter and sysexit. |
2004-03-12 Michal Ludvig <mludvig@suse.cz> |
* i386.h (i386_optab): Added xstore as an alias for xstorerng. |
2004-03-12 Michal Ludvig <mludvig@suse.cz> |
* i386.h (i386_optab): Added xstore/xcrypt insns. |
2004-02-09 Anil Paranjpe <anilp1@KPITCummins.com> |
* h8300.h (32bit ldc/stc): Add relaxing support. |
2004-01-12 Anil Paranjpe <anilp1@KPITCummins.com> |
* h8300.h (BITOP): Pass MEMRELAX flag. |
2004-01-09 Anil Paranjpe <anilp1@KPITCummins.com> |
* h8300.h (BITOP): Dissallow operations on @aa:16 and @aa:32 |
except for the H8S. |
For older changes see ChangeLog-9103 |
Copyright (C) 2004-2012 Free Software Foundation, Inc. |
Copying and distribution of this file, with or without modification, |
are permitted in any medium without royalty provided the copyright |
notice and this notice are preserved. |
Local Variables: |
mode: change-log |
left-margin: 8 |
fill-column: 74 |
version-control: never |
End: |
/contrib/toolchain/binutils/include/opcode/ChangeLog-9103 |
---|
0,0 → 1,3131 |
2005-04-13 H.J. Lu <hongjiu.lu@intel.com> |
2003-11-18 Maciej W. Rozycki <macro@ds2.pg.gda.pl> |
* mips.h: Define new enum members, M_LCA_AB and M_DLCA_AB. |
2003-04-04 Svein E. Seldal <Svein.Seldal@solidas.com> |
* tic4x.h: Namespace cleanup. Replace s/c4x/tic4x |
2002-11-16 Klee Dienes <kdienes@apple.com> |
* m88k.h (INSTAB): Remove 'next' field. |
(instruction): Remove definition; replace with extern declaration |
and mark as const. |
2002-08-28 Michael Hayes <m.hayes@elec.canterbury.ac.nz> |
* tic4x.h: New file. |
2002-07-25 Richard Sandiford <rsandifo@redhat.com> |
* mips.h (CPU_R2000): Remove. |
2003-10-21 Peter Barada <pbarada@mail.wm.sps.mot.com> |
Bernardo Innocenti <bernie@develer.com> |
* m68k.h: Add MCFv4/MCF5528x support. |
2003-10-19 Hans-Peter Nilsson <hp@bitrange.com> |
* mmix.h (JMP_INSN_BYTE): Define. |
2003-09-30 Chris Demetriou <cgd@broadcom.com> |
* mips.h: Document +E, +F, +G, +H, and +I operand types. |
Update documentation of I, +B and +C operand types. |
(INSN_ISA64R2, ISA_MIPS64R2, CPU_MIPS64R2): New defines. |
(M_DEXT, M_DINS): New enum values. |
2003-09-04 Nick Clifton <nickc@redhat.com> |
* v850.h (PROCESSOR_V850E1): Define. |
2003-08-19 Alan Modra <amodra@bigpond.net.au> |
* ppc.h (PPC_OPCODE_440): Define. Formatting. Use hex for other |
PPC_OPCODE_* defines. |
2003-08-16 Jason Eckhardt <jle@rice.edu> |
* i860.h (fmov.ds): Expand as famov.ds. |
(fmov.sd): Expand as famov.sd. |
(pfmov.ds): Expand as pfamov.ds. |
2003-08-07 Michael Meissner <gnu@the-meissners.org> |
* cgen.h: Remove PARAM macro usage in all prototypes. |
(CGEN_EXTRACT_INFO): Use void * instead of PTR. |
(cgen_print_fn): Ditto. |
(CGEN_HW_ENTRY): Ditto. |
(CGEN_MAYBE_MULTI_IFLD): Ditto. |
(struct cgen_insn): Ditto. |
(CGEN_CPU_TABLE): Ditto. |
2003-08-07 Alan Modra <amodra@bigpond.net.au> |
* alpha.h: Remove PARAMS macro. |
* arc.h: Likewise. |
* d10v.h: Likewise. |
* d30v.h: Likewise. |
* i370.h: Likewise. |
* or32.h: Likewise. |
* pj.h: Likewise. |
* ppc.h: Likewise. |
* sparc.h: Likewise. |
* tic80.h: Likewise. |
* v850.h: Likewise. |
2003-07-18 Michael Snyder <msnyder@redhat.com> |
* include/opcode/h8sx.h (DO_MOVA1, DO_MOVA2): Reformatting. |
2003-07-15 Richard Sandiford <rsandifo@redhat.com> |
* mips.h (CPU_RM7000): New macro. |
(OPCODE_IS_MEMBER): Match CPU_RM7000 against 4650 insns. |
2003-07-09 Alexandre Oliva <aoliva@redhat.com> |
2000-04-01 Alexandre Oliva <aoliva@cygnus.com> |
* mn10300.h (AM33_2): Renamed from AM33. |
2000-03-31 Alexandre Oliva <aoliva@cygnus.com> |
* mn10300.h (AM332, FMT_D3): Defined. |
(MN10300_OPERAND_FSREG, MN10300_OPERAND_FDREG): Likewise. |
(MN10300_OPERAND_FPCR): Likewise. |
2003-07-01 Martin Schwidefsky <schwidefsky@de.ibm.com> |
* s390.h (s390_opcode_cpu_val): Add enum for cpu type z990. |
2003-06-25 Richard Sandiford <rsandifo@redhat.com> |
* h8300.h (IMM2_NS, IMM8_NS, IMM16_NS): Remove. |
(IMM8U, IMM8U_NS): Define. |
(h8_opcodes): Use IMM8U_NS for mov.[wl] #xx:8,@yy. |
2003-06-25 Richard Sandiford <rsandifo@redhat.com> |
* h8300.h (h8_opcodes): Fix the mov.l @(dd:32,ERs),ERd and |
mov.l ERs,@(dd:32,ERd) entries. |
2003-06-23 H.J. Lu <hongjiu.lu@intel.com> |
* i386.h (i386_optab): Support Intel Precott New Instructions. |
2003-06-10 Gary Hade <garyhade@us.ibm.com> |
* ppc.h (PPC_OPERAND_DQ): Define. |
2003-06-10 Richard Sandiford <rsandifo@redhat.com> |
* h8300.h (IMM4_NS, IMM8_NS): New. |
(h8_opcodes): Replace IMM4 with IMM4_NS in mov.b and mov.w entries. |
Likewise IMM8 for mov.w and mov.l. Likewise IMM16U for mov.l. |
2003-06-03 Michael Snyder <msnyder@redhat.com> |
* h8300.h (enum h8_model): Add AV_H8S to distinguish from H8H. |
(ldc): Split ccr ops from exr ops (which are only available |
on H8S or H8SX). |
(stc): Ditto. |
(andc, orc, xorc): Ditto. |
(ldmac, stmac, clrmac, mac): Change access to AV_H8S. |
2003-06-03 Michael Snyder <msnyder@redhat.com> |
and Bernd Schmidt <bernds@redhat.com> |
and Alexandre Oliva <aoliva@redhat.com> |
* h8300.h: Add support for h8300sx instruction set. |
2003-05-23 Jason Eckhardt <jle@rice.edu> |
* i860.h (expand_type): Add XP_ONLY. |
(scyc.b): New XP instruction. |
(ldio.l): Likewise. |
(ldio.s): Likewise. |
(ldio.b): Likewise. |
(ldint.l): Likewise. |
(ldint.s): Likewise. |
(ldint.b): Likewise. |
(stio.l): Likewise. |
(stio.s): Likewise. |
(stio.b): Likewise. |
(pfld.q): Likewise. |
2003-05-20 Jason Eckhardt <jle@rice.edu> |
* i860.h (flush): Set lower 3 bits properly and use 'L' |
for the immediate operand type instead of 'i'. |
2003-05-20 Jason Eckhardt <jle@rice.edu> |
* i860.h (fzchks): Both S and R bits must be set. |
(pfzchks): Likewise. |
(faddp): Likewise. |
(pfaddp): Likewise. |
(fix.ss): Remove (invalid instruction). |
(pfix.ss): Likewise. |
(ftrunc.ss): Likewise. |
(pftrunc.ss): Likewise. |
2003-05-18 Jason Eckhardt <jle@rice.edu> |
* i860.h (form, pform): Add missing .dd suffix. |
2003-05-13 Stephane Carrez <stcarrez@nerim.fr> |
* m68hc11.h (M68HC12_BANK_VIRT): Define to 0x010000 |
2003-04-07 Michael Snyder <msnyder@redhat.com> |
* h8300.h (ldc/stc): Fix up src/dst swaps. |
2003-04-09 J. Grant <jg-binutils@jguk.org> |
* mips.h: Correct comment typo. |
2003-03-21 Martin Schwidefsky <schwidefsky@de.ibm.com> |
* s390.h (s390_opcode_arch_val): Rename to s390_opcode_mode_val. |
(S390_OPCODE_ESAME): Rename to S390_OPCODE_ZARCH. |
(s390_opcode): Remove architecture. Add modes and min_cpu. |
2003-03-17 D.Venkatasubramanian <dvenkat@noida.hcltech.com> |
* h8300.h (O_SYS_CMDLINE): New pseudo opcode for command line |
processing. |
2003-02-21 Noida D.Venkatasubramanian <dvenkat@noida.hcltech.com> |
* h8300.h (ldmac, stmac): Replace MACREG with MS32 and MD32. |
2003-01-23 Alan Modra <amodra@bigpond.net.au> |
* m68hc11.h (cpu6812s): Define. |
2003-01-07 Chris Demetriou <cgd@broadcom.com> |
* mips.h: Fix missing space in comment. |
(INSN_ISA1, INSN_ISA2, INSN_ISA3, INSN_ISA4, INSN_ISA5) |
(INSN_ISA32, INSN_ISA32R2, INSN_ISA64): Shift values right |
by four bits. |
2003-01-02 Chris Demetriou <cgd@broadcom.com> |
* mips.h: Update copyright years to include 2002 (which had |
been missed previously) and 2003. Make comments about "+A", |
"+B", and "+C" operand types more descriptive. |
2002-12-31 Chris Demetriou <cgd@broadcom.com> |
* mips.h: Note that the "+D" operand type name is now used. |
2002-12-30 Chris Demetriou <cgd@broadcom.com> |
* mips.h: Document "+" as the start of two-character operand |
type names, and add new "K", "+A", "+B", and "+C" operand types. |
(OP_MASK_INSMSB, OP_SH_INSMSB, OP_MASK_EXTMSB) |
(OP_SH_EXTMSB, INSN_ISA32R2, ISA_MIPS32R2, CPU_MIPS32R2): New |
defines. |
2002-12-24 Dmitry Diky <diwil@mail.ru> |
* msp430.h: New file. Defines msp430 opcodes. |
2002-12-30 D.Venkatasubramanian <dvenkat@noida.hcltech.com> |
* h8300.h: Added some more pseudo opcodes for system call |
processing. |
2002-12-19 Chris Demetriou <cgd@broadcom.com> |
* mips.h (OP_OP_COP0, OP_OP_COP1, OP_OP_COP2, OP_OP_COP3) |
(OP_OP_LWC1, OP_OP_LWC2, OP_OP_LWC3, OP_OP_LDC1, OP_OP_LDC2) |
(OP_OP_LDC3, OP_OP_SWC1, OP_OP_SWC2, OP_OP_SWC3, OP_OP_SDC1) |
(OP_OP_SDC2, OP_OP_SDC3): Define. |
2002-12-16 Alan Modra <amodra@bigpond.net.au> |
* hppa.h (completer_chars): #if 0 out. |
* ns32k.h (struct ns32k_opcode): Constify "name", "operands" and |
"default_args". |
(struct not_wot): Constify "args". |
(struct not): Constify "name". |
(numopcodes): Delete. |
(endop): Delete. |
2002-12-13 Alan Modra <amodra@bigpond.net.au> |
* pj.h (pj_opc_info_t): Add union. |
2002-12-04 David Mosberger <davidm@hpl.hp.com> |
* ia64.h: Fix copyright message. |
(IA64_OPND_AR_CSD): New operand kind. |
2002-12-03 Richard Henderson <rth@redhat.com> |
* ia64.h (enum ia64_opnd): Add IA64_OPND_LDXMOV. |
2002-12-03 Alan Modra <amodra@bigpond.net.au> |
* cgen.h (struct cgen_maybe_multi_ifield): Add "const PTR p" to union. |
Constify "leaf" and "multi". |
2002-11-19 Klee Dienes <kdienes@apple.com> |
* h8300.h (h8_opcode): Remove 'noperands', 'idx', and 'size' |
fields. |
(h8_opcodes). Modify initializer and initializer macros to no |
longer initialize the removed fields. |
2002-11-19 Svein E. Seldal <Svein.Seldal@solidas.com> |
* tic4x.h (c4x_insts): Fixed LDHI constraint |
2002-11-18 Klee Dienes <kdienes@apple.com> |
* h8300.h (h8_opcode): Remove 'length' field. |
(h8_opcodes): Mark as 'const' (both the declaration and |
definition). Modify initializer and initializer macros to no |
longer initialize the length field. |
2002-11-18 Klee Dienes <kdienes@apple.com> |
* arc.h (arc_ext_opcodes): Declare as extern. |
(arc_ext_operands): Declare as extern. |
* i860.h (i860_opcodes): Declare as const. |
2002-11-18 Svein E. Seldal <Svein.Seldal@solidas.com> |
* tic4x.h: File reordering. Added enhanced opcodes. |
2002-11-16 Svein E. Seldal <Svein.Seldal@solidas.com> |
* tic4x.h: Major rewrite of entire file. Define instruction |
classes, and put each instruction into a class. |
2002-11-11 Svein E. Seldal <Svein.Seldal@solidas.com> |
* tic4x.h: Added new opcodes and corrected some bugs. Add support |
for new DSP types. |
2002-10-14 Alan Modra <amodra@bigpond.net.au> |
* cgen.h: Test __BFD_H_SEEN__ rather than BFD_VERSION_DATE. |
2002-09-30 Gavin Romig-Koch <gavin@redhat.com> |
Ken Raeburn <raeburn@cygnus.com> |
Aldy Hernandez <aldyh@redhat.com> |
Eric Christopher <echristo@redhat.com> |
Richard Sandiford <rsandifo@redhat.com> |
* mips.h: Update comment for new opcodes. |
(OP_MASK_VECBYTE, OP_SH_VECBYTE): New. |
(OP_MASK_VECALIGN, OP_SH_VECALIGN): New. |
(INSN_4111, INSN_4120, INSN_5400, INSN_5500): New. |
(CPU_VR4120, CPU_VR5400, CPU_VR5500): New. |
(OPCODE_IS_MEMBER): Handle the new CPU_* values and INSN_* flags. |
Don't match CPU_R4111 with INSN_4100. |
2002-08-19 Elena Zannoni <ezannoni@redhat.com> |
From matthew green <mrg@redhat.com> |
* ppc.h (PPC_OPCODE_SPE): New opcode flag for Powerpc e500 |
instructions. |
(PPC_OPCODE_ISEL, PPC_OPCODE_BRLOCK, PPC_OPCODE_PMR, |
PPC_OPCODE_CACHELCK, PPC_OPCODE_RFMCI): New opcode flags for the |
e500x2 Integer select, branch locking, performance monitor, |
cache locking and machine check APUs, respectively. |
(PPC_OPCODE_EFS): New opcode type for efs* instructions. |
(PPC_OPCODE_CLASSIC): New opcode type for Classic PowerPC instructions. |
2002-08-13 Stephane Carrez <stcarrez@nerim.fr> |
* m68hc11.h (M6812_OP_PAGE): Define to identify call operand. |
(M68HC12_BANK_VIRT, M68HC12_BANK_MASK, M68HC12_BANK_BASE, |
M68HC12_BANK_SHIFT, M68HC12_BANK_PAGE_MASK): Define for 68HC12 |
memory banks. |
(M6811_OC1M5, M6811_OC1M4, M6811_MODF): Fix value. |
2002-07-09 Thiemo Seufer <seufer@csv.ica.uni-stuttgart.de> |
* mips.h (INSN_MIPS16): New define. |
2002-07-08 Alan Modra <amodra@bigpond.net.au> |
* i386.h: Remove IgnoreSize from movsx and movzx. |
2002-06-08 Alan Modra <amodra@bigpond.net.au> |
* a29k.h: Replace CONST with const. |
(CONST): Don't define. |
* convex.h: Replace CONST with const. |
(CONST): Don't define. |
* dlx.h: Replace CONST with const. |
* or32.h (CONST): Don't define. |
2002-05-30 Chris G. Demetriou <cgd@broadcom.com> |
* mips.h (OP_SH_ALN, OP_MASK_ALN, OP_SH_VSEL, OP_MASK_VSEL) |
(MDMX_FMTSEL_IMM_QH, MDMX_FMTSEL_IMM_OB, MDMX_FMTSEL_VEC_QH) |
(MDMX_FMTSEL_VEC_OB, INSN_READ_MDMX_ACC, INSN_WRITE_MDMX_ACC) |
(INSN_MDMX): New constants, for MDMX support. |
(opcode character list): Add "O", "Q", "X", "Y", and "Z" for MDMX. |
2002-05-28 Kuang Hwa Lin <kuang@sbcglobal.net> |
* dlx.h: New file. |
2002-05-25 Alan Modra <amodra@bigpond.net.au> |
* ia64.h: Use #include "" instead of <> for local header files. |
* sparc.h: Likewise. |
2002-05-22 Thiemo Seufer <seufer@csv.ica.uni-stuttgart.de> |
* mips.h: Add M_DROL, M_DROL_I, M_DROR, M_DROR_I macro cases. |
2002-05-17 Andrey Volkov <avolkov@sources.redhat.com> |
* h8300.h: Corrected defs of all control regs |
and eepmov instr. |
2002-04-11 Alan Modra <amodra@bigpond.net.au> |
* i386.h: Add intel mode cmpsd and movsd. |
Put them before SSE2 insns, so that rep prefix works. |
2002-03-15 Chris G. Demetriou <cgd@broadcom.com> |
* mips.h (INSN_MIPS3D): New definition used to mark MIPS-3D |
instructions. |
(OPCODE_IS_MEMBER): Adjust comments to indicate that ASE bit masks |
may be passed along with the ISA bitmask. |
2002-03-05 Paul Koning <pkoning@equallogic.com> |
* pdp11.h: Add format codes for float instruction formats. |
2002-02-25 Alan Modra <amodra@bigpond.net.au> |
* ppc.h (PPC_OPCODE_POWER4, PPC_OPCODE_NOPOWER4): Define. |
Mon Feb 18 17:31:48 CET 2002 Jan Hubicka <jh@suse.cz> |
* i386.h (push,pop): Fix Reg64 to WordReg to allow 16bit operands. |
Mon Feb 11 12:53:19 CET 2002 Jan Hubicka <jh@suse.cz> |
* i386.h (push,pop): Allow 16bit operands in 64bit mode. |
(xchg): Fix. |
(in, out): Disable 64bit operands. |
(call, jmp): Avoid REX prefixes. |
(jcxz): Prohibit in 64bit mode |
(jrcxz, loop): Add 64bit variants. |
(movq): Fix patterns. |
(movmskps, pextrw, pinstrw): Add 64bit variants. |
2002-01-31 Ivan Guzvinec <ivang@opencores.org> |
* or32.h: New file. |
2002-01-22 Graydon Hoare <graydon@redhat.com> |
* cgen.h (CGEN_MAYBE_MULTI_IFLD): New structure. |
(CGEN_OPERAND): Add CGEN_MAYBE_MULTI_IFLD field. |
2002-01-21 Thomas Klausner <wiz@danbala.ifoer.tuwien.ac.at> |
* h8300.h: Comment typo fix. |
2002-01-03 matthew green <mrg@redhat.com> |
* ppc.h (PPC_OPCODE_BOOKE): BookE is not Motorola specific. |
(PPC_OPCODE_BOOKE64): Likewise. |
Mon Dec 31 16:45:41 2001 Jeffrey A Law (law@cygnus.com) |
* hppa.h (call, ret): Move to end of table. |
(addb, addib): PA2.0 variants should have been PA2.0W. |
(ldw, ldh, ldb, stw, sth, stb, stwa): Reorder to keep disassembler |
happy. |
(fldw, fldd, fstw, fstd, bb): Likewise. |
(short loads/stores): Tweak format specifier slightly to keep |
disassembler happy. |
(indexed loads/stores): Likewise. |
(absolute loads/stores): Likewise. |
2001-12-04 Alexandre Oliva <aoliva@redhat.com> |
* d10v.h (OPERAND_NOSP): New macro. |
2001-11-29 Alexandre Oliva <aoliva@redhat.com> |
* d10v.h (OPERAND_SP): New macro. |
2001-11-15 Alan Modra <amodra@bigpond.net.au> |
* ppc.h (struct powerpc_operand <insert, extract>): Add dialect param. |
2001-11-11 Timothy Wall <twall@alum.mit.edu> |
* tic54x.h: Revise opcode layout; don't really need a separate |
structure for parallel opcodes. |
2001-11-13 Zack Weinberg <zack@codesourcery.com> |
Alan Modra <amodra@bigpond.net.au> |
* i386.h (i386_optab): Add entries for "sldr", "smsw" and "str" to |
accept WordReg. |
2001-11-04 Chris Demetriou <cgd@broadcom.com> |
* mips.h (OPCODE_IS_MEMBER): Remove extra space. |
2001-10-30 Hans-Peter Nilsson <hp@bitrange.com> |
* mmix.h: New file. |
2001-10-18 Chris Demetriou <cgd@broadcom.com> |
* mips.h (OPCODE_IS_MEMBER): Add a no-op term to the end |
of the expression, to make source code merging easier. |
2001-10-17 Chris Demetriou <cgd@broadcom.com> |
* mips.h: Sort coprocessor instruction argument characters |
in comment, add a few more words of description for "H". |
2001-10-17 Chris Demetriou <cgd@broadcom.com> |
* mips.h (INSN_SB1): New cpu-specific instruction bit. |
(OPCODE_IS_MEMBER): Allow instructions matching INSN_SB1 |
if cpu is CPU_SB1. |
2001-10-17 matthew green <mrg@redhat.com> |
* ppc.h (PPC_OPCODE_BOOKE64): Fix typo. |
2001-10-12 matthew green <mrg@redhat.com> |
* ppc.h (PPC_OPCODE_BOOKE, PPC_OPCODE_BOOKE64, PPC_OPCODE_403): New |
opcode flags for BookE 32-bit, BookE 64-bit and PowerPC 403 |
instructions, respectively. |
2001-09-27 Nick Clifton <nickc@cambridge.redhat.com> |
* v850.h: Remove spurious comment. |
2001-09-21 Nick Clifton <nickc@cambridge.redhat.com> |
* h8300.h: Fix compile time warning messages |
2001-09-04 Richard Henderson <rth@redhat.com> |
* alpha.h (struct alpha_operand): Pack elements into bitfields. |
2001-08-31 Eric Christopher <echristo@redhat.com> |
* mips.h: Remove CPU_MIPS32_4K. |
2001-08-27 Torbjorn Granlund <tege@swox.com> |
* ppc.h (PPC_OPERAND_DS): Define. |
2001-08-25 Andreas Jaeger <aj@suse.de> |
* d30v.h: Fix declaration of reg_name_cnt. |
* d10v.h: Fix declaration of d10v_reg_name_cnt. |
* arc.h: Add prototypes from opcodes/arc-opc.c. |
2001-08-16 Thiemo Seufer <seufer@csv.ica.uni-stuttgart.de> |
* mips.h (INSN_10000): Define. |
(OPCODE_IS_MEMBER): Check for INSN_10000. |
2001-08-10 Alan Modra <amodra@one.net.au> |
* ppc.h: Revert 2001-08-08. |
2001-08-10 Richard Sandiford <rsandifo@redhat.com> |
* mips.h (INSN_GP32): Remove. |
(OPCODE_IS_MEMBER): Remove gp32 parameter. |
(M_MOVE): New macro identifier. |
2001-08-08 Alan Modra <amodra@one.net.au> |
1999-10-25 Torbjorn Granlund <tege@swox.com> |
* ppc.h (struct powerpc_operand): New field `reloc'. |
2001-08-01 Aldy Hernandez <aldyh@redhat.com> |
* mips.h (INSN_ISA_MASK): Nuke bits 12-15. |
2001-07-12 Jeff Johnston <jjohnstn@redhat.com> |
* cgen.h (CGEN_INSN): Add regex support. |
(build_insn_regex): Declare. |
2001-07-11 Frank Ch. Eigler <fche@redhat.com> |
* cgen.h (CGEN_MACH): Add insn_chunk_bitsize field. |
(cgen_cpu_desc): Ditto. |
2001-07-07 Ben Elliston <bje@redhat.com> |
* m88k.h: Clean up and reformat. Remove unused code. |
2001-06-14 Geoffrey Keating <geoffk@redhat.com> |
* cgen.h (cgen_keyword): Add nonalpha_chars field. |
2001-05-23 Thiemo Seufer <seufer@csv.ica.uni-stuttgart.de> |
* mips.h (CPU_R12000): Define. |
2001-05-23 John Healy <jhealy@redhat.com> |
* cgen.h: Increased CGEN_MAX_SYNTAX_ELEMENTS to 48. |
2001-05-15 Thiemo Seufer <seufer@csv.ica.uni-stuttgart.de> |
* mips.h (INSN_ISA_MASK): Define. |
2001-05-12 Alan Modra <amodra@one.net.au> |
* i386.h (i386_optab): Second operand of cvtps2dq is an xmm reg, |
not an mmx reg. Swap xmm/mmx regs on both movdq2q and movq2dq, |
and use InvMem as these insns must have register operands. |
2001-05-04 Alan Modra <amodra@one.net.au> |
* i386.h (i386_optab): Move InvMem to first operand of pmovmskb |
and pextrw to swap reg/rm assignments. |
2001-04-05 Hans-Peter Nilsson <hp@axis.com> |
* cris.h (enum cris_insn_version_usage): Correct comment for |
cris_ver_v3p. |
2001-03-24 Alan Modra <alan@linuxcare.com.au> |
* i386.h (i386_optab): Correct entry for "movntdq". Add "punpcklqdq". |
Add InvMem to first operand of "maskmovdqu". |
2001-03-22 Hans-Peter Nilsson <hp@axis.com> |
* cris.h (ADD_PC_INCR_OPCODE): New macro. |
2001-03-21 Kazu Hirata <kazu@hxi.com> |
* h8300.h: Fix formatting. |
2001-03-22 Alan Modra <alan@linuxcare.com.au> |
* i386.h (i386_optab): Add paddq, psubq. |
2001-03-19 Alan Modra <alan@linuxcare.com.au> |
* i386.h (REGNAM_AL, REGNAM_AX, REGNAM_EAX): Define. |
2001-02-28 Igor Shevlyakov <igor@windriver.com> |
* m68k.h: new defines for Coldfire V4. Update mcf to know |
about mcf5407. |
2001-02-18 lars brinkhoff <lars@nocrew.org> |
* pdp11.h: New file. |
2001-02-12 Jan Hubicka <jh@suse.cz> |
* i386.h (i386_optab): SSE integer converison instructions have |
64bit versions on x86-64. |
2001-02-10 Nick Clifton <nickc@redhat.com> |
* mips.h: Remove extraneous whitespace. Formating change to allow |
for future contribution. |
2001-02-09 Martin Schwidefsky <schwidefsky@de.ibm.com> |
* s390.h: New file. |
2001-02-02 Patrick Macdonald <patrickm@redhat.com> |
* cgen.h (CGEN_SYNTAX_CHAR_TYPE): Typedef as unsigned short. |
(CGEN_MAX_SYNTAX_ELEMENTS): Rename from CGEN_MAX_SYNTAX_BYTES. |
(CGEN_SYNTAX): Define using CGEN_MAX_SYNTAX_ELEMENTS. |
2001-01-24 Karsten Keil <kkeil@suse.de> |
* i386.h (i386_optab): Fix swapgs |
2001-01-14 Alan Modra <alan@linuxcare.com.au> |
* hppa.h: Describe new '<' and '>' operand types, and tidy |
existing comments. |
(pa_opcodes): Add entries for missing wide mode ldi,ldo,ldw,stw. |
Remove duplicate "ldw j(s,b),x". Sort some entries. |
2001-01-13 Jan Hubicka <jh@suse.cz> |
* i386.h (i386_optab): Fix pusha and ret templates. |
2001-01-11 Peter Targett <peter.targett@arccores.com> |
* arc.h (ARC_MACH_5, ARC_MACH_6, ARC_MACH_7, ARC_MACH_8): New |
definitions for masking cpu type. |
(arc_ext_operand_value) New structure for storing extended |
operands. |
(ARC_OPERAND_*) Flags for operand values. |
2001-01-10 Jan Hubicka <jh@suse.cz> |
* i386.h (pinsrw): Add. |
(pshufw): Remove. |
(cvttpd2dq): Fix operands. |
(cvttps2dq): Likewise. |
(movq2q): Rename to movdq2q. |
2001-01-10 Richard Schaal <richard.schaal@intel.com> |
* i386.h: Correct movnti instruction. |
2001-01-09 Jeff Johnston <jjohnstn@redhat.com> |
* cgen.h (CGEN_SYNTAX_CHAR_TYPE): New typedef based on max number |
of operands (unsigned char or unsigned short). |
(CGEN_SYNTAX): Changed to make array CGEN_SYNTAX_CHAR_TYPE. |
(CGEN_SYNTAX_CHAR): Changed to cast to unsigned char. |
2001-01-05 Jan Hubicka <jh@suse.cz> |
* i386.h (i386_optab): Make [sml]fence template to use immext field. |
2001-01-03 Jan Hubicka <jh@suse.cz> |
* i386.h (i386_optab): Fix 64bit pushf template; Add instructions |
introduced by Pentium4 |
2000-12-30 Jan Hubicka <jh@suse.cz> |
* i386.h (i386_optab): Add "rex*" instructions; |
add swapgs; disable jmp/call far direct instructions for |
64bit mode; add syscall and sysret; disable registers for 0xc6 |
template. Add 'q' suffixes to extendable instructions, disable |
obsolete instructions, add new sign/zero extension ones. |
(i386_regtab): Add extended registers. |
(*Suf): Add No_qSuf. |
(q_Suf, wlq_Suf, bwlq_Suf): New. |
2000-12-20 Jan Hubicka <jh@suse.cz> |
* i386.h (i386_optab): Replace "Imm" with "EncImm". |
(i386_regtab): Add flags field. |
2000-12-12 Nick Clifton <nickc@redhat.com> |
* mips.h: Fix formatting. |
2000-12-01 Chris Demetriou <cgd@sibyte.com> |
mips.h (OP_MASK_SYSCALL, OP_SH_SYSCALL): Delete. |
(OP_MASK_CODE20, OP_SH_CODE20): Define, with values of old |
OP_*_SYSCALL definitions. |
(OP_SH_CODE19, OP_MASK_CODE19): Define, for use as |
19 bit wait codes. |
(MIPS operand specifier comments): Remove 'm', add 'U' and |
'J', and update the meaning of 'B' so that it's more general. |
* mips.h (INSN_ISA1, INSN_ISA2, INSN_ISA3, INSN_ISA4, |
INSN_ISA5): Renumber, redefine to mean the ISA at which the |
instruction was added. |
(INSN_ISA32): New constant. |
(INSN_4650, INSN_4010, INSN_4100, INSN_3900, INSN_GP32): |
Renumber to avoid new and/or renumbered INSN_* constants. |
(INSN_MIPS32): Delete. |
(ISA_UNKNOWN): New constant to indicate unknown ISA. |
(ISA_MIPS1, ISA_MIPS2, ISA_MIPS3, ISA_MIPS4, ISA_MIPS5, |
ISA_MIPS32): New constants, defined to be the mask of INSN_* |
constants available at that ISA level. |
(CPU_UNKNOWN): New constant to indicate unknown CPU. |
(CPU_4K, CPU_MIPS32_4K): Rename the former to the latter, |
define it with a unique value. |
(OPCODE_IS_MEMBER): Update for new ISA membership-related |
constant meanings. |
* mips.h (INSN_ISA64, ISA_MIPS5, ISA_MIPS64): New |
definitions. |
* mips.h (CPU_SB1): New constant. |
2000-10-20 Jakub Jelinek <jakub@redhat.com> |
* sparc.h (enum sparc_opcode_arch_val): Add SPARC_OPCODE_ARCH_V9B. |
Note that '3' is used for siam operand. |
2000-09-22 Jim Wilson <wilson@cygnus.com> |
* ia64.h (enum ia64_dependency_semantics): Add IA64_DVS_STOP. |
2000-09-13 Anders Norlander <anorland@acc.umu.se> |
* mips.h: Use defines instead of hard-coded processor numbers. |
(CPU_R2000, CPU_R3000, CPU_R3900, CPU_R4000, CPU_R4010, |
CPU_VR4100, CPU_R4111, CPU_R4300, CPU_R4400, CPU_R4600, CPU_R4650, |
CPU_R5000, CPU_R6000, CPU_R8000, CPU_R10000, CPU_MIPS32, CPU_4K, |
CPU_4KC, CPU_4KM, CPU_4KP): Define.. |
(OPCODE_IS_MEMBER): Use new defines. |
(OP_MASK_SEL, OP_SH_SEL): Define. |
(OP_MASK_CODE20, OP_SH_CODE20): Define. |
Add 'P' to used characters. |
Use 'H' for coprocessor select field. |
Use 'm' for 20 bit breakpoint code. |
Document new arg characters and add to used characters. |
(INSN_MIPS32): New define for MIPS32 extensions. |
(OPCODE_IS_MEMBER): Recognize MIPS32 instructions. |
2000-09-05 Alan Modra <alan@linuxcare.com.au> |
* hppa.h: Mention cz completer. |
2000-08-16 Jim Wilson <wilson@cygnus.com> |
* ia64.h (IA64_OPCODE_POSTINC): New. |
2000-08-15 H.J. Lu <hjl@gnu.org> |
* i386.h: Swap the Intel syntax "movsx"/"movzx" due to the |
IgnoreSize change. |
2000-08-08 Jason Eckhardt <jle@cygnus.com> |
* i860.h: Small formatting adjustments. |
2000-07-29 Marek Michalkiewicz <marekm@linux.org.pl> |
* avr.h (AVR_UNDEF_P, AVR_SKIP_P, AVR_DISP0_P): New macros. |
Move related opcodes closer to each other. |
Minor changes in comments, list undefined opcodes. |
2000-07-26 Dave Brolley <brolley@redhat.com> |
* cgen.h (cgen_hw_lookup_by_num): Second parameter is unsigned. |
2000-07-22 Jason Eckhardt <jle@cygnus.com> |
* i860.h (btne, bte, bla): Changed these opcodes |
to use sbroff ('r') instead of split16 ('s'). |
(J, K, L, M): New operand types for 16-bit aligned fields. |
(ld.x, {p}fld.x, fst.x, pst.d): Changed these opcodes to |
use I, J, K, L, M instead of just I. |
(T, U): New operand types for split 16-bit aligned fields. |
(st.x): Changed these opcodes to use S, T, U instead of just S. |
(andh, andnoth, orh, xorh): Deleted 3-register forms as they do not |
exist on the i860. |
(pfgt.sd, pfle.sd): Deleted these as they do not exist on the i860. |
(pfeq.ss, pfeq.dd): New opcodes. |
(st.s): Fixed incorrect mask bits. |
(fmlow): Fixed incorrect mask bits. |
(fzchkl, pfzchkl): Fixed incorrect mask bits. |
(faddz, pfaddz): Fixed incorrect mask bits. |
(form, pform): Fixed incorrect mask bits. |
(pfld.l): Fixed incorrect mask bits. |
(fst.q): Fixed incorrect mask bits. |
(all floating point opcodes): Fixed incorrect mask bits for |
handling of dual bit. |
2000-07-20 Hans-Peter Nilsson <hp@axis.com> |
cris.h: New file. |
2000-06-26 Marek Michalkiewicz <marekm@linux.org.pl> |
* avr.h (AVR_ISA_WRAP): Remove, now assumed if not AVR_ISA_MEGA. |
(AVR_ISA_ESPM): Remove, because ESPM removed in databook update. |
(AVR_ISA_85xx): Remove, all uses changed back to AVR_ISA_2xxx. |
(AVR_ISA_M83): Define for ATmega83, ATmega85. |
(espm): Remove, because ESPM removed in databook update. |
(eicall, eijmp): Move to the end of opcode table. |
2000-06-18 Stephane Carrez <stcarrez@worldnet.fr> |
* m68hc11.h: New file for support of Motorola 68hc11. |
Fri Jun 9 21:51:50 2000 Denis Chertykov <denisc@overta.ru> |
* avr.h: clr,lsl,rol, ... moved after add,adc, ... |
Wed Jun 7 21:39:54 2000 Denis Chertykov <denisc@overta.ru> |
* avr.h: New file with AVR opcodes. |
Wed Apr 12 17:11:20 2000 Donald Lindsay <dlindsay@hound.cygnus.com> |
* d10v.h: added ALONE attribute for d10v_opcode.exec_type. |
2000-05-23 Maciej W. Rozycki <macro@ds2.pg.gda.pl> |
* i386.h: Allow d suffix on iret, and add DefaultSize modifier. |
2000-05-17 Maciej W. Rozycki <macro@ds2.pg.gda.pl> |
* i386.h: Use sl_FP, not sl_Suf for fild. |
2000-05-16 Frank Ch. Eigler <fche@redhat.com> |
* cgen.h (CGEN_MAX_SYNTAX_BYTES): Increase to 32. Check that |
it exceeds CGEN_ACTUAL_MAX_SYNTAX_BYTES, if set. |
(CGEN_MAX_IFMT_OPERANDS): Increase to 16. Check that it exceeds |
CGEN_ACTUAL_MAX_IFMT_OPERANDS, if set. |
2000-05-13 Alan Modra <alan@linuxcare.com.au>, |
* i386.h (i386_optab): Cpu686 for sysenter,sysexit,fxsave,fxrestore. |
2000-05-13 Alan Modra <alan@linuxcare.com.au>, |
Alexander Sokolov <robocop@netlink.ru> |
* i386.h (i386_optab): Add cpu_flags for all instructions. |
2000-05-13 Alan Modra <alan@linuxcare.com.au> |
From Gavin Romig-Koch <gavin@cygnus.com> |
* i386.h (wld_Suf): Define. Use on pushf, popf, pusha, popa. |
2000-05-04 Timothy Wall <twall@cygnus.com> |
* tic54x.h: New. |
2000-05-03 J.T. Conklin <jtc@redback.com> |
* ppc.h (PPC_OPCODE_ALTIVEC): New opcode flag for vector unit. |
(PPC_OPERAND_VR): New operand flag for vector registers. |
2000-05-01 Kazu Hirata <kazu@hxi.com> |
* h8300.h (EOP): Add missing initializer. |
Fri Apr 21 15:03:37 2000 Jason Eckhardt <jle@cygnus.com> |
* hppa.h (pa_opcodes): New opcodes for PA2.0 wide mode |
forms of ld/st{b,h,w,d} and fld/fst{w,d} (16-bit displacements). |
New operand types l,y,&,fe,fE,fx added to support above forms. |
(pa_opcodes): Replaced usage of 'x' as source/target for |
floating point double-word loads/stores with 'fx'. |
Fri Apr 21 13:20:53 2000 Richard Henderson <rth@cygnus.com> |
David Mosberger <davidm@hpl.hp.com> |
Timothy Wall <twall@cygnus.com> |
Jim Wilson <wilson@cygnus.com> |
* ia64.h: New file. |
2000-03-27 Nick Clifton <nickc@cygnus.com> |
* d30v.h (SHORT_A1): Fix value. |
(SHORT_AR): Renumber so that it is at the end of the list of short |
instructions, not the end of the list of long instructions. |
2000-03-26 Alan Modra <alan@linuxcare.com> |
* i386.h: (UNIXWARE_COMPAT): Rename to SYSV386_COMPAT as the |
problem isn't really specific to Unixware. |
(OLDGCC_COMPAT): Define. |
(i386_optab): If !OLDGCC_COMPAT, don't handle fsubp etc. with |
destination %st(0). |
Fix lots of comments. |
2000-03-02 J"orn Rennecke <amylaar@cygnus.co.uk> |
* d30v.h: |
(SHORT_B2r, SHORT_B3, SHORT_B3r, SHORT_B3b, SHORT_B3br): Updated. |
(SHORT_D1r, SHORT_D2, SHORT_D2r, SHORT_D2Br, SHORT_U): Updated. |
(SHORT_F, SHORT_AF, SHORT_T, SHORT_A5, SHORT_CMP, SHORT_CMPU): Updated. |
(SHORT_A1, SHORT_AA, SHORT_RA, SHORT_MODINC, SHORT_MODDEC): Updated. |
(SHORT_C1, SHORT_C2, SHORT_UF, SHORT_A2, SHORT_NONE, LONG): Updated. |
(LONG_U, LONG_Ur, LONG_CMP, LONG_M, LONG_M2, LONG_2, LONG_2r): Updated. |
(LONG_2b, LONG_2br, LONG_D, LONG_Dr, LONG_Dbr): Updated. |
2000-02-25 Alan Modra <alan@spri.levels.unisa.edu.au> |
* i386.h (fild, fistp): Change intel d_Suf form to fildd and |
fistpd without suffix. |
2000-02-24 Nick Clifton <nickc@cygnus.com> |
* cgen.h (cgen_cpu_desc): Rename field 'flags' to |
'signed_overflow_ok_p'. |
Delete prototypes for cgen_set_flags() and cgen_get_flags(). |
2000-02-24 Andrew Haley <aph@cygnus.com> |
* cgen.h (CGEN_INSN_MACH_HAS_P): New macro. |
(CGEN_CPU_TABLE): flags: new field. |
Add prototypes for new functions. |
2000-02-24 Alan Modra <alan@spri.levels.unisa.edu.au> |
* i386.h: Add some more UNIXWARE_COMPAT comments. |
2000-02-23 Linas Vepstas <linas@linas.org> |
* i370.h: New file. |
2000-02-22 Chandra Chavva <cchavva@cygnus.com> |
* d30v.h (FLAG_NOT_WITH_ADDSUBppp): Redefined as operation |
cannot be combined in parallel with ADD/SUBppp. |
2000-02-22 Andrew Haley <aph@cygnus.com> |
* mips.h: (OPCODE_IS_MEMBER): Add comment. |
1999-12-30 Andrew Haley <aph@cygnus.com> |
* mips.h (OPCODE_IS_MEMBER): Add gp32 arg, which determines |
whether synthetic opcodes (e.g. move) generate 32-bit or 64-bit |
insns. |
2000-01-15 Alan Modra <alan@spri.levels.unisa.edu.au> |
* i386.h: Qualify intel mode far call and jmp with x_Suf. |
1999-12-27 Alan Modra <alan@spri.levels.unisa.edu.au> |
* i386.h: Add JumpAbsolute qualifier to all non-intel mode |
indirect jumps and calls. Add FF/3 call for intel mode. |
Wed Dec 1 03:05:25 1999 Jeffrey A Law (law@cygnus.com) |
* mn10300.h: Add new operand types. Add new instruction formats. |
Wed Nov 24 20:28:58 1999 Jeffrey A Law (law@cygnus.com) |
* hppa.h (pa_opcodes): Correctly handle immediate for PA2.0 "bb" |
instruction. |
1999-11-18 Gavin Romig-Koch <gavin@cygnus.com> |
* mips.h (INSN_ISA5): New. |
1999-11-01 Gavin Romig-Koch <gavin@cygnus.com> |
* mips.h (OPCODE_IS_MEMBER): New. |
1999-10-29 Nick Clifton <nickc@cygnus.com> |
* d30v.h (SHORT_AR): Define. |
1999-10-18 Michael Meissner <meissner@cygnus.com> |
* alpha.h (alpha_num_opcodes): Convert to unsigned. |
(alpha_num_operands): Ditto. |
Sun Oct 10 01:46:56 1999 Jerry Quinn <jerry.quinn.adv91@alum.dartmouth.org> |
* hppa.h (pa_opcodes): Add load and store cache control to |
instructions. Add ordered access load and store. |
* hppa.h (pa_opcode): Add new entries for addb and addib. |
* hppa.h (pa_opcodes): Fix cmpb and cmpib entries. |
* hppa.h (pa_opcodes): Add entries for cmpb and cmpib. |
Thu Oct 7 00:12:25 MDT 1999 Diego Novillo <dnovillo@cygnus.com> |
* d10v.h: Add flag RESTRICTED_NUM3 for imm3 operands. |
Thu Sep 23 07:08:38 1999 Jerry Quinn <jquinn@nortelnetworks.com> |
* hppa.h (pa_opcodes): Add "call" and "ret". Clean up "b", "bve" |
and "be" using completer prefixes. |
* hppa.h (pa_opcodes): Add initializers to silence compiler. |
* hppa.h: Update comments about character usage. |
Mon Sep 20 03:55:31 1999 Jeffrey A Law (law@cygnus.com) |
* hppa.h (pa_opcodes): Fix minor thinkos introduced while cleaning |
up the new fstw & bve instructions. |
Sun Sep 19 10:40:59 1999 Jeffrey A Law (law@cygnus.com) |
* hppa.h (pa_opcodes): Add remaining PA2.0 integer load/store |
instructions. |
* hppa.h (pa_opcodes): Add remaining PA2.0 FP load/store instructions. |
* hppa.h (pa_opcodes): Add long offset double word load/store |
instructions. |
* hppa.h (pa_opcodes): Add FLAG_STRICT variants of FP loads and |
stores. |
* hppa.h (pa_opcodes): Handle PA2.0 fcnv, fcmp and ftest insns. |
* hppa.h (pa_opcodes): Finish support for PA2.0 "b" instructions. |
* hppa.h (pa_opcodes): Handle PA2.0 "bve" instructions. |
* hppa.h (pa_opcodes): Add new syntax "be" instructions. |
* hppa.h (pa_opcodes): Note use of 'M' and 'L'. |
* hppa.h (pa_opcodes): Add support for "b,l". |
* hppa.h (pa_opcodes): Add support for "b,gate". |
Sat Sep 18 11:41:16 1999 Jeffrey A Law (law@cygnus.com) |
* hppa.h (pa_opcodes): Use 'fX' for first register operand |
in xmpyu. |
* hppa.h (pa_opcodes): Fix mask for probe and probei. |
* hppa.h (pa_opcodes): Fix mask for depwi. |
Tue Sep 7 13:44:25 1999 Jeffrey A Law (law@cygnus.com) |
* hppa.h (pa_opcodes): Add "addil" variant which has the %r1 as |
an explicit output argument. |
Mon Sep 6 04:41:42 1999 Jeffrey A Law (law@cygnus.com) |
* hppa.h: Add strict variants of PA1.0/PA1.1 loads and stores. |
Add a few PA2.0 loads and store variants. |
1999-09-04 Steve Chamberlain <sac@pobox.com> |
* pj.h: New file. |
1999-08-29 Alan Modra <alan@spri.levels.unisa.edu.au> |
* i386.h (i386_regtab): Move %st to top of table, and split off |
other fp reg entries. |
(i386_float_regtab): To here. |
Sat Aug 28 00:25:25 1999 Jerry Quinn <jquinn@nortelnetworks.com> |
* hppa.h (pa_opcodes): Replace 'f' by 'v'. Prefix float register args |
by 'f'. |
* hppa.h (pa_opcodes): Add extrd, extrw, depd, depdi, depw, depwi. |
Add supporting args. |
* hppa.h: Document new completers and args. |
* hppa.h (pa_opcodes): Add 64 bit patterns and pa2.0 syntax for uxor, |
uaddcm, dcor, addi, add, sub, subi, shladd, rfi, and probe. Add pa2.0 |
extensions for ssm, rsm, pdtlb, pitlb. Add performance instructions |
pmenb and pmdis. |
* hppa.h (pa_opcodes): Add pa2.0 instructions hadd, hshl, |
hshr, hsub, mixh, mixw, permh. |
* hppa.h (pa_opcodes): Change completers in instructions to |
use 'c' prefix. |
* hppa.h (pa_opcodes): Add popbts, new forms of bb, havg, |
hshladd, hshradd, shrpd, and shrpw instructions. Update arg comments. |
* hppa.h (pa_opcodes): Change fmpyfadd, fmpynfadd, fneg, |
fnegabs to use 'I' instead of 'F'. |
1999-08-21 Alan Modra <alan@spri.levels.unisa.edu.au> |
* i386.h: Add AMD athlon instructions, pfnacc, pfpnacc, pswapd. |
Document pf2iw and pi2fw as athlon insns. Remove pswapw. |
Alphabetically sort PIII insns. |
Wed Aug 18 18:14:40 1999 Doug Evans <devans@canuck.cygnus.com> |
* cgen.h (CGEN_INSN_MACH_HAS_P): New macro. |
Fri Aug 6 09:46:35 1999 Jerry Quinn <jquinn@nortelnetworks.com> |
* hppa.h (pa_opcodes): Add 64 bit versions of or, xor, and, |
and andcm. Add 32 and 64 bit version of cmpclr, cmpiclr. |
* hppa.h: Document 64 bit condition completers. |
Thu Aug 5 16:56:07 1999 Jerry Quinn <jquinn@nortelnetworks.com> |
* hppa.h (pa_opcodes): Change condition args to use '?' prefix. |
1999-08-04 Alan Modra <alan@spri.levels.unisa.edu.au> |
* i386.h (i386_optab): Add DefaultSize modifier to all insns |
that implicitly modify %esp. #undef d_Suf, x_suf, sld_suf, |
sldx_suf, bwld_Suf, d_FP, x_FP, sld_FP, sldx_FP at end of table. |
Wed Jul 28 02:04:24 1999 Jerry Quinn <jquinn@nortelnetworks.com> |
Jeff Law <law@cygnus.com> |
* hppa.h (pa_opcodes): Add "pushnom" and "pushbts". |
* hppa.h (pa_opcodes): Mark all PA2.0 opcodes with FLAG_STRICT. |
* hppa.h (pa_opcodes): Change xmpyu, fmpyfadd, |
and fmpynfadd to use 'J' and 'K' instead of 'E' and 'X'. |
1999-07-13 Alan Modra <alan@spri.levels.unisa.edu.au> |
* i386.h: Add "undocumented" AMD 3DNow! pf2iw, pi2fw, pswapw insns. |
Thu Jul 1 00:17:24 1999 Jeffrey A Law (law@cygnus.com) |
* hppa.h (struct pa_opcode): Add new field "flags". |
(FLAGS_STRICT): Define. |
Fri Jun 25 04:22:04 1999 Jerry Quinn <jquinn@nortelnetworks.com> |
Jeff Law <law@cygnus.com> |
* hppa.h (pa_opcodes): Add pa2.0 clrbts instruction. |
* hppa.h (pa_opcodes): Add entries for mfia and mtsarcm instructions. |
1999-06-23 Alan Modra <alan@spri.levels.unisa.edu.au> |
* i386.h: Allow `l' suffix on bswap. Allow `w' suffix on arpl, |
lldt, lmsw, ltr, str, verr, verw. Add FP flag to fcmov*. Add FP |
flag to fcomi and friends. |
Fri May 28 15:26:11 1999 Jeffrey A Law (law@cygnus.com) |
* hppa.h (pa_opcodes): Move integer arithmetic instructions after |
integer logical instructions. |
1999-05-28 Linus Nordberg <linus.nordberg@canit.se> |
* m68k.h: Document new formats `E', `G', `H' and new places `N', |
`n', `o'. |
* m68k.h: Define mcf5206e, mcf5307, mcf. Document new format `u' |
and new places `m', `M', `h'. |
Thu May 27 04:13:54 1999 Joel Sherrill (joel@OARcorp.com |
* hppa.h (pa_opcodes): Add several processor specific system |
instructions. |
Wed May 26 16:57:44 1999 Jeffrey A Law (law@cygnus.com) |
* hppa.h (pa_opcodes): Add second entry for "comb", "comib", |
"addb", and "addib" to be used by the disassembler. |
1999-05-12 Alan Modra <alan@apri.levels.unisa.edu.au> |
* i386.h (ReverseModrm): Remove all occurences. |
(InvMem): Add to control/debug/test mov insns, movhlps, movlhps, |
movmskps, pextrw, pmovmskb, maskmovq. |
Change NoSuf to FP on all MMX, XMM and AMD insns as these all |
ignore the data size prefix. |
* i386.h (i386_optab, i386_regtab): Add support for PIII SIMD. |
Mostly stolen from Doug Ledford <dledford@redhat.com> |
Sat May 8 23:27:35 1999 Richard Henderson <rth@cygnus.com> |
* ppc.h (PPC_OPCODE_64_BRIDGE): New. |
1999-04-14 Doug Evans <devans@casey.cygnus.com> |
* cgen.h (CGEN_ATTR): Delete member num_nonbools. |
(CGEN_ATTR_TYPE): Update. |
(CGEN_ATTR_MASK): Number booleans starting at 0. |
(CGEN_ATTR_VALUE): Update. |
(CGEN_INSN_ATTR): Update. |
Mon Apr 12 23:43:27 1999 Jeffrey A Law (law@cygnus.com) |
* hppa.h (fmpyfadd, fmpynfadd, fneg, fnegabs): New PA2.0 |
instructions. |
Tue Mar 23 11:24:38 1999 Jeffrey A Law (law@cygnus.com) |
* hppa.h (bb, bvb): Tweak opcode/mask. |
1999-03-22 Doug Evans <devans@casey.cygnus.com> |
* cgen.h (CGEN_ISA,CGEN_MACH): New typedefs. |
(struct cgen_cpu_desc): Rename member mach to machs. New member isas. |
New members word_bitsize,default_insn_bitsize,base_insn-bitsize, |
min_insn_bitsize,max_insn_bitsize,isa_table,mach_table,rebuild_tables. |
Delete member max_insn_size. |
(enum cgen_cpu_open_arg): New enum. |
(cpu_open): Update prototype. |
(cpu_open_1): Declare. |
(cgen_set_cpu): Delete. |
1999-03-11 Doug Evans <devans@casey.cygnus.com> |
* cgen.h (CGEN_HW_TABLE): Delete `num_init_entries' member. |
(CGEN_OPERAND_NIL): New macro. |
(CGEN_OPERAND): New member `type'. |
(@arch@_cgen_operand_table): Delete decl. |
(CGEN_OPERAND_INDEX,CGEN_OPERAND_TYPE,CGEN_OPERAND_ENTRY): Delete. |
(CGEN_OPERAND_TABLE): New struct. |
(cgen_operand_lookup_by_name,cgen_operand_lookup_by_num): Declare. |
(CGEN_OPINST): Pointer to operand table entry replaced with enum. |
(CGEN_CPU_TABLE): New member `isa'. Change member `operand_table', |
now a CGEN_OPERAND_TABLE. Add CGEN_CPU_DESC arg to |
{get,set}_{int,vma}_operand. |
(@arch@_cgen_cpu_open): New arg `isa'. |
(cgen_set_cpu): Ditto. |
Fri Feb 26 02:36:45 1999 Richard Henderson <rth@cygnus.com> |
* i386.h: Fill in cmov and fcmov alternates. Add fcomi short forms. |
1999-02-25 Doug Evans <devans@casey.cygnus.com> |
* cgen.h (enum cgen_asm_type): Add CGEN_ASM_NONE. |
(CGEN_HW_ENTRY): Delete member `next'. Change type of `type' to |
enum cgen_hw_type. |
(CGEN_HW_TABLE): New struct. |
(hw_table): Delete declaration. |
(CGEN_OPERAND): Change member hw to hw_type, change type from pointer |
to table entry to enum. |
(CGEN_OPINST): Ditto. |
(CGEN_CPU_TABLE): Change member hw_list to hw_table. |
Sat Feb 13 14:13:44 1999 Richard Henderson <rth@cygnus.com> |
* alpha.h (AXP_OPCODE_EV6): New. |
(AXP_OPCODE_NOPAL): Include it. |
1999-02-09 Doug Evans <devans@casey.cygnus.com> |
* cgen.h (CGEN_CPU_DESC): Renamed from CGEN_OPCODE_DESC. |
All uses updated. New members int_insn_p, max_insn_size, |
parse_operand,insert_operand,extract_operand,print_operand, |
sizeof_fields,set_fields_bitsize,get_int_operand,set_int_operand, |
get_vma_operand,set_vma_operand,parse_handlers,insert_handlers, |
extract_handlers,print_handlers. |
(CGEN_ATTR): Change type of num_nonbools to unsigned int. |
(CGEN_ATTR_BOOL_OFFSET): New macro. |
(CGEN_ATTR_MASK): Subtract it to compute bit number. |
(CGEN_ATTR_VALUE): Redo bool/nonbool attr calculation. |
(cgen_opcode_handler): Renamed from cgen_base. |
(CGEN_HW_ATTR_VALUE): Renamed from CGEN_HW_ATTR, all uses updated. |
(CGEN_OPERAND_ATTR_VALUE): Renamed from CGEN_OPERAND_ATTR, |
all uses updated. |
(CGEN_OPERAND_INDEX): Rewrite to use table entry, not global. |
(enum cgen_opinst_type): Renamed from cgen_operand_instance_type. |
(CGEN_IFLD_ATTR_VALUE): Renamed from CGEN_IFLD_ATTR, all uses updated. |
(CGEN_OPCODE,CGEN_IBASE): New types. |
(CGEN_INSN): Rewrite. |
(CGEN_{ASM,DIS}_HASH*): Delete. |
(init_opcode_table,init_ibld_table): Declare. |
(CGEN_INSN_ATTR): New type. |
Mon Feb 1 21:09:14 1999 Catherine Moore <clm@cygnus.com> |
* i386.h (d_Suf, x_Suf, sld_Suf, sldx_Suf, bwld_Suf): Define. |
(x_FP, d_FP, dls_FP, sldx_FP): Define. |
Change *Suf definitions to include x and d suffixes. |
(movsx): Use w_Suf and b_Suf. |
(movzx): Likewise. |
(movs): Use bwld_Suf. |
(fld): Change ordering. Use sld_FP. |
(fild): Add Intel Syntax equivalent of fildq. |
(fst): Use sld_FP. |
(fist): Use sld_FP. |
(fstp): Use sld_FP. Add x_FP version. |
(fistp): LLongMem version for Intel Syntax. |
(fcom, fcomp): Use sld_FP. |
(fadd, fiadd, fsub): Use sld_FP. |
(fsubr): Use sld_FP. |
(fmul, fimul, fdvi, fidiv, fdivr): Use sld_FP. |
1999-01-27 Doug Evans <devans@casey.cygnus.com> |
* cgen.h (enum cgen_mode): Add CGEN_MODE_TARGET_MAX, CGEN_MODE_INT, |
CGEN_MODE_UINT. |
1999-01-16 Jeffrey A Law (law@cygnus.com) |
* hppa.h (bv): Fix mask. |
1999-01-05 Doug Evans <devans@casey.cygnus.com> |
* cgen.h (CGEN_ATTR_VALUE_TYPE): New typedef. |
(CGEN_ATTR): Use it. |
(CGEN_ATTR_TYPE,CGEN_ATTR_ENTRY): Ditto. |
(CGEN_ATTR_TABLE): New member dfault. |
1998-12-30 Gavin Romig-Koch <gavin@cygnus.com> |
* mips.h (MIPS16_INSN_BRANCH): New. |
Wed Dec 9 10:38:48 1998 David Taylor <taylor@texas.cygnus.com> |
The following is part of a change made by Edith Epstein |
<eepstein@sophia.cygnus.com> as part of a project to merge in |
changes by HP; HP did not create ChangeLog entries. |
* hppa.h (completer_chars): list of chars to not put a space |
after. |
Sun Dec 6 13:21:34 1998 Ian Lance Taylor <ian@cygnus.com> |
* i386.h (i386_optab): Permit w suffix on processor control and |
status word instructions. |
1998-11-30 Doug Evans <devans@casey.cygnus.com> |
* cgen.h (struct cgen_hw_entry): Delete const on attrs member. |
(struct cgen_keyword_entry): Ditto. |
(struct cgen_operand): Ditto. |
(CGEN_IFLD): New typedef, with associated access macros. |
(CGEN_IFMT): New typedef, with associated access macros. |
(CGEN_IFMT): Renamed from CGEN_FORMAT. New member `iflds'. |
(CGEN_IVALUE): New typedef. |
(struct cgen_insn): Delete const on syntax,attrs members. |
`format' now points to format data. Type of `value' is now |
CGEN_IVALUE. |
(struct cgen_opcode_table): New member ifld_table. |
1998-11-18 Doug Evans <devans@casey.cygnus.com> |
* cgen.h (cgen_extract_fn): Update type of `base_insn' arg. |
(CGEN_OPERAND_INSTANCE): New member `attrs'. |
(CGEN_OPERAND_INSTANCE_{ATTRS,ATTR}): New macros. |
(cgen_dis_lookup_insn): Update type of `base_insn' arg. |
(cgen_opcode_table): Update type of dis_hash fn. |
(extract_operand): Update type of `insn_value' arg. |
Thu Oct 29 11:38:36 1998 Doug Evans <devans@canuck.cygnus.com> |
* cgen.h (CGEN_VERSION_{MAJOR,MINOR,FIXLEVEL}): Delete. |
Tue Oct 27 08:57:59 1998 Gavin Romig-Koch <gavin@cygnus.com> |
* mips.h (INSN_MULT): Added. |
Tue Oct 20 11:31:34 1998 Alan Modra <alan@spri.levels.unisa.edu.au> |
* i386.h (MAX_MNEM_SIZE): Rename from MAX_OPCODE_SIZE. |
Mon Oct 19 12:50:00 1998 Doug Evans <devans@seba.cygnus.com> |
* cgen.h (CGEN_INSN_INT): New typedef. |
(CGEN_INT_INSN_P): Renamed from CGEN_INT_INSN. |
(CGEN_INSN_BYTES): Renamed from cgen_insn_t. |
(CGEN_INSN_BYTES_PTR): New typedef. |
(CGEN_EXTRACT_INFO): New typedef. |
(cgen_insert_fn,cgen_extract_fn): Update. |
(cgen_opcode_table): New member `insn_endian'. |
(assemble_insn,lookup_insn,lookup_get_insn_operands): Update. |
(insert_operand,extract_operand): Update. |
(cgen_get_insn_value,cgen_put_insn_value): Add prototypes. |
Fri Oct 9 13:38:13 1998 Doug Evans <devans@seba.cygnus.com> |
* cgen.h (CGEN_ATTR_BOOLS): New macro. |
(struct CGEN_HW_ENTRY): New member `attrs'. |
(CGEN_HW_ATTR): New macro. |
(struct CGEN_OPERAND_INSTANCE): New member `name'. |
(CGEN_INSN_INVALID_P): New macro. |
Mon Oct 5 00:21:07 1998 Jeffrey A Law (law@cygnus.com) |
* hppa.h: Add "fid". |
Sun Oct 4 21:00:00 1998 Alan Modra <alan@spri.levels.unisa.edu.au> |
From Robert Andrew Dale <rob@nb.net> |
* i386.h (i386_optab): Add AMD 3DNow! instructions. |
(AMD_3DNOW_OPCODE): Define. |
Tue Sep 22 17:53:47 1998 Nick Clifton <nickc@cygnus.com> |
* d30v.h (EITHER_BUT_PREFER_MU): Define. |
Mon Aug 10 14:09:38 1998 Doug Evans <devans@canuck.cygnus.com> |
* cgen.h (cgen_insn): #if 0 out element `cdx'. |
Mon Aug 3 12:21:57 1998 Doug Evans <devans@seba.cygnus.com> |
Move all global state data into opcode table struct, and treat |
opcode table as something that is "opened/closed". |
* cgen.h (CGEN_OPCODE_DESC): New type. |
(all fns): New first arg of opcode table descriptor. |
(cgen_set_parse_operand_fn): Add prototype. |
(cgen_current_machine,cgen_current_endian): Delete. |
(CGEN_OPCODE_TABLE): New members mach,endian,operand_table, |
parse_operand_fn,asm_hash_table,asm_hash_table_entries, |
dis_hash_table,dis_hash_table_entries. |
(opcode_open,opcode_close): Add prototypes. |
* cgen.h (cgen_insn): New element `cdx'. |
Thu Jul 30 21:44:25 1998 Frank Ch. Eigler <fche@cygnus.com> |
* d30v.h (FLAG_LKR): New flag for "left-kills-right" instructions. |
Tue Jul 28 10:59:07 1998 Jeffrey A Law (law@cygnus.com) |
* mn10300.h: Add "no_match_operands" field for instructions. |
(MN10300_MAX_OPERANDS): Define. |
Fri Jul 24 11:44:24 1998 Doug Evans <devans@canuck.cygnus.com> |
* cgen.h (cgen_macro_insn_count): Declare. |
Tue Jul 21 13:12:13 1998 Doug Evans <devans@seba.cygnus.com> |
* cgen.h (CGEN_VERSION_{MAJOR,MINOR,FIXLEVEL}): Define. |
(cgen_insert_fn,cgen_extract_fn): New arg `pc'. |
(get_operand,put_operand): Replaced with get_{int,vma}_operand, |
set_{int,vma}_operand. |
Fri Jun 26 11:09:06 1998 Jeffrey A Law (law@cygnus.com) |
* mn10300.h: Add "machine" field for instructions. |
(MN103, AM30): Define machine types. |
Fri Jun 19 16:09:09 1998 Alan Modra <alan@spri.levels.unisa.edu.au> |
* i386.h: Use FP, not sl_Suf, for fxsave and fxrstor. |
1998-06-18 Ulrich Drepper <drepper@cygnus.com> |
* i386.h: Add support for fxsave, fxrstor, sysenter and sysexit. |
Sat Jun 13 11:31:35 1998 Alan Modra <alan@spri.levels.unisa.edu.au> |
* i386.h (i386_optab): Add general form of aad and aam. Add ud2a |
and ud2b. |
(i386_regtab): Allow cr0..7, db0..7, dr0..7, tr0..7, not just |
those that happen to be implemented on pentiums. |
Tue Jun 9 12:16:01 1998 Alan Modra <alan@spri.levels.unisa.edu.au> |
* i386.h: Change occurences of Data16 to Size16, Data32 to Size32, |
IgnoreDataSize to IgnoreSize. Flag address and data size prefixes |
with Size16|IgnoreSize or Size32|IgnoreSize. |
Mon Jun 8 12:15:52 1998 Alan Modra <alan@spri.levels.unisa.edu.au> |
* i386.h (REPNE): Rename to REPNE_PREFIX_OPCODE. |
(REPE): Rename to REPE_PREFIX_OPCODE. |
(i386_regtab_end): Remove. |
(i386_prefixtab, i386_prefixtab_end): Remove. |
(i386_optab): Use NULL as sentinel rather than "" to suit rewrite |
of md_begin. |
(MAX_OPCODE_SIZE): Define. |
(i386_optab_end): Remove. |
(sl_Suf): Define. |
(sl_FP): Use sl_Suf. |
* i386.h (i386_optab): Allow 16 bit displacement for `mov |
mem,acc'. Combine 16 and 32 bit forms of various insns. Allow 16 |
bit form of ljmp. Add IsPrefix modifier to prefixes. Add addr32, |
data32, dword, and adword prefixes. |
(i386_regtab): Add BaseIndex modifier to valid 16 bit base/index |
regs. |
Fri Jun 5 23:42:43 1998 Alan Modra <alan@spri.levels.unisa.edu.au> |
* i386.h (i386_regtab): Remove BaseIndex modifier from esp. |
* i386.h: Allow `l' suffix on fld, fst, fstp, fcom, fcomp with |
register operands, because this is a common idiom. Flag them with |
a warning. Allow illegal faddp, fsubp, fsubrp, fmulp, fdivp, |
fdivrp because gcc erroneously generates them. Also flag with a |
warning. |
* i386.h: Add suffix modifiers to most insns, and tighter operand |
checks in some cases. Fix a number of UnixWare compatibility |
issues with float insns. Merge some floating point opcodes, using |
new FloatMF modifier. |
(WORD_PREFIX_OPCODE): Rename to DATA_PREFIX_OPCODE for |
consistency. |
* i386.h: Change occurence of ShortformW to W|ShortForm. Add |
IgnoreDataSize where appropriate. |
Wed Jun 3 18:28:45 1998 Alan Modra <alan@spri.levels.unisa.edu.au> |
* i386.h: (one_byte_segment_defaults): Remove. |
(two_byte_segment_defaults): Remove. |
(i386_regtab): Add BaseIndex to 32 bit regs reg_type. |
Fri May 15 15:59:04 1998 Doug Evans <devans@seba.cygnus.com> |
* cgen.h (cgen_hw_lookup_by_name): Renamed from cgen_hw_lookup. |
(cgen_hw_lookup_by_num): Declare. |
Thu May 7 09:27:58 1998 Frank Ch. Eigler <fche@cygnus.com> |
* mips.h (OP_{SH,MASK}_CODE2): Added "q" operand format for lower |
ten bits of MIPS ISA1 "break" instruction, and for "sdbbp" |
Thu May 7 02:14:08 1998 Doug Evans <devans@charmed.cygnus.com> |
* cgen.h (cgen_asm_init_parse): Delete. |
(cgen_save_fixups,cgen_restore_fixups,cgen_swap_fixups): Delete. |
(cgen_asm_record_register,cgen_asm_finish_insn): Delete. |
Mon Apr 27 10:13:11 1998 Doug Evans <devans@seba.cygnus.com> |
* cgen.h (CGEN_ATTR_TYPE): Delete `const', moved to uses. |
(cgen_asm_finish_insn): Update prototype. |
(cgen_insn): New members num, data. |
(CGEN_INSN_TABLE): Members asm_hash, asm_hash_table_size, |
dis_hash, dis_hash_table_size moved to ... |
(CGEN_OPCODE_TABLE). Here. Renamed from CGEN_OPCODE_DATA. |
All uses updated. New members asm_hash_p, dis_hash_p. |
(CGEN_MINSN_EXPANSION): New struct. |
(cgen_expand_macro_insn): Declare. |
(cgen_macro_insn_count): Declare. |
(get_insn_operands): Update prototype. |
(lookup_get_insn_operands): Declare. |
Tue Apr 21 17:11:32 1998 Alan Modra <alan@spri.levels.unisa.edu.au> |
* i386.h (i386_optab): Change iclrKludge and imulKludge to |
regKludge. Add operands types for string instructions. |
Mon Apr 20 14:40:29 1998 Tom Tromey <tromey@cygnus.com> |
* i386.h (X): Renamed from `Z_' to preserve formatting of opcode |
table. |
Sun Apr 19 13:54:06 1998 Tom Tromey <tromey@cygnus.com> |
* i386.h (Z_): Renamed from `_' to avoid clash with common alias |
for `gettext'. |
Fri Apr 3 12:04:48 1998 Alan Modra <alan@spri.levels.unisa.edu.au> |
* i386.h: Remove NoModrm flag from all insns: it's never checked. |
Add IsString flag to string instructions. |
(IS_STRING): Don't define. |
(LOCK_PREFIX_OPCODE, CS_PREFIX_OPCODE, DS_PREFIX_OPCODE): Define. |
(ES_PREFIX_OPCODE, FS_PREFIX_OPCODE, GS_PREFIX_OPCODE): Define. |
(SS_PREFIX_OPCODE): Define. |
Mon Mar 30 21:31:56 1998 Ian Lance Taylor <ian@cygnus.com> |
* i386.h: Revert March 24 patch; no more LinearAddress. |
Mon Mar 30 10:25:54 1998 Alan Modra <alan@spri.levels.unisa.edu.au> |
* i386.h (i386_optab): Remove fwait (9b) from all floating point |
instructions, and instead add FWait opcode modifier. Add short |
form of fldenv and fstenv. |
(FWAIT_OPCODE): Define. |
* i386.h (i386_optab): Change second operand constraint of `mov |
sreg,reg|mem' instruction from Reg16|Mem to WordReg|WordMem to |
allow legal instructions such as `movl %gs,%esi' |
Fri Mar 27 18:30:52 1998 Ian Lance Taylor <ian@cygnus.com> |
* h8300.h: Various changes to fully bracket initializers. |
Tue Mar 24 18:32:47 1998 H.J. Lu <hjl@gnu.org> |
* i386.h: Set LinearAddress for lidt and lgdt. |
Mon Mar 2 10:44:07 1998 Doug Evans <devans@seba.cygnus.com> |
* cgen.h (CGEN_BOOL_ATTR): New macro. |
Thu Feb 26 15:54:31 1998 Michael Meissner <meissner@cygnus.com> |
* d30v.h (FLAG_DELAY): New flag for delayed branches/jumps. |
Mon Feb 23 10:38:21 1998 Doug Evans <devans@seba.cygnus.com> |
* cgen.h (CGEN_CAT3): Delete. Use CONCAT3 now. |
(cgen_insn): Record syntax and format entries here, rather than |
separately. |
Tue Feb 17 21:42:56 1998 Nick Clifton <nickc@cygnus.com> |
* cgen.h (CGEN_SYNTAX_MAKE_FIELD): New macro. |
Tue Feb 17 16:00:56 1998 Doug Evans <devans@seba.cygnus.com> |
* cgen.h (cgen_insert_fn): Change type of result to const char *. |
(cgen_parse_{signed,unsigned}_integer): Delete min,max arguments. |
(CGEN_{INSN,KEYWORD,OPERAND}_NBOOL_ATTRS): Renamed from ..._MAX_ATTRS. |
Thu Feb 12 18:30:41 1998 Doug Evans <devans@canuck.cygnus.com> |
* cgen.h (lookup_insn): New argument alias_p. |
Thu Feb 12 03:41:00 1998 J"orn Rennecke <amylaar@cygnus.co.uk> |
Fix rac to accept only a0: |
* d10v.h (OPERAND_ACC): Split into: |
(OPERAND_ACC0, OPERAND_ACC1) . |
(OPERAND_GPR): Define. |
Wed Feb 11 17:31:53 1998 Doug Evans <devans@seba.cygnus.com> |
* cgen.h (CGEN_FIELDS): Define here. |
(CGEN_HW_ENTRY): New member `type'. |
(hw_list): Delete decl. |
(enum cgen_mode): Declare. |
(CGEN_OPERAND): New member `hw'. |
(enum cgen_operand_instance_type): Declare. |
(CGEN_OPERAND_INSTANCE): New type. |
(CGEN_INSN): New member `operands'. |
(CGEN_OPCODE_DATA): Make hw_list const. |
(get_insn_operands,lookup_insn): Add prototypes for. |
Tue Feb 3 17:11:23 1998 Doug Evans <devans@seba.cygnus.com> |
* cgen.h (CGEN_INSN_MAX_ATTRS): Renamed from CGEN_MAX_INSN_ATTRS. |
(CGEN_HW_ENTRY): Move `next' entry to end of struct. |
(CGEN_KEYWORD_MAX_ATTRS): Renamed from CGEN_MAX_KEYWORD_ATTRS. |
(CGEN_OPERAND_MAX_ATTRS): Renamed from CGEN_MAX_OPERAND_ATTRS. |
Mon Feb 2 19:19:15 1998 Ian Lance Taylor <ian@cygnus.com> |
* cgen.h: Correct typo in comment end marker. |
Mon Feb 2 17:10:38 1998 Steve Haworth <steve@pm.cse.rmit.EDU.AU> |
* tic30.h: New file. |
Thu Jan 22 17:54:56 1998 Nick Clifton <nickc@cygnus.com> |
* cgen.h: Add prototypes for cgen_save_fixups(), |
cgen_restore_fixups(), and cgen_swap_fixups(). Change prototype |
of cgen_asm_finish_insn() to return a char *. |
Wed Jan 14 17:21:43 1998 Nick Clifton <nickc@cygnus.com> |
* cgen.h: Formatting changes to improve readability. |
Mon Jan 12 11:37:36 1998 Doug Evans <devans@seba.cygnus.com> |
* cgen.h (*): Clean up pass over `struct foo' usage. |
(CGEN_ATTR): Make unsigned char. |
(CGEN_ATTR_TYPE): Update. |
(CGEN_ATTR_{ENTRY,TABLE}): New types. |
(cgen_base): Move member `attrs' to cgen_insn. |
(CGEN_KEYWORD): New member `null_entry'. |
(CGEN_{SYNTAX,FORMAT}): New types. |
(cgen_insn): Format and syntax separated from each other. |
Tue Dec 16 15:15:52 1997 Michael Meissner <meissner@cygnus.com> |
* d30v.h (d30v_opcode): Reorder flags somewhat, add new flags for |
2 word load/store, ADDppp/SUBppp, 16/32 bit multiply. Make |
flags_{used,set} long. |
(d30v_operand): Make flags field long. |
Mon Dec 1 12:24:44 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> |
* m68k.h: Fix comment describing operand types. |
Sun Nov 23 22:31:27 1997 Michael Meissner <meissner@cygnus.com> |
* d30v.h (SHORT_CMPU): Add case for cmpu instruction, and move |
everything else after down. |
Tue Nov 18 18:45:14 1997 J"orn Rennecke <amylaar@cygnus.co.uk> |
* d10v.h (OPERAND_FLAG): Split into: |
(OPERAND_FFLAG, OPERAND_CFLAG) . |
Thu Nov 13 11:04:24 1997 Gavin Koch <gavin@cygnus.com> |
* mips.h (struct mips_opcode): Changed comments to reflect new |
field usage. |
Fri Oct 24 22:36:20 1997 Ken Raeburn <raeburn@cygnus.com> |
* mips.h: Added to comments a quick-ref list of all assigned |
operand type characters. |
(OP_{MASK,SH}_PERFREG): New macros. |
Wed Oct 22 17:28:33 1997 Richard Henderson <rth@cygnus.com> |
* sparc.h: Add '_' and '/' for v9a asr's. |
Patch from David Miller <davem@vger.rutgers.edu> |
Tue Oct 14 13:22:29 1997 Jeffrey A Law (law@cygnus.com) |
* h8300.h: Bit ops with absolute addresses not in the 8 bit |
area are not available in the base model (H8/300). |
Thu Sep 25 13:03:41 1997 Ian Lance Taylor <ian@cygnus.com> |
* m68k.h: Remove documentation of ` operand specifier. |
Wed Sep 24 19:00:34 1997 Ian Lance Taylor <ian@cygnus.com> |
* m68k.h: Document q and v operand specifiers. |
Mon Sep 15 18:28:37 1997 Nick Clifton <nickc@cygnus.com> |
* v850.h (struct v850_opcode): Add processors field. |
(PROCESSOR_V850, PROCESSOR_ALL): New bit constants. |
(PROCESSOR_V850E, PROCESSOR_NOT_V850): New bit constants. |
(PROCESSOR_V850EA): New bit constants. |
Mon Sep 15 11:29:43 1997 Ken Raeburn <raeburn@cygnus.com> |
Merge changes from Martin Hunt: |
* d30v.h: Allow up to 64 control registers. Add |
SHORT_A5S format. |
* d30v.h (LONG_Db): New form for delayed branches. |
* d30v.h: (LONG_Db): New form for repeati. |
* d30v.h (SHORT_D2B): New form. |
* d30v.h (SHORT_A2): New form. |
* d30v.h (OPERAND_2REG): Add new operand to indicate 2 |
registers are used. Needed for VLIW optimization. |
Mon Sep 8 14:05:45 1997 Doug Evans <dje@canuck.cygnus.com> |
* cgen.h: Move assembler interface section |
up so cgen_parse_operand_result is defined for cgen_parse_address. |
(cgen_parse_address): Update prototype. |
Tue Sep 2 15:32:32 1997 Nick Clifton <nickc@cygnus.com> |
* v850.h (V850_OPREAND_ADJUST_SHORT_MEMORY): Removed. |
Tue Aug 26 12:21:52 1997 Ian Lance Taylor <ian@cygnus.com> |
* i386.h (two_byte_segment_defaults): Correct base register 5 in |
modes 1 and 2 to be ss rather than ds. From Gabriel Paubert |
<paubert@iram.es>. |
* i386.h: Set ud2 to 0x0f0b. From Gabriel Paubert |
<paubert@iram.es>. |
* i386.h: Comment fixes for ficom[p]?{s,l} from Gabriel Paubert |
<paubert@iram.es>. |
* i386.h (JUMP_ON_CX_ZERO): Uncomment (define again). |
(JUMP_ON_ECX_ZERO): Remove commented out macro. |
Fri Aug 22 10:38:29 1997 Nick Clifton <nickc@cygnus.com> |
* v850.h (V850_NOT_R0): New flag. |
Mon Aug 18 11:05:58 1997 Nick Clifton <nickc@cygnus.com> |
* v850.h (struct v850_opcode): Remove flags field. |
Wed Aug 13 18:45:48 1997 Nick Clifton <nickc@cygnus.com> |
* v850.h (struct v850_opcode): Add flags field. |
(struct v850_operand): Extend meaning of 'bits' and 'shift' |
fields. |
(V850E_INSTRUCTION, V850EA_INSTRUCTION): New flags. |
(V850E_PUSH_POP, V850E_IMMEDIATE16, V850E_IMMEDIATE32): New flags. |
Fri Aug 8 16:58:42 1997 Doug Evans <dje@canuck.cygnus.com> |
* arc.h: New file. |
Thu Jul 24 21:16:58 1997 Doug Evans <dje@canuck.cygnus.com> |
* sparc.h (sparc_opcodes): Declare as const. |
Thu Jul 10 12:53:25 1997 Jeffrey A Law (law@cygnus.com) |
* mips.h (FP_S, FP_D): Define. Bitmasks indicating if an insn |
uses single or double precision floating point resources. |
(INSN_NO_ISA, INSN_ISA1): Define. |
(cpu specific INSN macros): Tweak into bitmasks outside the range |
of INSN_ISA field. |
Mon Jun 16 14:10:00 1997 H.J. Lu <hjl@gnu.ai.mit.edu> |
* i386.h: Fix pand opcode. |
Mon Jun 2 11:35:09 1997 Gavin Koch <gavin@cygnus.com> |
* mips.h: Widen INSN_ISA and move it to a more convenient |
bit position. Add INSN_3900. |
Tue May 20 11:25:29 1997 Gavin Koch <gavin@cygnus.com> |
* mips.h (struct mips_opcode): added new field membership. |
Mon May 12 16:26:50 1997 H.J. Lu <hjl@gnu.ai.mit.edu> |
* i386.h (movd): only Reg32 is allowed. |
* i386.h: add fcomp and ud2. From Wayne Scott |
<wscott@ichips.intel.com>. |
Mon May 5 17:16:21 1997 Ian Lance Taylor <ian@cygnus.com> |
* i386.h: Add MMX instructions. |
Mon May 5 12:45:19 1997 H.J. Lu <hjl@gnu.ai.mit.edu> |
* i386.h: Remove W modifier from conditional move instructions. |
Mon Apr 14 14:56:58 1997 Ian Lance Taylor <ian@cygnus.com> |
* i386.h: Change the opcodes for fsubp, fsubrp, fdivp, and fdivrp |
with no arguments to match that generated by the UnixWare |
assembler. |
Thu Apr 10 14:35:00 1997 Doug Evans <dje@canuck.cygnus.com> |
* cgen.h (<cpu>_cgen_assemble_insn): New arg for errmsg. |
(cgen_parse_operand_fn): Declare. |
(cgen_init_parse_operand): Declare. |
(cgen_parse_operand): Renamed from cgen_asm_parse_operand, |
new argument `want'. |
(enum cgen_parse_operand_result): Renamed from cgen_asm_result. |
(enum cgen_parse_operand_type): New enum. |
Sat Apr 5 13:14:05 1997 Ian Lance Taylor <ian@cygnus.com> |
* i386.h: Revert last patch for the NON_BROKEN_OPCODES cases. |
Fri Apr 4 11:46:11 1997 Doug Evans <dje@canuck.cygnus.com> |
* cgen.h: New file. |
Fri Apr 4 14:02:32 1997 Ian Lance Taylor <ian@cygnus.com> |
* i386.h: Correct opcode values for fsubp, fsubrp, fdivp, and |
fdivrp. |
Tue Mar 25 22:57:26 1997 Stu Grossman (grossman@critters.cygnus.com) |
* v850.h (extract): Make unsigned. |
Mon Mar 24 14:38:15 1997 Ian Lance Taylor <ian@cygnus.com> |
* i386.h: Add iclr. |
Thu Mar 20 19:49:10 1997 Ian Lance Taylor <ian@cygnus.com> |
* i386.h: Change DW to W for cmpxchg and xadd, since they don't |
take a direction bit. |
Sat Mar 15 19:03:29 1997 H.J. Lu <hjl@lucon.org> |
* sparc.h (sparc_opcode_lookup_arch): Use full prototype. |
Fri Mar 14 15:22:01 1997 Ian Lance Taylor <ian@cygnus.com> |
* sparc.h: Include <ansidecl.h>. Update function declarations to |
use prototypes, and to use const when appropriate. |
Thu Mar 6 14:18:30 1997 Jeffrey A Law (law@cygnus.com) |
* mn10300.h (MN10300_OPERAND_RELAX): Define. |
Mon Feb 24 15:15:56 1997 Martin M. Hunt <hunt@pizza.cygnus.com> |
* d10v.h: Change pre_defined_registers to |
d10v_predefined_registers and reg_name_cnt to d10v_reg_name_cnt. |
Sat Feb 22 21:25:00 1997 Dawn Perchik <dawn@cygnus.com> |
* mips.h: Add macros for cop0, cop1 cop2 and cop3. |
Change mips_opcodes from const array to a pointer, |
and change bfd_mips_num_opcodes from const int to int, |
so that we can increase the size of the mips opcodes table |
dynamically. |
Fri Feb 21 16:34:18 1997 Martin M. Hunt <hunt@pizza.cygnus.com> |
* d30v.h (FLAG_X): Remove unused flag. |
Tue Feb 18 17:37:20 1997 Martin M. Hunt <hunt@pizza.cygnus.com> |
* d30v.h: New file. |
Fri Feb 14 13:16:15 1997 Fred Fish <fnf@cygnus.com> |
* tic80.h (PDS_NAME): Macro to access name field of predefined symbols. |
(PDS_VALUE): Macro to access value field of predefined symbols. |
(tic80_next_predefined_symbol): Add prototype. |
Mon Feb 10 10:32:17 1997 Fred Fish <fnf@cygnus.com> |
* tic80.h (tic80_symbol_to_value): Change prototype to match |
change in function, added class parameter. |
Thu Feb 6 17:30:15 1997 Fred Fish <fnf@cygnus.com> |
* tic80.h (TIC80_OPERAND_ENDMASK): Add for flagging TIc80 |
endmask fields, which are somewhat weird in that 0 and 32 are |
treated exactly the same. |
Thu Jan 30 13:46:18 1997 Fred Fish <fnf@cygnus.com> |
* tic80.h: Change all the OPERAND defines to use the form (1 << X) |
rather than a constant that is 2**X. Reorder them to put bits for |
operands that have symbolic names in the upper bits, so they can |
be packed into an int where the lower bits contain the value that |
corresponds to that symbolic name. |
(predefined_symbo): Add struct. |
(tic80_predefined_symbols): Declare array of translations. |
(tic80_num_predefined_symbols): Declare size of that array. |
(tic80_value_to_symbol): Declare function. |
(tic80_symbol_to_value): Declare function. |
Wed Jan 29 09:37:25 1997 Jeffrey A Law (law@cygnus.com) |
* mn10200.h (MN10200_OPERAND_RELAX): Define. |
Sat Jan 18 15:18:59 1997 Fred Fish <fnf@cygnus.com> |
* tic80.h (TIC80_NO_R0_DEST): Add for opcodes where r0 cannot |
be the destination register. |
Thu Jan 16 20:48:55 1997 Fred Fish <fnf@cygnus.com> |
* tic80.h (struct tic80_opcode): Change "format" field to "flags". |
(FMT_UNUSED, FMT_SI, FMT_LI, FMT_REG): Delete. |
(TIC80_VECTOR): Define a flag bit for the flags. This one means |
that the opcode can have two vector instructions in a single |
32 bit word and we have to encode/decode both. |
Tue Jan 14 19:37:09 1997 Fred Fish <fnf@cygnus.com> |
* tic80.h (TIC80_OPERAND_PCREL): Renamed from |
TIC80_OPERAND_RELATIVE for PC relative. |
(TIC80_OPERAND_BASEREL): New flag bit for register |
base relative. |
Mon Jan 13 15:56:38 1997 Fred Fish <fnf@cygnus.com> |
* tic80.h (TIC80_OPERAND_FLOAT): Add for floating point operands. |
Mon Jan 6 10:51:15 1997 Fred Fish <fnf@cygnus.com> |
* tic80.h (TIC80_OPERAND_SCALED): Operand may have optional |
":s" modifier for scaling. |
Sun Jan 5 12:12:19 1997 Fred Fish <fnf@cygnus.com> |
* tic80.h (TIC80_OPERAND_M_SI): Add operand modifier for ":m". |
(TIC80_OPERAND_M_LI): Ditto |
Sat Jan 4 19:02:44 1997 Fred Fish <fnf@cygnus.com> |
* tic80.h (TIC80_OPERAND_BITNUM): Renamed from TIC80_OPERAND_CC_SZ. |
(TIC80_OPERAND_CC): New define for condition code operand. |
(TIC80_OPERAND_CR): New define for control register operand. |
Fri Jan 3 16:22:23 1997 Fred Fish <fnf@cygnus.com> |
* tic80.h (struct tic80_opcode): Name changed. |
(struct tic80_opcode): Remove format field. |
(struct tic80_operand): Add insertion and extraction functions. |
(TIC80_OPERAND_*): Remove old bogus values, start adding new |
correct ones. |
(FMT_*): Ditto. |
Tue Dec 31 15:05:41 1996 Michael Meissner <meissner@tiktok.cygnus.com> |
* v850.h (V850_OPERAND_ADJUST_SHORT_MEMORY): New flag to adjust |
type IV instruction offsets. |
Fri Dec 27 22:23:10 1996 Fred Fish <fnf@cygnus.com> |
* tic80.h: New file. |
Wed Dec 18 10:06:31 1996 Jeffrey A Law (law@cygnus.com) |
* mn10200.h (MN10200_OPERAND_NOCHECK): Define. |
Sat Dec 14 10:48:31 1996 Fred Fish <fnf@ninemoons.com> |
* mn10200.h: Fix comment, mn10200_operand not powerpc_operand. |
* mn10300.h: Fix comment, mn10300_operand not powerpc_operand. |
* v850.h: Fix comment, v850_operand not powerpc_operand. |
Mon Dec 9 16:45:39 1996 Jeffrey A Law (law@cygnus.com) |
* mn10200.h: Flesh out structures and definitions needed by |
the mn10200 assembler & disassembler. |
Tue Nov 26 10:46:56 1996 Ian Lance Taylor <ian@cygnus.com> |
* mips.h: Add mips16 definitions. |
Mon Nov 25 17:56:54 1996 J.T. Conklin <jtc@cygnus.com> |
* m68k.h: Document new <, >, m, n, o and p operand specifiers. |
Wed Nov 20 10:59:41 1996 Jeffrey A Law (law@cygnus.com) |
* mn10300.h (MN10300_OPERAND_PCREL): Define. |
(MN10300_OPERAND_MEMADDR): Define. |
Tue Nov 19 13:30:40 1996 Jeffrey A Law (law@cygnus.com) |
* mn10300.h (MN10300_OPERAND_REG_LIST): Define. |
Wed Nov 6 13:41:08 1996 Jeffrey A Law (law@cygnus.com) |
* mn10300.h (MN10300_OPERAND_SPLIT): Define. |
Tue Nov 5 13:26:12 1996 Jeffrey A Law (law@cygnus.com) |
* mn10300.h (MN10300_OPERAND_EXTENDED): Define. |
Mon Nov 4 12:52:48 1996 Jeffrey A Law (law@cygnus.com) |
* mn10300.h (MN10300_OPERAND_REPEATED): Define. |
Fri Nov 1 10:31:02 1996 Richard Henderson <rth@tamu.edu> |
* alpha.h: Don't include "bfd.h"; private relocation types are now |
negative to minimize problems with shared libraries. Organize |
instruction subsets by AMASK extensions and PALcode |
implementation. |
(struct alpha_operand): Move flags slot for better packing. |
Tue Oct 29 12:19:10 1996 Jeffrey A Law (law@cygnus.com) |
* v850.h (V850_OPERAND_RELAX): New operand flag. |
Thu Oct 10 14:29:11 1996 Jeffrey A Law (law@cygnus.com) |
* mn10300.h (FMT_*): Move operand format definitions |
here. |
Tue Oct 8 14:48:07 1996 Jeffrey A Law (law@cygnus.com) |
* mn10300.h (MN10300_OPERAND_PAREN): Define. |
Mon Oct 7 16:52:11 1996 Jeffrey A Law (law@cygnus.com) |
* mn10300.h (mn10300_opcode): Add "format" field. |
(MN10300_OPERAND_*): Define. |
Thu Oct 3 10:33:46 1996 Jeffrey A Law (law@cygnus.com) |
* mn10x00.h: Delete. |
* mn10200.h, mn10300.h: New files. |
Wed Oct 2 21:31:26 1996 Jeffrey A Law (law@cygnus.com) |
* mn10x00.h: New file. |
Fri Sep 27 18:26:46 1996 Stu Grossman (grossman@critters.cygnus.com) |
* v850.h: Add new flag to indicate this instruction uses a PC |
displacement. |
Fri Sep 13 14:58:13 1996 Jeffrey A Law (law@cygnus.com) |
* h8300.h (stmac): Add missing instruction. |
Sat Aug 31 16:02:03 1996 Jeffrey A Law (law@cygnus.com) |
* v850.h (v850_opcode): Remove "size" field. Add "memop" |
field. |
Fri Aug 23 10:39:08 1996 Jeffrey A Law (law@cygnus.com) |
* v850.h (V850_OPERAND_EP): Define. |
* v850.h (v850_opcode): Add size field. |
Thu Aug 22 16:51:25 1996 J.T. Conklin <jtc@rtl.cygnus.com> |
* v850.h (v850_operands): Add insert and extract fields, pointers |
to functions used to handle unusual operand encoding. |
(V850_OPERAND_REG, V850_OPERAND_SRG, V850_OPERAND_CC, |
V850_OPERAND_SIGNED): Defined. |
Wed Aug 21 17:45:10 1996 J.T. Conklin <jtc@rtl.cygnus.com> |
* v850.h (v850_operands): Add flags field. |
(OPERAND_REG, OPERAND_NUM): Defined. |
Tue Aug 20 14:52:02 1996 J.T. Conklin <jtc@rtl.cygnus.com> |
* v850.h: New file. |
Fri Aug 16 14:44:15 1996 James G. Smith <jsmith@cygnus.co.uk> |
* mips.h (OP_SH_LOCC, OP_SH_HICC, OP_MASK_CC, OP_SH_COP1NORM, |
OP_MASK_COP1NORM, OP_SH_COP1SPEC, OP_MASK_COP1SPEC, |
OP_MASK_COP1SCLR, OP_MASK_COP1CMP, OP_SH_COP1CMP, OP_SH_FORMAT, |
OP_MASK_FORMAT, OP_SH_TRUE, OP_MASK_TRUE, OP_SH_GE, OP_MASK_GE, |
OP_SH_UNSIGNED, OP_MASK_UNSIGNED, OP_SH_HINT, OP_MASK_HINT): |
Defined. |
Fri Aug 16 00:15:15 1996 Jeffrey A Law (law@cygnus.com) |
* hppa.h (pitlb, pitlbe, iitlba, iitlbp, fic, fice): Accept |
a 3 bit space id instead of a 2 bit space id. |
Thu Aug 15 13:11:46 1996 Martin M. Hunt <hunt@pizza.cygnus.com> |
* d10v.h: Add some additional defines to support the |
assembler in determining which operations can be done in parallel. |
Tue Aug 6 11:13:22 1996 Jeffrey A Law (law@cygnus.com) |
* h8300.h (SN): Define. |
(eepmov.b): Renamed from "eepmov" |
(nop, bpt, rte, rts, sleep, clrmac): These have no size associated |
with them. |
Fri Jul 26 11:47:10 1996 Martin M. Hunt <hunt@pizza.cygnus.com> |
* d10v.h (OPERAND_SHIFT): New operand flag. |
Thu Jul 25 12:06:22 1996 Martin M. Hunt <hunt@pizza.cygnus.com> |
* d10v.h: Changes for divs, parallel-only instructions, and |
signed numbers. |
Mon Jul 22 11:21:15 1996 Martin M. Hunt <hunt@pizza.cygnus.com> |
* d10v.h (pd_reg): Define. Putting the definition here allows |
the assembler and disassembler to share the same struct. |
Mon Jul 22 12:15:25 1996 Ian Lance Taylor <ian@cygnus.com> |
* i960.h (i960_opcodes): "halt" takes an argument. From Stephen |
Williams <steve@icarus.com>. |
Wed Jul 17 14:46:38 1996 Martin M. Hunt <hunt@pizza.cygnus.com> |
* d10v.h: New file. |
Thu Jul 11 12:09:15 1996 Jeffrey A Law (law@cygnus.com) |
* h8300.h (band, bclr): Force high bit of immediate nibble to zero. |
Wed Jul 3 14:30:12 1996 J.T. Conklin <jtc@rtl.cygnus.com> |
* m68k.h (mcf5200): New macro. |
Document names of coldfire control registers. |
Tue Jul 2 23:05:45 1996 Jeffrey A Law (law@cygnus.com) |
* h8300.h (SRC_IN_DST): Define. |
* h8300.h (UNOP3): Mark the register operand in this insn |
as a source operand, not a destination operand. |
(SHIFT_2, SHIFT_IMM): Remove. Eliminate all references. |
(UNOP3): Change SHIFT_IMM to IMM for H8/S bitops. Mark |
register operand with SRC_IN_DST. |
Fri Jun 21 13:52:17 1996 Richard Henderson <rth@tamu.edu> |
* alpha.h: New file. |
Thu Jun 20 15:02:57 1996 Ian Lance Taylor <ian@cygnus.com> |
* rs6k.h: Remove obsolete file. |
Wed Jun 19 15:29:38 1996 Ian Lance Taylor <ian@cygnus.com> |
* i386.h: Correct opcode values for faddp, fsubp, fsubrp, fmulp, |
fdivp, and fdivrp. Add ffreep. |
Tue Jun 18 16:06:00 1996 Jeffrey A. Law <law@rtl.cygnus.com> |
* h8300.h: Reorder various #defines for readability. |
(ABS32SRC, ABS32DST, DSP32LIST, ABS32LIST, A32LIST): Define. |
(BITOP): Accept additional (unused) argument. All callers changed. |
(EBITOP): Likewise. |
(O_LAST): Bump. |
(ldc, stc, movb, movw, movl): Use 32bit offsets and absolutes. |
* h8300.h (EXR, SHIFT_2, MACREG, SHIFT_IMM, RDINC): Define. |
(O_TAS, O_CLRMAC, O_LDMAC, O_MAC, O_LDM, O_STM): Define. |
(BITOP, EBITOP): Handle new H8/S addressing modes for |
bit insns. |
(UNOP3): Handle new shift/rotate insns on the H8/S. |
(insns using exr): New instructions. |
(tas, mac, ldmac, clrmac, ldm, stm): New instructions. |
Thu May 23 16:56:48 1996 Jeffrey A Law (law@cygnus.com) |
* h8300.h (add.l): Undo Apr 5th change. The manual I had |
was incorrect. |
Mon May 6 23:38:22 1996 Jeffrey A Law (law@cygnus.com) |
* h8300.h (START): Remove. |
(MEMRELAX): Define. Mark absolute memory operands in mov.b, mov.w |
and mov.l insns that can be relaxed. |
Tue Apr 30 18:30:58 1996 Ian Lance Taylor <ian@cygnus.com> |
* i386.h: Remove Abs32 from lcall. |
Mon Apr 22 17:09:23 1996 Doug Evans <dje@blues.cygnus.com> |
* sparc.h (SPARC_OPCODE_ARCH_V9_P): New macro. |
(SLCPOP): New macro. |
Mark X,Y opcode letters as in use. |
Thu Apr 11 17:28:18 1996 Ian Lance Taylor <ian@cygnus.com> |
* sparc.h (F_FLOAT, F_FBR): Define. |
Fri Apr 5 16:55:34 1996 Jeffrey A Law (law@cygnus.com) |
* h8300.h (ABS8MEM): Renamed from ABSMOV. Remove ABSMOV |
from all insns. |
(ABS8SRC,ABS8DST): Add ABS8MEM. |
(add.l): Fix reg+reg variant. |
(eepmov.w): Renamed from eepmovw. |
(ldc,stc): Fix many cases. |
Sun Mar 31 13:30:03 1996 Doug Evans <dje@canuck.cygnus.com> |
* sparc.h (SPARC_OPCODE_ARCH_MASK): New macro. |
Thu Mar 7 15:08:23 1996 Doug Evans <dje@charmed.cygnus.com> |
* sparc.h (O): Mark operand letter as in use. |
Tue Feb 20 20:46:21 1996 Doug Evans <dje@charmed.cygnus.com> |
* sparc.h (sparc_{encode,decode}_sparclet_cpreg): Declare. |
Mark operand letters uU as in use. |
Mon Feb 19 01:59:08 1996 Doug Evans <dje@charmed.cygnus.com> |
* sparc.h (sparc_opcode_arch_val): Add SPARC_OPCODE_ARCH_SPARCLET. |
(sparc_opcode_arch): Delete member `conflicts'. Add `supported'. |
(SPARC_OPCODE_SUPPORTED): New macro. |
(SPARC_OPCODE_CONFLICT_P): Rewrite. |
(F_NOTV9): Delete. |
Fri Feb 16 12:23:34 1996 Jeffrey A Law (law@cygnus.com) |
* sparc.h (sparc_opcode_lookup_arch) Make return type in |
declaration consistent with return type in definition. |
Wed Feb 14 18:14:11 1996 Alan Modra <alan@spri.levels.unisa.edu.au> |
* i386.h (i386_optab): Remove Data32 from pushf and popf. |
Thu Feb 8 14:27:21 1996 James Carlson <carlson@xylogics.com> |
* i386.h (i386_regtab): Add 80486 test registers. |
Mon Feb 5 18:35:46 1996 Ian Lance Taylor <ian@cygnus.com> |
* i960.h (I_HX): Define. |
(i960_opcodes): Add HX instruction. |
Mon Jan 29 12:43:39 1996 Ken Raeburn <raeburn@cygnus.com> |
* i386.h: Fix waiting forms of finit, fstenv, fsave, fstsw, fstcw, |
and fclex. |
Wed Jan 24 22:36:59 1996 Doug Evans <dje@charmed.cygnus.com> |
* sparc.h (enum sparc_opcode_arch_val): Replaces sparc_architecture. |
(SPARC_OPCODE_CONFLICT_P): Renamed from ARCHITECTURES_CONFLICT_P. |
(bfd_* defines): Delete. |
(sparc_opcode_archs): Replaces architecture_pname. |
(sparc_opcode_lookup_arch): Declare. |
(NUMOPCODES): Delete. |
Mon Jan 22 08:24:32 1996 Doug Evans <dje@charmed.cygnus.com> |
* sparc.h (enum sparc_architecture): Add v9a. |
(ARCHITECTURES_CONFLICT_P): Update. |
Thu Dec 28 13:27:53 1995 John Hassey <hassey@rtp.dg.com> |
* i386.h: Added Pentium Pro instructions. |
Thu Nov 2 22:59:22 1995 Ian Lance Taylor <ian@cygnus.com> |
* m68k.h: Document new 'W' operand place. |
Tue Oct 24 10:49:10 1995 Jeffrey A Law (law@cygnus.com) |
* hppa.h: Add lci and syncdma instructions. |
Mon Oct 23 11:09:16 1995 James G. Smith <jsmith@pasanda.cygnus.co.uk> |
* mips.h: Added INSN_4100 flag to mark NEC VR4100 specific |
instructions. |
Mon Oct 16 10:28:15 1995 Michael Meissner <meissner@tiktok.cygnus.com> |
* ppc.h (PPC_OPCODE_{COMMON,ANY}): New opcode flags for |
assembler's -mcom and -many switches. |
Wed Oct 11 16:56:33 1995 Ken Raeburn <raeburn@cygnus.com> |
* i386.h: Fix cmpxchg8b extension opcode description. |
Thu Oct 5 18:03:36 1995 Ken Raeburn <raeburn@cygnus.com> |
* i386.h: Add Pentium instructions wrmsr, rdtsc, rdmsr, cmpxchg8b, |
and register cr4. |
Tue Sep 19 15:26:43 1995 Ian Lance Taylor <ian@cygnus.com> |
* m68k.h: Change comment: split type P into types 0, 1 and 2. |
Wed Aug 30 13:50:55 1995 Doug Evans <dje@canuck.cygnus.com> |
* sparc.h (sparc_{encode,decode}_prefetch): Declare. |
Tue Aug 29 15:34:58 1995 Doug Evans <dje@canuck.cygnus.com> |
* sparc.h (sparc_{encode,decode}_{asi,membar}): Declare. |
Wed Aug 2 18:32:19 1995 Ian Lance Taylor <ian@cygnus.com> |
* m68kmri.h: Remove. |
* m68k.h: Move tables into opcodes/m68k-opc.c, leaving just the |
declarations. Remove F_ALIAS and flag field of struct |
m68k_opcode. Change arch field of struct m68k_opcode to unsigned |
int. Make name and args fields of struct m68k_opcode const. |
Wed Aug 2 08:16:46 1995 Doug Evans <dje@canuck.cygnus.com> |
* sparc.h (F_NOTV9): Define. |
Tue Jul 11 14:20:42 1995 Jeff Spiegel <jeffs@lsil.com> |
* mips.h (INSN_4010): Define. |
Wed Jun 21 18:49:51 1995 Ken Raeburn <raeburn@cujo.cygnus.com> |
* m68k.h (TBL1): Reverse sense of "round" argument in result. |
Changes from Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>: |
* m68k.h: Fix argument descriptions of coprocessor |
instructions to allow only alterable operands where appropriate. |
[!NO_DEFAULT_SIZES]: An omitted size defaults to `w'. |
(m68k_opcode_aliases): Add more aliases. |
Fri Apr 14 22:15:34 1995 Ken Raeburn <raeburn@cujo.cygnus.com> |
* m68k.h: Added explcitly short-sized conditional branches, and a |
bunch of aliases (fmov*, ftest*, tdivul) to support gcc's |
svr4-based configurations. |
Mon Mar 13 21:30:01 1995 Ken Raeburn <raeburn@cujo.cygnus.com> |
Mon Feb 27 08:36:39 1995 Bryan Ford <baford@cs.utah.edu> |
* i386.h: added missing Data16/Data32 flags to a few instructions. |
Wed Mar 8 15:19:53 1995 Ian Lance Taylor <ian@cygnus.com> |
* mips.h (OP_MASK_FR, OP_SH_FR): Define. |
(OP_MASK_BCC, OP_SH_BCC): Define. |
(OP_MASK_PREFX, OP_SH_PREFX): Define. |
(OP_MASK_CCC, OP_SH_CCC): Define. |
(INSN_READ_FPR_R): Define. |
(INSN_RFE): Delete. |
Wed Mar 8 03:13:23 1995 Ken Raeburn <raeburn@cujo.cygnus.com> |
* m68k.h (enum m68k_architecture): Deleted. |
(struct m68k_opcode_alias): New type. |
(m68k_opcodes): Now const. Deleted opcode aliases with exactly |
matching constraints, values and flags. As a side effect of this, |
the MOTOROLA_SYNTAX_ONLY and MIT_SYNTAX_ONLY macros, which so far |
as I know were never used, now may need re-examining. |
(numopcodes): Now const. |
(m68k_opcode_aliases, numaliases): New variables. |
(endop): Deleted. |
[DONT_DEFINE_TABLE]: Declare numopcodes, numaliases, and |
m68k_opcode_aliases; update declaration of m68k_opcodes. |
Mon Mar 6 10:02:00 1995 Jeff Law (law@snake.cs.utah.edu) |
* hppa.h (delay_type): Delete unused enumeration. |
(pa_opcode): Replace unused delayed field with an architecture |
field. |
(pa_opcodes): Mark each instruction as either PA1.0 or PA1.1. |
Fri Mar 3 16:10:24 1995 Ian Lance Taylor <ian@cygnus.com> |
* mips.h (INSN_ISA4): Define. |
Fri Feb 24 19:13:37 1995 Ian Lance Taylor <ian@cygnus.com> |
* mips.h (M_DLA_AB, M_DLI): Define. |
Thu Feb 23 17:33:09 1995 Jeff Law (law@snake.cs.utah.edu) |
* hppa.h (fstwx): Fix single-bit error. |
Wed Feb 15 12:19:52 1995 Ian Lance Taylor <ian@cygnus.com> |
* mips.h (M_ULD, M_ULD_A, M_USD, M_USD_A): Define. |
Mon Feb 6 10:35:23 1995 J.T. Conklin <jtc@rtl.cygnus.com> |
* i386.h: added cpuid instruction , and dr[0-7] aliases for the |
debug registers. From Charles Hannum (mycroft@netbsd.org). |
Mon Feb 6 03:31:54 1995 Ken Raeburn <raeburn@cujo.cygnus.com> |
Changes from Bryan Ford <baford@schirf.cs.utah.edu> for 16-bit |
i386 support: |
* i386.h (MOV_AX_DISP32): New macro. |
(i386_optab): Added Data16 and Data32 as needed. Added "w" forms |
of several call/return instructions. |
(ADDR_PREFIX_OPCODE): New macro. |
Mon Jan 23 16:45:43 1995 Ken Raeburn <raeburn@cujo.cygnus.com> |
Sat Jan 21 17:50:38 1995 Pat Rankin (rankin@eql.caltech.edu) |
* vax.h (struct vot_wot, field `args'): Make it pointer to const |
char. |
(struct vot, field `name'): ditto. |
Thu Jan 19 14:47:53 1995 Ken Raeburn <raeburn@cujo.cygnus.com> |
* vax.h: Supply and properly group all values in end sentinel. |
Tue Jan 17 10:55:30 1995 Ian Lance Taylor <ian@sanguine.cygnus.com> |
* mips.h (INSN_ISA, INSN_4650): Define. |
Wed Oct 19 13:34:17 1994 Ian Lance Taylor <ian@sanguine.cygnus.com> |
* a29k.h: Add operand type 'I' for `inv' and `iretinv'. On |
systems with a separate instruction and data cache, such as the |
29040, these instructions take an optional argument. |
Wed Sep 14 17:44:20 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) |
* mips.h (INSN_STORE_MEMORY): Correct value to not conflict with |
INSN_TRAP. |
Tue Sep 6 11:39:08 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) |
* mips.h (INSN_STORE_MEMORY): Define. |
Thu Jul 28 19:28:07 1994 Ken Raeburn (raeburn@cujo.cygnus.com) |
* sparc.h: Document new operand type 'x'. |
Tue Jul 26 17:48:05 1994 Ken Raeburn (raeburn@cujo.cygnus.com) |
* i960.h (I_CX2): New instruction category. It includes |
instructions available on Cx and Jx processors. |
(I_JX): New instruction category, for JX-only instructions. |
(i960_opcodes): Put eshro and sysctl in I_CX2 category. Added |
Jx-only instructions, in I_JX category. |
Wed Jul 13 18:43:47 1994 Ken Raeburn (raeburn@cujo.cygnus.com) |
* ns32k.h (endop): Made pointer const too. |
Sun Jul 10 11:01:09 1994 Ian Dall (dall@hfrd.dsto.gov.au) |
* ns32k.h: Drop Q operand type as there is no correct use |
for it. Add I and Z operand types which allow better checking. |
Thu Jul 7 12:34:48 1994 Steve Chamberlain (sac@jonny.cygnus.com) |
* h8300.h (xor.l) :fix bit pattern. |
(L_2): New size of operand. |
(trapa): Use it. |
Fri Jun 10 16:38:11 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* m68k.h: Move "trap" before "tpcc" to change disassembly. |
Fri Jun 3 15:57:36 1994 Ken Raeburn (raeburn@cujo.cygnus.com) |
* sparc.h: Include v9 definitions. |
Thu Jun 2 12:23:17 1994 Ken Raeburn (raeburn@cujo.cygnus.com) |
* m68k.h (m68060): Defined. |
(m68040up, mfloat, mmmu): Include it. |
(struct m68k_opcode): Widen `arch' field. |
(m68k_opcodes): Updated for M68060. Removed comments that were |
instructions commented out by "JF" years ago. |
Thu Apr 28 18:31:14 1994 Ken Raeburn (raeburn@cujo.cygnus.com) |
* m68k.h (struct m68k_opcode): Shorten `arch' field to 8 bits, and |
add a one-bit `flags' field. |
(F_ALIAS): New macro. |
Wed Apr 27 11:29:52 1994 Steve Chamberlain (sac@cygnus.com) |
* h8300.h (dec, inc): Get encoding right. |
Mon Apr 4 13:12:43 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* ppc.h (struct powerpc_operand): Removed signedp field; just use |
a flag instead. |
(PPC_OPERAND_SIGNED): Define. |
(PPC_OPERAND_SIGNOPT): Define. |
Thu Mar 31 19:34:08 1994 Ken Raeburn (raeburn@cujo.cygnus.com) |
* i386.h (IS_JUMP_ON_ECX_ZERO, "jcxz" pattern): Operand size |
prefix is 0x66, not 0x67. Patch from H.J. Lu (hlu@nynexst.com). |
Thu Mar 3 15:51:05 1994 Ken Raeburn (raeburn@cujo.cygnus.com) |
* i386.h: Reverse last change. It'll be handled in gas instead. |
Thu Feb 24 15:29:05 1994 Ken Raeburn (raeburn@cujo.cygnus.com) |
* i386.h (sar): Disabled the two-operand Imm1 form, since it was |
slower on the 486 and used the implicit shift count despite the |
explicit operand. The one-operand form is still available to get |
the shorter form with the implicit shift count. |
Thu Feb 17 12:27:52 1994 Torbjorn Granlund (tege@mexican.cygnus.com) |
* hppa.h: Fix typo in fstws arg string. |
Wed Feb 9 21:23:52 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* ppc.h (struct powerpc_opcode): Make operands field unsigned. |
Mon Feb 7 19:14:58 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* ppc.h (PPC_OPCODE_601): Define. |
Fri Feb 4 23:43:50 1994 Jeffrey A. Law (law@snake.cs.utah.edu) |
* hppa.h (addb): Use '@' for addb and addib pseudo ops. |
(so we can determine valid completers for both addb and addb[tf].) |
* hppa.h (xmpyu): No floating point format specifier for the |
xmpyu instruction. |
Fri Feb 4 23:36:52 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* ppc.h (PPC_OPERAND_NEXT): Define. |
(PPC_OPERAND_NEGATIVE): Change value to make room for above. |
(struct powerpc_macro): Define. |
(powerpc_macros, powerpc_num_macros): Declare. |
Fri Jan 21 19:13:50 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* ppc.h: New file. Header file for PowerPC opcode table. |
Mon Jan 17 00:14:23 1994 Jeffrey A. Law (law@snake.cs.utah.edu) |
* hppa.h: More minor template fixes for sfu and copr (to allow |
for easier disassembly). |
* hppa.h: Fix templates for all the sfu and copr instructions. |
Wed Dec 15 15:12:42 1993 Ken Raeburn (raeburn@cujo.cygnus.com) |
* i386.h (push): Permit Imm16 operand too. |
Sat Dec 11 16:14:06 1993 Steve Chamberlain (sac@thepub.cygnus.com) |
* h8300.h (andc): Exists in base arch. |
Wed Dec 1 12:15:32 1993 Jeffrey A. Law (law@snake.cs.utah.edu) |
* From Hisashi MINAMINO <minamino@sramhc.sra.co.jp> |
* hppa.h: #undef NONE to avoid conflict with hiux include files. |
Sun Nov 21 22:06:57 1993 Jeffrey A. Law (law@snake.cs.utah.edu) |
* hppa.h: Add FP quadword store instructions. |
Wed Nov 17 17:13:16 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* mips.h: (M_J_A): Added. |
(M_LA): Removed. |
Mon Nov 8 12:12:47 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* mips.h (OP_MASK_CACHE, OP_SH_CACHE): Define. From Ted Lemon |
<mellon@pepper.ncd.com>. |
Sun Nov 7 00:30:11 1993 Jeffrey A. Law (law@snake.cs.utah.edu) |
* hppa.h: Immediate field in probei instructions is unsigned, |
not low-sign extended. |
Wed Nov 3 10:30:00 1993 Jim Kingdon (kingdon@lioth.cygnus.com) |
* m88k.h (RRI10MASK): Change from 0xfc00ffe0 to 0xfc00fc00. |
Tue Nov 2 12:41:30 1993 Ken Raeburn (raeburn@rover.cygnus.com) |
* i386.h: Add "fxch" without operand. |
Mon Nov 1 18:13:03 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* mips.h (M_JAL_1, M_JAL_2, M_JAL_A): Added. |
Sat Oct 2 22:26:11 1993 Jeffrey A Law (law@snake.cs.utah.edu) |
* hppa.h: Add gfw and gfr to the opcode table. |
Wed Sep 29 16:23:00 1993 K. Richard Pixley (rich@sendai.cygnus.com) |
* m88k.h: extended to handle m88110. |
Tue Sep 28 19:19:08 1993 Jeffrey A Law (law@snake.cs.utah.edu) |
* hppa.h (be, ble): Use operand type 'z' to denote absolute branch |
addresses. |
Tue Sep 14 14:04:35 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* i960.h (i960_opcodes): Properly bracket initializers. |
Mon Sep 13 12:50:52 1993 K. Richard Pixley (rich@sendai.cygnus.com) |
* m88k.h (BOFLAG): rewrite to avoid nested comment. |
Mon Sep 13 15:46:06 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* m68k.h (two): Protect second argument with parentheses. |
Fri Sep 10 16:29:47 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) |
* i386.h (i386_optab): Added new instruction "rsm" (for i386sl). |
Deleted old in/out instructions in "#if 0" section. |
Thu Sep 9 17:42:19 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* i386.h (i386_optab): Properly bracket initializers. |
Wed Aug 25 13:50:56 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) |
* hppa.h (pa_opcode): Use '|' for movb and movib insns. (From |
Jeff Law, law@cs.utah.edu). |
Mon Aug 23 16:55:03 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) |
* i386.h (lcall): Accept Imm32 operand also. |
Mon Aug 23 12:43:11 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* mips.h (M_ABSU): Removed (absolute value of unsigned number??). |
(M_DABS): Added. |
Thu Aug 19 15:08:37 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* mips.h (INSN_*): Changed values. Removed unused definitions. |
Added INSN_COND_BRANCH_LIKELY, INSN_ISA2 and INSN_ISA3. Split |
INSN_LOAD_DELAY into INSN_LOAD_MEMORY_DELAY and |
INSN_LOAD_COPROC_DELAY. Split INSN_COPROC_DELAY into |
INSN_COPROC_MOVE_DELAY and INSN_COPROC_MEMORY_DELAY. |
(M_*): Added new values for r6000 and r4000 macros. |
(ANY_DELAY): Removed. |
Wed Aug 18 15:37:48 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* mips.h: Added M_LI_S and M_LI_SS. |
Tue Aug 17 07:08:08 1993 Steve Chamberlain (sac@phydeaux.cygnus.com) |
* h8300.h: Get some rare mov.bs correct. |
Thu Aug 5 09:15:17 1993 Jim Kingdon (kingdon@lioth.cygnus.com) |
* sparc.h: Don't define const ourself; rely on ansidecl.h having |
been included. |
Fri Jul 30 18:41:11 1993 John Gilmore (gnu@cygnus.com) |
* sparc.h (F_JSR, F_UNBR, F_CONDBR): Add new flags to mark |
jump instructions, for use in disassemblers. |
Thu Jul 22 07:25:27 1993 Ian Lance Taylor (ian@cygnus.com) |
* m88k.h: Make bitfields just unsigned, not unsigned long or |
unsigned short. |
Wed Jul 21 11:55:31 1993 Jim Kingdon (kingdon@deneb.cygnus.com) |
* hppa.h: New argument type 'y'. Use in various float instructions. |
Mon Jul 19 17:17:03 1993 Jim Kingdon (kingdon@deneb.cygnus.com) |
* hppa.h (break): First immediate field is unsigned. |
* hppa.h: Add rfir instruction. |
Sun Jul 18 16:28:08 1993 Jim Kingdon (kingdon@rtl.cygnus.com) |
* mips.h: Split the actual table out into ../../opcodes/mips-opc.c. |
Fri Jul 16 09:59:29 1993 Ian Lance Taylor (ian@cygnus.com) |
* mips.h: Reworked the hazard information somewhat, and fixed some |
bugs in the instruction hazard descriptions. |
Thu Jul 15 12:42:01 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* m88k.h: Corrected a couple of opcodes. |
Tue Jul 6 15:17:35 1993 Ian Lance Taylor (ian@cygnus.com) |
* mips.h: Replaced with version from Ralph Campbell and OSF. The |
new version includes instruction hazard information, but is |
otherwise reasonably similar. |
Thu Jul 1 20:36:17 1993 Doug Evans (dje@canuck.cygnus.com) |
* h8300.h: Fix typo in UNOP3 (affected sh[al][lr].l). |
Fri Jun 11 18:38:44 1993 Ken Raeburn (raeburn@cygnus.com) |
Patches from Jeff Law, law@cs.utah.edu: |
* hppa.h: Clean up some of the OLD_TABLE, non-OLD_TABLE braindamage. |
Make the tables be the same for the following instructions: |
"bb", "addb[tf]", "addib[tf]", "add", "add[loc]", "addco", |
"sh[123]add", "sh[123]add[lo]", "sub", "sub[obt]", "sub[bt]o", |
"ds", "comclr", "addi", "addi[ot]", "addito", "subi", "subio", |
"comiclr", "fadd", "fsub", "fmpy", "fdiv", "fsqrt", "fabs", |
"frnd", "fcpy", "fcnvff", "fcnvxf", "fcnvfx", "fcnvfxt", |
"fcmp", and "ftest". |
* hppa.h: Make new and old tables the same for "break", "mtctl", |
"mfctl", "bb", "ssm", "rsm", "xmpyu", "fmpyadd", "fmpysub". |
Fix typo in last patch. Collapse several #ifdefs into a |
single #ifdef. |
* hppa.h: Delete remaining OLD_TABLE code. Bring some |
of the comments up-to-date. |
* hppa.h: Update "free list" of letters and update |
comments describing each letter's function. |
Thu Jul 8 09:05:26 1993 Doug Evans (dje@canuck.cygnus.com) |
* h8300.h: Lots of little fixes for the h8/300h. |
Tue Jun 8 12:16:03 1993 Steve Chamberlain (sac@phydeaux.cygnus.com) |
Support for H8/300-H |
* h8300.h: Lots of new opcodes. |
Fri Jun 4 15:41:37 1993 Steve Chamberlain (sac@phydeaux.cygnus.com) |
* h8300.h: checkpoint, includes H8/300-H opcodes. |
Thu Jun 3 15:42:59 1993 Stu Grossman (grossman@cygnus.com) |
* Patches from Jeffrey Law <law@cs.utah.edu>. |
* hppa.h: Rework single precision FP |
instructions so that they correctly disassemble code |
PA1.1 code. |
Thu May 27 19:21:22 1993 Bruce Bauman (boot@osf.org) |
* i386.h (i386_optab, mov pattern): Remove Mem16 restriction from |
mov to allow instructions like mov ss,xyz(ecx) to assemble. |
Tue May 25 00:39:40 1993 Ken Raeburn (raeburn@cygnus.com) |
* hppa.h: Use new version from Utah if OLD_TABLE isn't defined; |
gdb will define it for now. |
Mon May 24 15:20:06 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) |
* sparc.h: Don't end enumerator list with comma. |
Fri May 14 15:15:50 1993 Ian Lance Taylor (ian@cygnus.com) |
* Based on patches from davidj@ICSI.Berkeley.EDU (David Johnson): |
* mips.h (OP_MASK_COPZ, OP_SH_COPZ): Define. |
("bc2t"): Correct typo. |
("[ls]wc[023]"): Use T rather than t. |
("c[0123]"): Define general coprocessor instructions. |
Mon May 10 06:02:25 1993 Ken Raeburn (raeburn@kr-pc.cygnus.com) |
* m68k.h: Move split point for gcc compilation more towards |
middle. |
Fri Apr 9 13:26:16 1993 Jim Kingdon (kingdon@cygnus.com) |
* rs6k.h: Clean up instructions for primary opcode 19 (many were |
simply wrong, ics, rfi, & rfsvc were missing). |
Add "a" to opr_ext for "bb". Doc fix. |
Thu Mar 18 13:45:31 1993 Per Bothner (bothner@rtl.cygnus.com) |
* i386.h: 486 extensions from John Hassey (hassey@dg-rtp.dg.com). |
* mips.h: Add casts, to suppress warnings about shifting too much. |
* m68k.h: Document the placement code '9'. |
Thu Feb 18 02:03:14 1993 John Gilmore (gnu@cygnus.com) |
* m68k.h (BREAK_UP_BIG_DECL, AND_OTHER_PART): Add kludge which |
allows callers to break up the large initialized struct full of |
opcodes into two half-sized ones. This permits GCC to compile |
this module, since it takes exponential space for initializers. |
(numopcodes, endop): Revise to use AND_OTHER_PART in size calcs. |
Thu Feb 4 02:06:56 1993 John Gilmore (gnu@cygnus.com) |
* a29k.h: Remove RCS crud, update GPL to v2, update copyrights. |
* convex.h: Added, from GDB's convx-opcode.h. Added CONST to all |
initialized structs in it. |
Thu Jan 28 21:32:22 1993 John Gilmore (gnu@cygnus.com) |
Delta 88 changes inspired by Carl Greco, <cgreco@Creighton.Edu>: |
* m88k.h (PMEM): Avoid previous definition from <sys/param.h>. |
(AND): Change to AND_ to avoid ansidecl.h `AND' conflict. |
Sat Jan 23 18:10:49 PST 1993 Ralph Campbell (ralphc@pyramid.com) |
* mips.h: document "i" and "j" operands correctly. |
Thu Jan 7 15:58:13 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) |
* mips.h: Removed endianness dependency. |
Sun Jan 3 14:13:35 1993 Steve Chamberlain (sac@thepub.cygnus.com) |
* h8300.h: include info on number of cycles per instruction. |
Mon Dec 21 21:29:08 1992 Stu Grossman (grossman at cygnus.com) |
* hppa.h: Move handy aliases to the front. Fix masks for extract |
and deposit instructions. |
Sat Dec 12 16:09:48 1992 Ian Lance Taylor (ian@cygnus.com) |
* i386.h: accept shld and shrd both with and without the shift |
count argument, which is always %cl. |
Fri Nov 27 17:13:18 1992 Ken Raeburn (raeburn at cygnus.com) |
* i386.h (i386_optab_end, i386_regtab_end): Now const. |
(one_byte_segment_defaults, two_byte_segment_defaults, |
i386_prefixtab_end): Ditto. |
Mon Nov 23 10:47:25 1992 Ken Raeburn (raeburn@cygnus.com) |
* vax.h (bb*): Use "v" (bitfield type), not "a" (address operand) |
for operand 2; from John Carr, jfc@dsg.dec.com. |
Wed Nov 4 07:36:49 1992 Ken Raeburn (raeburn@cygnus.com) |
* m68k.h: Define FIXED_SIZE_BRANCH, so bsr and bra instructions |
always use 16-bit offsets. Makes calculated-size jump tables |
feasible. |
Fri Oct 16 22:52:43 1992 Ken Raeburn (raeburn@cygnus.com) |
* i386.h: Fix one-operand forms of in* and out* patterns. |
Tue Sep 22 14:08:14 1992 Ken Raeburn (raeburn@cambridge.cygnus.com) |
* m68k.h: Added CPU32 support. |
Tue Sep 22 00:38:41 1992 John Gilmore (gnu@cygnus.com) |
* mips.h (break): Disassemble the argument. Patch from |
jonathan@cs.stanford.edu (Jonathan Stone). |
Wed Sep 9 11:25:28 1992 Ian Lance Taylor (ian@cygnus.com) |
* m68k.h: merged Motorola and MIT syntax. |
Thu Sep 3 09:33:22 1992 Steve Chamberlain (sac@thepub.cygnus.com) |
* m68k.h (pmove): make the tests less strict, the 68k book is |
wrong. |
Tue Aug 25 23:25:19 1992 Ken Raeburn (raeburn@cambridge.cygnus.com) |
* m68k.h (m68ec030): Defined as alias for 68030. |
(m68k_opcodes): New type characters "3" for 68030 MMU regs and "t" |
for immediate 0-7 added. Set up some opcodes (ptest, bkpt) to use |
them. Tightened description of "fmovex" to distinguish it from |
some "pmove" encodings. Added "pmove" for 68030 MMU regs, cleaned |
up descriptions that claimed versions were available for chips not |
supporting them. Added "pmovefd". |
Mon Aug 24 12:04:51 1992 Steve Chamberlain (sac@thepub.cygnus.com) |
* m68k.h: fix where the . goes in divull |
Wed Aug 19 11:22:24 1992 Ian Lance Taylor (ian@cygnus.com) |
* m68k.h: the cas2 instruction is supposed to be written with |
indirection on the last two operands, which can be either data or |
address registers. Added a new operand type 'r' which accepts |
either register type. Added new cases for cas2l and cas2w which |
use them. Corrected masks for cas2 which failed to recognize use |
of address register. |
Fri Aug 14 14:20:38 1992 Per Bothner (bothner@cygnus.com) |
* m68k.h: Merged in patches (mostly m68040-specific) from |
Colin Smith <colin@wrs.com>. |
* m68k.h: Merged m68kmri.h and m68k.h (using the former as a |
base). Also cleaned up duplicates, re-ordered instructions for |
the sake of dis-assembling (so aliases come after standard names). |
* m68kmri.h: Now just defines some macros, and #includes m68k.h. |
Wed Aug 12 16:38:15 1992 Steve Chamberlain (sac@thepub.cygnus.com) |
* m68kmri.h: added various opcodes. Moved jbxx to bxxes. Filled in |
all missing .s |
Mon Aug 10 23:22:33 1992 Ken Raeburn (raeburn@cygnus.com) |
* sparc.h: Moved tables to BFD library. |
* i386.h (i386_optab): Add fildq, fistpq aliases used by gcc. |
Sun Jun 28 13:29:03 1992 Fred Fish (fnf@cygnus.com) |
* h8300.h: Finish filling in all the holes in the opcode table, |
so that the Lucid C compiler can digest this as well... |
Fri Jun 26 21:27:17 1992 John Gilmore (gnu at cygnus.com) |
* i386.h: Add setc, setnc, addr16, data16, repz, repnz aliases. |
Fix opcodes on various sizes of fild/fist instructions |
(16bit=no suffix, 32bit="l" suffix, 64bit="ll" suffix). |
Use tabs to indent for comments. Fixes suggested by Minh Tran-Le. |
Thu Jun 25 16:13:26 1992 Stu Grossman (grossman at cygnus.com) |
* h8300.h: Fill in all the holes in the opcode table so that the |
losing HPUX C compiler can digest this... |
Thu Jun 11 12:15:25 1992 John Gilmore (gnu at cygnus.com) |
* mips.h: Fix decoding of coprocessor instructions, somewhat. |
(Fix by Eric Anderson, 3jean@maas-neotek.arc.nasa.gov.) |
Thu May 28 11:17:44 1992 Jim Wilson (wilson@sphagnum.cygnus.com) |
* sparc.h: Add new architecture variant sparclite; add its scan |
and divscc opcodes. Define ARCHITECTURES_CONFLICT_P macro. |
Tue May 5 14:23:27 1992 Per Bothner (bothner@rtl.cygnus.com) |
* mips.h: Add some more opcode synonyms (from Frank Yellin, |
fy@lucid.com). |
Thu Apr 16 18:25:26 1992 Per Bothner (bothner@cygnus.com) |
* rs6k.h: New version from IBM (Metin). |
Thu Apr 9 00:31:19 1992 Per Bothner (bothner@rtl.cygnus.com) |
* rs6k.h: Fix incorrect extended opcode for instructions `fm' |
and `fd'. (From metin@ibmpa.awdpa.ibm.com (Metin G. Ozisik).) |
Tue Apr 7 13:38:47 1992 Stu Grossman (grossman at cygnus.com) |
* rs6k.h: Move from ../../gdb/rs6k-opcode.h. |
Fri Apr 3 11:30:20 1992 Fred Fish (fnf@cygnus.com) |
* m68k.h (one, two): Cast macro args to unsigned to suppress |
complaints from compiler and lint about integer overflow during |
shift. |
Sun Mar 29 12:22:08 1992 John Gilmore (gnu at cygnus.com) |
* sparc.h (OP): Avoid signed overflow when shifting to high order bit. |
Fri Mar 6 00:22:38 1992 John Gilmore (gnu at cygnus.com) |
* mips.h: Make bitfield layout depend on the HOST compiler, |
not on the TARGET system. |
Fri Feb 21 01:29:51 1992 K. Richard Pixley (rich@cygnus.com) |
* i386.h: added inb, inw, outb, outw opcodes, added att syntax for |
scmp, slod, smov, ssca, ssto. Curtesy Minh Tran-Le |
<TRANLE@INTELLICORP.COM>. |
Thu Jan 30 07:31:44 1992 Steve Chamberlain (sac at rtl.cygnus.com) |
* h8300.h: turned op_type enum into #define list |
Thu Jan 30 01:07:24 1992 John Gilmore (gnu at cygnus.com) |
* sparc.h: Remove "cypress" architecture. Remove "fitox" and |
similar instructions -- they've been renamed to "fitoq", etc. |
REALLY fix tsubcctv. Fix "fcmpeq" and "fcmpq" which had wrong |
number of arguments. |
* h8300.h: Remove extra ; which produces compiler warning. |
Tue Jan 28 22:59:22 1992 Stu Grossman (grossman at cygnus.com) |
* sparc.h: fix opcode for tsubcctv. |
Tue Jan 7 17:19:39 1992 K. Richard Pixley (rich at cygnus.com) |
* sparc.h: fba and cba are now aliases for fb and cb respectively. |
Fri Dec 27 10:55:50 1991 Per Bothner (bothner at cygnus.com) |
* sparc.h (nop): Made the 'lose' field be even tighter, |
so only a standard 'nop' is disassembled as a nop. |
Sun Dec 22 12:18:18 1991 Michael Tiemann (tiemann at cygnus.com) |
* sparc.h (nop): Add RD_GO to `lose' so that only %g0 in dest is |
disassembled as a nop. |
Wed Dec 18 17:19:44 1991 Stu Grossman (grossman at cygnus.com) |
* m68k.h, sparc.h: ANSIfy enums. |
Tue Dec 10 00:22:20 1991 K. Richard Pixley (rich at rtl.cygnus.com) |
* sparc.h: fix a typo. |
Sat Nov 30 20:40:51 1991 Steve Chamberlain (sac at rtl.cygnus.com) |
* a29k.h, arm.h, h8300.h, i386.h, i860.h, i960.h , m68k.h, |
m88k.h, mips.h , np1.h, ns32k.h, pn.h, pyr.h, sparc.h, tahoe.h, |
vax.h: Renamed from ../<foo>-opcode.h. |
Copyright (C) 1991-2003 Free Software Foundation, Inc. |
Copying and distribution of this file, with or without modification, |
are permitted in any medium without royalty provided the copyright |
notice and this notice are preserved. |
Local Variables: |
mode: change-log |
left-margin: 8 |
fill-column: 74 |
version-control: never |
End: |
/contrib/toolchain/binutils/include/opcode/aarch64.h |
---|
0,0 → 1,943 |
/* AArch64 assembler/disassembler support. |
Copyright 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. |
Contributed by ARM Ltd. |
This file is part of GNU Binutils. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the license, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; see the file COPYING3. If not, |
see <http://www.gnu.org/licenses/>. */ |
#ifndef OPCODE_AARCH64_H |
#define OPCODE_AARCH64_H |
#include "bfd.h" |
#include "bfd_stdint.h" |
#include <assert.h> |
#include <stdlib.h> |
/* The offset for pc-relative addressing is currently defined to be 0. */ |
#define AARCH64_PCREL_OFFSET 0 |
typedef uint32_t aarch64_insn; |
/* The following bitmasks control CPU features. */ |
#define AARCH64_FEATURE_V8 0x00000001 /* All processors. */ |
#define AARCH64_FEATURE_CRYPTO 0x00010000 /* Crypto instructions. */ |
#define AARCH64_FEATURE_FP 0x00020000 /* FP instructions. */ |
#define AARCH64_FEATURE_SIMD 0x00040000 /* SIMD instructions. */ |
#define AARCH64_FEATURE_CRC 0x00080000 /* CRC instructions. */ |
/* Architectures are the sum of the base and extensions. */ |
#define AARCH64_ARCH_V8 AARCH64_FEATURE (AARCH64_FEATURE_V8, \ |
AARCH64_FEATURE_FP \ |
| AARCH64_FEATURE_SIMD) |
#define AARCH64_ARCH_NONE AARCH64_FEATURE (0, 0) |
#define AARCH64_ANY AARCH64_FEATURE (-1, 0) /* Any basic core. */ |
/* CPU-specific features. */ |
typedef unsigned long aarch64_feature_set; |
#define AARCH64_CPU_HAS_FEATURE(CPU,FEAT) \ |
(((CPU) & (FEAT)) != 0) |
#define AARCH64_MERGE_FEATURE_SETS(TARG,F1,F2) \ |
do \ |
{ \ |
(TARG) = (F1) | (F2); \ |
} \ |
while (0) |
#define AARCH64_CLEAR_FEATURE(TARG,F1,F2) \ |
do \ |
{ \ |
(TARG) = (F1) &~ (F2); \ |
} \ |
while (0) |
#define AARCH64_FEATURE(core,coproc) ((core) | (coproc)) |
#define AARCH64_OPCODE_HAS_FEATURE(OPC,FEAT) \ |
(((OPC) & (FEAT)) != 0) |
enum aarch64_operand_class |
{ |
AARCH64_OPND_CLASS_NIL, |
AARCH64_OPND_CLASS_INT_REG, |
AARCH64_OPND_CLASS_MODIFIED_REG, |
AARCH64_OPND_CLASS_FP_REG, |
AARCH64_OPND_CLASS_SIMD_REG, |
AARCH64_OPND_CLASS_SIMD_ELEMENT, |
AARCH64_OPND_CLASS_SISD_REG, |
AARCH64_OPND_CLASS_SIMD_REGLIST, |
AARCH64_OPND_CLASS_CP_REG, |
AARCH64_OPND_CLASS_ADDRESS, |
AARCH64_OPND_CLASS_IMMEDIATE, |
AARCH64_OPND_CLASS_SYSTEM, |
AARCH64_OPND_CLASS_COND, |
}; |
/* Operand code that helps both parsing and coding. |
Keep AARCH64_OPERANDS synced. */ |
enum aarch64_opnd |
{ |
AARCH64_OPND_NIL, /* no operand---MUST BE FIRST!*/ |
AARCH64_OPND_Rd, /* Integer register as destination. */ |
AARCH64_OPND_Rn, /* Integer register as source. */ |
AARCH64_OPND_Rm, /* Integer register as source. */ |
AARCH64_OPND_Rt, /* Integer register used in ld/st instructions. */ |
AARCH64_OPND_Rt2, /* Integer register used in ld/st pair instructions. */ |
AARCH64_OPND_Rs, /* Integer register used in ld/st exclusive. */ |
AARCH64_OPND_Ra, /* Integer register used in ddp_3src instructions. */ |
AARCH64_OPND_Rt_SYS, /* Integer register used in system instructions. */ |
AARCH64_OPND_Rd_SP, /* Integer Rd or SP. */ |
AARCH64_OPND_Rn_SP, /* Integer Rn or SP. */ |
AARCH64_OPND_Rm_EXT, /* Integer Rm extended. */ |
AARCH64_OPND_Rm_SFT, /* Integer Rm shifted. */ |
AARCH64_OPND_Fd, /* Floating-point Fd. */ |
AARCH64_OPND_Fn, /* Floating-point Fn. */ |
AARCH64_OPND_Fm, /* Floating-point Fm. */ |
AARCH64_OPND_Fa, /* Floating-point Fa. */ |
AARCH64_OPND_Ft, /* Floating-point Ft. */ |
AARCH64_OPND_Ft2, /* Floating-point Ft2. */ |
AARCH64_OPND_Sd, /* AdvSIMD Scalar Sd. */ |
AARCH64_OPND_Sn, /* AdvSIMD Scalar Sn. */ |
AARCH64_OPND_Sm, /* AdvSIMD Scalar Sm. */ |
AARCH64_OPND_Vd, /* AdvSIMD Vector Vd. */ |
AARCH64_OPND_Vn, /* AdvSIMD Vector Vn. */ |
AARCH64_OPND_Vm, /* AdvSIMD Vector Vm. */ |
AARCH64_OPND_VdD1, /* AdvSIMD <Vd>.D[1]; for FMOV only. */ |
AARCH64_OPND_VnD1, /* AdvSIMD <Vn>.D[1]; for FMOV only. */ |
AARCH64_OPND_Ed, /* AdvSIMD Vector Element Vd. */ |
AARCH64_OPND_En, /* AdvSIMD Vector Element Vn. */ |
AARCH64_OPND_Em, /* AdvSIMD Vector Element Vm. */ |
AARCH64_OPND_LVn, /* AdvSIMD Vector register list used in e.g. TBL. */ |
AARCH64_OPND_LVt, /* AdvSIMD Vector register list used in ld/st. */ |
AARCH64_OPND_LVt_AL, /* AdvSIMD Vector register list for loading single |
structure to all lanes. */ |
AARCH64_OPND_LEt, /* AdvSIMD Vector Element list. */ |
AARCH64_OPND_Cn, /* Co-processor register in CRn field. */ |
AARCH64_OPND_Cm, /* Co-processor register in CRm field. */ |
AARCH64_OPND_IDX, /* AdvSIMD EXT index operand. */ |
AARCH64_OPND_IMM_VLSL,/* Immediate for shifting vector registers left. */ |
AARCH64_OPND_IMM_VLSR,/* Immediate for shifting vector registers right. */ |
AARCH64_OPND_SIMD_IMM,/* AdvSIMD modified immediate without shift. */ |
AARCH64_OPND_SIMD_IMM_SFT, /* AdvSIMD modified immediate with shift. */ |
AARCH64_OPND_SIMD_FPIMM,/* AdvSIMD 8-bit fp immediate. */ |
AARCH64_OPND_SHLL_IMM,/* Immediate shift for AdvSIMD SHLL instruction |
(no encoding). */ |
AARCH64_OPND_IMM0, /* Immediate for #0. */ |
AARCH64_OPND_FPIMM0, /* Immediate for #0.0. */ |
AARCH64_OPND_FPIMM, /* Floating-point Immediate. */ |
AARCH64_OPND_IMMR, /* Immediate #<immr> in e.g. BFM. */ |
AARCH64_OPND_IMMS, /* Immediate #<imms> in e.g. BFM. */ |
AARCH64_OPND_WIDTH, /* Immediate #<width> in e.g. BFI. */ |
AARCH64_OPND_IMM, /* Immediate. */ |
AARCH64_OPND_UIMM3_OP1,/* Unsigned 3-bit immediate in the op1 field. */ |
AARCH64_OPND_UIMM3_OP2,/* Unsigned 3-bit immediate in the op2 field. */ |
AARCH64_OPND_UIMM4, /* Unsigned 4-bit immediate in the CRm field. */ |
AARCH64_OPND_UIMM7, /* Unsigned 7-bit immediate in the CRm:op2 fields. */ |
AARCH64_OPND_BIT_NUM, /* Immediate. */ |
AARCH64_OPND_EXCEPTION,/* imm16 operand in exception instructions. */ |
AARCH64_OPND_CCMP_IMM,/* Immediate in conditional compare instructions. */ |
AARCH64_OPND_NZCV, /* Flag bit specifier giving an alternative value for |
each condition flag. */ |
AARCH64_OPND_LIMM, /* Logical Immediate. */ |
AARCH64_OPND_AIMM, /* Arithmetic immediate. */ |
AARCH64_OPND_HALF, /* #<imm16>{, LSL #<shift>} operand in move wide. */ |
AARCH64_OPND_FBITS, /* FP #<fbits> operand in e.g. SCVTF */ |
AARCH64_OPND_IMM_MOV, /* Immediate operand for the MOV alias. */ |
AARCH64_OPND_COND, /* Standard condition as the last operand. */ |
AARCH64_OPND_COND1, /* Same as the above, but excluding AL and NV. */ |
AARCH64_OPND_ADDR_ADRP, /* Memory address for ADRP */ |
AARCH64_OPND_ADDR_PCREL14, /* 14-bit PC-relative address for e.g. TBZ. */ |
AARCH64_OPND_ADDR_PCREL19, /* 19-bit PC-relative address for e.g. LDR. */ |
AARCH64_OPND_ADDR_PCREL21, /* 21-bit PC-relative address for e.g. ADR. */ |
AARCH64_OPND_ADDR_PCREL26, /* 26-bit PC-relative address for e.g. BL. */ |
AARCH64_OPND_ADDR_SIMPLE, /* Address of ld/st exclusive. */ |
AARCH64_OPND_ADDR_REGOFF, /* Address of register offset. */ |
AARCH64_OPND_ADDR_SIMM7, /* Address of signed 7-bit immediate. */ |
AARCH64_OPND_ADDR_SIMM9, /* Address of signed 9-bit immediate. */ |
AARCH64_OPND_ADDR_SIMM9_2, /* Same as the above, but the immediate is |
negative or unaligned and there is |
no writeback allowed. This operand code |
is only used to support the programmer- |
friendly feature of using LDR/STR as the |
the mnemonic name for LDUR/STUR instructions |
wherever there is no ambiguity. */ |
AARCH64_OPND_ADDR_UIMM12, /* Address of unsigned 12-bit immediate. */ |
AARCH64_OPND_SIMD_ADDR_SIMPLE,/* Address of ld/st multiple structures. */ |
AARCH64_OPND_SIMD_ADDR_POST, /* Address of ld/st multiple post-indexed. */ |
AARCH64_OPND_SYSREG, /* System register operand. */ |
AARCH64_OPND_PSTATEFIELD, /* PSTATE field name operand. */ |
AARCH64_OPND_SYSREG_AT, /* System register <at_op> operand. */ |
AARCH64_OPND_SYSREG_DC, /* System register <dc_op> operand. */ |
AARCH64_OPND_SYSREG_IC, /* System register <ic_op> operand. */ |
AARCH64_OPND_SYSREG_TLBI, /* System register <tlbi_op> operand. */ |
AARCH64_OPND_BARRIER, /* Barrier operand. */ |
AARCH64_OPND_BARRIER_ISB, /* Barrier operand for ISB. */ |
AARCH64_OPND_PRFOP, /* Prefetch operation. */ |
}; |
/* Qualifier constrains an operand. It either specifies a variant of an |
operand type or limits values available to an operand type. |
N.B. Order is important; keep aarch64_opnd_qualifiers synced. */ |
enum aarch64_opnd_qualifier |
{ |
/* Indicating no further qualification on an operand. */ |
AARCH64_OPND_QLF_NIL, |
/* Qualifying an operand which is a general purpose (integer) register; |
indicating the operand data size or a specific register. */ |
AARCH64_OPND_QLF_W, /* Wn, WZR or WSP. */ |
AARCH64_OPND_QLF_X, /* Xn, XZR or XSP. */ |
AARCH64_OPND_QLF_WSP, /* WSP. */ |
AARCH64_OPND_QLF_SP, /* SP. */ |
/* Qualifying an operand which is a floating-point register, a SIMD |
vector element or a SIMD vector element list; indicating operand data |
size or the size of each SIMD vector element in the case of a SIMD |
vector element list. |
These qualifiers are also used to qualify an address operand to |
indicate the size of data element a load/store instruction is |
accessing. |
They are also used for the immediate shift operand in e.g. SSHR. Such |
a use is only for the ease of operand encoding/decoding and qualifier |
sequence matching; such a use should not be applied widely; use the value |
constraint qualifiers for immediate operands wherever possible. */ |
AARCH64_OPND_QLF_S_B, |
AARCH64_OPND_QLF_S_H, |
AARCH64_OPND_QLF_S_S, |
AARCH64_OPND_QLF_S_D, |
AARCH64_OPND_QLF_S_Q, |
/* Qualifying an operand which is a SIMD vector register or a SIMD vector |
register list; indicating register shape. |
They are also used for the immediate shift operand in e.g. SSHR. Such |
a use is only for the ease of operand encoding/decoding and qualifier |
sequence matching; such a use should not be applied widely; use the value |
constraint qualifiers for immediate operands wherever possible. */ |
AARCH64_OPND_QLF_V_8B, |
AARCH64_OPND_QLF_V_16B, |
AARCH64_OPND_QLF_V_4H, |
AARCH64_OPND_QLF_V_8H, |
AARCH64_OPND_QLF_V_2S, |
AARCH64_OPND_QLF_V_4S, |
AARCH64_OPND_QLF_V_1D, |
AARCH64_OPND_QLF_V_2D, |
AARCH64_OPND_QLF_V_1Q, |
/* Constraint on value. */ |
AARCH64_OPND_QLF_imm_0_7, |
AARCH64_OPND_QLF_imm_0_15, |
AARCH64_OPND_QLF_imm_0_31, |
AARCH64_OPND_QLF_imm_0_63, |
AARCH64_OPND_QLF_imm_1_32, |
AARCH64_OPND_QLF_imm_1_64, |
/* Indicate whether an AdvSIMD modified immediate operand is shift-zeros |
or shift-ones. */ |
AARCH64_OPND_QLF_LSL, |
AARCH64_OPND_QLF_MSL, |
/* Special qualifier helping retrieve qualifier information during the |
decoding time (currently not in use). */ |
AARCH64_OPND_QLF_RETRIEVE, |
}; |
/* Instruction class. */ |
enum aarch64_insn_class |
{ |
addsub_carry, |
addsub_ext, |
addsub_imm, |
addsub_shift, |
asimdall, |
asimddiff, |
asimdelem, |
asimdext, |
asimdimm, |
asimdins, |
asimdmisc, |
asimdperm, |
asimdsame, |
asimdshf, |
asimdtbl, |
asisddiff, |
asisdelem, |
asisdlse, |
asisdlsep, |
asisdlso, |
asisdlsop, |
asisdmisc, |
asisdone, |
asisdpair, |
asisdsame, |
asisdshf, |
bitfield, |
branch_imm, |
branch_reg, |
compbranch, |
condbranch, |
condcmp_imm, |
condcmp_reg, |
condsel, |
cryptoaes, |
cryptosha2, |
cryptosha3, |
dp_1src, |
dp_2src, |
dp_3src, |
exception, |
extract, |
float2fix, |
float2int, |
floatccmp, |
floatcmp, |
floatdp1, |
floatdp2, |
floatdp3, |
floatimm, |
floatsel, |
ldst_immpost, |
ldst_immpre, |
ldst_imm9, /* immpost or immpre */ |
ldst_pos, |
ldst_regoff, |
ldst_unpriv, |
ldst_unscaled, |
ldstexcl, |
ldstnapair_offs, |
ldstpair_off, |
ldstpair_indexed, |
loadlit, |
log_imm, |
log_shift, |
movewide, |
pcreladdr, |
ic_system, |
testbranch, |
}; |
/* Opcode enumerators. */ |
enum aarch64_op |
{ |
OP_NIL, |
OP_STRB_POS, |
OP_LDRB_POS, |
OP_LDRSB_POS, |
OP_STRH_POS, |
OP_LDRH_POS, |
OP_LDRSH_POS, |
OP_STR_POS, |
OP_LDR_POS, |
OP_STRF_POS, |
OP_LDRF_POS, |
OP_LDRSW_POS, |
OP_PRFM_POS, |
OP_STURB, |
OP_LDURB, |
OP_LDURSB, |
OP_STURH, |
OP_LDURH, |
OP_LDURSH, |
OP_STUR, |
OP_LDUR, |
OP_STURV, |
OP_LDURV, |
OP_LDURSW, |
OP_PRFUM, |
OP_LDR_LIT, |
OP_LDRV_LIT, |
OP_LDRSW_LIT, |
OP_PRFM_LIT, |
OP_ADD, |
OP_B, |
OP_BL, |
OP_MOVN, |
OP_MOVZ, |
OP_MOVK, |
OP_MOV_IMM_LOG, /* MOV alias for moving bitmask immediate. */ |
OP_MOV_IMM_WIDE, /* MOV alias for moving wide immediate. */ |
OP_MOV_IMM_WIDEN, /* MOV alias for moving wide immediate (negated). */ |
OP_MOV_V, /* MOV alias for moving vector register. */ |
OP_ASR_IMM, |
OP_LSR_IMM, |
OP_LSL_IMM, |
OP_BIC, |
OP_UBFX, |
OP_BFXIL, |
OP_SBFX, |
OP_SBFIZ, |
OP_BFI, |
OP_UBFIZ, |
OP_UXTB, |
OP_UXTH, |
OP_UXTW, |
OP_CINC, |
OP_CINV, |
OP_CNEG, |
OP_CSET, |
OP_CSETM, |
OP_FCVT, |
OP_FCVTN, |
OP_FCVTN2, |
OP_FCVTL, |
OP_FCVTL2, |
OP_FCVTXN_S, /* Scalar version. */ |
OP_ROR_IMM, |
OP_SXTL, |
OP_SXTL2, |
OP_UXTL, |
OP_UXTL2, |
OP_TOTAL_NUM, /* Pseudo. */ |
}; |
/* Maximum number of operands an instruction can have. */ |
#define AARCH64_MAX_OPND_NUM 6 |
/* Maximum number of qualifier sequences an instruction can have. */ |
#define AARCH64_MAX_QLF_SEQ_NUM 10 |
/* Operand qualifier typedef; optimized for the size. */ |
typedef unsigned char aarch64_opnd_qualifier_t; |
/* Operand qualifier sequence typedef. */ |
typedef aarch64_opnd_qualifier_t \ |
aarch64_opnd_qualifier_seq_t [AARCH64_MAX_OPND_NUM]; |
/* FIXME: improve the efficiency. */ |
static inline bfd_boolean |
empty_qualifier_sequence_p (const aarch64_opnd_qualifier_t *qualifiers) |
{ |
int i; |
for (i = 0; i < AARCH64_MAX_OPND_NUM; ++i) |
if (qualifiers[i] != AARCH64_OPND_QLF_NIL) |
return FALSE; |
return TRUE; |
} |
/* This structure holds information for a particular opcode. */ |
struct aarch64_opcode |
{ |
/* The name of the mnemonic. */ |
const char *name; |
/* The opcode itself. Those bits which will be filled in with |
operands are zeroes. */ |
aarch64_insn opcode; |
/* The opcode mask. This is used by the disassembler. This is a |
mask containing ones indicating those bits which must match the |
opcode field, and zeroes indicating those bits which need not |
match (and are presumably filled in by operands). */ |
aarch64_insn mask; |
/* Instruction class. */ |
enum aarch64_insn_class iclass; |
/* Enumerator identifier. */ |
enum aarch64_op op; |
/* Which architecture variant provides this instruction. */ |
const aarch64_feature_set *avariant; |
/* An array of operand codes. Each code is an index into the |
operand table. They appear in the order which the operands must |
appear in assembly code, and are terminated by a zero. */ |
enum aarch64_opnd operands[AARCH64_MAX_OPND_NUM]; |
/* A list of operand qualifier code sequence. Each operand qualifier |
code qualifies the corresponding operand code. Each operand |
qualifier sequence specifies a valid opcode variant and related |
constraint on operands. */ |
aarch64_opnd_qualifier_seq_t qualifiers_list[AARCH64_MAX_QLF_SEQ_NUM]; |
/* Flags providing information about this instruction */ |
uint32_t flags; |
}; |
typedef struct aarch64_opcode aarch64_opcode; |
/* Table describing all the AArch64 opcodes. */ |
extern aarch64_opcode aarch64_opcode_table[]; |
/* Opcode flags. */ |
#define F_ALIAS (1 << 0) |
#define F_HAS_ALIAS (1 << 1) |
/* Disassembly preference priority 1-3 (the larger the higher). If nothing |
is specified, it is the priority 0 by default, i.e. the lowest priority. */ |
#define F_P1 (1 << 2) |
#define F_P2 (2 << 2) |
#define F_P3 (3 << 2) |
/* Flag an instruction that is truly conditional executed, e.g. b.cond. */ |
#define F_COND (1 << 4) |
/* Instruction has the field of 'sf'. */ |
#define F_SF (1 << 5) |
/* Instruction has the field of 'size:Q'. */ |
#define F_SIZEQ (1 << 6) |
/* Floating-point instruction has the field of 'type'. */ |
#define F_FPTYPE (1 << 7) |
/* AdvSIMD scalar instruction has the field of 'size'. */ |
#define F_SSIZE (1 << 8) |
/* AdvSIMD vector register arrangement specifier encoded in "imm5<3:0>:Q". */ |
#define F_T (1 << 9) |
/* Size of GPR operand in AdvSIMD instructions encoded in Q. */ |
#define F_GPRSIZE_IN_Q (1 << 10) |
/* Size of Rt load signed instruction encoded in opc[0], i.e. bit 22. */ |
#define F_LDS_SIZE (1 << 11) |
/* Optional operand; assume maximum of 1 operand can be optional. */ |
#define F_OPD0_OPT (1 << 12) |
#define F_OPD1_OPT (2 << 12) |
#define F_OPD2_OPT (3 << 12) |
#define F_OPD3_OPT (4 << 12) |
#define F_OPD4_OPT (5 << 12) |
/* Default value for the optional operand when omitted from the assembly. */ |
#define F_DEFAULT(X) (((X) & 0x1f) << 15) |
/* Instruction that is an alias of another instruction needs to be |
encoded/decoded by converting it to/from the real form, followed by |
the encoding/decoding according to the rules of the real opcode. |
This compares to the direct coding using the alias's information. |
N.B. this flag requires F_ALIAS to be used together. */ |
#define F_CONV (1 << 20) |
/* Use together with F_ALIAS to indicate an alias opcode is a programmer |
friendly pseudo instruction available only in the assembly code (thus will |
not show up in the disassembly). */ |
#define F_PSEUDO (1 << 21) |
/* Instruction has miscellaneous encoding/decoding rules. */ |
#define F_MISC (1 << 22) |
/* Instruction has the field of 'N'; used in conjunction with F_SF. */ |
#define F_N (1 << 23) |
/* Opcode dependent field. */ |
#define F_OD(X) (((X) & 0x7) << 24) |
/* Next bit is 27. */ |
static inline bfd_boolean |
alias_opcode_p (const aarch64_opcode *opcode) |
{ |
return (opcode->flags & F_ALIAS) ? TRUE : FALSE; |
} |
static inline bfd_boolean |
opcode_has_alias (const aarch64_opcode *opcode) |
{ |
return (opcode->flags & F_HAS_ALIAS) ? TRUE : FALSE; |
} |
/* Priority for disassembling preference. */ |
static inline int |
opcode_priority (const aarch64_opcode *opcode) |
{ |
return (opcode->flags >> 2) & 0x3; |
} |
static inline bfd_boolean |
pseudo_opcode_p (const aarch64_opcode *opcode) |
{ |
return (opcode->flags & F_PSEUDO) != 0lu ? TRUE : FALSE; |
} |
static inline bfd_boolean |
optional_operand_p (const aarch64_opcode *opcode, unsigned int idx) |
{ |
return (((opcode->flags >> 12) & 0x7) == idx + 1) |
? TRUE : FALSE; |
} |
static inline aarch64_insn |
get_optional_operand_default_value (const aarch64_opcode *opcode) |
{ |
return (opcode->flags >> 15) & 0x1f; |
} |
static inline unsigned int |
get_opcode_dependent_value (const aarch64_opcode *opcode) |
{ |
return (opcode->flags >> 24) & 0x7; |
} |
static inline bfd_boolean |
opcode_has_special_coder (const aarch64_opcode *opcode) |
{ |
return (opcode->flags & (F_SF | F_SIZEQ | F_FPTYPE | F_SSIZE | F_T |
| F_GPRSIZE_IN_Q | F_LDS_SIZE | F_MISC | F_N | F_COND)) ? TRUE |
: FALSE; |
} |
struct aarch64_name_value_pair |
{ |
const char * name; |
aarch64_insn value; |
}; |
extern const struct aarch64_name_value_pair aarch64_operand_modifiers []; |
extern const struct aarch64_name_value_pair aarch64_barrier_options [16]; |
extern const struct aarch64_name_value_pair aarch64_prfops [32]; |
typedef struct |
{ |
const char * name; |
aarch64_insn value; |
uint32_t flags; |
} aarch64_sys_reg; |
extern const aarch64_sys_reg aarch64_sys_regs []; |
extern const aarch64_sys_reg aarch64_pstatefields []; |
extern bfd_boolean aarch64_sys_reg_deprecated_p (const aarch64_sys_reg *); |
typedef struct |
{ |
const char *template; |
uint32_t value; |
int has_xt; |
} aarch64_sys_ins_reg; |
extern const aarch64_sys_ins_reg aarch64_sys_regs_ic []; |
extern const aarch64_sys_ins_reg aarch64_sys_regs_dc []; |
extern const aarch64_sys_ins_reg aarch64_sys_regs_at []; |
extern const aarch64_sys_ins_reg aarch64_sys_regs_tlbi []; |
/* Shift/extending operator kinds. |
N.B. order is important; keep aarch64_operand_modifiers synced. */ |
enum aarch64_modifier_kind |
{ |
AARCH64_MOD_NONE, |
AARCH64_MOD_MSL, |
AARCH64_MOD_ROR, |
AARCH64_MOD_ASR, |
AARCH64_MOD_LSR, |
AARCH64_MOD_LSL, |
AARCH64_MOD_UXTB, |
AARCH64_MOD_UXTH, |
AARCH64_MOD_UXTW, |
AARCH64_MOD_UXTX, |
AARCH64_MOD_SXTB, |
AARCH64_MOD_SXTH, |
AARCH64_MOD_SXTW, |
AARCH64_MOD_SXTX, |
}; |
bfd_boolean |
aarch64_extend_operator_p (enum aarch64_modifier_kind); |
enum aarch64_modifier_kind |
aarch64_get_operand_modifier (const struct aarch64_name_value_pair *); |
/* Condition. */ |
typedef struct |
{ |
/* A list of names with the first one as the disassembly preference; |
terminated by NULL if fewer than 3. */ |
const char *names[3]; |
aarch64_insn value; |
} aarch64_cond; |
extern const aarch64_cond aarch64_conds[16]; |
const aarch64_cond* get_cond_from_value (aarch64_insn value); |
const aarch64_cond* get_inverted_cond (const aarch64_cond *cond); |
/* Structure representing an operand. */ |
struct aarch64_opnd_info |
{ |
enum aarch64_opnd type; |
aarch64_opnd_qualifier_t qualifier; |
int idx; |
union |
{ |
struct |
{ |
unsigned regno; |
} reg; |
struct |
{ |
unsigned regno : 5; |
unsigned index : 4; |
} reglane; |
/* e.g. LVn. */ |
struct |
{ |
unsigned first_regno : 5; |
unsigned num_regs : 3; |
/* 1 if it is a list of reg element. */ |
unsigned has_index : 1; |
/* Lane index; valid only when has_index is 1. */ |
unsigned index : 4; |
} reglist; |
/* e.g. immediate or pc relative address offset. */ |
struct |
{ |
int64_t value; |
unsigned is_fp : 1; |
} imm; |
/* e.g. address in STR (register offset). */ |
struct |
{ |
unsigned base_regno; |
struct |
{ |
union |
{ |
int imm; |
unsigned regno; |
}; |
unsigned is_reg; |
} offset; |
unsigned pcrel : 1; /* PC-relative. */ |
unsigned writeback : 1; |
unsigned preind : 1; /* Pre-indexed. */ |
unsigned postind : 1; /* Post-indexed. */ |
} addr; |
const aarch64_cond *cond; |
/* The encoding of the system register. */ |
aarch64_insn sysreg; |
/* The encoding of the PSTATE field. */ |
aarch64_insn pstatefield; |
const aarch64_sys_ins_reg *sysins_op; |
const struct aarch64_name_value_pair *barrier; |
const struct aarch64_name_value_pair *prfop; |
}; |
/* Operand shifter; in use when the operand is a register offset address, |
add/sub extended reg, etc. e.g. <R><m>{, <extend> {#<amount>}}. */ |
struct |
{ |
enum aarch64_modifier_kind kind; |
int amount; |
unsigned operator_present: 1; /* Only valid during encoding. */ |
/* Value of the 'S' field in ld/st reg offset; used only in decoding. */ |
unsigned amount_present: 1; |
} shifter; |
unsigned skip:1; /* Operand is not completed if there is a fixup needed |
to be done on it. In some (but not all) of these |
cases, we need to tell libopcodes to skip the |
constraint checking and the encoding for this |
operand, so that the libopcodes can pick up the |
right opcode before the operand is fixed-up. This |
flag should only be used during the |
assembling/encoding. */ |
unsigned present:1; /* Whether this operand is present in the assembly |
line; not used during the disassembly. */ |
}; |
typedef struct aarch64_opnd_info aarch64_opnd_info; |
/* Structure representing an instruction. |
It is used during both the assembling and disassembling. The assembler |
fills an aarch64_inst after a successful parsing and then passes it to the |
encoding routine to do the encoding. During the disassembling, the |
disassembler calls the decoding routine to decode a binary instruction; on a |
successful return, such a structure will be filled with information of the |
instruction; then the disassembler uses the information to print out the |
instruction. */ |
struct aarch64_inst |
{ |
/* The value of the binary instruction. */ |
aarch64_insn value; |
/* Corresponding opcode entry. */ |
const aarch64_opcode *opcode; |
/* Condition for a truly conditional-executed instrutions, e.g. b.cond. */ |
const aarch64_cond *cond; |
/* Operands information. */ |
aarch64_opnd_info operands[AARCH64_MAX_OPND_NUM]; |
}; |
typedef struct aarch64_inst aarch64_inst; |
/* Diagnosis related declaration and interface. */ |
/* Operand error kind enumerators. |
AARCH64_OPDE_RECOVERABLE |
Less severe error found during the parsing, very possibly because that |
GAS has picked up a wrong instruction template for the parsing. |
AARCH64_OPDE_SYNTAX_ERROR |
General syntax error; it can be either a user error, or simply because |
that GAS is trying a wrong instruction template. |
AARCH64_OPDE_FATAL_SYNTAX_ERROR |
Definitely a user syntax error. |
AARCH64_OPDE_INVALID_VARIANT |
No syntax error, but the operands are not a valid combination, e.g. |
FMOV D0,S0 |
AARCH64_OPDE_OUT_OF_RANGE |
Error about some immediate value out of a valid range. |
AARCH64_OPDE_UNALIGNED |
Error about some immediate value not properly aligned (i.e. not being a |
multiple times of a certain value). |
AARCH64_OPDE_REG_LIST |
Error about the register list operand having unexpected number of |
registers. |
AARCH64_OPDE_OTHER_ERROR |
Error of the highest severity and used for any severe issue that does not |
fall into any of the above categories. |
The enumerators are only interesting to GAS. They are declared here (in |
libopcodes) because that some errors are detected (and then notified to GAS) |
by libopcodes (rather than by GAS solely). |
The first three errors are only deteced by GAS while the |
AARCH64_OPDE_INVALID_VARIANT error can only be spotted by libopcodes as |
only libopcodes has the information about the valid variants of each |
instruction. |
The enumerators have an increasing severity. This is helpful when there are |
multiple instruction templates available for a given mnemonic name (e.g. |
FMOV); this mechanism will help choose the most suitable template from which |
the generated diagnostics can most closely describe the issues, if any. */ |
enum aarch64_operand_error_kind |
{ |
AARCH64_OPDE_NIL, |
AARCH64_OPDE_RECOVERABLE, |
AARCH64_OPDE_SYNTAX_ERROR, |
AARCH64_OPDE_FATAL_SYNTAX_ERROR, |
AARCH64_OPDE_INVALID_VARIANT, |
AARCH64_OPDE_OUT_OF_RANGE, |
AARCH64_OPDE_UNALIGNED, |
AARCH64_OPDE_REG_LIST, |
AARCH64_OPDE_OTHER_ERROR |
}; |
/* N.B. GAS assumes that this structure work well with shallow copy. */ |
struct aarch64_operand_error |
{ |
enum aarch64_operand_error_kind kind; |
int index; |
const char *error; |
int data[3]; /* Some data for extra information. */ |
}; |
typedef struct aarch64_operand_error aarch64_operand_error; |
/* Encoding entrypoint. */ |
extern int |
aarch64_opcode_encode (const aarch64_opcode *, const aarch64_inst *, |
aarch64_insn *, aarch64_opnd_qualifier_t *, |
aarch64_operand_error *); |
extern const aarch64_opcode * |
aarch64_replace_opcode (struct aarch64_inst *, |
const aarch64_opcode *); |
/* Given the opcode enumerator OP, return the pointer to the corresponding |
opcode entry. */ |
extern const aarch64_opcode * |
aarch64_get_opcode (enum aarch64_op); |
/* Generate the string representation of an operand. */ |
extern void |
aarch64_print_operand (char *, size_t, bfd_vma, const aarch64_opcode *, |
const aarch64_opnd_info *, int, int *, bfd_vma *); |
/* Miscellaneous interface. */ |
extern int |
aarch64_operand_index (const enum aarch64_opnd *, enum aarch64_opnd); |
extern aarch64_opnd_qualifier_t |
aarch64_get_expected_qualifier (const aarch64_opnd_qualifier_seq_t *, int, |
const aarch64_opnd_qualifier_t, int); |
extern int |
aarch64_num_of_operands (const aarch64_opcode *); |
extern int |
aarch64_stack_pointer_p (const aarch64_opnd_info *); |
extern |
int aarch64_zero_register_p (const aarch64_opnd_info *); |
/* Given an operand qualifier, return the expected data element size |
of a qualified operand. */ |
extern unsigned char |
aarch64_get_qualifier_esize (aarch64_opnd_qualifier_t); |
extern enum aarch64_operand_class |
aarch64_get_operand_class (enum aarch64_opnd); |
extern const char * |
aarch64_get_operand_name (enum aarch64_opnd); |
extern const char * |
aarch64_get_operand_desc (enum aarch64_opnd); |
#ifdef DEBUG_AARCH64 |
extern int debug_dump; |
extern void |
aarch64_verbose (const char *, ...) __attribute__ ((format (printf, 1, 2))); |
#define DEBUG_TRACE(M, ...) \ |
{ \ |
if (debug_dump) \ |
aarch64_verbose ("%s: " M ".", __func__, ##__VA_ARGS__); \ |
} |
#define DEBUG_TRACE_IF(C, M, ...) \ |
{ \ |
if (debug_dump && (C)) \ |
aarch64_verbose ("%s: " M ".", __func__, ##__VA_ARGS__); \ |
} |
#else /* !DEBUG_AARCH64 */ |
#define DEBUG_TRACE(M, ...) ; |
#define DEBUG_TRACE_IF(C, M, ...) ; |
#endif /* DEBUG_AARCH64 */ |
#endif /* OPCODE_AARCH64_H */ |
/contrib/toolchain/binutils/include/opcode/alpha.h |
---|
0,0 → 1,238 |
/* alpha.h -- Header file for Alpha opcode table |
Copyright 1996, 1999, 2001, 2003, 2010 Free Software Foundation, Inc. |
Contributed by Richard Henderson <rth@tamu.edu>, |
patterned after the PPC opcode table written by Ian Lance Taylor. |
This file is part of GDB, GAS, and the GNU binutils. |
GDB, GAS, and the GNU binutils are free software; you can redistribute |
them and/or modify them under the terms of the GNU General Public |
License as published by the Free Software Foundation; either version 3, |
or (at your option) any later version. |
GDB, GAS, and the GNU binutils are distributed in the hope that they |
will be useful, but WITHOUT ANY WARRANTY; without even the implied |
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See |
the GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this file; see the file COPYING3. If not, write to the Free |
Software Foundation, 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef OPCODE_ALPHA_H |
#define OPCODE_ALPHA_H |
/* The opcode table is an array of struct alpha_opcode. */ |
struct alpha_opcode |
{ |
/* The opcode name. */ |
const char *name; |
/* The opcode itself. Those bits which will be filled in with |
operands are zeroes. */ |
unsigned opcode; |
/* The opcode mask. This is used by the disassembler. This is a |
mask containing ones indicating those bits which must match the |
opcode field, and zeroes indicating those bits which need not |
match (and are presumably filled in by operands). */ |
unsigned mask; |
/* One bit flags for the opcode. These are primarily used to |
indicate specific processors and environments support the |
instructions. The defined values are listed below. */ |
unsigned flags; |
/* An array of operand codes. Each code is an index into the |
operand table. They appear in the order which the operands must |
appear in assembly code, and are terminated by a zero. */ |
unsigned char operands[4]; |
}; |
/* The table itself is sorted by major opcode number, and is otherwise |
in the order in which the disassembler should consider |
instructions. */ |
extern const struct alpha_opcode alpha_opcodes[]; |
extern const unsigned alpha_num_opcodes; |
/* Values defined for the flags field of a struct alpha_opcode. */ |
/* CPU Availability */ |
#define AXP_OPCODE_BASE 0x0001 /* Base architecture -- all cpus. */ |
#define AXP_OPCODE_EV4 0x0002 /* EV4 specific PALcode insns. */ |
#define AXP_OPCODE_EV5 0x0004 /* EV5 specific PALcode insns. */ |
#define AXP_OPCODE_EV6 0x0008 /* EV6 specific PALcode insns. */ |
#define AXP_OPCODE_BWX 0x0100 /* Byte/word extension (amask bit 0). */ |
#define AXP_OPCODE_CIX 0x0200 /* "Count" extension (amask bit 1). */ |
#define AXP_OPCODE_MAX 0x0400 /* Multimedia extension (amask bit 8). */ |
#define AXP_OPCODE_NOPAL (~(AXP_OPCODE_EV4|AXP_OPCODE_EV5|AXP_OPCODE_EV6)) |
/* A macro to extract the major opcode from an instruction. */ |
#define AXP_OP(i) (((i) >> 26) & 0x3F) |
/* The total number of major opcodes. */ |
#define AXP_NOPS 0x40 |
/* The operands table is an array of struct alpha_operand. */ |
struct alpha_operand |
{ |
/* The number of bits in the operand. */ |
unsigned int bits : 5; |
/* How far the operand is left shifted in the instruction. */ |
unsigned int shift : 5; |
/* The default relocation type for this operand. */ |
signed int default_reloc : 16; |
/* One bit syntax flags. */ |
unsigned int flags : 16; |
/* Insertion function. This is used by the assembler. To insert an |
operand value into an instruction, check this field. |
If it is NULL, execute |
i |= (op & ((1 << o->bits) - 1)) << o->shift; |
(i is the instruction which we are filling in, o is a pointer to |
this structure, and op is the opcode value; this assumes twos |
complement arithmetic). |
If this field is not NULL, then simply call it with the |
instruction and the operand value. It will return the new value |
of the instruction. If the ERRMSG argument is not NULL, then if |
the operand value is illegal, *ERRMSG will be set to a warning |
string (the operand will be inserted in any case). If the |
operand value is legal, *ERRMSG will be unchanged (most operands |
can accept any value). */ |
unsigned (*insert) (unsigned instruction, int op, const char **errmsg); |
/* Extraction function. This is used by the disassembler. To |
extract this operand type from an instruction, check this field. |
If it is NULL, compute |
op = ((i) >> o->shift) & ((1 << o->bits) - 1); |
if ((o->flags & AXP_OPERAND_SIGNED) != 0 |
&& (op & (1 << (o->bits - 1))) != 0) |
op -= 1 << o->bits; |
(i is the instruction, o is a pointer to this structure, and op |
is the result; this assumes twos complement arithmetic). |
If this field is not NULL, then simply call it with the |
instruction value. It will return the value of the operand. If |
the INVALID argument is not NULL, *INVALID will be set to |
non-zero if this operand type can not actually be extracted from |
this operand (i.e., the instruction does not match). If the |
operand is valid, *INVALID will not be changed. */ |
int (*extract) (unsigned instruction, int *invalid); |
}; |
/* Elements in the table are retrieved by indexing with values from |
the operands field of the alpha_opcodes table. */ |
extern const struct alpha_operand alpha_operands[]; |
extern const unsigned alpha_num_operands; |
/* Values defined for the flags field of a struct alpha_operand. */ |
/* Mask for selecting the type for typecheck purposes */ |
#define AXP_OPERAND_TYPECHECK_MASK \ |
(AXP_OPERAND_PARENS | AXP_OPERAND_COMMA | AXP_OPERAND_IR | \ |
AXP_OPERAND_FPR | AXP_OPERAND_RELATIVE | AXP_OPERAND_SIGNED | \ |
AXP_OPERAND_UNSIGNED) |
/* This operand does not actually exist in the assembler input. This |
is used to support extended mnemonics, for which two operands fields |
are identical. The assembler should call the insert function with |
any op value. The disassembler should call the extract function, |
ignore the return value, and check the value placed in the invalid |
argument. */ |
#define AXP_OPERAND_FAKE 01 |
/* The operand should be wrapped in parentheses rather than separated |
from the previous by a comma. This is used for the load and store |
instructions which want their operands to look like "Ra,disp(Rb)". */ |
#define AXP_OPERAND_PARENS 02 |
/* Used in combination with PARENS, this supresses the supression of |
the comma. This is used for "jmp Ra,(Rb),hint". */ |
#define AXP_OPERAND_COMMA 04 |
/* This operand names an integer register. */ |
#define AXP_OPERAND_IR 010 |
/* This operand names a floating point register. */ |
#define AXP_OPERAND_FPR 020 |
/* This operand is a relative branch displacement. The disassembler |
prints these symbolically if possible. */ |
#define AXP_OPERAND_RELATIVE 040 |
/* This operand takes signed values. */ |
#define AXP_OPERAND_SIGNED 0100 |
/* This operand takes unsigned values. This exists primarily so that |
a flags value of 0 can be treated as end-of-arguments. */ |
#define AXP_OPERAND_UNSIGNED 0200 |
/* Supress overflow detection on this field. This is used for hints. */ |
#define AXP_OPERAND_NOOVERFLOW 0400 |
/* Mask for optional argument default value. */ |
#define AXP_OPERAND_OPTIONAL_MASK 07000 |
/* This operand defaults to zero. This is used for jump hints. */ |
#define AXP_OPERAND_DEFAULT_ZERO 01000 |
/* This operand should default to the first (real) operand and is used |
in conjunction with AXP_OPERAND_OPTIONAL. This allows |
"and $0,3,$0" to be written as "and $0,3", etc. I don't like |
it, but it's what DEC does. */ |
#define AXP_OPERAND_DEFAULT_FIRST 02000 |
/* Similarly, this operand should default to the second (real) operand. |
This allows "negl $0" instead of "negl $0,$0". */ |
#define AXP_OPERAND_DEFAULT_SECOND 04000 |
/* Register common names */ |
#define AXP_REG_V0 0 |
#define AXP_REG_T0 1 |
#define AXP_REG_T1 2 |
#define AXP_REG_T2 3 |
#define AXP_REG_T3 4 |
#define AXP_REG_T4 5 |
#define AXP_REG_T5 6 |
#define AXP_REG_T6 7 |
#define AXP_REG_T7 8 |
#define AXP_REG_S0 9 |
#define AXP_REG_S1 10 |
#define AXP_REG_S2 11 |
#define AXP_REG_S3 12 |
#define AXP_REG_S4 13 |
#define AXP_REG_S5 14 |
#define AXP_REG_FP 15 |
#define AXP_REG_A0 16 |
#define AXP_REG_A1 17 |
#define AXP_REG_A2 18 |
#define AXP_REG_A3 19 |
#define AXP_REG_A4 20 |
#define AXP_REG_A5 21 |
#define AXP_REG_T8 22 |
#define AXP_REG_T9 23 |
#define AXP_REG_T10 24 |
#define AXP_REG_T11 25 |
#define AXP_REG_RA 26 |
#define AXP_REG_PV 27 |
#define AXP_REG_T12 27 |
#define AXP_REG_AT 28 |
#define AXP_REG_GP 29 |
#define AXP_REG_SP 30 |
#define AXP_REG_ZERO 31 |
#endif /* OPCODE_ALPHA_H */ |
/contrib/toolchain/binutils/include/opcode/arc.h |
---|
0,0 → 1,322 |
/* Opcode table for the ARC. |
Copyright 1994, 1995, 1997, 2001, 2002, 2003, 2010 |
Free Software Foundation, Inc. |
Contributed by Doug Evans (dje@cygnus.com). |
This file is part of GAS, the GNU Assembler, GDB, the GNU debugger, and |
the GNU Binutils. |
GAS/GDB is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3, or (at your option) |
any later version. |
GAS/GDB is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with GAS or GDB; see the file COPYING3. If not, write to |
the Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* List of the various cpu types. |
The tables currently use bit masks to say whether the instruction or |
whatever is supported by a particular cpu. This lets us have one entry |
apply to several cpus. |
The `base' cpu must be 0. The cpu type is treated independently of |
endianness. The complete `mach' number includes endianness. |
These values are internal to opcodes/bfd/binutils/gas. */ |
#define ARC_MACH_5 0 |
#define ARC_MACH_6 1 |
#define ARC_MACH_7 2 |
#define ARC_MACH_8 4 |
/* Additional cpu values can be inserted here and ARC_MACH_BIG moved down. */ |
#define ARC_MACH_BIG 16 |
/* Mask of number of bits necessary to record cpu type. */ |
#define ARC_MACH_CPU_MASK (ARC_MACH_BIG - 1) |
/* Mask of number of bits necessary to record cpu type + endianness. */ |
#define ARC_MACH_MASK ((ARC_MACH_BIG << 1) - 1) |
/* Type to denote an ARC instruction (at least a 32 bit unsigned int). */ |
typedef unsigned int arc_insn; |
struct arc_opcode { |
char *syntax; /* syntax of insn */ |
unsigned long mask, value; /* recognize insn if (op&mask) == value */ |
int flags; /* various flag bits */ |
/* Values for `flags'. */ |
/* Return CPU number, given flag bits. */ |
#define ARC_OPCODE_CPU(bits) ((bits) & ARC_MACH_CPU_MASK) |
/* Return MACH number, given flag bits. */ |
#define ARC_OPCODE_MACH(bits) ((bits) & ARC_MACH_MASK) |
/* First opcode flag bit available after machine mask. */ |
#define ARC_OPCODE_FLAG_START (ARC_MACH_MASK + 1) |
/* This insn is a conditional branch. */ |
#define ARC_OPCODE_COND_BRANCH (ARC_OPCODE_FLAG_START) |
#define SYNTAX_3OP (ARC_OPCODE_COND_BRANCH << 1) |
#define SYNTAX_LENGTH (SYNTAX_3OP ) |
#define SYNTAX_2OP (SYNTAX_3OP << 1) |
#define OP1_MUST_BE_IMM (SYNTAX_2OP << 1) |
#define OP1_IMM_IMPLIED (OP1_MUST_BE_IMM << 1) |
#define SYNTAX_VALID (OP1_IMM_IMPLIED << 1) |
#define I(x) (((x) & 31) << 27) |
#define A(x) (((x) & ARC_MASK_REG) << ARC_SHIFT_REGA) |
#define B(x) (((x) & ARC_MASK_REG) << ARC_SHIFT_REGB) |
#define C(x) (((x) & ARC_MASK_REG) << ARC_SHIFT_REGC) |
#define R(x,b,m) (((x) & (m)) << (b)) /* value X, mask M, at bit B */ |
/* These values are used to optimize assembly and disassembly. Each insn |
is on a list of related insns (same first letter for assembly, same |
insn code for disassembly). */ |
struct arc_opcode *next_asm; /* Next instr to try during assembly. */ |
struct arc_opcode *next_dis; /* Next instr to try during disassembly. */ |
/* Macros to create the hash values for the lists. */ |
#define ARC_HASH_OPCODE(string) \ |
((string)[0] >= 'a' && (string)[0] <= 'z' ? (string)[0] - 'a' : 26) |
#define ARC_HASH_ICODE(insn) \ |
((unsigned int) (insn) >> 27) |
/* Macros to access `next_asm', `next_dis' so users needn't care about the |
underlying mechanism. */ |
#define ARC_OPCODE_NEXT_ASM(op) ((op)->next_asm) |
#define ARC_OPCODE_NEXT_DIS(op) ((op)->next_dis) |
}; |
/* this is an "insert at front" linked list per Metaware spec |
that new definitions override older ones. */ |
extern struct arc_opcode *arc_ext_opcodes; |
struct arc_operand_value { |
char *name; /* eg: "eq" */ |
short value; /* eg: 1 */ |
unsigned char type; /* index into `arc_operands' */ |
unsigned char flags; /* various flag bits */ |
/* Values for `flags'. */ |
/* Return CPU number, given flag bits. */ |
#define ARC_OPVAL_CPU(bits) ((bits) & ARC_MACH_CPU_MASK) |
/* Return MACH number, given flag bits. */ |
#define ARC_OPVAL_MACH(bits) ((bits) & ARC_MACH_MASK) |
}; |
struct arc_ext_operand_value { |
struct arc_ext_operand_value *next; |
struct arc_operand_value operand; |
}; |
extern struct arc_ext_operand_value *arc_ext_operands; |
struct arc_operand { |
/* One of the insn format chars. */ |
unsigned char fmt; |
/* The number of bits in the operand (may be unused for a modifier). */ |
unsigned char bits; |
/* How far the operand is left shifted in the instruction, or |
the modifier's flag bit (may be unused for a modifier. */ |
unsigned char shift; |
/* Various flag bits. */ |
int flags; |
/* Values for `flags'. */ |
/* This operand is a suffix to the opcode. */ |
#define ARC_OPERAND_SUFFIX 1 |
/* This operand is a relative branch displacement. The disassembler |
prints these symbolically if possible. */ |
#define ARC_OPERAND_RELATIVE_BRANCH 2 |
/* This operand is an absolute branch address. The disassembler |
prints these symbolically if possible. */ |
#define ARC_OPERAND_ABSOLUTE_BRANCH 4 |
/* This operand is an address. The disassembler |
prints these symbolically if possible. */ |
#define ARC_OPERAND_ADDRESS 8 |
/* This operand is a long immediate value. */ |
#define ARC_OPERAND_LIMM 0x10 |
/* This operand takes signed values. */ |
#define ARC_OPERAND_SIGNED 0x20 |
/* This operand takes signed values, but also accepts a full positive |
range of values. That is, if bits is 16, it takes any value from |
-0x8000 to 0xffff. */ |
#define ARC_OPERAND_SIGNOPT 0x40 |
/* This operand should be regarded as a negative number for the |
purposes of overflow checking (i.e., the normal most negative |
number is disallowed and one more than the normal most positive |
number is allowed). This flag will only be set for a signed |
operand. */ |
#define ARC_OPERAND_NEGATIVE 0x80 |
/* This operand doesn't really exist. The program uses these operands |
in special ways. */ |
#define ARC_OPERAND_FAKE 0x100 |
/* separate flags operand for j and jl instructions */ |
#define ARC_OPERAND_JUMPFLAGS 0x200 |
/* allow warnings and errors to be issued after call to insert_xxxxxx */ |
#define ARC_OPERAND_WARN 0x400 |
#define ARC_OPERAND_ERROR 0x800 |
/* this is a load operand */ |
#define ARC_OPERAND_LOAD 0x8000 |
/* this is a store operand */ |
#define ARC_OPERAND_STORE 0x10000 |
/* Modifier values. */ |
/* A dot is required before a suffix. Eg: .le */ |
#define ARC_MOD_DOT 0x1000 |
/* A normal register is allowed (not used, but here for completeness). */ |
#define ARC_MOD_REG 0x2000 |
/* An auxiliary register name is expected. */ |
#define ARC_MOD_AUXREG 0x4000 |
/* Sum of all ARC_MOD_XXX bits. */ |
#define ARC_MOD_BITS 0x7000 |
/* Non-zero if the operand type is really a modifier. */ |
#define ARC_MOD_P(X) ((X) & ARC_MOD_BITS) |
/* enforce read/write only register restrictions */ |
#define ARC_REGISTER_READONLY 0x01 |
#define ARC_REGISTER_WRITEONLY 0x02 |
#define ARC_REGISTER_NOSHORT_CUT 0x04 |
/* Insertion function. This is used by the assembler. To insert an |
operand value into an instruction, check this field. |
If it is NULL, execute |
i |= (p & ((1 << o->bits) - 1)) << o->shift; |
(I is the instruction which we are filling in, O is a pointer to |
this structure, and OP is the opcode value; this assumes twos |
complement arithmetic). |
If this field is not NULL, then simply call it with the |
instruction and the operand value. It will return the new value |
of the instruction. If the ERRMSG argument is not NULL, then if |
the operand value is illegal, *ERRMSG will be set to a warning |
string (the operand will be inserted in any case). If the |
operand value is legal, *ERRMSG will be unchanged. |
REG is non-NULL when inserting a register value. */ |
arc_insn (*insert) |
(arc_insn insn, const struct arc_operand *operand, int mods, |
const struct arc_operand_value *reg, long value, const char **errmsg); |
/* Extraction function. This is used by the disassembler. To |
extract this operand type from an instruction, check this field. |
If it is NULL, compute |
op = ((i) >> o->shift) & ((1 << o->bits) - 1); |
if ((o->flags & ARC_OPERAND_SIGNED) != 0 |
&& (op & (1 << (o->bits - 1))) != 0) |
op -= 1 << o->bits; |
(I is the instruction, O is a pointer to this structure, and OP |
is the result; this assumes twos complement arithmetic). |
If this field is not NULL, then simply call it with the |
instruction value. It will return the value of the operand. If |
the INVALID argument is not NULL, *INVALID will be set to |
non-zero if this operand type can not actually be extracted from |
this operand (i.e., the instruction does not match). If the |
operand is valid, *INVALID will not be changed. |
INSN is a pointer to an array of two `arc_insn's. The first element is |
the insn, the second is the limm if present. |
Operands that have a printable form like registers and suffixes have |
their struct arc_operand_value pointer stored in OPVAL. */ |
long (*extract) |
(arc_insn *insn, const struct arc_operand *operand, int mods, |
const struct arc_operand_value **opval, int *invalid); |
}; |
/* Bits that say what version of cpu we have. These should be passed to |
arc_init_opcode_tables. At present, all there is is the cpu type. */ |
/* CPU number, given value passed to `arc_init_opcode_tables'. */ |
#define ARC_HAVE_CPU(bits) ((bits) & ARC_MACH_CPU_MASK) |
/* MACH number, given value passed to `arc_init_opcode_tables'. */ |
#define ARC_HAVE_MACH(bits) ((bits) & ARC_MACH_MASK) |
/* Special register values: */ |
#define ARC_REG_SHIMM_UPDATE 61 |
#define ARC_REG_SHIMM 63 |
#define ARC_REG_LIMM 62 |
/* Non-zero if REG is a constant marker. */ |
#define ARC_REG_CONSTANT_P(REG) ((REG) >= 61) |
/* Positions and masks of various fields: */ |
#define ARC_SHIFT_REGA 21 |
#define ARC_SHIFT_REGB 15 |
#define ARC_SHIFT_REGC 9 |
#define ARC_MASK_REG 63 |
/* Delay slot types. */ |
#define ARC_DELAY_NONE 0 /* no delay slot */ |
#define ARC_DELAY_NORMAL 1 /* delay slot in both cases */ |
#define ARC_DELAY_JUMP 2 /* delay slot only if branch taken */ |
/* Non-zero if X will fit in a signed 9 bit field. */ |
#define ARC_SHIMM_CONST_P(x) ((long) (x) >= -256 && (long) (x) <= 255) |
extern const struct arc_operand arc_operands[]; |
extern const int arc_operand_count; |
extern struct arc_opcode arc_opcodes[]; |
extern const int arc_opcodes_count; |
extern const struct arc_operand_value arc_suffixes[]; |
extern const int arc_suffixes_count; |
extern const struct arc_operand_value arc_reg_names[]; |
extern const int arc_reg_names_count; |
extern unsigned char arc_operand_map[]; |
/* Utility fns in arc-opc.c. */ |
int arc_get_opcode_mach (int, int); |
/* `arc_opcode_init_tables' must be called before `arc_xxx_supported'. */ |
void arc_opcode_init_tables (int); |
void arc_opcode_init_insert (void); |
void arc_opcode_init_extract (void); |
const struct arc_opcode *arc_opcode_lookup_asm (const char *); |
const struct arc_opcode *arc_opcode_lookup_dis (unsigned int); |
int arc_opcode_limm_p (long *); |
const struct arc_operand_value *arc_opcode_lookup_suffix |
(const struct arc_operand *type, int value); |
int arc_opcode_supported (const struct arc_opcode *); |
int arc_opval_supported (const struct arc_operand_value *); |
int arc_limm_fixup_adjust (arc_insn); |
int arc_insn_is_j (arc_insn); |
int arc_insn_not_jl (arc_insn); |
int arc_operand_type (int); |
struct arc_operand_value *get_ext_suffix (char *); |
int arc_get_noshortcut_flag (void); |
/contrib/toolchain/binutils/include/opcode/arm.h |
---|
0,0 → 1,287 |
/* ARM assembler/disassembler support. |
Copyright 2004, 2010, 2011 Free Software Foundation, Inc. |
This file is part of GDB and GAS. |
GDB and GAS are free software; you can redistribute it and/or |
modify it under the terms of the GNU General Public License as |
published by the Free Software Foundation; either version 3, or (at |
your option) any later version. |
GDB and GAS are distributed in the hope that it will be useful, but |
WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with GDB or GAS; see the file COPYING3. If not, write to the |
Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* The following bitmasks control CPU extensions: */ |
#define ARM_EXT_V1 0x00000001 /* All processors (core set). */ |
#define ARM_EXT_V2 0x00000002 /* Multiply instructions. */ |
#define ARM_EXT_V2S 0x00000004 /* SWP instructions. */ |
#define ARM_EXT_V3 0x00000008 /* MSR MRS. */ |
#define ARM_EXT_V3M 0x00000010 /* Allow long multiplies. */ |
#define ARM_EXT_V4 0x00000020 /* Allow half word loads. */ |
#define ARM_EXT_V4T 0x00000040 /* Thumb. */ |
#define ARM_EXT_V5 0x00000080 /* Allow CLZ, etc. */ |
#define ARM_EXT_V5T 0x00000100 /* Improved interworking. */ |
#define ARM_EXT_V5ExP 0x00000200 /* DSP core set. */ |
#define ARM_EXT_V5E 0x00000400 /* DSP Double transfers. */ |
#define ARM_EXT_V5J 0x00000800 /* Jazelle extension. */ |
#define ARM_EXT_V6 0x00001000 /* ARM V6. */ |
#define ARM_EXT_V6K 0x00002000 /* ARM V6K. */ |
/* 0x00004000 Was ARM V6Z. */ |
#define ARM_EXT_V8 0x00004000 /* is now ARMv8. */ |
#define ARM_EXT_V6T2 0x00008000 /* Thumb-2. */ |
#define ARM_EXT_DIV 0x00010000 /* Integer division. */ |
/* The 'M' in Arm V7M stands for Microcontroller. |
On earlier architecture variants it stands for Multiply. */ |
#define ARM_EXT_V5E_NOTM 0x00020000 /* Arm V5E but not Arm V7M. */ |
#define ARM_EXT_V6_NOTM 0x00040000 /* Arm V6 but not Arm V7M. */ |
#define ARM_EXT_V7 0x00080000 /* Arm V7. */ |
#define ARM_EXT_V7A 0x00100000 /* Arm V7A. */ |
#define ARM_EXT_V7R 0x00200000 /* Arm V7R. */ |
#define ARM_EXT_V7M 0x00400000 /* Arm V7M. */ |
#define ARM_EXT_V6M 0x00800000 /* ARM V6M. */ |
#define ARM_EXT_BARRIER 0x01000000 /* DSB/DMB/ISB. */ |
#define ARM_EXT_THUMB_MSR 0x02000000 /* Thumb MSR/MRS. */ |
#define ARM_EXT_V6_DSP 0x04000000 /* ARM v6 (DSP-related), |
not in v7-M. */ |
#define ARM_EXT_MP 0x08000000 /* Multiprocessing Extensions. */ |
#define ARM_EXT_SEC 0x10000000 /* Security extensions. */ |
#define ARM_EXT_OS 0x20000000 /* OS Extensions. */ |
#define ARM_EXT_ADIV 0x40000000 /* Integer divide extensions in ARM |
state. */ |
#define ARM_EXT_VIRT 0x80000000 /* Virtualization extensions. */ |
/* Co-processor space extensions. */ |
#define ARM_CEXT_XSCALE 0x00000001 /* Allow MIA etc. */ |
#define ARM_CEXT_MAVERICK 0x00000002 /* Use Cirrus/DSP coprocessor. */ |
#define ARM_CEXT_IWMMXT 0x00000004 /* Intel Wireless MMX technology coprocessor. */ |
#define ARM_CEXT_IWMMXT2 0x00000008 /* Intel Wireless MMX technology coprocessor version 2. */ |
#define FPU_ENDIAN_PURE 0x80000000 /* Pure-endian doubles. */ |
#define FPU_ENDIAN_BIG 0 /* Double words-big-endian. */ |
#define FPU_FPA_EXT_V1 0x40000000 /* Base FPA instruction set. */ |
#define FPU_FPA_EXT_V2 0x20000000 /* LFM/SFM. */ |
#define FPU_MAVERICK 0x10000000 /* Cirrus Maverick. */ |
#define FPU_VFP_EXT_V1xD 0x08000000 /* Base VFP instruction set. */ |
#define FPU_VFP_EXT_V1 0x04000000 /* Double-precision insns. */ |
#define FPU_VFP_EXT_V2 0x02000000 /* ARM10E VFPr1. */ |
#define FPU_VFP_EXT_V3xD 0x01000000 /* VFPv3 single-precision. */ |
#define FPU_VFP_EXT_V3 0x00800000 /* VFPv3 double-precision. */ |
#define FPU_NEON_EXT_V1 0x00400000 /* Neon (SIMD) insns. */ |
#define FPU_VFP_EXT_D32 0x00200000 /* Registers D16-D31. */ |
#define FPU_VFP_EXT_FP16 0x00100000 /* Half-precision extensions. */ |
#define FPU_NEON_EXT_FMA 0x00080000 /* Neon fused multiply-add */ |
#define FPU_VFP_EXT_FMA 0x00040000 /* VFP fused multiply-add */ |
#define FPU_VFP_EXT_ARMV8 0x00020000 /* FP for ARMv8. */ |
#define FPU_NEON_EXT_ARMV8 0x00010000 /* Neon for ARMv8. */ |
#define FPU_CRYPTO_EXT_ARMV8 0x00008000 /* Crypto for ARMv8. */ |
#define CRC_EXT_ARMV8 0x00004000 /* CRC32 for ARMv8. */ |
/* Architectures are the sum of the base and extensions. The ARM ARM (rev E) |
defines the following: ARMv3, ARMv3M, ARMv4xM, ARMv4, ARMv4TxM, ARMv4T, |
ARMv5xM, ARMv5, ARMv5TxM, ARMv5T, ARMv5TExP, ARMv5TE. To these we add |
three more to cover cores prior to ARM6. Finally, there are cores which |
implement further extensions in the co-processor space. */ |
#define ARM_AEXT_V1 ARM_EXT_V1 |
#define ARM_AEXT_V2 (ARM_AEXT_V1 | ARM_EXT_V2) |
#define ARM_AEXT_V2S (ARM_AEXT_V2 | ARM_EXT_V2S) |
#define ARM_AEXT_V3 (ARM_AEXT_V2S | ARM_EXT_V3) |
#define ARM_AEXT_V3M (ARM_AEXT_V3 | ARM_EXT_V3M) |
#define ARM_AEXT_V4xM (ARM_AEXT_V3 | ARM_EXT_V4) |
#define ARM_AEXT_V4 (ARM_AEXT_V3M | ARM_EXT_V4) |
#define ARM_AEXT_V4TxM (ARM_AEXT_V4xM | ARM_EXT_V4T) |
#define ARM_AEXT_V4T (ARM_AEXT_V4 | ARM_EXT_V4T) |
#define ARM_AEXT_V5xM (ARM_AEXT_V4xM | ARM_EXT_V5) |
#define ARM_AEXT_V5 (ARM_AEXT_V4 | ARM_EXT_V5) |
#define ARM_AEXT_V5TxM (ARM_AEXT_V5xM | ARM_EXT_V4T | ARM_EXT_V5T) |
#define ARM_AEXT_V5T (ARM_AEXT_V5 | ARM_EXT_V4T | ARM_EXT_V5T) |
#define ARM_AEXT_V5TExP (ARM_AEXT_V5T | ARM_EXT_V5ExP) |
#define ARM_AEXT_V5TE (ARM_AEXT_V5TExP | ARM_EXT_V5E) |
#define ARM_AEXT_V5TEJ (ARM_AEXT_V5TE | ARM_EXT_V5J) |
#define ARM_AEXT_V6 (ARM_AEXT_V5TEJ | ARM_EXT_V6) |
#define ARM_AEXT_V6K (ARM_AEXT_V6 | ARM_EXT_V6K) |
#define ARM_AEXT_V6Z (ARM_AEXT_V6K | ARM_EXT_SEC) |
#define ARM_AEXT_V6ZK (ARM_AEXT_V6K | ARM_EXT_SEC) |
#define ARM_AEXT_V6T2 (ARM_AEXT_V6 \ |
| ARM_EXT_V6T2 | ARM_EXT_V6_NOTM | ARM_EXT_THUMB_MSR \ |
| ARM_EXT_V6_DSP ) |
#define ARM_AEXT_V6KT2 (ARM_AEXT_V6T2 | ARM_EXT_V6K) |
#define ARM_AEXT_V6ZT2 (ARM_AEXT_V6T2 | ARM_EXT_SEC) |
#define ARM_AEXT_V6ZKT2 (ARM_AEXT_V6T2 | ARM_EXT_V6K | ARM_EXT_SEC) |
#define ARM_AEXT_V7_ARM (ARM_AEXT_V6KT2 | ARM_EXT_V7 | ARM_EXT_BARRIER) |
#define ARM_AEXT_V7A (ARM_AEXT_V7_ARM | ARM_EXT_V7A) |
#define ARM_AEXT_V7VE (ARM_AEXT_V7A | ARM_EXT_DIV | ARM_EXT_ADIV \ |
| ARM_EXT_VIRT | ARM_EXT_SEC | ARM_EXT_MP) |
#define ARM_AEXT_V7R (ARM_AEXT_V7_ARM | ARM_EXT_V7R | ARM_EXT_DIV) |
#define ARM_AEXT_NOTM \ |
(ARM_AEXT_V4 | ARM_EXT_V5ExP | ARM_EXT_V5J | ARM_EXT_V6_NOTM \ |
| ARM_EXT_V6_DSP ) |
#define ARM_AEXT_V6M_ONLY \ |
((ARM_EXT_BARRIER | ARM_EXT_V6M | ARM_EXT_THUMB_MSR) & ~(ARM_AEXT_NOTM)) |
#define ARM_AEXT_V6M \ |
((ARM_AEXT_V6K | ARM_AEXT_V6M_ONLY) & ~(ARM_AEXT_NOTM)) |
#define ARM_AEXT_V6SM (ARM_AEXT_V6M | ARM_EXT_OS) |
#define ARM_AEXT_V7M \ |
((ARM_AEXT_V7_ARM | ARM_EXT_V6M | ARM_EXT_V7M | ARM_EXT_DIV) \ |
& ~(ARM_AEXT_NOTM)) |
#define ARM_AEXT_V7 (ARM_AEXT_V7A & ARM_AEXT_V7R & ARM_AEXT_V7M) |
#define ARM_AEXT_V7EM \ |
(ARM_AEXT_V7M | ARM_EXT_V5ExP | ARM_EXT_V6_DSP) |
#define ARM_AEXT_V8A \ |
(ARM_AEXT_V7A | ARM_EXT_MP | ARM_EXT_SEC | ARM_EXT_DIV | ARM_EXT_ADIV \ |
| ARM_EXT_VIRT | ARM_EXT_V8) |
/* Processors with specific extensions in the co-processor space. */ |
#define ARM_ARCH_XSCALE ARM_FEATURE (ARM_AEXT_V5TE, ARM_CEXT_XSCALE) |
#define ARM_ARCH_IWMMXT \ |
ARM_FEATURE (ARM_AEXT_V5TE, ARM_CEXT_XSCALE | ARM_CEXT_IWMMXT) |
#define ARM_ARCH_IWMMXT2 \ |
ARM_FEATURE (ARM_AEXT_V5TE, ARM_CEXT_XSCALE | ARM_CEXT_IWMMXT | ARM_CEXT_IWMMXT2) |
#define FPU_VFP_V1xD (FPU_VFP_EXT_V1xD | FPU_ENDIAN_PURE) |
#define FPU_VFP_V1 (FPU_VFP_V1xD | FPU_VFP_EXT_V1) |
#define FPU_VFP_V2 (FPU_VFP_V1 | FPU_VFP_EXT_V2) |
#define FPU_VFP_V3D16 (FPU_VFP_V2 | FPU_VFP_EXT_V3xD | FPU_VFP_EXT_V3) |
#define FPU_VFP_V3 (FPU_VFP_V3D16 | FPU_VFP_EXT_D32) |
#define FPU_VFP_V3xD (FPU_VFP_V1xD | FPU_VFP_EXT_V2 | FPU_VFP_EXT_V3xD) |
#define FPU_VFP_V4D16 (FPU_VFP_V3D16 | FPU_VFP_EXT_FP16 | FPU_VFP_EXT_FMA) |
#define FPU_VFP_V4 (FPU_VFP_V3 | FPU_VFP_EXT_FP16 | FPU_VFP_EXT_FMA) |
#define FPU_VFP_V4_SP_D16 (FPU_VFP_V3xD | FPU_VFP_EXT_FP16 | FPU_VFP_EXT_FMA) |
#define FPU_VFP_ARMV8 (FPU_VFP_V4 | FPU_VFP_EXT_ARMV8) |
#define FPU_NEON_ARMV8 (FPU_NEON_EXT_V1 | FPU_NEON_EXT_FMA | FPU_NEON_EXT_ARMV8) |
#define FPU_CRYPTO_ARMV8 (FPU_CRYPTO_EXT_ARMV8) |
#define FPU_VFP_HARD (FPU_VFP_EXT_V1xD | FPU_VFP_EXT_V1 | FPU_VFP_EXT_V2 \ |
| FPU_VFP_EXT_V3xD | FPU_VFP_EXT_FMA | FPU_NEON_EXT_FMA \ |
| FPU_VFP_EXT_V3 | FPU_NEON_EXT_V1 | FPU_VFP_EXT_D32) |
#define FPU_FPA (FPU_FPA_EXT_V1 | FPU_FPA_EXT_V2) |
/* Deprecated. */ |
#define FPU_ARCH_VFP ARM_FEATURE (0, FPU_ENDIAN_PURE) |
#define FPU_ARCH_FPE ARM_FEATURE (0, FPU_FPA_EXT_V1) |
#define FPU_ARCH_FPA ARM_FEATURE (0, FPU_FPA) |
#define FPU_ARCH_VFP_V1xD ARM_FEATURE (0, FPU_VFP_V1xD) |
#define FPU_ARCH_VFP_V1 ARM_FEATURE (0, FPU_VFP_V1) |
#define FPU_ARCH_VFP_V2 ARM_FEATURE (0, FPU_VFP_V2) |
#define FPU_ARCH_VFP_V3D16 ARM_FEATURE (0, FPU_VFP_V3D16) |
#define FPU_ARCH_VFP_V3D16_FP16 \ |
ARM_FEATURE (0, FPU_VFP_V3D16 | FPU_VFP_EXT_FP16) |
#define FPU_ARCH_VFP_V3 ARM_FEATURE (0, FPU_VFP_V3) |
#define FPU_ARCH_VFP_V3_FP16 ARM_FEATURE (0, FPU_VFP_V3 | FPU_VFP_EXT_FP16) |
#define FPU_ARCH_VFP_V3xD ARM_FEATURE (0, FPU_VFP_V3xD) |
#define FPU_ARCH_VFP_V3xD_FP16 ARM_FEATURE (0, FPU_VFP_V3xD | FPU_VFP_EXT_FP16) |
#define FPU_ARCH_NEON_V1 ARM_FEATURE (0, FPU_NEON_EXT_V1) |
#define FPU_ARCH_VFP_V3_PLUS_NEON_V1 \ |
ARM_FEATURE (0, FPU_VFP_V3 | FPU_NEON_EXT_V1) |
#define FPU_ARCH_NEON_FP16 \ |
ARM_FEATURE (0, FPU_VFP_V3 | FPU_NEON_EXT_V1 | FPU_VFP_EXT_FP16) |
#define FPU_ARCH_VFP_HARD ARM_FEATURE (0, FPU_VFP_HARD) |
#define FPU_ARCH_VFP_V4 ARM_FEATURE(0, FPU_VFP_V4) |
#define FPU_ARCH_VFP_V4D16 ARM_FEATURE(0, FPU_VFP_V4D16) |
#define FPU_ARCH_VFP_V4_SP_D16 ARM_FEATURE(0, FPU_VFP_V4_SP_D16) |
#define FPU_ARCH_NEON_VFP_V4 \ |
ARM_FEATURE(0, FPU_VFP_V4 | FPU_NEON_EXT_V1 | FPU_NEON_EXT_FMA) |
#define FPU_ARCH_VFP_ARMV8 ARM_FEATURE(0, FPU_VFP_ARMV8) |
#define FPU_ARCH_NEON_VFP_ARMV8 ARM_FEATURE(0, FPU_NEON_ARMV8 | FPU_VFP_ARMV8) |
#define FPU_ARCH_CRYPTO_NEON_VFP_ARMV8 \ |
ARM_FEATURE(0, FPU_CRYPTO_ARMV8 | FPU_NEON_ARMV8 | FPU_VFP_ARMV8) |
#define ARCH_CRC_ARMV8 ARM_FEATURE(0, CRC_EXT_ARMV8) |
#define FPU_ARCH_ENDIAN_PURE ARM_FEATURE (0, FPU_ENDIAN_PURE) |
#define FPU_ARCH_MAVERICK ARM_FEATURE (0, FPU_MAVERICK) |
#define ARM_ARCH_V1 ARM_FEATURE (ARM_AEXT_V1, 0) |
#define ARM_ARCH_V2 ARM_FEATURE (ARM_AEXT_V2, 0) |
#define ARM_ARCH_V2S ARM_FEATURE (ARM_AEXT_V2S, 0) |
#define ARM_ARCH_V3 ARM_FEATURE (ARM_AEXT_V3, 0) |
#define ARM_ARCH_V3M ARM_FEATURE (ARM_AEXT_V3M, 0) |
#define ARM_ARCH_V4xM ARM_FEATURE (ARM_AEXT_V4xM, 0) |
#define ARM_ARCH_V4 ARM_FEATURE (ARM_AEXT_V4, 0) |
#define ARM_ARCH_V4TxM ARM_FEATURE (ARM_AEXT_V4TxM, 0) |
#define ARM_ARCH_V4T ARM_FEATURE (ARM_AEXT_V4T, 0) |
#define ARM_ARCH_V5xM ARM_FEATURE (ARM_AEXT_V5xM, 0) |
#define ARM_ARCH_V5 ARM_FEATURE (ARM_AEXT_V5, 0) |
#define ARM_ARCH_V5TxM ARM_FEATURE (ARM_AEXT_V5TxM, 0) |
#define ARM_ARCH_V5T ARM_FEATURE (ARM_AEXT_V5T, 0) |
#define ARM_ARCH_V5TExP ARM_FEATURE (ARM_AEXT_V5TExP, 0) |
#define ARM_ARCH_V5TE ARM_FEATURE (ARM_AEXT_V5TE, 0) |
#define ARM_ARCH_V5TEJ ARM_FEATURE (ARM_AEXT_V5TEJ, 0) |
#define ARM_ARCH_V6 ARM_FEATURE (ARM_AEXT_V6, 0) |
#define ARM_ARCH_V6K ARM_FEATURE (ARM_AEXT_V6K, 0) |
#define ARM_ARCH_V6Z ARM_FEATURE (ARM_AEXT_V6Z, 0) |
#define ARM_ARCH_V6ZK ARM_FEATURE (ARM_AEXT_V6ZK, 0) |
#define ARM_ARCH_V6T2 ARM_FEATURE (ARM_AEXT_V6T2, 0) |
#define ARM_ARCH_V6KT2 ARM_FEATURE (ARM_AEXT_V6KT2, 0) |
#define ARM_ARCH_V6ZT2 ARM_FEATURE (ARM_AEXT_V6ZT2, 0) |
#define ARM_ARCH_V6ZKT2 ARM_FEATURE (ARM_AEXT_V6ZKT2, 0) |
#define ARM_ARCH_V6M ARM_FEATURE (ARM_AEXT_V6M, 0) |
#define ARM_ARCH_V6SM ARM_FEATURE (ARM_AEXT_V6SM, 0) |
#define ARM_ARCH_V7 ARM_FEATURE (ARM_AEXT_V7, 0) |
#define ARM_ARCH_V7A ARM_FEATURE (ARM_AEXT_V7A, 0) |
#define ARM_ARCH_V7VE ARM_FEATURE (ARM_AEXT_V7VE, 0) |
#define ARM_ARCH_V7R ARM_FEATURE (ARM_AEXT_V7R, 0) |
#define ARM_ARCH_V7M ARM_FEATURE (ARM_AEXT_V7M, 0) |
#define ARM_ARCH_V7EM ARM_FEATURE (ARM_AEXT_V7EM, 0) |
#define ARM_ARCH_V8A ARM_FEATURE (ARM_AEXT_V8A, 0) |
/* Some useful combinations: */ |
#define ARM_ARCH_NONE ARM_FEATURE (0, 0) |
#define FPU_NONE ARM_FEATURE (0, 0) |
#define ARM_ANY ARM_FEATURE (-1, 0) /* Any basic core. */ |
#define FPU_ANY_HARD ARM_FEATURE (0, FPU_FPA | FPU_VFP_HARD | FPU_MAVERICK) |
#define ARM_ARCH_THUMB2 ARM_FEATURE (ARM_EXT_V6T2 | ARM_EXT_V7 | ARM_EXT_V7A | ARM_EXT_V7R | ARM_EXT_V7M | ARM_EXT_DIV, 0) |
/* v7-a+sec. */ |
#define ARM_ARCH_V7A_SEC ARM_FEATURE (ARM_AEXT_V7A | ARM_EXT_SEC, 0) |
/* v7-a+mp+sec. */ |
#define ARM_ARCH_V7A_MP_SEC \ |
ARM_FEATURE (ARM_AEXT_V7A | ARM_EXT_MP | ARM_EXT_SEC, \ |
0) |
/* v7-r+idiv. */ |
#define ARM_ARCH_V7R_IDIV ARM_FEATURE (ARM_AEXT_V7R | ARM_EXT_ADIV, 0) |
/* Features that are present in v6M and v6S-M but not other v6 cores. */ |
#define ARM_ARCH_V6M_ONLY ARM_FEATURE (ARM_AEXT_V6M_ONLY, 0) |
/* v8-a+fp. */ |
#define ARM_ARCH_V8A_FP ARM_FEATURE (ARM_AEXT_V8A, FPU_ARCH_VFP_ARMV8) |
/* v8-a+simd (implies fp). */ |
#define ARM_ARCH_V8A_SIMD ARM_FEATURE (ARM_AEXT_V8A, \ |
FPU_ARCH_NEON_VFP_ARMV8) |
/* v8-a+crypto (implies simd+fp). */ |
#define ARM_ARCH_V8A_CRYPTOV1 ARM_FEATURE (ARM_AEXT_V8A, \ |
FPU_ARCH_CRYPTO_NEON_VFP_ARMV8) |
/* There are too many feature bits to fit in a single word, so use a |
structure. For simplicity we put all core features in one word and |
everything else in the other. */ |
typedef struct |
{ |
unsigned long core; |
unsigned long coproc; |
} arm_feature_set; |
#define ARM_CPU_HAS_FEATURE(CPU,FEAT) \ |
(((CPU).core & (FEAT).core) != 0 || ((CPU).coproc & (FEAT).coproc) != 0) |
#define ARM_CPU_IS_ANY(CPU) \ |
((CPU).core == ((arm_feature_set)ARM_ANY).core) |
#define ARM_MERGE_FEATURE_SETS(TARG,F1,F2) \ |
do { \ |
(TARG).core = (F1).core | (F2).core; \ |
(TARG).coproc = (F1).coproc | (F2).coproc; \ |
} while (0) |
#define ARM_CLEAR_FEATURE(TARG,F1,F2) \ |
do { \ |
(TARG).core = (F1).core &~ (F2).core; \ |
(TARG).coproc = (F1).coproc &~ (F2).coproc; \ |
} while (0) |
#define ARM_FEATURE(core, coproc) {(core), (coproc)} |
/contrib/toolchain/binutils/include/opcode/avr.h |
---|
0,0 → 1,300 |
/* Opcode table for the Atmel AVR micro controllers. |
Copyright 2000, 2001, 2004, 2006, 2008, 2010, 2012 Free Software Foundation, Inc. |
Contributed by Denis Chertykov <denisc@overta.ru> |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3, or (at your option) |
any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#define AVR_ISA_1200 0x0001 /* In the beginning there was ... */ |
#define AVR_ISA_LPM 0x0002 /* device has LPM */ |
#define AVR_ISA_LPMX 0x0004 /* device has LPM Rd,Z[+] */ |
#define AVR_ISA_SRAM 0x0008 /* device has SRAM (LD, ST, PUSH, POP, ...) */ |
#define AVR_ISA_MEGA 0x0020 /* device has >8K program memory (JMP and CALL |
supported, no 8K wrap on RJMP and RCALL) */ |
#define AVR_ISA_MUL 0x0040 /* device has new core (MUL, FMUL, ...) */ |
#define AVR_ISA_ELPM 0x0080 /* device has >64K program memory (ELPM) */ |
#define AVR_ISA_ELPMX 0x0100 /* device has ELPM Rd,Z[+] */ |
#define AVR_ISA_SPM 0x0200 /* device can program itself */ |
#define AVR_ISA_BRK 0x0400 /* device has BREAK (on-chip debug) */ |
#define AVR_ISA_EIND 0x0800 /* device has >128K program memory (none yet) */ |
#define AVR_ISA_MOVW 0x1000 /* device has MOVW */ |
#define AVR_ISA_SPMX 0x2000 /* device has SPM Z[+] */ |
#define AVR_ISA_DES 0x4000 /* device has DES */ |
#define AVR_ISA_RMW 0x8000 /* device has RMW instructions XCH,LAC,LAS,LAT */ |
#define AVR_ISA_TINY1 (AVR_ISA_1200 | AVR_ISA_LPM) |
#define AVR_ISA_2xxx (AVR_ISA_TINY1 | AVR_ISA_SRAM) |
/* For the attiny26 which is missing LPM Rd,Z+. */ |
#define AVR_ISA_2xxe (AVR_ISA_2xxx | AVR_ISA_LPMX) |
#define AVR_ISA_RF401 (AVR_ISA_2xxx | AVR_ISA_MOVW | AVR_ISA_LPMX) |
#define AVR_ISA_TINY2 (AVR_ISA_2xxx | AVR_ISA_MOVW | AVR_ISA_LPMX | \ |
AVR_ISA_SPM | AVR_ISA_BRK) |
#define AVR_ISA_M603 (AVR_ISA_2xxx | AVR_ISA_MEGA) |
#define AVR_ISA_M103 (AVR_ISA_M603 | AVR_ISA_ELPM) |
#define AVR_ISA_M8 (AVR_ISA_2xxx | AVR_ISA_MUL | AVR_ISA_MOVW | \ |
AVR_ISA_LPMX | AVR_ISA_SPM) |
#define AVR_ISA_PWMx (AVR_ISA_M8 | AVR_ISA_BRK) |
#define AVR_ISA_M161 (AVR_ISA_M603 | AVR_ISA_MUL | AVR_ISA_MOVW | \ |
AVR_ISA_LPMX | AVR_ISA_SPM) |
#define AVR_ISA_94K (AVR_ISA_M603 | AVR_ISA_MUL | AVR_ISA_MOVW | AVR_ISA_LPMX) |
#define AVR_ISA_M323 (AVR_ISA_M161 | AVR_ISA_BRK) |
#define AVR_ISA_M128 (AVR_ISA_M323 | AVR_ISA_ELPM | AVR_ISA_ELPMX) |
#define AVR_ISA_M256 (AVR_ISA_M128 | AVR_ISA_EIND) |
#define AVR_ISA_XMEGA (AVR_ISA_M256 | AVR_ISA_SPMX | AVR_ISA_DES) |
#define AVR_ISA_XMEGAU (AVR_ISA_XMEGA | AVR_ISA_RMW) |
#define AVR_ISA_AVR1 AVR_ISA_TINY1 |
#define AVR_ISA_AVR2 AVR_ISA_2xxx |
#define AVR_ISA_AVR25 AVR_ISA_TINY2 |
#define AVR_ISA_AVR3 AVR_ISA_M603 |
#define AVR_ISA_AVR31 AVR_ISA_M103 |
#define AVR_ISA_AVR35 (AVR_ISA_AVR3 | AVR_ISA_MOVW | \ |
AVR_ISA_LPMX | AVR_ISA_SPM | AVR_ISA_BRK) |
#define AVR_ISA_AVR3_ALL (AVR_ISA_AVR3 | AVR_ISA_AVR31 | AVR_ISA_AVR35) |
#define AVR_ISA_AVR4 AVR_ISA_PWMx |
#define AVR_ISA_AVR5 AVR_ISA_M323 |
#define AVR_ISA_AVR51 AVR_ISA_M128 |
#define AVR_ISA_AVR6 (AVR_ISA_1200 | AVR_ISA_LPM | AVR_ISA_LPMX | \ |
AVR_ISA_SRAM | AVR_ISA_MEGA | AVR_ISA_MUL | \ |
AVR_ISA_ELPM | AVR_ISA_ELPMX | AVR_ISA_SPM | \ |
AVR_ISA_BRK | AVR_ISA_EIND | AVR_ISA_MOVW) |
#define REGISTER_P(x) ((x) == 'r' \ |
|| (x) == 'd' \ |
|| (x) == 'w' \ |
|| (x) == 'a' \ |
|| (x) == 'v') |
/* Undefined combination of operands - does the register |
operand overlap with pre-decremented or post-incremented |
pointer register (like ld r31,Z+)? */ |
#define AVR_UNDEF_P(x) (((x) & 0xFFED) == 0x91E5 || \ |
((x) & 0xFDEF) == 0x91AD || ((x) & 0xFDEF) == 0x91AE || \ |
((x) & 0xFDEF) == 0x91C9 || ((x) & 0xFDEF) == 0x91CA || \ |
((x) & 0xFDEF) == 0x91E1 || ((x) & 0xFDEF) == 0x91E2) |
/* Is this a skip instruction {cpse,sbic,sbis,sbrc,sbrs}? */ |
#define AVR_SKIP_P(x) (((x) & 0xFC00) == 0x1000 || \ |
((x) & 0xFD00) == 0x9900 || ((x) & 0xFC08) == 0xFC00) |
/* Is this `ldd r,b+0' or `std b+0,r' (b={Y,Z}, disassembled as |
`ld r,b' or `st b,r' respectively - next opcode entry)? */ |
#define AVR_DISP0_P(x) (((x) & 0xFC07) == 0x8000) |
/* constraint letters |
r - any register |
d - `ldi' register (r16-r31) |
v - `movw' even register (r0, r2, ..., r28, r30) |
a - `fmul' register (r16-r23) |
w - `adiw' register (r24,r26,r28,r30) |
e - pointer registers (X,Y,Z) |
b - base pointer register and displacement ([YZ]+disp) |
z - Z pointer register (for [e]lpm Rd,Z[+]) |
M - immediate value from 0 to 255 |
n - immediate value from 0 to 255 ( n = ~M ). Relocation impossible |
s - immediate value from 0 to 7 |
P - Port address value from 0 to 63. (in, out) |
p - Port address value from 0 to 31. (cbi, sbi, sbic, sbis) |
K - immediate value from 0 to 63 (used in `adiw', `sbiw') |
i - immediate value |
l - signed pc relative offset from -64 to 63 |
L - signed pc relative offset from -2048 to 2047 |
h - absolute code address (call, jmp) |
S - immediate value from 0 to 7 (S = s << 4) |
E - immediate value from 0 to 15, shifted left by 4 (des) |
? - use this opcode entry if no parameters, else use next opcode entry |
Order is important - some binary opcodes have more than one name, |
the disassembler will only see the first match. |
Remaining undefined opcodes (1699 total - some of them might work |
as normal instructions if not all of the bits are decoded): |
0x0001...0x00ff (255) (known to be decoded as `nop' by the old core) |
"100100xxxxxxx011" (128) 0x9[0-3][0-9a-f][3b] |
"100100xxxxxx1000" (64) 0x9[0-3][0-9a-f]8 |
"1001010xxxxx0100" (32) 0x9[45][0-9a-f]4 |
"1001010x001x1001" (4) 0x9[45][23]9 |
"1001010x01xx1001" (8) 0x9[45][4-7]9 |
"1001010x1xxx1001" (16) 0x9[45][8-9a-f]9 |
"1001010xxxxx1011" (32) 0x9[45][0-9a-f]b |
"10010101001x1000" (2) 0x95[23]8 |
"1001010101xx1000" (4) 0x95[4-7]8 |
"1001010110111000" (1) 0x95b8 |
"1001010111111000" (1) 0x95f8 (`espm' removed in databook update) |
"11111xxxxxxx1xxx" (1024) 0xf[8-9a-f][0-9a-f][8-9a-f] |
*/ |
AVR_INSN (clc, "", "1001010010001000", 1, AVR_ISA_1200, 0x9488) |
AVR_INSN (clh, "", "1001010011011000", 1, AVR_ISA_1200, 0x94d8) |
AVR_INSN (cli, "", "1001010011111000", 1, AVR_ISA_1200, 0x94f8) |
AVR_INSN (cln, "", "1001010010101000", 1, AVR_ISA_1200, 0x94a8) |
AVR_INSN (cls, "", "1001010011001000", 1, AVR_ISA_1200, 0x94c8) |
AVR_INSN (clt, "", "1001010011101000", 1, AVR_ISA_1200, 0x94e8) |
AVR_INSN (clv, "", "1001010010111000", 1, AVR_ISA_1200, 0x94b8) |
AVR_INSN (clz, "", "1001010010011000", 1, AVR_ISA_1200, 0x9498) |
AVR_INSN (sec, "", "1001010000001000", 1, AVR_ISA_1200, 0x9408) |
AVR_INSN (seh, "", "1001010001011000", 1, AVR_ISA_1200, 0x9458) |
AVR_INSN (sei, "", "1001010001111000", 1, AVR_ISA_1200, 0x9478) |
AVR_INSN (sen, "", "1001010000101000", 1, AVR_ISA_1200, 0x9428) |
AVR_INSN (ses, "", "1001010001001000", 1, AVR_ISA_1200, 0x9448) |
AVR_INSN (set, "", "1001010001101000", 1, AVR_ISA_1200, 0x9468) |
AVR_INSN (sev, "", "1001010000111000", 1, AVR_ISA_1200, 0x9438) |
AVR_INSN (sez, "", "1001010000011000", 1, AVR_ISA_1200, 0x9418) |
/* Same as {cl,se}[chinstvz] above. */ |
AVR_INSN (bclr, "S", "100101001SSS1000", 1, AVR_ISA_1200, 0x9488) |
AVR_INSN (bset, "S", "100101000SSS1000", 1, AVR_ISA_1200, 0x9408) |
AVR_INSN (icall,"", "1001010100001001", 1, AVR_ISA_2xxx, 0x9509) |
AVR_INSN (ijmp, "", "1001010000001001", 1, AVR_ISA_2xxx, 0x9409) |
AVR_INSN (lpm, "?", "1001010111001000", 1, AVR_ISA_TINY1,0x95c8) |
AVR_INSN (lpm, "r,z", "1001000ddddd010+", 1, AVR_ISA_LPMX, 0x9004) |
AVR_INSN (elpm, "?", "1001010111011000", 1, AVR_ISA_ELPM, 0x95d8) |
AVR_INSN (elpm, "r,z", "1001000ddddd011+", 1, AVR_ISA_ELPMX,0x9006) |
AVR_INSN (nop, "", "0000000000000000", 1, AVR_ISA_1200, 0x0000) |
AVR_INSN (ret, "", "1001010100001000", 1, AVR_ISA_1200, 0x9508) |
AVR_INSN (reti, "", "1001010100011000", 1, AVR_ISA_1200, 0x9518) |
AVR_INSN (sleep,"", "1001010110001000", 1, AVR_ISA_1200, 0x9588) |
AVR_INSN (break,"", "1001010110011000", 1, AVR_ISA_BRK, 0x9598) |
AVR_INSN (wdr, "", "1001010110101000", 1, AVR_ISA_1200, 0x95a8) |
AVR_INSN (spm, "?", "1001010111101000", 1, AVR_ISA_SPM, 0x95e8) |
AVR_INSN (spm, "z", "10010101111+1000", 1, AVR_ISA_SPMX, 0x95e8) |
AVR_INSN (adc, "r,r", "000111rdddddrrrr", 1, AVR_ISA_1200, 0x1c00) |
AVR_INSN (add, "r,r", "000011rdddddrrrr", 1, AVR_ISA_1200, 0x0c00) |
AVR_INSN (and, "r,r", "001000rdddddrrrr", 1, AVR_ISA_1200, 0x2000) |
AVR_INSN (cp, "r,r", "000101rdddddrrrr", 1, AVR_ISA_1200, 0x1400) |
AVR_INSN (cpc, "r,r", "000001rdddddrrrr", 1, AVR_ISA_1200, 0x0400) |
AVR_INSN (cpse, "r,r", "000100rdddddrrrr", 1, AVR_ISA_1200, 0x1000) |
AVR_INSN (eor, "r,r", "001001rdddddrrrr", 1, AVR_ISA_1200, 0x2400) |
AVR_INSN (mov, "r,r", "001011rdddddrrrr", 1, AVR_ISA_1200, 0x2c00) |
AVR_INSN (mul, "r,r", "100111rdddddrrrr", 1, AVR_ISA_MUL, 0x9c00) |
AVR_INSN (or, "r,r", "001010rdddddrrrr", 1, AVR_ISA_1200, 0x2800) |
AVR_INSN (sbc, "r,r", "000010rdddddrrrr", 1, AVR_ISA_1200, 0x0800) |
AVR_INSN (sub, "r,r", "000110rdddddrrrr", 1, AVR_ISA_1200, 0x1800) |
/* Shorthand for {eor,add,adc,and} r,r above. */ |
AVR_INSN (clr, "r=r", "001001rdddddrrrr", 1, AVR_ISA_1200, 0x2400) |
AVR_INSN (lsl, "r=r", "000011rdddddrrrr", 1, AVR_ISA_1200, 0x0c00) |
AVR_INSN (rol, "r=r", "000111rdddddrrrr", 1, AVR_ISA_1200, 0x1c00) |
AVR_INSN (tst, "r=r", "001000rdddddrrrr", 1, AVR_ISA_1200, 0x2000) |
AVR_INSN (andi, "d,M", "0111KKKKddddKKKK", 1, AVR_ISA_1200, 0x7000) |
/*XXX special case*/ |
AVR_INSN (cbr, "d,n", "0111KKKKddddKKKK", 1, AVR_ISA_1200, 0x7000) |
AVR_INSN (ldi, "d,M", "1110KKKKddddKKKK", 1, AVR_ISA_1200, 0xe000) |
AVR_INSN (ser, "d", "11101111dddd1111", 1, AVR_ISA_1200, 0xef0f) |
AVR_INSN (ori, "d,M", "0110KKKKddddKKKK", 1, AVR_ISA_1200, 0x6000) |
AVR_INSN (sbr, "d,M", "0110KKKKddddKKKK", 1, AVR_ISA_1200, 0x6000) |
AVR_INSN (cpi, "d,M", "0011KKKKddddKKKK", 1, AVR_ISA_1200, 0x3000) |
AVR_INSN (sbci, "d,M", "0100KKKKddddKKKK", 1, AVR_ISA_1200, 0x4000) |
AVR_INSN (subi, "d,M", "0101KKKKddddKKKK", 1, AVR_ISA_1200, 0x5000) |
AVR_INSN (sbrc, "r,s", "1111110rrrrr0sss", 1, AVR_ISA_1200, 0xfc00) |
AVR_INSN (sbrs, "r,s", "1111111rrrrr0sss", 1, AVR_ISA_1200, 0xfe00) |
AVR_INSN (bld, "r,s", "1111100ddddd0sss", 1, AVR_ISA_1200, 0xf800) |
AVR_INSN (bst, "r,s", "1111101ddddd0sss", 1, AVR_ISA_1200, 0xfa00) |
AVR_INSN (in, "r,P", "10110PPdddddPPPP", 1, AVR_ISA_1200, 0xb000) |
AVR_INSN (out, "P,r", "10111PPrrrrrPPPP", 1, AVR_ISA_1200, 0xb800) |
AVR_INSN (adiw, "w,K", "10010110KKddKKKK", 1, AVR_ISA_2xxx, 0x9600) |
AVR_INSN (sbiw, "w,K", "10010111KKddKKKK", 1, AVR_ISA_2xxx, 0x9700) |
AVR_INSN (cbi, "p,s", "10011000pppppsss", 1, AVR_ISA_1200, 0x9800) |
AVR_INSN (sbi, "p,s", "10011010pppppsss", 1, AVR_ISA_1200, 0x9a00) |
AVR_INSN (sbic, "p,s", "10011001pppppsss", 1, AVR_ISA_1200, 0x9900) |
AVR_INSN (sbis, "p,s", "10011011pppppsss", 1, AVR_ISA_1200, 0x9b00) |
AVR_INSN (brcc, "l", "111101lllllll000", 1, AVR_ISA_1200, 0xf400) |
AVR_INSN (brcs, "l", "111100lllllll000", 1, AVR_ISA_1200, 0xf000) |
AVR_INSN (breq, "l", "111100lllllll001", 1, AVR_ISA_1200, 0xf001) |
AVR_INSN (brge, "l", "111101lllllll100", 1, AVR_ISA_1200, 0xf404) |
AVR_INSN (brhc, "l", "111101lllllll101", 1, AVR_ISA_1200, 0xf405) |
AVR_INSN (brhs, "l", "111100lllllll101", 1, AVR_ISA_1200, 0xf005) |
AVR_INSN (brid, "l", "111101lllllll111", 1, AVR_ISA_1200, 0xf407) |
AVR_INSN (brie, "l", "111100lllllll111", 1, AVR_ISA_1200, 0xf007) |
AVR_INSN (brlo, "l", "111100lllllll000", 1, AVR_ISA_1200, 0xf000) |
AVR_INSN (brlt, "l", "111100lllllll100", 1, AVR_ISA_1200, 0xf004) |
AVR_INSN (brmi, "l", "111100lllllll010", 1, AVR_ISA_1200, 0xf002) |
AVR_INSN (brne, "l", "111101lllllll001", 1, AVR_ISA_1200, 0xf401) |
AVR_INSN (brpl, "l", "111101lllllll010", 1, AVR_ISA_1200, 0xf402) |
AVR_INSN (brsh, "l", "111101lllllll000", 1, AVR_ISA_1200, 0xf400) |
AVR_INSN (brtc, "l", "111101lllllll110", 1, AVR_ISA_1200, 0xf406) |
AVR_INSN (brts, "l", "111100lllllll110", 1, AVR_ISA_1200, 0xf006) |
AVR_INSN (brvc, "l", "111101lllllll011", 1, AVR_ISA_1200, 0xf403) |
AVR_INSN (brvs, "l", "111100lllllll011", 1, AVR_ISA_1200, 0xf003) |
/* Same as br?? above. */ |
AVR_INSN (brbc, "s,l", "111101lllllllsss", 1, AVR_ISA_1200, 0xf400) |
AVR_INSN (brbs, "s,l", "111100lllllllsss", 1, AVR_ISA_1200, 0xf000) |
AVR_INSN (rcall, "L", "1101LLLLLLLLLLLL", 1, AVR_ISA_1200, 0xd000) |
AVR_INSN (rjmp, "L", "1100LLLLLLLLLLLL", 1, AVR_ISA_1200, 0xc000) |
AVR_INSN (call, "h", "1001010hhhhh111h", 2, AVR_ISA_MEGA, 0x940e) |
AVR_INSN (jmp, "h", "1001010hhhhh110h", 2, AVR_ISA_MEGA, 0x940c) |
AVR_INSN (asr, "r", "1001010rrrrr0101", 1, AVR_ISA_1200, 0x9405) |
AVR_INSN (com, "r", "1001010rrrrr0000", 1, AVR_ISA_1200, 0x9400) |
AVR_INSN (dec, "r", "1001010rrrrr1010", 1, AVR_ISA_1200, 0x940a) |
AVR_INSN (inc, "r", "1001010rrrrr0011", 1, AVR_ISA_1200, 0x9403) |
AVR_INSN (lsr, "r", "1001010rrrrr0110", 1, AVR_ISA_1200, 0x9406) |
AVR_INSN (neg, "r", "1001010rrrrr0001", 1, AVR_ISA_1200, 0x9401) |
AVR_INSN (pop, "r", "1001000rrrrr1111", 1, AVR_ISA_2xxx, 0x900f) |
AVR_INSN (push, "r", "1001001rrrrr1111", 1, AVR_ISA_2xxx, 0x920f) |
AVR_INSN (ror, "r", "1001010rrrrr0111", 1, AVR_ISA_1200, 0x9407) |
AVR_INSN (swap, "r", "1001010rrrrr0010", 1, AVR_ISA_1200, 0x9402) |
/* Atomic memory operations for XMEGA. List before `sts'. */ |
AVR_INSN (xch, "z,r", "1001001rrrrr0100", 1, AVR_ISA_RMW, 0x9204) |
AVR_INSN (las, "z,r", "1001001rrrrr0101", 1, AVR_ISA_RMW, 0x9205) |
AVR_INSN (lac, "z,r", "1001001rrrrr0110", 1, AVR_ISA_RMW, 0x9206) |
AVR_INSN (lat, "z,r", "1001001rrrrr0111", 1, AVR_ISA_RMW, 0x9207) |
/* Known to be decoded as `nop' by the old core. */ |
AVR_INSN (movw, "v,v", "00000001ddddrrrr", 1, AVR_ISA_MOVW, 0x0100) |
AVR_INSN (muls, "d,d", "00000010ddddrrrr", 1, AVR_ISA_MUL, 0x0200) |
AVR_INSN (mulsu,"a,a", "000000110ddd0rrr", 1, AVR_ISA_MUL, 0x0300) |
AVR_INSN (fmul, "a,a", "000000110ddd1rrr", 1, AVR_ISA_MUL, 0x0308) |
AVR_INSN (fmuls,"a,a", "000000111ddd0rrr", 1, AVR_ISA_MUL, 0x0380) |
AVR_INSN (fmulsu,"a,a","000000111ddd1rrr", 1, AVR_ISA_MUL, 0x0388) |
AVR_INSN (sts, "i,r", "1001001ddddd0000", 2, AVR_ISA_2xxx, 0x9200) |
AVR_INSN (lds, "r,i", "1001000ddddd0000", 2, AVR_ISA_2xxx, 0x9000) |
/* Special case for b+0, `e' must be next entry after `b', |
b={Y=1,Z=0}, ee={X=11,Y=10,Z=00}, !=1 if -e or e+ or X. */ |
AVR_INSN (ldd, "r,b", "10o0oo0dddddbooo", 1, AVR_ISA_2xxx, 0x8000) |
AVR_INSN (ld, "r,e", "100!000dddddee-+", 1, AVR_ISA_1200, 0x8000) |
AVR_INSN (std, "b,r", "10o0oo1rrrrrbooo", 1, AVR_ISA_2xxx, 0x8200) |
AVR_INSN (st, "e,r", "100!001rrrrree-+", 1, AVR_ISA_1200, 0x8200) |
/* These are for devices that don't exist yet |
(>128K program memory, PC = EIND:Z). */ |
AVR_INSN (eicall, "", "1001010100011001", 1, AVR_ISA_EIND, 0x9519) |
AVR_INSN (eijmp, "", "1001010000011001", 1, AVR_ISA_EIND, 0x9419) |
/* DES instruction for encryption and decryption */ |
AVR_INSN (des, "E", "10010100EEEE1011", 1, AVR_ISA_DES, 0x940B) |
/contrib/toolchain/binutils/include/opcode/bfin.h |
---|
0,0 → 1,1761 |
/* bfin.h -- Header file for ADI Blackfin opcode table |
Copyright 2005, 2010, 2011 Free Software Foundation, Inc. |
This file is part of GDB, GAS, and the GNU binutils. |
GDB, GAS, and the GNU binutils are free software; you can redistribute |
them and/or modify them under the terms of the GNU General Public |
License as published by the Free Software Foundation; either version 3, |
or (at your option) any later version. |
GDB, GAS, and the GNU binutils are distributed in the hope that they |
will be useful, but WITHOUT ANY WARRANTY; without even the implied |
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See |
the GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this file; see the file COPYING3. If not, write to the Free |
Software Foundation, 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef OPCODE_BFIN_H |
#define OPCODE_BFIN_H |
/* Common to all DSP32 instructions. */ |
#define BIT_MULTI_INS 0x0800 |
/* This just sets the multi instruction bit of a DSP32 instruction. */ |
#define SET_MULTI_INSTRUCTION_BIT(x) x->value |= BIT_MULTI_INS; |
/* DSP instructions (32 bit) */ |
/* mmod field. */ |
#define M_S2RND 1 |
#define M_T 2 |
#define M_W32 3 |
#define M_FU 4 |
#define M_TFU 6 |
#define M_IS 8 |
#define M_ISS2 9 |
#define M_IH 11 |
#define M_IU 12 |
static inline int is_macmod_pmove (int x) |
{ |
return (x == 0) || (x == M_IS) || (x == M_FU) || (x == M_S2RND) |
|| (x == M_ISS2) || (x == M_IU); |
} |
static inline int is_macmod_hmove (int x) |
{ |
return (x == 0) || (x == M_IS) || (x == M_FU) || (x == M_IU) || (x == M_T) |
|| (x == M_TFU) || (x == M_S2RND) || (x == M_ISS2) || (x == M_IH); |
} |
static inline int is_macmod_signed (int x) |
{ |
return (x == 0) || (x == M_IS) || (x == M_T) || (x == M_S2RND) |
|| (x == M_ISS2) || (x == M_IH) || (x == M_W32); |
} |
/* dsp32mac |
+----+----+---+---|---+----+----+---|---+---+---+---|---+---+---+---+ |
| 1 | 1 | 0 | 0 |.M.| 0 | 0 |.mmod..........|.MM|.P.|.w1|.op1...| |
|.h01|.h11|.w0|.op0...|.h00|.h10|.dst.......|.src0......|.src1......| |
+----+----+---+---|---+----+----+---|---+---+---+---|---+---+---+---+ |
*/ |
typedef struct |
{ |
unsigned long opcode; |
int bits_src1; |
int mask_src1; |
int bits_src0; |
int mask_src0; |
int bits_dst; |
int mask_dst; |
int bits_h10; |
int mask_h10; |
int bits_h00; |
int mask_h00; |
int bits_op0; |
int mask_op0; |
int bits_w0; |
int mask_w0; |
int bits_h11; |
int mask_h11; |
int bits_h01; |
int mask_h01; |
int bits_op1; |
int mask_op1; |
int bits_w1; |
int mask_w1; |
int bits_P; |
int mask_P; |
int bits_MM; |
int mask_MM; |
int bits_mmod; |
int mask_mmod; |
int bits_code2; |
int mask_code2; |
int bits_M; |
int mask_M; |
int bits_code; |
int mask_code; |
} DSP32Mac; |
#define DSP32Mac_opcode 0xc0000000 |
#define DSP32Mac_src1_bits 0 |
#define DSP32Mac_src1_mask 0x7 |
#define DSP32Mac_src0_bits 3 |
#define DSP32Mac_src0_mask 0x7 |
#define DSP32Mac_dst_bits 6 |
#define DSP32Mac_dst_mask 0x7 |
#define DSP32Mac_h10_bits 9 |
#define DSP32Mac_h10_mask 0x1 |
#define DSP32Mac_h00_bits 10 |
#define DSP32Mac_h00_mask 0x1 |
#define DSP32Mac_op0_bits 11 |
#define DSP32Mac_op0_mask 0x3 |
#define DSP32Mac_w0_bits 13 |
#define DSP32Mac_w0_mask 0x1 |
#define DSP32Mac_h11_bits 14 |
#define DSP32Mac_h11_mask 0x1 |
#define DSP32Mac_h01_bits 15 |
#define DSP32Mac_h01_mask 0x1 |
#define DSP32Mac_op1_bits 16 |
#define DSP32Mac_op1_mask 0x3 |
#define DSP32Mac_w1_bits 18 |
#define DSP32Mac_w1_mask 0x1 |
#define DSP32Mac_p_bits 19 |
#define DSP32Mac_p_mask 0x1 |
#define DSP32Mac_MM_bits 20 |
#define DSP32Mac_MM_mask 0x1 |
#define DSP32Mac_mmod_bits 21 |
#define DSP32Mac_mmod_mask 0xf |
#define DSP32Mac_code2_bits 25 |
#define DSP32Mac_code2_mask 0x3 |
#define DSP32Mac_M_bits 27 |
#define DSP32Mac_M_mask 0x1 |
#define DSP32Mac_code_bits 28 |
#define DSP32Mac_code_mask 0xf |
#define init_DSP32Mac \ |
{ \ |
DSP32Mac_opcode, \ |
DSP32Mac_src1_bits, DSP32Mac_src1_mask, \ |
DSP32Mac_src0_bits, DSP32Mac_src0_mask, \ |
DSP32Mac_dst_bits, DSP32Mac_dst_mask, \ |
DSP32Mac_h10_bits, DSP32Mac_h10_mask, \ |
DSP32Mac_h00_bits, DSP32Mac_h00_mask, \ |
DSP32Mac_op0_bits, DSP32Mac_op0_mask, \ |
DSP32Mac_w0_bits, DSP32Mac_w0_mask, \ |
DSP32Mac_h11_bits, DSP32Mac_h11_mask, \ |
DSP32Mac_h01_bits, DSP32Mac_h01_mask, \ |
DSP32Mac_op1_bits, DSP32Mac_op1_mask, \ |
DSP32Mac_w1_bits, DSP32Mac_w1_mask, \ |
DSP32Mac_p_bits, DSP32Mac_p_mask, \ |
DSP32Mac_MM_bits, DSP32Mac_MM_mask, \ |
DSP32Mac_mmod_bits, DSP32Mac_mmod_mask, \ |
DSP32Mac_code2_bits, DSP32Mac_code2_mask, \ |
DSP32Mac_M_bits, DSP32Mac_M_mask, \ |
DSP32Mac_code_bits, DSP32Mac_code_mask \ |
}; |
/* dsp32mult |
+----+----+---+---|---+----+----+---|---+---+---+---|---+---+---+---+ |
| 1 | 1 | 0 | 0 |.M.| 0 | 1 |.mmod..........|.MM|.P.|.w1|.op1...| |
|.h01|.h11|.w0|.op0...|.h00|.h10|.dst.......|.src0......|.src1......| |
+----+----+---+---|---+----+----+---|---+---+---+---|---+---+---+---+ |
*/ |
typedef DSP32Mac DSP32Mult; |
#define DSP32Mult_opcode 0xc2000000 |
#define init_DSP32Mult \ |
{ \ |
DSP32Mult_opcode, \ |
DSP32Mac_src1_bits, DSP32Mac_src1_mask, \ |
DSP32Mac_src0_bits, DSP32Mac_src0_mask, \ |
DSP32Mac_dst_bits, DSP32Mac_dst_mask, \ |
DSP32Mac_h10_bits, DSP32Mac_h10_mask, \ |
DSP32Mac_h00_bits, DSP32Mac_h00_mask, \ |
DSP32Mac_op0_bits, DSP32Mac_op0_mask, \ |
DSP32Mac_w0_bits, DSP32Mac_w0_mask, \ |
DSP32Mac_h11_bits, DSP32Mac_h11_mask, \ |
DSP32Mac_h01_bits, DSP32Mac_h01_mask, \ |
DSP32Mac_op1_bits, DSP32Mac_op1_mask, \ |
DSP32Mac_w1_bits, DSP32Mac_w1_mask, \ |
DSP32Mac_p_bits, DSP32Mac_p_mask, \ |
DSP32Mac_MM_bits, DSP32Mac_MM_mask, \ |
DSP32Mac_mmod_bits, DSP32Mac_mmod_mask, \ |
DSP32Mac_code2_bits, DSP32Mac_code2_mask, \ |
DSP32Mac_M_bits, DSP32Mac_M_mask, \ |
DSP32Mac_code_bits, DSP32Mac_code_mask \ |
}; |
/* dsp32alu |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
| 1 | 1 | 0 | 0 |.M.| 1 | 0 | - | - | - |.HL|.aopcde............| |
|.aop...|.s.|.x.|.dst0......|.dst1......|.src0......|.src1......| |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
*/ |
typedef struct |
{ |
unsigned long opcode; |
int bits_src1; |
int mask_src1; |
int bits_src0; |
int mask_src0; |
int bits_dst1; |
int mask_dst1; |
int bits_dst0; |
int mask_dst0; |
int bits_x; |
int mask_x; |
int bits_s; |
int mask_s; |
int bits_aop; |
int mask_aop; |
int bits_aopcde; |
int mask_aopcde; |
int bits_HL; |
int mask_HL; |
int bits_dontcare; |
int mask_dontcare; |
int bits_code2; |
int mask_code2; |
int bits_M; |
int mask_M; |
int bits_code; |
int mask_code; |
} DSP32Alu; |
#define DSP32Alu_opcode 0xc4000000 |
#define DSP32Alu_src1_bits 0 |
#define DSP32Alu_src1_mask 0x7 |
#define DSP32Alu_src0_bits 3 |
#define DSP32Alu_src0_mask 0x7 |
#define DSP32Alu_dst1_bits 6 |
#define DSP32Alu_dst1_mask 0x7 |
#define DSP32Alu_dst0_bits 9 |
#define DSP32Alu_dst0_mask 0x7 |
#define DSP32Alu_x_bits 12 |
#define DSP32Alu_x_mask 0x1 |
#define DSP32Alu_s_bits 13 |
#define DSP32Alu_s_mask 0x1 |
#define DSP32Alu_aop_bits 14 |
#define DSP32Alu_aop_mask 0x3 |
#define DSP32Alu_aopcde_bits 16 |
#define DSP32Alu_aopcde_mask 0x1f |
#define DSP32Alu_HL_bits 21 |
#define DSP32Alu_HL_mask 0x1 |
#define DSP32Alu_dontcare_bits 22 |
#define DSP32Alu_dontcare_mask 0x7 |
#define DSP32Alu_code2_bits 25 |
#define DSP32Alu_code2_mask 0x3 |
#define DSP32Alu_M_bits 27 |
#define DSP32Alu_M_mask 0x1 |
#define DSP32Alu_code_bits 28 |
#define DSP32Alu_code_mask 0xf |
#define init_DSP32Alu \ |
{ \ |
DSP32Alu_opcode, \ |
DSP32Alu_src1_bits, DSP32Alu_src1_mask, \ |
DSP32Alu_src0_bits, DSP32Alu_src0_mask, \ |
DSP32Alu_dst1_bits, DSP32Alu_dst1_mask, \ |
DSP32Alu_dst0_bits, DSP32Alu_dst0_mask, \ |
DSP32Alu_x_bits, DSP32Alu_x_mask, \ |
DSP32Alu_s_bits, DSP32Alu_s_mask, \ |
DSP32Alu_aop_bits, DSP32Alu_aop_mask, \ |
DSP32Alu_aopcde_bits, DSP32Alu_aopcde_mask, \ |
DSP32Alu_HL_bits, DSP32Alu_HL_mask, \ |
DSP32Alu_dontcare_bits, DSP32Alu_dontcare_mask, \ |
DSP32Alu_code2_bits, DSP32Alu_code2_mask, \ |
DSP32Alu_M_bits, DSP32Alu_M_mask, \ |
DSP32Alu_code_bits, DSP32Alu_code_mask \ |
}; |
/* dsp32shift |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
| 1 | 1 | 0 | 0 |.M.| 1 | 1 | 0 | 0 | - | - |.sopcde............| |
|.sop...|.HLs...|.dst0......| - | - | - |.src0......|.src1......| |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
*/ |
typedef struct |
{ |
unsigned long opcode; |
int bits_src1; |
int mask_src1; |
int bits_src0; |
int mask_src0; |
int bits_dst1; |
int mask_dst1; |
int bits_dst0; |
int mask_dst0; |
int bits_HLs; |
int mask_HLs; |
int bits_sop; |
int mask_sop; |
int bits_sopcde; |
int mask_sopcde; |
int bits_dontcare; |
int mask_dontcare; |
int bits_code2; |
int mask_code2; |
int bits_M; |
int mask_M; |
int bits_code; |
int mask_code; |
} DSP32Shift; |
#define DSP32Shift_opcode 0xc6000000 |
#define DSP32Shift_src1_bits 0 |
#define DSP32Shift_src1_mask 0x7 |
#define DSP32Shift_src0_bits 3 |
#define DSP32Shift_src0_mask 0x7 |
#define DSP32Shift_dst1_bits 6 |
#define DSP32Shift_dst1_mask 0x7 |
#define DSP32Shift_dst0_bits 9 |
#define DSP32Shift_dst0_mask 0x7 |
#define DSP32Shift_HLs_bits 12 |
#define DSP32Shift_HLs_mask 0x3 |
#define DSP32Shift_sop_bits 14 |
#define DSP32Shift_sop_mask 0x3 |
#define DSP32Shift_sopcde_bits 16 |
#define DSP32Shift_sopcde_mask 0x1f |
#define DSP32Shift_dontcare_bits 21 |
#define DSP32Shift_dontcare_mask 0x3 |
#define DSP32Shift_code2_bits 23 |
#define DSP32Shift_code2_mask 0xf |
#define DSP32Shift_M_bits 27 |
#define DSP32Shift_M_mask 0x1 |
#define DSP32Shift_code_bits 28 |
#define DSP32Shift_code_mask 0xf |
#define init_DSP32Shift \ |
{ \ |
DSP32Shift_opcode, \ |
DSP32Shift_src1_bits, DSP32Shift_src1_mask, \ |
DSP32Shift_src0_bits, DSP32Shift_src0_mask, \ |
DSP32Shift_dst1_bits, DSP32Shift_dst1_mask, \ |
DSP32Shift_dst0_bits, DSP32Shift_dst0_mask, \ |
DSP32Shift_HLs_bits, DSP32Shift_HLs_mask, \ |
DSP32Shift_sop_bits, DSP32Shift_sop_mask, \ |
DSP32Shift_sopcde_bits, DSP32Shift_sopcde_mask, \ |
DSP32Shift_dontcare_bits, DSP32Shift_dontcare_mask, \ |
DSP32Shift_code2_bits, DSP32Shift_code2_mask, \ |
DSP32Shift_M_bits, DSP32Shift_M_mask, \ |
DSP32Shift_code_bits, DSP32Shift_code_mask \ |
}; |
/* dsp32shiftimm |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
| 1 | 1 | 0 | 0 |.M.| 1 | 1 | 0 | 1 | - | - |.sopcde............| |
|.sop...|.HLs...|.dst0......|.immag.................|.src1......| |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
*/ |
typedef struct |
{ |
unsigned long opcode; |
int bits_src1; |
int mask_src1; |
int bits_immag; |
int mask_immag; |
int bits_dst0; |
int mask_dst0; |
int bits_HLs; |
int mask_HLs; |
int bits_sop; |
int mask_sop; |
int bits_sopcde; |
int mask_sopcde; |
int bits_dontcare; |
int mask_dontcare; |
int bits_code2; |
int mask_code2; |
int bits_M; |
int mask_M; |
int bits_code; |
int mask_code; |
} DSP32ShiftImm; |
#define DSP32ShiftImm_opcode 0xc6800000 |
#define DSP32ShiftImm_src1_bits 0 |
#define DSP32ShiftImm_src1_mask 0x7 |
#define DSP32ShiftImm_immag_bits 3 |
#define DSP32ShiftImm_immag_mask 0x3f |
#define DSP32ShiftImm_dst0_bits 9 |
#define DSP32ShiftImm_dst0_mask 0x7 |
#define DSP32ShiftImm_HLs_bits 12 |
#define DSP32ShiftImm_HLs_mask 0x3 |
#define DSP32ShiftImm_sop_bits 14 |
#define DSP32ShiftImm_sop_mask 0x3 |
#define DSP32ShiftImm_sopcde_bits 16 |
#define DSP32ShiftImm_sopcde_mask 0x1f |
#define DSP32ShiftImm_dontcare_bits 21 |
#define DSP32ShiftImm_dontcare_mask 0x3 |
#define DSP32ShiftImm_code2_bits 23 |
#define DSP32ShiftImm_code2_mask 0xf |
#define DSP32ShiftImm_M_bits 27 |
#define DSP32ShiftImm_M_mask 0x1 |
#define DSP32ShiftImm_code_bits 28 |
#define DSP32ShiftImm_code_mask 0xf |
#define init_DSP32ShiftImm \ |
{ \ |
DSP32ShiftImm_opcode, \ |
DSP32ShiftImm_src1_bits, DSP32ShiftImm_src1_mask, \ |
DSP32ShiftImm_immag_bits, DSP32ShiftImm_immag_mask, \ |
DSP32ShiftImm_dst0_bits, DSP32ShiftImm_dst0_mask, \ |
DSP32ShiftImm_HLs_bits, DSP32ShiftImm_HLs_mask, \ |
DSP32ShiftImm_sop_bits, DSP32ShiftImm_sop_mask, \ |
DSP32ShiftImm_sopcde_bits, DSP32ShiftImm_sopcde_mask, \ |
DSP32ShiftImm_dontcare_bits, DSP32ShiftImm_dontcare_mask, \ |
DSP32ShiftImm_code2_bits, DSP32ShiftImm_code2_mask, \ |
DSP32ShiftImm_M_bits, DSP32ShiftImm_M_mask, \ |
DSP32ShiftImm_code_bits, DSP32ShiftImm_code_mask \ |
}; |
/* LOAD / STORE */ |
/* LDSTidxI |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
| 1 | 1 | 1 | 0 | 0 | 1 |.W.|.Z.|.sz....|.ptr.......|.reg.......| |
|.offset........................................................| |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
*/ |
typedef struct |
{ |
unsigned long opcode; |
int bits_offset; |
int mask_offset; |
int bits_reg; |
int mask_reg; |
int bits_ptr; |
int mask_ptr; |
int bits_sz; |
int mask_sz; |
int bits_Z; |
int mask_Z; |
int bits_W; |
int mask_W; |
int bits_code; |
int mask_code; |
} LDSTidxI; |
#define LDSTidxI_opcode 0xe4000000 |
#define LDSTidxI_offset_bits 0 |
#define LDSTidxI_offset_mask 0xffff |
#define LDSTidxI_reg_bits 16 |
#define LDSTidxI_reg_mask 0x7 |
#define LDSTidxI_ptr_bits 19 |
#define LDSTidxI_ptr_mask 0x7 |
#define LDSTidxI_sz_bits 22 |
#define LDSTidxI_sz_mask 0x3 |
#define LDSTidxI_Z_bits 24 |
#define LDSTidxI_Z_mask 0x1 |
#define LDSTidxI_W_bits 25 |
#define LDSTidxI_W_mask 0x1 |
#define LDSTidxI_code_bits 26 |
#define LDSTidxI_code_mask 0x3f |
#define init_LDSTidxI \ |
{ \ |
LDSTidxI_opcode, \ |
LDSTidxI_offset_bits, LDSTidxI_offset_mask, \ |
LDSTidxI_reg_bits, LDSTidxI_reg_mask, \ |
LDSTidxI_ptr_bits, LDSTidxI_ptr_mask, \ |
LDSTidxI_sz_bits, LDSTidxI_sz_mask, \ |
LDSTidxI_Z_bits, LDSTidxI_Z_mask, \ |
LDSTidxI_W_bits, LDSTidxI_W_mask, \ |
LDSTidxI_code_bits, LDSTidxI_code_mask \ |
}; |
/* LDST |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
| 1 | 0 | 0 | 1 |.sz....|.W.|.aop...|.Z.|.ptr.......|.reg.......| |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
*/ |
typedef struct |
{ |
unsigned short opcode; |
int bits_reg; |
int mask_reg; |
int bits_ptr; |
int mask_ptr; |
int bits_Z; |
int mask_Z; |
int bits_aop; |
int mask_aop; |
int bits_W; |
int mask_W; |
int bits_sz; |
int mask_sz; |
int bits_code; |
int mask_code; |
} LDST; |
#define LDST_opcode 0x9000 |
#define LDST_reg_bits 0 |
#define LDST_reg_mask 0x7 |
#define LDST_ptr_bits 3 |
#define LDST_ptr_mask 0x7 |
#define LDST_Z_bits 6 |
#define LDST_Z_mask 0x1 |
#define LDST_aop_bits 7 |
#define LDST_aop_mask 0x3 |
#define LDST_W_bits 9 |
#define LDST_W_mask 0x1 |
#define LDST_sz_bits 10 |
#define LDST_sz_mask 0x3 |
#define LDST_code_bits 12 |
#define LDST_code_mask 0xf |
#define init_LDST \ |
{ \ |
LDST_opcode, \ |
LDST_reg_bits, LDST_reg_mask, \ |
LDST_ptr_bits, LDST_ptr_mask, \ |
LDST_Z_bits, LDST_Z_mask, \ |
LDST_aop_bits, LDST_aop_mask, \ |
LDST_W_bits, LDST_W_mask, \ |
LDST_sz_bits, LDST_sz_mask, \ |
LDST_code_bits, LDST_code_mask \ |
}; |
/* LDSTii |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
| 1 | 0 | 1 |.W.|.op....|.offset........|.ptr.......|.reg.......| |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
*/ |
typedef struct |
{ |
unsigned short opcode; |
int bits_reg; |
int mask_reg; |
int bits_ptr; |
int mask_ptr; |
int bits_offset; |
int mask_offset; |
int bits_op; |
int mask_op; |
int bits_W; |
int mask_W; |
int bits_code; |
int mask_code; |
} LDSTii; |
#define LDSTii_opcode 0xa000 |
#define LDSTii_reg_bit 0 |
#define LDSTii_reg_mask 0x7 |
#define LDSTii_ptr_bit 3 |
#define LDSTii_ptr_mask 0x7 |
#define LDSTii_offset_bit 6 |
#define LDSTii_offset_mask 0xf |
#define LDSTii_op_bit 10 |
#define LDSTii_op_mask 0x3 |
#define LDSTii_W_bit 12 |
#define LDSTii_W_mask 0x1 |
#define LDSTii_code_bit 13 |
#define LDSTii_code_mask 0x7 |
#define init_LDSTii \ |
{ \ |
LDSTii_opcode, \ |
LDSTii_reg_bit, LDSTii_reg_mask, \ |
LDSTii_ptr_bit, LDSTii_ptr_mask, \ |
LDSTii_offset_bit, LDSTii_offset_mask, \ |
LDSTii_op_bit, LDSTii_op_mask, \ |
LDSTii_W_bit, LDSTii_W_mask, \ |
LDSTii_code_bit, LDSTii_code_mask \ |
}; |
/* LDSTiiFP |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
| 1 | 0 | 1 | 1 | 1 | 0 |.W.|.offset............|.reg...........| |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
*/ |
typedef struct |
{ |
unsigned short opcode; |
int bits_reg; |
int mask_reg; |
int bits_offset; |
int mask_offset; |
int bits_W; |
int mask_W; |
int bits_code; |
int mask_code; |
} LDSTiiFP; |
#define LDSTiiFP_opcode 0xb800 |
#define LDSTiiFP_reg_bits 0 |
#define LDSTiiFP_reg_mask 0xf |
#define LDSTiiFP_offset_bits 4 |
#define LDSTiiFP_offset_mask 0x1f |
#define LDSTiiFP_W_bits 9 |
#define LDSTiiFP_W_mask 0x1 |
#define LDSTiiFP_code_bits 10 |
#define LDSTiiFP_code_mask 0x3f |
#define init_LDSTiiFP \ |
{ \ |
LDSTiiFP_opcode, \ |
LDSTiiFP_reg_bits, LDSTiiFP_reg_mask, \ |
LDSTiiFP_offset_bits, LDSTiiFP_offset_mask, \ |
LDSTiiFP_W_bits, LDSTiiFP_W_mask, \ |
LDSTiiFP_code_bits, LDSTiiFP_code_mask \ |
}; |
/* dspLDST |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
| 1 | 0 | 0 | 1 | 1 | 1 |.W.|.aop...|.m.....|.i.....|.reg.......| |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
*/ |
typedef struct |
{ |
unsigned short opcode; |
int bits_reg; |
int mask_reg; |
int bits_i; |
int mask_i; |
int bits_m; |
int mask_m; |
int bits_aop; |
int mask_aop; |
int bits_W; |
int mask_W; |
int bits_code; |
int mask_code; |
} DspLDST; |
#define DspLDST_opcode 0x9c00 |
#define DspLDST_reg_bits 0 |
#define DspLDST_reg_mask 0x7 |
#define DspLDST_i_bits 3 |
#define DspLDST_i_mask 0x3 |
#define DspLDST_m_bits 5 |
#define DspLDST_m_mask 0x3 |
#define DspLDST_aop_bits 7 |
#define DspLDST_aop_mask 0x3 |
#define DspLDST_W_bits 9 |
#define DspLDST_W_mask 0x1 |
#define DspLDST_code_bits 10 |
#define DspLDST_code_mask 0x3f |
#define init_DspLDST \ |
{ \ |
DspLDST_opcode, \ |
DspLDST_reg_bits, DspLDST_reg_mask, \ |
DspLDST_i_bits, DspLDST_i_mask, \ |
DspLDST_m_bits, DspLDST_m_mask, \ |
DspLDST_aop_bits, DspLDST_aop_mask, \ |
DspLDST_W_bits, DspLDST_W_mask, \ |
DspLDST_code_bits, DspLDST_code_mask \ |
}; |
/* LDSTpmod |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
| 1 | 0 | 0 | 0 |.W.|.aop...|.reg.......|.idx.......|.ptr.......| |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
*/ |
typedef struct |
{ |
unsigned short opcode; |
int bits_ptr; |
int mask_ptr; |
int bits_idx; |
int mask_idx; |
int bits_reg; |
int mask_reg; |
int bits_aop; |
int mask_aop; |
int bits_W; |
int mask_W; |
int bits_code; |
int mask_code; |
} LDSTpmod; |
#define LDSTpmod_opcode 0x8000 |
#define LDSTpmod_ptr_bits 0 |
#define LDSTpmod_ptr_mask 0x7 |
#define LDSTpmod_idx_bits 3 |
#define LDSTpmod_idx_mask 0x7 |
#define LDSTpmod_reg_bits 6 |
#define LDSTpmod_reg_mask 0x7 |
#define LDSTpmod_aop_bits 9 |
#define LDSTpmod_aop_mask 0x3 |
#define LDSTpmod_W_bits 11 |
#define LDSTpmod_W_mask 0x1 |
#define LDSTpmod_code_bits 12 |
#define LDSTpmod_code_mask 0xf |
#define init_LDSTpmod \ |
{ \ |
LDSTpmod_opcode, \ |
LDSTpmod_ptr_bits, LDSTpmod_ptr_mask, \ |
LDSTpmod_idx_bits, LDSTpmod_idx_mask, \ |
LDSTpmod_reg_bits, LDSTpmod_reg_mask, \ |
LDSTpmod_aop_bits, LDSTpmod_aop_mask, \ |
LDSTpmod_W_bits, LDSTpmod_W_mask, \ |
LDSTpmod_code_bits, LDSTpmod_code_mask \ |
}; |
/* LOGI2op |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
| 0 | 1 | 0 | 0 | 1 |.opc.......|.src...............|.dst.......| |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
*/ |
typedef struct |
{ |
unsigned short opcode; |
int bits_dst; |
int mask_dst; |
int bits_src; |
int mask_src; |
int bits_opc; |
int mask_opc; |
int bits_code; |
int mask_code; |
} LOGI2op; |
#define LOGI2op_opcode 0x4800 |
#define LOGI2op_dst_bits 0 |
#define LOGI2op_dst_mask 0x7 |
#define LOGI2op_src_bits 3 |
#define LOGI2op_src_mask 0x1f |
#define LOGI2op_opc_bits 8 |
#define LOGI2op_opc_mask 0x7 |
#define LOGI2op_code_bits 11 |
#define LOGI2op_code_mask 0x1f |
#define init_LOGI2op \ |
{ \ |
LOGI2op_opcode, \ |
LOGI2op_dst_bits, LOGI2op_dst_mask, \ |
LOGI2op_src_bits, LOGI2op_src_mask, \ |
LOGI2op_opc_bits, LOGI2op_opc_mask, \ |
LOGI2op_code_bits, LOGI2op_code_mask \ |
}; |
/* ALU2op |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
| 0 | 1 | 0 | 0 | 0 | 0 |.opc...........|.src.......|.dst.......| |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
*/ |
typedef struct |
{ |
unsigned short opcode; |
int bits_dst; |
int mask_dst; |
int bits_src; |
int mask_src; |
int bits_opc; |
int mask_opc; |
int bits_code; |
int mask_code; |
} ALU2op; |
#define ALU2op_opcode 0x4000 |
#define ALU2op_dst_bits 0 |
#define ALU2op_dst_mask 0x7 |
#define ALU2op_src_bits 3 |
#define ALU2op_src_mask 0x7 |
#define ALU2op_opc_bits 6 |
#define ALU2op_opc_mask 0xf |
#define ALU2op_code_bits 10 |
#define ALU2op_code_mask 0x3f |
#define init_ALU2op \ |
{ \ |
ALU2op_opcode, \ |
ALU2op_dst_bits, ALU2op_dst_mask, \ |
ALU2op_src_bits, ALU2op_src_mask, \ |
ALU2op_opc_bits, ALU2op_opc_mask, \ |
ALU2op_code_bits, ALU2op_code_mask \ |
}; |
/* BRCC |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
| 0 | 0 | 0 | 1 |.T.|.B.|.offset................................| |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
*/ |
typedef struct |
{ |
unsigned short opcode; |
int bits_offset; |
int mask_offset; |
int bits_B; |
int mask_B; |
int bits_T; |
int mask_T; |
int bits_code; |
int mask_code; |
} BRCC; |
#define BRCC_opcode 0x1000 |
#define BRCC_offset_bits 0 |
#define BRCC_offset_mask 0x3ff |
#define BRCC_B_bits 10 |
#define BRCC_B_mask 0x1 |
#define BRCC_T_bits 11 |
#define BRCC_T_mask 0x1 |
#define BRCC_code_bits 12 |
#define BRCC_code_mask 0xf |
#define init_BRCC \ |
{ \ |
BRCC_opcode, \ |
BRCC_offset_bits, BRCC_offset_mask, \ |
BRCC_B_bits, BRCC_B_mask, \ |
BRCC_T_bits, BRCC_T_mask, \ |
BRCC_code_bits, BRCC_code_mask \ |
}; |
/* UJUMP |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
| 0 | 0 | 1 | 0 |.offset........................................| |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
*/ |
typedef struct |
{ |
unsigned short opcode; |
int bits_offset; |
int mask_offset; |
int bits_code; |
int mask_code; |
} UJump; |
#define UJump_opcode 0x2000 |
#define UJump_offset_bits 0 |
#define UJump_offset_mask 0xfff |
#define UJump_code_bits 12 |
#define UJump_code_mask 0xf |
#define init_UJump \ |
{ \ |
UJump_opcode, \ |
UJump_offset_bits, UJump_offset_mask, \ |
UJump_code_bits, UJump_code_mask \ |
}; |
/* ProgCtrl |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |.prgfunc.......|.poprnd........| |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
*/ |
typedef struct |
{ |
unsigned short opcode; |
int bits_poprnd; |
int mask_poprnd; |
int bits_prgfunc; |
int mask_prgfunc; |
int bits_code; |
int mask_code; |
} ProgCtrl; |
#define ProgCtrl_opcode 0x0000 |
#define ProgCtrl_poprnd_bits 0 |
#define ProgCtrl_poprnd_mask 0xf |
#define ProgCtrl_prgfunc_bits 4 |
#define ProgCtrl_prgfunc_mask 0xf |
#define ProgCtrl_code_bits 8 |
#define ProgCtrl_code_mask 0xff |
#define init_ProgCtrl \ |
{ \ |
ProgCtrl_opcode, \ |
ProgCtrl_poprnd_bits, ProgCtrl_poprnd_mask, \ |
ProgCtrl_prgfunc_bits, ProgCtrl_prgfunc_mask, \ |
ProgCtrl_code_bits, ProgCtrl_code_mask \ |
}; |
/* CALLa |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
| 1 | 1 | 1 | 0 | 0 | 0 | 1 |.S.|.msw...........................| |
|.lsw...........................................................| |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
*/ |
typedef struct |
{ |
unsigned long opcode; |
int bits_addr; |
int mask_addr; |
int bits_S; |
int mask_S; |
int bits_code; |
int mask_code; |
} CALLa; |
#define CALLa_opcode 0xe2000000 |
#define CALLa_addr_bits 0 |
#define CALLa_addr_mask 0xffffff |
#define CALLa_S_bits 24 |
#define CALLa_S_mask 0x1 |
#define CALLa_code_bits 25 |
#define CALLa_code_mask 0x7f |
#define init_CALLa \ |
{ \ |
CALLa_opcode, \ |
CALLa_addr_bits, CALLa_addr_mask, \ |
CALLa_S_bits, CALLa_S_mask, \ |
CALLa_code_bits, CALLa_code_mask \ |
}; |
/* pseudoDEBUG |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
| 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 |.fn....|.grp.......|.reg.......| |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
*/ |
typedef struct |
{ |
unsigned short opcode; |
int bits_reg; |
int mask_reg; |
int bits_grp; |
int mask_grp; |
int bits_fn; |
int mask_fn; |
int bits_code; |
int mask_code; |
} PseudoDbg; |
#define PseudoDbg_opcode 0xf800 |
#define PseudoDbg_reg_bits 0 |
#define PseudoDbg_reg_mask 0x7 |
#define PseudoDbg_grp_bits 3 |
#define PseudoDbg_grp_mask 0x7 |
#define PseudoDbg_fn_bits 6 |
#define PseudoDbg_fn_mask 0x3 |
#define PseudoDbg_code_bits 8 |
#define PseudoDbg_code_mask 0xff |
#define init_PseudoDbg \ |
{ \ |
PseudoDbg_opcode, \ |
PseudoDbg_reg_bits, PseudoDbg_reg_mask, \ |
PseudoDbg_grp_bits, PseudoDbg_grp_mask, \ |
PseudoDbg_fn_bits, PseudoDbg_fn_mask, \ |
PseudoDbg_code_bits, PseudoDbg_code_mask \ |
}; |
/* PseudoDbg_assert |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
| 1 | 1 | 1 | 1 | 0 | - | - | - | dbgop |.grp.......|.regtest...| |
|.expected......................................................| |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
*/ |
typedef struct |
{ |
unsigned long opcode; |
int bits_expected; |
int mask_expected; |
int bits_regtest; |
int mask_regtest; |
int bits_grp; |
int mask_grp; |
int bits_dbgop; |
int mask_dbgop; |
int bits_dontcare; |
int mask_dontcare; |
int bits_code; |
int mask_code; |
} PseudoDbg_Assert; |
#define PseudoDbg_Assert_opcode 0xf0000000 |
#define PseudoDbg_Assert_expected_bits 0 |
#define PseudoDbg_Assert_expected_mask 0xffff |
#define PseudoDbg_Assert_regtest_bits 16 |
#define PseudoDbg_Assert_regtest_mask 0x7 |
#define PseudoDbg_Assert_grp_bits 19 |
#define PseudoDbg_Assert_grp_mask 0x7 |
#define PseudoDbg_Assert_dbgop_bits 22 |
#define PseudoDbg_Assert_dbgop_mask 0x3 |
#define PseudoDbg_Assert_dontcare_bits 24 |
#define PseudoDbg_Assert_dontcare_mask 0x7 |
#define PseudoDbg_Assert_code_bits 27 |
#define PseudoDbg_Assert_code_mask 0x1f |
#define init_PseudoDbg_Assert \ |
{ \ |
PseudoDbg_Assert_opcode, \ |
PseudoDbg_Assert_expected_bits, PseudoDbg_Assert_expected_mask, \ |
PseudoDbg_Assert_regtest_bits, PseudoDbg_Assert_regtest_mask, \ |
PseudoDbg_Assert_grp_bits, PseudoDbg_Assert_grp_mask, \ |
PseudoDbg_Assert_dbgop_bits, PseudoDbg_Assert_dbgop_mask, \ |
PseudoDbg_Assert_dontcare_bits, PseudoDbg_Assert_dontcare_mask, \ |
PseudoDbg_Assert_code_bits, PseudoDbg_Assert_code_mask \ |
}; |
/* pseudoChr |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
| 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 |.ch............................| |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
*/ |
typedef struct |
{ |
unsigned short opcode; |
int bits_ch; |
int mask_ch; |
int bits_code; |
int mask_code; |
} PseudoChr; |
#define PseudoChr_opcode 0xf900 |
#define PseudoChr_ch_bits 0 |
#define PseudoChr_ch_mask 0xff |
#define PseudoChr_code_bits 8 |
#define PseudoChr_code_mask 0xff |
#define init_PseudoChr \ |
{ \ |
PseudoChr_opcode, \ |
PseudoChr_ch_bits, PseudoChr_ch_mask, \ |
PseudoChr_code_bits, PseudoChr_code_mask \ |
}; |
/* CaCTRL |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 |.a.|.op....|.reg.......| |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
*/ |
typedef struct |
{ |
unsigned short opcode; |
int bits_reg; |
int mask_reg; |
int bits_op; |
int mask_op; |
int bits_a; |
int mask_a; |
int bits_code; |
int mask_code; |
} CaCTRL; |
#define CaCTRL_opcode 0x0240 |
#define CaCTRL_reg_bits 0 |
#define CaCTRL_reg_mask 0x7 |
#define CaCTRL_op_bits 3 |
#define CaCTRL_op_mask 0x3 |
#define CaCTRL_a_bits 5 |
#define CaCTRL_a_mask 0x1 |
#define CaCTRL_code_bits 6 |
#define CaCTRL_code_mask 0x3fff |
#define init_CaCTRL \ |
{ \ |
CaCTRL_opcode, \ |
CaCTRL_reg_bits, CaCTRL_reg_mask, \ |
CaCTRL_op_bits, CaCTRL_op_mask, \ |
CaCTRL_a_bits, CaCTRL_a_mask, \ |
CaCTRL_code_bits, CaCTRL_code_mask \ |
}; |
/* PushPopMultiple |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
| 0 | 0 | 0 | 0 | 0 | 1 | 0 |.d.|.p.|.W.|.dr........|.pr........| |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
*/ |
typedef struct |
{ |
unsigned short opcode; |
int bits_pr; |
int mask_pr; |
int bits_dr; |
int mask_dr; |
int bits_W; |
int mask_W; |
int bits_p; |
int mask_p; |
int bits_d; |
int mask_d; |
int bits_code; |
int mask_code; |
} PushPopMultiple; |
#define PushPopMultiple_opcode 0x0400 |
#define PushPopMultiple_pr_bits 0 |
#define PushPopMultiple_pr_mask 0x7 |
#define PushPopMultiple_dr_bits 3 |
#define PushPopMultiple_dr_mask 0x7 |
#define PushPopMultiple_W_bits 6 |
#define PushPopMultiple_W_mask 0x1 |
#define PushPopMultiple_p_bits 7 |
#define PushPopMultiple_p_mask 0x1 |
#define PushPopMultiple_d_bits 8 |
#define PushPopMultiple_d_mask 0x1 |
#define PushPopMultiple_code_bits 8 |
#define PushPopMultiple_code_mask 0x1 |
#define init_PushPopMultiple \ |
{ \ |
PushPopMultiple_opcode, \ |
PushPopMultiple_pr_bits, PushPopMultiple_pr_mask, \ |
PushPopMultiple_dr_bits, PushPopMultiple_dr_mask, \ |
PushPopMultiple_W_bits, PushPopMultiple_W_mask, \ |
PushPopMultiple_p_bits, PushPopMultiple_p_mask, \ |
PushPopMultiple_d_bits, PushPopMultiple_d_mask, \ |
PushPopMultiple_code_bits, PushPopMultiple_code_mask \ |
}; |
/* PushPopReg |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |.W.|.grp.......|.reg.......| |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
*/ |
typedef struct |
{ |
unsigned short opcode; |
int bits_reg; |
int mask_reg; |
int bits_grp; |
int mask_grp; |
int bits_W; |
int mask_W; |
int bits_code; |
int mask_code; |
} PushPopReg; |
#define PushPopReg_opcode 0x0100 |
#define PushPopReg_reg_bits 0 |
#define PushPopReg_reg_mask 0x7 |
#define PushPopReg_grp_bits 3 |
#define PushPopReg_grp_mask 0x7 |
#define PushPopReg_W_bits 6 |
#define PushPopReg_W_mask 0x1 |
#define PushPopReg_code_bits 7 |
#define PushPopReg_code_mask 0x1ff |
#define init_PushPopReg \ |
{ \ |
PushPopReg_opcode, \ |
PushPopReg_reg_bits, PushPopReg_reg_mask, \ |
PushPopReg_grp_bits, PushPopReg_grp_mask, \ |
PushPopReg_W_bits, PushPopReg_W_mask, \ |
PushPopReg_code_bits, PushPopReg_code_mask, \ |
}; |
/* linkage |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
| 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |.R.| |
|.framesize.....................................................| |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
*/ |
typedef struct |
{ |
unsigned long opcode; |
int bits_framesize; |
int mask_framesize; |
int bits_R; |
int mask_R; |
int bits_code; |
int mask_code; |
} Linkage; |
#define Linkage_opcode 0xe8000000 |
#define Linkage_framesize_bits 0 |
#define Linkage_framesize_mask 0xffff |
#define Linkage_R_bits 16 |
#define Linkage_R_mask 0x1 |
#define Linkage_code_bits 17 |
#define Linkage_code_mask 0x7fff |
#define init_Linkage \ |
{ \ |
Linkage_opcode, \ |
Linkage_framesize_bits, Linkage_framesize_mask, \ |
Linkage_R_bits, Linkage_R_mask, \ |
Linkage_code_bits, Linkage_code_mask \ |
}; |
/* LoopSetup |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
| 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 |.rop...|.c.|.soffset.......| |
|.reg...........| - | - |.eoffset...............................| |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
*/ |
typedef struct |
{ |
unsigned long opcode; |
int bits_eoffset; |
int mask_eoffset; |
int bits_dontcare; |
int mask_dontcare; |
int bits_reg; |
int mask_reg; |
int bits_soffset; |
int mask_soffset; |
int bits_c; |
int mask_c; |
int bits_rop; |
int mask_rop; |
int bits_code; |
int mask_code; |
} LoopSetup; |
#define LoopSetup_opcode 0xe0800000 |
#define LoopSetup_eoffset_bits 0 |
#define LoopSetup_eoffset_mask 0x3ff |
#define LoopSetup_dontcare_bits 10 |
#define LoopSetup_dontcare_mask 0x3 |
#define LoopSetup_reg_bits 12 |
#define LoopSetup_reg_mask 0xf |
#define LoopSetup_soffset_bits 16 |
#define LoopSetup_soffset_mask 0xf |
#define LoopSetup_c_bits 20 |
#define LoopSetup_c_mask 0x1 |
#define LoopSetup_rop_bits 21 |
#define LoopSetup_rop_mask 0x3 |
#define LoopSetup_code_bits 23 |
#define LoopSetup_code_mask 0x1ff |
#define init_LoopSetup \ |
{ \ |
LoopSetup_opcode, \ |
LoopSetup_eoffset_bits, LoopSetup_eoffset_mask, \ |
LoopSetup_dontcare_bits, LoopSetup_dontcare_mask, \ |
LoopSetup_reg_bits, LoopSetup_reg_mask, \ |
LoopSetup_soffset_bits, LoopSetup_soffset_mask, \ |
LoopSetup_c_bits, LoopSetup_c_mask, \ |
LoopSetup_rop_bits, LoopSetup_rop_mask, \ |
LoopSetup_code_bits, LoopSetup_code_mask \ |
}; |
/* LDIMMhalf |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
| 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 |.Z.|.H.|.S.|.grp...|.reg.......| |
|.hword.........................................................| |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
*/ |
typedef struct |
{ |
unsigned long opcode; |
int bits_hword; |
int mask_hword; |
int bits_reg; |
int mask_reg; |
int bits_grp; |
int mask_grp; |
int bits_S; |
int mask_S; |
int bits_H; |
int mask_H; |
int bits_Z; |
int mask_Z; |
int bits_code; |
int mask_code; |
} LDIMMhalf; |
#define LDIMMhalf_opcode 0xe1000000 |
#define LDIMMhalf_hword_bits 0 |
#define LDIMMhalf_hword_mask 0xffff |
#define LDIMMhalf_reg_bits 16 |
#define LDIMMhalf_reg_mask 0x7 |
#define LDIMMhalf_grp_bits 19 |
#define LDIMMhalf_grp_mask 0x3 |
#define LDIMMhalf_S_bits 21 |
#define LDIMMhalf_S_mask 0x1 |
#define LDIMMhalf_H_bits 22 |
#define LDIMMhalf_H_mask 0x1 |
#define LDIMMhalf_Z_bits 23 |
#define LDIMMhalf_Z_mask 0x1 |
#define LDIMMhalf_code_bits 24 |
#define LDIMMhalf_code_mask 0xff |
#define init_LDIMMhalf \ |
{ \ |
LDIMMhalf_opcode, \ |
LDIMMhalf_hword_bits, LDIMMhalf_hword_mask, \ |
LDIMMhalf_reg_bits, LDIMMhalf_reg_mask, \ |
LDIMMhalf_grp_bits, LDIMMhalf_grp_mask, \ |
LDIMMhalf_S_bits, LDIMMhalf_S_mask, \ |
LDIMMhalf_H_bits, LDIMMhalf_H_mask, \ |
LDIMMhalf_Z_bits, LDIMMhalf_Z_mask, \ |
LDIMMhalf_code_bits, LDIMMhalf_code_mask \ |
}; |
/* CC2dreg |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |.op....|.reg.......| |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
*/ |
typedef struct |
{ |
unsigned short opcode; |
int bits_reg; |
int mask_reg; |
int bits_op; |
int mask_op; |
int bits_code; |
int mask_code; |
} CC2dreg; |
#define CC2dreg_opcode 0x0200 |
#define CC2dreg_reg_bits 0 |
#define CC2dreg_reg_mask 0x7 |
#define CC2dreg_op_bits 3 |
#define CC2dreg_op_mask 0x3 |
#define CC2dreg_code_bits 5 |
#define CC2dreg_code_mask 0x7fff |
#define init_CC2dreg \ |
{ \ |
CC2dreg_opcode, \ |
CC2dreg_reg_bits, CC2dreg_reg_mask, \ |
CC2dreg_op_bits, CC2dreg_op_mask, \ |
CC2dreg_code_bits, CC2dreg_code_mask \ |
}; |
/* PTR2op |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
| 0 | 1 | 0 | 0 | 0 | 1 | 0 |.opc.......|.src.......|.dst.......| |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
*/ |
typedef struct |
{ |
unsigned short opcode; |
int bits_dst; |
int mask_dst; |
int bits_src; |
int mask_src; |
int bits_opc; |
int mask_opc; |
int bits_code; |
int mask_code; |
} PTR2op; |
#define PTR2op_opcode 0x4400 |
#define PTR2op_dst_bits 0 |
#define PTR2op_dst_mask 0x7 |
#define PTR2op_src_bits 3 |
#define PTR2op_src_mask 0x7 |
#define PTR2op_opc_bits 6 |
#define PTR2op_opc_mask 0x7 |
#define PTR2op_code_bits 9 |
#define PTR2op_code_mask 0x7f |
#define init_PTR2op \ |
{ \ |
PTR2op_opcode, \ |
PTR2op_dst_bits, PTR2op_dst_mask, \ |
PTR2op_src_bits, PTR2op_src_mask, \ |
PTR2op_opc_bits, PTR2op_opc_mask, \ |
PTR2op_code_bits, PTR2op_code_mask \ |
}; |
/* COMP3op |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
| 0 | 1 | 0 | 1 |.opc.......|.dst.......|.src1......|.src0......| |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
*/ |
typedef struct |
{ |
unsigned short opcode; |
int bits_src0; |
int mask_src0; |
int bits_src1; |
int mask_src1; |
int bits_dst; |
int mask_dst; |
int bits_opc; |
int mask_opc; |
int bits_code; |
int mask_code; |
} COMP3op; |
#define COMP3op_opcode 0x5000 |
#define COMP3op_src0_bits 0 |
#define COMP3op_src0_mask 0x7 |
#define COMP3op_src1_bits 3 |
#define COMP3op_src1_mask 0x7 |
#define COMP3op_dst_bits 6 |
#define COMP3op_dst_mask 0x7 |
#define COMP3op_opc_bits 9 |
#define COMP3op_opc_mask 0x7 |
#define COMP3op_code_bits 12 |
#define COMP3op_code_mask 0xf |
#define init_COMP3op \ |
{ \ |
COMP3op_opcode, \ |
COMP3op_src0_bits, COMP3op_src0_mask, \ |
COMP3op_src1_bits, COMP3op_src1_mask, \ |
COMP3op_dst_bits, COMP3op_dst_mask, \ |
COMP3op_opc_bits, COMP3op_opc_mask, \ |
COMP3op_code_bits, COMP3op_code_mask \ |
}; |
/* ccMV |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
| 0 | 0 | 0 | 0 | 0 | 1 | 1 |.T.|.d.|.s.|.dst.......|.src.......| |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
*/ |
typedef struct |
{ |
unsigned short opcode; |
int bits_src; |
int mask_src; |
int bits_dst; |
int mask_dst; |
int bits_s; |
int mask_s; |
int bits_d; |
int mask_d; |
int bits_T; |
int mask_T; |
int bits_code; |
int mask_code; |
} CCmv; |
#define CCmv_opcode 0x0600 |
#define CCmv_src_bits 0 |
#define CCmv_src_mask 0x7 |
#define CCmv_dst_bits 3 |
#define CCmv_dst_mask 0x7 |
#define CCmv_s_bits 6 |
#define CCmv_s_mask 0x1 |
#define CCmv_d_bits 7 |
#define CCmv_d_mask 0x1 |
#define CCmv_T_bits 8 |
#define CCmv_T_mask 0x1 |
#define CCmv_code_bits 9 |
#define CCmv_code_mask 0x7f |
#define init_CCmv \ |
{ \ |
CCmv_opcode, \ |
CCmv_src_bits, CCmv_src_mask, \ |
CCmv_dst_bits, CCmv_dst_mask, \ |
CCmv_s_bits, CCmv_s_mask, \ |
CCmv_d_bits, CCmv_d_mask, \ |
CCmv_T_bits, CCmv_T_mask, \ |
CCmv_code_bits, CCmv_code_mask \ |
}; |
/* CCflag |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
| 0 | 0 | 0 | 0 | 1 |.I.|.opc.......|.G.|.y.........|.x.........| |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
*/ |
typedef struct |
{ |
unsigned short opcode; |
int bits_x; |
int mask_x; |
int bits_y; |
int mask_y; |
int bits_G; |
int mask_G; |
int bits_opc; |
int mask_opc; |
int bits_I; |
int mask_I; |
int bits_code; |
int mask_code; |
} CCflag; |
#define CCflag_opcode 0x0800 |
#define CCflag_x_bits 0 |
#define CCflag_x_mask 0x7 |
#define CCflag_y_bits 3 |
#define CCflag_y_mask 0x7 |
#define CCflag_G_bits 6 |
#define CCflag_G_mask 0x1 |
#define CCflag_opc_bits 7 |
#define CCflag_opc_mask 0x7 |
#define CCflag_I_bits 10 |
#define CCflag_I_mask 0x1 |
#define CCflag_code_bits 11 |
#define CCflag_code_mask 0x1f |
#define init_CCflag \ |
{ \ |
CCflag_opcode, \ |
CCflag_x_bits, CCflag_x_mask, \ |
CCflag_y_bits, CCflag_y_mask, \ |
CCflag_G_bits, CCflag_G_mask, \ |
CCflag_opc_bits, CCflag_opc_mask, \ |
CCflag_I_bits, CCflag_I_mask, \ |
CCflag_code_bits, CCflag_code_mask, \ |
}; |
/* CC2stat |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |.D.|.op....|.cbit..............| |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
*/ |
typedef struct |
{ |
unsigned short opcode; |
int bits_cbit; |
int mask_cbit; |
int bits_op; |
int mask_op; |
int bits_D; |
int mask_D; |
int bits_code; |
int mask_code; |
} CC2stat; |
#define CC2stat_opcode 0x0300 |
#define CC2stat_cbit_bits 0 |
#define CC2stat_cbit_mask 0x1f |
#define CC2stat_op_bits 5 |
#define CC2stat_op_mask 0x3 |
#define CC2stat_D_bits 7 |
#define CC2stat_D_mask 0x1 |
#define CC2stat_code_bits 8 |
#define CC2stat_code_mask 0xff |
#define init_CC2stat \ |
{ \ |
CC2stat_opcode, \ |
CC2stat_cbit_bits, CC2stat_cbit_mask, \ |
CC2stat_op_bits, CC2stat_op_mask, \ |
CC2stat_D_bits, CC2stat_D_mask, \ |
CC2stat_code_bits, CC2stat_code_mask \ |
}; |
/* REGMV |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
| 0 | 0 | 1 | 1 |.gd........|.gs........|.dst.......|.src.......| |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
*/ |
typedef struct |
{ |
unsigned short opcode; |
int bits_src; |
int mask_src; |
int bits_dst; |
int mask_dst; |
int bits_gs; |
int mask_gs; |
int bits_gd; |
int mask_gd; |
int bits_code; |
int mask_code; |
} RegMv; |
#define RegMv_opcode 0x3000 |
#define RegMv_src_bits 0 |
#define RegMv_src_mask 0x7 |
#define RegMv_dst_bits 3 |
#define RegMv_dst_mask 0x7 |
#define RegMv_gs_bits 6 |
#define RegMv_gs_mask 0x7 |
#define RegMv_gd_bits 9 |
#define RegMv_gd_mask 0x7 |
#define RegMv_code_bits 12 |
#define RegMv_code_mask 0xf |
#define init_RegMv \ |
{ \ |
RegMv_opcode, \ |
RegMv_src_bits, RegMv_src_mask, \ |
RegMv_dst_bits, RegMv_dst_mask, \ |
RegMv_gs_bits, RegMv_gs_mask, \ |
RegMv_gd_bits, RegMv_gd_mask, \ |
RegMv_code_bits, RegMv_code_mask \ |
}; |
/* COMPI2opD |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
| 0 | 1 | 1 | 0 | 0 |.op|.isrc......................|.dst.......| |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
*/ |
typedef struct |
{ |
unsigned short opcode; |
int bits_dst; |
int mask_dst; |
int bits_src; |
int mask_src; |
int bits_op; |
int mask_op; |
int bits_code; |
int mask_code; |
} COMPI2opD; |
#define COMPI2opD_opcode 0x6000 |
#define COMPI2opD_dst_bits 0 |
#define COMPI2opD_dst_mask 0x7 |
#define COMPI2opD_src_bits 3 |
#define COMPI2opD_src_mask 0x7f |
#define COMPI2opD_op_bits 10 |
#define COMPI2opD_op_mask 0x1 |
#define COMPI2opD_code_bits 11 |
#define COMPI2opD_code_mask 0x1f |
#define init_COMPI2opD \ |
{ \ |
COMPI2opD_opcode, \ |
COMPI2opD_dst_bits, COMPI2opD_dst_mask, \ |
COMPI2opD_src_bits, COMPI2opD_src_mask, \ |
COMPI2opD_op_bits, COMPI2opD_op_mask, \ |
COMPI2opD_code_bits, COMPI2opD_code_mask \ |
}; |
/* COMPI2opP |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
| 0 | 1 | 1 | 0 | 1 |.op|.src.......................|.dst.......| |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
*/ |
typedef COMPI2opD COMPI2opP; |
#define COMPI2opP_opcode 0x6800 |
#define COMPI2opP_dst_bits 0 |
#define COMPI2opP_dst_mask 0x7 |
#define COMPI2opP_src_bits 3 |
#define COMPI2opP_src_mask 0x7f |
#define COMPI2opP_op_bits 10 |
#define COMPI2opP_op_mask 0x1 |
#define COMPI2opP_code_bits 11 |
#define COMPI2opP_code_mask 0x1f |
#define init_COMPI2opP \ |
{ \ |
COMPI2opP_opcode, \ |
COMPI2opP_dst_bits, COMPI2opP_dst_mask, \ |
COMPI2opP_src_bits, COMPI2opP_src_mask, \ |
COMPI2opP_op_bits, COMPI2opP_op_mask, \ |
COMPI2opP_code_bits, COMPI2opP_code_mask \ |
}; |
/* dagMODim |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
| 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 |.br| 1 | 1 |.op|.m.....|.i.....| |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
*/ |
typedef struct |
{ |
unsigned short opcode; |
int bits_i; |
int mask_i; |
int bits_m; |
int mask_m; |
int bits_op; |
int mask_op; |
int bits_code2; |
int mask_code2; |
int bits_br; |
int mask_br; |
int bits_code; |
int mask_code; |
} DagMODim; |
#define DagMODim_opcode 0x9e60 |
#define DagMODim_i_bits 0 |
#define DagMODim_i_mask 0x3 |
#define DagMODim_m_bits 2 |
#define DagMODim_m_mask 0x3 |
#define DagMODim_op_bits 4 |
#define DagMODim_op_mask 0x1 |
#define DagMODim_code2_bits 5 |
#define DagMODim_code2_mask 0x3 |
#define DagMODim_br_bits 7 |
#define DagMODim_br_mask 0x1 |
#define DagMODim_code_bits 8 |
#define DagMODim_code_mask 0xff |
#define init_DagMODim \ |
{ \ |
DagMODim_opcode, \ |
DagMODim_i_bits, DagMODim_i_mask, \ |
DagMODim_m_bits, DagMODim_m_mask, \ |
DagMODim_op_bits, DagMODim_op_mask, \ |
DagMODim_code2_bits, DagMODim_code2_mask, \ |
DagMODim_br_bits, DagMODim_br_mask, \ |
DagMODim_code_bits, DagMODim_code_mask \ |
}; |
/* dagMODik |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
| 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 |.op....|.i.....| |
+---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ |
*/ |
typedef struct |
{ |
unsigned short opcode; |
int bits_i; |
int mask_i; |
int bits_op; |
int mask_op; |
int bits_code; |
int mask_code; |
} DagMODik; |
#define DagMODik_opcode 0x9f60 |
#define DagMODik_i_bits 0 |
#define DagMODik_i_mask 0x3 |
#define DagMODik_op_bits 2 |
#define DagMODik_op_mask 0x3 |
#define DagMODik_code_bits 3 |
#define DagMODik_code_mask 0xfff |
#define init_DagMODik \ |
{ \ |
DagMODik_opcode, \ |
DagMODik_i_bits, DagMODik_i_mask, \ |
DagMODik_op_bits, DagMODik_op_mask, \ |
DagMODik_code_bits, DagMODik_code_mask \ |
}; |
#endif |
/contrib/toolchain/binutils/include/opcode/cgen.h |
---|
0,0 → 1,1480 |
/* Header file for targets using CGEN: Cpu tools GENerator. |
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2009, 2010 |
Free Software Foundation, Inc. |
This file is part of GDB, the GNU debugger, and the GNU Binutils. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License along |
with this program; if not, write to the Free Software Foundation, Inc., |
51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef OPCODE_CGEN_H |
#define OPCODE_CGEN_H |
#include "symcat.h" |
#include "cgen/bitset.h" |
/* ??? IWBN to replace bfd in the name. */ |
#include "bfd_stdint.h" |
/* ??? This file requires bfd.h but only to get bfd_vma. |
Seems like an awful lot to require just to get such a fundamental type. |
Perhaps the definition of bfd_vma can be moved outside of bfd.h. |
Or perhaps one could duplicate its definition in another file. |
Until such time, this file conditionally compiles definitions that require |
bfd_vma using __BFD_H_SEEN__. */ |
/* Enums must be defined before they can be used. |
Allow them to be used in struct definitions, even though the enum must |
be defined elsewhere. |
If CGEN_ARCH isn't defined, this file is being included by something other |
than <arch>-desc.h. */ |
/* Prepend the arch name, defined in <arch>-desc.h, and _cgen_ to symbol S. |
The lack of spaces in the arg list is important for non-stdc systems. |
This file is included by <arch>-desc.h. |
It can be included independently of <arch>-desc.h, in which case the arch |
dependent portions will be declared as "unknown_cgen_foo". */ |
#ifndef CGEN_SYM |
#define CGEN_SYM(s) CONCAT3 (unknown,_cgen_,s) |
#endif |
/* This file contains the static (unchanging) pieces and as much other stuff |
as we can reasonably put here. It's generally cleaner to put stuff here |
rather than having it machine generated if possible. */ |
/* The assembler syntax is made up of expressions (duh...). |
At the lowest level the values are mnemonics, register names, numbers, etc. |
Above that are subexpressions, if any (an example might be the |
"effective address" in m68k cpus). Subexpressions are wip. |
At the second highest level are the insns themselves. Above that are |
pseudo-insns, synthetic insns, and macros, if any. */ |
/* Lots of cpu's have a fixed insn size, or one which rarely changes, |
and it's generally easier to handle these by treating the insn as an |
integer type, rather than an array of characters. So we allow targets |
to control this. When an integer type the value is in host byte order, |
when an array of characters the value is in target byte order. */ |
typedef unsigned int CGEN_INSN_INT; |
typedef int64_t CGEN_INSN_LGSINT; /* large/long SINT */ |
typedef uint64_t CGEN_INSN_LGUINT; /* large/long UINT */ |
#if CGEN_INT_INSN_P |
typedef CGEN_INSN_INT CGEN_INSN_BYTES; |
typedef CGEN_INSN_INT *CGEN_INSN_BYTES_PTR; |
#else |
typedef unsigned char *CGEN_INSN_BYTES; |
typedef unsigned char *CGEN_INSN_BYTES_PTR; |
#endif |
#ifdef __GNUC__ |
#define CGEN_INLINE __inline__ |
#else |
#define CGEN_INLINE |
#endif |
enum cgen_endian |
{ |
CGEN_ENDIAN_UNKNOWN, |
CGEN_ENDIAN_LITTLE, |
CGEN_ENDIAN_BIG |
}; |
/* Forward decl. */ |
typedef struct cgen_insn CGEN_INSN; |
/* Opaque pointer version for use by external world. */ |
typedef struct cgen_cpu_desc *CGEN_CPU_DESC; |
/* Attributes. |
Attributes are used to describe various random things associated with |
an object (ifield, hardware, operand, insn, whatever) and are specified |
as name/value pairs. |
Integer attributes computed at compile time are currently all that's |
supported, though adding string attributes and run-time computation is |
straightforward. Integer attribute values are always host int's |
(signed or unsigned). For portability, this means 32 bits. |
Integer attributes are further categorized as boolean, bitset, integer, |
and enum types. Boolean attributes appear frequently enough that they're |
recorded in one host int. This limits the maximum number of boolean |
attributes to 32, though that's a *lot* of attributes. */ |
/* Type of attribute values. */ |
typedef CGEN_BITSET CGEN_ATTR_VALUE_BITSET_TYPE; |
typedef int CGEN_ATTR_VALUE_ENUM_TYPE; |
typedef union |
{ |
CGEN_ATTR_VALUE_BITSET_TYPE bitset; |
CGEN_ATTR_VALUE_ENUM_TYPE nonbitset; |
} CGEN_ATTR_VALUE_TYPE; |
/* Struct to record attribute information. */ |
typedef struct |
{ |
/* Boolean attributes. */ |
unsigned int bool_; |
/* Non-boolean integer attributes. */ |
CGEN_ATTR_VALUE_TYPE nonbool[1]; |
} CGEN_ATTR; |
/* Define a structure member for attributes with N non-boolean entries. |
There is no maximum number of non-boolean attributes. |
There is a maximum of 32 boolean attributes (since they are all recorded |
in one host int). */ |
#define CGEN_ATTR_TYPE(n) \ |
struct { unsigned int bool_; \ |
CGEN_ATTR_VALUE_TYPE nonbool[(n) ? (n) : 1]; } |
/* Return the boolean attributes. */ |
#define CGEN_ATTR_BOOLS(a) ((a)->bool_) |
/* Non-boolean attribute numbers are offset by this much. */ |
#define CGEN_ATTR_NBOOL_OFFSET 32 |
/* Given a boolean attribute number, return its mask. */ |
#define CGEN_ATTR_MASK(attr) (1 << (attr)) |
/* Return the value of boolean attribute ATTR in ATTRS. */ |
#define CGEN_BOOL_ATTR(attrs, attr) ((CGEN_ATTR_MASK (attr) & (attrs)) != 0) |
/* Return value of attribute ATTR in ATTR_TABLE for OBJ. |
OBJ is a pointer to the entity that has the attributes |
(??? not used at present but is reserved for future purposes - eventually |
the goal is to allow recording attributes in source form and computing |
them lazily at runtime, not sure of the details yet). */ |
#define CGEN_ATTR_VALUE(obj, attr_table, attr) \ |
((unsigned int) (attr) < CGEN_ATTR_NBOOL_OFFSET \ |
? ((CGEN_ATTR_BOOLS (attr_table) & CGEN_ATTR_MASK (attr)) != 0) \ |
: ((attr_table)->nonbool[(attr) - CGEN_ATTR_NBOOL_OFFSET].nonbitset)) |
#define CGEN_BITSET_ATTR_VALUE(obj, attr_table, attr) \ |
((attr_table)->nonbool[(attr) - CGEN_ATTR_NBOOL_OFFSET].bitset) |
/* Attribute name/value tables. |
These are used to assist parsing of descriptions at run-time. */ |
typedef struct |
{ |
const char * name; |
unsigned value; |
} CGEN_ATTR_ENTRY; |
/* For each domain (ifld,hw,operand,insn), list of attributes. */ |
typedef struct |
{ |
const char * name; |
const CGEN_ATTR_ENTRY * dfault; |
const CGEN_ATTR_ENTRY * vals; |
} CGEN_ATTR_TABLE; |
/* Instruction set variants. */ |
typedef struct { |
const char *name; |
/* Default instruction size (in bits). |
This is used by the assembler when it encounters an unknown insn. */ |
unsigned int default_insn_bitsize; |
/* Base instruction size (in bits). |
For non-LIW cpus this is generally the length of the smallest insn. |
For LIW cpus its wip (work-in-progress). For the m32r its 32. */ |
unsigned int base_insn_bitsize; |
/* Minimum/maximum instruction size (in bits). */ |
unsigned int min_insn_bitsize; |
unsigned int max_insn_bitsize; |
} CGEN_ISA; |
/* Machine variants. */ |
typedef struct { |
const char *name; |
/* The argument to bfd_arch_info->scan. */ |
const char *bfd_name; |
/* one of enum mach_attr */ |
int num; |
/* parameter from mach->cpu */ |
unsigned int insn_chunk_bitsize; |
} CGEN_MACH; |
/* Parse result (also extraction result). |
The result of parsing an insn is stored here. |
To generate the actual insn, this is passed to the insert handler. |
When printing an insn, the result of extraction is stored here. |
To print the insn, this is passed to the print handler. |
It is machine generated so we don't define it here, |
but we do need a forward decl for the handler fns. |
There is one member for each possible field in the insn. |
The type depends on the field. |
Also recorded here is the computed length of the insn for architectures |
where it varies. |
*/ |
typedef struct cgen_fields CGEN_FIELDS; |
/* Total length of the insn, as recorded in the `fields' struct. */ |
/* ??? The field insert handler has lots of opportunities for optimization |
if it ever gets inlined. On architectures where insns all have the same |
size, may wish to detect that and make this macro a constant - to allow |
further optimizations. */ |
#define CGEN_FIELDS_BITSIZE(fields) ((fields)->length) |
/* Extraction support for variable length insn sets. */ |
/* When disassembling we don't know the number of bytes to read at the start. |
So the first CGEN_BASE_INSN_SIZE bytes are read at the start and the rest |
are read when needed. This struct controls this. It is basically the |
disassemble_info stuff, except that we provide a cache for values already |
read (since bytes can typically be read several times to fetch multiple |
operands that may be in them), and that extraction of fields is needed |
in contexts other than disassembly. */ |
typedef struct { |
/* A pointer to the disassemble_info struct. |
We don't require dis-asm.h so we use void * for the type here. |
If NULL, BYTES is full of valid data (VALID == -1). */ |
void *dis_info; |
/* Points to a working buffer of sufficient size. */ |
unsigned char *insn_bytes; |
/* Mask of bytes that are valid in INSN_BYTES. */ |
unsigned int valid; |
} CGEN_EXTRACT_INFO; |
/* Associated with each insn or expression is a set of "handlers" for |
performing operations like parsing, printing, etc. These require a bfd_vma |
value to be passed around but we don't want all applications to need bfd.h. |
So this stuff is only provided if bfd.h has been included. */ |
/* Parse handler. |
CD is a cpu table descriptor. |
INSN is a pointer to a struct describing the insn being parsed. |
STRP is a pointer to a pointer to the text being parsed. |
FIELDS is a pointer to a cgen_fields struct in which the results are placed. |
If the expression is successfully parsed, *STRP is updated. |
If not it is left alone. |
The result is NULL if success or an error message. */ |
typedef const char * (cgen_parse_fn) |
(CGEN_CPU_DESC, const CGEN_INSN *insn_, |
const char **strp_, CGEN_FIELDS *fields_); |
/* Insert handler. |
CD is a cpu table descriptor. |
INSN is a pointer to a struct describing the insn being parsed. |
FIELDS is a pointer to a cgen_fields struct from which the values |
are fetched. |
INSNP is a pointer to a buffer in which to place the insn. |
PC is the pc value of the insn. |
The result is an error message or NULL if success. */ |
#ifdef __BFD_H_SEEN__ |
typedef const char * (cgen_insert_fn) |
(CGEN_CPU_DESC, const CGEN_INSN *insn_, |
CGEN_FIELDS *fields_, CGEN_INSN_BYTES_PTR insnp_, |
bfd_vma pc_); |
#else |
typedef const char * (cgen_insert_fn) (); |
#endif |
/* Extract handler. |
CD is a cpu table descriptor. |
INSN is a pointer to a struct describing the insn being parsed. |
The second argument is a pointer to a struct controlling extraction |
(only used for variable length insns). |
EX_INFO is a pointer to a struct for controlling reading of further |
bytes for the insn. |
BASE_INSN is the first CGEN_BASE_INSN_SIZE bytes (host order). |
FIELDS is a pointer to a cgen_fields struct in which the results are placed. |
PC is the pc value of the insn. |
The result is the length of the insn in bits or zero if not recognized. */ |
#ifdef __BFD_H_SEEN__ |
typedef int (cgen_extract_fn) |
(CGEN_CPU_DESC, const CGEN_INSN *insn_, |
CGEN_EXTRACT_INFO *ex_info_, CGEN_INSN_INT base_insn_, |
CGEN_FIELDS *fields_, bfd_vma pc_); |
#else |
typedef int (cgen_extract_fn) (); |
#endif |
/* Print handler. |
CD is a cpu table descriptor. |
INFO is a pointer to the disassembly info. |
Eg: disassemble_info. It's defined as `PTR' so this file can be included |
without dis-asm.h. |
INSN is a pointer to a struct describing the insn being printed. |
FIELDS is a pointer to a cgen_fields struct. |
PC is the pc value of the insn. |
LEN is the length of the insn, in bits. */ |
#ifdef __BFD_H_SEEN__ |
typedef void (cgen_print_fn) |
(CGEN_CPU_DESC, void * info_, const CGEN_INSN *insn_, |
CGEN_FIELDS *fields_, bfd_vma pc_, int len_); |
#else |
typedef void (cgen_print_fn) (); |
#endif |
/* Parse/insert/extract/print handlers. |
Indices into the handler tables. |
We could use pointers here instead, but 90% of them are generally identical |
and that's a lot of redundant data. Making these unsigned char indices |
into tables of pointers saves a bit of space. |
Using indices also keeps assembler code out of the disassembler and |
vice versa. */ |
struct cgen_opcode_handler |
{ |
unsigned char parse, insert, extract, print; |
}; |
/* Assembler interface. |
The interface to the assembler is intended to be clean in the sense that |
libopcodes.a is a standalone entity and could be used with any assembler. |
Not that one would necessarily want to do that but rather that it helps |
keep a clean interface. The interface will obviously be slanted towards |
GAS, but at least it's a start. |
??? Note that one possible user of the assembler besides GAS is GDB. |
Parsing is controlled by the assembler which calls |
CGEN_SYM (assemble_insn). If it can parse and build the entire insn |
it doesn't call back to the assembler. If it needs/wants to call back |
to the assembler, cgen_parse_operand_fn is called which can either |
- return a number to be inserted in the insn |
- return a "register" value to be inserted |
(the register might not be a register per pe) |
- queue the argument and return a marker saying the expression has been |
queued (eg: a fix-up) |
- return an error message indicating the expression wasn't recognizable |
The result is an error message or NULL for success. |
The parsed value is stored in the bfd_vma *. */ |
/* Values for indicating what the caller wants. */ |
enum cgen_parse_operand_type |
{ |
CGEN_PARSE_OPERAND_INIT, |
CGEN_PARSE_OPERAND_INTEGER, |
CGEN_PARSE_OPERAND_ADDRESS, |
CGEN_PARSE_OPERAND_SYMBOLIC |
}; |
/* Values for indicating what was parsed. */ |
enum cgen_parse_operand_result |
{ |
CGEN_PARSE_OPERAND_RESULT_NUMBER, |
CGEN_PARSE_OPERAND_RESULT_REGISTER, |
CGEN_PARSE_OPERAND_RESULT_QUEUED, |
CGEN_PARSE_OPERAND_RESULT_ERROR |
}; |
#ifdef __BFD_H_SEEN__ /* Don't require bfd.h unnecessarily. */ |
typedef const char * (cgen_parse_operand_fn) |
(CGEN_CPU_DESC, |
enum cgen_parse_operand_type, const char **, int, int, |
enum cgen_parse_operand_result *, bfd_vma *); |
#else |
typedef const char * (cgen_parse_operand_fn) (); |
#endif |
/* Set the cgen_parse_operand_fn callback. */ |
extern void cgen_set_parse_operand_fn |
(CGEN_CPU_DESC, cgen_parse_operand_fn); |
/* Called before trying to match a table entry with the insn. */ |
extern void cgen_init_parse_operand (CGEN_CPU_DESC); |
/* Operand values (keywords, integers, symbols, etc.) */ |
/* Types of assembler elements. */ |
enum cgen_asm_type |
{ |
CGEN_ASM_NONE, CGEN_ASM_KEYWORD, CGEN_ASM_MAX |
}; |
#ifndef CGEN_ARCH |
enum cgen_hw_type { CGEN_HW_MAX }; |
#endif |
/* List of hardware elements. */ |
typedef struct |
{ |
char *name; |
enum cgen_hw_type type; |
/* There is currently no example where both index specs and value specs |
are required, so for now both are clumped under "asm_data". */ |
enum cgen_asm_type asm_type; |
void *asm_data; |
#ifndef CGEN_HW_NBOOL_ATTRS |
#define CGEN_HW_NBOOL_ATTRS 1 |
#endif |
CGEN_ATTR_TYPE (CGEN_HW_NBOOL_ATTRS) attrs; |
#define CGEN_HW_ATTRS(hw) (&(hw)->attrs) |
} CGEN_HW_ENTRY; |
/* Return value of attribute ATTR in HW. */ |
#define CGEN_HW_ATTR_VALUE(hw, attr) \ |
CGEN_ATTR_VALUE ((hw), CGEN_HW_ATTRS (hw), (attr)) |
/* Table of hardware elements for selected mach, computed at runtime. |
enum cgen_hw_type is an index into this table (specifically `entries'). */ |
typedef struct { |
/* Pointer to null terminated table of all compiled in entries. */ |
const CGEN_HW_ENTRY *init_entries; |
unsigned int entry_size; /* since the attribute member is variable sized */ |
/* Array of all entries, initial and run-time added. */ |
const CGEN_HW_ENTRY **entries; |
/* Number of elements in `entries'. */ |
unsigned int num_entries; |
/* For now, xrealloc is called each time a new entry is added at runtime. |
??? May wish to keep track of some slop to reduce the number of calls to |
xrealloc, except that there's unlikely to be many and not expected to be |
in speed critical code. */ |
} CGEN_HW_TABLE; |
extern const CGEN_HW_ENTRY * cgen_hw_lookup_by_name |
(CGEN_CPU_DESC, const char *); |
extern const CGEN_HW_ENTRY * cgen_hw_lookup_by_num |
(CGEN_CPU_DESC, unsigned int); |
/* This struct is used to describe things like register names, etc. */ |
typedef struct cgen_keyword_entry |
{ |
/* Name (as in register name). */ |
char * name; |
/* Value (as in register number). |
The value cannot be -1 as that is used to indicate "not found". |
IDEA: Have "FUNCTION" attribute? [function is called to fetch value]. */ |
int value; |
/* Attributes. |
This should, but technically needn't, appear last. It is a variable sized |
array in that one architecture may have 1 nonbool attribute and another |
may have more. Having this last means the non-architecture specific code |
needn't care. The goal is to eventually record |
attributes in their raw form, evaluate them at run-time, and cache the |
values, so this worry will go away anyway. */ |
/* ??? Moving this last should be done by treating keywords like insn lists |
and moving the `next' fields into a CGEN_KEYWORD_LIST struct. */ |
/* FIXME: Not used yet. */ |
#ifndef CGEN_KEYWORD_NBOOL_ATTRS |
#define CGEN_KEYWORD_NBOOL_ATTRS 1 |
#endif |
CGEN_ATTR_TYPE (CGEN_KEYWORD_NBOOL_ATTRS) attrs; |
/* ??? Putting these here means compiled in entries can't be const. |
Not a really big deal, but something to consider. */ |
/* Next name hash table entry. */ |
struct cgen_keyword_entry *next_name; |
/* Next value hash table entry. */ |
struct cgen_keyword_entry *next_value; |
} CGEN_KEYWORD_ENTRY; |
/* Top level struct for describing a set of related keywords |
(e.g. register names). |
This struct supports run-time entry of new values, and hashed lookups. */ |
typedef struct cgen_keyword |
{ |
/* Pointer to initial [compiled in] values. */ |
CGEN_KEYWORD_ENTRY *init_entries; |
/* Number of entries in `init_entries'. */ |
unsigned int num_init_entries; |
/* Hash table used for name lookup. */ |
CGEN_KEYWORD_ENTRY **name_hash_table; |
/* Hash table used for value lookup. */ |
CGEN_KEYWORD_ENTRY **value_hash_table; |
/* Number of entries in the hash_tables. */ |
unsigned int hash_table_size; |
/* Pointer to null keyword "" entry if present. */ |
const CGEN_KEYWORD_ENTRY *null_entry; |
/* String containing non-alphanumeric characters used |
in keywords. |
At present, the highest number of entries used is 1. */ |
char nonalpha_chars[8]; |
} CGEN_KEYWORD; |
/* Structure used for searching. */ |
typedef struct |
{ |
/* Table being searched. */ |
const CGEN_KEYWORD *table; |
/* Specification of what is being searched for. */ |
const char *spec; |
/* Current index in hash table. */ |
unsigned int current_hash; |
/* Current element in current hash chain. */ |
CGEN_KEYWORD_ENTRY *current_entry; |
} CGEN_KEYWORD_SEARCH; |
/* Lookup a keyword from its name. */ |
const CGEN_KEYWORD_ENTRY *cgen_keyword_lookup_name |
(CGEN_KEYWORD *, const char *); |
/* Lookup a keyword from its value. */ |
const CGEN_KEYWORD_ENTRY *cgen_keyword_lookup_value |
(CGEN_KEYWORD *, int); |
/* Add a keyword. */ |
void cgen_keyword_add (CGEN_KEYWORD *, CGEN_KEYWORD_ENTRY *); |
/* Keyword searching. |
This can be used to retrieve every keyword, or a subset. */ |
CGEN_KEYWORD_SEARCH cgen_keyword_search_init |
(CGEN_KEYWORD *, const char *); |
const CGEN_KEYWORD_ENTRY *cgen_keyword_search_next |
(CGEN_KEYWORD_SEARCH *); |
/* Operand value support routines. */ |
extern const char *cgen_parse_keyword |
(CGEN_CPU_DESC, const char **, CGEN_KEYWORD *, long *); |
#ifdef __BFD_H_SEEN__ /* Don't require bfd.h unnecessarily. */ |
extern const char *cgen_parse_signed_integer |
(CGEN_CPU_DESC, const char **, int, long *); |
extern const char *cgen_parse_unsigned_integer |
(CGEN_CPU_DESC, const char **, int, unsigned long *); |
extern const char *cgen_parse_address |
(CGEN_CPU_DESC, const char **, int, int, |
enum cgen_parse_operand_result *, bfd_vma *); |
extern const char *cgen_validate_signed_integer |
(long, long, long); |
extern const char *cgen_validate_unsigned_integer |
(unsigned long, unsigned long, unsigned long); |
#endif |
/* Operand modes. */ |
/* ??? This duplicates the values in arch.h. Revisit. |
These however need the CGEN_ prefix [as does everything in this file]. */ |
/* ??? Targets may need to add their own modes so we may wish to move this |
to <arch>-opc.h, or add a hook. */ |
enum cgen_mode { |
CGEN_MODE_VOID, /* ??? rename simulator's VM to VOID? */ |
CGEN_MODE_BI, CGEN_MODE_QI, CGEN_MODE_HI, CGEN_MODE_SI, CGEN_MODE_DI, |
CGEN_MODE_UBI, CGEN_MODE_UQI, CGEN_MODE_UHI, CGEN_MODE_USI, CGEN_MODE_UDI, |
CGEN_MODE_SF, CGEN_MODE_DF, CGEN_MODE_XF, CGEN_MODE_TF, |
CGEN_MODE_TARGET_MAX, |
CGEN_MODE_INT, CGEN_MODE_UINT, |
CGEN_MODE_MAX |
}; |
/* FIXME: Until simulator is updated. */ |
#define CGEN_MODE_VM CGEN_MODE_VOID |
/* Operands. */ |
#ifndef CGEN_ARCH |
enum cgen_operand_type { CGEN_OPERAND_MAX }; |
#endif |
/* "nil" indicator for the operand instance table */ |
#define CGEN_OPERAND_NIL CGEN_OPERAND_MAX |
/* A tree of these structs represents the multi-ifield |
structure of an operand's hw-index value, if it exists. */ |
struct cgen_ifld; |
typedef struct cgen_maybe_multi_ifield |
{ |
int count; /* 0: indexed by single cgen_ifld (possibly null: dead entry); |
n: indexed by array of more cgen_maybe_multi_ifields. */ |
union |
{ |
const void *p; |
const struct cgen_maybe_multi_ifield * multi; |
const struct cgen_ifld * leaf; |
} val; |
} |
CGEN_MAYBE_MULTI_IFLD; |
/* This struct defines each entry in the operand table. */ |
typedef struct |
{ |
/* Name as it appears in the syntax string. */ |
char *name; |
/* Operand type. */ |
enum cgen_operand_type type; |
/* The hardware element associated with this operand. */ |
enum cgen_hw_type hw_type; |
/* FIXME: We don't yet record ifield definitions, which we should. |
When we do it might make sense to delete start/length (since they will |
be duplicated in the ifield's definition) and replace them with a |
pointer to the ifield entry. */ |
/* Bit position. |
This is just a hint, and may be unused in more complex operands. |
May be unused for a modifier. */ |
unsigned char start; |
/* The number of bits in the operand. |
This is just a hint, and may be unused in more complex operands. |
May be unused for a modifier. */ |
unsigned char length; |
/* The (possibly-multi) ifield used as an index for this operand, if it |
is indexed by a field at all. This substitutes / extends the start and |
length fields above, but unsure at this time whether they are used |
anywhere. */ |
CGEN_MAYBE_MULTI_IFLD index_fields; |
#if 0 /* ??? Interesting idea but relocs tend to get too complicated, |
and ABI dependent, for simple table lookups to work. */ |
/* Ideally this would be the internal (external?) reloc type. */ |
int reloc_type; |
#endif |
/* Attributes. |
This should, but technically needn't, appear last. It is a variable sized |
array in that one architecture may have 1 nonbool attribute and another |
may have more. Having this last means the non-architecture specific code |
needn't care, now or tomorrow. The goal is to eventually record |
attributes in their raw form, evaluate them at run-time, and cache the |
values, so this worry will go away anyway. */ |
#ifndef CGEN_OPERAND_NBOOL_ATTRS |
#define CGEN_OPERAND_NBOOL_ATTRS 1 |
#endif |
CGEN_ATTR_TYPE (CGEN_OPERAND_NBOOL_ATTRS) attrs; |
#define CGEN_OPERAND_ATTRS(operand) (&(operand)->attrs) |
} CGEN_OPERAND; |
/* Return value of attribute ATTR in OPERAND. */ |
#define CGEN_OPERAND_ATTR_VALUE(operand, attr) \ |
CGEN_ATTR_VALUE ((operand), CGEN_OPERAND_ATTRS (operand), (attr)) |
/* Table of operands for selected mach/isa, computed at runtime. |
enum cgen_operand_type is an index into this table (specifically |
`entries'). */ |
typedef struct { |
/* Pointer to null terminated table of all compiled in entries. */ |
const CGEN_OPERAND *init_entries; |
unsigned int entry_size; /* since the attribute member is variable sized */ |
/* Array of all entries, initial and run-time added. */ |
const CGEN_OPERAND **entries; |
/* Number of elements in `entries'. */ |
unsigned int num_entries; |
/* For now, xrealloc is called each time a new entry is added at runtime. |
??? May wish to keep track of some slop to reduce the number of calls to |
xrealloc, except that there's unlikely to be many and not expected to be |
in speed critical code. */ |
} CGEN_OPERAND_TABLE; |
extern const CGEN_OPERAND * cgen_operand_lookup_by_name |
(CGEN_CPU_DESC, const char *); |
extern const CGEN_OPERAND * cgen_operand_lookup_by_num |
(CGEN_CPU_DESC, int); |
/* Instruction operand instances. |
For each instruction, a list of the hardware elements that are read and |
written are recorded. */ |
/* The type of the instance. */ |
enum cgen_opinst_type { |
/* End of table marker. */ |
CGEN_OPINST_END = 0, |
CGEN_OPINST_INPUT, CGEN_OPINST_OUTPUT |
}; |
typedef struct |
{ |
/* Input or output indicator. */ |
enum cgen_opinst_type type; |
/* Name of operand. */ |
const char *name; |
/* The hardware element referenced. */ |
enum cgen_hw_type hw_type; |
/* The mode in which the operand is being used. */ |
enum cgen_mode mode; |
/* The operand table entry CGEN_OPERAND_NIL if there is none |
(i.e. an explicit hardware reference). */ |
enum cgen_operand_type op_type; |
/* If `operand' is "nil", the index (e.g. into array of registers). */ |
int index; |
/* Attributes. |
??? This perhaps should be a real attribute struct but there's |
no current need, so we save a bit of space and just have a set of |
flags. The interface is such that this can easily be made attributes |
should it prove useful. */ |
unsigned int attrs; |
#define CGEN_OPINST_ATTRS(opinst) ((opinst)->attrs) |
/* Return value of attribute ATTR in OPINST. */ |
#define CGEN_OPINST_ATTR(opinst, attr) \ |
((CGEN_OPINST_ATTRS (opinst) & (attr)) != 0) |
/* Operand is conditionally referenced (read/written). */ |
#define CGEN_OPINST_COND_REF 1 |
} CGEN_OPINST; |
/* Syntax string. |
Each insn format and subexpression has one of these. |
The syntax "string" consists of characters (n > 0 && n < 128), and operand |
values (n >= 128), and is terminated by 0. Operand values are 128 + index |
into the operand table. The operand table doesn't exist in C, per se, as |
the data is recorded in the parse/insert/extract/print switch statements. */ |
/* This should be at least as large as necessary for any target. */ |
#define CGEN_MAX_SYNTAX_ELEMENTS 48 |
/* A target may know its own precise maximum. Assert that it falls below |
the above limit. */ |
#ifdef CGEN_ACTUAL_MAX_SYNTAX_ELEMENTS |
#if CGEN_ACTUAL_MAX_SYNTAX_ELEMENTS > CGEN_MAX_SYNTAX_ELEMENTS |
#error "CGEN_ACTUAL_MAX_SYNTAX_ELEMENTS too high - enlarge CGEN_MAX_SYNTAX_ELEMENTS" |
#endif |
#endif |
typedef unsigned short CGEN_SYNTAX_CHAR_TYPE; |
typedef struct |
{ |
CGEN_SYNTAX_CHAR_TYPE syntax[CGEN_MAX_SYNTAX_ELEMENTS]; |
} CGEN_SYNTAX; |
#define CGEN_SYNTAX_STRING(syn) (syn->syntax) |
#define CGEN_SYNTAX_CHAR_P(c) ((c) < 128) |
#define CGEN_SYNTAX_CHAR(c) ((unsigned char)c) |
#define CGEN_SYNTAX_FIELD(c) ((c) - 128) |
#define CGEN_SYNTAX_MAKE_FIELD(c) ((c) + 128) |
/* ??? I can't currently think of any case where the mnemonic doesn't come |
first [and if one ever doesn't building the hash tables will be tricky]. |
However, we treat mnemonics as just another operand of the instruction. |
A value of 1 means "this is where the mnemonic appears". 1 isn't |
special other than it's a non-printable ASCII char. */ |
#define CGEN_SYNTAX_MNEMONIC 1 |
#define CGEN_SYNTAX_MNEMONIC_P(ch) ((ch) == CGEN_SYNTAX_MNEMONIC) |
/* Instruction fields. |
??? We currently don't allow adding fields at run-time. |
Easy to fix when needed. */ |
typedef struct cgen_ifld { |
/* Enum of ifield. */ |
int num; |
#define CGEN_IFLD_NUM(f) ((f)->num) |
/* Name of the field, distinguishes it from all other fields. */ |
const char *name; |
#define CGEN_IFLD_NAME(f) ((f)->name) |
/* Default offset, in bits, from the start of the insn to the word |
containing the field. */ |
int word_offset; |
#define CGEN_IFLD_WORD_OFFSET(f) ((f)->word_offset) |
/* Default length of the word containing the field. */ |
int word_size; |
#define CGEN_IFLD_WORD_SIZE(f) ((f)->word_size) |
/* Default starting bit number. |
Whether lsb=0 or msb=0 is determined by CGEN_INSN_LSB0_P. */ |
int start; |
#define CGEN_IFLD_START(f) ((f)->start) |
/* Length of the field, in bits. */ |
int length; |
#define CGEN_IFLD_LENGTH(f) ((f)->length) |
#ifndef CGEN_IFLD_NBOOL_ATTRS |
#define CGEN_IFLD_NBOOL_ATTRS 1 |
#endif |
CGEN_ATTR_TYPE (CGEN_IFLD_NBOOL_ATTRS) attrs; |
#define CGEN_IFLD_ATTRS(f) (&(f)->attrs) |
} CGEN_IFLD; |
/* Return value of attribute ATTR in IFLD. */ |
#define CGEN_IFLD_ATTR_VALUE(ifld, attr) \ |
CGEN_ATTR_VALUE ((ifld), CGEN_IFLD_ATTRS (ifld), (attr)) |
/* Instruction data. */ |
/* Instruction formats. |
Instructions are grouped by format. Associated with an instruction is its |
format. Each insn's opcode table entry contains a format table entry. |
??? There is usually very few formats compared with the number of insns, |
so one can reduce the size of the opcode table by recording the format table |
as a separate entity. Given that we currently don't, format table entries |
are also distinguished by their operands. This increases the size of the |
table, but reduces the number of tables. It's all minutiae anyway so it |
doesn't really matter [at this point in time]. |
??? Support for variable length ISA's is wip. */ |
/* Accompanying each iformat description is a list of its fields. */ |
typedef struct { |
const CGEN_IFLD *ifld; |
#define CGEN_IFMT_IFLD_IFLD(ii) ((ii)->ifld) |
} CGEN_IFMT_IFLD; |
/* This should be at least as large as necessary for any target. */ |
#define CGEN_MAX_IFMT_OPERANDS 16 |
/* A target may know its own precise maximum. Assert that it falls below |
the above limit. */ |
#ifdef CGEN_ACTUAL_MAX_IFMT_OPERANDS |
#if CGEN_ACTUAL_MAX_IFMT_OPERANDS > CGEN_MAX_IFMT_OPERANDS |
#error "CGEN_ACTUAL_MAX_IFMT_OPERANDS too high - enlarge CGEN_MAX_IFMT_OPERANDS" |
#endif |
#endif |
typedef struct |
{ |
/* Length that MASK and VALUE have been calculated to |
[VALUE is recorded elsewhere]. |
Normally it is base_insn_bitsize. On [V]LIW architectures where the base |
insn size may be larger than the size of an insn, this field is less than |
base_insn_bitsize. */ |
unsigned char mask_length; |
#define CGEN_IFMT_MASK_LENGTH(ifmt) ((ifmt)->mask_length) |
/* Total length of instruction, in bits. */ |
unsigned char length; |
#define CGEN_IFMT_LENGTH(ifmt) ((ifmt)->length) |
/* Mask to apply to the first MASK_LENGTH bits. |
Each insn's value is stored with the insn. |
The first step in recognizing an insn for disassembly is |
(opcode & mask) == value. */ |
CGEN_INSN_INT mask; |
#define CGEN_IFMT_MASK(ifmt) ((ifmt)->mask) |
/* Instruction fields. |
+1 for trailing NULL. */ |
CGEN_IFMT_IFLD iflds[CGEN_MAX_IFMT_OPERANDS + 1]; |
#define CGEN_IFMT_IFLDS(ifmt) ((ifmt)->iflds) |
} CGEN_IFMT; |
/* Instruction values. */ |
typedef struct |
{ |
/* The opcode portion of the base insn. */ |
CGEN_INSN_INT base_value; |
#ifdef CGEN_MAX_EXTRA_OPCODE_OPERANDS |
/* Extra opcode values beyond base_value. */ |
unsigned long ifield_values[CGEN_MAX_EXTRA_OPCODE_OPERANDS]; |
#endif |
} CGEN_IVALUE; |
/* Instruction opcode table. |
This contains the syntax and format data of an instruction. */ |
/* ??? Some ports already have an opcode table yet still need to use the rest |
of what cgen_insn has. Plus keeping the opcode data with the operand |
instance data can create a pretty big file. So we keep them separately. |
Not sure this is a good idea in the long run. */ |
typedef struct |
{ |
/* Indices into parse/insert/extract/print handler tables. */ |
struct cgen_opcode_handler handlers; |
#define CGEN_OPCODE_HANDLERS(opc) (& (opc)->handlers) |
/* Syntax string. */ |
CGEN_SYNTAX syntax; |
#define CGEN_OPCODE_SYNTAX(opc) (& (opc)->syntax) |
/* Format entry. */ |
const CGEN_IFMT *format; |
#define CGEN_OPCODE_FORMAT(opc) ((opc)->format) |
#define CGEN_OPCODE_MASK_BITSIZE(opc) CGEN_IFMT_MASK_LENGTH (CGEN_OPCODE_FORMAT (opc)) |
#define CGEN_OPCODE_BITSIZE(opc) CGEN_IFMT_LENGTH (CGEN_OPCODE_FORMAT (opc)) |
#define CGEN_OPCODE_IFLDS(opc) CGEN_IFMT_IFLDS (CGEN_OPCODE_FORMAT (opc)) |
/* Instruction opcode value. */ |
CGEN_IVALUE value; |
#define CGEN_OPCODE_VALUE(opc) (& (opc)->value) |
#define CGEN_OPCODE_BASE_VALUE(opc) (CGEN_OPCODE_VALUE (opc)->base_value) |
#define CGEN_OPCODE_BASE_MASK(opc) CGEN_IFMT_MASK (CGEN_OPCODE_FORMAT (opc)) |
} CGEN_OPCODE; |
/* Instruction attributes. |
This is made a published type as applications can cache a pointer to |
the attributes for speed. */ |
#ifndef CGEN_INSN_NBOOL_ATTRS |
#define CGEN_INSN_NBOOL_ATTRS 1 |
#endif |
typedef CGEN_ATTR_TYPE (CGEN_INSN_NBOOL_ATTRS) CGEN_INSN_ATTR_TYPE; |
/* Enum of architecture independent attributes. */ |
#ifndef CGEN_ARCH |
/* ??? Numbers here are recorded in two places. */ |
typedef enum cgen_insn_attr { |
CGEN_INSN_ALIAS = 0 |
} CGEN_INSN_ATTR; |
#define CGEN_ATTR_CGEN_INSN_ALIAS_VALUE(attrs) ((attrs)->bool_ & (1 << CGEN_INSN_ALIAS)) |
#endif |
/* This struct defines each entry in the instruction table. */ |
typedef struct |
{ |
/* Each real instruction is enumerated. */ |
/* ??? This may go away in time. */ |
int num; |
#define CGEN_INSN_NUM(insn) ((insn)->base->num) |
/* Name of entry (that distinguishes it from all other entries). */ |
/* ??? If mnemonics have operands, try to print full mnemonic. */ |
const char *name; |
#define CGEN_INSN_NAME(insn) ((insn)->base->name) |
/* Mnemonic. This is used when parsing and printing the insn. |
In the case of insns that have operands on the mnemonics, this is |
only the constant part. E.g. for conditional execution of an `add' insn, |
where the full mnemonic is addeq, addne, etc., and the condition is |
treated as an operand, this is only "add". */ |
const char *mnemonic; |
#define CGEN_INSN_MNEMONIC(insn) ((insn)->base->mnemonic) |
/* Total length of instruction, in bits. */ |
int bitsize; |
#define CGEN_INSN_BITSIZE(insn) ((insn)->base->bitsize) |
#if 0 /* ??? Disabled for now as there is a problem with embedded newlines |
and the table is already pretty big. Should perhaps be moved |
to a file of its own. */ |
/* Semantics, as RTL. */ |
/* ??? Plain text or bytecodes? */ |
/* ??? Note that the operand instance table could be computed at run-time |
if we parse this and cache the results. Something to eventually do. */ |
const char *rtx; |
#define CGEN_INSN_RTX(insn) ((insn)->base->rtx) |
#endif |
/* Attributes. |
This must appear last. It is a variable sized array in that one |
architecture may have 1 nonbool attribute and another may have more. |
Having this last means the non-architecture specific code needn't |
care. The goal is to eventually record attributes in their raw form, |
evaluate them at run-time, and cache the values, so this worry will go |
away anyway. */ |
CGEN_INSN_ATTR_TYPE attrs; |
#define CGEN_INSN_ATTRS(insn) (&(insn)->base->attrs) |
/* Return value of attribute ATTR in INSN. */ |
#define CGEN_INSN_ATTR_VALUE(insn, attr) \ |
CGEN_ATTR_VALUE ((insn), CGEN_INSN_ATTRS (insn), (attr)) |
#define CGEN_INSN_BITSET_ATTR_VALUE(insn, attr) \ |
CGEN_BITSET_ATTR_VALUE ((insn), CGEN_INSN_ATTRS (insn), (attr)) |
} CGEN_IBASE; |
/* Return non-zero if INSN is the "invalid" insn marker. */ |
#define CGEN_INSN_INVALID_P(insn) (CGEN_INSN_MNEMONIC (insn) == 0) |
/* Main struct contain instruction information. |
BASE is always present, the rest is present only if asked for. */ |
struct cgen_insn |
{ |
/* ??? May be of use to put a type indicator here. |
Then this struct could different info for different classes of insns. */ |
/* ??? A speedup can be had by moving `base' into this struct. |
Maybe later. */ |
const CGEN_IBASE *base; |
const CGEN_OPCODE *opcode; |
const CGEN_OPINST *opinst; |
/* Regex to disambiguate overloaded opcodes */ |
void *rx; |
#define CGEN_INSN_RX(insn) ((insn)->rx) |
#define CGEN_MAX_RX_ELEMENTS (CGEN_MAX_SYNTAX_ELEMENTS * 5) |
}; |
/* Instruction lists. |
This is used for adding new entries and for creating the hash lists. */ |
typedef struct cgen_insn_list |
{ |
struct cgen_insn_list *next; |
const CGEN_INSN *insn; |
} CGEN_INSN_LIST; |
/* Table of instructions. */ |
typedef struct |
{ |
const CGEN_INSN *init_entries; |
unsigned int entry_size; /* since the attribute member is variable sized */ |
unsigned int num_init_entries; |
CGEN_INSN_LIST *new_entries; |
} CGEN_INSN_TABLE; |
/* Return number of instructions. This includes any added at run-time. */ |
extern int cgen_insn_count (CGEN_CPU_DESC); |
extern int cgen_macro_insn_count (CGEN_CPU_DESC); |
/* Macros to access the other insn elements not recorded in CGEN_IBASE. */ |
/* Fetch INSN's operand instance table. */ |
/* ??? Doesn't handle insns added at runtime. */ |
#define CGEN_INSN_OPERANDS(insn) ((insn)->opinst) |
/* Return INSN's opcode table entry. */ |
#define CGEN_INSN_OPCODE(insn) ((insn)->opcode) |
/* Return INSN's handler data. */ |
#define CGEN_INSN_HANDLERS(insn) CGEN_OPCODE_HANDLERS (CGEN_INSN_OPCODE (insn)) |
/* Return INSN's syntax. */ |
#define CGEN_INSN_SYNTAX(insn) CGEN_OPCODE_SYNTAX (CGEN_INSN_OPCODE (insn)) |
/* Return size of base mask in bits. */ |
#define CGEN_INSN_MASK_BITSIZE(insn) \ |
CGEN_OPCODE_MASK_BITSIZE (CGEN_INSN_OPCODE (insn)) |
/* Return mask of base part of INSN. */ |
#define CGEN_INSN_BASE_MASK(insn) \ |
CGEN_OPCODE_BASE_MASK (CGEN_INSN_OPCODE (insn)) |
/* Return value of base part of INSN. */ |
#define CGEN_INSN_BASE_VALUE(insn) \ |
CGEN_OPCODE_BASE_VALUE (CGEN_INSN_OPCODE (insn)) |
/* Standard way to test whether INSN is supported by MACH. |
MACH is one of enum mach_attr. |
The "|1" is because the base mach is always selected. */ |
#define CGEN_INSN_MACH_HAS_P(insn, mach) \ |
((CGEN_INSN_ATTR_VALUE ((insn), CGEN_INSN_MACH) & ((1 << (mach)) | 1)) != 0) |
/* Macro instructions. |
Macro insns aren't real insns, they map to one or more real insns. |
E.g. An architecture's "nop" insn may actually be an "mv r0,r0" or |
some such. |
Macro insns can expand to nothing (e.g. a nop that is optimized away). |
This is useful in multi-insn macros that build a constant in a register. |
Of course this isn't the default behaviour and must be explicitly enabled. |
Assembly of macro-insns is relatively straightforward. Disassembly isn't. |
However, disassembly of at least some kinds of macro insns is important |
in order that the disassembled code preserve the readability of the original |
insn. What is attempted here is to disassemble all "simple" macro-insns, |
where "simple" is currently defined to mean "expands to one real insn". |
Simple macro-insns are handled specially. They are emitted as ALIAS's |
of real insns. This simplifies their handling since there's usually more |
of them than any other kind of macro-insn, and proper disassembly of them |
falls out for free. */ |
/* For each macro-insn there may be multiple expansion possibilities, |
depending on the arguments. This structure is accessed via the `data' |
member of CGEN_INSN. */ |
typedef struct cgen_minsn_expansion { |
/* Function to do the expansion. |
If the expansion fails (e.g. "no match") NULL is returned. |
Space for the expansion is obtained with malloc. |
It is up to the caller to free it. */ |
const char * (* fn) |
(const struct cgen_minsn_expansion *, |
const char *, const char **, int *, |
CGEN_OPERAND **); |
#define CGEN_MIEXPN_FN(ex) ((ex)->fn) |
/* Instruction(s) the macro expands to. |
The format of STR is defined by FN. |
It is typically the assembly code of the real insn, but it could also be |
the original Scheme expression or a tokenized form of it (with FN being |
an appropriate interpreter). */ |
const char * str; |
#define CGEN_MIEXPN_STR(ex) ((ex)->str) |
} CGEN_MINSN_EXPANSION; |
/* Normal expander. |
When supported, this function will convert the input string to another |
string and the parser will be invoked recursively. The output string |
may contain further macro invocations. */ |
extern const char * cgen_expand_macro_insn |
(CGEN_CPU_DESC, const struct cgen_minsn_expansion *, |
const char *, const char **, int *, CGEN_OPERAND **); |
/* The assembler insn table is hashed based on some function of the mnemonic |
(the actually hashing done is up to the target, but we provide a few |
examples like the first letter or a function of the entire mnemonic). */ |
extern CGEN_INSN_LIST * cgen_asm_lookup_insn |
(CGEN_CPU_DESC, const char *); |
#define CGEN_ASM_LOOKUP_INSN(cd, string) cgen_asm_lookup_insn ((cd), (string)) |
#define CGEN_ASM_NEXT_INSN(insn) ((insn)->next) |
/* The disassembler insn table is hashed based on some function of machine |
instruction (the actually hashing done is up to the target). */ |
extern CGEN_INSN_LIST * cgen_dis_lookup_insn |
(CGEN_CPU_DESC, const char *, CGEN_INSN_INT); |
/* FIXME: delete these two */ |
#define CGEN_DIS_LOOKUP_INSN(cd, buf, value) cgen_dis_lookup_insn ((cd), (buf), (value)) |
#define CGEN_DIS_NEXT_INSN(insn) ((insn)->next) |
/* The CPU description. |
A copy of this is created when the cpu table is "opened". |
All global state information is recorded here. |
Access macros are provided for "public" members. */ |
typedef struct cgen_cpu_desc |
{ |
/* Bitmap of selected machine(s) (a la BFD machine number). */ |
int machs; |
/* Bitmap of selected isa(s). */ |
CGEN_BITSET *isas; |
#define CGEN_CPU_ISAS(cd) ((cd)->isas) |
/* Current endian. */ |
enum cgen_endian endian; |
#define CGEN_CPU_ENDIAN(cd) ((cd)->endian) |
/* Current insn endian. */ |
enum cgen_endian insn_endian; |
#define CGEN_CPU_INSN_ENDIAN(cd) ((cd)->insn_endian) |
/* Word size (in bits). */ |
/* ??? Or maybe maximum word size - might we ever need to allow a cpu table |
to be opened for both sparc32/sparc64? |
??? Another alternative is to create a table of selected machs and |
lazily fetch the data from there. */ |
unsigned int word_bitsize; |
/* Instruction chunk size (in bits), for purposes of endianness |
conversion. */ |
unsigned int insn_chunk_bitsize; |
/* Indicator if sizes are unknown. |
This is used by default_insn_bitsize,base_insn_bitsize if there is a |
difference between the selected isa's. */ |
#define CGEN_SIZE_UNKNOWN 65535 |
/* Default instruction size (in bits). |
This is used by the assembler when it encounters an unknown insn. */ |
unsigned int default_insn_bitsize; |
/* Base instruction size (in bits). |
For non-LIW cpus this is generally the length of the smallest insn. |
For LIW cpus its wip (work-in-progress). For the m32r its 32. */ |
unsigned int base_insn_bitsize; |
/* Minimum/maximum instruction size (in bits). */ |
unsigned int min_insn_bitsize; |
unsigned int max_insn_bitsize; |
/* Instruction set variants. */ |
const CGEN_ISA *isa_table; |
/* Machine variants. */ |
const CGEN_MACH *mach_table; |
/* Hardware elements. */ |
CGEN_HW_TABLE hw_table; |
/* Instruction fields. */ |
const CGEN_IFLD *ifld_table; |
/* Operands. */ |
CGEN_OPERAND_TABLE operand_table; |
/* Main instruction table. */ |
CGEN_INSN_TABLE insn_table; |
#define CGEN_CPU_INSN_TABLE(cd) (& (cd)->insn_table) |
/* Macro instructions are defined separately and are combined with real |
insns during hash table computation. */ |
CGEN_INSN_TABLE macro_insn_table; |
/* Copy of CGEN_INT_INSN_P. */ |
int int_insn_p; |
/* Called to rebuild the tables after something has changed. */ |
void (*rebuild_tables) (CGEN_CPU_DESC); |
/* Operand parser callback. */ |
cgen_parse_operand_fn * parse_operand_fn; |
/* Parse/insert/extract/print cover fns for operands. */ |
const char * (*parse_operand) |
(CGEN_CPU_DESC, int opindex_, const char **, CGEN_FIELDS *fields_); |
#ifdef __BFD_H_SEEN__ |
const char * (*insert_operand) |
(CGEN_CPU_DESC, int opindex_, CGEN_FIELDS *fields_, |
CGEN_INSN_BYTES_PTR, bfd_vma pc_); |
int (*extract_operand) |
(CGEN_CPU_DESC, int opindex_, CGEN_EXTRACT_INFO *, CGEN_INSN_INT, |
CGEN_FIELDS *fields_, bfd_vma pc_); |
void (*print_operand) |
(CGEN_CPU_DESC, int opindex_, void * info_, CGEN_FIELDS * fields_, |
void const *attrs_, bfd_vma pc_, int length_); |
#else |
const char * (*insert_operand) (); |
int (*extract_operand) (); |
void (*print_operand) (); |
#endif |
#define CGEN_CPU_PARSE_OPERAND(cd) ((cd)->parse_operand) |
#define CGEN_CPU_INSERT_OPERAND(cd) ((cd)->insert_operand) |
#define CGEN_CPU_EXTRACT_OPERAND(cd) ((cd)->extract_operand) |
#define CGEN_CPU_PRINT_OPERAND(cd) ((cd)->print_operand) |
/* Size of CGEN_FIELDS struct. */ |
unsigned int sizeof_fields; |
#define CGEN_CPU_SIZEOF_FIELDS(cd) ((cd)->sizeof_fields) |
/* Set the bitsize field. */ |
void (*set_fields_bitsize) (CGEN_FIELDS *fields_, int size_); |
#define CGEN_CPU_SET_FIELDS_BITSIZE(cd) ((cd)->set_fields_bitsize) |
/* CGEN_FIELDS accessors. */ |
int (*get_int_operand) |
(CGEN_CPU_DESC, int opindex_, const CGEN_FIELDS *fields_); |
void (*set_int_operand) |
(CGEN_CPU_DESC, int opindex_, CGEN_FIELDS *fields_, int value_); |
#ifdef __BFD_H_SEEN__ |
bfd_vma (*get_vma_operand) |
(CGEN_CPU_DESC, int opindex_, const CGEN_FIELDS *fields_); |
void (*set_vma_operand) |
(CGEN_CPU_DESC, int opindex_, CGEN_FIELDS *fields_, bfd_vma value_); |
#else |
long (*get_vma_operand) (); |
void (*set_vma_operand) (); |
#endif |
#define CGEN_CPU_GET_INT_OPERAND(cd) ((cd)->get_int_operand) |
#define CGEN_CPU_SET_INT_OPERAND(cd) ((cd)->set_int_operand) |
#define CGEN_CPU_GET_VMA_OPERAND(cd) ((cd)->get_vma_operand) |
#define CGEN_CPU_SET_VMA_OPERAND(cd) ((cd)->set_vma_operand) |
/* Instruction parse/insert/extract/print handlers. */ |
/* FIXME: make these types uppercase. */ |
cgen_parse_fn * const *parse_handlers; |
cgen_insert_fn * const *insert_handlers; |
cgen_extract_fn * const *extract_handlers; |
cgen_print_fn * const *print_handlers; |
#define CGEN_PARSE_FN(cd, insn) (cd->parse_handlers[(insn)->opcode->handlers.parse]) |
#define CGEN_INSERT_FN(cd, insn) (cd->insert_handlers[(insn)->opcode->handlers.insert]) |
#define CGEN_EXTRACT_FN(cd, insn) (cd->extract_handlers[(insn)->opcode->handlers.extract]) |
#define CGEN_PRINT_FN(cd, insn) (cd->print_handlers[(insn)->opcode->handlers.print]) |
/* Return non-zero if insn should be added to hash table. */ |
int (* asm_hash_p) (const CGEN_INSN *); |
/* Assembler hash function. */ |
unsigned int (* asm_hash) (const char *); |
/* Number of entries in assembler hash table. */ |
unsigned int asm_hash_size; |
/* Return non-zero if insn should be added to hash table. */ |
int (* dis_hash_p) (const CGEN_INSN *); |
/* Disassembler hash function. */ |
unsigned int (* dis_hash) (const char *, CGEN_INSN_INT); |
/* Number of entries in disassembler hash table. */ |
unsigned int dis_hash_size; |
/* Assembler instruction hash table. */ |
CGEN_INSN_LIST **asm_hash_table; |
CGEN_INSN_LIST *asm_hash_table_entries; |
/* Disassembler instruction hash table. */ |
CGEN_INSN_LIST **dis_hash_table; |
CGEN_INSN_LIST *dis_hash_table_entries; |
/* This field could be turned into a bitfield if room for other flags is needed. */ |
unsigned int signed_overflow_ok_p; |
} CGEN_CPU_TABLE; |
/* wip */ |
#ifndef CGEN_WORD_ENDIAN |
#define CGEN_WORD_ENDIAN(cd) CGEN_CPU_ENDIAN (cd) |
#endif |
#ifndef CGEN_INSN_WORD_ENDIAN |
#define CGEN_INSN_WORD_ENDIAN(cd) CGEN_CPU_INSN_ENDIAN (cd) |
#endif |
/* Prototypes of major functions. */ |
/* FIXME: Move more CGEN_SYM-defined functions into CGEN_CPU_DESC. |
Not the init fns though, as that would drag in things that mightn't be |
used and might not even exist. */ |
/* Argument types to cpu_open. */ |
enum cgen_cpu_open_arg { |
CGEN_CPU_OPEN_END, |
/* Select instruction set(s), arg is bitmap or 0 meaning "unspecified". */ |
CGEN_CPU_OPEN_ISAS, |
/* Select machine(s), arg is bitmap or 0 meaning "unspecified". */ |
CGEN_CPU_OPEN_MACHS, |
/* Select machine, arg is mach's bfd name. |
Multiple machines can be specified by repeated use. */ |
CGEN_CPU_OPEN_BFDMACH, |
/* Select endian, arg is CGEN_ENDIAN_*. */ |
CGEN_CPU_OPEN_ENDIAN |
}; |
/* Open a cpu descriptor table for use. |
??? We only support ISO C stdargs here, not K&R. |
Laziness, plus experiment to see if anything requires K&R - eventually |
K&R will no longer be supported - e.g. GDB is currently trying this. */ |
extern CGEN_CPU_DESC CGEN_SYM (cpu_open) (enum cgen_cpu_open_arg, ...); |
/* Cover fn to handle simple case. */ |
extern CGEN_CPU_DESC CGEN_SYM (cpu_open_1) |
(const char *mach_name_, enum cgen_endian endian_); |
/* Close it. */ |
extern void CGEN_SYM (cpu_close) (CGEN_CPU_DESC); |
/* Initialize the opcode table for use. |
Called by init_asm/init_dis. */ |
extern void CGEN_SYM (init_opcode_table) (CGEN_CPU_DESC cd_); |
/* build the insn selection regex. |
called by init_opcode_table */ |
extern char * CGEN_SYM(build_insn_regex) (CGEN_INSN *insn_); |
/* Initialize the ibld table for use. |
Called by init_asm/init_dis. */ |
extern void CGEN_SYM (init_ibld_table) (CGEN_CPU_DESC cd_); |
/* Initialize an cpu table for assembler or disassembler use. |
These must be called immediately after cpu_open. */ |
extern void CGEN_SYM (init_asm) (CGEN_CPU_DESC); |
extern void CGEN_SYM (init_dis) (CGEN_CPU_DESC); |
/* Initialize the operand instance table for use. */ |
extern void CGEN_SYM (init_opinst_table) (CGEN_CPU_DESC cd_); |
/* Assemble an instruction. */ |
extern const CGEN_INSN * CGEN_SYM (assemble_insn) |
(CGEN_CPU_DESC, const char *, CGEN_FIELDS *, |
CGEN_INSN_BYTES_PTR, char **); |
extern const CGEN_KEYWORD CGEN_SYM (operand_mach); |
extern int CGEN_SYM (get_mach) (const char *); |
/* Operand index computation. */ |
extern const CGEN_INSN * cgen_lookup_insn |
(CGEN_CPU_DESC, const CGEN_INSN * insn_, |
CGEN_INSN_INT int_value_, unsigned char *bytes_value_, |
int length_, CGEN_FIELDS *fields_, int alias_p_); |
extern void cgen_get_insn_operands |
(CGEN_CPU_DESC, const CGEN_INSN * insn_, |
const CGEN_FIELDS *fields_, int *indices_); |
extern const CGEN_INSN * cgen_lookup_get_insn_operands |
(CGEN_CPU_DESC, const CGEN_INSN *insn_, |
CGEN_INSN_INT int_value_, unsigned char *bytes_value_, |
int length_, int *indices_, CGEN_FIELDS *fields_); |
/* Cover fns to bfd_get/set. */ |
extern CGEN_INSN_INT cgen_get_insn_value |
(CGEN_CPU_DESC, unsigned char *, int); |
extern void cgen_put_insn_value |
(CGEN_CPU_DESC, unsigned char *, int, CGEN_INSN_INT); |
/* Read in a cpu description file. |
??? For future concerns, including adding instructions to the assembler/ |
disassembler at run-time. */ |
extern const char * cgen_read_cpu_file (CGEN_CPU_DESC, const char * filename_); |
/* Allow signed overflow of instruction fields. */ |
extern void cgen_set_signed_overflow_ok (CGEN_CPU_DESC); |
/* Generate an error message if a signed field in an instruction overflows. */ |
extern void cgen_clear_signed_overflow_ok (CGEN_CPU_DESC); |
/* Will an error message be generated if a signed field in an instruction overflows ? */ |
extern unsigned int cgen_signed_overflow_ok_p (CGEN_CPU_DESC); |
#endif /* OPCODE_CGEN_H */ |
/contrib/toolchain/binutils/include/opcode/convex.h |
---|
0,0 → 1,1708 |
/* Information for instruction disassembly on the Convex. |
Copyright 1989, 1993, 2002, 2010 Free Software Foundation, Inc. |
This file is part of GDB. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#define xxx 0 |
#define rrr 1 |
#define rr 2 |
#define rxr 3 |
#define r 4 |
#define nops 5 |
#define nr 6 |
#define pcrel 7 |
#define lr 8 |
#define rxl 9 |
#define rlr 10 |
#define rrl 11 |
#define iml 12 |
#define imr 13 |
#define a1r 14 |
#define a1l 15 |
#define a2r 16 |
#define a2l 17 |
#define a3 18 |
#define a4 19 |
#define a5 20 |
#define V 1 |
#define S 2 |
#define VM 3 |
#define A 4 |
#define VL 5 |
#define VS 6 |
#define VLS 7 |
#define PSW 8 |
/* Prevent an error during "make depend". */ |
#if !defined (PC) |
#define PC 9 |
#endif |
#define ITR 10 |
#define VV 11 |
#define ITSR 12 |
#define TOC 13 |
#define CIR 14 |
#define TTR 15 |
#define VMU 16 |
#define VML 17 |
#define ICR 18 |
#define TCPU 19 |
#define CPUID 20 |
#define TID 21 |
const char *op[] = { |
"", |
"v0\0v1\0v2\0v3\0v4\0v5\0v6\0v7", |
"s0\0s1\0s2\0s3\0s4\0s5\0s6\0s7", |
"vm", |
"sp\0a1\0a2\0a3\0a4\0a5\0ap\0fp", |
"vl", |
"vs", |
"vls", |
"psw", |
"pc", |
"itr", |
"vv", |
"itsr", |
"toc", |
"cir", |
"ttr", |
"vmu", |
"vml", |
"icr", |
"tcpu", |
"cpuid", |
"tid", |
}; |
const struct formstr format0[] = { |
{0,0,rrr,V,S,S}, /* mov */ |
{0,0,rrr,S,S,V}, /* mov */ |
{1,1,rrr,V,V,V}, /* merg.t */ |
{2,1,rrr,V,V,V}, /* mask.t */ |
{1,2,rrr,V,S,V}, /* merg.f */ |
{2,2,rrr,V,S,V}, /* mask.f */ |
{1,1,rrr,V,S,V}, /* merg.t */ |
{2,1,rrr,V,S,V}, /* mask.t */ |
{3,3,rrr,V,V,V}, /* mul.s */ |
{3,4,rrr,V,V,V}, /* mul.d */ |
{4,3,rrr,V,V,V}, /* div.s */ |
{4,4,rrr,V,V,V}, /* div.d */ |
{3,3,rrr,V,S,V}, /* mul.s */ |
{3,4,rrr,V,S,V}, /* mul.d */ |
{4,3,rrr,V,S,V}, /* div.s */ |
{4,4,rrr,V,S,V}, /* div.d */ |
{5,0,rrr,V,V,V}, /* and */ |
{6,0,rrr,V,V,V}, /* or */ |
{7,0,rrr,V,V,V}, /* xor */ |
{8,0,rrr,V,V,V}, /* shf */ |
{5,0,rrr,V,S,V}, /* and */ |
{6,0,rrr,V,S,V}, /* or */ |
{7,0,rrr,V,S,V}, /* xor */ |
{8,0,rrr,V,S,V}, /* shf */ |
{9,3,rrr,V,V,V}, /* add.s */ |
{9,4,rrr,V,V,V}, /* add.d */ |
{10,3,rrr,V,V,V}, /* sub.s */ |
{10,4,rrr,V,V,V}, /* sub.d */ |
{9,3,rrr,V,S,V}, /* add.s */ |
{9,4,rrr,V,S,V}, /* add.d */ |
{10,3,rrr,V,S,V}, /* sub.s */ |
{10,4,rrr,V,S,V}, /* sub.d */ |
{9,5,rrr,V,V,V}, /* add.b */ |
{9,6,rrr,V,V,V}, /* add.h */ |
{9,7,rrr,V,V,V}, /* add.w */ |
{9,8,rrr,V,V,V}, /* add.l */ |
{9,5,rrr,V,S,V}, /* add.b */ |
{9,6,rrr,V,S,V}, /* add.h */ |
{9,7,rrr,V,S,V}, /* add.w */ |
{9,8,rrr,V,S,V}, /* add.l */ |
{10,5,rrr,V,V,V}, /* sub.b */ |
{10,6,rrr,V,V,V}, /* sub.h */ |
{10,7,rrr,V,V,V}, /* sub.w */ |
{10,8,rrr,V,V,V}, /* sub.l */ |
{10,5,rrr,V,S,V}, /* sub.b */ |
{10,6,rrr,V,S,V}, /* sub.h */ |
{10,7,rrr,V,S,V}, /* sub.w */ |
{10,8,rrr,V,S,V}, /* sub.l */ |
{3,5,rrr,V,V,V}, /* mul.b */ |
{3,6,rrr,V,V,V}, /* mul.h */ |
{3,7,rrr,V,V,V}, /* mul.w */ |
{3,8,rrr,V,V,V}, /* mul.l */ |
{3,5,rrr,V,S,V}, /* mul.b */ |
{3,6,rrr,V,S,V}, /* mul.h */ |
{3,7,rrr,V,S,V}, /* mul.w */ |
{3,8,rrr,V,S,V}, /* mul.l */ |
{4,5,rrr,V,V,V}, /* div.b */ |
{4,6,rrr,V,V,V}, /* div.h */ |
{4,7,rrr,V,V,V}, /* div.w */ |
{4,8,rrr,V,V,V}, /* div.l */ |
{4,5,rrr,V,S,V}, /* div.b */ |
{4,6,rrr,V,S,V}, /* div.h */ |
{4,7,rrr,V,S,V}, /* div.w */ |
{4,8,rrr,V,S,V}, /* div.l */ |
}; |
const struct formstr format1[] = { |
{11,0,xxx,0,0,0}, /* exit */ |
{12,0,a3,0,0,0}, /* jmp */ |
{13,2,a3,0,0,0}, /* jmpi.f */ |
{13,1,a3,0,0,0}, /* jmpi.t */ |
{14,2,a3,0,0,0}, /* jmpa.f */ |
{14,1,a3,0,0,0}, /* jmpa.t */ |
{15,2,a3,0,0,0}, /* jmps.f */ |
{15,1,a3,0,0,0}, /* jmps.t */ |
{16,0,a3,0,0,0}, /* tac */ |
{17,0,a1r,A,0,0}, /* ldea */ |
{18,8,a1l,VLS,0,0}, /* ld.l */ |
{18,9,a1l,VM,0,0}, /* ld.x */ |
{19,0,a3,0,0,0}, /* tas */ |
{20,0,a3,0,0,0}, /* pshea */ |
{21,8,a2l,VLS,0,0}, /* st.l */ |
{21,9,a2l,VM,0,0}, /* st.x */ |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{22,0,a3,0,0,0}, /* call */ |
{23,0,a3,0,0,0}, /* calls */ |
{24,0,a3,0,0,0}, /* callq */ |
{25,0,a1r,A,0,0}, /* pfork */ |
{26,5,a2r,S,0,0}, /* ste.b */ |
{26,6,a2r,S,0,0}, /* ste.h */ |
{26,7,a2r,S,0,0}, /* ste.w */ |
{26,8,a2r,S,0,0}, /* ste.l */ |
{18,5,a1r,A,0,0}, /* ld.b */ |
{18,6,a1r,A,0,0}, /* ld.h */ |
{18,7,a1r,A,0,0}, /* ld.w */ |
{27,7,a1r,A,0,0}, /* incr.w */ |
{21,5,a2r,A,0,0}, /* st.b */ |
{21,6,a2r,A,0,0}, /* st.h */ |
{21,7,a2r,A,0,0}, /* st.w */ |
{27,8,a1r,S,0,0}, /* incr.l */ |
{18,5,a1r,S,0,0}, /* ld.b */ |
{18,6,a1r,S,0,0}, /* ld.h */ |
{18,7,a1r,S,0,0}, /* ld.w */ |
{18,8,a1r,S,0,0}, /* ld.l */ |
{21,5,a2r,S,0,0}, /* st.b */ |
{21,6,a2r,S,0,0}, /* st.h */ |
{21,7,a2r,S,0,0}, /* st.w */ |
{21,8,a2r,S,0,0}, /* st.l */ |
{18,5,a1r,V,0,0}, /* ld.b */ |
{18,6,a1r,V,0,0}, /* ld.h */ |
{18,7,a1r,V,0,0}, /* ld.w */ |
{18,8,a1r,V,0,0}, /* ld.l */ |
{21,5,a2r,V,0,0}, /* st.b */ |
{21,6,a2r,V,0,0}, /* st.h */ |
{21,7,a2r,V,0,0}, /* st.w */ |
{21,8,a2r,V,0,0}, /* st.l */ |
}; |
const struct formstr format2[] = { |
{28,5,rr,A,A,0}, /* cvtw.b */ |
{28,6,rr,A,A,0}, /* cvtw.h */ |
{29,7,rr,A,A,0}, /* cvtb.w */ |
{30,7,rr,A,A,0}, /* cvth.w */ |
{28,5,rr,S,S,0}, /* cvtw.b */ |
{28,6,rr,S,S,0}, /* cvtw.h */ |
{29,7,rr,S,S,0}, /* cvtb.w */ |
{30,7,rr,S,S,0}, /* cvth.w */ |
{28,3,rr,S,S,0}, /* cvtw.s */ |
{31,7,rr,S,S,0}, /* cvts.w */ |
{32,3,rr,S,S,0}, /* cvtd.s */ |
{31,4,rr,S,S,0}, /* cvts.d */ |
{31,8,rr,S,S,0}, /* cvts.l */ |
{32,8,rr,S,S,0}, /* cvtd.l */ |
{33,3,rr,S,S,0}, /* cvtl.s */ |
{33,4,rr,S,S,0}, /* cvtl.d */ |
{34,0,rr,A,A,0}, /* ldpa */ |
{8,0,nr,A,0,0}, /* shf */ |
{18,6,nr,A,0,0}, /* ld.h */ |
{18,7,nr,A,0,0}, /* ld.w */ |
{33,7,rr,S,S,0}, /* cvtl.w */ |
{28,8,rr,S,S,0}, /* cvtw.l */ |
{35,1,rr,S,S,0}, /* plc.t */ |
{36,0,rr,S,S,0}, /* tzc */ |
{37,6,rr,A,A,0}, /* eq.h */ |
{37,7,rr,A,A,0}, /* eq.w */ |
{37,6,nr,A,0,0}, /* eq.h */ |
{37,7,nr,A,0,0}, /* eq.w */ |
{37,5,rr,S,S,0}, /* eq.b */ |
{37,6,rr,S,S,0}, /* eq.h */ |
{37,7,rr,S,S,0}, /* eq.w */ |
{37,8,rr,S,S,0}, /* eq.l */ |
{38,6,rr,A,A,0}, /* leu.h */ |
{38,7,rr,A,A,0}, /* leu.w */ |
{38,6,nr,A,0,0}, /* leu.h */ |
{38,7,nr,A,0,0}, /* leu.w */ |
{38,5,rr,S,S,0}, /* leu.b */ |
{38,6,rr,S,S,0}, /* leu.h */ |
{38,7,rr,S,S,0}, /* leu.w */ |
{38,8,rr,S,S,0}, /* leu.l */ |
{39,6,rr,A,A,0}, /* ltu.h */ |
{39,7,rr,A,A,0}, /* ltu.w */ |
{39,6,nr,A,0,0}, /* ltu.h */ |
{39,7,nr,A,0,0}, /* ltu.w */ |
{39,5,rr,S,S,0}, /* ltu.b */ |
{39,6,rr,S,S,0}, /* ltu.h */ |
{39,7,rr,S,S,0}, /* ltu.w */ |
{39,8,rr,S,S,0}, /* ltu.l */ |
{40,6,rr,A,A,0}, /* le.h */ |
{40,7,rr,A,A,0}, /* le.w */ |
{40,6,nr,A,0,0}, /* le.h */ |
{40,7,nr,A,0,0}, /* le.w */ |
{40,5,rr,S,S,0}, /* le.b */ |
{40,6,rr,S,S,0}, /* le.h */ |
{40,7,rr,S,S,0}, /* le.w */ |
{40,8,rr,S,S,0}, /* le.l */ |
{41,6,rr,A,A,0}, /* lt.h */ |
{41,7,rr,A,A,0}, /* lt.w */ |
{41,6,nr,A,0,0}, /* lt.h */ |
{41,7,nr,A,0,0}, /* lt.w */ |
{41,5,rr,S,S,0}, /* lt.b */ |
{41,6,rr,S,S,0}, /* lt.h */ |
{41,7,rr,S,S,0}, /* lt.w */ |
{41,8,rr,S,S,0}, /* lt.l */ |
{9,7,rr,S,A,0}, /* add.w */ |
{8,0,rr,A,A,0}, /* shf */ |
{0,0,rr,A,A,0}, /* mov */ |
{0,0,rr,S,A,0}, /* mov */ |
{0,7,rr,S,S,0}, /* mov.w */ |
{8,0,rr,S,S,0}, /* shf */ |
{0,0,rr,S,S,0}, /* mov */ |
{0,0,rr,A,S,0}, /* mov */ |
{5,0,rr,A,A,0}, /* and */ |
{6,0,rr,A,A,0}, /* or */ |
{7,0,rr,A,A,0}, /* xor */ |
{42,0,rr,A,A,0}, /* not */ |
{5,0,rr,S,S,0}, /* and */ |
{6,0,rr,S,S,0}, /* or */ |
{7,0,rr,S,S,0}, /* xor */ |
{42,0,rr,S,S,0}, /* not */ |
{40,3,rr,S,S,0}, /* le.s */ |
{40,4,rr,S,S,0}, /* le.d */ |
{41,3,rr,S,S,0}, /* lt.s */ |
{41,4,rr,S,S,0}, /* lt.d */ |
{9,3,rr,S,S,0}, /* add.s */ |
{9,4,rr,S,S,0}, /* add.d */ |
{10,3,rr,S,S,0}, /* sub.s */ |
{10,4,rr,S,S,0}, /* sub.d */ |
{37,3,rr,S,S,0}, /* eq.s */ |
{37,4,rr,S,S,0}, /* eq.d */ |
{43,6,rr,A,A,0}, /* neg.h */ |
{43,7,rr,A,A,0}, /* neg.w */ |
{3,3,rr,S,S,0}, /* mul.s */ |
{3,4,rr,S,S,0}, /* mul.d */ |
{4,3,rr,S,S,0}, /* div.s */ |
{4,4,rr,S,S,0}, /* div.d */ |
{9,6,rr,A,A,0}, /* add.h */ |
{9,7,rr,A,A,0}, /* add.w */ |
{9,6,nr,A,0,0}, /* add.h */ |
{9,7,nr,A,0,0}, /* add.w */ |
{9,5,rr,S,S,0}, /* add.b */ |
{9,6,rr,S,S,0}, /* add.h */ |
{9,7,rr,S,S,0}, /* add.w */ |
{9,8,rr,S,S,0}, /* add.l */ |
{10,6,rr,A,A,0}, /* sub.h */ |
{10,7,rr,A,A,0}, /* sub.w */ |
{10,6,nr,A,0,0}, /* sub.h */ |
{10,7,nr,A,0,0}, /* sub.w */ |
{10,5,rr,S,S,0}, /* sub.b */ |
{10,6,rr,S,S,0}, /* sub.h */ |
{10,7,rr,S,S,0}, /* sub.w */ |
{10,8,rr,S,S,0}, /* sub.l */ |
{3,6,rr,A,A,0}, /* mul.h */ |
{3,7,rr,A,A,0}, /* mul.w */ |
{3,6,nr,A,0,0}, /* mul.h */ |
{3,7,nr,A,0,0}, /* mul.w */ |
{3,5,rr,S,S,0}, /* mul.b */ |
{3,6,rr,S,S,0}, /* mul.h */ |
{3,7,rr,S,S,0}, /* mul.w */ |
{3,8,rr,S,S,0}, /* mul.l */ |
{4,6,rr,A,A,0}, /* div.h */ |
{4,7,rr,A,A,0}, /* div.w */ |
{4,6,nr,A,0,0}, /* div.h */ |
{4,7,nr,A,0,0}, /* div.w */ |
{4,5,rr,S,S,0}, /* div.b */ |
{4,6,rr,S,S,0}, /* div.h */ |
{4,7,rr,S,S,0}, /* div.w */ |
{4,8,rr,S,S,0}, /* div.l */ |
}; |
const struct formstr format3[] = { |
{32,3,rr,V,V,0}, /* cvtd.s */ |
{31,4,rr,V,V,0}, /* cvts.d */ |
{33,4,rr,V,V,0}, /* cvtl.d */ |
{32,8,rr,V,V,0}, /* cvtd.l */ |
{0,0,rrl,S,S,VM}, /* mov */ |
{0,0,rlr,S,VM,S}, /* mov */ |
{0,0,0,0,0,0}, |
{44,0,rr,S,S,0}, /* lop */ |
{36,0,rr,V,V,0}, /* tzc */ |
{44,0,rr,V,V,0}, /* lop */ |
{0,0,0,0,0,0}, |
{42,0,rr,V,V,0}, /* not */ |
{8,0,rr,S,V,0}, /* shf */ |
{35,1,rr,V,V,0}, /* plc.t */ |
{45,2,rr,V,V,0}, /* cprs.f */ |
{45,1,rr,V,V,0}, /* cprs.t */ |
{37,3,rr,V,V,0}, /* eq.s */ |
{37,4,rr,V,V,0}, /* eq.d */ |
{43,3,rr,V,V,0}, /* neg.s */ |
{43,4,rr,V,V,0}, /* neg.d */ |
{37,3,rr,S,V,0}, /* eq.s */ |
{37,4,rr,S,V,0}, /* eq.d */ |
{43,3,rr,S,S,0}, /* neg.s */ |
{43,4,rr,S,S,0}, /* neg.d */ |
{40,3,rr,V,V,0}, /* le.s */ |
{40,4,rr,V,V,0}, /* le.d */ |
{41,3,rr,V,V,0}, /* lt.s */ |
{41,4,rr,V,V,0}, /* lt.d */ |
{40,3,rr,S,V,0}, /* le.s */ |
{40,4,rr,S,V,0}, /* le.d */ |
{41,3,rr,S,V,0}, /* lt.s */ |
{41,4,rr,S,V,0}, /* lt.d */ |
{37,5,rr,V,V,0}, /* eq.b */ |
{37,6,rr,V,V,0}, /* eq.h */ |
{37,7,rr,V,V,0}, /* eq.w */ |
{37,8,rr,V,V,0}, /* eq.l */ |
{37,5,rr,S,V,0}, /* eq.b */ |
{37,6,rr,S,V,0}, /* eq.h */ |
{37,7,rr,S,V,0}, /* eq.w */ |
{37,8,rr,S,V,0}, /* eq.l */ |
{40,5,rr,V,V,0}, /* le.b */ |
{40,6,rr,V,V,0}, /* le.h */ |
{40,7,rr,V,V,0}, /* le.w */ |
{40,8,rr,V,V,0}, /* le.l */ |
{40,5,rr,S,V,0}, /* le.b */ |
{40,6,rr,S,V,0}, /* le.h */ |
{40,7,rr,S,V,0}, /* le.w */ |
{40,8,rr,S,V,0}, /* le.l */ |
{41,5,rr,V,V,0}, /* lt.b */ |
{41,6,rr,V,V,0}, /* lt.h */ |
{41,7,rr,V,V,0}, /* lt.w */ |
{41,8,rr,V,V,0}, /* lt.l */ |
{41,5,rr,S,V,0}, /* lt.b */ |
{41,6,rr,S,V,0}, /* lt.h */ |
{41,7,rr,S,V,0}, /* lt.w */ |
{41,8,rr,S,V,0}, /* lt.l */ |
{43,5,rr,V,V,0}, /* neg.b */ |
{43,6,rr,V,V,0}, /* neg.h */ |
{43,7,rr,V,V,0}, /* neg.w */ |
{43,8,rr,V,V,0}, /* neg.l */ |
{43,5,rr,S,S,0}, /* neg.b */ |
{43,6,rr,S,S,0}, /* neg.h */ |
{43,7,rr,S,S,0}, /* neg.w */ |
{43,8,rr,S,S,0}, /* neg.l */ |
}; |
const struct formstr format4[] = { |
{46,0,nops,0,0,0}, /* nop */ |
{47,0,pcrel,0,0,0}, /* br */ |
{48,2,pcrel,0,0,0}, /* bri.f */ |
{48,1,pcrel,0,0,0}, /* bri.t */ |
{49,2,pcrel,0,0,0}, /* bra.f */ |
{49,1,pcrel,0,0,0}, /* bra.t */ |
{50,2,pcrel,0,0,0}, /* brs.f */ |
{50,1,pcrel,0,0,0}, /* brs.t */ |
}; |
const struct formstr format5[] = { |
{51,5,rr,V,V,0}, /* ldvi.b */ |
{51,6,rr,V,V,0}, /* ldvi.h */ |
{51,7,rr,V,V,0}, /* ldvi.w */ |
{51,8,rr,V,V,0}, /* ldvi.l */ |
{28,3,rr,V,V,0}, /* cvtw.s */ |
{31,7,rr,V,V,0}, /* cvts.w */ |
{28,8,rr,V,V,0}, /* cvtw.l */ |
{33,7,rr,V,V,0}, /* cvtl.w */ |
{52,5,rxr,V,V,0}, /* stvi.b */ |
{52,6,rxr,V,V,0}, /* stvi.h */ |
{52,7,rxr,V,V,0}, /* stvi.w */ |
{52,8,rxr,V,V,0}, /* stvi.l */ |
{52,5,rxr,S,V,0}, /* stvi.b */ |
{52,6,rxr,S,V,0}, /* stvi.h */ |
{52,7,rxr,S,V,0}, /* stvi.w */ |
{52,8,rxr,S,V,0}, /* stvi.l */ |
}; |
const struct formstr format6[] = { |
{53,0,r,A,0,0}, /* ldsdr */ |
{54,0,r,A,0,0}, /* ldkdr */ |
{55,3,r,S,0,0}, /* ln.s */ |
{55,4,r,S,0,0}, /* ln.d */ |
{56,0,nops,0,0,0}, /* patu */ |
{57,0,r,A,0,0}, /* pate */ |
{58,0,nops,0,0,0}, /* pich */ |
{59,0,nops,0,0,0}, /* plch */ |
{0,0,lr,PSW,A,0}, /* mov */ |
{0,0,rxl,A,PSW,0}, /* mov */ |
{0,0,lr,PC,A,0}, /* mov */ |
{60,0,r,S,0,0}, /* idle */ |
{0,0,lr,ITR,S,0}, /* mov */ |
{0,0,rxl,S,ITR,0}, /* mov */ |
{0,0,0,0,0,0}, |
{0,0,rxl,S,ITSR,0}, /* mov */ |
{61,0,nops,0,0,0}, /* rtnq */ |
{62,0,nops,0,0,0}, /* cfork */ |
{63,0,nops,0,0,0}, /* rtn */ |
{64,0,nops,0,0,0}, /* wfork */ |
{65,0,nops,0,0,0}, /* join */ |
{66,0,nops,0,0,0}, /* rtnc */ |
{67,3,r,S,0,0}, /* exp.s */ |
{67,4,r,S,0,0}, /* exp.d */ |
{68,3,r,S,0,0}, /* sin.s */ |
{68,4,r,S,0,0}, /* sin.d */ |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{69,3,r,S,0,0}, /* cos.s */ |
{69,4,r,S,0,0}, /* cos.d */ |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{70,7,r,A,0,0}, /* psh.w */ |
{0,0,0,0,0,0}, |
{71,7,r,A,0,0}, /* pop.w */ |
{0,0,0,0,0,0}, |
{70,7,r,S,0,0}, /* psh.w */ |
{70,8,r,S,0,0}, /* psh.l */ |
{71,7,r,S,0,0}, /* pop.w */ |
{71,8,r,S,0,0}, /* pop.l */ |
{72,0,nops,0,0,0}, /* eni */ |
{73,0,nops,0,0,0}, /* dsi */ |
{74,0,nops,0,0,0}, /* bkpt */ |
{75,0,nops,0,0,0}, /* msync */ |
{76,0,r,S,0,0}, /* mski */ |
{77,0,r,S,0,0}, /* xmti */ |
{0,0,rxl,S,VV,0}, /* mov */ |
{78,0,nops,0,0,0}, /* tstvv */ |
{0,0,lr,VS,A,0}, /* mov */ |
{0,0,rxl,A,VS,0}, /* mov */ |
{0,0,lr,VL,A,0}, /* mov */ |
{0,0,rxl,A,VL,0}, /* mov */ |
{0,7,lr,VS,S,0}, /* mov.w */ |
{0,7,rxl,S,VS,0}, /* mov.w */ |
{0,7,lr,VL,S,0}, /* mov.w */ |
{0,7,rxl,S,VL,0}, /* mov.w */ |
{79,0,r,A,0,0}, /* diag */ |
{80,0,nops,0,0,0}, /* pbkpt */ |
{81,3,r,S,0,0}, /* sqrt.s */ |
{81,4,r,S,0,0}, /* sqrt.d */ |
{82,0,nops,0,0,0}, /* casr */ |
{0,0,0,0,0,0}, |
{83,3,r,S,0,0}, /* atan.s */ |
{83,4,r,S,0,0}, /* atan.d */ |
}; |
const struct formstr format7[] = { |
{84,5,r,V,0,0}, /* sum.b */ |
{84,6,r,V,0,0}, /* sum.h */ |
{84,7,r,V,0,0}, /* sum.w */ |
{84,8,r,V,0,0}, /* sum.l */ |
{85,0,r,V,0,0}, /* all */ |
{86,0,r,V,0,0}, /* any */ |
{87,0,r,V,0,0}, /* parity */ |
{0,0,0,0,0,0}, |
{88,5,r,V,0,0}, /* max.b */ |
{88,6,r,V,0,0}, /* max.h */ |
{88,7,r,V,0,0}, /* max.w */ |
{88,8,r,V,0,0}, /* max.l */ |
{89,5,r,V,0,0}, /* min.b */ |
{89,6,r,V,0,0}, /* min.h */ |
{89,7,r,V,0,0}, /* min.w */ |
{89,8,r,V,0,0}, /* min.l */ |
{84,3,r,V,0,0}, /* sum.s */ |
{84,4,r,V,0,0}, /* sum.d */ |
{90,3,r,V,0,0}, /* prod.s */ |
{90,4,r,V,0,0}, /* prod.d */ |
{88,3,r,V,0,0}, /* max.s */ |
{88,4,r,V,0,0}, /* max.d */ |
{89,3,r,V,0,0}, /* min.s */ |
{89,4,r,V,0,0}, /* min.d */ |
{90,5,r,V,0,0}, /* prod.b */ |
{90,6,r,V,0,0}, /* prod.h */ |
{90,7,r,V,0,0}, /* prod.w */ |
{90,8,r,V,0,0}, /* prod.l */ |
{35,2,lr,VM,S,0}, /* plc.f */ |
{35,1,lr,VM,S,0}, /* plc.t */ |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
}; |
const struct formstr formatx[] = { |
{0,0,0,0,0,0}, |
}; |
const struct formstr format1a[] = { |
{91,0,imr,A,0,0}, /* halt */ |
{92,0,a4,0,0,0}, /* sysc */ |
{18,6,imr,A,0,0}, /* ld.h */ |
{18,7,imr,A,0,0}, /* ld.w */ |
{5,0,imr,A,0,0}, /* and */ |
{6,0,imr,A,0,0}, /* or */ |
{7,0,imr,A,0,0}, /* xor */ |
{8,0,imr,A,0,0}, /* shf */ |
{9,6,imr,A,0,0}, /* add.h */ |
{9,7,imr,A,0,0}, /* add.w */ |
{10,6,imr,A,0,0}, /* sub.h */ |
{10,7,imr,A,0,0}, /* sub.w */ |
{3,6,imr,A,0,0}, /* mul.h */ |
{3,7,imr,A,0,0}, /* mul.w */ |
{4,6,imr,A,0,0}, /* div.h */ |
{4,7,imr,A,0,0}, /* div.w */ |
{18,7,iml,VL,0,0}, /* ld.w */ |
{18,7,iml,VS,0,0}, /* ld.w */ |
{0,0,0,0,0,0}, |
{8,7,imr,S,0,0}, /* shf.w */ |
{93,0,a5,0,0,0}, /* trap */ |
{0,0,0,0,0,0}, |
{37,6,imr,A,0,0}, /* eq.h */ |
{37,7,imr,A,0,0}, /* eq.w */ |
{38,6,imr,A,0,0}, /* leu.h */ |
{38,7,imr,A,0,0}, /* leu.w */ |
{39,6,imr,A,0,0}, /* ltu.h */ |
{39,7,imr,A,0,0}, /* ltu.w */ |
{40,6,imr,A,0,0}, /* le.h */ |
{40,7,imr,A,0,0}, /* le.w */ |
{41,6,imr,A,0,0}, /* lt.h */ |
{41,7,imr,A,0,0}, /* lt.w */ |
}; |
const struct formstr format1b[] = { |
{18,4,imr,S,0,0}, /* ld.d */ |
{18,10,imr,S,0,0}, /* ld.u */ |
{18,8,imr,S,0,0}, /* ld.l */ |
{18,7,imr,S,0,0}, /* ld.w */ |
{5,0,imr,S,0,0}, /* and */ |
{6,0,imr,S,0,0}, /* or */ |
{7,0,imr,S,0,0}, /* xor */ |
{8,0,imr,S,0,0}, /* shf */ |
{9,6,imr,S,0,0}, /* add.h */ |
{9,7,imr,S,0,0}, /* add.w */ |
{10,6,imr,S,0,0}, /* sub.h */ |
{10,7,imr,S,0,0}, /* sub.w */ |
{3,6,imr,S,0,0}, /* mul.h */ |
{3,7,imr,S,0,0}, /* mul.w */ |
{4,6,imr,S,0,0}, /* div.h */ |
{4,7,imr,S,0,0}, /* div.w */ |
{9,3,imr,S,0,0}, /* add.s */ |
{10,3,imr,S,0,0}, /* sub.s */ |
{3,3,imr,S,0,0}, /* mul.s */ |
{4,3,imr,S,0,0}, /* div.s */ |
{40,3,imr,S,0,0}, /* le.s */ |
{41,3,imr,S,0,0}, /* lt.s */ |
{37,6,imr,S,0,0}, /* eq.h */ |
{37,7,imr,S,0,0}, /* eq.w */ |
{38,6,imr,S,0,0}, /* leu.h */ |
{38,7,imr,S,0,0}, /* leu.w */ |
{39,6,imr,S,0,0}, /* ltu.h */ |
{39,7,imr,S,0,0}, /* ltu.w */ |
{40,6,imr,S,0,0}, /* le.h */ |
{40,7,imr,S,0,0}, /* le.w */ |
{41,6,imr,S,0,0}, /* lt.h */ |
{41,7,imr,S,0,0}, /* lt.w */ |
}; |
const struct formstr e0_format0[] = { |
{10,3,rrr,S,V,V}, /* sub.s */ |
{10,4,rrr,S,V,V}, /* sub.d */ |
{4,3,rrr,S,V,V}, /* div.s */ |
{4,4,rrr,S,V,V}, /* div.d */ |
{10,11,rrr,S,V,V}, /* sub.s.f */ |
{10,12,rrr,S,V,V}, /* sub.d.f */ |
{4,11,rrr,S,V,V}, /* div.s.f */ |
{4,12,rrr,S,V,V}, /* div.d.f */ |
{3,11,rrr,V,V,V}, /* mul.s.f */ |
{3,12,rrr,V,V,V}, /* mul.d.f */ |
{4,11,rrr,V,V,V}, /* div.s.f */ |
{4,12,rrr,V,V,V}, /* div.d.f */ |
{3,11,rrr,V,S,V}, /* mul.s.f */ |
{3,12,rrr,V,S,V}, /* mul.d.f */ |
{4,11,rrr,V,S,V}, /* div.s.f */ |
{4,12,rrr,V,S,V}, /* div.d.f */ |
{5,2,rrr,V,V,V}, /* and.f */ |
{6,2,rrr,V,V,V}, /* or.f */ |
{7,2,rrr,V,V,V}, /* xor.f */ |
{8,2,rrr,V,V,V}, /* shf.f */ |
{5,2,rrr,V,S,V}, /* and.f */ |
{6,2,rrr,V,S,V}, /* or.f */ |
{7,2,rrr,V,S,V}, /* xor.f */ |
{8,2,rrr,V,S,V}, /* shf.f */ |
{9,11,rrr,V,V,V}, /* add.s.f */ |
{9,12,rrr,V,V,V}, /* add.d.f */ |
{10,11,rrr,V,V,V}, /* sub.s.f */ |
{10,12,rrr,V,V,V}, /* sub.d.f */ |
{9,11,rrr,V,S,V}, /* add.s.f */ |
{9,12,rrr,V,S,V}, /* add.d.f */ |
{10,11,rrr,V,S,V}, /* sub.s.f */ |
{10,12,rrr,V,S,V}, /* sub.d.f */ |
{9,13,rrr,V,V,V}, /* add.b.f */ |
{9,14,rrr,V,V,V}, /* add.h.f */ |
{9,15,rrr,V,V,V}, /* add.w.f */ |
{9,16,rrr,V,V,V}, /* add.l.f */ |
{9,13,rrr,V,S,V}, /* add.b.f */ |
{9,14,rrr,V,S,V}, /* add.h.f */ |
{9,15,rrr,V,S,V}, /* add.w.f */ |
{9,16,rrr,V,S,V}, /* add.l.f */ |
{10,13,rrr,V,V,V}, /* sub.b.f */ |
{10,14,rrr,V,V,V}, /* sub.h.f */ |
{10,15,rrr,V,V,V}, /* sub.w.f */ |
{10,16,rrr,V,V,V}, /* sub.l.f */ |
{10,13,rrr,V,S,V}, /* sub.b.f */ |
{10,14,rrr,V,S,V}, /* sub.h.f */ |
{10,15,rrr,V,S,V}, /* sub.w.f */ |
{10,16,rrr,V,S,V}, /* sub.l.f */ |
{3,13,rrr,V,V,V}, /* mul.b.f */ |
{3,14,rrr,V,V,V}, /* mul.h.f */ |
{3,15,rrr,V,V,V}, /* mul.w.f */ |
{3,16,rrr,V,V,V}, /* mul.l.f */ |
{3,13,rrr,V,S,V}, /* mul.b.f */ |
{3,14,rrr,V,S,V}, /* mul.h.f */ |
{3,15,rrr,V,S,V}, /* mul.w.f */ |
{3,16,rrr,V,S,V}, /* mul.l.f */ |
{4,13,rrr,V,V,V}, /* div.b.f */ |
{4,14,rrr,V,V,V}, /* div.h.f */ |
{4,15,rrr,V,V,V}, /* div.w.f */ |
{4,16,rrr,V,V,V}, /* div.l.f */ |
{4,13,rrr,V,S,V}, /* div.b.f */ |
{4,14,rrr,V,S,V}, /* div.h.f */ |
{4,15,rrr,V,S,V}, /* div.w.f */ |
{4,16,rrr,V,S,V}, /* div.l.f */ |
}; |
const struct formstr e0_format1[] = { |
{0,0,0,0,0,0}, |
{94,0,a3,0,0,0}, /* tst */ |
{95,0,a3,0,0,0}, /* lck */ |
{96,0,a3,0,0,0}, /* ulk */ |
{17,0,a1r,S,0,0}, /* ldea */ |
{97,0,a1r,A,0,0}, /* spawn */ |
{98,0,a1r,A,0,0}, /* ldcmr */ |
{99,0,a2r,A,0,0}, /* stcmr */ |
{100,0,a1r,A,0,0}, /* popr */ |
{101,0,a2r,A,0,0}, /* pshr */ |
{102,7,a1r,A,0,0}, /* rcvr.w */ |
{103,7,a2r,A,0,0}, /* matm.w */ |
{104,7,a2r,A,0,0}, /* sndr.w */ |
{104,8,a2r,S,0,0}, /* sndr.l */ |
{102,8,a1r,S,0,0}, /* rcvr.l */ |
{103,8,a2r,S,0,0}, /* matm.l */ |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{105,7,a2r,A,0,0}, /* putr.w */ |
{105,8,a2r,S,0,0}, /* putr.l */ |
{106,7,a1r,A,0,0}, /* getr.w */ |
{106,8,a1r,S,0,0}, /* getr.l */ |
{26,13,a2r,S,0,0}, /* ste.b.f */ |
{26,14,a2r,S,0,0}, /* ste.h.f */ |
{26,15,a2r,S,0,0}, /* ste.w.f */ |
{26,16,a2r,S,0,0}, /* ste.l.f */ |
{107,7,a2r,A,0,0}, /* matr.w */ |
{108,7,a2r,A,0,0}, /* mat.w */ |
{109,7,a1r,A,0,0}, /* get.w */ |
{110,7,a1r,A,0,0}, /* rcv.w */ |
{0,0,0,0,0,0}, |
{111,7,a1r,A,0,0}, /* inc.w */ |
{112,7,a2r,A,0,0}, /* put.w */ |
{113,7,a2r,A,0,0}, /* snd.w */ |
{107,8,a2r,S,0,0}, /* matr.l */ |
{108,8,a2r,S,0,0}, /* mat.l */ |
{109,8,a1r,S,0,0}, /* get.l */ |
{110,8,a1r,S,0,0}, /* rcv.l */ |
{0,0,0,0,0,0}, |
{111,8,a1r,S,0,0}, /* inc.l */ |
{112,8,a2r,S,0,0}, /* put.l */ |
{113,8,a2r,S,0,0}, /* snd.l */ |
{18,13,a1r,V,0,0}, /* ld.b.f */ |
{18,14,a1r,V,0,0}, /* ld.h.f */ |
{18,15,a1r,V,0,0}, /* ld.w.f */ |
{18,16,a1r,V,0,0}, /* ld.l.f */ |
{21,13,a2r,V,0,0}, /* st.b.f */ |
{21,14,a2r,V,0,0}, /* st.h.f */ |
{21,15,a2r,V,0,0}, /* st.w.f */ |
{21,16,a2r,V,0,0}, /* st.l.f */ |
}; |
const struct formstr e0_format2[] = { |
{28,5,rr,V,V,0}, /* cvtw.b */ |
{28,6,rr,V,V,0}, /* cvtw.h */ |
{29,7,rr,V,V,0}, /* cvtb.w */ |
{30,7,rr,V,V,0}, /* cvth.w */ |
{28,13,rr,V,V,0}, /* cvtw.b.f */ |
{28,14,rr,V,V,0}, /* cvtw.h.f */ |
{29,15,rr,V,V,0}, /* cvtb.w.f */ |
{30,15,rr,V,V,0}, /* cvth.w.f */ |
{31,8,rr,V,V,0}, /* cvts.l */ |
{32,7,rr,V,V,0}, /* cvtd.w */ |
{33,3,rr,V,V,0}, /* cvtl.s */ |
{28,4,rr,V,V,0}, /* cvtw.d */ |
{31,16,rr,V,V,0}, /* cvts.l.f */ |
{32,15,rr,V,V,0}, /* cvtd.w.f */ |
{33,11,rr,V,V,0}, /* cvtl.s.f */ |
{28,12,rr,V,V,0}, /* cvtw.d.f */ |
{114,0,rr,S,S,0}, /* enal */ |
{8,7,rr,S,S,0}, /* shf.w */ |
{115,0,rr,S,S,0}, /* enag */ |
{0,0,0,0,0,0}, |
{28,4,rr,S,S,0}, /* cvtw.d */ |
{32,7,rr,S,S,0}, /* cvtd.w */ |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{116,3,rr,S,S,0}, /* frint.s */ |
{116,4,rr,S,S,0}, /* frint.d */ |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{116,3,rr,V,V,0}, /* frint.s */ |
{116,4,rr,V,V,0}, /* frint.d */ |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{116,11,rr,V,V,0}, /* frint.s.f */ |
{116,12,rr,V,V,0}, /* frint.d.f */ |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{81,3,rr,V,V,0}, /* sqrt.s */ |
{81,4,rr,V,V,0}, /* sqrt.d */ |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{81,11,rr,V,V,0}, /* sqrt.s.f */ |
{81,12,rr,V,V,0}, /* sqrt.d.f */ |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
}; |
const struct formstr e0_format3[] = { |
{32,11,rr,V,V,0}, /* cvtd.s.f */ |
{31,12,rr,V,V,0}, /* cvts.d.f */ |
{33,12,rr,V,V,0}, /* cvtl.d.f */ |
{32,16,rr,V,V,0}, /* cvtd.l.f */ |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{36,2,rr,V,V,0}, /* tzc.f */ |
{44,2,rr,V,V,0}, /* lop.f */ |
{117,2,rr,V,V,0}, /* xpnd.f */ |
{42,2,rr,V,V,0}, /* not.f */ |
{8,2,rr,S,V,0}, /* shf.f */ |
{35,17,rr,V,V,0}, /* plc.t.f */ |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{37,11,rr,V,V,0}, /* eq.s.f */ |
{37,12,rr,V,V,0}, /* eq.d.f */ |
{43,11,rr,V,V,0}, /* neg.s.f */ |
{43,12,rr,V,V,0}, /* neg.d.f */ |
{37,11,rr,S,V,0}, /* eq.s.f */ |
{37,12,rr,S,V,0}, /* eq.d.f */ |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{40,11,rr,V,V,0}, /* le.s.f */ |
{40,12,rr,V,V,0}, /* le.d.f */ |
{41,11,rr,V,V,0}, /* lt.s.f */ |
{41,12,rr,V,V,0}, /* lt.d.f */ |
{40,11,rr,S,V,0}, /* le.s.f */ |
{40,12,rr,S,V,0}, /* le.d.f */ |
{41,11,rr,S,V,0}, /* lt.s.f */ |
{41,12,rr,S,V,0}, /* lt.d.f */ |
{37,13,rr,V,V,0}, /* eq.b.f */ |
{37,14,rr,V,V,0}, /* eq.h.f */ |
{37,15,rr,V,V,0}, /* eq.w.f */ |
{37,16,rr,V,V,0}, /* eq.l.f */ |
{37,13,rr,S,V,0}, /* eq.b.f */ |
{37,14,rr,S,V,0}, /* eq.h.f */ |
{37,15,rr,S,V,0}, /* eq.w.f */ |
{37,16,rr,S,V,0}, /* eq.l.f */ |
{40,13,rr,V,V,0}, /* le.b.f */ |
{40,14,rr,V,V,0}, /* le.h.f */ |
{40,15,rr,V,V,0}, /* le.w.f */ |
{40,16,rr,V,V,0}, /* le.l.f */ |
{40,13,rr,S,V,0}, /* le.b.f */ |
{40,14,rr,S,V,0}, /* le.h.f */ |
{40,15,rr,S,V,0}, /* le.w.f */ |
{40,16,rr,S,V,0}, /* le.l.f */ |
{41,13,rr,V,V,0}, /* lt.b.f */ |
{41,14,rr,V,V,0}, /* lt.h.f */ |
{41,15,rr,V,V,0}, /* lt.w.f */ |
{41,16,rr,V,V,0}, /* lt.l.f */ |
{41,13,rr,S,V,0}, /* lt.b.f */ |
{41,14,rr,S,V,0}, /* lt.h.f */ |
{41,15,rr,S,V,0}, /* lt.w.f */ |
{41,16,rr,S,V,0}, /* lt.l.f */ |
{43,13,rr,V,V,0}, /* neg.b.f */ |
{43,14,rr,V,V,0}, /* neg.h.f */ |
{43,15,rr,V,V,0}, /* neg.w.f */ |
{43,16,rr,V,V,0}, /* neg.l.f */ |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
}; |
const struct formstr e0_format4[] = { |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
}; |
const struct formstr e0_format5[] = { |
{51,13,rr,V,V,0}, /* ldvi.b.f */ |
{51,14,rr,V,V,0}, /* ldvi.h.f */ |
{51,15,rr,V,V,0}, /* ldvi.w.f */ |
{51,16,rr,V,V,0}, /* ldvi.l.f */ |
{28,11,rr,V,V,0}, /* cvtw.s.f */ |
{31,15,rr,V,V,0}, /* cvts.w.f */ |
{28,16,rr,V,V,0}, /* cvtw.l.f */ |
{33,15,rr,V,V,0}, /* cvtl.w.f */ |
{52,13,rxr,V,V,0}, /* stvi.b.f */ |
{52,14,rxr,V,V,0}, /* stvi.h.f */ |
{52,15,rxr,V,V,0}, /* stvi.w.f */ |
{52,16,rxr,V,V,0}, /* stvi.l.f */ |
{52,13,rxr,S,V,0}, /* stvi.b.f */ |
{52,14,rxr,S,V,0}, /* stvi.h.f */ |
{52,15,rxr,S,V,0}, /* stvi.w.f */ |
{52,16,rxr,S,V,0}, /* stvi.l.f */ |
}; |
const struct formstr e0_format6[] = { |
{0,0,rxl,S,CIR,0}, /* mov */ |
{0,0,lr,CIR,S,0}, /* mov */ |
{0,0,lr,TOC,S,0}, /* mov */ |
{0,0,lr,CPUID,S,0}, /* mov */ |
{0,0,rxl,S,TTR,0}, /* mov */ |
{0,0,lr,TTR,S,0}, /* mov */ |
{118,0,nops,0,0,0}, /* ctrsl */ |
{119,0,nops,0,0,0}, /* ctrsg */ |
{0,0,rxl,S,VMU,0}, /* mov */ |
{0,0,lr,VMU,S,0}, /* mov */ |
{0,0,rxl,S,VML,0}, /* mov */ |
{0,0,lr,VML,S,0}, /* mov */ |
{0,0,rxl,S,ICR,0}, /* mov */ |
{0,0,lr,ICR,S,0}, /* mov */ |
{0,0,rxl,S,TCPU,0}, /* mov */ |
{0,0,lr,TCPU,S,0}, /* mov */ |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{120,0,nops,0,0,0}, /* stop */ |
{0,0,0,0,0,0}, |
{0,0,rxl,S,TID,0}, /* mov */ |
{0,0,lr,TID,S,0}, /* mov */ |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
}; |
const struct formstr e0_format7[] = { |
{84,13,r,V,0,0}, /* sum.b.f */ |
{84,14,r,V,0,0}, /* sum.h.f */ |
{84,15,r,V,0,0}, /* sum.w.f */ |
{84,16,r,V,0,0}, /* sum.l.f */ |
{85,2,r,V,0,0}, /* all.f */ |
{86,2,r,V,0,0}, /* any.f */ |
{87,2,r,V,0,0}, /* parity.f */ |
{0,0,0,0,0,0}, |
{88,13,r,V,0,0}, /* max.b.f */ |
{88,14,r,V,0,0}, /* max.h.f */ |
{88,15,r,V,0,0}, /* max.w.f */ |
{88,16,r,V,0,0}, /* max.l.f */ |
{89,13,r,V,0,0}, /* min.b.f */ |
{89,14,r,V,0,0}, /* min.h.f */ |
{89,15,r,V,0,0}, /* min.w.f */ |
{89,16,r,V,0,0}, /* min.l.f */ |
{84,11,r,V,0,0}, /* sum.s.f */ |
{84,12,r,V,0,0}, /* sum.d.f */ |
{90,11,r,V,0,0}, /* prod.s.f */ |
{90,12,r,V,0,0}, /* prod.d.f */ |
{88,11,r,V,0,0}, /* max.s.f */ |
{88,12,r,V,0,0}, /* max.d.f */ |
{89,11,r,V,0,0}, /* min.s.f */ |
{89,12,r,V,0,0}, /* min.d.f */ |
{90,13,r,V,0,0}, /* prod.b.f */ |
{90,14,r,V,0,0}, /* prod.h.f */ |
{90,15,r,V,0,0}, /* prod.w.f */ |
{90,16,r,V,0,0}, /* prod.l.f */ |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
}; |
const struct formstr e1_format0[] = { |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{10,18,rrr,S,V,V}, /* sub.s.t */ |
{10,19,rrr,S,V,V}, /* sub.d.t */ |
{4,18,rrr,S,V,V}, /* div.s.t */ |
{4,19,rrr,S,V,V}, /* div.d.t */ |
{3,18,rrr,V,V,V}, /* mul.s.t */ |
{3,19,rrr,V,V,V}, /* mul.d.t */ |
{4,18,rrr,V,V,V}, /* div.s.t */ |
{4,19,rrr,V,V,V}, /* div.d.t */ |
{3,18,rrr,V,S,V}, /* mul.s.t */ |
{3,19,rrr,V,S,V}, /* mul.d.t */ |
{4,18,rrr,V,S,V}, /* div.s.t */ |
{4,19,rrr,V,S,V}, /* div.d.t */ |
{5,1,rrr,V,V,V}, /* and.t */ |
{6,1,rrr,V,V,V}, /* or.t */ |
{7,1,rrr,V,V,V}, /* xor.t */ |
{8,1,rrr,V,V,V}, /* shf.t */ |
{5,1,rrr,V,S,V}, /* and.t */ |
{6,1,rrr,V,S,V}, /* or.t */ |
{7,1,rrr,V,S,V}, /* xor.t */ |
{8,1,rrr,V,S,V}, /* shf.t */ |
{9,18,rrr,V,V,V}, /* add.s.t */ |
{9,19,rrr,V,V,V}, /* add.d.t */ |
{10,18,rrr,V,V,V}, /* sub.s.t */ |
{10,19,rrr,V,V,V}, /* sub.d.t */ |
{9,18,rrr,V,S,V}, /* add.s.t */ |
{9,19,rrr,V,S,V}, /* add.d.t */ |
{10,18,rrr,V,S,V}, /* sub.s.t */ |
{10,19,rrr,V,S,V}, /* sub.d.t */ |
{9,20,rrr,V,V,V}, /* add.b.t */ |
{9,21,rrr,V,V,V}, /* add.h.t */ |
{9,22,rrr,V,V,V}, /* add.w.t */ |
{9,23,rrr,V,V,V}, /* add.l.t */ |
{9,20,rrr,V,S,V}, /* add.b.t */ |
{9,21,rrr,V,S,V}, /* add.h.t */ |
{9,22,rrr,V,S,V}, /* add.w.t */ |
{9,23,rrr,V,S,V}, /* add.l.t */ |
{10,20,rrr,V,V,V}, /* sub.b.t */ |
{10,21,rrr,V,V,V}, /* sub.h.t */ |
{10,22,rrr,V,V,V}, /* sub.w.t */ |
{10,23,rrr,V,V,V}, /* sub.l.t */ |
{10,20,rrr,V,S,V}, /* sub.b.t */ |
{10,21,rrr,V,S,V}, /* sub.h.t */ |
{10,22,rrr,V,S,V}, /* sub.w.t */ |
{10,23,rrr,V,S,V}, /* sub.l.t */ |
{3,20,rrr,V,V,V}, /* mul.b.t */ |
{3,21,rrr,V,V,V}, /* mul.h.t */ |
{3,22,rrr,V,V,V}, /* mul.w.t */ |
{3,23,rrr,V,V,V}, /* mul.l.t */ |
{3,20,rrr,V,S,V}, /* mul.b.t */ |
{3,21,rrr,V,S,V}, /* mul.h.t */ |
{3,22,rrr,V,S,V}, /* mul.w.t */ |
{3,23,rrr,V,S,V}, /* mul.l.t */ |
{4,20,rrr,V,V,V}, /* div.b.t */ |
{4,21,rrr,V,V,V}, /* div.h.t */ |
{4,22,rrr,V,V,V}, /* div.w.t */ |
{4,23,rrr,V,V,V}, /* div.l.t */ |
{4,20,rrr,V,S,V}, /* div.b.t */ |
{4,21,rrr,V,S,V}, /* div.h.t */ |
{4,22,rrr,V,S,V}, /* div.w.t */ |
{4,23,rrr,V,S,V}, /* div.l.t */ |
}; |
const struct formstr e1_format1[] = { |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{26,20,a2r,S,0,0}, /* ste.b.t */ |
{26,21,a2r,S,0,0}, /* ste.h.t */ |
{26,22,a2r,S,0,0}, /* ste.w.t */ |
{26,23,a2r,S,0,0}, /* ste.l.t */ |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{18,20,a1r,V,0,0}, /* ld.b.t */ |
{18,21,a1r,V,0,0}, /* ld.h.t */ |
{18,22,a1r,V,0,0}, /* ld.w.t */ |
{18,23,a1r,V,0,0}, /* ld.l.t */ |
{21,20,a2r,V,0,0}, /* st.b.t */ |
{21,21,a2r,V,0,0}, /* st.h.t */ |
{21,22,a2r,V,0,0}, /* st.w.t */ |
{21,23,a2r,V,0,0}, /* st.l.t */ |
}; |
const struct formstr e1_format2[] = { |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{28,20,rr,V,V,0}, /* cvtw.b.t */ |
{28,21,rr,V,V,0}, /* cvtw.h.t */ |
{29,22,rr,V,V,0}, /* cvtb.w.t */ |
{30,22,rr,V,V,0}, /* cvth.w.t */ |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{31,23,rr,V,V,0}, /* cvts.l.t */ |
{32,22,rr,V,V,0}, /* cvtd.w.t */ |
{33,18,rr,V,V,0}, /* cvtl.s.t */ |
{28,19,rr,V,V,0}, /* cvtw.d.t */ |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{116,18,rr,V,V,0}, /* frint.s.t */ |
{116,19,rr,V,V,0}, /* frint.d.t */ |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{81,18,rr,V,V,0}, /* sqrt.s.t */ |
{81,19,rr,V,V,0}, /* sqrt.d.t */ |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
}; |
const struct formstr e1_format3[] = { |
{32,18,rr,V,V,0}, /* cvtd.s.t */ |
{31,19,rr,V,V,0}, /* cvts.d.t */ |
{33,19,rr,V,V,0}, /* cvtl.d.t */ |
{32,23,rr,V,V,0}, /* cvtd.l.t */ |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{36,1,rr,V,V,0}, /* tzc.t */ |
{44,1,rr,V,V,0}, /* lop.t */ |
{117,1,rr,V,V,0}, /* xpnd.t */ |
{42,1,rr,V,V,0}, /* not.t */ |
{8,1,rr,S,V,0}, /* shf.t */ |
{35,24,rr,V,V,0}, /* plc.t.t */ |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{37,18,rr,V,V,0}, /* eq.s.t */ |
{37,19,rr,V,V,0}, /* eq.d.t */ |
{43,18,rr,V,V,0}, /* neg.s.t */ |
{43,19,rr,V,V,0}, /* neg.d.t */ |
{37,18,rr,S,V,0}, /* eq.s.t */ |
{37,19,rr,S,V,0}, /* eq.d.t */ |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{40,18,rr,V,V,0}, /* le.s.t */ |
{40,19,rr,V,V,0}, /* le.d.t */ |
{41,18,rr,V,V,0}, /* lt.s.t */ |
{41,19,rr,V,V,0}, /* lt.d.t */ |
{40,18,rr,S,V,0}, /* le.s.t */ |
{40,19,rr,S,V,0}, /* le.d.t */ |
{41,18,rr,S,V,0}, /* lt.s.t */ |
{41,19,rr,S,V,0}, /* lt.d.t */ |
{37,20,rr,V,V,0}, /* eq.b.t */ |
{37,21,rr,V,V,0}, /* eq.h.t */ |
{37,22,rr,V,V,0}, /* eq.w.t */ |
{37,23,rr,V,V,0}, /* eq.l.t */ |
{37,20,rr,S,V,0}, /* eq.b.t */ |
{37,21,rr,S,V,0}, /* eq.h.t */ |
{37,22,rr,S,V,0}, /* eq.w.t */ |
{37,23,rr,S,V,0}, /* eq.l.t */ |
{40,20,rr,V,V,0}, /* le.b.t */ |
{40,21,rr,V,V,0}, /* le.h.t */ |
{40,22,rr,V,V,0}, /* le.w.t */ |
{40,23,rr,V,V,0}, /* le.l.t */ |
{40,20,rr,S,V,0}, /* le.b.t */ |
{40,21,rr,S,V,0}, /* le.h.t */ |
{40,22,rr,S,V,0}, /* le.w.t */ |
{40,23,rr,S,V,0}, /* le.l.t */ |
{41,20,rr,V,V,0}, /* lt.b.t */ |
{41,21,rr,V,V,0}, /* lt.h.t */ |
{41,22,rr,V,V,0}, /* lt.w.t */ |
{41,23,rr,V,V,0}, /* lt.l.t */ |
{41,20,rr,S,V,0}, /* lt.b.t */ |
{41,21,rr,S,V,0}, /* lt.h.t */ |
{41,22,rr,S,V,0}, /* lt.w.t */ |
{41,23,rr,S,V,0}, /* lt.l.t */ |
{43,20,rr,V,V,0}, /* neg.b.t */ |
{43,21,rr,V,V,0}, /* neg.h.t */ |
{43,22,rr,V,V,0}, /* neg.w.t */ |
{43,23,rr,V,V,0}, /* neg.l.t */ |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
}; |
const struct formstr e1_format4[] = { |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
}; |
const struct formstr e1_format5[] = { |
{51,20,rr,V,V,0}, /* ldvi.b.t */ |
{51,21,rr,V,V,0}, /* ldvi.h.t */ |
{51,22,rr,V,V,0}, /* ldvi.w.t */ |
{51,23,rr,V,V,0}, /* ldvi.l.t */ |
{28,18,rr,V,V,0}, /* cvtw.s.t */ |
{31,22,rr,V,V,0}, /* cvts.w.t */ |
{28,23,rr,V,V,0}, /* cvtw.l.t */ |
{33,22,rr,V,V,0}, /* cvtl.w.t */ |
{52,20,rxr,V,V,0}, /* stvi.b.t */ |
{52,21,rxr,V,V,0}, /* stvi.h.t */ |
{52,22,rxr,V,V,0}, /* stvi.w.t */ |
{52,23,rxr,V,V,0}, /* stvi.l.t */ |
{52,20,rxr,S,V,0}, /* stvi.b.t */ |
{52,21,rxr,S,V,0}, /* stvi.h.t */ |
{52,22,rxr,S,V,0}, /* stvi.w.t */ |
{52,23,rxr,S,V,0}, /* stvi.l.t */ |
}; |
const struct formstr e1_format6[] = { |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
}; |
const struct formstr e1_format7[] = { |
{84,20,r,V,0,0}, /* sum.b.t */ |
{84,21,r,V,0,0}, /* sum.h.t */ |
{84,22,r,V,0,0}, /* sum.w.t */ |
{84,23,r,V,0,0}, /* sum.l.t */ |
{85,1,r,V,0,0}, /* all.t */ |
{86,1,r,V,0,0}, /* any.t */ |
{87,1,r,V,0,0}, /* parity.t */ |
{0,0,0,0,0,0}, |
{88,20,r,V,0,0}, /* max.b.t */ |
{88,21,r,V,0,0}, /* max.h.t */ |
{88,22,r,V,0,0}, /* max.w.t */ |
{88,23,r,V,0,0}, /* max.l.t */ |
{89,20,r,V,0,0}, /* min.b.t */ |
{89,21,r,V,0,0}, /* min.h.t */ |
{89,22,r,V,0,0}, /* min.w.t */ |
{89,23,r,V,0,0}, /* min.l.t */ |
{84,18,r,V,0,0}, /* sum.s.t */ |
{84,19,r,V,0,0}, /* sum.d.t */ |
{90,18,r,V,0,0}, /* prod.s.t */ |
{90,19,r,V,0,0}, /* prod.d.t */ |
{88,18,r,V,0,0}, /* max.s.t */ |
{88,19,r,V,0,0}, /* max.d.t */ |
{89,18,r,V,0,0}, /* min.s.t */ |
{89,19,r,V,0,0}, /* min.d.t */ |
{90,20,r,V,0,0}, /* prod.b.t */ |
{90,21,r,V,0,0}, /* prod.h.t */ |
{90,22,r,V,0,0}, /* prod.w.t */ |
{90,23,r,V,0,0}, /* prod.l.t */ |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
{0,0,0,0,0,0}, |
}; |
char *lop[] = { |
"mov", /* 0 */ |
"merg", /* 1 */ |
"mask", /* 2 */ |
"mul", /* 3 */ |
"div", /* 4 */ |
"and", /* 5 */ |
"or", /* 6 */ |
"xor", /* 7 */ |
"shf", /* 8 */ |
"add", /* 9 */ |
"sub", /* 10 */ |
"exit", /* 11 */ |
"jmp", /* 12 */ |
"jmpi", /* 13 */ |
"jmpa", /* 14 */ |
"jmps", /* 15 */ |
"tac", /* 16 */ |
"ldea", /* 17 */ |
"ld", /* 18 */ |
"tas", /* 19 */ |
"pshea", /* 20 */ |
"st", /* 21 */ |
"call", /* 22 */ |
"calls", /* 23 */ |
"callq", /* 24 */ |
"pfork", /* 25 */ |
"ste", /* 26 */ |
"incr", /* 27 */ |
"cvtw", /* 28 */ |
"cvtb", /* 29 */ |
"cvth", /* 30 */ |
"cvts", /* 31 */ |
"cvtd", /* 32 */ |
"cvtl", /* 33 */ |
"ldpa", /* 34 */ |
"plc", /* 35 */ |
"tzc", /* 36 */ |
"eq", /* 37 */ |
"leu", /* 38 */ |
"ltu", /* 39 */ |
"le", /* 40 */ |
"lt", /* 41 */ |
"not", /* 42 */ |
"neg", /* 43 */ |
"lop", /* 44 */ |
"cprs", /* 45 */ |
"nop", /* 46 */ |
"br", /* 47 */ |
"bri", /* 48 */ |
"bra", /* 49 */ |
"brs", /* 50 */ |
"ldvi", /* 51 */ |
"stvi", /* 52 */ |
"ldsdr", /* 53 */ |
"ldkdr", /* 54 */ |
"ln", /* 55 */ |
"patu", /* 56 */ |
"pate", /* 57 */ |
"pich", /* 58 */ |
"plch", /* 59 */ |
"idle", /* 60 */ |
"rtnq", /* 61 */ |
"cfork", /* 62 */ |
"rtn", /* 63 */ |
"wfork", /* 64 */ |
"join", /* 65 */ |
"rtnc", /* 66 */ |
"exp", /* 67 */ |
"sin", /* 68 */ |
"cos", /* 69 */ |
"psh", /* 70 */ |
"pop", /* 71 */ |
"eni", /* 72 */ |
"dsi", /* 73 */ |
"bkpt", /* 74 */ |
"msync", /* 75 */ |
"mski", /* 76 */ |
"xmti", /* 77 */ |
"tstvv", /* 78 */ |
"diag", /* 79 */ |
"pbkpt", /* 80 */ |
"sqrt", /* 81 */ |
"casr", /* 82 */ |
"atan", /* 83 */ |
"sum", /* 84 */ |
"all", /* 85 */ |
"any", /* 86 */ |
"parity", /* 87 */ |
"max", /* 88 */ |
"min", /* 89 */ |
"prod", /* 90 */ |
"halt", /* 91 */ |
"sysc", /* 92 */ |
"trap", /* 93 */ |
"tst", /* 94 */ |
"lck", /* 95 */ |
"ulk", /* 96 */ |
"spawn", /* 97 */ |
"ldcmr", /* 98 */ |
"stcmr", /* 99 */ |
"popr", /* 100 */ |
"pshr", /* 101 */ |
"rcvr", /* 102 */ |
"matm", /* 103 */ |
"sndr", /* 104 */ |
"putr", /* 105 */ |
"getr", /* 106 */ |
"matr", /* 107 */ |
"mat", /* 108 */ |
"get", /* 109 */ |
"rcv", /* 110 */ |
"inc", /* 111 */ |
"put", /* 112 */ |
"snd", /* 113 */ |
"enal", /* 114 */ |
"enag", /* 115 */ |
"frint", /* 116 */ |
"xpnd", /* 117 */ |
"ctrsl", /* 118 */ |
"ctrsg", /* 119 */ |
"stop", /* 120 */ |
}; |
char *rop[] = { |
"", /* 0 */ |
".t", /* 1 */ |
".f", /* 2 */ |
".s", /* 3 */ |
".d", /* 4 */ |
".b", /* 5 */ |
".h", /* 6 */ |
".w", /* 7 */ |
".l", /* 8 */ |
".x", /* 9 */ |
".u", /* 10 */ |
".s.f", /* 11 */ |
".d.f", /* 12 */ |
".b.f", /* 13 */ |
".h.f", /* 14 */ |
".w.f", /* 15 */ |
".l.f", /* 16 */ |
".t.f", /* 17 */ |
".s.t", /* 18 */ |
".d.t", /* 19 */ |
".b.t", /* 20 */ |
".h.t", /* 21 */ |
".w.t", /* 22 */ |
".l.t", /* 23 */ |
".t.t", /* 24 */ |
}; |
/contrib/toolchain/binutils/include/opcode/cr16.h |
---|
0,0 → 1,451 |
/* cr16.h -- Header file for CR16 opcode and register tables. |
Copyright 2007, 2008, 2010, 2013 Free Software Foundation, Inc. |
Contributed by M R Swami Reddy |
This file is part of GAS, GDB and the GNU binutils. |
GAS, GDB, and GNU binutils is free software; you can redistribute it |
and/or modify it under the terms of the GNU General Public License as |
published by the Free Software Foundation; either version 3, or (at your |
option) any later version. |
GAS, GDB, and GNU binutils are distributed in the hope that they will be |
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _CR16_H_ |
#define _CR16_H_ |
/* CR16 core Registers : |
The enums are used as indices to CR16 registers table (cr16_regtab). |
Therefore, order MUST be preserved. */ |
typedef enum |
{ |
/* 16-bit general purpose registers. */ |
r0, r1, r2, r3, |
r4, r5, r6, r7, |
r8, r9, r10, r11, |
r12_L = 12, r13_L = 13, ra = 14, sp_L = 15, |
/* 32-bit general purpose registers. */ |
r12 = 12, r13 = 13, r14 = 14, r15 = 15, |
era = 14, sp = 15, RA, |
/* Not a register. */ |
nullregister, |
MAX_REG |
} |
reg; |
/* CR16 processor registers and special registers : |
The enums are used as indices to CR16 processor registers table |
(cr16_pregtab). Therefore, order MUST be preserved. */ |
typedef enum |
{ |
/* processor registers. */ |
dbs = MAX_REG, |
dsr, dcrl, dcrh, |
car0l, car0h, car1l, car1h, |
cfg, psr, intbasel, intbaseh, |
ispl, isph, uspl, usph, |
dcr = dcrl, |
car0 = car0l, |
car1 = car1l, |
intbase = intbasel, |
isp = ispl, |
usp = uspl, |
/* Not a processor register. */ |
nullpregister = usph + 1, |
MAX_PREG |
} |
preg; |
/* CR16 Register types. */ |
typedef enum |
{ |
CR16_R_REGTYPE, /* r<N> */ |
CR16_RP_REGTYPE, /* reg pair */ |
CR16_P_REGTYPE /* Processor register */ |
} |
reg_type; |
/* CR16 argument types : |
The argument types correspond to instructions operands |
Argument types : |
r - register |
rp - register pair |
c - constant |
i - immediate |
idxr - index with register |
idxrp - index with register pair |
rbase - register base |
rpbase - register pair base |
pr - processor register. */ |
typedef enum |
{ |
arg_r, |
arg_c, |
arg_cr, |
arg_crp, |
arg_ic, |
arg_icr, |
arg_idxr, |
arg_idxrp, |
arg_rbase, |
arg_rpbase, |
arg_rp, |
arg_pr, |
arg_prp, |
arg_cc, |
arg_ra, |
/* Not an argument. */ |
nullargs |
} |
argtype; |
/* CR16 operand types:The operand types correspond to instructions operands. */ |
typedef enum |
{ |
dummy, |
/* N-bit signed immediate. */ |
imm3, imm4, imm5, imm6, imm16, imm20, imm32, |
/* N-bit unsigned immediate. */ |
uimm3, uimm3_1, uimm4, uimm4_1, uimm5, uimm16, uimm20, uimm32, |
/* N-bit signed displacement. */ |
disps5, disps17, disps25, |
/* N-bit unsigned displacement. */ |
dispe9, |
/* N-bit absolute address. */ |
abs20, abs24, |
/* Register relative. */ |
rra, rbase, rbase_disps20, rbase_dispe20, |
/* Register pair relative. */ |
rpbase_disps0, rpbase_dispe4, rpbase_disps4, rpbase_disps16, |
rpbase_disps20, rpbase_dispe20, |
/* Register index. */ |
rindex7_abs20, rindex8_abs20, |
/* Register pair index. */ |
rpindex_disps0, rpindex_disps14, rpindex_disps20, |
/* register. */ |
regr, |
/* register pair. */ |
regp, |
/* processor register. */ |
pregr, |
/* processor register 32 bit. */ |
pregrp, |
/* condition code - 4 bit. */ |
cc, |
/* Not an operand. */ |
nulloperand, |
/* Maximum supported operand. */ |
MAX_OPRD |
} |
operand_type; |
/* CR16 instruction types. */ |
#define NO_TYPE_INS 0 |
#define ARITH_INS 1 |
#define LD_STOR_INS 2 |
#define BRANCH_INS 3 |
#define ARITH_BYTE_INS 4 |
#define SHIFT_INS 5 |
#define BRANCH_NEQ_INS 6 |
#define LD_STOR_INS_INC 7 |
#define STOR_IMM_INS 8 |
#define CSTBIT_INS 9 |
/* Maximum value supported for instruction types. */ |
#define CR16_INS_MAX (1 << 4) |
/* Mask to record an instruction type. */ |
#define CR16_INS_MASK (CR16_INS_MAX - 1) |
/* Return instruction type, given instruction's attributes. */ |
#define CR16_INS_TYPE(attr) ((attr) & CR16_INS_MASK) |
/* Indicates whether this instruction has a register list as parameter. */ |
#define REG_LIST CR16_INS_MAX |
/* The operands in binary and assembly are placed in reverse order. |
load - (REVERSE_MATCH)/store - (! REVERSE_MATCH). */ |
#define REVERSE_MATCH (1 << 5) |
/* Printing formats, where the instruction prefix isn't consecutive. */ |
#define FMT_1 (1 << 9) /* 0xF0F00000 */ |
#define FMT_2 (1 << 10) /* 0xFFF0FF00 */ |
#define FMT_3 (1 << 11) /* 0xFFF00F00 */ |
#define FMT_4 (1 << 12) /* 0xFFF0F000 */ |
#define FMT_5 (1 << 13) /* 0xFFF0FFF0 */ |
#define FMT_CR16 (FMT_1 | FMT_2 | FMT_3 | FMT_4 | FMT_5) |
/* Indicates whether this instruction can be relaxed. */ |
#define RELAXABLE (1 << 14) |
/* Indicates that instruction uses user registers (and not |
general-purpose registers) as operands. */ |
#define USER_REG (1 << 15) |
/* Instruction shouldn't allow 'sp' usage. */ |
#define NO_SP (1 << 17) |
/* Instruction shouldn't allow to push a register which is used as a rptr. */ |
#define NO_RPTR (1 << 18) |
/* Maximum operands per instruction. */ |
#define MAX_OPERANDS 5 |
/* Maximum register name length. */ |
#define MAX_REGNAME_LEN 10 |
/* Maximum instruction length. */ |
#define MAX_INST_LEN 256 |
/* Values defined for the flags field of a struct operand_entry. */ |
/* Operand must be an unsigned number. */ |
#define OP_UNSIGNED (1 << 0) |
/* Operand must be a signed number. */ |
#define OP_SIGNED (1 << 1) |
/* Operand must be a negative number. */ |
#define OP_NEG (1 << 2) |
/* A special load/stor 4-bit unsigned displacement operand. */ |
#define OP_DEC (1 << 3) |
/* Operand must be an even number. */ |
#define OP_EVEN (1 << 4) |
/* Operand is shifted right. */ |
#define OP_SHIFT (1 << 5) |
/* Operand is shifted right and decremented. */ |
#define OP_SHIFT_DEC (1 << 6) |
/* Operand has reserved escape sequences. */ |
#define OP_ESC (1 << 7) |
/* Operand must be a ABS20 number. */ |
#define OP_ABS20 (1 << 8) |
/* Operand must be a ABS24 number. */ |
#define OP_ABS24 (1 << 9) |
/* Operand has reserved escape sequences type 1. */ |
#define OP_ESC1 (1 << 10) |
/* Single operand description. */ |
typedef struct |
{ |
/* Operand type. */ |
operand_type op_type; |
/* Operand location within the opcode. */ |
unsigned int shift; |
} |
operand_desc; |
/* Instruction data structure used in instruction table. */ |
typedef struct |
{ |
/* Name. */ |
const char *mnemonic; |
/* Size (in words). */ |
unsigned int size; |
/* Constant prefix (matched by the disassembler). */ |
unsigned long match; /* ie opcode */ |
/* Match size (in bits). */ |
/* MASK: if( (i & match_bits) == match ) then match */ |
int match_bits; |
/* Attributes. */ |
unsigned int flags; |
/* Operands (always last, so unreferenced operands are initialized). */ |
operand_desc operands[MAX_OPERANDS]; |
} |
inst; |
/* Data structure for a single instruction's arguments (Operands). */ |
typedef struct |
{ |
/* Register or base register. */ |
reg r; |
/* Register pair register. */ |
reg rp; |
/* Index register. */ |
reg i_r; |
/* Processor register. */ |
preg pr; |
/* Processor register. 32 bit */ |
preg prp; |
/* Constant/immediate/absolute value. */ |
long constant; |
/* CC code. */ |
unsigned int cc; |
/* Scaled index mode. */ |
unsigned int scale; |
/* Argument type. */ |
argtype type; |
/* Size of the argument (in bits) required to represent. */ |
int size; |
/* The type of the expression. */ |
unsigned char X_op; |
} |
argument; |
/* Internal structure to hold the various entities |
corresponding to the current assembling instruction. */ |
typedef struct |
{ |
/* Number of arguments. */ |
int nargs; |
/* The argument data structure for storing args (operands). */ |
argument arg[MAX_OPERANDS]; |
/* The following fields are required only by CR16-assembler. */ |
#ifdef TC_CR16 |
/* Expression used for setting the fixups (if any). */ |
expressionS exp; |
bfd_reloc_code_real_type rtype; |
#endif /* TC_CR16 */ |
/* Instruction size (in bytes). */ |
int size; |
} |
ins; |
/* Structure to hold information about predefined operands. */ |
typedef struct |
{ |
/* Size (in bits). */ |
unsigned int bit_size; |
/* Argument type. */ |
argtype arg_type; |
/* One bit syntax flags. */ |
int flags; |
} |
operand_entry; |
/* Structure to hold trap handler information. */ |
typedef struct |
{ |
/* Trap name. */ |
char *name; |
/* Index in dispatch table. */ |
unsigned int entry; |
} |
trap_entry; |
/* Structure to hold information about predefined registers. */ |
typedef struct |
{ |
/* Name (string representation). */ |
char *name; |
/* Value (enum representation). */ |
union |
{ |
/* Register. */ |
reg reg_val; |
/* processor register. */ |
preg preg_val; |
} value; |
/* Register image. */ |
int image; |
/* Register type. */ |
reg_type type; |
} |
reg_entry; |
/* CR16 opcode table. */ |
extern const inst cr16_instruction[]; |
extern const unsigned int cr16_num_opcodes; |
#define NUMOPCODES cr16_num_opcodes |
/* CR16 operands table. */ |
extern const operand_entry cr16_optab[]; |
extern const unsigned int cr16_num_optab; |
/* CR16 registers table. */ |
extern const reg_entry cr16_regtab[]; |
extern const unsigned int cr16_num_regs; |
#define NUMREGS cr16_num_regs |
/* CR16 register pair table. */ |
extern const reg_entry cr16_regptab[]; |
extern const unsigned int cr16_num_regps; |
#define NUMREGPS cr16_num_regps |
/* CR16 processor registers table. */ |
extern const reg_entry cr16_pregtab[]; |
extern const unsigned int cr16_num_pregs; |
#define NUMPREGS cr16_num_pregs |
/* CR16 processor registers - 32 bit table. */ |
extern const reg_entry cr16_pregptab[]; |
extern const unsigned int cr16_num_pregps; |
#define NUMPREGPS cr16_num_pregps |
/* CR16 trap/interrupt table. */ |
extern const trap_entry cr16_traps[]; |
extern const unsigned int cr16_num_traps; |
#define NUMTRAPS cr16_num_traps |
/* CR16 CC - codes bit table. */ |
extern const char * cr16_b_cond_tab[]; |
extern const unsigned int cr16_num_cc; |
#define NUMCC cr16_num_cc; |
/* Table of instructions with no operands. */ |
extern const char * cr16_no_op_insn[]; |
/* Current instruction we're assembling. */ |
extern const inst *instruction; |
/* A macro for representing the instruction "constant" opcode, that is, |
the FIXED part of the instruction. The "constant" opcode is represented |
as a 32-bit unsigned long, where OPC is expanded (by a left SHIFT) |
over that range. */ |
#define BIN(OPC,SHIFT) (OPC << SHIFT) |
/* Is the current instruction type is TYPE ? */ |
#define IS_INSN_TYPE(TYPE) \ |
(CR16_INS_TYPE (instruction->flags) == TYPE) |
/* Is the current instruction mnemonic is MNEMONIC ? */ |
#define IS_INSN_MNEMONIC(MNEMONIC) \ |
(strcmp (instruction->mnemonic, MNEMONIC) == 0) |
/* Does the current instruction has register list ? */ |
#define INST_HAS_REG_LIST \ |
(instruction->flags & REG_LIST) |
/* Utility macros for string comparison. */ |
#define streq(a, b) (strcmp (a, b) == 0) |
#define strneq(a, b, c) (strncmp (a, b, c) == 0) |
/* Long long type handling. */ |
/* Replace all appearances of 'long long int' with LONGLONG. */ |
typedef long long int LONGLONG; |
typedef unsigned long long ULONGLONG; |
/* Data types for opcode handling. */ |
typedef unsigned long dwordU; |
typedef unsigned short wordU; |
/* Globals to store opcode data and build the instruction. */ |
extern wordU cr16_words[3]; |
extern ULONGLONG cr16_allWords; |
extern ins cr16_currInsn; |
/* Prototypes for function in cr16-dis.c. */ |
extern void cr16_make_instruction (void); |
extern int cr16_match_opcode (void); |
#endif /* _CR16_H_ */ |
/contrib/toolchain/binutils/include/opcode/cris.h |
---|
0,0 → 1,367 |
/* cris.h -- Header file for CRIS opcode and register tables. |
Copyright (C) 2000, 2001, 2004, 2010 Free Software Foundation, Inc. |
Contributed by Axis Communications AB, Lund, Sweden. |
Originally written for GAS 1.38.1 by Mikael Asker. |
Updated, BFDized and GNUified by Hans-Peter Nilsson. |
This file is part of GAS, GDB and the GNU binutils. |
GAS, GDB, and GNU binutils is free software; you can redistribute it |
and/or modify it under the terms of the GNU General Public License as |
published by the Free Software Foundation; either version 3, or (at your |
option) any later version. |
GAS, GDB, and GNU binutils are distributed in the hope that they will be |
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef __CRIS_H_INCLUDED_ |
#define __CRIS_H_INCLUDED_ |
#if !defined(__STDC__) && !defined(const) |
#define const |
#endif |
/* Registers. */ |
#define MAX_REG (15) |
#define REG_SP (14) |
#define REG_PC (15) |
/* CPU version control of disassembly and assembly of instructions. |
May affect how the instruction is assembled, at least the size of |
immediate operands. */ |
enum cris_insn_version_usage |
{ |
/* Any version. */ |
cris_ver_version_all=0, |
/* Indeterminate (intended for disassembly only, or obsolete). */ |
cris_ver_warning, |
/* Only for v0..3 (Etrax 1..4). */ |
cris_ver_v0_3, |
/* Only for v3 or higher (ETRAX 4 and beyond). */ |
cris_ver_v3p, |
/* Only for v8 (Etrax 100). */ |
cris_ver_v8, |
/* Only for v8 or higher (ETRAX 100, ETRAX 100 LX). */ |
cris_ver_v8p, |
/* Only for v0..10. FIXME: Not sure what to do with this. */ |
cris_ver_sim_v0_10, |
/* Only for v0..10. */ |
cris_ver_v0_10, |
/* Only for v3..10. (ETRAX 4, ETRAX 100 and ETRAX 100 LX). */ |
cris_ver_v3_10, |
/* Only for v8..10 (ETRAX 100 and ETRAX 100 LX). */ |
cris_ver_v8_10, |
/* Only for v10 (ETRAX 100 LX) and same series. */ |
cris_ver_v10, |
/* Only for v10 (ETRAX 100 LX) and same series. */ |
cris_ver_v10p, |
/* Only for v32 or higher (codename GUINNESS). |
Of course some or all these of may change to cris_ver_v32p if/when |
there's a new revision. */ |
cris_ver_v32p |
}; |
/* Special registers. */ |
struct cris_spec_reg |
{ |
const char *const name; |
unsigned int number; |
/* The size of the register. */ |
unsigned int reg_size; |
/* What CPU version the special register of that name is implemented |
in. If cris_ver_warning, emit an unimplemented-warning. */ |
enum cris_insn_version_usage applicable_version; |
/* There might be a specific warning for using a special register |
here. */ |
const char *const warning; |
}; |
extern const struct cris_spec_reg cris_spec_regs[]; |
/* Support registers (kind of special too, but not named as such). */ |
struct cris_support_reg |
{ |
const char *const name; |
unsigned int number; |
}; |
extern const struct cris_support_reg cris_support_regs[]; |
struct cris_cond15 |
{ |
/* The name of the condition. */ |
const char *const name; |
/* What CPU version this condition name applies to. */ |
enum cris_insn_version_usage applicable_version; |
}; |
extern const struct cris_cond15 cris_conds15[]; |
/* Opcode-dependent constants. */ |
#define AUTOINCR_BIT (0x04) |
/* Prefixes. */ |
#define BDAP_QUICK_OPCODE (0x0100) |
#define BDAP_QUICK_Z_BITS (0x0e00) |
#define BIAP_OPCODE (0x0540) |
#define BIAP_Z_BITS (0x0a80) |
#define DIP_OPCODE (0x0970) |
#define DIP_Z_BITS (0xf280) |
#define BDAP_INDIR_LOW (0x40) |
#define BDAP_INDIR_LOW_Z (0x80) |
#define BDAP_INDIR_HIGH (0x09) |
#define BDAP_INDIR_HIGH_Z (0x02) |
#define BDAP_INDIR_OPCODE (BDAP_INDIR_HIGH * 0x0100 + BDAP_INDIR_LOW) |
#define BDAP_INDIR_Z_BITS (BDAP_INDIR_HIGH_Z * 0x100 + BDAP_INDIR_LOW_Z) |
#define BDAP_PC_LOW (BDAP_INDIR_LOW + REG_PC) |
#define BDAP_INCR_HIGH (BDAP_INDIR_HIGH + AUTOINCR_BIT) |
/* No prefix must have this code for its "match" bits in the |
opcode-table. "BCC .+2" will do nicely. */ |
#define NO_CRIS_PREFIX 0 |
/* Definitions for condition codes. */ |
#define CC_CC 0x0 |
#define CC_HS 0x0 |
#define CC_CS 0x1 |
#define CC_LO 0x1 |
#define CC_NE 0x2 |
#define CC_EQ 0x3 |
#define CC_VC 0x4 |
#define CC_VS 0x5 |
#define CC_PL 0x6 |
#define CC_MI 0x7 |
#define CC_LS 0x8 |
#define CC_HI 0x9 |
#define CC_GE 0xA |
#define CC_LT 0xB |
#define CC_GT 0xC |
#define CC_LE 0xD |
#define CC_A 0xE |
#define CC_EXT 0xF |
/* A table of strings "cc", "cs"... indexed with condition code |
values as above. */ |
extern const char *const cris_cc_strings[]; |
/* Bcc quick. */ |
#define BRANCH_QUICK_LOW (0) |
#define BRANCH_QUICK_HIGH (0) |
#define BRANCH_QUICK_OPCODE (BRANCH_QUICK_HIGH * 0x0100 + BRANCH_QUICK_LOW) |
#define BRANCH_QUICK_Z_BITS (0x0F00) |
/* BA quick. */ |
#define BA_QUICK_HIGH (BRANCH_QUICK_HIGH + CC_A * 0x10) |
#define BA_QUICK_OPCODE (BA_QUICK_HIGH * 0x100 + BRANCH_QUICK_LOW) |
/* Bcc [PC+]. */ |
#define BRANCH_PC_LOW (0xFF) |
#define BRANCH_INCR_HIGH (0x0D) |
#define BA_PC_INCR_OPCODE \ |
((BRANCH_INCR_HIGH + CC_A * 0x10) * 0x0100 + BRANCH_PC_LOW) |
/* Jump. */ |
/* Note that old versions generated special register 8 (in high bits) |
and not-that-old versions recognized it as a jump-instruction. |
That opcode now belongs to JUMPU. */ |
#define JUMP_INDIR_OPCODE (0x0930) |
#define JUMP_INDIR_Z_BITS (0xf2c0) |
#define JUMP_PC_INCR_OPCODE \ |
(JUMP_INDIR_OPCODE + AUTOINCR_BIT * 0x0100 + REG_PC) |
#define MOVE_M_TO_PREG_OPCODE 0x0a30 |
#define MOVE_M_TO_PREG_ZBITS 0x01c0 |
/* BDAP.D N,PC. */ |
#define MOVE_PC_INCR_OPCODE_PREFIX \ |
(((BDAP_INCR_HIGH | (REG_PC << 4)) << 8) | BDAP_PC_LOW | (2 << 4)) |
#define MOVE_PC_INCR_OPCODE_SUFFIX \ |
(MOVE_M_TO_PREG_OPCODE | REG_PC | (AUTOINCR_BIT << 8)) |
#define JUMP_PC_INCR_OPCODE_V32 (0x0DBF) |
/* BA DWORD (V32). */ |
#define BA_DWORD_OPCODE (0x0EBF) |
/* Nop. */ |
#define NOP_OPCODE (0x050F) |
#define NOP_Z_BITS (0xFFFF ^ NOP_OPCODE) |
#define NOP_OPCODE_V32 (0x05B0) |
#define NOP_Z_BITS_V32 (0xFFFF ^ NOP_OPCODE_V32) |
/* For the compatibility mode, let's use "MOVE R0,P0". Doesn't affect |
registers or flags. Unfortunately shuts off interrupts for one cycle |
for < v32, but there doesn't seem to be any alternative without that |
effect. */ |
#define NOP_OPCODE_COMMON (0x630) |
#define NOP_OPCODE_ZBITS_COMMON (0xffff & ~NOP_OPCODE_COMMON) |
/* LAPC.D */ |
#define LAPC_DWORD_OPCODE (0x0D7F) |
#define LAPC_DWORD_Z_BITS (0x0fff & ~LAPC_DWORD_OPCODE) |
/* Structure of an opcode table entry. */ |
enum cris_imm_oprnd_size_type |
{ |
/* No size is applicable. */ |
SIZE_NONE, |
/* Always 32 bits. */ |
SIZE_FIX_32, |
/* Indicated by size of special register. */ |
SIZE_SPEC_REG, |
/* Indicated by size field, signed. */ |
SIZE_FIELD_SIGNED, |
/* Indicated by size field, unsigned. */ |
SIZE_FIELD_UNSIGNED, |
/* Indicated by size field, no sign implied. */ |
SIZE_FIELD |
}; |
/* For GDB. FIXME: Is this the best way to handle opcode |
interpretation? */ |
enum cris_op_type |
{ |
cris_not_implemented_op = 0, |
cris_abs_op, |
cris_addi_op, |
cris_asr_op, |
cris_asrq_op, |
cris_ax_ei_setf_op, |
cris_bdap_prefix, |
cris_biap_prefix, |
cris_break_op, |
cris_btst_nop_op, |
cris_clearf_di_op, |
cris_dip_prefix, |
cris_dstep_logshift_mstep_neg_not_op, |
cris_eight_bit_offset_branch_op, |
cris_move_mem_to_reg_movem_op, |
cris_move_reg_to_mem_movem_op, |
cris_move_to_preg_op, |
cris_muls_op, |
cris_mulu_op, |
cris_none_reg_mode_add_sub_cmp_and_or_move_op, |
cris_none_reg_mode_clear_test_op, |
cris_none_reg_mode_jump_op, |
cris_none_reg_mode_move_from_preg_op, |
cris_quick_mode_add_sub_op, |
cris_quick_mode_and_cmp_move_or_op, |
cris_quick_mode_bdap_prefix, |
cris_reg_mode_add_sub_cmp_and_or_move_op, |
cris_reg_mode_clear_op, |
cris_reg_mode_jump_op, |
cris_reg_mode_move_from_preg_op, |
cris_reg_mode_test_op, |
cris_scc_op, |
cris_sixteen_bit_offset_branch_op, |
cris_three_operand_add_sub_cmp_and_or_op, |
cris_three_operand_bound_op, |
cris_two_operand_bound_op, |
cris_xor_op |
}; |
struct cris_opcode |
{ |
/* The name of the insn. */ |
const char *name; |
/* Bits that must be 1 for a match. */ |
unsigned int match; |
/* Bits that must be 0 for a match. */ |
unsigned int lose; |
/* See the table in "opcodes/cris-opc.c". */ |
const char *args; |
/* Nonzero if this is a delayed branch instruction. */ |
char delayed; |
/* Size of immediate operands. */ |
enum cris_imm_oprnd_size_type imm_oprnd_size; |
/* Indicates which version this insn was first implemented in. */ |
enum cris_insn_version_usage applicable_version; |
/* What kind of operation this is. */ |
enum cris_op_type op; |
}; |
extern const struct cris_opcode cris_opcodes[]; |
/* These macros are for the target-specific flags in disassemble_info |
used at disassembly. */ |
/* This insn accesses memory. This flag is more trustworthy than |
checking insn_type for "dis_dref" which does not work for |
e.g. "JSR [foo]". */ |
#define CRIS_DIS_FLAG_MEMREF (1 << 0) |
/* The "target" field holds a register number. */ |
#define CRIS_DIS_FLAG_MEM_TARGET_IS_REG (1 << 1) |
/* The "target2" field holds a register number; add it to "target". */ |
#define CRIS_DIS_FLAG_MEM_TARGET2_IS_REG (1 << 2) |
/* Yet another add-on: the register in "target2" must be multiplied |
by 2 before adding to "target". */ |
#define CRIS_DIS_FLAG_MEM_TARGET2_MULT2 (1 << 3) |
/* Yet another add-on: the register in "target2" must be multiplied |
by 4 (mutually exclusive with .._MULT2). */ |
#define CRIS_DIS_FLAG_MEM_TARGET2_MULT4 (1 << 4) |
/* The register in "target2" is an indirect memory reference (of the |
register there), add to "target". Assumed size is dword (mutually |
exclusive with .._MULT[24]). */ |
#define CRIS_DIS_FLAG_MEM_TARGET2_MEM (1 << 5) |
/* Add-on to CRIS_DIS_FLAG_MEM_TARGET2_MEM; the memory access is "byte"; |
sign-extended before adding to "target". */ |
#define CRIS_DIS_FLAG_MEM_TARGET2_MEM_BYTE (1 << 6) |
/* Add-on to CRIS_DIS_FLAG_MEM_TARGET2_MEM; the memory access is "word"; |
sign-extended before adding to "target". */ |
#define CRIS_DIS_FLAG_MEM_TARGET2_MEM_WORD (1 << 7) |
#endif /* __CRIS_H_INCLUDED_ */ |
/* |
* Local variables: |
* eval: (c-set-style "gnu") |
* indent-tabs-mode: t |
* End: |
*/ |
/contrib/toolchain/binutils/include/opcode/crx.h |
---|
0,0 → 1,419 |
/* crx.h -- Header file for CRX opcode and register tables. |
Copyright 2004, 2010, 2012 Free Software Foundation, Inc. |
Contributed by Tomer Levi, NSC, Israel. |
Originally written for GAS 2.12 by Tomer Levi, NSC, Israel. |
Updates, BFDizing, GNUifying and ELF support by Tomer Levi. |
This file is part of GAS, GDB and the GNU binutils. |
GAS, GDB, and GNU binutils is free software; you can redistribute it |
and/or modify it under the terms of the GNU General Public License as |
published by the Free Software Foundation; either version 3, or (at your |
option) any later version. |
GAS, GDB, and GNU binutils are distributed in the hope that they will be |
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _CRX_H_ |
#define _CRX_H_ |
/* CRX core/debug Registers : |
The enums are used as indices to CRX registers table (crx_regtab). |
Therefore, order MUST be preserved. */ |
typedef enum |
{ |
/* 32-bit general purpose registers. */ |
r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, |
r10, r11, r12, r13, r14, r15, ra, sp, |
/* 32-bit user registers. */ |
u0, u1, u2, u3, u4, u5, u6, u7, u8, u9, |
u10, u11, u12, u13, u14, u15, ura, usp, |
/* hi and lo registers. */ |
hi, lo, |
/* hi and lo user registers. */ |
uhi, ulo, |
/* Processor Status Register. */ |
psr, |
/* Interrupt Base Register. */ |
intbase, |
/* Interrupt Stack Pointer Register. */ |
isp, |
/* Configuration Register. */ |
cfg, |
/* Coprocessor Configuration Register. */ |
cpcfg, |
/* Coprocessor Enable Register. */ |
cen, |
/* Not a register. */ |
nullregister, |
MAX_REG |
} |
reg; |
/* CRX Coprocessor registers and special registers : |
The enums are used as indices to CRX coprocessor registers table |
(crx_copregtab). Therefore, order MUST be preserved. */ |
typedef enum |
{ |
/* Coprocessor registers. */ |
c0 = MAX_REG, c1, c2, c3, c4, c5, c6, c7, c8, |
c9, c10, c11, c12, c13, c14, c15, |
/* Coprocessor special registers. */ |
cs0, cs1 ,cs2, cs3, cs4, cs5, cs6, cs7, cs8, |
cs9, cs10, cs11, cs12, cs13, cs14, cs15, |
/* Not a Coprocessor register. */ |
nullcopregister, |
MAX_COPREG |
} |
copreg; |
/* CRX Register types. */ |
typedef enum |
{ |
CRX_R_REGTYPE, /* r<N> */ |
CRX_U_REGTYPE, /* u<N> */ |
CRX_C_REGTYPE, /* c<N> */ |
CRX_CS_REGTYPE, /* cs<N> */ |
CRX_CFG_REGTYPE /* configuration register */ |
} |
reg_type; |
/* CRX argument types : |
The argument types correspond to instructions operands |
Argument types : |
r - register |
c - constant |
i - immediate |
idxr - index register |
rbase - register base |
s - star ('*') |
copr - coprocessor register |
copsr - coprocessor special register. */ |
typedef enum |
{ |
arg_r, arg_c, arg_cr, arg_ic, arg_icr, arg_sc, |
arg_idxr, arg_rbase, arg_copr, arg_copsr, |
/* Not an argument. */ |
nullargs |
} |
argtype; |
/* CRX operand types : |
The operand types correspond to instructions operands. */ |
typedef enum |
{ |
dummy, |
/* 4-bit encoded constant. */ |
cst4, |
/* N-bit immediate. */ |
i16, i32, |
/* N-bit unsigned immediate. */ |
ui3, ui4, ui5, ui16, |
/* N-bit signed displacement. */ |
disps9, disps17, disps25, disps32, |
/* N-bit unsigned displacement. */ |
dispu5, |
/* N-bit escaped displacement. */ |
dispe9, |
/* N-bit absolute address. */ |
abs16, abs32, |
/* Register relative. */ |
rbase, rbase_dispu4, |
rbase_disps12, rbase_disps16, rbase_disps28, rbase_disps32, |
/* Register index. */ |
rindex_disps6, rindex_disps22, |
/* 4-bit genaral-purpose register specifier. */ |
regr, |
/* 8-bit register address space. */ |
regr8, |
/* coprocessor register. */ |
copregr, |
/* coprocessor special register. */ |
copsregr, |
/* Not an operand. */ |
nulloperand, |
/* Maximum supported operand. */ |
MAX_OPRD |
} |
operand_type; |
/* CRX instruction types. */ |
#define NO_TYPE_INS 0 |
#define ARITH_INS 1 |
#define LD_STOR_INS 2 |
#define BRANCH_INS 3 |
#define ARITH_BYTE_INS 4 |
#define CMPBR_INS 5 |
#define SHIFT_INS 6 |
#define BRANCH_NEQ_INS 7 |
#define LD_STOR_INS_INC 8 |
#define STOR_IMM_INS 9 |
#define CSTBIT_INS 10 |
#define COP_BRANCH_INS 11 |
#define COP_REG_INS 12 |
#define COPS_REG_INS 13 |
#define DCR_BRANCH_INS 14 |
/* Maximum value supported for instruction types. */ |
#define CRX_INS_MAX (1 << 4) |
/* Mask to record an instruction type. */ |
#define CRX_INS_MASK (CRX_INS_MAX - 1) |
/* Return instruction type, given instruction's attributes. */ |
#define CRX_INS_TYPE(attr) ((attr) & CRX_INS_MASK) |
/* Indicates whether this instruction has a register list as parameter. */ |
#define REG_LIST CRX_INS_MAX |
/* The operands in binary and assembly are placed in reverse order. |
load - (REVERSE_MATCH)/store - (! REVERSE_MATCH). */ |
#define REVERSE_MATCH (1 << 5) |
/* Kind of displacement map used DISPU[BWD]4. */ |
#define DISPUB4 (1 << 6) |
#define DISPUW4 (1 << 7) |
#define DISPUD4 (1 << 8) |
#define DISPU4MAP (DISPUB4 | DISPUW4 | DISPUD4) |
/* Printing formats, where the instruction prefix isn't consecutive. */ |
#define FMT_1 (1 << 9) /* 0xF0F00000 */ |
#define FMT_2 (1 << 10) /* 0xFFF0FF00 */ |
#define FMT_3 (1 << 11) /* 0xFFF00F00 */ |
#define FMT_4 (1 << 12) /* 0xFFF0F000 */ |
#define FMT_5 (1 << 13) /* 0xFFF0FFF0 */ |
#define FMT_CRX (FMT_1 | FMT_2 | FMT_3 | FMT_4 | FMT_5) |
/* Indicates whether this instruction can be relaxed. */ |
#define RELAXABLE (1 << 14) |
/* Indicates that instruction uses user registers (and not |
general-purpose registers) as operands. */ |
#define USER_REG (1 << 15) |
/* Indicates that instruction can perfom a cst4 mapping. */ |
#define CST4MAP (1 << 16) |
/* Instruction shouldn't allow 'sp' usage. */ |
#define NO_SP (1 << 17) |
/* Instruction shouldn't allow to push a register which is used as a rptr. */ |
#define NO_RPTR (1 << 18) |
/* Maximum operands per instruction. */ |
#define MAX_OPERANDS 5 |
/* Maximum register name length. */ |
#define MAX_REGNAME_LEN 10 |
/* Maximum instruction length. */ |
#define MAX_INST_LEN 256 |
/* Values defined for the flags field of a struct operand_entry. */ |
/* Operand must be an unsigned number. */ |
#define OP_UNSIGNED (1 << 0) |
/* Operand must be a signed number. */ |
#define OP_SIGNED (1 << 1) |
/* A special arithmetic 4-bit constant operand. */ |
#define OP_CST4 (1 << 2) |
/* A special load/stor 4-bit unsigned displacement operand. */ |
#define OP_DISPU4 (1 << 3) |
/* Operand must be an even number. */ |
#define OP_EVEN (1 << 4) |
/* Operand is shifted right. */ |
#define OP_SHIFT (1 << 5) |
/* Operand is shifted right and decremented. */ |
#define OP_SHIFT_DEC (1 << 6) |
/* Operand has reserved escape sequences. */ |
#define OP_ESC (1 << 7) |
/* Operand is used only for the upper 64 KB (FFFF0000 to FFFFFFFF). */ |
#define OP_UPPER_64KB (1 << 8) |
/* Single operand description. */ |
typedef struct |
{ |
/* Operand type. */ |
operand_type op_type; |
/* Operand location within the opcode. */ |
unsigned int shift; |
} |
operand_desc; |
/* Instruction data structure used in instruction table. */ |
typedef struct |
{ |
/* Name. */ |
const char *mnemonic; |
/* Size (in words). */ |
unsigned int size; |
/* Constant prefix (matched by the disassembler). */ |
unsigned long match; |
/* Match size (in bits). */ |
int match_bits; |
/* Attributes. */ |
unsigned int flags; |
/* Operands (always last, so unreferenced operands are initialized). */ |
operand_desc operands[MAX_OPERANDS]; |
} |
inst; |
/* Data structure for a single instruction's arguments (Operands). */ |
typedef struct |
{ |
/* Register or base register. */ |
reg r; |
/* Index register. */ |
reg i_r; |
/* Coprocessor register. */ |
copreg cr; |
/* Constant/immediate/absolute value. */ |
long constant; |
/* Scaled index mode. */ |
unsigned int scale; |
/* Argument type. */ |
argtype type; |
/* Size of the argument (in bits) required to represent. */ |
int size; |
/* The type of the expression. */ |
unsigned char X_op; |
} |
argument; |
/* Internal structure to hold the various entities |
corresponding to the current assembling instruction. */ |
typedef struct |
{ |
/* Number of arguments. */ |
int nargs; |
/* The argument data structure for storing args (operands). */ |
argument arg[MAX_OPERANDS]; |
/* The following fields are required only by CRX-assembler. */ |
#ifdef TC_CRX |
/* Expression used for setting the fixups (if any). */ |
expressionS exp; |
bfd_reloc_code_real_type rtype; |
#endif /* TC_CRX */ |
/* Instruction size (in bytes). */ |
int size; |
} |
ins; |
/* Structure to hold information about predefined operands. */ |
typedef struct |
{ |
/* Size (in bits). */ |
unsigned int bit_size; |
/* Argument type. */ |
argtype arg_type; |
/* One bit syntax flags. */ |
int flags; |
} |
operand_entry; |
/* Structure to hold trap handler information. */ |
typedef struct |
{ |
/* Trap name. */ |
char *name; |
/* Index in dispatch table. */ |
unsigned int entry; |
} |
trap_entry; |
/* Structure to hold information about predefined registers. */ |
typedef struct |
{ |
/* Name (string representation). */ |
char *name; |
/* Value (enum representation). */ |
union |
{ |
/* Register. */ |
reg reg_val; |
/* Coprocessor register. */ |
copreg copreg_val; |
} value; |
/* Register image. */ |
int image; |
/* Register type. */ |
reg_type type; |
} |
reg_entry; |
/* Structure to hold a cst4 operand mapping. */ |
/* CRX opcode table. */ |
extern const inst crx_instruction[]; |
extern const int crx_num_opcodes; |
#define NUMOPCODES crx_num_opcodes |
/* CRX operands table. */ |
extern const operand_entry crx_optab[]; |
/* CRX registers table. */ |
extern const reg_entry crx_regtab[]; |
extern const int crx_num_regs; |
#define NUMREGS crx_num_regs |
/* CRX coprocessor registers table. */ |
extern const reg_entry crx_copregtab[]; |
extern const int crx_num_copregs; |
#define NUMCOPREGS crx_num_copregs |
/* CRX trap/interrupt table. */ |
extern const trap_entry crx_traps[]; |
extern const int crx_num_traps; |
#define NUMTRAPS crx_num_traps |
/* cst4 operand mapping. */ |
extern const int cst4_map[]; |
extern const int cst4_maps; |
/* Table of instructions with no operands. */ |
extern const char* no_op_insn[]; |
/* Current instruction we're assembling. */ |
extern const inst *instruction; |
/* A macro for representing the instruction "constant" opcode, that is, |
the FIXED part of the instruction. The "constant" opcode is represented |
as a 32-bit unsigned long, where OPC is expanded (by a left SHIFT) |
over that range. */ |
#define BIN(OPC,SHIFT) (OPC << SHIFT) |
/* Is the current instruction type is TYPE ? */ |
#define IS_INSN_TYPE(TYPE) \ |
(CRX_INS_TYPE(instruction->flags) == TYPE) |
/* Is the current instruction mnemonic is MNEMONIC ? */ |
#define IS_INSN_MNEMONIC(MNEMONIC) \ |
(strcmp(instruction->mnemonic,MNEMONIC) == 0) |
/* Does the current instruction has register list ? */ |
#define INST_HAS_REG_LIST \ |
(instruction->flags & REG_LIST) |
/* Long long type handling. */ |
/* Replace all appearances of 'long long int' with LONGLONG. */ |
typedef long long int LONGLONG; |
typedef unsigned long long ULONGLONG; |
#endif /* _CRX_H_ */ |
/contrib/toolchain/binutils/include/opcode/d10v.h |
---|
0,0 → 1,209 |
/* d10v.h -- Header file for D10V opcode table |
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2010 |
Free Software Foundation, Inc. |
Written by Martin Hunt (hunt@cygnus.com), Cygnus Support |
This file is part of GDB, GAS, and the GNU binutils. |
GDB, GAS, and the GNU binutils are free software; you can redistribute |
them and/or modify them under the terms of the GNU General Public |
License as published by the Free Software Foundation; either version 3, |
or (at your option) any later version. |
GDB, GAS, and the GNU binutils are distributed in the hope that they |
will be useful, but WITHOUT ANY WARRANTY; without even the implied |
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See |
the GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this file; see the file COPYING3. If not, write to the Free |
Software Foundation, 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef D10V_H |
#define D10V_H |
/* Format Specifier */ |
#define FM00 0 |
#define FM01 0x40000000 |
#define FM10 0x80000000 |
#define FM11 0xC0000000 |
#define NOP 0x5e00 |
#define OPCODE_DIVS 0x14002800 |
/* The opcode table is an array of struct d10v_opcode. */ |
struct d10v_opcode |
{ |
/* The opcode name. */ |
const char *name; |
/* the opcode format */ |
int format; |
/* These numbers were picked so we can do if( i & SHORT_OPCODE) */ |
#define SHORT_OPCODE 1 |
#define LONG_OPCODE 8 |
#define SHORT_2 1 /* short with 2 operands */ |
#define SHORT_B 3 /* short with 8-bit branch */ |
#define LONG_B 8 /* long with 16-bit branch */ |
#define LONG_L 10 /* long with 3 operands */ |
#define LONG_R 12 /* reserved */ |
/* just a placeholder for variable-length instructions */ |
/* for example, "bra" will be a fake for "bra.s" and bra.l" */ |
/* which will immediately follow in the opcode table. */ |
#define OPCODE_FAKE 32 |
/* the number of cycles */ |
int cycles; |
/* the execution unit(s) used */ |
int unit; |
#define EITHER 0 |
#define IU 1 |
#define MU 2 |
#define BOTH 3 |
/* execution type; parallel or sequential */ |
/* this field is used to decide if two instructions */ |
/* can be executed in parallel */ |
int exec_type; |
#define PARONLY 1 /* parallel only */ |
#define SEQ 2 /* must be sequential */ |
#define PAR 4 /* may be parallel */ |
#define BRANCH_LINK 8 /* subroutine call. must be aligned */ |
#define RMEM 16 /* reads memory */ |
#define WMEM 32 /* writes memory */ |
#define RF0 64 /* reads f0 */ |
#define WF0 128 /* modifies f0 */ |
#define WCAR 256 /* write Carry */ |
#define BRANCH 512 /* branch, no link */ |
#define ALONE 1024 /* short but pack with a NOP if on asm line alone */ |
/* the opcode */ |
long opcode; |
/* mask. if( (i & mask) == opcode ) then match */ |
long mask; |
/* An array of operand codes. Each code is an index into the |
operand table. They appear in the order which the operands must |
appear in assembly code, and are terminated by a zero. */ |
unsigned char operands[6]; |
}; |
/* The table itself is sorted by major opcode number, and is otherwise |
in the order in which the disassembler should consider |
instructions. */ |
extern const struct d10v_opcode d10v_opcodes[]; |
extern const int d10v_num_opcodes; |
/* The operands table is an array of struct d10v_operand. */ |
struct d10v_operand |
{ |
/* The number of bits in the operand. */ |
int bits; |
/* How far the operand is left shifted in the instruction. */ |
int shift; |
/* One bit syntax flags. */ |
int flags; |
}; |
/* Elements in the table are retrieved by indexing with values from |
the operands field of the d10v_opcodes table. */ |
extern const struct d10v_operand d10v_operands[]; |
/* Values defined for the flags field of a struct d10v_operand. */ |
/* the operand must be an even number */ |
#define OPERAND_EVEN (1) |
/* the operand must be an odd number */ |
#define OPERAND_ODD (2) |
/* this is the destination register; it will be modified */ |
/* this is used by the optimizer */ |
#define OPERAND_DEST (4) |
/* number or symbol */ |
#define OPERAND_NUM (8) |
/* address or label */ |
#define OPERAND_ADDR (0x10) |
/* register */ |
#define OPERAND_REG (0x20) |
/* postincrement + */ |
#define OPERAND_PLUS (0x40) |
/* postdecrement - */ |
#define OPERAND_MINUS (0x80) |
/* @ */ |
#define OPERAND_ATSIGN (0x100) |
/* @( */ |
#define OPERAND_ATPAR (0x200) |
/* accumulator 0 */ |
#define OPERAND_ACC0 (0x400) |
/* accumulator 1 */ |
#define OPERAND_ACC1 (0x800) |
/* f0 / f1 flag register */ |
#define OPERAND_FFLAG (0x1000) |
/* c flag register */ |
#define OPERAND_CFLAG (0x2000) |
/* control register */ |
#define OPERAND_CONTROL (0x4000) |
/* predecrement mode '@-sp' */ |
#define OPERAND_ATMINUS (0x8000) |
/* signed number */ |
#define OPERAND_SIGNED (0x10000) |
/* special accumulator shifts need a 4-bit number */ |
/* 1 <= x <= 16 */ |
#define OPERAND_SHIFT (0x20000) |
/* general purpose register */ |
#define OPERAND_GPR (0x40000) |
/* special imm3 values with range restricted to -2 <= imm3 <= 3 */ |
/* needed for rac/rachi */ |
#define RESTRICTED_NUM3 (0x80000) |
/* Pre-decrement is only supported for SP. */ |
#define OPERAND_SP (0x100000) |
/* Post-decrement is not supported for SP. Like OPERAND_EVEN, and |
unlike OPERAND_SP, this flag doesn't prevent the instruction from |
matching, it only fails validation later on. */ |
#define OPERAND_NOSP (0x200000) |
/* Structure to hold information about predefined registers. */ |
struct pd_reg |
{ |
char *name; /* name to recognize */ |
char *pname; /* name to print for this register */ |
int value; |
}; |
extern const struct pd_reg d10v_predefined_registers[]; |
int d10v_reg_name_cnt (void); |
/* an expressionS only has one register type, so we fake it */ |
/* by setting high bits to indicate type */ |
#define REGISTER_MASK 0xFF |
#endif /* D10V_H */ |
/contrib/toolchain/binutils/include/opcode/d30v.h |
---|
0,0 → 1,288 |
/* d30v.h -- Header file for D30V opcode table |
Copyright 1997, 1998, 1999, 2000, 2001, 2003, 2010 |
Free Software Foundation, Inc. |
Written by Martin Hunt (hunt@cygnus.com), Cygnus Solutions |
This file is part of GDB, GAS, and the GNU binutils. |
GDB, GAS, and the GNU binutils are free software; you can redistribute |
them and/or modify them under the terms of the GNU General Public |
License as published by the Free Software Foundation; either version 3, |
or (at your option) any later version. |
GDB, GAS, and the GNU binutils are distributed in the hope that they |
will be useful, but WITHOUT ANY WARRANTY; without even the implied |
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See |
the GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this file; see the file COPYING3. If not, write to the Free |
Software Foundation, 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef D30V_H |
#define D30V_H |
#define NOP 0x00F00000 |
/* Structure to hold information about predefined registers. */ |
struct pd_reg |
{ |
char *name; /* name to recognize */ |
char *pname; /* name to print for this register */ |
int value; |
}; |
extern const struct pd_reg pre_defined_registers[]; |
int reg_name_cnt (void); |
/* the number of control registers */ |
#define MAX_CONTROL_REG 64 |
/* define the format specifiers */ |
#define FM00 0 |
#define FM01 0x80000000 |
#define FM10 0x8000000000000000LL |
#define FM11 0x8000000080000000LL |
/* define the opcode classes */ |
#define BRA 0 |
#define LOGIC 1 |
#define IMEM 2 |
#define IALU1 4 |
#define IALU2 5 |
/* define the execution condition codes */ |
#define ECC_AL 0 /* ALways (default) */ |
#define ECC_TX 1 /* F0=True, F1=Don't care */ |
#define ECC_FX 2 /* F0=False, F1=Don't care */ |
#define ECC_XT 3 /* F0=Don't care, F1=True */ |
#define ECC_XF 4 /* F0=Don't care, F1=False */ |
#define ECC_TT 5 /* F0=True, F1=True */ |
#define ECC_TF 6 /* F0=True, F1=False */ |
#define ECC_RESERVED 7 /* reserved */ |
#define ECC_MAX ECC_RESERVED |
extern const char *d30v_ecc_names[]; |
/* condition code table for CMP and CMPU */ |
extern const char *d30v_cc_names[]; |
/* The opcode table is an array of struct d30v_opcode. */ |
struct d30v_opcode |
{ |
/* The opcode name. */ |
const char *name; |
/* the opcode */ |
int op1; /* first part, "IALU1" for example */ |
int op2; /* the rest of the opcode */ |
/* opcode format(s). These numbers correspond to entries */ |
/* in the d30v_format_table */ |
unsigned char format[4]; |
#define SHORT_M 1 |
#define SHORT_M2 5 /* for ld2w and st2w */ |
#define SHORT_A 9 |
#define SHORT_B1 11 |
#define SHORT_B2 12 |
#define SHORT_B2r 13 |
#define SHORT_B3 14 |
#define SHORT_B3r 16 |
#define SHORT_B3b 18 |
#define SHORT_B3br 20 |
#define SHORT_D1r 22 |
#define SHORT_D2 24 |
#define SHORT_D2r 26 |
#define SHORT_D2Br 28 |
#define SHORT_U 30 /* unary SHORT_A. ABS for example */ |
#define SHORT_F 31 /* SHORT_A with flag registers */ |
#define SHORT_AF 33 /* SHORT_A with only the first register a flag register */ |
#define SHORT_T 35 /* for trap instruction */ |
#define SHORT_A5 36 /* SHORT_A with a 5-bit immediate instead of 6 */ |
#define SHORT_CMP 38 /* special form for CMPcc */ |
#define SHORT_CMPU 40 /* special form for CMPUcc */ |
#define SHORT_A1 42 /* special form of SHORT_A for MACa opcodes where a=1 */ |
#define SHORT_AA 44 /* SHORT_A with the first register an accumulator */ |
#define SHORT_RA 46 /* SHORT_A with the second register an accumulator */ |
#define SHORT_MODINC 48 |
#define SHORT_MODDEC 49 |
#define SHORT_C1 50 |
#define SHORT_C2 51 |
#define SHORT_UF 52 |
#define SHORT_A2 53 |
#define SHORT_NONE 55 /* no operands */ |
#define SHORT_AR 56 /* like SHORT_AA but only accept register as third parameter */ |
#define LONG 57 |
#define LONG_U 58 /* unary LONG */ |
#define LONG_Ur 59 /* LONG pc-relative */ |
#define LONG_CMP 60 /* special form for CMPcc and CMPUcc */ |
#define LONG_M 61 /* Memory long for ldb, stb */ |
#define LONG_M2 62 /* Memory long for ld2w, st2w */ |
#define LONG_2 63 /* LONG with 2 operands; jmptnz */ |
#define LONG_2r 64 /* LONG with 2 operands; bratnz */ |
#define LONG_2b 65 /* LONG_2 with modifier of 3 */ |
#define LONG_2br 66 /* LONG_2r with modifier of 3 */ |
#define LONG_D 67 /* for DJMPI */ |
#define LONG_Dr 68 /* for DBRAI */ |
#define LONG_Dbr 69 /* for repeati */ |
/* the execution unit(s) used */ |
int unit; |
#define EITHER 0 |
#define IU 1 |
#define MU 2 |
#define EITHER_BUT_PREFER_MU 3 |
/* this field is used to decide if two instructions */ |
/* can be executed in parallel */ |
long flags_used; |
long flags_set; |
#define FLAG_0 (1L<<0) |
#define FLAG_1 (1L<<1) |
#define FLAG_2 (1L<<2) |
#define FLAG_3 (1L<<3) |
#define FLAG_4 (1L<<4) /* S (saturation) */ |
#define FLAG_5 (1L<<5) /* V (overflow) */ |
#define FLAG_6 (1L<<6) /* VA (accumulated overflow) */ |
#define FLAG_7 (1L<<7) /* C (carry/borrow) */ |
#define FLAG_SM (1L<<8) /* SM (stack mode) */ |
#define FLAG_RP (1L<<9) /* RP (repeat enable) */ |
#define FLAG_CONTROL (1L<<10) /* control registers */ |
#define FLAG_A0 (1L<<11) /* A0 */ |
#define FLAG_A1 (1L<<12) /* A1 */ |
#define FLAG_JMP (1L<<13) /* instruction is a branch */ |
#define FLAG_JSR (1L<<14) /* subroutine call. must be aligned */ |
#define FLAG_MEM (1L<<15) /* reads/writes memory */ |
#define FLAG_NOT_WITH_ADDSUBppp (1L<<16) /* Old meaning: a 2 word 4 byter operation |
New meaning: operation cannot be |
combined in parallel with ADD/SUBppp. */ |
#define FLAG_MUL16 (1L<<17) /* 16 bit multiply */ |
#define FLAG_MUL32 (1L<<18) /* 32 bit multiply */ |
#define FLAG_ADDSUBppp (1L<<19) /* ADDppp or SUBppp */ |
#define FLAG_DELAY (1L<<20) /* This is a delayed branch or jump */ |
#define FLAG_LKR (1L<<21) /* insn in left slot kills right slot */ |
#define FLAG_CVVA (FLAG_5|FLAG_6|FLAG_7) |
#define FLAG_C FLAG_7 |
#define FLAG_ALL (FLAG_0 | \ |
FLAG_1 | \ |
FLAG_2 | \ |
FLAG_3 | \ |
FLAG_4 | \ |
FLAG_5 | \ |
FLAG_6 | \ |
FLAG_7 | \ |
FLAG_SM | \ |
FLAG_RP | \ |
FLAG_CONTROL) |
int reloc_flag; |
#define RELOC_PCREL 1 |
#define RELOC_ABS 2 |
}; |
extern const struct d30v_opcode d30v_opcode_table[]; |
extern const int d30v_num_opcodes; |
/* The operands table is an array of struct d30v_operand. */ |
struct d30v_operand |
{ |
/* the length of the field */ |
int length; |
/* The number of significant bits in the operand. */ |
int bits; |
/* position relative to Ra */ |
int position; |
/* syntax flags. */ |
long flags; |
}; |
extern const struct d30v_operand d30v_operand_table[]; |
/* Values defined for the flags field of a struct d30v_operand. */ |
/* this is the destination register; it will be modified */ |
/* this is used by the optimizer */ |
#define OPERAND_DEST (1) |
/* number or symbol */ |
#define OPERAND_NUM (2) |
/* address or label */ |
#define OPERAND_ADDR (4) |
/* register */ |
#define OPERAND_REG (8) |
/* postincrement + */ |
#define OPERAND_PLUS (0x10) |
/* postdecrement - */ |
#define OPERAND_MINUS (0x20) |
/* signed number */ |
#define OPERAND_SIGNED (0x40) |
/* this operand must be shifted left by 3 */ |
#define OPERAND_SHIFT (0x80) |
/* flag register */ |
#define OPERAND_FLAG (0x100) |
/* control register */ |
#define OPERAND_CONTROL (0x200) |
/* accumulator */ |
#define OPERAND_ACC (0x400) |
/* @ */ |
#define OPERAND_ATSIGN (0x800) |
/* @( */ |
#define OPERAND_ATPAR (0x1000) |
/* predecrement mode '@-sp' */ |
#define OPERAND_ATMINUS (0x2000) |
/* this operand changes the instruction name */ |
/* for example, CPMcc, CMPUcc */ |
#define OPERAND_NAME (0x4000) |
/* fake operand for mvtsys and mvfsys */ |
#define OPERAND_SPECIAL (0x8000) |
/* let the optimizer know that two registers are affected */ |
#define OPERAND_2REG (0x10000) |
/* This operand is pc-relative. Note that repeati can have two immediate |
operands, one of which is pcrel, the other (the IMM6U one) is not. */ |
#define OPERAND_PCREL (0x20000) |
/* The format table is an array of struct d30v_format. */ |
struct d30v_format |
{ |
int form; /* SHORT_A, LONG, etc */ |
int modifier; /* two bit modifier following opcode */ |
unsigned char operands[5]; |
}; |
extern const struct d30v_format d30v_format_table[]; |
/* an instruction is defined by an opcode and a format */ |
/* for example, "add" has one opcode, but three different */ |
/* formats, 2 SHORT_A forms and a LONG form. */ |
struct d30v_insn |
{ |
struct d30v_opcode *op; /* pointer to an entry in the opcode table */ |
struct d30v_format *form; /* pointer to an entry in the format table */ |
int ecc; /* execution condition code */ |
}; |
/* an expressionS only has one register type, so we fake it */ |
/* by setting high bits to indicate type */ |
#define REGISTER_MASK 0xFF |
#endif /* D30V_H */ |
/contrib/toolchain/binutils/include/opcode/dlx.h |
---|
0,0 → 1,283 |
/* Table of opcodes for the DLX microprocess. |
Copyright 2002, 2010 Free Software Foundation, Inc. |
This file is part of GDB and GAS. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. |
Initially created by Kuang Hwa Lin, 2002. */ |
/* Following are the function codes for the Special OP (ALU). */ |
#define ALUOP 0x00000000 |
#define SPECIALOP 0x00000000 |
#define NOPF 0x00000000 |
#define SLLF 0x00000004 |
#define SRLF 0x00000006 |
#define SRAF 0x00000007 |
#define SEQUF 0x00000010 |
#define SNEUF 0x00000011 |
#define SLTUF 0x00000012 |
#define SGTUF 0x00000013 |
#define SLEUF 0x00000014 |
#define SGEUF 0x00000015 |
#define ADDF 0x00000020 |
#define ADDUF 0x00000021 |
#define SUBF 0x00000022 |
#define SUBUF 0x00000023 |
#define ANDF 0x00000024 |
#define ORF 0x00000025 |
#define XORF 0x00000026 |
#define SEQF 0x00000028 |
#define SNEF 0x00000029 |
#define SLTF 0x0000002A |
#define SGTF 0x0000002B |
#define SLEF 0x0000002C |
#define SGEF 0x0000002D |
/* Following special functions was not mentioned in the |
Hennessy's book but was implemented in the RTL. */ |
#define MVTSF 0x00000030 |
#define MVFSF 0x00000031 |
#define BSWAPF 0x00000032 |
#define LUTF 0x00000033 |
/* Following special functions was mentioned in the |
Hennessy's book but was not implemented in the RTL. */ |
#define MULTF 0x00000005 |
#define MULTUF 0x00000006 |
#define DIVF 0x00000007 |
#define DIVUF 0x00000008 |
/* Following are the rest of the OPcodes: |
JOP = (0x002 << 26), JALOP = (0x003 << 26), BEQOP = (0x004 << 26), BNEOP = (0x005 << 26) |
ADDIOP = (0x008 << 26), ADDUIOP= (0x009 << 26), SUBIOP = (0x00A << 26), SUBUIOP= (0x00B << 26) |
ANDIOP = (0x00C << 26), ORIOP = (0x00D << 26), XORIOP = (0x00E << 26), LHIOP = (0x00F << 26) |
RFEOP = (0x010 << 26), TRAPOP = (0x011 << 26), JROP = (0x012 << 26), JALROP = (0x013 << 26) |
BREAKOP= (0x014 << 26) |
SEQIOP = (0x018 << 26), SNEIOP = (0x019 << 26), SLTIOP = (0x01A << 26), SGTIOP = (0x01B << 26) |
SLEIOP = (0x01C << 26), SGEIOP = (0x01D << 26) |
LBOP = (0x020 << 26), LHOP = (0x021 << 26), LWOP = (0x023 << 26), LBUOP = (0x024 << 26) |
LHUOP = (0x025 << 26), SBOP = (0x028 << 26), SHOP = (0x029 << 26), SWOP = (0x02B << 26) |
LSBUOP = (0x026 << 26), LSHU = (0x027 << 26), LSW = (0x02C << 26), |
SEQUIOP= (0x030 << 26), SNEUIOP= (0x031 << 26), SLTUIOP= (0x032 << 26), SGTUIOP= (0x033 << 26) |
SLEUIOP= (0x034 << 26), SGEUIOP= (0x035 << 26) |
SLLIOP = (0x036 << 26), SRLIOP = (0x037 << 26), SRAIOP = (0x038 << 26). */ |
#define JOP 0x08000000 |
#define JALOP 0x0c000000 |
#define BEQOP 0x10000000 |
#define BNEOP 0x14000000 |
#define ADDIOP 0x20000000 |
#define ADDUIOP 0x24000000 |
#define SUBIOP 0x28000000 |
#define SUBUIOP 0x2c000000 |
#define ANDIOP 0x30000000 |
#define ORIOP 0x34000000 |
#define XORIOP 0x38000000 |
#define LHIOP 0x3c000000 |
#define RFEOP 0x40000000 |
#define TRAPOP 0x44000000 |
#define JROP 0x48000000 |
#define JALROP 0x4c000000 |
#define BREAKOP 0x50000000 |
#define SEQIOP 0x60000000 |
#define SNEIOP 0x64000000 |
#define SLTIOP 0x68000000 |
#define SGTIOP 0x6c000000 |
#define SLEIOP 0x70000000 |
#define SGEIOP 0x74000000 |
#define LBOP 0x80000000 |
#define LHOP 0x84000000 |
#define LWOP 0x8c000000 |
#define LBUOP 0x90000000 |
#define LHUOP 0x94000000 |
#define LDSTBU |
#define LDSTHU |
#define SBOP 0xa0000000 |
#define SHOP 0xa4000000 |
#define SWOP 0xac000000 |
#define LDST |
#define SEQUIOP 0xc0000000 |
#define SNEUIOP 0xc4000000 |
#define SLTUIOP 0xc8000000 |
#define SGTUIOP 0xcc000000 |
#define SLEUIOP 0xd0000000 |
#define SGEUIOP 0xd4000000 |
#define SLLIOP 0xd8000000 |
#define SRLIOP 0xdc000000 |
#define SRAIOP 0xe0000000 |
/* Following 3 ops was added to provide the MP atonmic operation. */ |
#define LSBUOP 0x98000000 |
#define LSHUOP 0x9c000000 |
#define LSWOP 0xb0000000 |
/* Following opcode was defined in the Hennessy's book as |
"normal" opcode but was implemented in the RTL as special |
functions. */ |
#if 0 |
#define MVTSOP 0x50000000 |
#define MVFSOP 0x54000000 |
#endif |
struct dlx_opcode |
{ |
/* Name of the instruction. */ |
char *name; |
/* Opcode word. */ |
unsigned long opcode; |
/* A string of characters which describe the operands. |
Valid characters are: |
, Itself. The character appears in the assembly code. |
a rs1 The register number is in bits 21-25 of the instruction. |
b rs2/rd The register number is in bits 16-20 of the instruction. |
c rd. The register number is in bits 11-15 of the instruction. |
f FUNC bits 0-10 of the instruction. |
i An immediate operand is in bits 0-16 of the instruction. 0 extended |
I An immediate operand is in bits 0-16 of the instruction. sign extended |
d An 16 bit PC relative displacement. |
D An immediate operand is in bits 0-25 of the instruction. |
N No opperands needed, for nops. |
P it can be a register or a 16 bit operand. */ |
char *args; |
}; |
static const struct dlx_opcode dlx_opcodes[] = |
{ |
/* Arithmetic and Logic R-TYPE instructions. */ |
{ "nop", (ALUOP|NOPF), "N" }, /* NOP */ |
{ "add", (ALUOP|ADDF), "c,a,b" }, /* Add */ |
{ "addu", (ALUOP|ADDUF), "c,a,b" }, /* Add Unsigned */ |
{ "sub", (ALUOP|SUBF), "c,a,b" }, /* SUB */ |
{ "subu", (ALUOP|SUBUF), "c,a,b" }, /* Sub Unsigned */ |
{ "mult", (ALUOP|MULTF), "c,a,b" }, /* MULTIPLY */ |
{ "multu", (ALUOP|MULTUF), "c,a,b" }, /* MULTIPLY Unsigned */ |
{ "div", (ALUOP|DIVF), "c,a,b" }, /* DIVIDE */ |
{ "divu", (ALUOP|DIVUF), "c,a,b" }, /* DIVIDE Unsigned */ |
{ "and", (ALUOP|ANDF), "c,a,b" }, /* AND */ |
{ "or", (ALUOP|ORF), "c,a,b" }, /* OR */ |
{ "xor", (ALUOP|XORF), "c,a,b" }, /* Exclusive OR */ |
{ "sll", (ALUOP|SLLF), "c,a,b" }, /* SHIFT LEFT LOGICAL */ |
{ "sra", (ALUOP|SRAF), "c,a,b" }, /* SHIFT RIGHT ARITHMETIC */ |
{ "srl", (ALUOP|SRLF), "c,a,b" }, /* SHIFT RIGHT LOGICAL */ |
{ "seq", (ALUOP|SEQF), "c,a,b" }, /* Set if equal */ |
{ "sne", (ALUOP|SNEF), "c,a,b" }, /* Set if not equal */ |
{ "slt", (ALUOP|SLTF), "c,a,b" }, /* Set if less */ |
{ "sgt", (ALUOP|SGTF), "c,a,b" }, /* Set if greater */ |
{ "sle", (ALUOP|SLEF), "c,a,b" }, /* Set if less or equal */ |
{ "sge", (ALUOP|SGEF), "c,a,b" }, /* Set if greater or equal */ |
{ "sequ", (ALUOP|SEQUF), "c,a,b" }, /* Set if equal unsigned */ |
{ "sneu", (ALUOP|SNEUF), "c,a,b" }, /* Set if not equal unsigned */ |
{ "sltu", (ALUOP|SLTUF), "c,a,b" }, /* Set if less unsigned */ |
{ "sgtu", (ALUOP|SGTUF), "c,a,b" }, /* Set if greater unsigned */ |
{ "sleu", (ALUOP|SLEUF), "c,a,b" }, /* Set if less or equal unsigned*/ |
{ "sgeu", (ALUOP|SGEUF), "c,a,b" }, /* Set if greater or equal */ |
{ "mvts", (ALUOP|MVTSF), "c,a" }, /* Move to special register */ |
{ "mvfs", (ALUOP|MVFSF), "c,a" }, /* Move from special register */ |
{ "bswap", (ALUOP|BSWAPF), "c,a,b" }, /* ??? Was not documented */ |
{ "lut", (ALUOP|LUTF), "c,a,b" }, /* ????? same as above */ |
/* Arithmetic and Logical Immediate I-TYPE instructions. */ |
{ "addi", ADDIOP, "b,a,I" }, /* Add Immediate */ |
{ "addui", ADDUIOP, "b,a,i" }, /* Add Usigned Immediate */ |
{ "subi", SUBIOP, "b,a,I" }, /* Sub Immediate */ |
{ "subui", SUBUIOP, "b,a,i" }, /* Sub Unsigned Immedated */ |
{ "andi", ANDIOP, "b,a,i" }, /* AND Immediate */ |
{ "ori", ORIOP, "b,a,i" }, /* OR Immediate */ |
{ "xori", XORIOP, "b,a,i" }, /* Exclusive OR Immediate */ |
{ "slli", SLLIOP, "b,a,i" }, /* SHIFT LEFT LOCICAL Immediate */ |
{ "srai", SRAIOP, "b,a,i" }, /* SHIFT RIGHT ARITH. Immediate */ |
{ "srli", SRLIOP, "b,a,i" }, /* SHIFT RIGHT LOGICAL Immediate*/ |
{ "seqi", SEQIOP, "b,a,i" }, /* Set if equal */ |
{ "snei", SNEIOP, "b,a,i" }, /* Set if not equal */ |
{ "slti", SLTIOP, "b,a,i" }, /* Set if less */ |
{ "sgti", SGTIOP, "b,a,i" }, /* Set if greater */ |
{ "slei", SLEIOP, "b,a,i" }, /* Set if less or equal */ |
{ "sgei", SGEIOP, "b,a,i" }, /* Set if greater or equal */ |
{ "sequi", SEQUIOP, "b,a,i" }, /* Set if equal */ |
{ "sneui", SNEUIOP, "b,a,i" }, /* Set if not equal */ |
{ "sltui", SLTUIOP, "b,a,i" }, /* Set if less */ |
{ "sgtui", SGTUIOP, "b,a,i" }, /* Set if greater */ |
{ "sleui", SLEUIOP, "b,a,i" }, /* Set if less or equal */ |
{ "sgeui", SGEUIOP, "b,a,i" }, /* Set if greater or equal */ |
/* Macros for I type instructions. */ |
{ "mov", ADDIOP, "b,P" }, /* a move macro */ |
{ "movu", ADDUIOP, "b,P" }, /* a move macro, unsigned */ |
#if 0 |
/* Move special. */ |
{ "mvts", MVTSOP, "b,a" }, /* Move From Integer to Special */ |
{ "mvfs", MVFSOP, "b,a" }, /* Move From Special to Integer */ |
#endif |
/* Load high Immediate I-TYPE instruction. */ |
{ "lhi", LHIOP, "b,i" }, /* Load High Immediate */ |
{ "lui", LHIOP, "b,i" }, /* Load High Immediate */ |
{ "sethi", LHIOP, "b,i" }, /* Load High Immediate */ |
/* LOAD/STORE BYTE 8 bits I-TYPE. */ |
{ "lb", LBOP, "b,a,I" }, /* Load Byte */ |
{ "lbu", LBUOP, "b,a,I" }, /* Load Byte Unsigned */ |
{ "ldstbu", LSBUOP, "b,a,I" }, /* Load store Byte Unsigned */ |
{ "sb", SBOP, "b,a,I" }, /* Store Byte */ |
/* LOAD/STORE HALFWORD 16 bits. */ |
{ "lh", LHOP, "b,a,I" }, /* Load Halfword */ |
{ "lhu", LHUOP, "b,a,I" }, /* Load Halfword Unsigned */ |
{ "ldsthu", LSHUOP, "b,a,I" }, /* Load Store Halfword Unsigned */ |
{ "sh", SHOP, "b,a,I" }, /* Store Halfword */ |
/* LOAD/STORE WORD 32 bits. */ |
{ "lw", LWOP, "b,a,I" }, /* Load Word */ |
{ "sw", SWOP, "b,a,I" }, /* Store Word */ |
{ "ldstw", LSWOP, "b,a,I" }, /* Load Store Word */ |
/* Branch PC-relative, 16 bits offset. */ |
{ "beqz", BEQOP, "a,d" }, /* Branch if a == 0 */ |
{ "bnez", BNEOP, "a,d" }, /* Branch if a != 0 */ |
{ "beq", BEQOP, "a,d" }, /* Branch if a == 0 */ |
{ "bne", BNEOP, "a,d" }, /* Branch if a != 0 */ |
/* Jumps Trap and RFE J-TYPE. */ |
{ "j", JOP, "D" }, /* Jump, PC-relative 26 bits */ |
{ "jal", JALOP, "D" }, /* JAL, PC-relative 26 bits */ |
{ "break", BREAKOP, "D" }, /* break to OS */ |
{ "trap" , TRAPOP, "D" }, /* TRAP to OS */ |
{ "rfe", RFEOP, "N" }, /* Return From Exception */ |
/* Macros. */ |
{ "call", JOP, "D" }, /* Jump, PC-relative 26 bits */ |
/* Jumps Trap and RFE I-TYPE. */ |
{ "jr", JROP, "a" }, /* Jump Register, Abs (32 bits) */ |
{ "jalr", JALROP, "a" }, /* JALR, Abs (32 bits) */ |
/* Macros. */ |
{ "retr", JROP, "a" }, /* Jump Register, Abs (32 bits) */ |
{ "", 0x0, "" } /* Dummy entry, not included in NUM_OPCODES. |
This lets code examine entry i + 1 without |
checking if we've run off the end of the table. */ |
}; |
const unsigned int num_dlx_opcodes = (((sizeof dlx_opcodes) / (sizeof dlx_opcodes[0])) - 1); |
/contrib/toolchain/binutils/include/opcode/h8300.h |
---|
0,0 → 1,1892 |
/* Opcode table for the H8/300 |
Copyright 1991-2013 Free Software Foundation, Inc. |
Written by Steve Chamberlain <sac@cygnus.com>. |
This file is part of GDB, the GNU Debugger and GAS, the GNU Assembler. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA |
02110-1301, USA. */ |
/* Instructions are stored as a sequence of nibbles. |
If the nibble has value 15 or less than the representation is complete. |
Otherwise, we record what it contains with several flags. */ |
typedef int op_type; |
enum h8_flags |
{ |
L_2 = 0x10, |
L_3 = 0x20, |
/* 3 bit constant, zero not accepted. */ |
L_3NZ = 0x30, |
L_4 = 0x40, |
L_5 = 0x50, |
L_8 = 0x60, |
L_8U = 0x70, |
L_16 = 0x80, |
L_16U = 0x90, |
L_24 = 0xA0, |
L_32 = 0xB0, |
L_P = 0xC0, |
/* Mask to isolate the L_x size bits. */ |
SIZE = 0xF0, |
REG = 0x0100, |
ABS = 0x0200, |
MEMIND = 0x0300, |
IMM = 0x0400, |
DISP = 0x0500, |
IND = 0x0600, |
POSTINC = 0x0700, |
POSTDEC = 0x0800, |
PREINC = 0x0900, |
PREDEC = 0x0A00, |
PCREL = 0x0B00, |
KBIT = 0x0C00, |
DBIT = 0x0D00, |
CONST_2 = 0x0E00, |
CONST_4 = 0x0F00, |
CONST_8 = 0x1000, |
CONST_16 = 0x1100, |
INDEXB = 0x1200, |
INDEXW = 0x1300, |
INDEXL = 0x1400, |
PCIDXB = 0x1500, |
PCIDXW = 0x1600, |
PCIDXL = 0x1700, |
VECIND = 0x1800, |
LOWREG = 0x1900, |
DATA = 0x2000, |
/* Synonyms. */ |
INC = POSTINC, |
DEC = PREDEC, |
/* Control Registers. */ |
CCR = 0x4000, |
EXR = 0x4100, |
MACH = 0x4200, |
MACL = 0x4300, |
RESERV1 = 0x4400, |
RESERV2 = 0x4500, |
VBR = 0x4600, |
SBR = 0x4700, |
MACREG = 0x4800, |
CCR_EXR = 0x4900, |
VBR_SBR = 0x4A00, |
CC_EX_VB_SB = 0x4B00, |
RESERV3 = 0x4C00, |
RESERV4 = 0x4D00, |
RESERV5 = 0x4E00, |
RESERV6 = 0x4F00, |
/* Mask to isolate the addressing mode bits (REG .. PREDEC). */ |
MODE = 0x7F00, |
CTRL = 0x4000, |
NO_SYMBOLS = 0x8000, |
SRC = 0x10000, |
DST = 0x20000, |
OP3 = 0x40000, |
MEMRELAX = 0x80000, /* Move insn which may relax. */ |
DISPREG = 0x100000, |
IGNORE = 0x200000, |
ABSJMP = 0x400000, |
B00 = 0x800000, /* Bit 0 must be low. */ |
B01 = 0x1000000, /* Bit 0 must be high. */ |
B10 = 0x2000000, /* Bit 1 must be low. */ |
B11 = 0x4000000, /* Bit 1 must be high. */ |
B20 = 0x8000000, /* Bit 2 must be low. */ |
B21 = 0x10000000, /* Bit 2 must be high. */ |
B30 = 0x20000000, /* Bit 3 must be low. */ |
B31 = 0x40000000, /* Bit 3 must be high. */ |
E = 0x80000000, /* End of nibble sequence. */ |
/* Immediates smaller than 8 bits are always unsigned. */ |
IMM3 = IMM | L_3, |
IMM4 = IMM | L_4, |
IMM5 = IMM | L_5, |
IMM3NZ = IMM | L_3NZ, |
IMM2 = IMM | L_2, |
IMM8 = IMM | SRC | L_8, |
IMM8U = IMM | SRC | L_8U, |
IMM16 = IMM | SRC | L_16, |
IMM16U = IMM | SRC | L_16U, |
IMM32 = IMM | SRC | L_32, |
IMM3NZ_NS = IMM3NZ | NO_SYMBOLS, |
IMM4_NS = IMM4 | NO_SYMBOLS, |
IMM8U_NS = IMM8U | NO_SYMBOLS, |
IMM16U_NS = IMM16U | NO_SYMBOLS, |
RD8 = DST | L_8 | REG, |
RD16 = DST | L_16 | REG, |
RD32 = DST | L_32 | REG, |
R3_8 = OP3 | L_8 | REG, |
R3_16 = OP3 | L_16 | REG, |
R3_32 = OP3 | L_32 | REG, |
RS8 = SRC | L_8 | REG, |
RS16 = SRC | L_16 | REG, |
RS32 = SRC | L_32 | REG, |
RSP = SRC | L_P | REG, |
RDP = DST | L_P | REG, |
PCREL8 = PCREL | L_8, |
PCREL16 = PCREL | L_16, |
OP3PCREL8 = OP3 | PCREL | L_8, |
OP3PCREL16 = OP3 | PCREL | L_16, |
INDEXB16 = INDEXB | L_16, |
INDEXW16 = INDEXW | L_16, |
INDEXL16 = INDEXL | L_16, |
INDEXB16D = INDEXB | L_16 | DST, |
INDEXW16D = INDEXW | L_16 | DST, |
INDEXL16D = INDEXL | L_16 | DST, |
INDEXB32 = INDEXB | L_32, |
INDEXW32 = INDEXW | L_32, |
INDEXL32 = INDEXL | L_32, |
INDEXB32D = INDEXB | L_32 | DST, |
INDEXW32D = INDEXW | L_32 | DST, |
INDEXL32D = INDEXL | L_32 | DST, |
DISP2SRC = DISP | L_2 | SRC, |
DISP16SRC = DISP | L_16 | SRC, |
DISP32SRC = DISP | L_32 | SRC, |
DISP2DST = DISP | L_2 | DST, |
DISP16DST = DISP | L_16 | DST, |
DISP32DST = DISP | L_32 | DST, |
DSTDISPREG = DST | DISPREG, |
SRCDISPREG = SRC | DISPREG, |
ABS8SRC = SRC | ABS | L_8, |
ABS16SRC = SRC | ABS | L_16U, |
ABS24SRC = SRC | ABS | L_24, |
ABS32SRC = SRC | ABS | L_32, |
ABS8DST = DST | ABS | L_8, |
ABS16DST = DST | ABS | L_16U, |
ABS24DST = DST | ABS | L_24, |
ABS32DST = DST | ABS | L_32, |
ABS8OP3 = OP3 | ABS | L_8, |
ABS16OP3 = OP3 | ABS | L_16U, |
ABS24OP3 = OP3 | ABS | L_24, |
ABS32OP3 = OP3 | ABS | L_32, |
RDDEC = DST | DEC, |
RSINC = SRC | INC, |
RDINC = DST | INC, |
RSPOSTINC = SRC | POSTINC, |
RDPOSTINC = DST | POSTINC, |
RSPREINC = SRC | PREINC, |
RDPREINC = DST | PREINC, |
RSPOSTDEC = SRC | POSTDEC, |
RDPOSTDEC = DST | POSTDEC, |
RSPREDEC = SRC | PREDEC, |
RDPREDEC = DST | PREDEC, |
RSIND = SRC | IND, |
RDIND = DST | IND, |
R3_IND = OP3 | IND, |
#define MS32 (SRC | L_32 | MACREG) |
#define MD32 (DST | L_32 | MACREG) |
#if 1 |
OR8 = RS8, /* ??? OR as in One Register. */ |
OR16 = RS16, |
OR32 = RS32, |
#else |
OR8 = RD8, |
OR16 = RD16, |
OR32 = RD32 |
#endif |
}; |
enum ctrlreg |
{ |
C_CCR = 0, |
C_EXR = 1, |
C_MACH = 2, |
C_MACL = 3, |
C_VBR = 6, |
C_SBR = 7 |
}; |
enum {MAX_CODE_NIBBLES = 33}; |
struct code |
{ |
op_type nib[MAX_CODE_NIBBLES]; |
}; |
struct arg |
{ |
op_type nib[3]; |
}; |
/* Availability of instructions on processor models. */ |
enum h8_model |
{ |
AV_H8, |
AV_H8H, |
AV_H8S, |
AV_H8SX |
}; |
struct h8_opcode |
{ |
int how; |
enum h8_model available; |
int time; |
char *name; |
struct arg args; |
struct code data; |
}; |
#ifdef DEFINE_TABLE |
#define DATA2 DATA, DATA |
#define DATA3 DATA, DATA, DATA |
#define DATA5 DATA, DATA, DATA, DATA, DATA |
#define DATA7 DATA, DATA, DATA, DATA, DATA, DATA, DATA |
#define IMM8LIST IMM8, DATA |
#define IMM16LIST IMM16, DATA3 |
#define IMM16ULIST IMM16U, DATA3 |
#define IMM24LIST IMM24, DATA5 |
#define IMM32LIST IMM32, DATA7 |
#define DISP16LIST DISP | L_16, DATA3 |
#define DISP24LIST DISP | L_24, DATA5 |
#define DISP32LIST DISP | L_32, DATA7 |
#define ABS8LIST ABS | L_8, DATA |
#define ABS16LIST ABS | L_16U, DATA3 |
#define ABS24LIST ABS | L_24, DATA5 |
#define ABS32LIST ABS | L_32, DATA7 |
#define DSTABS8LIST DST | ABS | L_8, DATA |
#define DSTABS16LIST DST | ABS | L_16U, DATA3 |
#define DSTABS24LIST DST | ABS | L_24, DATA5 |
#define DSTABS32LIST DST | ABS | L_32, DATA7 |
#define OP3ABS8LIST OP3 | ABS | L_8, DATA |
#define OP3ABS16LIST OP3 | ABS | L_16, DATA3 |
#define OP3ABS24LIST OP3 | ABS | L_24, DATA5 |
#define OP3ABS32LIST OP3 | ABS | L_32, DATA7 |
#define DSTDISP16LIST DST | DISP | L_16, DATA3 |
#define DSTDISP24LIST DST | DISP | L_24, DATA5 |
#define DSTDISP32LIST DST | DISP | L_32, DATA7 |
#define A16LIST L_16, DATA3 |
#define A24LIST L_24, DATA5 |
#define A32LIST L_32, DATA7 |
/* Extended Operand Prefixes: */ |
#define PREFIX_010 0x0, 0x1, 0x0 |
#define PREFIX_015 0x0, 0x1, 0x5 |
#define PREFIX_017 0x0, 0x1, 0x7 |
#define PREFIX_0100 0x0, 0x1, 0x0, 0x0 |
#define PREFIX_010_D2 0x0, 0x1, 0x0, B30 | B21 | DISP2SRC |
#define PREFIX_0101 0x0, 0x1, 0x0, 0x1 |
#define PREFIX_0102 0x0, 0x1, 0x0, 0x2 |
#define PREFIX_0103 0x0, 0x1, 0x0, 0x3 |
#define PREFIX_0104 0x0, 0x1, 0x0, 0x4 |
#define PREFIX_0105 0x0, 0x1, 0x0, 0x5 |
#define PREFIX_0106 0x0, 0x1, 0x0, 0x6 |
#define PREFIX_0107 0x0, 0x1, 0x0, 0x7 |
#define PREFIX_0108 0x0, 0x1, 0x0, 0x8 |
#define PREFIX_0109 0x0, 0x1, 0x0, 0x9 |
#define PREFIX_010A 0x0, 0x1, 0x0, 0xa |
#define PREFIX_010D 0x0, 0x1, 0x0, 0xd |
#define PREFIX_010E 0x0, 0x1, 0x0, 0xe |
#define PREFIX_0150 0x0, 0x1, 0x5, 0x0 |
#define PREFIX_015_D2 0x0, 0x1, 0x5, B30 | B21 | DISP2SRC |
#define PREFIX_0151 0x0, 0x1, 0x5, 0x1 |
#define PREFIX_0152 0x0, 0x1, 0x5, 0x2 |
#define PREFIX_0153 0x0, 0x1, 0x5, 0x3 |
#define PREFIX_0154 0x0, 0x1, 0x5, 0x4 |
#define PREFIX_0155 0x0, 0x1, 0x5, 0x5 |
#define PREFIX_0156 0x0, 0x1, 0x5, 0x6 |
#define PREFIX_0157 0x0, 0x1, 0x5, 0x7 |
#define PREFIX_0158 0x0, 0x1, 0x5, 0x8 |
#define PREFIX_0159 0x0, 0x1, 0x5, 0x9 |
#define PREFIX_015A 0x0, 0x1, 0x5, 0xa |
#define PREFIX_015D 0x0, 0x1, 0x5, 0xd |
#define PREFIX_015E 0x0, 0x1, 0x5, 0xe |
#define PREFIX_015F 0x0, 0x1, 0x5, 0xf |
#define PREFIX_0170 0x0, 0x1, 0x7, 0x0 |
#define PREFIX_017_D2S 0x0, 0x1, 0x7, B30 | B21 | DISP2SRC |
#define PREFIX_017_D2D 0x0, 0x1, 0x7, B30 | B21 | DISP2DST |
#define PREFIX_0171 0x0, 0x1, 0x7, 0x1 |
#define PREFIX_0172 0x0, 0x1, 0x7, 0x2 |
#define PREFIX_0173 0x0, 0x1, 0x7, 0x3 |
#define PREFIX_0174 0x0, 0x1, 0x7, 0x4 |
#define PREFIX_0175 0x0, 0x1, 0x7, 0x5 |
#define PREFIX_0176 0x0, 0x1, 0x7, 0x6 |
#define PREFIX_0177 0x0, 0x1, 0x7, 0x7 |
#define PREFIX_0178 0x0, 0x1, 0x7, 0x8 |
#define PREFIX_0179 0x0, 0x1, 0x7, 0x9 |
#define PREFIX_017A 0x0, 0x1, 0x7, 0xa |
#define PREFIX_017D 0x0, 0x1, 0x7, 0xd |
#define PREFIX_017E 0x0, 0x1, 0x7, 0xe |
#define PREFIX_017F 0x0, 0x1, 0x7, 0xf |
#define PREFIX_6A15 0x6, 0xa, 0x1, 0x5 |
#define PREFIX_6A35 0x6, 0xa, 0x3, 0x5 |
#define PREFIX_6B15 0x6, 0xb, 0x1, 0x5 |
#define PREFIX_6B35 0x6, 0xb, 0x3, 0x5 |
#define PREFIX_78R4 0x7, 0x8, B31 | DISPREG, 0x4 |
#define PREFIX_78R5 0x7, 0x8, B31 | DISPREG, 0x5 |
#define PREFIX_78R6 0x7, 0x8, B31 | DISPREG, 0x6 |
#define PREFIX_78R7 0x7, 0x8, B31 | DISPREG, 0x7 |
#define PREFIX_78R4W 0x7, 0x8, B30 | DISPREG, 0x4 |
#define PREFIX_78R5W 0x7, 0x8, B30 | DISPREG, 0x5 |
#define PREFIX_78R6W 0x7, 0x8, B30 | DISPREG, 0x6 |
#define PREFIX_78R7W 0x7, 0x8, B30 | DISPREG, 0x7 |
#define PREFIX_78R4WD 0x7, 0x8, B30 | DSTDISPREG, 0x4 |
#define PREFIX_78R5WD 0x7, 0x8, B30 | DSTDISPREG, 0x5 |
#define PREFIX_78R6WD 0x7, 0x8, B30 | DSTDISPREG, 0x6 |
#define PREFIX_78R7WD 0x7, 0x8, B30 | DSTDISPREG, 0x7 |
#define PREFIX_7974 0x7, 0x9, 0x7, 0x4 |
#define PREFIX_7A74 0x7, 0xa, 0x7, 0x4 |
#define PREFIX_7A7C 0x7, 0xa, 0x7, 0xc |
/* Source standard fragment: */ |
#define FROM_IND 0, RSIND |
#define FROM_POSTINC 8, RSPOSTINC |
#define FROM_POSTDEC 10, RSPOSTDEC |
#define FROM_PREINC 9, RSPREINC |
#define FROM_PREDEC 11, RSPREDEC |
#define FROM_DISP2 B30 | B20 | DISP2SRC, DISPREG |
#define FROM_DISP16 12, B30 | DISPREG |
#define FROM_DISP32 12, B31 | DISPREG |
#define FROM_DISP16B 13, B30 | DISPREG |
#define FROM_DISP16W 14, B30 | DISPREG |
#define FROM_DISP16L 15, B30 | DISPREG |
#define FROM_DISP32B 13, B31 | DISPREG |
#define FROM_DISP32W 14, B31 | DISPREG |
#define FROM_DISP32L 15, B31 | DISPREG |
#define FROM_ABS16 4, B30 | IGNORE |
#define FROM_ABS32 4, B31 | IGNORE |
/* Destination standard fragment: */ |
#define TO_IND 0, RDIND |
#define TO_IND_MOV 0, RDIND | B30 |
#define TO_POSTINC 8, RDPOSTINC |
#define TO_POSTINC_MOV 8, RDPOSTINC | B30 |
#define TO_POSTDEC 10, RDPOSTDEC |
#define TO_POSTDEC_MOV 10, RDPOSTDEC | B30 |
#define TO_PREINC 9, RDPREINC |
#define TO_PREINC_MOV 9, RDPREINC | B30 |
#define TO_PREDEC 11, RDPREDEC |
#define TO_PREDEC_MOV 11, RDPREDEC | B30 |
#define TO_DISP2 B30 | B20 | DISP2DST, DSTDISPREG |
#define TO_DISP2_MOV B30 | B20 | DISP2DST, DSTDISPREG | B30 |
#define TO_DISP16 12, B30 | DSTDISPREG |
#define TO_DISP32 12, B31 | DSTDISPREG |
#define TO_DISP16B 13, B30 | DSTDISPREG |
#define TO_DISP16W 14, B30 | DSTDISPREG |
#define TO_DISP16L 15, B30 | DSTDISPREG |
#define TO_DISP32B 13, B31 | DSTDISPREG |
#define TO_DISP32W 14, B31 | DSTDISPREG |
#define TO_DISP32L 15, B31 | DSTDISPREG |
#define TO_ABS16 4, B30 | IGNORE |
#define TO_ABS32 4, B31 | IGNORE |
/* Source fragment for three-word instruction: */ |
#define TFROM_IND 6, 9, B30 | RSIND, 12 |
#define TFROM_DISP2 6, 9, B30 | DISPREG, 12 |
#define TFROM_ABS16 6, 11, B30 | B20 | B10 | IGNORE, 12, ABS16LIST |
#define TFROM_ABS32 6, 11, B30 | B20 | B11 | IGNORE, 12, ABS32LIST |
#define TFROM_POSTINC 6, 13, B30 | RSPOSTINC, 12 |
#define TFROM_PREINC 6, 13, B30 | RSPREINC, 12 |
#define TFROM_POSTDEC 6, 13, B30 | RSPOSTDEC, 12 |
#define TFROM_PREDEC 6, 13, B30 | RSPREDEC, 12 |
#define TFROM_DISP16 6, 15, B30 | DISPREG, 12, DISP16LIST |
#define TFROM_DISP32 6, 11, 2, 12, DISP32LIST |
#define TFROM_DISP16B 6, 15, B30 | DISPREG, 12, DISP16LIST |
#define TFROM_DISP16W 6, 15, B30 | DISPREG, 12, DISP16LIST |
#define TFROM_DISP16L 6, 15, B30 | DISPREG, 12, DISP16LIST |
#define TFROM_DISP32B 6, 11, 2, 12, DISP32LIST |
#define TFROM_DISP32W 6, 11, 2, 12, DISP32LIST |
#define TFROM_DISP32L 6, 11, 2, 12, DISP32LIST |
#define TFROM_ABS16W 6, 11, 1, 12, ABS16LIST |
#define TFROM_ABS32W 6, 11, 3, 12, ABS32LIST |
/* Source fragment for three-word instruction: */ |
#define TFROM_IND_B 6, 8, B30 | RSIND, 12 |
#define TFROM_ABS16_B 6, 10, B30 | B20 | B10 | IGNORE, 12, ABS16LIST |
#define TFROM_ABS32_B 6, 10, B30 | B20 | B11 | IGNORE, 12, ABS32LIST |
#define TFROM_DISP2_B 6, 8, B30 | DISPREG, 12 |
#define TFROM_POSTINC_B 6, 12, B30 | RSPOSTINC, 12 |
#define TFROM_PREINC_B 6, 12, B30 | RSPREINC, 12 |
#define TFROM_POSTDEC_B 6, 12, B30 | RSPOSTDEC, 12 |
#define TFROM_PREDEC_B 6, 12, B30 | RSPREDEC, 12 |
#define TFROM_DISP16_B 6, 14, B30 | DISPREG, 12, DISP16LIST |
#define TFROM_DISP32_B 6, 10, 2, 12, DISP32LIST |
#define TFROM_DISP16B_B 6, 14, B30 | DISPREG, 12, DISP16LIST |
#define TFROM_DISP16W_B 6, 14, B30 | DISPREG, 12, DISP16LIST |
#define TFROM_DISP16L_B 6, 14, B30 | DISPREG, 12, DISP16LIST |
#define TFROM_DISP32B_B 6, 10, 2, 12, DISP32LIST |
#define TFROM_DISP32W_B 6, 10, 2, 12, DISP32LIST |
#define TFROM_DISP32L_B 6, 10, 2, 12, DISP32LIST |
#define TFROM_ABS16W_B 6, 10, 1, 12, ABS16LIST |
#define TFROM_ABS32W_B 6, 10, 3, 12, ABS32LIST |
/* Extended Operand Class Expanders: */ |
#define MOVFROM_STD(CODE, PREFIX, NAME, SRC, SRC_INFIX) \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDIND, E}}, {{PREFIX, SRC_INFIX, TO_IND_MOV, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTINC, E}}, {{PREFIX, SRC_INFIX, TO_POSTINC_MOV, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTDEC, E}}, {{PREFIX, SRC_INFIX, TO_POSTDEC_MOV, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPREINC, E}}, {{PREFIX, SRC_INFIX, TO_PREINC_MOV, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPREDEC, E}}, {{PREFIX, SRC_INFIX, TO_PREDEC_MOV, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, DISP2DST, E}}, {{PREFIX, SRC_INFIX, TO_DISP2_MOV, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, DISP16DST, E}}, {{PREFIX, SRC_INFIX, TO_DISP16, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, DISP32DST, E}}, {{PREFIX, SRC_INFIX, TO_DISP32, DSTDISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB16D, E}}, {{PREFIX, SRC_INFIX, TO_DISP16B, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW16D, E}}, {{PREFIX, SRC_INFIX, TO_DISP16W, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL16D, E}}, {{PREFIX, SRC_INFIX, TO_DISP16L, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB32D, E}}, {{PREFIX, SRC_INFIX, TO_DISP32B, DSTDISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW32D, E}}, {{PREFIX, SRC_INFIX, TO_DISP32W, DSTDISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL32D, E}}, {{PREFIX, SRC_INFIX, TO_DISP32L, DSTDISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, ABS16DST, E}}, {{PREFIX, SRC_INFIX, TO_ABS16, DSTABS16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, ABS32DST, E}}, {{PREFIX, SRC_INFIX, TO_ABS32, DSTABS32LIST, E}}} |
#define MOVFROM_AD(CODE, PREFIX, NAME, SRC, SRC_INFIX, SRC_SUFFIX) \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDIND, E}}, {{PREFIX, SRC_INFIX, TO_IND_MOV, SRC_SUFFIX, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTINC, E}}, {{PREFIX, SRC_INFIX, TO_POSTINC_MOV, SRC_SUFFIX, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTDEC, E}}, {{PREFIX, SRC_INFIX, TO_POSTDEC_MOV, SRC_SUFFIX, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPREINC, E}}, {{PREFIX, SRC_INFIX, TO_PREINC_MOV, SRC_SUFFIX, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPREDEC, E}}, {{PREFIX, SRC_INFIX, TO_PREDEC_MOV, SRC_SUFFIX, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, DISP2DST, E}}, {{PREFIX, SRC_INFIX, TO_DISP2_MOV, SRC_SUFFIX, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, DISP16DST, E}}, {{PREFIX, SRC_INFIX, TO_DISP16, SRC_SUFFIX, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, DISP32DST, E}}, {{PREFIX, SRC_INFIX, TO_DISP32, SRC_SUFFIX, DSTDISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB16D, E}}, {{PREFIX, SRC_INFIX, TO_DISP16B, SRC_SUFFIX, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW16D, E}}, {{PREFIX, SRC_INFIX, TO_DISP16W, SRC_SUFFIX, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL16D, E}}, {{PREFIX, SRC_INFIX, TO_DISP16L, SRC_SUFFIX, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB32D, E}}, {{PREFIX, SRC_INFIX, TO_DISP32B, SRC_SUFFIX, DSTDISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW32D, E}}, {{PREFIX, SRC_INFIX, TO_DISP32W, SRC_SUFFIX, DSTDISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL32D, E}}, {{PREFIX, SRC_INFIX, TO_DISP32L, SRC_SUFFIX, DSTDISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, ABS16DST, E}}, {{PREFIX, SRC_INFIX, TO_ABS16, SRC_SUFFIX, DSTABS16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, ABS32DST, E}}, {{PREFIX, SRC_INFIX, TO_ABS32, SRC_SUFFIX, DSTABS32LIST, E}}} |
#define MOVFROM_IMM8(CODE, PREFIX, NAME, SRC) \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDIND, E}}, {{PREFIX, 0, RDIND, IMM8LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTINC, E}}, {{PREFIX, 8, RDPOSTINC, IMM8LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTDEC, E}}, {{PREFIX, 10, RDPOSTDEC, IMM8LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPREINC, E}}, {{PREFIX, 9, RDPREINC, IMM8LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPREDEC, E}}, {{PREFIX, 11, RDPREDEC, IMM8LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, DISP2DST, E}}, {{PREFIX, B30 | B20 | DISP2DST, DSTDISPREG, IMM8LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, DISP16DST, E}}, {{PREFIX, 12, B30 | DSTDISPREG, IMM8LIST, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, DISP32DST, E}}, {{PREFIX, 12, B31 | DSTDISPREG, IMM8LIST, DSTDISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB16D, E}}, {{PREFIX, 13, B30 | DSTDISPREG, IMM8LIST, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW16D, E}}, {{PREFIX, 14, B30 | DSTDISPREG, IMM8LIST, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL16D, E}}, {{PREFIX, 15, B30 | DSTDISPREG, IMM8LIST, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB32D, E}}, {{PREFIX, 13, B31 | DSTDISPREG, IMM8LIST, DSTDISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW32D, E}}, {{PREFIX, 14, B31 | DSTDISPREG, IMM8LIST, DSTDISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL32D, E}}, {{PREFIX, 15, B31 | DSTDISPREG, IMM8LIST, DSTDISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, ABS16DST, E}}, {{PREFIX, 4, B30 | IGNORE, IMM8LIST, DSTABS16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, ABS32DST, E}}, {{PREFIX, 4, B31 | IGNORE, IMM8LIST, DSTABS32LIST, E}}} |
#define MOVFROM_IMM(CODE, PREFIX, NAME, SRC, LIST) \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDIND, E}}, {{PREFIX, LIST, 0, RDIND, DATA2, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTINC, E}}, {{PREFIX, LIST, 8, RDPOSTINC, DATA2, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTDEC, E}}, {{PREFIX, LIST, 10, RDPOSTDEC, DATA2, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPREINC, E}}, {{PREFIX, LIST, 9, RDPREINC, DATA2, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPREDEC, E}}, {{PREFIX, LIST, 11, RDPREDEC, DATA2, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, DISP2DST, E}}, {{PREFIX, LIST, B30 | B20 | DISP2DST, DSTDISPREG, DATA2, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, DISP16DST, E}}, {{PREFIX, LIST, 12, B30 | DSTDISPREG, DATA2, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, DISP32DST, E}}, {{PREFIX, LIST, 12, B31 | DSTDISPREG, DATA2, DSTDISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB16D, E}}, {{PREFIX, LIST, 13, B30 | DSTDISPREG, DATA2, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW16D, E}}, {{PREFIX, LIST, 14, B30 | DSTDISPREG, DATA2, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL16D, E}}, {{PREFIX, LIST, 15, B30 | DSTDISPREG, DATA2, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB32D, E}}, {{PREFIX, LIST, 13, B31 | DSTDISPREG, DATA2, DSTDISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW32D, E}}, {{PREFIX, LIST, 14, B31 | DSTDISPREG, DATA2, DSTDISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL32D, E}}, {{PREFIX, LIST, 15, B31 | DSTDISPREG, DATA2, DSTDISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, ABS16DST, E}}, {{PREFIX, LIST, 4, B30 | IGNORE, DATA2, DSTABS16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, ABS32DST, E}}, {{PREFIX, LIST, 4, B31 | IGNORE, DATA2, DSTABS32LIST, E}}} |
#define MOVFROM_REG_BW(CODE, NAME, SRC, PREFIX, OP1, OP2, OP3, OP4, RELAX16) \ |
{CODE, AV_H8, 4, NAME, {{SRC, RDIND, E}}, {{ 6, OP1, B31 | RDIND, SRC, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTINC, E}}, {{PREFIX, 3, 6, OP3, B31 | RDPOSTINC, SRC, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTDEC, E}}, {{PREFIX, 1, 6, OP3, B31 | RDPOSTDEC, SRC, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPREINC, E}}, {{PREFIX, 2, 6, OP3, B31 | RDPREINC, SRC, E}}}, \ |
{CODE, AV_H8, 6, NAME, {{SRC, RDPREDEC, E}}, {{ 6, OP3, B31 | RDPREDEC, SRC, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, DISP2DST, E}}, {{PREFIX, B30 | B20 | DISP2DST, 6, OP1, B31 | DSTDISPREG, SRC, E}}}, \ |
{CODE, AV_H8, 6, NAME, {{SRC, DISP16DST, E}}, {{ 6, OP4, B31 | DSTDISPREG, SRC, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8, 6, NAME, {{SRC, DISP32DST, E}}, {{7, 8, B30 | DSTDISPREG, 0, 6, OP2, 10, SRC, MEMRELAX | DSTDISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB16D, E}}, {{PREFIX, 1, 6, OP4, B31 | DSTDISPREG, SRC, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW16D, E}}, {{PREFIX, 2, 6, OP4, B31 | DSTDISPREG, SRC, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL16D, E}}, {{PREFIX, 3, 6, OP4, B31 | DSTDISPREG, SRC, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB32D, E}}, {{7, 8, B30 | DSTDISPREG, 1, 6, OP2, 10, SRC, DSTDISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW32D, E}}, {{7, 8, B30 | DSTDISPREG, 2, 6, OP2, 10, SRC, DSTDISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL32D, E}}, {{7, 8, B30 | DSTDISPREG, 3, 6, OP2, 10, SRC, DSTDISP32LIST, E}}}, \ |
{CODE, AV_H8, 4, NAME, {{SRC, ABS16DST, E}}, {{ 6, OP2, 8, SRC, RELAX16 | DSTABS16LIST, E}}}, \ |
{CODE, AV_H8, 6, NAME, {{SRC, ABS32DST, E}}, {{ 6, OP2, 10, SRC, MEMRELAX | DSTABS32LIST, E}}} |
#define MOVTO_REG_BW(CODE, NAME, DST, PREFIX, OP1, OP2, OP3, OP4, RELAX16) \ |
{CODE, AV_H8, 4, NAME, {{RSIND, DST, E}}, {{ 6, OP1, B30 | RSIND, DST, E}}}, \ |
{CODE, AV_H8, 6, NAME, {{RSPOSTINC, DST, E}}, {{ 6, OP3, B30 | RSPOSTINC, DST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RSPOSTDEC, DST, E}}, {{PREFIX, 2, 6, OP3, B30 | RSPOSTDEC, DST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RSPREINC, DST, E}}, {{PREFIX, 1, 6, OP3, B30 | RSPREINC, DST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RSPREDEC, DST, E}}, {{PREFIX, 3, 6, OP3, B30 | RSPREDEC, DST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{DISP2SRC, DST, E}}, {{PREFIX, B30 | B20 | DISP2SRC, 6, OP1, B30 | DISPREG, DST, E}}}, \ |
{CODE, AV_H8, 6, NAME, {{DISP16SRC, DST, E}}, {{ 6, OP4, B30 | DISPREG, DST, DISP16LIST, E}}}, \ |
{CODE, AV_H8, 6, NAME, {{DISP32SRC, DST, E}}, {{7, 8, B30 | DISPREG, 0, 6, OP2, 2, DST, MEMRELAX | DISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{INDEXB16, DST, E}}, {{PREFIX, 1, 6, OP4, B30 | DISPREG, DST, DISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{INDEXW16, DST, E}}, {{PREFIX, 2, 6, OP4, B30 | DISPREG, DST, DISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{INDEXL16, DST, E}}, {{PREFIX, 3, 6, OP4, B30 | DISPREG, DST, DISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{INDEXB32, DST, E}}, {{7, 8, B30 | DISPREG, 1, 6, OP2, 2, DST, DISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{INDEXW32, DST, E}}, {{7, 8, B30 | DISPREG, 2, 6, OP2, 2, DST, DISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{INDEXL32, DST, E}}, {{7, 8, B30 | DISPREG, 3, 6, OP2, 2, DST, DISP32LIST, E}}}, \ |
{CODE, AV_H8, 4, NAME, {{ABS16SRC, DST, E}}, {{ 6, OP2, 0, DST, RELAX16 | ABS16LIST, E}}}, \ |
{CODE, AV_H8, 6, NAME, {{ABS32SRC, DST, E}}, {{ 6, OP2, 2, DST, MEMRELAX | ABS32LIST, E}}} |
/* Expansion macros for two-word (plus data) instructions. */ |
/* Expansion from one source to "standard" destinations. */ |
#define EXPAND2_STD_SRC(CODE, WEIGHT, NAME, SRC, PREFIX, NIB1, NIB2) \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTINC, E}}, {{PREFIX, TO_POSTINC, NIB1, NIB2, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTDEC, E}}, {{PREFIX, TO_POSTDEC, NIB1, NIB2, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPREINC, E}}, {{PREFIX, TO_PREINC, NIB1, NIB2, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPREDEC, E}}, {{PREFIX, TO_PREDEC, NIB1, NIB2, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, DISP2DST, E}}, {{PREFIX, TO_DISP2, NIB1, NIB2, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, DISP16DST, E}}, {{PREFIX, TO_DISP16, NIB1, NIB2, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, DISP32DST, E}}, {{PREFIX, TO_DISP32, NIB1, NIB2, DSTDISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB16D, E}}, {{PREFIX, TO_DISP16B, NIB1, NIB2, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW16D, E}}, {{PREFIX, TO_DISP16W, NIB1, NIB2, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL16D, E}}, {{PREFIX, TO_DISP16L, NIB1, NIB2, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB32D, E}}, {{PREFIX, TO_DISP32B, NIB1, NIB2, DSTDISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW32D, E}}, {{PREFIX, TO_DISP32W, NIB1, NIB2, DSTDISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL32D, E}}, {{PREFIX, TO_DISP32L, NIB1, NIB2, DSTDISP32LIST, E}}} |
/* Expansion from one destination to "standard" sources. */ |
#define EXPAND2_STD_DST(CODE, WEIGHT, NAME, DST, PREFIX, NIB1, NIB2) \ |
{CODE, AV_H8SX, 0, NAME, {{RSPOSTINC, DST, E}}, {{PREFIX, FROM_POSTINC, NIB1, NIB2, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RSPOSTDEC, DST, E}}, {{PREFIX, FROM_POSTDEC, NIB1, NIB2, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RSPREINC, DST, E}}, {{PREFIX, FROM_PREINC, NIB1, NIB2, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RSPREDEC, DST, E}}, {{PREFIX, FROM_PREDEC, NIB1, NIB2, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{DISP2SRC, DST, E}}, {{PREFIX, FROM_DISP2, NIB1, NIB2, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{DISP16SRC, DST, E}}, {{PREFIX, FROM_DISP16, NIB1, NIB2, DISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{DISP32SRC, DST, E}}, {{PREFIX, FROM_DISP32, NIB1, NIB2, DISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{INDEXB16, DST, E}}, {{PREFIX, FROM_DISP16B, NIB1, NIB2, DISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{INDEXW16, DST, E}}, {{PREFIX, FROM_DISP16W, NIB1, NIB2, DISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{INDEXL16, DST, E}}, {{PREFIX, FROM_DISP16L, NIB1, NIB2, DISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{INDEXB32, DST, E}}, {{PREFIX, FROM_DISP32B, NIB1, NIB2, DISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{INDEXW32, DST, E}}, {{PREFIX, FROM_DISP32W, NIB1, NIB2, DISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{INDEXL32, DST, E}}, {{PREFIX, FROM_DISP32L, NIB1, NIB2, DISP32LIST, E}}} |
/* Expansion from immediate source to "standard" destinations. */ |
#define EXPAND2_STD_IMM(CODE, WEIGHT, NAME, SRC, PREFIX, OPCODE, IGN, IMMLIST) \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTINC, E}}, {{PREFIX, TO_POSTINC, OPCODE, IGN, IMMLIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTDEC, E}}, {{PREFIX, TO_POSTDEC, OPCODE, IGN, IMMLIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPREINC, E}}, {{PREFIX, TO_PREINC, OPCODE, IGN, IMMLIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPREDEC, E}}, {{PREFIX, TO_PREDEC, OPCODE, IGN, IMMLIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, DISP2DST, E}}, {{PREFIX, TO_DISP2, OPCODE, IGN, IMMLIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, DISP16DST, E}}, {{PREFIX, TO_DISP16, OPCODE, IGN, DSTDISP16LIST, IMMLIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, DISP32DST, E}}, {{PREFIX, TO_DISP32, OPCODE, IGN, DSTDISP32LIST, IMMLIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB16D, E}}, {{PREFIX, TO_DISP16B, OPCODE, IGN, DSTDISP16LIST, IMMLIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW16D, E}}, {{PREFIX, TO_DISP16W, OPCODE, IGN, DSTDISP16LIST, IMMLIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL16D, E}}, {{PREFIX, TO_DISP16L, OPCODE, IGN, DSTDISP16LIST, IMMLIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB32D, E}}, {{PREFIX, TO_DISP32B, OPCODE, IGN, DSTDISP32LIST, IMMLIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW32D, E}}, {{PREFIX, TO_DISP32W, OPCODE, IGN, DSTDISP32LIST, IMMLIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL32D, E}}, {{PREFIX, TO_DISP32L, OPCODE, IGN, DSTDISP32LIST, IMMLIST, E}}} |
/* Expansion from abs/disp source to "standard" destinations. */ |
#define EXPAND2_STD_ABSDISP(CODE, WEIGHT, NAME, SRC, PREFIX, DSTLIST, NIB1, NIB2) \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTINC, E}}, {{PREFIX, DSTLIST, TO_POSTINC, NIB1, NIB2, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTDEC, E}}, {{PREFIX, DSTLIST, TO_POSTDEC, NIB1, NIB2, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPREINC, E}}, {{PREFIX, DSTLIST, TO_PREINC, NIB1, NIB2, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPREDEC, E}}, {{PREFIX, DSTLIST, TO_PREDEC, NIB1, NIB2, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, DISP2DST, E}}, {{PREFIX, DSTLIST, TO_DISP2, NIB1, NIB2, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, DISP16DST, E}}, {{PREFIX, DSTLIST, TO_DISP16, NIB1, NIB2, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, DISP32DST, E}}, {{PREFIX, DSTLIST, TO_DISP32, NIB1, NIB2, DSTDISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB16D, E}}, {{PREFIX, DSTLIST, TO_DISP16B, NIB1, NIB2, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW16D, E}}, {{PREFIX, DSTLIST, TO_DISP16W, NIB1, NIB2, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL16D, E}}, {{PREFIX, DSTLIST, TO_DISP16L, NIB1, NIB2, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB32D, E}}, {{PREFIX, DSTLIST, TO_DISP32B, NIB1, NIB2, DSTDISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW32D, E}}, {{PREFIX, DSTLIST, TO_DISP32W, NIB1, NIB2, DSTDISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL32D, E}}, {{PREFIX, DSTLIST, TO_DISP32L, NIB1, NIB2, DSTDISP32LIST, E}}} |
/* Expansion from ind source to "standard" destinations. */ |
#define EXPAND2_STD_IND(CODE, WEIGHT, NAME, OPCODE, BIT) \ |
{CODE, AV_H8SX, 0, NAME, {{RSIND, RDPOSTINC, E}}, {{0x7, 0xc, BIT | RSIND, 0x5, TO_POSTINC, OPCODE, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RSIND, RDPOSTDEC, E}}, {{0x7, 0xc, BIT | RSIND, 0x5, TO_POSTDEC, OPCODE, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RSIND, RDPREINC, E}}, {{0x7, 0xc, BIT | RSIND, 0x5, TO_PREINC, OPCODE, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RSIND, RDPREDEC, E}}, {{0x7, 0xc, BIT | RSIND, 0x5, TO_PREDEC, OPCODE, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RSIND, DISP2DST, E}}, {{0x7, 0xc, BIT | RSIND, 0x5, TO_DISP2, OPCODE, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RSIND, DISP16DST, E}}, {{0x7, 0xc, BIT | RSIND, 0x5, TO_DISP16, OPCODE, IGNORE, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RSIND, DISP32DST, E}}, {{0x7, 0xc, BIT | RSIND, 0x5, TO_DISP32, OPCODE, IGNORE, DSTDISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RSIND, INDEXB16D, E}}, {{0x7, 0xc, BIT | RSIND, 0x5, TO_DISP16B, OPCODE, IGNORE, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RSIND, INDEXW16D, E}}, {{0x7, 0xc, BIT | RSIND, 0x5, TO_DISP16W, OPCODE, IGNORE, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RSIND, INDEXL16D, E}}, {{0x7, 0xc, BIT | RSIND, 0x5, TO_DISP16L, OPCODE, IGNORE, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RSIND, INDEXB32D, E}}, {{0x7, 0xc, BIT | RSIND, 0x5, TO_DISP32B, OPCODE, IGNORE, DSTDISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RSIND, INDEXW32D, E}}, {{0x7, 0xc, BIT | RSIND, 0x5, TO_DISP32W, OPCODE, IGNORE, DSTDISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RSIND, INDEXL32D, E}}, {{0x7, 0xc, BIT | RSIND, 0x5, TO_DISP32L, OPCODE, IGNORE, DSTDISP32LIST, E}}} |
/* Expansion macros for three word (plus data) instructions. */ |
#define EXPAND3_STD_SRC(CODE, WEIGHT, NAME, SRC, PREFIX, INFIX, OPCODE) \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTINC, E}}, {{PREFIX, INFIX, 8, RDPOSTINC, OPCODE, B30 | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTDEC, E}}, {{PREFIX, INFIX, 10, RDPOSTDEC, OPCODE, B30 | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPREINC, E}}, {{PREFIX, INFIX, 9, RDPREINC, OPCODE, B30 | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPREDEC, E}}, {{PREFIX, INFIX, 11, RDPREDEC, OPCODE, B30 | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, DISP2DST, E}}, {{PREFIX, INFIX, B30 | B20 | DISP2DST, DSTDISPREG, OPCODE, B30 | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, DISP16DST, E}}, {{PREFIX, INFIX, 12, B30 | DSTDISPREG, OPCODE, B30 | IGNORE, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, DISP32DST, E}}, {{PREFIX, INFIX, 12, B31 | DSTDISPREG, OPCODE, B30 | IGNORE, DSTDISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB16D, E}}, {{PREFIX, INFIX, 13, B30 | DSTDISPREG, OPCODE, B30 | IGNORE, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW16D, E}}, {{PREFIX, INFIX, 14, B30 | DSTDISPREG, OPCODE, B30 | IGNORE, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL16D, E}}, {{PREFIX, INFIX, 15, B30 | DSTDISPREG, OPCODE, B30 | IGNORE, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB32D, E}}, {{PREFIX, INFIX, 13, B31 | DSTDISPREG, OPCODE, B30 | IGNORE, DSTDISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW32D, E}}, {{PREFIX, INFIX, 14, B31 | DSTDISPREG, OPCODE, B30 | IGNORE, DSTDISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL32D, E}}, {{PREFIX, INFIX, 15, B31 | DSTDISPREG, OPCODE, B30 | IGNORE, DSTDISP32LIST, E}}} |
#define EXPAND3_L_SRC(CODE, WEIGHT, NAME, SRC, PREFIX, INFIX, OPCODE) \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDIND, E}}, {{PREFIX, INFIX, 0, RDIND, OPCODE, B30 | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTINC, E}}, {{PREFIX, INFIX, 8, RDPOSTINC, OPCODE, B30 | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTDEC, E}}, {{PREFIX, INFIX, 10, RDPOSTDEC, OPCODE, B30 | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPREINC, E}}, {{PREFIX, INFIX, 9, RDPREINC, OPCODE, B30 | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, RDPREDEC, E}}, {{PREFIX, INFIX, 11, RDPREDEC, OPCODE, B30 | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, DISP2DST, E}}, {{PREFIX, INFIX, B30 | B20 | DISP2DST, DSTDISPREG, OPCODE, B30 | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, DISP16DST, E}}, {{PREFIX, INFIX, 12, B30 | DSTDISPREG, OPCODE, B30 | IGNORE, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, DISP32DST, E}}, {{PREFIX, INFIX, 12, B31 | DSTDISPREG, OPCODE, B30 | IGNORE, DSTDISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB16D, E}}, {{PREFIX, INFIX, 13, B30 | DSTDISPREG, OPCODE, B30 | IGNORE, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW16D, E}}, {{PREFIX, INFIX, 14, B30 | DSTDISPREG, OPCODE, B30 | IGNORE, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL16D, E}}, {{PREFIX, INFIX, 15, B30 | DSTDISPREG, OPCODE, B30 | IGNORE, DSTDISP16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB32D, E}}, {{PREFIX, INFIX, 13, B31 | DSTDISPREG, OPCODE, B30 | IGNORE, DSTDISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW32D, E}}, {{PREFIX, INFIX, 14, B31 | DSTDISPREG, OPCODE, B30 | IGNORE, DSTDISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL32D, E}}, {{PREFIX, INFIX, 15, B31 | DSTDISPREG, OPCODE, B30 | IGNORE, DSTDISP32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, ABS16DST, E}}, {{PREFIX, INFIX, 4, B30 | IGNORE, OPCODE, B30 | IGNORE, DSTABS16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{SRC, ABS32DST, E}}, {{PREFIX, INFIX, 4, B31 | IGNORE, OPCODE, B30 | IGNORE, DSTABS32LIST, E}}} |
#define EXPAND_STD_MATRIX_L(CODE, NAME, OPCODE) \ |
EXPAND3_L_SRC (CODE, 6, NAME, RSIND, PREFIX_0104, TFROM_IND, OPCODE), \ |
EXPAND3_L_SRC (CODE, 6, NAME, RSPOSTINC, PREFIX_0104, TFROM_POSTINC, OPCODE), \ |
EXPAND3_L_SRC (CODE, 6, NAME, RSPOSTDEC, PREFIX_0106, TFROM_POSTDEC, OPCODE), \ |
EXPAND3_L_SRC (CODE, 6, NAME, RSPREINC, PREFIX_0105, TFROM_PREINC, OPCODE), \ |
EXPAND3_L_SRC (CODE, 6, NAME, RSPREDEC, PREFIX_0107, TFROM_PREDEC, OPCODE), \ |
EXPAND3_L_SRC (CODE, 6, NAME, DISP2SRC, PREFIX_010_D2, TFROM_DISP2, OPCODE), \ |
EXPAND3_L_SRC (CODE, 6, NAME, DISP16SRC, PREFIX_0104, TFROM_DISP16, OPCODE), \ |
EXPAND3_L_SRC (CODE, 6, NAME, DISP32SRC, PREFIX_78R4, TFROM_DISP32, OPCODE), \ |
EXPAND3_L_SRC (CODE, 6, NAME, INDEXB16, PREFIX_0105, TFROM_DISP16B, OPCODE), \ |
EXPAND3_L_SRC (CODE, 6, NAME, INDEXW16, PREFIX_0106, TFROM_DISP16W, OPCODE), \ |
EXPAND3_L_SRC (CODE, 6, NAME, INDEXL16, PREFIX_0107, TFROM_DISP16L, OPCODE), \ |
EXPAND3_L_SRC (CODE, 6, NAME, INDEXB32, PREFIX_78R5, TFROM_DISP32B, OPCODE), \ |
EXPAND3_L_SRC (CODE, 6, NAME, INDEXW32, PREFIX_78R6, TFROM_DISP32W, OPCODE), \ |
EXPAND3_L_SRC (CODE, 6, NAME, INDEXL32, PREFIX_78R7, TFROM_DISP32L, OPCODE), \ |
EXPAND3_L_SRC (CODE, 6, NAME, ABS16SRC, PREFIX_0104, TFROM_ABS16, OPCODE), \ |
EXPAND3_L_SRC (CODE, 6, NAME, ABS32SRC, PREFIX_0104, TFROM_ABS32, OPCODE) |
#define EXPAND_STD_MATRIX_W(CODE, NAME, OPCODE) \ |
EXPAND3_L_SRC (CODE, 4, NAME, RSPOSTINC, PREFIX_0154, TFROM_POSTINC, OPCODE), \ |
EXPAND3_L_SRC (CODE, 4, NAME, RSPOSTDEC, PREFIX_0156, TFROM_POSTDEC, OPCODE), \ |
EXPAND3_L_SRC (CODE, 4, NAME, RSPREINC, PREFIX_0155, TFROM_PREINC, OPCODE), \ |
EXPAND3_L_SRC (CODE, 4, NAME, RSPREDEC, PREFIX_0157, TFROM_PREDEC, OPCODE), \ |
EXPAND3_L_SRC (CODE, 4, NAME, DISP2SRC, PREFIX_015_D2, TFROM_DISP2, OPCODE), \ |
EXPAND3_L_SRC (CODE, 4, NAME, DISP16SRC, PREFIX_0154, TFROM_DISP16, OPCODE), \ |
EXPAND3_L_SRC (CODE, 4, NAME, DISP32SRC, PREFIX_78R4W, TFROM_DISP32, OPCODE), \ |
EXPAND3_L_SRC (CODE, 4, NAME, INDEXB16, PREFIX_0155, TFROM_DISP16B, OPCODE), \ |
EXPAND3_L_SRC (CODE, 4, NAME, INDEXW16, PREFIX_0156, TFROM_DISP16W, OPCODE), \ |
EXPAND3_L_SRC (CODE, 4, NAME, INDEXL16, PREFIX_0157, TFROM_DISP16L, OPCODE), \ |
EXPAND3_L_SRC (CODE, 4, NAME, INDEXB32, PREFIX_78R5W, TFROM_DISP32B, OPCODE), \ |
EXPAND3_L_SRC (CODE, 4, NAME, INDEXW32, PREFIX_78R6W, TFROM_DISP32W, OPCODE), \ |
EXPAND3_L_SRC (CODE, 4, NAME, INDEXL32, PREFIX_78R7W, TFROM_DISP32L, OPCODE) |
#define EXPAND_STD_MATRIX_B(CODE, NAME, OPCODE) \ |
EXPAND3_L_SRC (CODE, 4, NAME, RSPOSTINC, PREFIX_0174, TFROM_POSTINC_B, OPCODE), \ |
EXPAND3_L_SRC (CODE, 4, NAME, RSPOSTDEC, PREFIX_0176, TFROM_POSTDEC_B, OPCODE), \ |
EXPAND3_L_SRC (CODE, 4, NAME, RSPREINC, PREFIX_0175, TFROM_PREINC_B, OPCODE), \ |
EXPAND3_L_SRC (CODE, 4, NAME, RSPREDEC, PREFIX_0177, TFROM_PREDEC_B, OPCODE), \ |
EXPAND3_L_SRC (CODE, 4, NAME, DISP2SRC, PREFIX_017_D2S, TFROM_DISP2_B, OPCODE), \ |
EXPAND3_L_SRC (CODE, 4, NAME, DISP16SRC, PREFIX_0174, TFROM_DISP16_B, OPCODE), \ |
EXPAND3_L_SRC (CODE, 4, NAME, DISP32SRC, PREFIX_78R4W, TFROM_DISP32_B, OPCODE), \ |
EXPAND3_L_SRC (CODE, 4, NAME, INDEXB16, PREFIX_0175, TFROM_DISP16B_B, OPCODE), \ |
EXPAND3_L_SRC (CODE, 4, NAME, INDEXW16, PREFIX_0176, TFROM_DISP16W_B, OPCODE), \ |
EXPAND3_L_SRC (CODE, 4, NAME, INDEXL16, PREFIX_0177, TFROM_DISP16L_B, OPCODE), \ |
EXPAND3_L_SRC (CODE, 4, NAME, INDEXB32, PREFIX_78R5W, TFROM_DISP32B_B, OPCODE), \ |
EXPAND3_L_SRC (CODE, 4, NAME, INDEXW32, PREFIX_78R6W, TFROM_DISP32W_B, OPCODE), \ |
EXPAND3_L_SRC (CODE, 4, NAME, INDEXL32, PREFIX_78R7W, TFROM_DISP32L_B, OPCODE) |
/* Use the expansion macros to fill out the opcode table. */ |
#define EXPAND_FROM_REG8(CODE, NAME, OP1, OP2, OP3) \ |
{CODE, AV_H8SX, 0, NAME, {{RS8, RDIND, E}}, {{0x7, 0xd, B30 | RDIND, IGNORE, OP1, OP2, RS8, IGNORE, E}}}, \ |
EXPAND2_STD_SRC (CODE, 2, NAME, RS8, PREFIX_0179, OP3, RS8), \ |
{CODE, AV_H8SX, 0, NAME, {{RS8, ABS8DST, E}}, {{0x7, 0xf, DSTABS8LIST, OP1, OP2, RS8, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RS8, ABS16DST, E}}, {{0x6, 0xa, 0x1, B31 | IGNORE, DSTABS16LIST, OP1, OP2, RS8, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RS8, ABS32DST, E}}, {{0x6, 0xa, 0x3, B31 | IGNORE, DSTABS32LIST, OP1, OP2, RS8, IGNORE, E}}} |
#define EXPAND_TO_REG8(CODE, NAME, OP1, OP2, OP3) \ |
{CODE, AV_H8SX, 0, NAME, {{RSIND, RD8, E}}, {{0x7, 0xc, B30 | RSIND, IGNORE, OP1, OP2, IGNORE, RD8, E}}}, \ |
EXPAND2_STD_DST (CODE, 2, NAME, RD8, PREFIX_017A, OP3, RD8), \ |
{CODE, AV_H8SX, 0, NAME, {{ABS8SRC, RD8, E}}, {{0x7, 0xe, ABS8LIST, OP1, OP2, IGNORE, RD8, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{ABS16SRC, RD8, E}}, {{0x6, 0xa, 0x1, B30 | IGNORE, ABS16LIST, OP1, OP2, IGNORE, RD8, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{ABS32SRC, RD8, E}}, {{0x6, 0xa, 0x3, B30 | IGNORE, ABS32LIST, OP1, OP2, IGNORE, RD8, E}}} |
#define EXPAND_FROM_IND8(CODE, NAME, OPCODE) \ |
{CODE, AV_H8SX, 0, NAME, {{RSIND, RDIND, E}}, {{0x7, 0xc, B30 | RSIND, 0x5, TO_IND, OPCODE, IGNORE, E}}}, \ |
EXPAND2_STD_IND (CODE, 2, NAME, OPCODE, B30), \ |
{CODE, AV_H8SX, 0, NAME, {{RSIND, ABS16DST, E}}, {{0x7, 0xc, B30 | RSIND, 0x5, TO_ABS16, OPCODE, IGNORE, DSTABS16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RSIND, ABS32DST, E}}, {{0x7, 0xc, B30 | RSIND, 0x5, TO_ABS32, OPCODE, IGNORE, DSTABS32LIST, E}}} |
#define EXPAND_FROM_ABS16_B(CODE, NAME, OPCODE) \ |
{CODE, AV_H8SX, 0, NAME, {{ABS16SRC, RDIND, E}}, {{PREFIX_6A15, ABS16LIST, TO_IND, OPCODE, IGNORE, E}}}, \ |
EXPAND2_STD_ABSDISP (CODE, 2, NAME, ABS16SRC, PREFIX_6A15, ABS16LIST, OPCODE, IGNORE), \ |
{CODE, AV_H8SX, 0, NAME, {{ABS16SRC, ABS16DST, E}}, {{PREFIX_6A15, ABS16LIST, TO_ABS16, OPCODE, IGNORE, DSTABS16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{ABS16SRC, ABS32DST, E}}, {{PREFIX_6A15, ABS16LIST, TO_ABS32, OPCODE, IGNORE, DSTABS32LIST, E}}} |
#define EXPAND_FROM_ABS32_B(CODE, NAME, OPCODE) \ |
{CODE, AV_H8SX, 0, NAME, {{ABS32SRC, RDIND, E}}, {{PREFIX_6A35, ABS32LIST, TO_IND, OPCODE, IGNORE, E}}}, \ |
EXPAND2_STD_ABSDISP (CODE, 2, NAME, ABS32SRC, PREFIX_6A35, ABS32LIST, OPCODE, IGNORE), \ |
{CODE, AV_H8SX, 0, NAME, {{ABS32SRC, ABS16DST, E}}, {{PREFIX_6A35, ABS32LIST, TO_ABS16, OPCODE, IGNORE, DSTABS16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{ABS32SRC, ABS32DST, E}}, {{PREFIX_6A35, ABS32LIST, TO_ABS32, OPCODE, IGNORE, DSTABS32LIST, E}}} |
#define EXPAND_FROM_IMM16_W(CODE, NAME, OPCODE) \ |
{CODE, AV_H8SX, 0, NAME, {{IMM16, RDIND, E}}, {{PREFIX_015E, TO_IND, OPCODE, IGNORE, IMM16LIST, E}}}, \ |
EXPAND2_STD_IMM (CODE, 2, NAME, IMM16, PREFIX_015E, OPCODE, IGNORE, IMM16LIST), \ |
{CODE, AV_H8SX, 0, NAME, {{IMM16, ABS16DST, E}}, {{PREFIX_015E, TO_ABS16, OPCODE, IGNORE, DSTABS16LIST, IMM16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{IMM16, ABS32DST, E}}, {{PREFIX_015E, TO_ABS32, OPCODE, IGNORE, DSTABS32LIST, IMM16LIST, E}}} |
#define EXPAND_FROM_REG16(CODE, NAME, OP1, OP2, OP3) \ |
{CODE, AV_H8, 2, NAME, {{RS16, RDIND, E}}, {{0x7, 0xd, B31 | RDIND, IGNORE, OP1, OP2, RS16, IGNORE, E}}}, \ |
EXPAND2_STD_SRC (CODE, 2, NAME, RS16, PREFIX_0159, OP3, RS16), \ |
{CODE, AV_H8SX, 0, NAME, {{RS16, ABS16DST, E}}, {{0x6, 0xb, 0x1, B31 | IGNORE, DSTABS16LIST, OP1, OP2, RS16, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RS16, ABS32DST, E}}, {{0x6, 0xb, 0x3, B31 | IGNORE, DSTABS32LIST, OP1, OP2, RS16, IGNORE, E}}} |
#define EXPAND_TO_REG16(CODE, NAME, OP1, OP2, OP3) \ |
{CODE, AV_H8SX, 0, NAME, {{RSIND, RD16, E}}, {{0x7, 0xc, B31 | RSIND, IGNORE, OP1, OP2, IGNORE, RD16, E}}}, \ |
EXPAND2_STD_DST (CODE, 2, NAME, RD16, PREFIX_015A, OP3, RD16), \ |
{CODE, AV_H8SX, 0, NAME, {{ABS16SRC, RD16, E}}, {{0x6, 0xb, 0x1, B30 | IGNORE, ABS16LIST, OP1, OP2, IGNORE, RD16, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{ABS32SRC, RD16, E}}, {{0x6, 0xb, 0x3, B30 | IGNORE, ABS32LIST, OP1, OP2, IGNORE, RD16, E}}} |
#define EXPAND_FROM_IND16(CODE, NAME, OPCODE) \ |
{CODE, AV_H8SX, 0, NAME, {{RSIND, RDIND, E}}, {{0x7, 0xc, B31 | RSIND, 0x5, TO_IND, OPCODE, IGNORE, E}}}, \ |
EXPAND2_STD_IND (CODE, 2, NAME, OPCODE, B31), \ |
{CODE, AV_H8SX, 0, NAME, {{RSIND, ABS16DST, E}}, {{0x7, 0xc, B31 | RSIND, 0x5, TO_ABS16, OPCODE, IGNORE, DSTABS16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RSIND, ABS32DST, E}}, {{0x7, 0xc, B31 | RSIND, 0x5, TO_ABS32, OPCODE, IGNORE, DSTABS32LIST, E}}} |
#define EXPAND_FROM_ABS16_W(CODE, NAME, OPCODE) \ |
{CODE, AV_H8SX, 0, NAME, {{ABS16SRC, RDIND, E}}, {{PREFIX_6B15, ABS16LIST, TO_IND, OPCODE, IGNORE, E}}}, \ |
EXPAND2_STD_ABSDISP (CODE, 2, NAME, ABS16SRC, PREFIX_6B15, ABS16LIST, OPCODE, IGNORE), \ |
{CODE, AV_H8SX, 0, NAME, {{ABS16SRC, ABS16DST, E}}, {{PREFIX_6B15, ABS16LIST, TO_ABS16, OPCODE, IGNORE, DSTABS16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{ABS16SRC, ABS32DST, E}}, {{PREFIX_6B15, ABS16LIST, TO_ABS32, OPCODE, IGNORE, DSTABS32LIST, E}}} |
#define EXPAND_FROM_ABS32_W(CODE, NAME, OPCODE) \ |
{CODE, AV_H8SX, 0, NAME, {{ABS32SRC, RDIND, E}}, {{PREFIX_6B35, ABS32LIST, TO_IND, OPCODE, IGNORE, E}}}, \ |
EXPAND2_STD_ABSDISP (CODE, 2, NAME, ABS32SRC, PREFIX_6B35, ABS32LIST, OPCODE, IGNORE), \ |
{CODE, AV_H8SX, 0, NAME, {{ABS32SRC, ABS16DST, E}}, {{PREFIX_6B35, ABS32LIST, TO_ABS16, OPCODE, IGNORE, DSTABS16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{ABS32SRC, ABS32DST, E}}, {{PREFIX_6B35, ABS32LIST, TO_ABS32, OPCODE, IGNORE, DSTABS32LIST, E}}} |
#define EXPAND_FROM_IMM16_L(CODE, NAME, OPCODE) \ |
{CODE, AV_H8SX, 0, NAME, {{IMM16U_NS, RDIND, E}}, {{PREFIX_010E, TO_IND, OPCODE, B30 | IGNORE, IMM16ULIST, E}}}, \ |
EXPAND2_STD_IMM (CODE, 2, NAME, IMM16U_NS, PREFIX_010E, OPCODE, B30 | IGNORE, IMM16ULIST), \ |
{CODE, AV_H8SX, 0, NAME, {{IMM16U_NS, ABS16DST, E}}, {{PREFIX_010E, TO_ABS16, OPCODE, B30 | IGNORE, DSTABS16LIST, IMM16ULIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{IMM16U_NS, ABS32DST, E}}, {{PREFIX_010E, TO_ABS32, OPCODE, B30 | IGNORE, DSTABS32LIST, IMM16ULIST, E}}} |
#define EXPAND_FROM_IMM32_L(CODE, NAME, OPCODE) \ |
{CODE, AV_H8SX, 0, NAME, {{IMM32, RDIND, E}}, {{PREFIX_010E, TO_IND, OPCODE, B31 | IGNORE, IMM32LIST, E}}}, \ |
EXPAND2_STD_IMM (CODE, 2, NAME, IMM32, PREFIX_010E, OPCODE, B31 | IGNORE, IMM32LIST), \ |
{CODE, AV_H8SX, 0, NAME, {{IMM32, ABS16DST, E}}, {{PREFIX_010E, TO_ABS16, OPCODE, B31 | IGNORE, DSTABS16LIST, IMM32LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{IMM32, ABS32DST, E}}, {{PREFIX_010E, TO_ABS32, OPCODE, B31 | IGNORE, DSTABS32LIST, IMM32LIST, E}}} |
#define EXPAND_FROM_REG32(CODE, NAME, OPCODE) \ |
{CODE, AV_H8SX, 0, NAME, {{RS32, RDIND, E}}, {{PREFIX_0109, TO_IND, OPCODE, B30 | RS32, E}}}, \ |
EXPAND2_STD_SRC (CODE, 2, NAME, RS32, PREFIX_0109, OPCODE, B30 | RS32), \ |
{CODE, AV_H8SX, 0, NAME, {{RS32, ABS16DST, E}}, {{PREFIX_0109, TO_ABS16, OPCODE, B30 | RS32, DSTABS16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RS32, ABS32DST, E}}, {{PREFIX_0109, TO_ABS32, OPCODE, B30 | RS32, DSTABS32LIST, E}}} |
#define EXPAND_TO_REG32(CODE, NAME, OPCODE) \ |
{CODE, AV_H8SX, 0, NAME, {{RSIND, RD32, E}}, {{PREFIX_010A, FROM_IND, OPCODE, B30 | RD32, E}}}, \ |
EXPAND2_STD_DST (CODE, 2, NAME, RD32, PREFIX_010A, OPCODE, B30 | RD32), \ |
{CODE, AV_H8SX, 0, NAME, {{ABS16SRC, RD32, E}}, {{PREFIX_010A, FROM_ABS16, OPCODE, B30 | RD32, ABS16LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{ABS32SRC, RD32, E}}, {{PREFIX_010A, FROM_ABS32, OPCODE, B30 | RD32, ABS32LIST, E}}} |
#define EXPAND_TWOOP_B(CODE, NAME, OP1, OP2, OP3, OP4, BIT) \ |
{CODE, AV_H8SX, 0, NAME, {{IMM8, RDIND, E}}, {{0x7, 0xd, B30 | RDIND, IGNORE, OP1, BIT | IGNORE, IMM8LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{IMM8, RDPOSTINC, E}}, {{PREFIX_0174, 0x6, 0xc, B30 | RDPOSTINC, B31 | B20 | IGNORE, OP1, BIT | IGNORE, IMM8LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{IMM8, RDPOSTDEC, E}}, {{PREFIX_0176, 0x6, 0xc, B30 | RDPOSTDEC, B31 | B20 | IGNORE, OP1, BIT | IGNORE, IMM8LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{IMM8, RDPREINC, E}}, {{PREFIX_0175, 0x6, 0xc, B30 | RDPREINC, B31 | B20 | IGNORE, OP1, BIT | IGNORE, IMM8LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{IMM8, RDPREDEC, E}}, {{PREFIX_0177, 0x6, 0xc, B30 | RDPREDEC, B31 | B20 | IGNORE, OP1, BIT | IGNORE, IMM8LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{IMM8, DISP2DST, E}}, {{PREFIX_017_D2D, 0x6, 0x8, B30 | DSTDISPREG, B31 | B20 | IGNORE, OP1, BIT | IGNORE, IMM8LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{IMM8, DISP16DST, E}}, {{PREFIX_0174, 0x6, 0xe, B30 | DSTDISPREG, B31 | B20 | IGNORE, DSTDISP16LIST, OP1, BIT | IGNORE, IMM8LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{IMM8, DISP32DST, E}}, {{PREFIX_78R4WD, 0x6, 0xa, 2, B31 | B20 | IGNORE, DSTDISP32LIST, OP1, BIT | IGNORE, IMM8LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{IMM8, INDEXB16D, E}}, {{PREFIX_0175, 0x6, 0xe, B30 | DSTDISPREG, B31 | B20 | IGNORE, DSTDISP16LIST, OP1, BIT | IGNORE, IMM8LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{IMM8, INDEXW16D, E}}, {{PREFIX_0176, 0x6, 0xe, B30 | DSTDISPREG, B31 | B20 | IGNORE, DSTDISP16LIST, OP1, BIT | IGNORE, IMM8LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{IMM8, INDEXL16D, E}}, {{PREFIX_0177, 0x6, 0xe, B30 | DSTDISPREG, B31 | B20 | IGNORE, DSTDISP16LIST, OP1, BIT | IGNORE, IMM8LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{IMM8, INDEXB32D, E}}, {{PREFIX_78R5WD, 0x6, 0xa, 2, B31 | B20 | IGNORE, DSTDISP32LIST, OP1, BIT | IGNORE, IMM8LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{IMM8, INDEXW32D, E}}, {{PREFIX_78R6WD, 0x6, 0xa, 2, B31 | B20 | IGNORE, DSTDISP32LIST, OP1, BIT | IGNORE, IMM8LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{IMM8, INDEXL32D, E}}, {{PREFIX_78R7WD, 0x6, 0xa, 2, B31 | B20 | IGNORE, DSTDISP32LIST, OP1, BIT | IGNORE, IMM8LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{IMM8, ABS8DST, E}}, {{0x7, 0xf, DSTABS8LIST, OP1, BIT | IGNORE, IMM8LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{IMM8, ABS16DST, E}}, {{0x6, 0xa, 0x1, B31 | B20 | IGNORE, DSTABS16LIST, OP1, BIT | IGNORE, IMM8LIST, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{IMM8, ABS32DST, E}}, {{0x6, 0xa, 0x3, B31 | B20 | IGNORE, DSTABS32LIST, OP1, BIT | IGNORE, IMM8LIST, E}}}, \ |
{CODE, AV_H8, 2, NAME, {{RS8, RD8, E}}, {{OP2, OP3, RS8, RD8, E}}}, \ |
EXPAND_FROM_REG8 (CODE, NAME, OP2, OP3, OP4), \ |
EXPAND_TO_REG8 (CODE, NAME, OP2, OP3, OP4), \ |
EXPAND_FROM_IND8 (CODE, NAME, OP4), \ |
EXPAND_STD_MATRIX_B (CODE, NAME, OP4), \ |
EXPAND_FROM_ABS16_B (CODE, NAME, OP4), \ |
EXPAND_FROM_ABS32_B (CODE, NAME, OP4) |
#define EXPAND_TWOOP_W(CODE, NAME, OP1, OP2, OP3) \ |
{CODE, AV_H8H, 6, NAME, {{IMM16, RD16, E}}, {{0x7, 0x9, OP3, RD16, IMM16LIST, E}}}, \ |
EXPAND_FROM_IMM16_W (CODE, NAME, OP3), \ |
EXPAND_FROM_REG16 (CODE, NAME, OP1, OP2, OP3), \ |
EXPAND_TO_REG16 (CODE, NAME, OP1, OP2, OP3), \ |
EXPAND_FROM_IND16 (CODE, NAME, OP3), \ |
EXPAND_STD_MATRIX_W (CODE, NAME, OP3), \ |
EXPAND_FROM_ABS16_W (CODE, NAME, OP3), \ |
EXPAND_FROM_ABS32_W (CODE, NAME, OP3) |
#define EXPAND_TWOOP_L(CODE, NAME, OP1) \ |
{CODE, AV_H8SX, 0, NAME, {{IMM16U_NS, RD32, E}}, {{0x7, 0xa, OP1, B31 | RD32, IMM16ULIST, E}}}, \ |
{CODE, AV_H8H, 6, NAME, {{IMM32, RD32, E}}, {{0x7, 0xa, OP1, B30 | RD32, IMM32LIST, E}}}, \ |
EXPAND_FROM_IMM16_L (CODE, NAME, OP1), \ |
EXPAND_FROM_IMM32_L (CODE, NAME, OP1), \ |
EXPAND_FROM_REG32 (CODE, NAME, OP1), \ |
EXPAND_TO_REG32 (CODE, NAME, OP1), \ |
EXPAND_STD_MATRIX_L (CODE, NAME, OP1) |
/* Old expanders: */ |
#define BITOP(code, imm, name, op00, op01, op10, op11, op20, op21, op30, op4) \ |
{code, AV_H8, 2, name, {{imm, RD8, E}}, {{op00, op01, imm, RD8, E}}}, \ |
{code, AV_H8, 6, name, {{imm, RDIND, E}}, {{op10, op11, B30 | RDIND, 0, op00, op01, imm, 0, E}}}, \ |
{code, AV_H8, 6, name, {{imm, ABS8DST, E}}, {{op20, op21, DSTABS8LIST, op00, op01, imm, 0, E}}}, \ |
{code, AV_H8S, 6, name, {{imm, ABS16DST, E}}, {{0x6, 0xa, 0x1, op30, DST | MEMRELAX | ABS16LIST , op00, op01, imm, op4, E}}}, \ |
{code, AV_H8S, 6, name, {{imm, ABS32DST, E}}, {{0x6, 0xa, 0x3, op30, DST | MEMRELAX | ABS32LIST , op00, op01, imm, op4, E}}} |
#define BITOP_B(code, imm, name, op00, op01, op10, op11, op20, op21, op30, op4) \ |
{code, AV_H8SX, 0, name, {{imm, RDIND, E}}, {{op10, op11, B30 | RDIND, 0, op00, op01, imm, op4, E}}}, \ |
{code, AV_H8SX, 0, name, {{imm, ABS8DST, E}}, {{op20, op21, DSTABS8LIST, op00, op01, imm, op4, E}}}, \ |
{code, AV_H8SX, 0, name, {{imm, ABS16DST, E}}, {{0x6, 0xa, 0x1, op30, DST | ABS16LIST, op00, op01, imm, op4, E}}}, \ |
{code, AV_H8SX, 0, name, {{imm, ABS32DST, E}}, {{0x6, 0xa, 0x3, op30, DST | ABS32LIST, op00, op01, imm, op4, E}}} |
#define EBITOP(code, imm, name, op00, op01, op10, op11, op20, op21, op30, op4) \ |
BITOP(code, imm, name, op00+1, op01, op10, op11, op20, op21, op30, op4), \ |
BITOP(code, RS8, name, op00, op01, op10, op11, op20, op21, op30, op4) |
#define EBITOP_B(code, imm, name, op00, op01, op10, op11, op20, op21, op30, op4) \ |
BITOP_B(code, imm, name, op00+1, op01, op10, op11, op20, op21, op30, op4), \ |
BITOP_B(code, RS8, name, op00, op01, op10, op11, op20, op21, op30, op4) |
#define WTWOP(code, name, op1, op2) \ |
{code, AV_H8, 2, name, {{RS16, RD16, E}}, {{op1, op2, RS16, RD16, E}}} |
#define BRANCH(code, name, op) \ |
{code, AV_H8H, 6, name, {{PCREL16, E}}, {{0x5, 0x8, op, 0x0, PCREL16, DATA3 | B00, E}}}, \ |
{code, AV_H8, 4, name, {{PCREL8, E}}, {{0x4, op, PCREL8, DATA | B00, E}}} |
#define UNOP(code, name, op1, op2) \ |
{code, AV_H8, 2, name, {{OR8, E}}, {{op1, op2, 0, OR8, E}}} |
#define EXPAND_UNOP_STD_B(CODE, NAME, PREFIX, OP1, OP2, OP3) \ |
{CODE, AV_H8, 2, NAME, {{OR8, E}}, {{ OP1, OP2, OP3, OR8, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RSIND, E}}, {{ 7, 13, B30 | RSIND, IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RSPOSTINC, E}}, {{PREFIX, 4, 6, 12, B30 | RSPOSTINC, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RSPOSTDEC, E}}, {{PREFIX, 6, 6, 12, B30 | RSPOSTDEC, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RSPREINC, E}}, {{PREFIX, 5, 6, 12, B30 | RSPREINC, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RSPREDEC, E}}, {{PREFIX, 7, 6, 12, B30 | RSPREDEC, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{DISP2SRC, E}}, {{PREFIX, B30 | B21 | DISP2SRC, 6, 8, B30 | DISPREG, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{DISP16SRC, E}}, {{PREFIX, 4, 6, 14, B30 | DISPREG, B31 | IGNORE, DISP16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{DISP32SRC, E}}, {{7, 8, B30 | DISPREG, 4, 6, 10, 2, B31 | IGNORE, DISP32LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{INDEXB16, E}}, {{PREFIX, 5, 6, 14, B30 | DISPREG, B31 | IGNORE, DISP16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{INDEXW16, E}}, {{PREFIX, 6, 6, 14, B30 | DISPREG, B31 | IGNORE, DISP16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{INDEXL16, E}}, {{PREFIX, 7, 6, 14, B30 | DISPREG, B31 | IGNORE, DISP16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{INDEXB32, E}}, {{7, 8, B30 | DISPREG, 5, 6, 10, 2, B31 | IGNORE, DISP32LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{INDEXW32, E}}, {{7, 8, B30 | DISPREG, 6, 6, 10, 2, B31 | IGNORE, DISP32LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{INDEXL32, E}}, {{7, 8, B30 | DISPREG, 7, 6, 10, 2, B31 | IGNORE, DISP32LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{ABS8SRC, E}}, {{ 7, 15, ABS8LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{ABS16SRC, E}}, {{ 6, 10, 1, B31 | IGNORE, ABS16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{ABS32SRC, E}}, {{ 6, 10, 3, B31 | IGNORE, ABS32LIST, OP1, OP2, OP3, IGNORE, E}}} |
#define EXPAND_UNOP_STD_W(CODE, NAME, PREFIX, OP1, OP2, OP3) \ |
{CODE, AV_H8H, 2, NAME, {{OR16, E}}, {{ OP1, OP2, OP3, OR16, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RSIND, E}}, {{ 7, 13, B31 | RSIND, IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RSPOSTINC, E}}, {{PREFIX, 4, 6, 13, B30 | RSPOSTINC, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RSPOSTDEC, E}}, {{PREFIX, 6, 6, 13, B30 | RSPOSTDEC, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RSPREINC, E}}, {{PREFIX, 5, 6, 13, B30 | RSPREINC, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RSPREDEC, E}}, {{PREFIX, 7, 6, 13, B30 | RSPREDEC, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{DISP2SRC, E}}, {{PREFIX, B30 | B21 | DISP2SRC, 6, 9, B30 | DISPREG, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{DISP16SRC, E}}, {{PREFIX, 4, 6, 15, B30 | DISPREG, B31 | IGNORE, DISP16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{DISP32SRC, E}}, {{7, 8, B30 | DISPREG, 4, 6, 11, 2, B31 | IGNORE, DISP32LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{INDEXB16, E}}, {{PREFIX, 5, 6, 15, B30 | DISPREG, B31 | IGNORE, DISP16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{INDEXW16, E}}, {{PREFIX, 6, 6, 15, B30 | DISPREG, B31 | IGNORE, DISP16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{INDEXL16, E}}, {{PREFIX, 7, 6, 15, B30 | DISPREG, B31 | IGNORE, DISP16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{INDEXB32, E}}, {{7, 8, B30 | DISPREG, 5, 6, 11, 2, B31 | IGNORE, DISP32LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{INDEXW32, E}}, {{7, 8, B30 | DISPREG, 6, 6, 11, 2, B31 | IGNORE, DISP32LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{INDEXL32, E}}, {{7, 8, B30 | DISPREG, 7, 6, 11, 2, B31 | IGNORE, DISP32LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{ABS16SRC, E}}, {{ 6, 11, 1, B31 | IGNORE, ABS16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{ABS32SRC, E}}, {{ 6, 11, 3, B31 | IGNORE, ABS32LIST, OP1, OP2, OP3, IGNORE, E}}} |
#define EXPAND_UNOP_STD_L(CODE, NAME, PREFIX, OP1, OP2, OP3) \ |
{CODE, AV_H8H, 2, NAME, {{OR32, E}}, {{ OP1, OP2, OP3, B30 | OR32, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RSIND, E}}, {{PREFIX, 4, 6, 9, B30 | RSIND, B31 | IGNORE, OP1, OP2, OP3, B30 | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RSPOSTINC, E}}, {{PREFIX, 4, 6, 13, B30 | RSPOSTINC, B31 | IGNORE, OP1, OP2, OP3, B30 | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RSPOSTDEC, E}}, {{PREFIX, 6, 6, 13, B30 | RSPOSTDEC, B31 | IGNORE, OP1, OP2, OP3, B30 | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RSPREINC, E}}, {{PREFIX, 5, 6, 13, B30 | RSPREINC, B31 | IGNORE, OP1, OP2, OP3, B30 | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{RSPREDEC, E}}, {{PREFIX, 7, 6, 13, B30 | RSPREDEC, B31 | IGNORE, OP1, OP2, OP3, B30 | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{DISP2SRC, E}}, {{PREFIX, B30 | B21 | DISP2SRC, 6, 9, B30 | DISPREG, B31 | IGNORE, OP1, OP2, OP3, B30 | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{DISP16SRC, E}}, {{PREFIX, 4, 6, 15, B30 | DISPREG, B31 | IGNORE, DISP16LIST, OP1, OP2, OP3, B30 | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{DISP32SRC, E}}, {{7, 8, B31 | DISPREG, 4, 6, 11, 2, B31 | IGNORE, DISP32LIST, OP1, OP2, OP3, B30 | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{INDEXB16, E}}, {{PREFIX, 5, 6, 15, B30 | DISPREG, B31 | IGNORE, DISP16LIST, OP1, OP2, OP3, B30 | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{INDEXW16, E}}, {{PREFIX, 6, 6, 15, B30 | DISPREG, B31 | IGNORE, DISP16LIST, OP1, OP2, OP3, B30 | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{INDEXL16, E}}, {{PREFIX, 7, 6, 15, B30 | DISPREG, B31 | IGNORE, DISP16LIST, OP1, OP2, OP3, B30 | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{INDEXB32, E}}, {{7, 8, B31 | DISPREG, 5, 6, 11, 2, B31 | IGNORE, DISP32LIST, OP1, OP2, OP3, B30 | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{INDEXW32, E}}, {{7, 8, B31 | DISPREG, 6, 6, 11, 2, B31 | IGNORE, DISP32LIST, OP1, OP2, OP3, B30 | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{INDEXL32, E}}, {{7, 8, B31 | DISPREG, 7, 6, 11, 2, B31 | IGNORE, DISP32LIST, OP1, OP2, OP3, B30 | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{ABS16SRC, E}}, {{PREFIX, 4, 6, 11, 0, B31 | IGNORE, ABS16LIST, OP1, OP2, OP3, B30 | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{ABS32SRC, E}}, {{PREFIX, 4, 6, 11, 2, B31 | IGNORE, ABS32LIST, OP1, OP2, OP3, B30 | IGNORE, E}}} |
#define EXPAND_UNOP_EXTENDED_B(CODE, NAME, CONST, PREFIX, OP1, OP2, OP3) \ |
{CODE, AV_H8, 2, NAME, {{CONST, RD8, E}}, {{ OP1, OP2, OP3, RD8, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, RDIND, E}}, {{ 7, 13, B30 | RDIND, IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, RDPOSTINC, E}}, {{PREFIX, 4, 6, 12, B30 | RDPOSTINC, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, RDPOSTDEC, E}}, {{PREFIX, 6, 6, 12, B30 | RDPOSTDEC, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, RDPREINC, E}}, {{PREFIX, 5, 6, 12, B30 | RDPREINC, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, RDPREDEC, E}}, {{PREFIX, 7, 6, 12, B30 | RDPREDEC, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, DISP2DST, E}}, {{PREFIX, B30 | B21 | DISP2DST, 6, 8, B30 | DSTDISPREG, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, DISP16DST, E}}, {{PREFIX, 4, 6, 14, B30 | DSTDISPREG, B31 | IGNORE, DSTDISP16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, DISP32DST, E}}, {{7, 8, B30 | DSTDISPREG, 4, 6, 10, 2, B31 | IGNORE, DSTDISP32LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, INDEXB16D, E}}, {{PREFIX, 5, 6, 14, B30 | DSTDISPREG, B31 | IGNORE, DSTDISP16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, INDEXW16D, E}}, {{PREFIX, 6, 6, 14, B30 | DSTDISPREG, B31 | IGNORE, DSTDISP16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, INDEXL16D, E}}, {{PREFIX, 7, 6, 14, B30 | DSTDISPREG, B31 | IGNORE, DSTDISP16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, INDEXB32D, E}}, {{7, 8, B30 | DSTDISPREG, 5, 6, 10, 2, B31 | IGNORE, DSTDISP32LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, INDEXW32D, E}}, {{7, 8, B30 | DSTDISPREG, 6, 6, 10, 2, B31 | IGNORE, DSTDISP32LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, INDEXL32D, E}}, {{7, 8, B30 | DSTDISPREG, 7, 6, 10, 2, B31 | IGNORE, DSTDISP32LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, ABS8DST, E}}, {{ 7, 15, DSTABS8LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, ABS16DST, E}}, {{ 6, 10, 1, B31 | IGNORE, DSTABS16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, ABS32DST, E}}, {{ 6, 10, 3, B31 | IGNORE, DSTABS32LIST, OP1, OP2, OP3, IGNORE, E}}} |
#define EXPAND_UNOP_EXTENDED_W(CODE, NAME, CONST, PREFIX, OP1, OP2, OP3) \ |
{CODE, AV_H8, 2, NAME, {{CONST, RD16, E}}, {{ OP1, OP2, OP3, RD16, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, RDIND, E}}, {{ 7, 13, B31 | RDIND, IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, RDPOSTINC, E}}, {{PREFIX, 4, 6, 13, B30 | RDPOSTINC, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, RDPOSTDEC, E}}, {{PREFIX, 6, 6, 13, B30 | RDPOSTDEC, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, RDPREINC, E}}, {{PREFIX, 5, 6, 13, B30 | RDPREINC, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, RDPREDEC, E}}, {{PREFIX, 7, 6, 13, B30 | RDPREDEC, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, DISP2DST, E}}, {{PREFIX, B30 | B21 | DISP2DST, 6, 9, B30 | DSTDISPREG, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, DISP16DST, E}}, {{PREFIX, 4, 6, 15, B30 | DSTDISPREG, B31 | IGNORE, DSTDISP16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, DISP32DST, E}}, {{7, 8, B30 | DSTDISPREG, 4, 6, 11, 2, B31 | IGNORE, DSTDISP32LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, INDEXB16D, E}}, {{PREFIX, 5, 6, 15, B30 | DSTDISPREG, B31 | IGNORE, DSTDISP16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, INDEXW16D, E}}, {{PREFIX, 6, 6, 15, B30 | DSTDISPREG, B31 | IGNORE, DSTDISP16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, INDEXL16D, E}}, {{PREFIX, 7, 6, 15, B30 | DSTDISPREG, B31 | IGNORE, DSTDISP16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, INDEXB32D, E}}, {{7, 8, B30 | DSTDISPREG, 5, 6, 11, 2, B31 | IGNORE, DSTDISP32LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, INDEXW32D, E}}, {{7, 8, B30 | DSTDISPREG, 6, 6, 11, 2, B31 | IGNORE, DSTDISP32LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, INDEXL32D, E}}, {{7, 8, B30 | DSTDISPREG, 7, 6, 11, 2, B31 | IGNORE, DSTDISP32LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, ABS16DST, E}}, {{ 6, 11, 1, B31 | IGNORE, DSTABS16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, ABS32DST, E}}, {{ 6, 11, 3, B31 | IGNORE, DSTABS32LIST, OP1, OP2, OP3, IGNORE, E}}} |
#define EXPAND_UNOP_EXTENDED_L(CODE, NAME, CONST, PREFIX, OP1, OP2, OP3, BIT) \ |
{CODE, AV_H8, 2, NAME, {{CONST, RD32, E}}, {{ OP1, OP2, OP3, BIT | RD32, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, RDIND, E}}, {{PREFIX, 4, 6, 9, B30 | RDIND, B31 | IGNORE, OP1, OP2, OP3, BIT | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, RDPOSTINC, E}}, {{PREFIX, 4, 6, 13, B30 | RDPOSTINC, B31 | IGNORE, OP1, OP2, OP3, BIT | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, RDPOSTDEC, E}}, {{PREFIX, 6, 6, 13, B30 | RDPOSTDEC, B31 | IGNORE, OP1, OP2, OP3, BIT | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, RDPREINC, E}}, {{PREFIX, 5, 6, 13, B30 | RDPREINC, B31 | IGNORE, OP1, OP2, OP3, BIT | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, RDPREDEC, E}}, {{PREFIX, 7, 6, 13, B30 | RDPREDEC, B31 | IGNORE, OP1, OP2, OP3, BIT | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, DISP2DST, E}}, {{PREFIX, B30 | B21 | DISP2DST, 6, 9, B30 | DSTDISPREG, B31 | IGNORE, OP1, OP2, OP3, BIT | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, DISP16DST, E}}, {{PREFIX, 4, 6, 15, B30 | DSTDISPREG, B31 | IGNORE, DSTDISP16LIST, OP1, OP2, OP3, BIT | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, DISP32DST, E}}, {{7, 8, B31 | DSTDISPREG, 4, 6, 11, 2, B31 | IGNORE, DSTDISP32LIST, OP1, OP2, OP3, BIT | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, INDEXB16D, E}}, {{PREFIX, 5, 6, 15, B30 | DSTDISPREG, B31 | IGNORE, DSTDISP16LIST, OP1, OP2, OP3, BIT | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, INDEXW16D, E}}, {{PREFIX, 6, 6, 15, B30 | DSTDISPREG, B31 | IGNORE, DSTDISP16LIST, OP1, OP2, OP3, BIT | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, INDEXL16D, E}}, {{PREFIX, 7, 6, 15, B30 | DSTDISPREG, B31 | IGNORE, DSTDISP16LIST, OP1, OP2, OP3, BIT | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, INDEXB32D, E}}, {{7, 8, B31 | DSTDISPREG, 5, 6, 11, 2, B31 | IGNORE, DSTDISP32LIST, OP1, OP2, OP3, BIT | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, INDEXW32D, E}}, {{7, 8, B31 | DSTDISPREG, 6, 6, 11, 2, B31 | IGNORE, DSTDISP32LIST, OP1, OP2, OP3, BIT | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, INDEXL32D, E}}, {{7, 8, B31 | DSTDISPREG, 7, 6, 11, 2, B31 | IGNORE, DSTDISP32LIST, OP1, OP2, OP3, BIT | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, ABS16DST, E}}, {{PREFIX, 4, 6, 11, 0, B31 | IGNORE, DSTABS16LIST, OP1, OP2, OP3, BIT | IGNORE, E}}}, \ |
{CODE, AV_H8SX, 0, NAME, {{CONST, ABS32DST, E}}, {{PREFIX, 4, 6, 11, 2, B31 | IGNORE, DSTABS32LIST, OP1, OP2, OP3, BIT | IGNORE, E}}} |
#define PREFIXLDC 0x0, 0x1, 0x4, B30 | CCR_EXR | DST |
#define PREFIXSTC 0x0, 0x1, 0x4, B30 | CCR_EXR | SRC |
#define O(op, size) (op * 4 + size) |
#define OP_SIZE(HOW) (HOW % 4) |
#define OP_KIND(HOW) (HOW / 4) |
enum h8_asm_codes |
{ |
O_RECOMPILE = 0, |
O_ADD, |
O_ADDX, |
O_AND, |
O_BAND, |
O_BRA, |
O_BRAB, |
O_BRAW, |
O_BRAL, |
O_BRAS, |
O_BRABC, |
O_BRABS, |
O_BSRBC, |
O_BSRBS, |
O_BRN, |
O_BHI, |
O_BLS, |
O_BCC, |
O_BCS, |
O_BNE, |
O_BVC, |
O_BVS, |
O_BPL, |
O_BMI, |
O_BGE, |
O_BLT, |
O_BGT, |
O_BLE, |
O_ANDC, |
O_BEQ, |
O_BCLR, |
O_BCLREQ, |
O_BCLRNE, |
O_BSETEQ, |
O_BSETNE, |
O_BFLD, |
O_BFST, |
O_BIAND, |
O_BILD, |
O_BIOR, |
O_BIXOR, |
O_BIST, |
O_BISTZ, |
O_BLD, |
O_BNOT, |
O_BOR, |
O_BSET, |
O_BSR, |
O_BXOR, |
O_CMP, |
O_DAA, |
O_DAS, |
O_DEC, |
O_DIVU, |
O_DIVS, |
O_DIVXU, |
O_DIVXS, |
O_INC, |
O_LDC, |
O_MOV, |
O_MOVAB, |
O_MOVAW, |
O_MOVAL, |
O_MOVMD, |
O_MOVSD, |
O_OR, |
O_ROTL, |
O_ROTR, |
O_ROTXL, |
O_ROTXR, |
O_BPT, |
O_SHAL, |
O_SHAR, |
O_SHLL, |
O_SHLR, |
O_SUB, |
O_SUBS, |
O_TRAPA, |
O_XOR, |
O_XORC, |
O_BST, |
O_BSTZ, |
O_BTST, |
O_EEPMOV, |
O_EXTS, |
O_EXTU, |
O_JMP, |
O_JSR, |
O_MULU, |
O_MULUU, |
O_MULS, |
O_MULSU, |
O_MULXU, |
O_MULXS, |
O_NOP, |
O_NOT, |
O_ORC, |
O_RTE, |
O_RTEL, |
O_STC, |
O_SUBX, |
O_NEG, |
O_RTS, |
O_RTSL, |
O_SLEEP, |
O_ILL, |
O_ADDS, |
O_SYSCALL, |
O_TAS, |
O_CLRMAC, |
O_LDMAC, |
O_MAC, |
O_LDM, |
O_STM, |
O_STMAC, |
O_LAST, |
/* Change made for System Call processing. */ |
O_SYS_CREAT, |
O_SYS_OPEN, |
O_SYS_READ, |
O_SYS_WRITE, |
O_SYS_LSEEK, |
O_SYS_CLOSE, |
O_SYS_STAT, |
O_SYS_FSTAT, |
/* Space reserved for future file I/O system calls. */ |
O_SYS_CMDLINE |
/* End of System Call specific Changes. */ |
}; |
enum h8_size |
{ |
SB = 0, |
SW = 1, |
SL = 2, |
SN = 3 |
}; |
/* FIXME: Lots of insns have "E, 0, 0, 0, 0" in the nibble code sequences. |
Methinks the zeroes aren't necessary. Once confirmed, nuke 'em. */ |
struct h8_opcode h8_opcodes[] = |
{ |
{O (O_ADD, SB), AV_H8, 2, "add.b", {{IMM8, RD8, E}}, {{0x8, RD8, IMM8LIST, E}}}, |
EXPAND_TWOOP_B (O (O_ADD, SB), "add.b", 0x8, 0x0, 0x8, 0x1, 0), |
{O (O_ADD, SW), AV_H8, 6, "add.w", {{RS16, RD16, E}}, {{0x0, 0x9, RS16, RD16, E}}}, |
{O (O_ADD, SW), AV_H8SX, 0, "add.w", {{IMM3NZ_NS, RD16, E}}, {{0x0, 0xa, B30 | IMM3NZ, RD16, E}}}, |
{O (O_ADD, SW), AV_H8SX, 0, "add.w", {{IMM3NZ_NS, RDIND, E}}, {{0x7, 0xd, B31 | RDIND, IGNORE, 0x0, 0xa, B30 | IMM3NZ, IGNORE, E}}}, |
{O (O_ADD, SW), AV_H8SX, 0, "add.w", {{IMM3NZ_NS, ABS16DST, E}}, {{0x6, 0xb, 0x1, B31 | IGNORE, DSTABS16LIST, 0x0, 0xa, B30 | IMM3NZ, IGNORE, E}}}, |
{O (O_ADD, SW), AV_H8SX, 0, "add.w", {{IMM3NZ_NS, ABS32DST, E}}, {{0x6, 0xb, 0x3, B31 | IGNORE, DSTABS32LIST, 0x0, 0xa, B30 | IMM3NZ, IGNORE, E}}}, |
EXPAND_TWOOP_W (O (O_ADD, SW), "add.w", 0x0, 0x9, 0x1), |
{O (O_ADD, SL), AV_H8H, 6, "add.l", {{RS32, RD32, E}}, {{0x0, 0xa, B31 | RS32, B30 | RD32, E}}}, |
{O (O_ADD, SL), AV_H8SX, 0, "add.l", {{IMM3NZ_NS, RD32, E}}, {{0x0, 0xa, B31 | IMM3NZ, B31 | RD32, E}}}, |
EXPAND_TWOOP_L (O (O_ADD, SL), "add.l", 0x1), |
{O (O_ADDS, SL), AV_H8, 2, "adds", {{KBIT, RDP, E}}, {{0x0, 0xB,KBIT, RDP, E}}}, |
{O (O_ADDX, SB), AV_H8, 2, "addx", {{IMM8, RD8, E}}, {{0x9, RD8, IMM8LIST, E}}}, |
{O (O_ADDX, SB), AV_H8SX, 0, "addx.b", {{IMM8, RDIND, E}}, {{0x7, 0xd, B30 | RDIND, IGNORE, 0x9, IGNORE, IMM8LIST, E}}}, |
{O (O_ADDX, SB), AV_H8SX, 0, "addx.b", {{IMM8, RDPOSTDEC, E}}, {{PREFIX_0176, 0x6, 0xc, B30 | RDPOSTDEC, B31 | IGNORE, 0x9, IGNORE, IMM8LIST, E}}}, |
{O (O_ADDX, SB), AV_H8, 2, "addx", {{RS8, RD8, E}}, {{0x0, 0xe, RS8, RD8, E}}}, |
{O (O_ADDX, SB), AV_H8SX, 0, "addx.b", {{RS8, RDIND, E}}, {{0x7, 0xd, B30 | RDIND, IGNORE, 0x0, 0xe, RS8, IGNORE, E}}}, |
{O (O_ADDX, SB), AV_H8SX, 0, "addx.b", {{RS8, RDPOSTDEC, E}}, {{PREFIX_0176, 0x6, 0xc, B30 | RDPOSTDEC, B31 | IGNORE, 0x0, 0xe, RS8, IGNORE, E}}}, |
{O (O_ADDX, SB), AV_H8SX, 0, "addx.b", {{RSIND, RD8, E}}, {{0x7, 0xc, B30 | RSIND, IGNORE, 0x0, 0xe, IGNORE, RD8, E}}}, |
{O (O_ADDX, SB), AV_H8SX, 0, "addx.b", {{RSPOSTDEC, RD8, E}}, {{PREFIX_0176, 0x6, 0xc, B30 | RSPOSTDEC, B30 | B20 | IGNORE, 0x0, 0xe, IGNORE, RD8, E}}}, |
{O (O_ADDX, SB), AV_H8SX, 0, "addx.b", {{RSIND, RDIND, E}}, {{PREFIX_0174, 0x6, 0x8, B30 | RSIND, 0xd, 0x0, RDIND, 0x1, IGNORE, E}}}, |
{O (O_ADDX, SB), AV_H8SX, 0, "addx.b", {{RSPOSTDEC, RDPOSTDEC, E}}, {{PREFIX_0176, 0x6, 0xc, B30 | RSPOSTDEC, 0xd, 0xa, RDPOSTDEC, 0x1, IGNORE, E}}}, |
{O (O_ADDX, SW), AV_H8SX, 0, "addx.w", {{IMM16, RD16, E}}, {{PREFIX_0151, 0x7, 0x9, 0x1, RD16, IMM16LIST, E}}}, |
{O (O_ADDX, SW), AV_H8SX, 0, "addx.w", {{IMM16, RDIND, E}}, {{0x7, 0xd, B31 | RDIND, B01 | IGNORE, 0x7, 0x9, 0x1, IGNORE, IMM16LIST, E}}}, |
{O (O_ADDX, SW), AV_H8SX, 0, "addx.w", {{IMM16, RDPOSTDEC, E}}, {{PREFIX_0156, 0x6, 0xd, B30 | RDPOSTDEC, B31 | B20 | B01 | IGNORE, 0x7, 0x9, 0x1, IGNORE, IMM16LIST, E}}}, |
{O (O_ADDX, SW), AV_H8SX, 0, "addx.w", {{RS16, RD16, E}}, {{PREFIX_0151, 0x0, 0x9, RS16, RD16, E}}}, |
{O (O_ADDX, SW), AV_H8SX, 0, "addx.w", {{RS16, RDIND, E}}, {{0x7, 0xd, B31 | RDIND, B01 | IGNORE, 0x0, 0x9, RS16, IGNORE, E}}}, |
{O (O_ADDX, SW), AV_H8SX, 0, "addx.w", {{RS16, RDPOSTDEC, E}}, {{PREFIX_0156, 0x6, 0xd, B30 | RDPOSTDEC, B31 | B20 | B01 | IGNORE, 0x0, 0x9, RS16, IGNORE, E}}}, |
{O (O_ADDX, SW), AV_H8SX, 0, "addx.w", {{RSIND, RD16, E}}, {{0x7, 0xc, B31 | RSIND, B01 | IGNORE, 0x0, 0x9, IGNORE, RD16, E}}}, |
{O (O_ADDX, SW), AV_H8SX, 0, "addx.w", {{RSPOSTDEC, RD16, E}}, {{PREFIX_0156, 0x6, 0xd, B30 | RSPOSTDEC, B30 | B20 | B01 | IGNORE, 0x0, 0x9, IGNORE, RD16, E}}}, |
{O (O_ADDX, SW), AV_H8SX, 0, "addx.w", {{RSIND, RDIND, E}}, {{PREFIX_0154, 0x6, 0x9, B30 | RSIND, 0xd, 0x0, RDIND, 0x1, IGNORE, E}}}, |
{O (O_ADDX, SW), AV_H8SX, 0, "addx.w", {{RSPOSTDEC, RDPOSTDEC, E}}, {{PREFIX_0156, 0x6, 0xd, B30 | RSPOSTDEC, 0xd, 0xa, RDPOSTDEC, 0x1, IGNORE, E}}}, |
{O (O_ADDX, SL), AV_H8SX, 0, "addx.l", {{IMM32, RD32, E}}, {{PREFIX_0101, 0x7, 0xa, 0x1, RD32, IMM32LIST, E}}}, |
{O (O_ADDX, SL), AV_H8SX, 0, "addx.l", {{IMM32, RDIND, E}}, {{PREFIX_0104, 0x6, 0x9, B30 | RDIND, B31 | B20 | B01 | IGNORE, 0x7, 0xa, 0x1, IGNORE, IMM32LIST, E}}}, |
{O (O_ADDX, SL), AV_H8SX, 0, "addx.l", {{IMM32, RDPOSTDEC, E}}, {{PREFIX_0106, 0x6, 0xd, B30 | RDPOSTDEC, B31 | B20 | B01 | IGNORE, 0x7, 0xa, 0x1, IGNORE, IMM32LIST, E}}}, |
{O (O_ADDX, SL), AV_H8SX, 0, "addx.l", {{RS32, RD32, E}}, {{PREFIX_0101, 0x0, 0xa, B31 | RS32, B30 | RD32, E}}}, |
{O (O_ADDX, SL), AV_H8SX, 0, "addx.l", {{RS32, RDIND, E}}, {{PREFIX_0104, 0x6, 0x9, B30 | RDIND, B31 | B20 | B01 | IGNORE, 0x0, 0xa, B31 | RS32, B30 | IGNORE, E}}}, |
{O (O_ADDX, SL), AV_H8SX, 0, "addx.l", {{RS32, RDPOSTDEC, E}}, {{PREFIX_0106, 0x6, 0xd, B30 | RDPOSTDEC, B31 | B20 | B01 | IGNORE, 0x0, 0xa, B31 | RS32, B30 | IGNORE, E}}}, |
{O (O_ADDX, SL), AV_H8SX, 0, "addx.l", {{RSIND, RD32, E}}, {{PREFIX_0104, 0x6, 0x9, B30 | RSIND, B30 | B20 | B01 | IGNORE, 0x0, 0xa, B31 | IGNORE, B30 | RD32, E}}}, |
{O (O_ADDX, SL), AV_H8SX, 0, "addx.l", {{RSPOSTDEC, RD32, E}}, {{PREFIX_0106, 0x6, 0xd, B30 | RSPOSTDEC, B30 | B20 | B01 | IGNORE, 0x0, 0xa, B31 | IGNORE, B30 | RD32, E}}}, |
{O (O_ADDX, SL), AV_H8SX, 0, "addx.l", {{RSIND, RDIND, E}}, {{PREFIX_0104, 0x6, 0x9, B30 | RSIND, 0xd, 0x0, RDIND, 0x1, IGNORE, E}}}, |
{O (O_ADDX, SL), AV_H8SX, 0, "addx.l", {{RSPOSTDEC, RDPOSTDEC, E}}, {{PREFIX_0106, 0x6, 0xd, B30 | RSPOSTDEC, 0xd, 0xa, RDPOSTDEC, 0x1, IGNORE, E}}}, |
{O (O_AND, SB), AV_H8, 2, "and.b", {{IMM8, RD8, E}}, {{0xe, RD8, IMM8LIST, E}}}, |
EXPAND_TWOOP_B (O (O_AND, SB), "and.b", 0xe, 0x1, 0x6, 0x6, 0), |
{O (O_AND, SW), AV_H8, 2, "and.w", {{RS16, RD16, E}}, {{0x6, 0x6, RS16, RD16, E}}}, |
EXPAND_TWOOP_W (O (O_AND, SW), "and.w", 0x6, 0x6, 0x6), |
{O (O_AND, SL), AV_H8H, 2, "and.l", {{RS32, RD32, E}}, {{0x0, 0x1, 0xF, 0x0, 0x6, 0x6, B30 | RS32, B30 | RD32, E}}}, |
EXPAND_TWOOP_L (O (O_AND, SL), "and.l", 0x6), |
{O (O_ANDC, SB), AV_H8, 2, "andc", {{IMM8, CCR | DST, E}}, {{0x0, 0x6, IMM8LIST, E}}}, |
{O (O_ANDC, SB), AV_H8S, 2, "andc", {{IMM8, EXR | DST, E}}, {{0x0, 0x1, 0x4, EXR | DST, 0x0, 0x6, IMM8LIST, E}}}, |
BRANCH (O (O_BRA, SB), "bra", 0x0), |
{O (O_BRAB, SB), AV_H8SX, 0, "bra", {{LOWREG | L_8, E}}, {{0x5, 0x9, LOWREG | L_8 | B30, 0x5, E}}}, |
{O (O_BRAW, SW), AV_H8SX, 0, "bra", {{LOWREG | L_16, E}}, {{0x5, 0x9, LOWREG | L_16 | B30, 0x6, E}}}, |
{O (O_BRAL, SL), AV_H8SX, 0, "bra", {{RS32, E}}, {{0x5, 0x9, RS32 | B30, 0x7, E}}}, |
{O (O_BRABC, SB), AV_H8SX, 0, "bra/bc", {{IMM3, RDIND, OP3PCREL8}}, {{0x7, 0xC, B30 | RDIND, 0x0, 0x4, B30 | IMM3, OP3PCREL8, DATA, E}}}, |
{O (O_BRABC, SB), AV_H8SX, 0, "bra/bc", {{IMM3, ABS8DST, OP3PCREL8}}, {{0x7, 0xE, DSTABS8LIST, 0x4, B30 | IMM3, OP3PCREL8, DATA, E}}}, |
{O (O_BRABC, SB), AV_H8SX, 0, "bra/bc", {{IMM3, ABS16DST, OP3PCREL8}}, {{0x6, 0xA, 0x1, 0x0, DSTABS16LIST, 0x4, B30 | IMM3, OP3PCREL8, DATA, E}}}, |
{O (O_BRABC, SB), AV_H8SX, 0, "bra/bc", {{IMM3, ABS32DST, OP3PCREL8}}, {{0x6, 0xA, 0x3, 0x0, DSTABS32LIST, 0x4, B30 | IMM3, OP3PCREL8, DATA, E}}}, |
{O (O_BRABS, SB), AV_H8SX, 0, "bra/bs", {{IMM3, RDIND, OP3PCREL8}}, {{0x7, 0xC, B30 | RDIND, 0x0, 0x4, B31 | IMM3, OP3PCREL8, DATA, E}}}, |
{O (O_BRABS, SB), AV_H8SX, 0, "bra/bs", {{IMM3, ABS8DST, OP3PCREL8}}, {{0x7, 0xE, DSTABS8LIST, 0x4, B31 | IMM3, OP3PCREL8, DATA, E}}}, |
{O (O_BRABS, SB), AV_H8SX, 0, "bra/bs", {{IMM3, ABS16DST, OP3PCREL8}}, {{0x6, 0xA, 0x1, 0x0, DSTABS16LIST, 0x4, B31 | IMM3, OP3PCREL8, DATA, E}}}, |
{O (O_BRABS, SB), AV_H8SX, 0, "bra/bs", {{IMM3, ABS32DST, OP3PCREL8}}, {{0x6, 0xA, 0x3, 0x0, DSTABS32LIST, 0x4, B31 | IMM3, OP3PCREL8, DATA, E}}}, |
{O (O_BRABC, SB), AV_H8SX, 0, "bra/bc", {{IMM3, RDIND, OP3PCREL16}}, {{0x7, 0xC, B30 | RDIND, 0x0, 0x5, 0x8, B30 | IMM3, 0x0, OP3PCREL16, DATA3, E}}}, |
{O (O_BRABC, SB), AV_H8SX, 0, "bra/bc", {{IMM3, ABS8DST, OP3PCREL16}}, {{0x7, 0xE, DSTABS8LIST, 0x5, 0x8, B30 | IMM3, 0x0, OP3PCREL16, DATA3, E}}}, |
{O (O_BRABC, SB), AV_H8SX, 0, "bra/bc", {{IMM3, ABS16DST, OP3PCREL16}}, {{0x6, 0xA, 0x1, 0x0, DSTABS16LIST, 0x5, 0x8, B30 | IMM3, 0x0, OP3PCREL16, DATA3, E}}}, |
{O (O_BRABC, SB), AV_H8SX, 0, "bra/bc", {{IMM3, ABS32DST, OP3PCREL16}}, {{0x6, 0xA, 0x3, 0x0, DSTABS32LIST, 0x5, 0x8, B30 | IMM3, 0x0, OP3PCREL16, DATA3, E}}}, |
{O (O_BRABS, SB), AV_H8SX, 0, "bra/bs", {{IMM3, RDIND, OP3PCREL16}}, {{0x7, 0xC, B30 | RDIND, 0x0, 0x5, 0x8, B31 | IMM3, 0x0, OP3PCREL16, DATA3, E}}}, |
{O (O_BRABS, SB), AV_H8SX, 0, "bra/bs", {{IMM3, ABS8DST, OP3PCREL16}}, {{0x7, 0xE, DSTABS8LIST, 0x5, 0x8, B31 | IMM3, 0x0, OP3PCREL16, DATA3, E}}}, |
{O (O_BRABS, SB), AV_H8SX, 0, "bra/bs", {{IMM3, ABS16DST, OP3PCREL16}}, {{0x6, 0xA, 0x1, 0x0, DSTABS16LIST, 0x5, 0x8, B31 | IMM3, 0x0, OP3PCREL16, DATA3, E}}}, |
{O (O_BRABS, SB), AV_H8SX, 0, "bra/bs", {{IMM3, ABS32DST, OP3PCREL16}}, {{0x6, 0xA, 0x3, 0x0, DSTABS32LIST, 0x5, 0x8, B31 | IMM3, 0x0, OP3PCREL16, DATA3, E}}}, |
{O (O_BRAS, SB), AV_H8SX, 0, "bra/s", {{PCREL8, E}}, {{0x4, 0x0, PCREL8, DATA | B01, E}}}, |
{O (O_BSRBC, SB), AV_H8SX, 0, "bsr/bc", {{IMM3, RDIND, OP3PCREL16}}, {{0x7, 0xC, B30 | RDIND, 0x0, 0x5, 0xC, B30 | IMM3, 0x0, OP3PCREL16, DATA3, E}}}, |
{O (O_BSRBC, SB), AV_H8SX, 0, "bsr/bc", {{IMM3, ABS8DST, OP3PCREL16}}, {{0x7, 0xE, DSTABS8LIST, 0x5, 0xC, B30 | IMM3, 0x0, OP3PCREL16, DATA3, E}}}, |
{O (O_BSRBC, SB), AV_H8SX, 0, "bsr/bc", {{IMM3, ABS16DST, OP3PCREL16}}, {{0x6, 0xA, 0x1, 0x0, DSTABS16LIST, 0x5, 0xC, B30 | IMM3, 0x0, OP3PCREL16, DATA3, E}}}, |
{O (O_BSRBC, SB), AV_H8SX, 0, "bsr/bc", {{IMM3, ABS32DST, OP3PCREL16}}, {{0x6, 0xA, 0x3, 0x0, DSTABS32LIST, 0x5, 0xC, B30 | IMM3, 0x0, OP3PCREL16, DATA3, E}}}, |
{O (O_BSRBS, SB), AV_H8SX, 0, "bsr/bs", {{IMM3, RDIND, OP3PCREL16}}, {{0x7, 0xC, B30 | RDIND, 0x0, 0x5, 0xC, B31 | IMM3, 0x0, OP3PCREL16, DATA3, E}}}, |
{O (O_BSRBS, SB), AV_H8SX, 0, "bsr/bs", {{IMM3, ABS8DST, OP3PCREL16}}, {{0x7, 0xE, DSTABS8LIST, 0x5, 0xC, B31 | IMM3, 0x0, OP3PCREL16, DATA3, E}}}, |
{O (O_BSRBS, SB), AV_H8SX, 0, "bsr/bs", {{IMM3, ABS16DST, OP3PCREL16}}, {{0x6, 0xA, 0x1, 0x0, DSTABS16LIST, 0x5, 0xC, B31 | IMM3, 0x0, OP3PCREL16, DATA3, E}}}, |
{O (O_BSRBS, SB), AV_H8SX, 0, "bsr/bs", {{IMM3, ABS32DST, OP3PCREL16}}, {{0x6, 0xA, 0x3, 0x0, DSTABS32LIST, 0x5, 0xC, B31 | IMM3, 0x0, OP3PCREL16, DATA3, E}}}, |
BRANCH (O (O_BRA, SB), "bt", 0x0), |
BRANCH (O (O_BRN, SB), "brn", 0x1), |
BRANCH (O (O_BRN, SB), "bf", 0x1), |
BRANCH (O (O_BHI, SB), "bhi", 0x2), |
BRANCH (O (O_BLS, SB), "bls", 0x3), |
BRANCH (O (O_BCC, SB), "bcc", 0x4), |
BRANCH (O (O_BCC, SB), "bhs", 0x4), |
BRANCH (O (O_BCS, SB), "bcs", 0x5), |
BRANCH (O (O_BCS, SB), "blo", 0x5), |
BRANCH (O (O_BNE, SB), "bne", 0x6), |
BRANCH (O (O_BEQ, SB), "beq", 0x7), |
BRANCH (O (O_BVC, SB), "bvc", 0x8), |
BRANCH (O (O_BVS, SB), "bvs", 0x9), |
BRANCH (O (O_BPL, SB), "bpl", 0xA), |
BRANCH (O (O_BMI, SB), "bmi", 0xB), |
BRANCH (O (O_BGE, SB), "bge", 0xC), |
BRANCH (O (O_BLT, SB), "blt", 0xD), |
BRANCH (O (O_BGT, SB), "bgt", 0xE), |
BRANCH (O (O_BLE, SB), "ble", 0xF), |
EBITOP (O (O_BCLR, SB), IMM3 | B30, "bclr", 0x6, 0x2, 0x7, 0xD, 0x7, 0xF, 0x8, 0), |
BITOP (O (O_BAND, SB), IMM3 | B30, "band", 0x7, 0x6, 0x7, 0xC, 0x7, 0xE, 0x0, 0), |
BITOP (O (O_BIAND, SB), IMM3 | B31, "biand", 0x7, 0x6, 0x7, 0xC, 0x7, 0xE, 0x0, 0), |
BITOP (O (O_BILD, SB), IMM3 | B31, "bild", 0x7, 0x7, 0x7, 0xC, 0x7, 0xE, 0x0, 0), |
BITOP (O (O_BIOR, SB), IMM3 | B31, "bior", 0x7, 0x4, 0x7, 0xC, 0x7, 0xE, 0x0, 0), |
BITOP (O (O_BIST, SB), IMM3 | B31, "bist", 0x6, 0x7, 0x7, 0xD, 0x7, 0xF, 0x8, 0), |
BITOP (O (O_BIXOR, SB), IMM3 | B31, "bixor", 0x7, 0x5, 0x7, 0xC, 0x7, 0xE, 0x0, 0), |
BITOP (O (O_BLD, SB), IMM3 | B30, "bld", 0x7, 0x7, 0x7, 0xC, 0x7, 0xE, 0x0, 0), |
EBITOP (O (O_BNOT, SB), IMM3 | B30, "bnot", 0x6, 0x1, 0x7, 0xD, 0x7, 0xF, 0x8, 0), |
BITOP (O (O_BOR, SB), IMM3 | B30, "bor", 0x7, 0x4, 0x7, 0xC, 0x7, 0xE, 0x0, 0), |
EBITOP (O (O_BSET, SB), IMM3 | B30, "bset", 0x6, 0x0, 0x7, 0xD, 0x7, 0xF, 0x8, 0), |
BITOP (O (O_BST, SB), IMM3 | B30, "bst", 0x6, 0x7, 0x7, 0xD, 0x7, 0xF, 0x8, 0), |
EBITOP (O (O_BTST, SB), IMM3 | B30, "btst", 0x6, 0x3, 0x7, 0xC, 0x7, 0xE, 0x0, 0), |
BITOP (O (O_BXOR, SB), IMM3 | B30, "bxor", 0x7, 0x5, 0x7, 0xC, 0x7, 0xE, 0x0, 0), |
EBITOP_B (O (O_BCLREQ, SB), IMM3 | B30, "bclr/eq", 0x6, 0x2, 0x7, 0xD, 0x7, 0xF, 0x8, 0x7), |
EBITOP_B (O (O_BCLRNE, SB), IMM3 | B30, "bclr/ne", 0x6, 0x2, 0x7, 0xD, 0x7, 0xF, 0x8, 0x6), |
EBITOP_B (O (O_BSETEQ, SB), IMM3 | B30, "bset/eq", 0x6, 0x0, 0x7, 0xD, 0x7, 0xF, 0x8, 0x7), |
EBITOP_B (O (O_BSETNE, SB), IMM3 | B30, "bset/ne", 0x6, 0x0, 0x7, 0xD, 0x7, 0xF, 0x8, 0x6), |
BITOP_B (O (O_BISTZ, SB), IMM3 | B31, "bistz", 0x6, 0x7, 0x7, 0xD, 0x7, 0xF, 0x8, 0x7), |
BITOP_B (O (O_BSTZ, SB), IMM3 | B30, "bstz", 0x6, 0x7, 0x7, 0xD, 0x7, 0xF, 0x8, 0x7), |
{O (O_BFLD, SB), AV_H8SX, 0, "bfld", {{IMM8, RDIND, R3_8}}, {{0x7, 0xC, B30 | RDIND, 0x0, 0xF, R3_8, IMM8LIST, E}}}, |
{O (O_BFLD, SB), AV_H8SX, 0, "bfld", {{IMM8, ABS8DST, R3_8}}, {{0x7, 0xE, DSTABS8LIST, 0xF, R3_8, IMM8LIST, E}}}, |
{O (O_BFLD, SB), AV_H8SX, 0, "bfld", {{IMM8, ABS16DST, R3_8}}, {{0x6, 0xA, 0x1, 0x0, DSTABS16LIST, 0xF, R3_8, IMM8LIST, E}}}, |
{O (O_BFLD, SB), AV_H8SX, 0, "bfld", {{IMM8, ABS32DST, R3_8}}, {{0x6, 0xA, 0x3, 0x0, DSTABS32LIST, 0xF, R3_8, IMM8LIST, E}}}, |
/* Because the assembler treats SRC, DST and OP3 as ordinals, |
I must designate the second argument, an immediate value, as DST. |
May God have mercy on my soul. */ |
{O (O_BFST, SB), AV_H8SX, 0, "bfst", {{RS8, DST | IMM8, R3_IND}}, {{0x7, 0xD, B30 | R3_IND, 0x0, 0xF, RS8, DST | IMM8LIST, E}}}, |
{O (O_BFST, SB), AV_H8SX, 0, "bfst", {{RS8, DST | IMM8, ABS8OP3}}, {{0x7, 0xF, OP3ABS8LIST, 0xF, RS8, DST | IMM8LIST, E}}}, |
{O (O_BFST, SB), AV_H8SX, 0, "bfst", {{RS8, DST | IMM8, ABS16OP3}}, {{0x6, 0xA, 0x1, 0x8, OP3ABS16LIST, 0xF, RS8, DST | IMM8LIST, E}}}, |
{O (O_BFST, SB), AV_H8SX, 0, "bfst", {{RS8, DST | IMM8, ABS32OP3}}, {{0x6, 0xA, 0x3, 0x8, OP3ABS32LIST, 0xF, RS8, DST | IMM8LIST, E}}}, |
{O (O_BSR, SB), AV_H8, 6, "bsr", {{PCREL8, E}}, {{0x5, 0x5, PCREL8, DATA, E}}}, |
{O (O_BSR, SB), AV_H8, 6, "bsr", {{PCREL16, E}}, {{0x5, 0xC, 0x0, 0x0, PCREL16, DATA3, E}}}, |
{O (O_BSR, SB), AV_H8SX, 0, "bsr", {{LOWREG | L_8, E}}, {{0x5, 0xd, B30 | LOWREG | L_8, 0x5, E}}}, |
{O (O_BSR, SW), AV_H8SX, 0, "bsr", {{LOWREG | L_16, E}}, {{0x5, 0xd, B30 | LOWREG | L_16, 0x6, E}}}, |
{O (O_BSR, SL), AV_H8SX, 0, "bsr", {{OR32, E}}, {{0x5, 0xd, B30 | OR32, 0x7, E}}}, |
{O (O_CMP, SB), AV_H8, 2, "cmp.b", {{IMM8, RD8, E}}, {{0xa, RD8, IMM8LIST, E}}}, |
EXPAND_TWOOP_B (O (O_CMP, SB), "cmp.b", 0xa, 0x1, 0xc, 0x2, B00), |
{O (O_CMP, SW), AV_H8, 2, "cmp.w", {{RS16, RD16, E}}, {{0x1, 0xd, RS16, RD16, E}}}, |
{O (O_CMP, SW), AV_H8SX, 0, "cmp.w", {{IMM3NZ_NS, RD16, E}}, {{0x1, 0xf, B30 | IMM3NZ, RD16, E}}}, |
{O (O_CMP, SW), AV_H8SX, 0, "cmp.w", {{IMM3NZ_NS, RDIND, E}}, {{0x7, 0xd, B31 | RDIND, IGNORE, 0x1, 0xf, B30 | IMM3NZ, IGNORE, E}}}, |
{O (O_CMP, SW), AV_H8SX, 0, "cmp.w", {{IMM3NZ_NS, ABS16DST, E}}, {{0x6, 0xb, 0x1, B31 | IGNORE, DSTABS16LIST, 0x1, 0xf, B30 | IMM3NZ, IGNORE, E}}}, |
{O (O_CMP, SW), AV_H8SX, 0, "cmp.w", {{IMM3NZ_NS, ABS32DST, E}}, {{0x6, 0xb, 0x3, B31 | IGNORE, DSTABS32LIST, 0x1, 0xf, B30 | IMM3NZ, IGNORE, E}}}, |
EXPAND_TWOOP_W (O (O_CMP, SW), "cmp.w", 0x1, 0xd, 0x2), |
{O (O_CMP, SL), AV_H8H, 6, "cmp.l", {{RS32, RD32, E}}, {{0x1, 0xf, B31 | RS32, B30 | RD32, E}}}, |
{O (O_CMP, SL), AV_H8SX, 0, "cmp.l", {{IMM3NZ_NS, RD32, E}}, {{0x1, 0xf, B31 | IMM3NZ, B31 | RD32, E}}}, |
EXPAND_TWOOP_L (O (O_CMP, SL), "cmp.l", 0x2), |
UNOP (O (O_DAA, SB), "daa", 0x0, 0xF), |
UNOP (O (O_DAS, SB), "das", 0x1, 0xF), |
UNOP (O (O_DEC, SB), "dec.b", 0x1, 0xA), |
{O (O_DEC, SW), AV_H8H, 2, "dec.w", {{DBIT, RD16, E}}, {{0x1, 0xB, 0x5 | DBIT, RD16, E}}}, |
{O (O_DEC, SL), AV_H8H, 2, "dec.l", {{DBIT, RD32, E}}, {{0x1, 0xB, 0x7 | DBIT, RD32 | B30, E}}}, |
{O (O_DIVS, SW), AV_H8SX, 0, "divs.w", {{IMM4, RD16, E}}, {{0x0, 0x1, 0xd, 0x6, 0x5, 0x1, IMM4, RD16, E}}}, |
{O (O_DIVS, SW), AV_H8SX, 0, "divs.w", {{RS16, RD16, E}}, {{0x0, 0x1, 0xd, 0x2, 0x5, 0x1, RS16, RD16, E}}}, |
{O (O_DIVS, SL), AV_H8SX, 0, "divs.l", {{IMM4, RD32, E}}, {{0x0, 0x1, 0xd, 0x6, 0x5, 0x3, IMM4, B30 | RD32, E}}}, |
{O (O_DIVS, SL), AV_H8SX, 0, "divs.l", {{RS32, RD32, E}}, {{0x0, 0x1, 0xd, 0x2, 0x5, 0x3, B30 | RS32, B30 | RD32, E}}}, |
{O (O_DIVU, SW), AV_H8SX, 0, "divu.w", {{IMM4, RD16, E}}, {{0x0, 0x1, 0xd, 0xe, 0x5, 0x1, IMM4, RD16, E}}}, |
{O (O_DIVU, SW), AV_H8SX, 0, "divu.w", {{RS16, RD16, E}}, {{0x0, 0x1, 0xd, 0xa, 0x5, 0x1, RS16, RD16, E}}}, |
{O (O_DIVU, SL), AV_H8SX, 0, "divu.l", {{IMM4, RD32, E}}, {{0x0, 0x1, 0xd, 0xe, 0x5, 0x3, IMM4, B30 | RD32, E}}}, |
{O (O_DIVU, SL), AV_H8SX, 0, "divu.l", {{RS32, RD32, E}}, {{0x0, 0x1, 0xd, 0xa, 0x5, 0x3, B30 | RS32, B30 | RD32, E}}}, |
{O (O_DIVXS, SB), AV_H8SX, 0, "divxs.b", {{IMM4, RD16, E}}, {{0x0, 0x1, 0xD, 0x4, 0x5, 0x1, IMM4, RD16, E}}}, |
{O (O_DIVXS, SB), AV_H8H, 13, "divxs.b", {{RS8, RD16, E}}, {{0x0, 0x1, 0xD, 0x0, 0x5, 0x1, RS8, RD16, E}}}, |
{O (O_DIVXS, SW), AV_H8SX, 0, "divxs.w", {{IMM4, RD32, E}}, {{0x0, 0x1, 0xD, 0x4, 0x5, 0x3, IMM4, B30 | RD32, E}}}, |
{O (O_DIVXS, SW), AV_H8H, 21, "divxs.w", {{RS16, RD32, E}}, {{0x0, 0x1, 0xD, 0x0, 0x5, 0x3, RS16, B30 | RD32, E}}}, |
{O (O_DIVXU, SB), AV_H8SX, 0, "divxu.b", {{IMM4, RD16, E}}, {{0x0, 0x1, 0xD, 0xC, 0x5, 0x1, IMM4, RD16, E}}}, |
{O (O_DIVXU, SB), AV_H8, 13, "divxu.b", {{RS8, RD16, E}}, {{0x5, 0x1, RS8, RD16, E}}}, |
{O (O_DIVXU, SW), AV_H8SX, 0, "divxu.w", {{IMM4, RD32, E}}, {{0x0, 0x1, 0xD, 0xC, 0x5, 0x3, IMM4, B30 | RD32, E}}}, |
{O (O_DIVXU, SW), AV_H8H, 21, "divxu.w", {{RS16, RD32, E}}, {{0x5, 0x3, RS16, B30 | RD32, E}}}, |
{O (O_EEPMOV, SB), AV_H8, 4, "eepmov.b", {{E}}, {{0x7, 0xB, 0x5, 0xC, 0x5, 0x9, 0x8, 0xF, E}}}, |
{O (O_EEPMOV, SW), AV_H8H, 4, "eepmov.w", {{E}}, {{0x7, 0xB, 0xD, 0x4, 0x5, 0x9, 0x8, 0xF, E}}}, |
EXPAND_UNOP_STD_W (O (O_EXTS, SW), "exts.w", PREFIX_015, 0x1, 0x7, 0xd), |
EXPAND_UNOP_STD_L (O (O_EXTS, SL), "exts.l", PREFIX_010, 0x1, 0x7, 0xf), |
EXPAND_UNOP_EXTENDED_L (O (O_EXTS, SL), "exts.l", CONST_2, PREFIX_010, 0x1, 0x7, 0xe, 0), |
EXPAND_UNOP_STD_W (O (O_EXTU, SW), "extu.w", PREFIX_015, 0x1, 0x7, 0x5), |
EXPAND_UNOP_STD_L (O (O_EXTU, SL), "extu.l", PREFIX_010, 0x1, 0x7, 0x7), |
EXPAND_UNOP_EXTENDED_L (O (O_EXTU, SL), "extu.l", CONST_2, PREFIX_010, 0x1, 0x7, 0x6, 0), |
UNOP (O (O_INC, SB), "inc", 0x0, 0xA), |
{O (O_INC, SW), AV_H8H, 2, "inc.w", {{DBIT, RD16, E}}, {{0x0, 0xB, 0x5 | DBIT, RD16, E}}}, |
{O (O_INC, SL), AV_H8H, 2, "inc.l", {{DBIT, RD32, E}}, {{0x0, 0xB, 0x7 | DBIT, RD32 | B30, E}}}, |
{O (O_JMP, SN), AV_H8, 4, "jmp", {{RSIND, E}}, {{0x5, 0x9, B30 | RSIND, 0x0, E}}}, |
{O (O_JMP, SN), AV_H8, 6, "jmp", {{ABSJMP | L_24, E}}, {{0x5, 0xA, SRC | ABSJMP | L_24, DATA5, E}}}, |
{O (O_JMP, SN), AV_H8SX, 0, "jmp", {{ABSJMP | L_32, E}}, {{0x5, 0x9, 0x0, 0x8, ABSJMP | L_32, DATA7, E}}}, |
{O (O_JMP, SN), AV_H8, 8, "jmp", {{MEMIND, E}}, {{0x5, 0xB, SRC | MEMIND, DATA, E}}}, |
{O (O_JMP, SN), AV_H8SX, 0, "jmp", {{VECIND, E}}, {{0x5, 0x9, B31 | SRC | VECIND, DATA, E}}}, |
{O (O_JSR, SN), AV_H8, 6, "jsr", {{RSIND, E}}, {{0x5, 0xD, B30 | RSIND, 0x0, E}}}, |
{O (O_JSR, SN), AV_H8, 8, "jsr", {{ABSJMP | L_24, E}}, {{0x5, 0xE, SRC | ABSJMP | L_24, DATA5, E}}}, |
{O (O_JSR, SN), AV_H8SX, 0, "jsr", {{ABSJMP | L_32, E}}, {{0x5, 0xD, 0x0, 0x8, ABSJMP | L_32, DATA7, E}}}, |
{O (O_JSR, SN), AV_H8, 8, "jsr", {{MEMIND, E}}, {{0x5, 0xF, SRC | MEMIND, DATA, E}}}, |
{O (O_JSR, SN), AV_H8SX, 8, "jsr", {{VECIND, E}}, {{0x5, 0xD, SRC | VECIND, DATA, E}}}, |
{O (O_LDC, SB), AV_H8, 2, "ldc", {{IMM8, CCR | DST, E}}, {{ 0x0, 0x7, IMM8LIST, E}}}, |
{O (O_LDC, SB), AV_H8S, 2, "ldc", {{IMM8, EXR | DST, E}}, {{0x0, 0x1, 0x4, EXR | DST, 0x0, 0x7, IMM8LIST, E}}}, |
{O (O_LDC, SB), AV_H8, 2, "ldc", {{RS8, CCR | DST, E}}, {{0x0, 0x3, B30 | CCR | DST, RS8, E}}}, |
{O (O_LDC, SB), AV_H8S, 2, "ldc", {{RS8, EXR | DST, E}}, {{0x0, 0x3, B30 | EXR | DST, RS8, E}}}, |
{O (O_LDC, SW), AV_H8H, 2, "ldc", {{RSIND, CCR | DST, E}}, {{PREFIXLDC, 0x6, 0x9, B30 | RSIND, IGNORE, E}}}, |
{O (O_LDC, SW), AV_H8S, 2, "ldc", {{RSIND, EXR | DST, E}}, {{PREFIXLDC, 0x6, 0x9, B30 | RSIND, IGNORE, E}}}, |
{O (O_LDC, SW), AV_H8H, 2, "ldc", {{RSPOSTINC, CCR | DST, E}}, {{PREFIXLDC, 0x6, 0xD, B30 | RSPOSTINC, IGNORE, E}}}, |
{O (O_LDC, SW), AV_H8S, 2, "ldc", {{RSPOSTINC, EXR | DST, E}}, {{PREFIXLDC, 0x6, 0xD, B30 | RSPOSTINC, IGNORE, E}}}, |
{O (O_LDC, SW), AV_H8H, 2, "ldc", {{DISP16SRC, CCR | DST, E}}, {{PREFIXLDC, 0x6, 0xF, B30 | DISPREG, IGNORE, SRC | DISP16LIST, E}}}, |
{O (O_LDC, SW), AV_H8S, 2, "ldc", {{DISP16SRC, EXR | DST, E}}, {{PREFIXLDC, 0x6, 0xF, B30 | DISPREG, IGNORE, SRC | DISP16LIST, E}}}, |
{O (O_LDC, SW), AV_H8H, 2, "ldc", {{DISP32SRC, CCR | DST, E}}, {{PREFIXLDC, 0x7, 0x8, B30 | DISPREG, 0x0, 0x6, 0xB, 0x2, IGNORE, SRC | DISP32LIST, E}}}, |
{O (O_LDC, SW), AV_H8S, 2, "ldc", {{DISP32SRC, EXR | DST, E}}, {{PREFIXLDC, 0x7, 0x8, B30 | DISPREG, 0x0, 0x6, 0xB, 0x2, IGNORE, SRC | DISP32LIST, E}}}, |
{O (O_LDC, SW), AV_H8H, 2, "ldc", {{ABS16SRC, CCR | DST, E}}, {{PREFIXLDC, 0x6, 0xB, 0x0, IGNORE, SRC | ABS16LIST, E}}}, |
{O (O_LDC, SW), AV_H8S, 2, "ldc", {{ABS16SRC, EXR | DST, E}}, {{PREFIXLDC, 0x6, 0xB, 0x0, IGNORE, SRC | ABS16LIST, E}}}, |
{O (O_LDC, SW), AV_H8H, 2, "ldc", {{ABS32SRC, CCR | DST, E}}, {{PREFIXLDC, 0x6, 0xB, 0x2, IGNORE, SRC | MEMRELAX | ABS32LIST, E}}}, |
{O (O_LDC, SW), AV_H8S, 2, "ldc", {{ABS32SRC, EXR | DST, E}}, {{PREFIXLDC, 0x6, 0xB, 0x2, IGNORE, SRC | MEMRELAX | ABS32LIST, E}}}, |
{O (O_LDC, SL), AV_H8SX, 0, "ldc", {{RS32, B30 | VBR_SBR | DST, E}}, {{0x0, 0x3, B30 | VBR_SBR | DST, RS32, E}}}, |
{O (O_MOV, SB), AV_H8, 2, "mov.b", {{IMM8, RD8, E}}, {{0xF, RD8, IMM8LIST, E}}}, |
{O (O_MOV, SB), AV_H8SX, 0, "mov.b", {{IMM4_NS, ABS16DST, E}}, {{0x6, 0xa, 0xd, IMM4, DSTABS16LIST, E}}}, |
{O (O_MOV, SB), AV_H8SX, 0, "mov.b", {{IMM4_NS, ABS32DST, E}}, {{0x6, 0xa, 0xf, IMM4, DSTABS32LIST, E}}}, |
MOVFROM_IMM8 (O (O_MOV, SB), PREFIX_017D, "mov.b", IMM8), |
{O (O_MOV, SB), AV_H8, 2, "mov.b", {{RS8, RD8, E}}, {{0x0, 0xC, RS8, RD8, E}}}, |
MOVFROM_REG_BW (O (O_MOV, SB), "mov.b", RS8, PREFIX_017, 8, 10, 12, 14, MEMRELAX), |
{O (O_MOV, SB), AV_H8, 4, "mov.b", {{RS8, ABS8DST, E}}, {{0x3, RS8, DSTABS8LIST, E}}}, |
MOVTO_REG_BW (O (O_MOV, SB), "mov.b", RD8, PREFIX_017, 8, 10, 12, 14, MEMRELAX), |
{O (O_MOV, SB), AV_H8, 4, "mov.b", {{ABS8SRC, RD8, E}}, {{0x2, RD8, ABS8LIST, E}}}, |
MOVFROM_STD (O (O_MOV, SB), PREFIX_0178, "mov.b", RSIND, FROM_IND), |
MOVFROM_STD (O (O_MOV, SB), PREFIX_0178, "mov.b", RSPOSTINC, FROM_POSTINC), |
MOVFROM_STD (O (O_MOV, SB), PREFIX_0178, "mov.b", RSPOSTDEC, FROM_POSTDEC), |
MOVFROM_STD (O (O_MOV, SB), PREFIX_0178, "mov.b", RSPREINC, FROM_PREINC), |
MOVFROM_STD (O (O_MOV, SB), PREFIX_0178, "mov.b", RSPREDEC, FROM_PREDEC), |
MOVFROM_STD (O (O_MOV, SB), PREFIX_0178, "mov.b", DISP2SRC, FROM_DISP2), |
MOVFROM_AD (O (O_MOV, SB), PREFIX_0178, "mov.b", DISP16SRC, FROM_DISP16, DISP16LIST), |
MOVFROM_AD (O (O_MOV, SB), PREFIX_0178, "mov.b", DISP32SRC, FROM_DISP32, DISP32LIST), |
MOVFROM_AD (O (O_MOV, SB), PREFIX_0178, "mov.b", INDEXB16, FROM_DISP16B, DISP16LIST), |
MOVFROM_AD (O (O_MOV, SB), PREFIX_0178, "mov.b", INDEXW16, FROM_DISP16W, DISP16LIST), |
MOVFROM_AD (O (O_MOV, SB), PREFIX_0178, "mov.b", INDEXL16, FROM_DISP16L, DISP16LIST), |
MOVFROM_AD (O (O_MOV, SB), PREFIX_0178, "mov.b", INDEXB32, FROM_DISP32B, DISP32LIST), |
MOVFROM_AD (O (O_MOV, SB), PREFIX_0178, "mov.b", INDEXW32, FROM_DISP32W, DISP32LIST), |
MOVFROM_AD (O (O_MOV, SB), PREFIX_0178, "mov.b", INDEXL32, FROM_DISP32L, DISP32LIST), |
MOVFROM_AD (O (O_MOV, SB), PREFIX_0178, "mov.b", ABS16SRC, FROM_ABS16, ABS16LIST), |
MOVFROM_AD (O (O_MOV, SB), PREFIX_0178, "mov.b", ABS32SRC, FROM_ABS32, ABS32LIST), |
{O (O_MOV, SW), AV_H8SX, 0, "mov.w", {{IMM3NZ_NS, RD16, E}}, {{0x0, 0xf, B30 | IMM3NZ, RD16, E}}}, |
{O (O_MOV, SW), AV_H8, 4, "mov.w", {{IMM16, RD16, E}}, {{0x7, 0x9, 0x0, RD16, IMM16LIST, E}}}, |
{O (O_MOV, SW), AV_H8SX, 0, "mov.w", {{IMM4_NS, ABS16DST, E}}, {{0x6, 0xb, 0xd, IMM4, DSTABS16LIST, E}}}, |
{O (O_MOV, SW), AV_H8SX, 0, "mov.w", {{IMM4_NS, ABS32DST, E}}, {{0x6, 0xb, 0xf, IMM4, DSTABS32LIST, E}}}, |
MOVFROM_IMM8 (O (O_MOV, SW), PREFIX_015D, "mov.w", IMM8U_NS), |
MOVFROM_IMM (O (O_MOV, SW), PREFIX_7974, "mov.w", IMM16, IMM16LIST), |
{O (O_MOV, SW), AV_H8, 2, "mov.w", {{RS16, RD16, E}}, {{0x0, 0xD, RS16, RD16, E}}}, |
MOVFROM_REG_BW (O (O_MOV, SW), "mov.w", RS16, PREFIX_015, 9, 11, 13, 15, 0), |
MOVTO_REG_BW (O (O_MOV, SW), "mov.w", RD16, PREFIX_015, 9, 11, 13, 15, 0), |
MOVFROM_STD (O (O_MOV, SW), PREFIX_0158, "mov.w", RSIND, FROM_IND), |
MOVFROM_STD (O (O_MOV, SW), PREFIX_0158, "mov.w", RSPOSTINC, FROM_POSTINC), |
MOVFROM_STD (O (O_MOV, SW), PREFIX_0158, "mov.w", RSPOSTDEC, FROM_POSTDEC), |
MOVFROM_STD (O (O_MOV, SW), PREFIX_0158, "mov.w", RSPREINC, FROM_PREINC), |
MOVFROM_STD (O (O_MOV, SW), PREFIX_0158, "mov.w", RSPREDEC, FROM_PREDEC), |
MOVFROM_STD (O (O_MOV, SW), PREFIX_0158, "mov.w", DISP2SRC, FROM_DISP2), |
MOVFROM_AD (O (O_MOV, SW), PREFIX_0158, "mov.w", DISP16SRC, FROM_DISP16, DISP16LIST), |
MOVFROM_AD (O (O_MOV, SW), PREFIX_0158, "mov.w", DISP32SRC, FROM_DISP32, DISP32LIST), |
MOVFROM_AD (O (O_MOV, SW), PREFIX_0158, "mov.w", INDEXB16, FROM_DISP16B, DISP16LIST), |
MOVFROM_AD (O (O_MOV, SW), PREFIX_0158, "mov.w", INDEXW16, FROM_DISP16W, DISP16LIST), |
MOVFROM_AD (O (O_MOV, SW), PREFIX_0158, "mov.w", INDEXL16, FROM_DISP16L, DISP16LIST), |
MOVFROM_AD (O (O_MOV, SW), PREFIX_0158, "mov.w", INDEXB32, FROM_DISP32B, DISP32LIST), |
MOVFROM_AD (O (O_MOV, SW), PREFIX_0158, "mov.w", INDEXW32, FROM_DISP32W, DISP32LIST), |
MOVFROM_AD (O (O_MOV, SW), PREFIX_0158, "mov.w", INDEXL32, FROM_DISP32L, DISP32LIST), |
MOVFROM_AD (O (O_MOV, SW), PREFIX_0158, "mov.w", ABS16SRC, FROM_ABS16, ABS16LIST), |
MOVFROM_AD (O (O_MOV, SW), PREFIX_0158, "mov.w", ABS32SRC, FROM_ABS32, ABS32LIST), |
{O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{IMM3NZ_NS, RD32, E}}, {{0x0, 0xf, B31 | IMM3NZ, B31 | RD32, E}}}, |
MOVFROM_IMM8 (O (O_MOV, SL), PREFIX_010D, "mov.l", IMM8U_NS), |
MOVFROM_IMM (O (O_MOV, SL), PREFIX_7A7C, "mov.l", IMM16U_NS, IMM16ULIST), |
{O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{IMM16U_NS, RD32, E}}, {{0x7, 0xa, 0x0, B31 | RD32, IMM16ULIST, E}}}, |
{O (O_MOV, SL), AV_H8H, 4, "mov.l", {{IMM32, RD32, E}}, {{0x7, 0xa, 0x0, B30 | RD32, IMM32LIST, E}}}, |
MOVFROM_IMM (O (O_MOV, SL), PREFIX_7A74, "mov.l", IMM32, IMM32LIST), |
{O (O_MOV, SL), AV_H8H, 2, "mov.l", {{RS32, RD32, E}}, {{0x0, 0xf, B31 | RS32, B30 | RD32, E}}}, |
{O (O_MOV, SL), AV_H8H, 6, "mov.l", {{RS32, RDIND, E}}, {{PREFIX_0100, 0x6, 0x9, B31 | RDIND, B30 | RS32, E}}}, |
{O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{RS32, RDPOSTINC, E}}, {{PREFIX_0103, 0x6, 0xd, B31 | RDPOSTINC, RS32, E}}}, |
{O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{RS32, RDPOSTDEC, E}}, {{PREFIX_0101, 0x6, 0xd, B31 | RDPOSTDEC, RS32, E}}}, |
{O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{RS32, RDPREINC, E}}, {{PREFIX_0102, 0x6, 0xd, B31 | RDPREINC, RS32, E}}}, |
{O (O_MOV, SL), AV_H8H, 6, "mov.l", {{RS32, RDPREDEC, E}}, {{PREFIX_0100, 0x6, 0xd, B31 | RDPREDEC, RS32, E}}}, |
{O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{RS32, DISP2DST, E}}, {{PREFIX_010, B30 | B20 | DISP2DST, 0x6, 0x9, B31 | DSTDISPREG, RS32, E}}}, |
{O (O_MOV, SL), AV_H8H, 6, "mov.l", {{RS32, DISP16DST, E}}, {{PREFIX_0100, 0x6, 0xf, B31 | DSTDISPREG, RS32, DSTDISP16LIST, E}}}, |
{O (O_MOV, SL), AV_H8SX, 6, "mov.l", {{RS32, DISP32DST, E}}, {{0x7, 0x8, B31 | DSTDISPREG, 0x0, 0x6, 0xb, 0xa, RS32, DSTDISP32LIST, E}}}, |
{O (O_MOV, SL), AV_H8H, 6, "mov.l", {{RS32, DISP32DST, E}}, {{PREFIX_0100, 0x7, 0x8, B31 | DSTDISPREG, 0x0, 0x6, 0xb, 0xa, RS32, MEMRELAX | DSTDISP32LIST, E}}}, |
{O (O_MOV, SL), AV_H8H, 6, "mov.l", {{RS32, DISP32DST, E}}, {{PREFIX_0100, 0x7, 0x8, DSTDISPREG, 0x0, 0x6, 0xb, 0xa, RS32, MEMRELAX | DSTDISP32LIST, E}}}, |
{O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{RS32, INDEXB16D, E}}, {{PREFIX_0101, 0x6, 0xf, B31 | DSTDISPREG, RS32, DSTDISP16LIST, E}}}, |
{O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{RS32, INDEXW16D, E}}, {{PREFIX_0102, 0x6, 0xf, B31 | DSTDISPREG, RS32, DSTDISP16LIST, E}}}, |
{O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{RS32, INDEXL16D, E}}, {{PREFIX_0103, 0x6, 0xf, B31 | DSTDISPREG, RS32, DSTDISP16LIST, E}}}, |
{O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{RS32, INDEXB32D, E}}, {{0x7, 0x8, B31 | DSTDISPREG, 0x1, 0x6, 0xb, 0xa, RS32, DSTDISP32LIST, E}}}, |
{O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{RS32, INDEXW32D, E}}, {{0x7, 0x8, B31 | DSTDISPREG, 0x2, 0x6, 0xb, 0xa, RS32, DSTDISP32LIST, E}}}, |
{O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{RS32, INDEXL32D, E}}, {{0x7, 0x8, B31 | DSTDISPREG, 0x3, 0x6, 0xb, 0xa, RS32, DSTDISP32LIST, E}}}, |
{O (O_MOV, SL), AV_H8H, 6, "mov.l", {{RS32, ABS16DST, E}}, {{PREFIX_0100, 0x6, 0xb, 0x8, RS32, DSTABS16LIST, E}}}, |
{O (O_MOV, SL), AV_H8H, 6, "mov.l", {{RS32, ABS32DST, E}}, {{PREFIX_0100, 0x6, 0xb, 0xa, RS32, MEMRELAX | DSTABS32LIST, E}}}, |
{O (O_MOV, SL), AV_H8H, 4, "mov.l", {{RSIND, RD32, E}}, {{PREFIX_0100, 0x6, 0x9, B30 | RSIND, RD32, E}}}, |
{O (O_MOV, SL), AV_H8H, 6, "mov.l", {{RSPOSTINC, RD32, E}}, {{PREFIX_0100, 0x6, 0xd, B30 | RSPOSTINC, RD32, E}}}, |
{O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{RSPOSTDEC, RD32, E}}, {{PREFIX_0102, 0x6, 0xd, B30 | RSPOSTDEC, RD32, E}}}, |
{O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{RSPREINC, RD32, E}}, {{PREFIX_0101, 0x6, 0xd, B30 | RSPREINC, RD32, E}}}, |
{O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{RSPREDEC, RD32, E}}, {{PREFIX_0103, 0x6, 0xd, B30 | RSPREDEC, RD32, E}}}, |
{O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{DISP2SRC, RD32, E}}, {{PREFIX_010, B30 | B20 | DISP2SRC, 0x6, 0x9, B30 | DISPREG, RD32, E}}}, |
{O (O_MOV, SL), AV_H8H, 6, "mov.l", {{DISP16SRC, RD32, E}}, {{PREFIX_0100, 0x6, 0xf, B30 | DISPREG, RD32, SRC | DISP16LIST, E}}}, |
{O (O_MOV, SL), AV_H8SX, 6, "mov.l", {{DISP32SRC, RD32, E}}, {{0x7, 0x8, B31 | DISPREG, 0x0, 0x6, 0xb, 0x2, RD32, SRC | DISP32LIST, E}}}, |
{O (O_MOV, SL), AV_H8H, 6, "mov.l", {{DISP32SRC, RD32, E}}, {{PREFIX_0100, 0x7, 0x8, B30 | DISPREG, 0x0, 0x6, 0xb, 0x2, RD32, MEMRELAX | SRC | DISP32LIST, E}}}, |
{O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{INDEXB16, RD32, E}}, {{PREFIX_0101, 0x6, 0xf, B30 | DISPREG, RD32, SRC | DISP16LIST, E}}}, |
{O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{INDEXW16, RD32, E}}, {{PREFIX_0102, 0x6, 0xf, B30 | DISPREG, RD32, SRC | DISP16LIST, E}}}, |
{O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{INDEXL16, RD32, E}}, {{PREFIX_0103, 0x6, 0xf, B30 | DISPREG, RD32, SRC | DISP16LIST, E}}}, |
{O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{INDEXB32, RD32, E}}, {{0x7, 0x8, B31 | DISPREG, 0x1, 0x6, 0xb, 0x2, RD32, SRC | DISP32LIST, E}}}, |
{O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{INDEXW32, RD32, E}}, {{0x7, 0x8, B31 | DISPREG, 0x2, 0x6, 0xb, 0x2, RD32, SRC | DISP32LIST, E}}}, |
{O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{INDEXL32, RD32, E}}, {{0x7, 0x8, B31 | DISPREG, 0x3, 0x6, 0xb, 0x2, RD32, SRC | DISP32LIST, E}}}, |
{O (O_MOV, SL), AV_H8H, 6, "mov.l", {{ABS16SRC, RD32, E}}, {{PREFIX_0100, 0x6, 0xb, 0x0, RD32, SRC | ABS16LIST, E}}}, |
{O (O_MOV, SL), AV_H8H, 6, "mov.l", {{ABS32SRC, RD32, E}}, {{PREFIX_0100, 0x6, 0xb, 0x2, RD32, SRC | MEMRELAX | ABS32LIST, E}}}, |
MOVFROM_STD (O (O_MOV, SL), PREFIX_0108, "mov.l", RSIND, FROM_IND), |
MOVFROM_STD (O (O_MOV, SL), PREFIX_0108, "mov.l", RSPOSTINC, FROM_POSTINC), |
MOVFROM_STD (O (O_MOV, SL), PREFIX_0108, "mov.l", RSPOSTDEC, FROM_POSTDEC), |
MOVFROM_STD (O (O_MOV, SL), PREFIX_0108, "mov.l", RSPREINC, FROM_PREINC), |
MOVFROM_STD (O (O_MOV, SL), PREFIX_0108, "mov.l", RSPREDEC, FROM_PREDEC), |
MOVFROM_STD (O (O_MOV, SL), PREFIX_0108, "mov.l", DISP2SRC, FROM_DISP2), |
MOVFROM_AD (O (O_MOV, SL), PREFIX_0108, "mov.l", DISP16SRC, FROM_DISP16, DISP16LIST), |
MOVFROM_AD (O (O_MOV, SL), PREFIX_0108, "mov.l", DISP32SRC, FROM_DISP32, DISP32LIST), |
MOVFROM_AD (O (O_MOV, SL), PREFIX_0108, "mov.l", INDEXB16, FROM_DISP16B, DISP16LIST), |
MOVFROM_AD (O (O_MOV, SL), PREFIX_0108, "mov.l", INDEXW16, FROM_DISP16W, DISP16LIST), |
MOVFROM_AD (O (O_MOV, SL), PREFIX_0108, "mov.l", INDEXL16, FROM_DISP16L, DISP16LIST), |
MOVFROM_AD (O (O_MOV, SL), PREFIX_0108, "mov.l", INDEXB32, FROM_DISP32B, DISP32LIST), |
MOVFROM_AD (O (O_MOV, SL), PREFIX_0108, "mov.l", INDEXW32, FROM_DISP32W, DISP32LIST), |
MOVFROM_AD (O (O_MOV, SL), PREFIX_0108, "mov.l", INDEXL32, FROM_DISP32L, DISP32LIST), |
MOVFROM_AD (O (O_MOV, SL), PREFIX_0108, "mov.l", ABS16SRC, FROM_ABS16, ABS16LIST), |
MOVFROM_AD (O (O_MOV, SL), PREFIX_0108, "mov.l", ABS32SRC, FROM_ABS32, ABS32LIST), |
#define DO_MOVA1(TYPE, OP0, OP1) \ |
{O (O_MOVAB, SL), AV_H8SX, 0, "mova/b.l", {{INDEXB16, TYPE, R3_32}}, {{PREFIX_017F, OP0, OP1, 0x8, B30 | R3_32, MEMRELAX | DISP16LIST, E}}}, \ |
{O (O_MOVAB, SL), AV_H8SX, 0, "mova/b.l", {{INDEXW16, TYPE, R3_32}}, {{PREFIX_015F, OP0, OP1, 0x9, B30 | R3_32, MEMRELAX | DISP16LIST, E}}}, \ |
{O (O_MOVAW, SL), AV_H8SX, 0, "mova/w.l", {{INDEXB16, TYPE, R3_32}}, {{PREFIX_017F, OP0, OP1, 0xA, B30 | R3_32, MEMRELAX | DISP16LIST, E}}}, \ |
{O (O_MOVAW, SL), AV_H8SX, 0, "mova/w.l", {{INDEXW16, TYPE, R3_32}}, {{PREFIX_015F, OP0, OP1, 0xB, B30 | R3_32, MEMRELAX | DISP16LIST, E}}}, \ |
{O (O_MOVAL, SL), AV_H8SX, 0, "mova/l.l", {{INDEXB16, TYPE, R3_32}}, {{PREFIX_017F, OP0, OP1, 0xC, B30 | R3_32, MEMRELAX | DISP16LIST, E}}}, \ |
{O (O_MOVAL, SL), AV_H8SX, 0, "mova/l.l", {{INDEXW16, TYPE, R3_32}}, {{PREFIX_015F, OP0, OP1, 0xD, B30 | R3_32, MEMRELAX | DISP16LIST, E}}}, \ |
\ |
{O (O_MOVAB, SL), AV_H8SX, 0, "mova/b.l", {{INDEXB32, TYPE, R3_32}}, {{PREFIX_017F, OP0, OP1, 0x8, B31 | R3_32, MEMRELAX | DISP32LIST, E}}}, \ |
{O (O_MOVAB, SL), AV_H8SX, 0, "mova/b.l", {{INDEXW32, TYPE, R3_32}}, {{PREFIX_015F, OP0, OP1, 0x9, B31 | R3_32, MEMRELAX | DISP32LIST, E}}}, \ |
{O (O_MOVAW, SL), AV_H8SX, 0, "mova/w.l", {{INDEXB32, TYPE, R3_32}}, {{PREFIX_017F, OP0, OP1, 0xA, B31 | R3_32, MEMRELAX | DISP32LIST, E}}}, \ |
{O (O_MOVAW, SL), AV_H8SX, 0, "mova/w.l", {{INDEXW32, TYPE, R3_32}}, {{PREFIX_015F, OP0, OP1, 0xB, B31 | R3_32, MEMRELAX | DISP32LIST, E}}}, \ |
{O (O_MOVAL, SL), AV_H8SX, 0, "mova/l.l", {{INDEXB32, TYPE, R3_32}}, {{PREFIX_017F, OP0, OP1, 0xC, B31 | R3_32, MEMRELAX | DISP32LIST, E}}}, \ |
{O (O_MOVAL, SL), AV_H8SX, 0, "mova/l.l", {{INDEXW32, TYPE, R3_32}}, {{PREFIX_015F, OP0, OP1, 0xD, B31 | R3_32, MEMRELAX | DISP32LIST, E}}} |
#define DO_MOVA2(TYPE, OP0, OP1, OP2) \ |
{O (O_MOVAB, SL), AV_H8SX, 0, "mova/b.l", {{INDEXB16, TYPE, R3_32}}, {{PREFIX_017F, OP0, OP1, 0x8, B30 | R3_32, OP2, MEMRELAX | DISP16LIST, E}}}, \ |
{O (O_MOVAB, SL), AV_H8SX, 0, "mova/b.l", {{INDEXW16, TYPE, R3_32}}, {{PREFIX_015F, OP0, OP1, 0x9, B30 | R3_32, OP2, MEMRELAX | DISP16LIST, E}}}, \ |
{O (O_MOVAW, SL), AV_H8SX, 0, "mova/w.l", {{INDEXB16, TYPE, R3_32}}, {{PREFIX_017F, OP0, OP1, 0xA, B30 | R3_32, OP2, MEMRELAX | DISP16LIST, E}}}, \ |
{O (O_MOVAW, SL), AV_H8SX, 0, "mova/w.l", {{INDEXW16, TYPE, R3_32}}, {{PREFIX_015F, OP0, OP1, 0xB, B30 | R3_32, OP2, MEMRELAX | DISP16LIST, E}}}, \ |
{O (O_MOVAL, SL), AV_H8SX, 0, "mova/l.l", {{INDEXB16, TYPE, R3_32}}, {{PREFIX_017F, OP0, OP1, 0xC, B30 | R3_32, OP2, MEMRELAX | DISP16LIST, E}}}, \ |
{O (O_MOVAL, SL), AV_H8SX, 0, "mova/l.l", {{INDEXW16, TYPE, R3_32}}, {{PREFIX_015F, OP0, OP1, 0xD, B30 | R3_32, OP2, MEMRELAX | DISP16LIST, E}}}, \ |
\ |
{O (O_MOVAB, SL), AV_H8SX, 0, "mova/b.l", {{INDEXB32, TYPE, R3_32}}, {{PREFIX_017F, OP0, OP1, 0x8, B31 | R3_32, OP2, MEMRELAX | DISP32LIST, E}}}, \ |
{O (O_MOVAB, SL), AV_H8SX, 0, "mova/b.l", {{INDEXW32, TYPE, R3_32}}, {{PREFIX_015F, OP0, OP1, 0x9, B31 | R3_32, OP2, MEMRELAX | DISP32LIST, E}}}, \ |
{O (O_MOVAW, SL), AV_H8SX, 0, "mova/w.l", {{INDEXB32, TYPE, R3_32}}, {{PREFIX_017F, OP0, OP1, 0xA, B31 | R3_32, OP2, MEMRELAX | DISP32LIST, E}}}, \ |
{O (O_MOVAW, SL), AV_H8SX, 0, "mova/w.l", {{INDEXW32, TYPE, R3_32}}, {{PREFIX_015F, OP0, OP1, 0xB, B31 | R3_32, OP2, MEMRELAX | DISP32LIST, E}}}, \ |
{O (O_MOVAL, SL), AV_H8SX, 0, "mova/l.l", {{INDEXB32, TYPE, R3_32}}, {{PREFIX_017F, OP0, OP1, 0xC, B31 | R3_32, OP2, MEMRELAX | DISP32LIST, E}}}, \ |
{O (O_MOVAL, SL), AV_H8SX, 0, "mova/l.l", {{INDEXW32, TYPE, R3_32}}, {{PREFIX_015F, OP0, OP1, 0xD, B31 | R3_32, OP2, MEMRELAX | DISP32LIST, E}}} |
{O (O_MOVAB, SL), AV_H8SX, 0, "mova/b.l", {{INDEXB16, E}}, {{0x7, 0xA, 0x8, B31 | DISPREG, MEMRELAX | DISP16LIST, E}}}, |
{O (O_MOVAB, SL), AV_H8SX, 0, "mova/b.l", {{INDEXW16, E}}, {{0x7, 0xA, 0x9, B31 | DISPREG, MEMRELAX | DISP16LIST, E}}}, |
{O (O_MOVAW, SL), AV_H8SX, 0, "mova/w.l", {{INDEXB16, E}}, {{0x7, 0xA, 0xA, B31 | DISPREG, MEMRELAX | DISP16LIST, E}}}, |
{O (O_MOVAW, SL), AV_H8SX, 0, "mova/w.l", {{INDEXW16, E}}, {{0x7, 0xA, 0xB, B31 | DISPREG, MEMRELAX | DISP16LIST, E}}}, |
{O (O_MOVAL, SL), AV_H8SX, 0, "mova/l.l", {{INDEXB16, E}}, {{0x7, 0xA, 0xC, B31 | DISPREG, MEMRELAX | DISP16LIST, E}}}, |
{O (O_MOVAL, SL), AV_H8SX, 0, "mova/l.l", {{INDEXW16, E}}, {{0x7, 0xA, 0xD, B31 | DISPREG, MEMRELAX | DISP16LIST, E}}}, |
{O (O_MOVAB, SL), AV_H8SX, 0, "mova/b.l", {{INDEXB32, E}}, {{0x7, 0xA, 0x8, B30 | DISPREG, MEMRELAX | DISP32LIST, E}}}, |
{O (O_MOVAB, SL), AV_H8SX, 0, "mova/b.l", {{INDEXW32, E}}, {{0x7, 0xA, 0x9, B30 | DISPREG, MEMRELAX | DISP32LIST, E}}}, |
{O (O_MOVAW, SL), AV_H8SX, 0, "mova/w.l", {{INDEXB32, E}}, {{0x7, 0xA, 0xA, B30 | DISPREG, MEMRELAX | DISP32LIST, E}}}, |
{O (O_MOVAW, SL), AV_H8SX, 0, "mova/w.l", {{INDEXW32, E}}, {{0x7, 0xA, 0xB, B30 | DISPREG, MEMRELAX | DISP32LIST, E}}}, |
{O (O_MOVAL, SL), AV_H8SX, 0, "mova/l.l", {{INDEXB32, E}}, {{0x7, 0xA, 0xC, B30 | DISPREG, MEMRELAX | DISP32LIST, E}}}, |
{O (O_MOVAL, SL), AV_H8SX, 0, "mova/l.l", {{INDEXW32, E}}, {{0x7, 0xA, 0xD, B30 | DISPREG, MEMRELAX | DISP32LIST, E}}}, |
{O (O_MOVAB, SL), AV_H8SX, 0, "mova/b.l", {{INDEXB16, RD8, R3_32}}, {{0x7, 0x8, RD8, 0x8, 0x7, 0xA, 0x8, B31 | R3_32, MEMRELAX | DISP16LIST, E}}}, |
{O (O_MOVAB, SL), AV_H8SX, 0, "mova/b.l", {{INDEXW16, RD16, R3_32}}, {{0x7, 0x8, RD16, 0x9, 0x7, 0xA, 0x9, B31 | R3_32, MEMRELAX | DISP16LIST, E}}}, |
{O (O_MOVAW, SL), AV_H8SX, 0, "mova/w.l", {{INDEXB16, RD8, R3_32}}, {{0x7, 0x8, RD8, 0x8, 0x7, 0xA, 0xA, B31 | R3_32, MEMRELAX | DISP16LIST, E}}}, |
{O (O_MOVAW, SL), AV_H8SX, 0, "mova/w.l", {{INDEXW16, RD16, R3_32}}, {{0x7, 0x8, RD16, 0x9, 0x7, 0xA, 0xB, B31 | R3_32, MEMRELAX | DISP16LIST, E}}}, |
{O (O_MOVAL, SL), AV_H8SX, 0, "mova/l.l", {{INDEXB16, RD8, R3_32}}, {{0x7, 0x8, RD8, 0x8, 0x7, 0xA, 0xC, B31 | R3_32, MEMRELAX | DISP16LIST, E}}}, |
{O (O_MOVAL, SL), AV_H8SX, 0, "mova/l.l", {{INDEXW16, RD16, R3_32}}, {{0x7, 0x8, RD16, 0x9, 0x7, 0xA, 0xD, B31 | R3_32, MEMRELAX | DISP16LIST, E}}}, |
{O (O_MOVAB, SL), AV_H8SX, 0, "mova/b.l", {{INDEXB32, RD8, R3_32}}, {{0x7, 0x8, RD8, 0x8, 0x7, 0xA, 0x8, B30 | R3_32, MEMRELAX | DISP32LIST, E}}}, |
{O (O_MOVAB, SL), AV_H8SX, 0, "mova/b.l", {{INDEXW32, RD16, R3_32}}, {{0x7, 0x8, RD16, 0x9, 0x7, 0xA, 0x9, B30 | R3_32, MEMRELAX | DISP32LIST, E}}}, |
{O (O_MOVAW, SL), AV_H8SX, 0, "mova/w.l", {{INDEXB32, RD8, R3_32}}, {{0x7, 0x8, RD8, 0x8, 0x7, 0xA, 0xA, B30 | R3_32, MEMRELAX | DISP32LIST, E}}}, |
{O (O_MOVAW, SL), AV_H8SX, 0, "mova/w.l", {{INDEXW32, RD16, R3_32}}, {{0x7, 0x8, RD16, 0x9, 0x7, 0xA, 0xB, B30 | R3_32, MEMRELAX | DISP32LIST, E}}}, |
{O (O_MOVAL, SL), AV_H8SX, 0, "mova/l.l", {{INDEXB32, RD8, R3_32}}, {{0x7, 0x8, RD8, 0x8, 0x7, 0xA, 0xC, B30 | R3_32, MEMRELAX | DISP32LIST, E}}}, |
{O (O_MOVAL, SL), AV_H8SX, 0, "mova/l.l", {{INDEXW32, RD16, R3_32}}, {{0x7, 0x8, RD16, 0x9, 0x7, 0xA, 0xD, B30 | R3_32, MEMRELAX | DISP32LIST, E}}}, |
DO_MOVA1 (RDIND, 0x0, B30 | RDIND), |
DO_MOVA1 (RDPOSTINC, 0x8, B30 | RDPOSTINC), |
DO_MOVA1 (RDPOSTDEC, 0xA, B30 | RDPOSTDEC), |
DO_MOVA1 (RDPREINC, 0x9, B30 | RDPREINC), |
DO_MOVA1 (RDPREDEC, 0xB, B30 | RDPREDEC), |
DO_MOVA1 (DISP2DST, B30 | B20 | DISP2DST, B30 | DSTDISPREG), |
DO_MOVA2 (DISP16DST, 0xC, B30 | DSTDISPREG, MEMRELAX | DSTDISP16LIST), |
DO_MOVA2 (DISP32DST, 0xC, B31 | DSTDISPREG, MEMRELAX | DSTDISP32LIST), |
DO_MOVA2 (INDEXB16D, 0xD, B30 | DSTDISPREG, MEMRELAX | DSTDISP16LIST), |
DO_MOVA2 (INDEXW16D, 0xE, B30 | DSTDISPREG, MEMRELAX | DSTDISP16LIST), |
DO_MOVA2 (INDEXL16D, 0xF, B30 | DSTDISPREG, MEMRELAX | DSTDISP16LIST), |
DO_MOVA2 (INDEXB32D, 0xD, B31 | DSTDISPREG, MEMRELAX | DSTDISP32LIST), |
DO_MOVA2 (INDEXW32D, 0xE, B31 | DSTDISPREG, MEMRELAX | DSTDISP32LIST), |
DO_MOVA2 (INDEXL32D, 0xF, B31 | DSTDISPREG, MEMRELAX | DSTDISP32LIST), |
DO_MOVA2 (ABS16DST, 0x4, 0x0, MEMRELAX | DSTABS16LIST), |
DO_MOVA2 (ABS32DST, 0x4, 0x8, MEMRELAX | DSTABS32LIST), |
{O (O_MOV, SB), AV_H8, 10, "movfpe", {{ABS16SRC, RD8, E}}, {{0x6, 0xA, 0x4, RD8, ABS16SRC, DATA3, E}}}, |
{O (O_MOV, SB), AV_H8, 10, "movtpe", {{RS8, ABS16DST, E}}, {{0x6, 0xA, 0xC, RS8, ABS16DST, DATA3, E}}}, |
{O (O_MOVMD, SB), AV_H8SX, 0, "movmd.b", {{E}}, {{0x7, 0xb, 0x9, 0x4, E}}}, |
{O (O_MOVMD, SW), AV_H8SX, 0, "movmd.w", {{E}}, {{0x7, 0xb, 0xa, 0x4, E}}}, |
{O (O_MOVMD, SL), AV_H8SX, 0, "movmd.l", {{E}}, {{0x7, 0xb, 0xb, 0x4, E}}}, |
{O (O_MOVSD, SB), AV_H8SX, 0, "movsd.b", {{PCREL16, E}}, {{0x7, 0xb, 0x8, 0x4, PCREL16, DATA3, E}}}, |
{O (O_MULS, SW), AV_H8SX, 0, "muls.w", {{IMM4, RD16, E}}, {{0x0, 0x1, 0xc, 0x6, 0x5, 0x0, IMM4, RD16, E}}}, |
{O (O_MULS, SW), AV_H8SX, 0, "muls.w", {{RS16, RD16, E}}, {{0x0, 0x1, 0xc, 0x2, 0x5, 0x0, RS16, RD16, E}}}, |
{O (O_MULS, SL), AV_H8SX, 0, "muls.l", {{IMM4, RD32, E}}, {{0x0, 0x1, 0xc, 0x6, 0x5, 0x2, IMM4, B30 | RD32, E}}}, |
{O (O_MULS, SL), AV_H8SX, 0, "muls.l", {{RS32, RD32, E}}, {{0x0, 0x1, 0xc, 0x2, 0x5, 0x2, B30 | RS32, B30 | RD32, E}}}, |
{O (O_MULU, SW), AV_H8SX, 0, "mulu.w", {{IMM4, RD16, E}}, {{0x0, 0x1, 0xc, 0xe, 0x5, 0x0, IMM4, RD16, E}}}, |
{O (O_MULU, SW), AV_H8SX, 0, "mulu.w", {{RS16, RD16, E}}, {{0x0, 0x1, 0xc, 0xa, 0x5, 0x0, RS16, RD16, E}}}, |
{O (O_MULU, SL), AV_H8SX, 0, "mulu.l", {{IMM4, RD32, E}}, {{0x0, 0x1, 0xc, 0xe, 0x5, 0x2, IMM4, B30 | RD32, E}}}, |
{O (O_MULU, SL), AV_H8SX, 0, "mulu.l", {{RS32, RD32, E}}, {{0x0, 0x1, 0xc, 0xa, 0x5, 0x2, B30 | RS32, B30 | RD32, E}}}, |
{O (O_MULSU, SL), AV_H8SX, 0, "muls/u.l", {{IMM4, RD32, E}}, {{0x0, 0x1, 0xc, 0x7, 0x5, 0x2, IMM4, B30 | RD32, E}}}, |
{O (O_MULSU, SL), AV_H8SX, 0, "muls/u.l", {{RS32, RD32, E}}, {{0x0, 0x1, 0xc, 0x3, 0x5, 0x2, B30 | RS32, B30 | RD32, E}}}, |
{O (O_MULUU, SL), AV_H8SX, 0, "mulu/u.l", {{IMM4, RD32, E}}, {{0x0, 0x1, 0xc, 0xf, 0x5, 0x2, IMM4, B30 | RD32, E}}}, |
{O (O_MULUU, SL), AV_H8SX, 0, "mulu/u.l", {{RS32, RD32, E}}, {{0x0, 0x1, 0xc, 0xb, 0x5, 0x2, B30 | RS32, B30 | RD32, E}}}, |
{O (O_MULXS, SB), AV_H8SX, 0, "mulxs.b", {{IMM4, RD16, E}}, {{0x0, 0x1, 0xc, 0x4, 0x5, 0x0, IMM4, RD16, E}}}, |
{O (O_MULXS, SB), AV_H8H, 20, "mulxs.b", {{RS8, RD16, E}}, {{0x0, 0x1, 0xc, 0x0, 0x5, 0x0, RS8, RD16, E}}}, |
{O (O_MULXS, SW), AV_H8SX, 0, "mulxs.w", {{IMM4, RD32, E}}, {{0x0, 0x1, 0xc, 0x4, 0x5, 0x2, IMM4, B30 | RD32, E}}}, |
{O (O_MULXS, SW), AV_H8H, 20, "mulxs.w", {{RS16, RD32, E}}, {{0x0, 0x1, 0xc, 0x0, 0x5, 0x2, RS16, B30 | RD32, E}}}, |
{O (O_MULXU, SB), AV_H8SX, 0, "mulxu.b", {{IMM4, RD16, E}}, {{0x0, 0x1, 0xc, 0xc, 0x5, 0x0, IMM4, RD16, E}}}, |
{O (O_MULXU, SB), AV_H8, 14, "mulxu.b", {{RS8, RD16, E}}, {{0x5, 0x0, RS8, RD16, E}}}, |
{O (O_MULXU, SW), AV_H8SX, 0, "mulxu.w", {{IMM4, RD32, E}}, {{0x0, 0x1, 0xc, 0xc, 0x5, 0x2, IMM4, B30 | RD32, E}}}, |
{O (O_MULXU, SW), AV_H8H, 14, "mulxu.w", {{RS16, RD32, E}}, {{0x5, 0x2, RS16, B30 | RD32, E}}}, |
EXPAND_UNOP_STD_B (O (O_NEG, SB), "neg.b", PREFIX_017, 0x1, 0x7, 0x8), |
EXPAND_UNOP_STD_W (O (O_NEG, SW), "neg.w", PREFIX_015, 0x1, 0x7, 0x9), |
EXPAND_UNOP_STD_L (O (O_NEG, SL), "neg.l", PREFIX_010, 0x1, 0x7, 0xb), |
{O (O_NOP, SN), AV_H8, 2, "nop", {{E}}, {{0x0, 0x0, 0x0, 0x0, E}}}, |
EXPAND_UNOP_STD_B (O (O_NOT, SB), "not.b", PREFIX_017, 0x1, 0x7, 0x0), |
EXPAND_UNOP_STD_W (O (O_NOT, SW), "not.w", PREFIX_015, 0x1, 0x7, 0x1), |
EXPAND_UNOP_STD_L (O (O_NOT, SL), "not.l", PREFIX_010, 0x1, 0x7, 0x3), |
{O (O_OR, SB), AV_H8, 2, "or.b", {{IMM8, RD8, E}}, {{0xc, RD8, IMM8LIST, E}}}, |
EXPAND_TWOOP_B (O (O_OR, SB), "or.b", 0xc, 0x1, 0x4, 0x4, 0), |
{O (O_OR, SW), AV_H8, 2, "or.w", {{RS16, RD16, E}}, {{0x6, 0x4, RS16, RD16, E}}}, |
EXPAND_TWOOP_W (O (O_OR, SW), "or.w", 0x6, 0x4, 0x4), |
{O (O_OR, SL), AV_H8H, 2, "or.l", {{RS32, RD32, E}}, {{0x0, 0x1, 0xF, 0x0, 0x6, 0x4, B30 | RS32, B30 | RD32, E}}}, |
EXPAND_TWOOP_L (O (O_OR, SL), "or.l", 0x4), |
{O (O_ORC, SB), AV_H8, 2, "orc", {{IMM8, CCR | DST, E}}, {{0x0, 0x4, IMM8LIST, E}}}, |
{O (O_ORC, SB), AV_H8S, 2, "orc", {{IMM8, EXR | DST, E}}, {{0x0, 0x1, 0x4, EXR | DST, 0x0, 0x4, IMM8LIST, E}}}, |
{O (O_MOV, SW), AV_H8, 6, "pop.w", {{OR16, E}}, {{0x6, 0xD, 0x7, OR16, E}}}, |
{O (O_MOV, SL), AV_H8H, 6, "pop.l", {{OR32, E}}, {{PREFIX_0100, 0x6, 0xD, 0x7, OR32 | B30, E}}}, |
{O (O_MOV, SW), AV_H8, 6, "push.w", {{OR16, E}}, {{0x6, 0xD, 0xF, OR16, E}}}, |
{O (O_MOV, SL), AV_H8H, 6, "push.l", {{OR32, E}}, {{PREFIX_0100, 0x6, 0xD, 0xF, OR32 | B30, E}}}, |
EXPAND_UNOP_STD_B (O (O_ROTL, SB), "rotl.b", PREFIX_017, 0x1, 0x2, 0x8), |
EXPAND_UNOP_EXTENDED_B (O (O_ROTL, SB), "rotl.b", CONST_2, PREFIX_017, 0x1, 0x2, 0xc), |
EXPAND_UNOP_STD_W (O (O_ROTL, SW), "rotl.w", PREFIX_015, 0x1, 0x2, 0x9), |
EXPAND_UNOP_EXTENDED_W (O (O_ROTL, SW), "rotl.w", CONST_2, PREFIX_015, 0x1, 0x2, 0xd), |
EXPAND_UNOP_STD_L (O (O_ROTL, SL), "rotl.l", PREFIX_010, 0x1, 0x2, 0xb), |
EXPAND_UNOP_EXTENDED_L (O (O_ROTL, SL), "rotl.l", CONST_2, PREFIX_010, 0x1, 0x2, 0xf, B30), |
EXPAND_UNOP_STD_B (O (O_ROTR, SB), "rotr.b", PREFIX_017, 0x1, 0x3, 0x8), |
EXPAND_UNOP_EXTENDED_B (O (O_ROTR, SB), "rotr.b", CONST_2, PREFIX_017, 0x1, 0x3, 0xc), |
EXPAND_UNOP_STD_W (O (O_ROTR, SW), "rotr.w", PREFIX_015, 0x1, 0x3, 0x9), |
EXPAND_UNOP_EXTENDED_W (O (O_ROTR, SW), "rotr.w", CONST_2, PREFIX_015, 0x1, 0x3, 0xd), |
EXPAND_UNOP_STD_L (O (O_ROTR, SL), "rotr.l", PREFIX_010, 0x1, 0x3, 0xb), |
EXPAND_UNOP_EXTENDED_L (O (O_ROTR, SL), "rotr.l", CONST_2, PREFIX_010, 0x1, 0x3, 0xf, B30), |
EXPAND_UNOP_STD_B (O (O_ROTXL, SB), "rotxl.b", PREFIX_017, 0x1, 0x2, 0x0), |
EXPAND_UNOP_EXTENDED_B (O (O_ROTXL, SB), "rotxl.b", CONST_2, PREFIX_017, 0x1, 0x2, 0x4), |
EXPAND_UNOP_STD_W (O (O_ROTXL, SW), "rotxl.w", PREFIX_015, 0x1, 0x2, 0x1), |
EXPAND_UNOP_EXTENDED_W (O (O_ROTXL, SW), "rotxl.w", CONST_2, PREFIX_015, 0x1, 0x2, 0x5), |
EXPAND_UNOP_STD_L (O (O_ROTXL, SL), "rotxl.l", PREFIX_010, 0x1, 0x2, 0x3), |
EXPAND_UNOP_EXTENDED_L (O (O_ROTXL, SL), "rotxl.l", CONST_2, PREFIX_010, 0x1, 0x2, 0x7, B30), |
EXPAND_UNOP_STD_B (O (O_ROTXR, SB), "rotxr.b", PREFIX_017, 0x1, 0x3, 0x0), |
EXPAND_UNOP_EXTENDED_B (O (O_ROTXR, SB), "rotxr.b", CONST_2, PREFIX_017, 0x1, 0x3, 0x4), |
EXPAND_UNOP_STD_W (O (O_ROTXR, SW), "rotxr.w", PREFIX_015, 0x1, 0x3, 0x1), |
EXPAND_UNOP_EXTENDED_W (O (O_ROTXR, SW), "rotxr.w", CONST_2, PREFIX_015, 0x1, 0x3, 0x5), |
EXPAND_UNOP_STD_L (O (O_ROTXR, SL), "rotxr.l", PREFIX_010, 0x1, 0x3, 0x3), |
EXPAND_UNOP_EXTENDED_L (O (O_ROTXR, SL), "rotxr.l", CONST_2, PREFIX_010, 0x1, 0x3, 0x7, B30), |
{O (O_BPT, SN), AV_H8, 10, "bpt", {{E}}, {{0x7, 0xA, 0xF, 0xF, E}}}, |
{O (O_RTE, SN), AV_H8, 10, "rte", {{E}}, {{0x5, 0x6, 0x7, 0x0, E}}}, |
{O (O_RTS, SN), AV_H8, 8, "rts", {{E}}, {{0x5, 0x4, 0x7, 0x0, E}}}, |
{O (O_RTEL, SN), AV_H8SX, 0, "rte/l", {{RS32, RD32, E}}, {{0x5, 0x6, RS32 | B30, RD32 | B30, E}}}, |
{O (O_RTSL, SN), AV_H8SX, 0, "rts/l", {{RS32, RD32, E}}, {{0x5, 0x4, RS32 | B30, RD32 | B30, E}}}, |
EXPAND_UNOP_STD_B (O (O_SHAL, SB), "shal.b", PREFIX_017, 0x1, 0x0, 0x8), |
EXPAND_UNOP_EXTENDED_B (O (O_SHAL, SB), "shal.b", CONST_2, PREFIX_017, 0x1, 0x0, 0xc), |
EXPAND_UNOP_STD_W (O (O_SHAL, SW), "shal.w", PREFIX_015, 0x1, 0x0, 0x9), |
EXPAND_UNOP_EXTENDED_W (O (O_SHAL, SW), "shal.w", CONST_2, PREFIX_015, 0x1, 0x0, 0xd), |
EXPAND_UNOP_STD_L (O (O_SHAL, SL), "shal.l", PREFIX_010, 0x1, 0x0, 0xb), |
EXPAND_UNOP_EXTENDED_L (O (O_SHAL, SL), "shal.l", CONST_2, PREFIX_010, 0x1, 0x0, 0xf, B30), |
EXPAND_UNOP_STD_B (O (O_SHAR, SB), "shar.b", PREFIX_017, 0x1, 0x1, 0x8), |
EXPAND_UNOP_EXTENDED_B (O (O_SHAR, SB), "shar.b", CONST_2, PREFIX_017, 0x1, 0x1, 0xc), |
EXPAND_UNOP_STD_W (O (O_SHAR, SW), "shar.w", PREFIX_015, 0x1, 0x1, 0x9), |
EXPAND_UNOP_EXTENDED_W (O (O_SHAR, SW), "shar.w", CONST_2, PREFIX_015, 0x1, 0x1, 0xd), |
EXPAND_UNOP_STD_L (O (O_SHAR, SL), "shar.l", PREFIX_010, 0x1, 0x1, 0xb), |
EXPAND_UNOP_EXTENDED_L (O (O_SHAR, SL), "shar.l", CONST_2, PREFIX_010, 0x1, 0x1, 0xf, B30), |
EXPAND_UNOP_STD_B (O (O_SHLL, SB), "shll.b", PREFIX_017, 0x1, 0x0, 0x0), |
{O (O_SHLL, SB), AV_H8SX, 0, "shll.b", {{RS8, RD8, E}}, {{0x7, 0x8, RS8, 0x8, 0x1, 0x0, 0x0, RD8, E}}}, |
EXPAND_UNOP_EXTENDED_B (O (O_SHLL, SB), "shll.b", CONST_2, PREFIX_017, 0x1, 0x0, 0x4), |
EXPAND_UNOP_EXTENDED_B (O (O_SHLL, SB), "shll.b", CONST_4, PREFIX_017, 0x1, 0x0, 0xa), |
{O (O_SHLL, SB), AV_H8SX, 0, "shll.b", {{IMM5, RD8, E}}, {{0x0, 0x3, B31 | IMM5, DATA, 0x1, 0x0, 0x0, RD8, E}}}, |
EXPAND_UNOP_STD_W (O (O_SHLL, SW), "shll.w", PREFIX_015, 0x1, 0x0, 0x1), |
{O (O_SHLL, SW), AV_H8SX, 0, "shll.w", {{RS8, RD16, E}}, {{0x7, 0x8, RS8, 0x8, 0x1, 0x0, 0x1, RD16, E}}}, |
EXPAND_UNOP_EXTENDED_W (O (O_SHLL, SW), "shll.w", CONST_2, PREFIX_015, 0x1, 0x0, 0x5), |
EXPAND_UNOP_EXTENDED_W (O (O_SHLL, SW), "shll.w", CONST_4, PREFIX_015, 0x1, 0x0, 0x2), |
EXPAND_UNOP_EXTENDED_W (O (O_SHLL, SW), "shll.w", CONST_8, PREFIX_015, 0x1, 0x0, 0x6), |
{O (O_SHLL, SW), AV_H8SX, 0, "shll.w", {{IMM5, RD16, E}}, {{0x0, 0x3, B31 | IMM5, DATA, 0x1, 0x0, 0x1, RD16, E}}}, |
EXPAND_UNOP_STD_L (O (O_SHLL, SL), "shll.l", PREFIX_010, 0x1, 0x0, 0x3), |
{O (O_SHLL, SL), AV_H8SX, 0, "shll.l", {{RS8, RD32, E}}, {{0x7, 0x8, RS8, 0x8, 0x1, 0x0, 0x3, B30 | RD32, E}}}, |
EXPAND_UNOP_EXTENDED_L (O (O_SHLL, SL), "shll.l", CONST_2, PREFIX_010, 0x1, 0x0, 0x7, B30), |
EXPAND_UNOP_EXTENDED_L (O (O_SHLL, SL), "shll.l", CONST_4, PREFIX_010, 0x1, 0x0, 0x3, B31), |
EXPAND_UNOP_EXTENDED_L (O (O_SHLL, SL), "shll.l", CONST_8, PREFIX_010, 0x1, 0x0, 0x7, B31), |
EXPAND_UNOP_EXTENDED_L (O (O_SHLL, SL), "shll.l", CONST_16, PREFIX_010, 0x1, 0x0, 0xf, B31), |
{O (O_SHLL, SL), AV_H8SX, 0, "shll.l", {{IMM5, RD32, E}}, {{0x0, 0x3, B31 | IMM5, DATA, 0x1, 0x0, 0x3, B30 | RD32, E}}}, |
EXPAND_UNOP_STD_B (O (O_SHLR, SB), "shlr.b", PREFIX_017, 0x1, 0x1, 0x0), |
{O (O_SHLR, SB), AV_H8SX, 0, "shlr.b", {{RS8, RD8, E}}, {{0x7, 0x8, RS8, 0x8, 0x1, 0x1, 0x0, RD8, E}}}, |
EXPAND_UNOP_EXTENDED_B (O (O_SHLR, SB), "shlr.b", CONST_2, PREFIX_017, 0x1, 0x1, 0x4), |
EXPAND_UNOP_EXTENDED_B (O (O_SHLR, SB), "shlr.b", CONST_4, PREFIX_017, 0x1, 0x1, 0xa), |
{O (O_SHLR, SB), AV_H8SX, 0, "shlr.b", {{IMM5, RD8, E}}, {{0x0, 0x3, B31 | IMM5, DATA, 0x1, 0x1, 0x0, RD8, E}}}, |
EXPAND_UNOP_STD_W (O (O_SHLR, SW), "shlr.w", PREFIX_015, 0x1, 0x1, 0x1), |
{O (O_SHLR, SW), AV_H8SX, 0, "shlr.w", {{RS8, RD16, E}}, {{0x7, 0x8, RS8, 0x8, 0x1, 0x1, 0x1, RD16, E}}}, |
EXPAND_UNOP_EXTENDED_W (O (O_SHLR, SW), "shlr.w", CONST_2, PREFIX_015, 0x1, 0x1, 0x5), |
EXPAND_UNOP_EXTENDED_W (O (O_SHLR, SW), "shlr.w", CONST_4, PREFIX_015, 0x1, 0x1, 0x2), |
EXPAND_UNOP_EXTENDED_W (O (O_SHLR, SW), "shlr.w", CONST_8, PREFIX_015, 0x1, 0x1, 0x6), |
{O (O_SHLR, SW), AV_H8SX, 0, "shlr.w", {{IMM5, RD16, E}}, {{0x0, 0x3, B31 | IMM5, DATA, 0x1, 0x1, 0x1, RD16, E}}}, |
EXPAND_UNOP_STD_L (O (O_SHLR, SL), "shlr.l", PREFIX_010, 0x1, 0x1, 0x3), |
{O (O_SHLR, SL), AV_H8SX, 0, "shlr.l", {{RS8, RD32, E}}, {{0x7, 0x8, RS8, 0x8, 0x1, 0x1, 0x3, B30 | RD32, E}}}, |
EXPAND_UNOP_EXTENDED_L (O (O_SHLR, SL), "shlr.l", CONST_2, PREFIX_010, 0x1, 0x1, 0x7, B30), |
EXPAND_UNOP_EXTENDED_L (O (O_SHLR, SL), "shlr.l", CONST_4, PREFIX_010, 0x1, 0x1, 0x3, B31), |
EXPAND_UNOP_EXTENDED_L (O (O_SHLR, SL), "shlr.l", CONST_8, PREFIX_010, 0x1, 0x1, 0x7, B31), |
EXPAND_UNOP_EXTENDED_L (O (O_SHLR, SL), "shlr.l", CONST_16, PREFIX_010, 0x1, 0x1, 0xf, B31), |
{O (O_SHLR, SL), AV_H8SX, 0, "shlr.l", {{IMM5, RD32, E}}, {{0x0, 0x3, B31 | IMM5, DATA, 0x1, 0x1, 0x3, B30 | RD32, E}}}, |
{O (O_SLEEP, SN), AV_H8, 2, "sleep", {{E}}, {{0x0, 0x1, 0x8, 0x0, E}}}, |
{O (O_STC, SB), AV_H8, 2, "stc", {{CCR | SRC, RD8, E}}, {{0x0, 0x2, B30 | CCR | SRC, RD8, E}}}, |
{O (O_STC, SB), AV_H8S, 2, "stc", {{EXR | SRC, RD8, E}}, {{0x0, 0x2, B30 | EXR | SRC, RD8, E}}}, |
{O (O_STC, SW), AV_H8H, 2, "stc", {{CCR | SRC, RDIND, E}}, {{PREFIXSTC, 0x6, 0x9, B31 | RDIND, IGNORE, E}}}, |
{O (O_STC, SW), AV_H8S, 2, "stc", {{EXR | SRC, RDIND, E}}, {{PREFIXSTC, 0x6, 0x9, B31 | RDIND, IGNORE, E}}}, |
{O (O_STC, SW), AV_H8H, 2, "stc", {{CCR | SRC, RDPREDEC, E}}, {{PREFIXSTC, 0x6, 0xD, B31 | RDPREDEC, IGNORE, E}}}, |
{O (O_STC, SW), AV_H8S, 2, "stc", {{EXR | SRC, RDPREDEC, E}}, {{PREFIXSTC, 0x6, 0xD, B31 | RDPREDEC, IGNORE, E}}}, |
{O (O_STC, SW), AV_H8H, 2, "stc", {{CCR | SRC, DISP16DST, E}}, {{PREFIXSTC, 0x6, 0xF, B31 | DSTDISPREG, IGNORE, DSTDISP16LIST, E}}}, |
{O (O_STC, SW), AV_H8S, 2, "stc", {{EXR | SRC, DISP16DST, E}}, {{PREFIXSTC, 0x6, 0xF, B31 | DSTDISPREG, IGNORE, DSTDISP16LIST, E}}}, |
{O (O_STC, SW), AV_H8H, 2, "stc", {{CCR | SRC, DISP32DST, E}}, {{PREFIXSTC, 0x7, 0x8, B30 | DSTDISPREG, 0, 0x6, 0xB, 0xA, IGNORE, DSTDISP32LIST, E}}}, |
{O (O_STC, SW), AV_H8S, 2, "stc", {{EXR | SRC, DISP32DST, E}}, {{PREFIXSTC, 0x7, 0x8, B30 | DSTDISPREG, 0, 0x6, 0xB, 0xA, IGNORE, DSTDISP32LIST, E}}}, |
{O (O_STC, SW), AV_H8H, 2, "stc", {{CCR | SRC, ABS16DST, E}}, {{PREFIXSTC, 0x6, 0xB, 0x8, IGNORE, DST | ABS16LIST, E}}}, |
{O (O_STC, SW), AV_H8S, 2, "stc", {{EXR | SRC, ABS16DST, E}}, {{PREFIXSTC, 0x6, 0xB, 0x8, IGNORE, DST | ABS16LIST, E}}}, |
{O (O_STC, SW), AV_H8H, 2, "stc", {{CCR | SRC, ABS32DST, E}}, {{PREFIXSTC, 0x6, 0xB, 0xA, IGNORE, DST | MEMRELAX | ABS32LIST, E}}}, |
{O (O_STC, SW), AV_H8S, 2, "stc", {{EXR | SRC, ABS32DST, E}}, {{PREFIXSTC, 0x6, 0xB, 0xA, IGNORE, DST | MEMRELAX | ABS32LIST, E}}}, |
{O (O_STC, SL), AV_H8SX, 0, "stc", {{B30 | VBR_SBR | SRC, RD32, E}}, {{0x0, 0x2, B30 | VBR_SBR | SRC, RD32, E}}}, |
EXPAND_TWOOP_B (O (O_SUB, SB), "sub.b", 0xa, 0x1, 0x8, 0x3, B01), |
{O (O_SUB, SW), AV_H8, 2, "sub.w", {{RS16, RD16, E}}, {{0x1, 0x9, RS16, RD16, E}}}, |
{O (O_SUB, SW), AV_H8SX, 0, "sub.w", {{IMM3NZ_NS, RD16, E}}, {{0x1, 0xa, B30 | IMM3NZ, RD16, E}}}, |
{O (O_SUB, SW), AV_H8SX, 0, "sub.w", {{IMM3NZ_NS, RDIND, E}}, {{0x7, 0xd, B31 | RDIND, IGNORE, 0x1, 0xa, B30 | IMM3NZ, IGNORE, E}}}, |
{O (O_SUB, SW), AV_H8SX, 0, "sub.w", {{IMM3NZ_NS, ABS16DST, E}}, {{0x6, 0xb, 0x1, B31 | IGNORE, DSTABS16LIST, 0x1, 0xa, B30 | IMM3NZ, IGNORE, E}}}, |
{O (O_SUB, SW), AV_H8SX, 0, "sub.w", {{IMM3NZ_NS, ABS32DST, E}}, {{0x6, 0xb, 0x3, B31 | IGNORE, DSTABS32LIST, 0x1, 0xa, B30 | IMM3NZ, IGNORE, E}}}, |
EXPAND_TWOOP_W (O (O_SUB, SW), "sub.w", 0x1, 0x9, 0x3), |
{O (O_SUB, SL), AV_H8H, 6, "sub.l", {{RS32, RD32, E}}, {{0x1, 0xa, B31 | RS32, B30 | RD32, E}}}, |
{O (O_SUB, SL), AV_H8SX, 0, "sub.l", {{IMM3NZ_NS, RD32, E}}, {{0x1, 0xa, B31 | IMM3NZ, B31 | RD32, E}}}, |
EXPAND_TWOOP_L (O (O_SUB, SL), "sub.l", 0x3), |
{O (O_SUBS, SL), AV_H8, 2, "subs", {{KBIT, RDP, E}}, {{0x1, 0xB,KBIT, RDP, E}}}, |
{O (O_SUBX, SB), AV_H8, 2, "subx", {{IMM8, RD8, E}}, {{0xb, RD8, IMM8LIST, E}}}, |
{O (O_SUBX, SB), AV_H8SX, 0, "subx.b", {{IMM8, RDIND, E}}, {{0x7, 0xd, B30 | RDIND, IGNORE, 0xb, IGNORE, IMM8LIST, E}}}, |
{O (O_SUBX, SB), AV_H8SX, 0, "subx.b", {{IMM8, RDPOSTDEC, E}}, {{PREFIX_0176, 0x6, 0xc, B30 | RDPOSTDEC, B31 | IGNORE, 0xb, IGNORE, IMM8LIST, E}}}, |
{O (O_SUBX, SB), AV_H8, 2, "subx", {{RS8, RD8, E}}, {{0x1, 0xe, RS8, RD8, E}}}, |
{O (O_SUBX, SB), AV_H8SX, 0, "subx.b", {{RS8, RDIND, E}}, {{0x7, 0xd, B30 | RDIND, IGNORE, 0x1, 0xe, RS8, IGNORE, E}}}, |
{O (O_SUBX, SB), AV_H8SX, 0, "subx.b", {{RS8, RDPOSTDEC, E}}, {{PREFIX_0176, 0x6, 0xc, B30 | RDPOSTDEC, B31 | IGNORE, 0x1, 0xe, RS8, IGNORE, E}}}, |
{O (O_SUBX, SB), AV_H8SX, 0, "subx.b", {{RSIND, RD8, E}}, {{0x7, 0xc, B30 | RSIND, IGNORE, 0x1, 0xe, IGNORE, RD8, E}}}, |
{O (O_SUBX, SB), AV_H8SX, 0, "subx.b", {{RSPOSTDEC, RD8, E}}, {{PREFIX_0176, 0x6, 0xc, B30 | RSPOSTDEC, B30 | B20 | IGNORE, 0x1, 0xe, IGNORE, RD8, E}}}, |
{O (O_SUBX, SB), AV_H8SX, 0, "subx.b", {{RSIND, RDIND, E}}, {{PREFIX_0174, 0x6, 0x8, B30 | RSIND, 0xd, 0x0, RDIND, 0x3, IGNORE, E}}}, |
{O (O_SUBX, SB), AV_H8SX, 0, "subx.b", {{RSPOSTDEC, RDPOSTDEC, E}}, {{PREFIX_0176, 0x6, 0xc, B30 | RSPOSTDEC, 0xd, 0xa, RDPOSTDEC, 0x3, IGNORE, E}}}, |
{O (O_SUBX, SW), AV_H8SX, 0, "subx.w", {{IMM16, RD16, E}}, {{PREFIX_0151, 0x7, 0x9, 0x3, RD16, IMM16LIST, E}}}, |
{O (O_SUBX, SW), AV_H8SX, 0, "subx.w", {{IMM16, RDIND, E}}, {{0x7, 0xd, B31 | RDIND, B01 | IGNORE, 0x7, 0x9, 0x3, IGNORE, IMM16LIST, E}}}, |
{O (O_SUBX, SW), AV_H8SX, 0, "subx.w", {{IMM16, RDPOSTDEC, E}}, {{PREFIX_0156, 0x6, 0xd, B30 | RDPOSTDEC, B31 | B20 | B01 | IGNORE, 0x7, 0x9, 0x3, IGNORE, IMM16LIST, E}}}, |
{O (O_SUBX, SW), AV_H8SX, 0, "subx.w", {{RS16, RD16, E}}, {{PREFIX_0151, 0x1, 0x9, RS16, RD16, E}}}, |
{O (O_SUBX, SW), AV_H8SX, 0, "subx.w", {{RS16, RDIND, E}}, {{0x7, 0xd, B31 | RDIND, B01 | IGNORE, 0x1, 0x9, RS16, IGNORE, E}}}, |
{O (O_SUBX, SW), AV_H8SX, 0, "subx.w", {{RS16, RDPOSTDEC, E}}, {{PREFIX_0156, 0x6, 0xd, B30 | RDPOSTDEC, B31 | B20 | B01 | IGNORE, 0x1, 0x9, RS16, IGNORE, E}}}, |
{O (O_SUBX, SW), AV_H8SX, 0, "subx.w", {{RSIND, RD16, E}}, {{0x7, 0xc, B31 | RSIND, B01 | IGNORE, 0x1, 0x9, IGNORE, RD16, E}}}, |
{O (O_SUBX, SW), AV_H8SX, 0, "subx.w", {{RSPOSTDEC, RD16, E}}, {{PREFIX_0156, 0x6, 0xd, B30 | RSPOSTDEC, B30 | B20 | B01 | IGNORE, 0x1, 0x9, IGNORE, RD16, E}}}, |
{O (O_SUBX, SW), AV_H8SX, 0, "subx.w", {{RSIND, RDIND, E}}, {{PREFIX_0154, 0x6, 0x9, B30 | RSIND, 0xd, 0x0, RDIND, 0x3, IGNORE, E}}}, |
{O (O_SUBX, SW), AV_H8SX, 0, "subx.w", {{RSPOSTDEC, RDPOSTDEC, E}}, {{PREFIX_0156, 0x6, 0xd, B30 | RSPOSTDEC, 0xd, 0xa, RDPOSTDEC, 0x3, IGNORE, E}}}, |
{O (O_SUBX, SL), AV_H8SX, 0, "subx.l", {{IMM32, RD32, E}}, {{PREFIX_0101, 0x7, 0xa, 0x3, RD32, IMM32LIST, E}}}, |
{O (O_SUBX, SL), AV_H8SX, 0, "subx.l", {{IMM32, RDIND, E}}, {{PREFIX_0104, 0x6, 0x9, B30 | RDIND, B31 | B20 | B01 | IGNORE, 0x7, 0xa, 0x3, IGNORE, IMM32LIST, E}}}, |
{O (O_SUBX, SL), AV_H8SX, 0, "subx.l", {{IMM32, RDPOSTDEC, E}}, {{PREFIX_0106, 0x6, 0xd, B30 | RDPOSTDEC, B31 | B20 | B01 | IGNORE, 0x7, 0xa, 0x3, IGNORE, IMM32LIST, E}}}, |
{O (O_SUBX, SL), AV_H8SX, 0, "subx.l", {{RS32, RD32, E}}, {{PREFIX_0101, 0x1, 0xa, B31 | RS32, B30 | RD32, E}}}, |
{O (O_SUBX, SL), AV_H8SX, 0, "subx.l", {{RS32, RDIND, E}}, {{PREFIX_0104, 0x6, 0x9, B30 | RDIND, B31 | B20 | B01 | IGNORE, 0x1, 0xa, B31 | RS32, B30 | IGNORE, E}}}, |
{O (O_SUBX, SL), AV_H8SX, 0, "subx.l", {{RS32, RDPOSTDEC, E}}, {{PREFIX_0106, 0x6, 0xd, B30 | RDPOSTDEC, B31 | B20 | B01 | IGNORE, 0x1, 0xa, B31 | RS32, B30 | IGNORE, E}}}, |
{O (O_SUBX, SL), AV_H8SX, 0, "subx.l", {{RSIND, RD32, E}}, {{PREFIX_0104, 0x6, 0x9, B30 | RSIND, B30 | B20 | B01 | IGNORE, 0x1, 0xa, B31 | IGNORE, B30 | RD32, E}}}, |
{O (O_SUBX, SL), AV_H8SX, 0, "subx.l", {{RSPOSTDEC, RD32, E}}, {{PREFIX_0106, 0x6, 0xd, B30 | RSPOSTDEC, B30 | B20 | B01 | IGNORE, 0x1, 0xa, B31 | IGNORE, B30 | RD32, E}}}, |
{O (O_SUBX, SL), AV_H8SX, 0, "subx.l", {{RSIND, RDIND, E}}, {{PREFIX_0104, 0x6, 0x9, B30 | RSIND, 0xd, 0x0, RDIND, 0x3, IGNORE, E}}}, |
{O (O_SUBX, SL), AV_H8SX, 0, "subx.l", {{RSPOSTDEC, RDPOSTDEC, E}}, {{PREFIX_0106, 0x6, 0xd, B30 | RSPOSTDEC, 0xd, 0xa, RDPOSTDEC, 0x3, IGNORE, E}}}, |
{O (O_TRAPA, SB), AV_H8H, 2, "trapa", {{IMM2, E}}, {{0x5, 0x7, IMM2, IGNORE, E}}}, |
{O (O_TAS, SB), AV_H8H, 2, "tas", {{RSIND, E}}, {{0x0, 0x1, 0xe, 0x0, 0x7, 0xb, B30 | RSIND, 0xc, E}}}, |
{O (O_XOR, SB), AV_H8, 2, "xor.b", {{IMM8, RD8, E}}, {{0xd, RD8, IMM8LIST, E}}}, |
EXPAND_TWOOP_B (O (O_XOR, SB), "xor.b", 0xd, 0x1, 0x5, 0x5, 0), |
{O (O_XOR, SW), AV_H8, 2, "xor.w", {{RS16, RD16, E}}, {{0x6, 0x5, RS16, RD16, E}}}, |
EXPAND_TWOOP_W (O (O_XOR, SW), "xor.w", 0x6, 0x5, 0x5), |
{O (O_XOR, SL), AV_H8H, 2, "xor.l", {{RS32, RD32, E}}, {{0x0, 0x1, 0xF, 0x0, 0x6, 0x5, B30 | RS32, B30 | RD32, E}}}, |
EXPAND_TWOOP_L (O (O_XOR, SL), "xor.l", 0x5), |
{O (O_XORC, SB), AV_H8, 2, "xorc", {{IMM8, CCR | DST, E}}, {{0x0, 0x5, IMM8LIST, E}}}, |
{O (O_XORC, SB), AV_H8S, 2, "xorc", {{IMM8, EXR | DST, E}}, {{0x0, 0x1, 0x4, EXR | DST, 0x0, 0x5, IMM8LIST, E}}}, |
{O (O_CLRMAC, SN), AV_H8S, 2, "clrmac", {{E}}, {{0x0, 0x1, 0xa, 0x0, E}}}, |
{O (O_MAC, SW), AV_H8S, 2, "mac", {{RSPOSTINC, RDPOSTINC, E}}, {{0x0, 0x1, 0x6, 0x0, 0x6, 0xd, B30 | RSPOSTINC, B30 | RDPOSTINC, E}}}, |
{O (O_LDMAC, SL), AV_H8S, 2, "ldmac", {{RS32, MD32, E}}, {{0x0, 0x3, MD32, RS32, E}}}, |
{O (O_STMAC, SL), AV_H8S, 2, "stmac", {{MS32, RD32, E}}, {{0x0, 0x2, MS32, RD32, E}}}, |
{O (O_LDM, SL), AV_H8H, 6, "ldm.l", {{RSPOSTINC, RD32, E}}, {{0x0, 0x1, DATA, 0x0, 0x6, 0xD, 0x7, B30 | RD32, E}}}, |
{O (O_STM, SL), AV_H8H, 6, "stm.l", {{RS32, RDPREDEC, E}}, {{0x0, 0x1, DATA, 0x0, 0x6, 0xD, 0xF, B30 | RS32, E}}}, |
{0, 0, 0, NULL, {{0, 0, 0}}, {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}} |
}; |
#else |
extern const struct h8_opcode h8_opcodes[]; |
#endif |
/contrib/toolchain/binutils/include/opcode/hppa.h |
---|
0,0 → 1,1092 |
/* Table of opcodes for the PA-RISC. |
Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, |
2001, 2002, 2003, 2004, 2005, 2006, 2009, 2010 |
Free Software Foundation, Inc. |
Contributed by the Center for Software Science at the |
University of Utah (pa-gdb-bugs@cs.utah.edu). |
This file is part of GAS, the GNU Assembler, and GDB, the GNU disassembler. |
GAS/GDB is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3, or (at your option) |
any later version. |
GAS/GDB is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with GAS or GDB; see the file COPYING3. If not, write to |
the Free Software Foundation, 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
#if !defined(__STDC__) && !defined(const) |
#define const |
#endif |
/* |
* Structure of an opcode table entry. |
*/ |
/* There are two kinds of delay slot nullification: normal which is |
* controled by the nullification bit, and conditional, which depends |
* on the direction of the branch and its success or failure. |
* |
* NONE is unfortunately #defined in the hiux system include files. |
* #undef it away. |
*/ |
#undef NONE |
struct pa_opcode |
{ |
const char *name; |
unsigned long int match; /* Bits that must be set... */ |
unsigned long int mask; /* ... in these bits. */ |
char *args; |
enum pa_arch arch; |
char flags; |
}; |
/* Enables strict matching. Opcodes with match errors are skipped |
when this bit is set. */ |
#define FLAG_STRICT 0x1 |
/* |
All hppa opcodes are 32 bits. |
The match component is a mask saying which bits must match a |
particular opcode in order for an instruction to be an instance |
of that opcode. |
The args component is a string containing one character for each operand of |
the instruction. Characters used as a prefix allow any second character to |
be used without conflicting with the main operand characters. |
Bit positions in this description follow HP usage of lsb = 31, |
"at" is lsb of field. |
In the args field, the following characters must match exactly: |
'+,() ' |
In the args field, the following characters are unused: |
' " - / 34 6789:; ' |
'@ C M [\] ' |
'` e g } ' |
Here are all the characters: |
' !"#$%&'()*+-,./0123456789:;<=>?' |
'@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_' |
'`abcdefghijklmnopqrstuvwxyz{|}~ ' |
Kinds of operands: |
x integer register field at 15. |
b integer register field at 10. |
t integer register field at 31. |
a integer register field at 10 and 15 (for PERMH) |
5 5 bit immediate at 15. |
s 2 bit space specifier at 17. |
S 3 bit space specifier at 18. |
V 5 bit immediate value at 31 |
i 11 bit immediate value at 31 |
j 14 bit immediate value at 31 |
k 21 bit immediate value at 31 |
l 16 bit immediate value at 31 (wide mode only, unusual encoding). |
n nullification for branch instructions |
N nullification for spop and copr instructions |
w 12 bit branch displacement |
W 17 bit branch displacement (PC relative) |
X 22 bit branch displacement (PC relative) |
z 17 bit branch displacement (just a number, not an address) |
Also these: |
. 2 bit shift amount at 25 |
* 4 bit shift amount at 25 |
p 5 bit shift count at 26 (to support the SHD instruction) encoded as |
31-p |
~ 6 bit shift count at 20,22:26 encoded as 63-~. |
P 5 bit bit position at 26 |
q 6 bit bit position at 20,22:26 |
T 5 bit field length at 31 (encoded as 32-T) |
% 6 bit field length at 23,27:31 (variable extract/deposit) |
| 6 bit field length at 19,27:31 (fixed extract/deposit) |
A 13 bit immediate at 18 (to support the BREAK instruction) |
^ like b, but describes a control register |
! sar (cr11) register |
D 26 bit immediate at 31 (to support the DIAG instruction) |
$ 9 bit immediate at 28 (to support POPBTS) |
v 3 bit Special Function Unit identifier at 25 |
O 20 bit Special Function Unit operation split between 15 bits at 20 |
and 5 bits at 31 |
o 15 bit Special Function Unit operation at 20 |
2 22 bit Special Function Unit operation split between 17 bits at 20 |
and 5 bits at 31 |
1 15 bit Special Function Unit operation split between 10 bits at 20 |
and 5 bits at 31 |
0 10 bit Special Function Unit operation split between 5 bits at 20 |
and 5 bits at 31 |
u 3 bit coprocessor unit identifier at 25 |
F Source Floating Point Operand Format Completer encoded 2 bits at 20 |
I Source Floating Point Operand Format Completer encoded 1 bits at 20 |
(for 0xe format FP instructions) |
G Destination Floating Point Operand Format Completer encoded 2 bits at 18 |
H Floating Point Operand Format at 26 for 'fmpyadd' and 'fmpysub' |
(very similar to 'F') |
r 5 bit immediate value at 31 (for the break instruction) |
(very similar to V above, except the value is unsigned instead of |
low_sign_ext) |
R 5 bit immediate value at 15 (for the ssm, rsm, probei instructions) |
(same as r above, except the value is in a different location) |
U 10 bit immediate value at 15 (for SSM, RSM on pa2.0) |
Q 5 bit immediate value at 10 (a bit position specified in |
the bb instruction. It's the same as r above, except the |
value is in a different location) |
B 5 bit immediate value at 10 (a bit position specified in |
the bb instruction. Similar to Q, but 64 bit handling is |
different. |
Z %r1 -- implicit target of addil instruction. |
L ,%r2 completer for new syntax branch |
{ Source format completer for fcnv |
_ Destination format completer for fcnv |
h cbit for fcmp |
= gfx tests for ftest |
d 14 bit offset for single precision FP long load/store. |
# 14 bit offset for double precision FP load long/store. |
J Yet another 14 bit offset for load/store with ma,mb completers. |
K Yet another 14 bit offset for load/store with ma,mb completers. |
y 16 bit offset for word aligned load/store (PA2.0 wide). |
& 16 bit offset for dword aligned load/store (PA2.0 wide). |
< 16 bit offset for load/store with ma,mb completers (PA2.0 wide). |
> 16 bit offset for load/store with ma,mb completers (PA2.0 wide). |
Y %sr0,%r31 -- implicit target of be,l instruction. |
@ implicit immediate value of 0 |
Completer operands all have 'c' as the prefix: |
cx indexed load and store completer. |
cX indexed load and store completer. Like cx, but emits a space |
after in disassembler. |
cm short load and store completer. |
cM short load and store completer. Like cm, but emits a space |
after in disassembler. |
cq long load and store completer (like cm, but inserted into a |
different location in the target instruction). |
cs store bytes short completer. |
cA store bytes short completer. Like cs, but emits a space |
after in disassembler. |
ce long load/store completer for LDW/STW with a different encoding |
than the others |
cc load cache control hint |
cd load and clear cache control hint |
cC store cache control hint |
co ordered access |
cp branch link and push completer |
cP branch pop completer |
cl branch link completer |
cg branch gate completer |
cw read/write completer for PROBE |
cW wide completer for MFCTL |
cL local processor completer for cache control |
cZ System Control Completer (to support LPA, LHA, etc.) |
ci correction completer for DCOR |
ca add completer |
cy 32 bit add carry completer |
cY 64 bit add carry completer |
cv signed overflow trap completer |
ct trap on condition completer for ADDI, SUB |
cT trap on condition completer for UADDCM |
cb 32 bit borrow completer for SUB |
cB 64 bit borrow completer for SUB |
ch left/right half completer |
cH signed/unsigned saturation completer |
cS signed/unsigned completer at 21 |
cz zero/sign extension completer. |
c* permutation completer |
Condition operands all have '?' as the prefix: |
?f Floating point compare conditions (encoded as 5 bits at 31) |
?a add conditions |
?A 64 bit add conditions |
?@ add branch conditions followed by nullify |
?d non-negated add branch conditions |
?D negated add branch conditions |
?w wide mode non-negated add branch conditions |
?W wide mode negated add branch conditions |
?s compare/subtract conditions |
?S 64 bit compare/subtract conditions |
?t non-negated compare and branch conditions |
?n 32 bit compare and branch conditions followed by nullify |
?N 64 bit compare and branch conditions followed by nullify |
?Q 64 bit compare and branch conditions for CMPIB instruction |
?l logical conditions |
?L 64 bit logical conditions |
?b branch on bit conditions |
?B 64 bit branch on bit conditions |
?x shift/extract/deposit conditions |
?X 64 bit shift/extract/deposit conditions |
?y shift/extract/deposit conditions followed by nullify for conditional |
branches |
?u unit conditions |
?U 64 bit unit conditions |
Floating point registers all have 'f' as a prefix: |
ft target register at 31 |
fT target register with L/R halves at 31 |
fa operand 1 register at 10 |
fA operand 1 register with L/R halves at 10 |
fX Same as fA, except prints a space before register during disasm |
fb operand 2 register at 15 |
fB operand 2 register with L/R halves at 15 |
fC operand 3 register with L/R halves at 16:18,21:23 |
fe Like fT, but encoding is different. |
fE Same as fe, except prints a space before register during disasm. |
fx target register at 15 (only for PA 2.0 long format FLDD/FSTD). |
Float registers for fmpyadd and fmpysub: |
fi mult operand 1 register at 10 |
fj mult operand 2 register at 15 |
fk mult target register at 20 |
fl add/sub operand register at 25 |
fm add/sub target register at 31 |
*/ |
#if 0 |
/* List of characters not to put a space after. Note that |
"," is included, as the "spopN" operations use literal |
commas in their completer sections. */ |
static const char *const completer_chars = ",CcY<>?!@+&U~FfGHINnOoZMadu|/=0123%e$m}"; |
#endif |
/* The order of the opcodes in this table is significant: |
* The assembler requires that all instances of the same mnemonic be |
consecutive. If they aren't, the assembler will bomb at runtime. |
* Immediate fields use pa_get_absolute_expression to parse the |
string. It will generate a "bad expression" error if passed |
a register name. Thus, register index variants of an opcode |
need to precede immediate variants. |
* The disassembler does not care about the order of the opcodes |
except in cases where implicit addressing is used. |
Here are the rules for ordering the opcodes of a mnemonic: |
1) Opcodes with FLAG_STRICT should precede opcodes without |
FLAG_STRICT. |
2) Opcodes with FLAG_STRICT should be ordered as follows: |
register index opcodes, short immediate opcodes, and finally |
long immediate opcodes. When both pa10 and pa11 variants |
of the same opcode are available, the pa10 opcode should |
come first for correct architectural promotion. |
3) When implicit addressing is available for an opcode, the |
implicit opcode should precede the explicit opcode. |
4) Opcodes without FLAG_STRICT should be ordered as follows: |
register index opcodes, long immediate opcodes, and finally |
short immediate opcodes. */ |
static const struct pa_opcode pa_opcodes[] = |
{ |
/* Pseudo-instructions. */ |
{ "ldi", 0x34000000, 0xffe00000, "l,x", pa20w, 0},/* ldo val(r0),r */ |
{ "ldi", 0x34000000, 0xffe0c000, "j,x", pa10, 0},/* ldo val(r0),r */ |
{ "cmpib", 0xec000000, 0xfc000000, "?Qn5,b,w", pa20, FLAG_STRICT}, |
{ "cmpib", 0x84000000, 0xf4000000, "?nn5,b,w", pa10, FLAG_STRICT}, |
{ "comib", 0x84000000, 0xfc000000, "?nn5,b,w", pa10, 0}, /* comib{tf}*/ |
/* This entry is for the disassembler only. It will never be used by |
assembler. */ |
{ "comib", 0x8c000000, 0xfc000000, "?nn5,b,w", pa10, 0}, /* comib{tf}*/ |
{ "cmpb", 0x9c000000, 0xdc000000, "?Nnx,b,w", pa20, FLAG_STRICT}, |
{ "cmpb", 0x80000000, 0xf4000000, "?nnx,b,w", pa10, FLAG_STRICT}, |
{ "comb", 0x80000000, 0xfc000000, "?nnx,b,w", pa10, 0}, /* comb{tf} */ |
/* This entry is for the disassembler only. It will never be used by |
assembler. */ |
{ "comb", 0x88000000, 0xfc000000, "?nnx,b,w", pa10, 0}, /* comb{tf} */ |
{ "addb", 0xa0000000, 0xf4000000, "?Wnx,b,w", pa20w, FLAG_STRICT}, |
{ "addb", 0xa0000000, 0xfc000000, "?@nx,b,w", pa10, 0}, /* addb{tf} */ |
/* This entry is for the disassembler only. It will never be used by |
assembler. */ |
{ "addb", 0xa8000000, 0xfc000000, "?@nx,b,w", pa10, 0}, |
{ "addib", 0xa4000000, 0xf4000000, "?Wn5,b,w", pa20w, FLAG_STRICT}, |
{ "addib", 0xa4000000, 0xfc000000, "?@n5,b,w", pa10, 0}, /* addib{tf}*/ |
/* This entry is for the disassembler only. It will never be used by |
assembler. */ |
{ "addib", 0xac000000, 0xfc000000, "?@n5,b,w", pa10, 0}, /* addib{tf}*/ |
{ "nop", 0x08000240, 0xffffffff, "", pa10, 0}, /* or 0,0,0 */ |
{ "copy", 0x08000240, 0xffe0ffe0, "x,t", pa10, 0}, /* or r,0,t */ |
{ "mtsar", 0x01601840, 0xffe0ffff, "x", pa10, 0}, /* mtctl r,cr11 */ |
/* Loads and Stores for integer registers. */ |
{ "ldd", 0x0c0000c0, 0xfc00d3c0, "cxccx(b),t", pa20, FLAG_STRICT}, |
{ "ldd", 0x0c0000c0, 0xfc0013c0, "cxccx(s,b),t", pa20, FLAG_STRICT}, |
{ "ldd", 0x0c0010e0, 0xfc1ff3e0, "cocc@(b),t", pa20, FLAG_STRICT}, |
{ "ldd", 0x0c0010e0, 0xfc1f33e0, "cocc@(s,b),t", pa20, FLAG_STRICT}, |
{ "ldd", 0x0c0010c0, 0xfc00d3c0, "cmcc5(b),t", pa20, FLAG_STRICT}, |
{ "ldd", 0x0c0010c0, 0xfc0013c0, "cmcc5(s,b),t", pa20, FLAG_STRICT}, |
{ "ldd", 0x50000000, 0xfc000002, "cq&(b),x", pa20w, FLAG_STRICT}, |
{ "ldd", 0x50000000, 0xfc00c002, "cq#(b),x", pa20, FLAG_STRICT}, |
{ "ldd", 0x50000000, 0xfc000002, "cq#(s,b),x", pa20, FLAG_STRICT}, |
{ "ldw", 0x0c000080, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT}, |
{ "ldw", 0x0c000080, 0xfc001fc0, "cXx(s,b),t", pa10, FLAG_STRICT}, |
{ "ldw", 0x0c000080, 0xfc00d3c0, "cxccx(b),t", pa11, FLAG_STRICT}, |
{ "ldw", 0x0c000080, 0xfc0013c0, "cxccx(s,b),t", pa11, FLAG_STRICT}, |
{ "ldw", 0x0c0010a0, 0xfc1ff3e0, "cocc@(b),t", pa20, FLAG_STRICT}, |
{ "ldw", 0x0c0010a0, 0xfc1f33e0, "cocc@(s,b),t", pa20, FLAG_STRICT}, |
{ "ldw", 0x0c001080, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT}, |
{ "ldw", 0x0c001080, 0xfc001fc0, "cM5(s,b),t", pa10, FLAG_STRICT}, |
{ "ldw", 0x0c001080, 0xfc00d3c0, "cmcc5(b),t", pa11, FLAG_STRICT}, |
{ "ldw", 0x0c001080, 0xfc0013c0, "cmcc5(s,b),t", pa11, FLAG_STRICT}, |
{ "ldw", 0x4c000000, 0xfc000000, "ce<(b),x", pa20w, FLAG_STRICT}, |
{ "ldw", 0x5c000004, 0xfc000006, "ce>(b),x", pa20w, FLAG_STRICT}, |
{ "ldw", 0x48000000, 0xfc000000, "l(b),x", pa20w, FLAG_STRICT}, |
{ "ldw", 0x5c000004, 0xfc00c006, "ceK(b),x", pa20, FLAG_STRICT}, |
{ "ldw", 0x5c000004, 0xfc000006, "ceK(s,b),x", pa20, FLAG_STRICT}, |
{ "ldw", 0x4c000000, 0xfc00c000, "ceJ(b),x", pa10, FLAG_STRICT}, |
{ "ldw", 0x4c000000, 0xfc000000, "ceJ(s,b),x", pa10, FLAG_STRICT}, |
{ "ldw", 0x48000000, 0xfc00c000, "j(b),x", pa10, 0}, |
{ "ldw", 0x48000000, 0xfc000000, "j(s,b),x", pa10, 0}, |
{ "ldh", 0x0c000040, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT}, |
{ "ldh", 0x0c000040, 0xfc001fc0, "cXx(s,b),t", pa10, FLAG_STRICT}, |
{ "ldh", 0x0c000040, 0xfc00d3c0, "cxccx(b),t", pa11, FLAG_STRICT}, |
{ "ldh", 0x0c000040, 0xfc0013c0, "cxccx(s,b),t", pa11, FLAG_STRICT}, |
{ "ldh", 0x0c001060, 0xfc1ff3e0, "cocc@(b),t", pa20, FLAG_STRICT}, |
{ "ldh", 0x0c001060, 0xfc1f33e0, "cocc@(s,b),t", pa20, FLAG_STRICT}, |
{ "ldh", 0x0c001040, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT}, |
{ "ldh", 0x0c001040, 0xfc001fc0, "cM5(s,b),t", pa10, FLAG_STRICT}, |
{ "ldh", 0x0c001040, 0xfc00d3c0, "cmcc5(b),t", pa11, FLAG_STRICT}, |
{ "ldh", 0x0c001040, 0xfc0013c0, "cmcc5(s,b),t", pa11, FLAG_STRICT}, |
{ "ldh", 0x44000000, 0xfc000000, "l(b),x", pa20w, FLAG_STRICT}, |
{ "ldh", 0x44000000, 0xfc00c000, "j(b),x", pa10, 0}, |
{ "ldh", 0x44000000, 0xfc000000, "j(s,b),x", pa10, 0}, |
{ "ldb", 0x0c000000, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT}, |
{ "ldb", 0x0c000000, 0xfc001fc0, "cXx(s,b),t", pa10, FLAG_STRICT}, |
{ "ldb", 0x0c000000, 0xfc00d3c0, "cxccx(b),t", pa11, FLAG_STRICT}, |
{ "ldb", 0x0c000000, 0xfc0013c0, "cxccx(s,b),t", pa11, FLAG_STRICT}, |
{ "ldb", 0x0c001020, 0xfc1ff3e0, "cocc@(b),t", pa20, FLAG_STRICT}, |
{ "ldb", 0x0c001020, 0xfc1f33e0, "cocc@(s,b),t", pa20, FLAG_STRICT}, |
{ "ldb", 0x0c001000, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT}, |
{ "ldb", 0x0c001000, 0xfc001fc0, "cM5(s,b),t", pa10, FLAG_STRICT}, |
{ "ldb", 0x0c001000, 0xfc00d3c0, "cmcc5(b),t", pa11, FLAG_STRICT}, |
{ "ldb", 0x0c001000, 0xfc0013c0, "cmcc5(s,b),t", pa11, FLAG_STRICT}, |
{ "ldb", 0x40000000, 0xfc000000, "l(b),x", pa20w, FLAG_STRICT}, |
{ "ldb", 0x40000000, 0xfc00c000, "j(b),x", pa10, 0}, |
{ "ldb", 0x40000000, 0xfc000000, "j(s,b),x", pa10, 0}, |
{ "std", 0x0c0012e0, 0xfc00f3ff, "cocCx,@(b)", pa20, FLAG_STRICT}, |
{ "std", 0x0c0012e0, 0xfc0033ff, "cocCx,@(s,b)", pa20, FLAG_STRICT}, |
{ "std", 0x0c0012c0, 0xfc00d3c0, "cmcCx,V(b)", pa20, FLAG_STRICT}, |
{ "std", 0x0c0012c0, 0xfc0013c0, "cmcCx,V(s,b)", pa20, FLAG_STRICT}, |
{ "std", 0x70000000, 0xfc000002, "cqx,&(b)", pa20w, FLAG_STRICT}, |
{ "std", 0x70000000, 0xfc00c002, "cqx,#(b)", pa20, FLAG_STRICT}, |
{ "std", 0x70000000, 0xfc000002, "cqx,#(s,b)", pa20, FLAG_STRICT}, |
{ "stw", 0x0c0012a0, 0xfc00f3ff, "cocCx,@(b)", pa20, FLAG_STRICT}, |
{ "stw", 0x0c0012a0, 0xfc0033ff, "cocCx,@(s,b)", pa20, FLAG_STRICT}, |
{ "stw", 0x0c001280, 0xfc00dfc0, "cMx,V(b)", pa10, FLAG_STRICT}, |
{ "stw", 0x0c001280, 0xfc001fc0, "cMx,V(s,b)", pa10, FLAG_STRICT}, |
{ "stw", 0x0c001280, 0xfc00d3c0, "cmcCx,V(b)", pa11, FLAG_STRICT}, |
{ "stw", 0x0c001280, 0xfc0013c0, "cmcCx,V(s,b)", pa11, FLAG_STRICT}, |
{ "stw", 0x6c000000, 0xfc000000, "cex,<(b)", pa20w, FLAG_STRICT}, |
{ "stw", 0x7c000004, 0xfc000006, "cex,>(b)", pa20w, FLAG_STRICT}, |
{ "stw", 0x68000000, 0xfc000000, "x,l(b)", pa20w, FLAG_STRICT}, |
{ "stw", 0x7c000004, 0xfc00c006, "cex,K(b)", pa20, FLAG_STRICT}, |
{ "stw", 0x7c000004, 0xfc000006, "cex,K(s,b)", pa20, FLAG_STRICT}, |
{ "stw", 0x6c000000, 0xfc00c000, "cex,J(b)", pa10, FLAG_STRICT}, |
{ "stw", 0x6c000000, 0xfc000000, "cex,J(s,b)", pa10, FLAG_STRICT}, |
{ "stw", 0x68000000, 0xfc00c000, "x,j(b)", pa10, 0}, |
{ "stw", 0x68000000, 0xfc000000, "x,j(s,b)", pa10, 0}, |
{ "sth", 0x0c001260, 0xfc00f3ff, "cocCx,@(b)", pa20, FLAG_STRICT}, |
{ "sth", 0x0c001260, 0xfc0033ff, "cocCx,@(s,b)", pa20, FLAG_STRICT}, |
{ "sth", 0x0c001240, 0xfc00dfc0, "cMx,V(b)", pa10, FLAG_STRICT}, |
{ "sth", 0x0c001240, 0xfc001fc0, "cMx,V(s,b)", pa10, FLAG_STRICT}, |
{ "sth", 0x0c001240, 0xfc00d3c0, "cmcCx,V(b)", pa11, FLAG_STRICT}, |
{ "sth", 0x0c001240, 0xfc0013c0, "cmcCx,V(s,b)", pa11, FLAG_STRICT}, |
{ "sth", 0x64000000, 0xfc000000, "x,l(b)", pa20w, FLAG_STRICT}, |
{ "sth", 0x64000000, 0xfc00c000, "x,j(b)", pa10, 0}, |
{ "sth", 0x64000000, 0xfc000000, "x,j(s,b)", pa10, 0}, |
{ "stb", 0x0c001220, 0xfc00f3ff, "cocCx,@(b)", pa20, FLAG_STRICT}, |
{ "stb", 0x0c001220, 0xfc0033ff, "cocCx,@(s,b)", pa20, FLAG_STRICT}, |
{ "stb", 0x0c001200, 0xfc00dfc0, "cMx,V(b)", pa10, FLAG_STRICT}, |
{ "stb", 0x0c001200, 0xfc001fc0, "cMx,V(s,b)", pa10, FLAG_STRICT}, |
{ "stb", 0x0c001200, 0xfc00d3c0, "cmcCx,V(b)", pa11, FLAG_STRICT}, |
{ "stb", 0x0c001200, 0xfc0013c0, "cmcCx,V(s,b)", pa11, FLAG_STRICT}, |
{ "stb", 0x60000000, 0xfc000000, "x,l(b)", pa20w, FLAG_STRICT}, |
{ "stb", 0x60000000, 0xfc00c000, "x,j(b)", pa10, 0}, |
{ "stb", 0x60000000, 0xfc000000, "x,j(s,b)", pa10, 0}, |
{ "ldwm", 0x4c000000, 0xfc00c000, "j(b),x", pa10, 0}, |
{ "ldwm", 0x4c000000, 0xfc000000, "j(s,b),x", pa10, 0}, |
{ "stwm", 0x6c000000, 0xfc00c000, "x,j(b)", pa10, 0}, |
{ "stwm", 0x6c000000, 0xfc000000, "x,j(s,b)", pa10, 0}, |
{ "ldwx", 0x0c000080, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT}, |
{ "ldwx", 0x0c000080, 0xfc001fc0, "cXx(s,b),t", pa10, FLAG_STRICT}, |
{ "ldwx", 0x0c000080, 0xfc00d3c0, "cxccx(b),t", pa11, FLAG_STRICT}, |
{ "ldwx", 0x0c000080, 0xfc0013c0, "cxccx(s,b),t", pa11, FLAG_STRICT}, |
{ "ldwx", 0x0c000080, 0xfc00dfc0, "cXx(b),t", pa10, 0}, |
{ "ldwx", 0x0c000080, 0xfc001fc0, "cXx(s,b),t", pa10, 0}, |
{ "ldhx", 0x0c000040, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT}, |
{ "ldhx", 0x0c000040, 0xfc001fc0, "cXx(s,b),t", pa10, FLAG_STRICT}, |
{ "ldhx", 0x0c000040, 0xfc00d3c0, "cxccx(b),t", pa11, FLAG_STRICT}, |
{ "ldhx", 0x0c000040, 0xfc0013c0, "cxccx(s,b),t", pa11, FLAG_STRICT}, |
{ "ldhx", 0x0c000040, 0xfc00dfc0, "cXx(b),t", pa10, 0}, |
{ "ldhx", 0x0c000040, 0xfc001fc0, "cXx(s,b),t", pa10, 0}, |
{ "ldbx", 0x0c000000, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT}, |
{ "ldbx", 0x0c000000, 0xfc001fc0, "cXx(s,b),t", pa10, FLAG_STRICT}, |
{ "ldbx", 0x0c000000, 0xfc00d3c0, "cxccx(b),t", pa11, FLAG_STRICT}, |
{ "ldbx", 0x0c000000, 0xfc0013c0, "cxccx(s,b),t", pa11, FLAG_STRICT}, |
{ "ldbx", 0x0c000000, 0xfc00dfc0, "cXx(b),t", pa10, 0}, |
{ "ldbx", 0x0c000000, 0xfc001fc0, "cXx(s,b),t", pa10, 0}, |
{ "ldwa", 0x0c000180, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT}, |
{ "ldwa", 0x0c000180, 0xfc00d3c0, "cxccx(b),t", pa11, FLAG_STRICT}, |
{ "ldwa", 0x0c0011a0, 0xfc1ff3e0, "cocc@(b),t", pa20, FLAG_STRICT}, |
{ "ldwa", 0x0c001180, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT}, |
{ "ldwa", 0x0c001180, 0xfc00d3c0, "cmcc5(b),t", pa11, FLAG_STRICT}, |
{ "ldcw", 0x0c0001c0, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT}, |
{ "ldcw", 0x0c0001c0, 0xfc001fc0, "cXx(s,b),t", pa10, FLAG_STRICT}, |
{ "ldcw", 0x0c0001c0, 0xfc00d3c0, "cxcdx(b),t", pa11, FLAG_STRICT}, |
{ "ldcw", 0x0c0001c0, 0xfc0013c0, "cxcdx(s,b),t", pa11, FLAG_STRICT}, |
{ "ldcw", 0x0c0011c0, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT}, |
{ "ldcw", 0x0c0011c0, 0xfc001fc0, "cM5(s,b),t", pa10, FLAG_STRICT}, |
{ "ldcw", 0x0c0011c0, 0xfc00d3c0, "cmcd5(b),t", pa11, FLAG_STRICT}, |
{ "ldcw", 0x0c0011c0, 0xfc0013c0, "cmcd5(s,b),t", pa11, FLAG_STRICT}, |
{ "stwa", 0x0c0013a0, 0xfc00d3ff, "cocCx,@(b)", pa20, FLAG_STRICT}, |
{ "stwa", 0x0c001380, 0xfc00dfc0, "cMx,V(b)", pa10, FLAG_STRICT}, |
{ "stwa", 0x0c001380, 0xfc00d3c0, "cmcCx,V(b)", pa11, FLAG_STRICT}, |
{ "stby", 0x0c001300, 0xfc00dfc0, "cAx,V(b)", pa10, FLAG_STRICT}, |
{ "stby", 0x0c001300, 0xfc001fc0, "cAx,V(s,b)", pa10, FLAG_STRICT}, |
{ "stby", 0x0c001300, 0xfc00d3c0, "cscCx,V(b)", pa11, FLAG_STRICT}, |
{ "stby", 0x0c001300, 0xfc0013c0, "cscCx,V(s,b)", pa11, FLAG_STRICT}, |
{ "ldda", 0x0c000100, 0xfc00d3c0, "cxccx(b),t", pa20, FLAG_STRICT}, |
{ "ldda", 0x0c001120, 0xfc1ff3e0, "cocc@(b),t", pa20, FLAG_STRICT}, |
{ "ldda", 0x0c001100, 0xfc00d3c0, "cmcc5(b),t", pa20, FLAG_STRICT}, |
{ "ldcd", 0x0c000140, 0xfc00d3c0, "cxcdx(b),t", pa20, FLAG_STRICT}, |
{ "ldcd", 0x0c000140, 0xfc0013c0, "cxcdx(s,b),t", pa20, FLAG_STRICT}, |
{ "ldcd", 0x0c001140, 0xfc00d3c0, "cmcd5(b),t", pa20, FLAG_STRICT}, |
{ "ldcd", 0x0c001140, 0xfc0013c0, "cmcd5(s,b),t", pa20, FLAG_STRICT}, |
{ "stda", 0x0c0013e0, 0xfc00f3ff, "cocCx,@(b)", pa20, FLAG_STRICT}, |
{ "stda", 0x0c0013c0, 0xfc00d3c0, "cmcCx,V(b)", pa20, FLAG_STRICT}, |
{ "ldwax", 0x0c000180, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT}, |
{ "ldwax", 0x0c000180, 0xfc00d3c0, "cxccx(b),t", pa11, FLAG_STRICT}, |
{ "ldwax", 0x0c000180, 0xfc00dfc0, "cXx(b),t", pa10, 0}, |
{ "ldcwx", 0x0c0001c0, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT}, |
{ "ldcwx", 0x0c0001c0, 0xfc001fc0, "cXx(s,b),t", pa10, FLAG_STRICT}, |
{ "ldcwx", 0x0c0001c0, 0xfc00d3c0, "cxcdx(b),t", pa11, FLAG_STRICT}, |
{ "ldcwx", 0x0c0001c0, 0xfc0013c0, "cxcdx(s,b),t", pa11, FLAG_STRICT}, |
{ "ldcwx", 0x0c0001c0, 0xfc00dfc0, "cXx(b),t", pa10, 0}, |
{ "ldcwx", 0x0c0001c0, 0xfc001fc0, "cXx(s,b),t", pa10, 0}, |
{ "ldws", 0x0c001080, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT}, |
{ "ldws", 0x0c001080, 0xfc001fc0, "cM5(s,b),t", pa10, FLAG_STRICT}, |
{ "ldws", 0x0c001080, 0xfc00d3c0, "cmcc5(b),t", pa11, FLAG_STRICT}, |
{ "ldws", 0x0c001080, 0xfc0013c0, "cmcc5(s,b),t", pa11, FLAG_STRICT}, |
{ "ldws", 0x0c001080, 0xfc00dfc0, "cM5(b),t", pa10, 0}, |
{ "ldws", 0x0c001080, 0xfc001fc0, "cM5(s,b),t", pa10, 0}, |
{ "ldhs", 0x0c001040, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT}, |
{ "ldhs", 0x0c001040, 0xfc001fc0, "cM5(s,b),t", pa10, FLAG_STRICT}, |
{ "ldhs", 0x0c001040, 0xfc00d3c0, "cmcc5(b),t", pa11, FLAG_STRICT}, |
{ "ldhs", 0x0c001040, 0xfc0013c0, "cmcc5(s,b),t", pa11, FLAG_STRICT}, |
{ "ldhs", 0x0c001040, 0xfc00dfc0, "cM5(b),t", pa10, 0}, |
{ "ldhs", 0x0c001040, 0xfc001fc0, "cM5(s,b),t", pa10, 0}, |
{ "ldbs", 0x0c001000, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT}, |
{ "ldbs", 0x0c001000, 0xfc001fc0, "cM5(s,b),t", pa10, FLAG_STRICT}, |
{ "ldbs", 0x0c001000, 0xfc00d3c0, "cmcc5(b),t", pa11, FLAG_STRICT}, |
{ "ldbs", 0x0c001000, 0xfc0013c0, "cmcc5(s,b),t", pa11, FLAG_STRICT}, |
{ "ldbs", 0x0c001000, 0xfc00dfc0, "cM5(b),t", pa10, 0}, |
{ "ldbs", 0x0c001000, 0xfc001fc0, "cM5(s,b),t", pa10, 0}, |
{ "ldwas", 0x0c001180, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT}, |
{ "ldwas", 0x0c001180, 0xfc00d3c0, "cmcc5(b),t", pa11, FLAG_STRICT}, |
{ "ldwas", 0x0c001180, 0xfc00dfc0, "cM5(b),t", pa10, 0}, |
{ "ldcws", 0x0c0011c0, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT}, |
{ "ldcws", 0x0c0011c0, 0xfc001fc0, "cM5(s,b),t", pa10, FLAG_STRICT}, |
{ "ldcws", 0x0c0011c0, 0xfc00d3c0, "cmcd5(b),t", pa11, FLAG_STRICT}, |
{ "ldcws", 0x0c0011c0, 0xfc0013c0, "cmcd5(s,b),t", pa11, FLAG_STRICT}, |
{ "ldcws", 0x0c0011c0, 0xfc00dfc0, "cM5(b),t", pa10, 0}, |
{ "ldcws", 0x0c0011c0, 0xfc001fc0, "cM5(s,b),t", pa10, 0}, |
{ "stws", 0x0c001280, 0xfc00dfc0, "cMx,V(b)", pa10, FLAG_STRICT}, |
{ "stws", 0x0c001280, 0xfc001fc0, "cMx,V(s,b)", pa10, FLAG_STRICT}, |
{ "stws", 0x0c001280, 0xfc00d3c0, "cmcCx,V(b)", pa11, FLAG_STRICT}, |
{ "stws", 0x0c001280, 0xfc0013c0, "cmcCx,V(s,b)", pa11, FLAG_STRICT}, |
{ "stws", 0x0c001280, 0xfc00dfc0, "cMx,V(b)", pa10, 0}, |
{ "stws", 0x0c001280, 0xfc001fc0, "cMx,V(s,b)", pa10, 0}, |
{ "sths", 0x0c001240, 0xfc00dfc0, "cMx,V(b)", pa10, FLAG_STRICT}, |
{ "sths", 0x0c001240, 0xfc001fc0, "cMx,V(s,b)", pa10, FLAG_STRICT}, |
{ "sths", 0x0c001240, 0xfc00d3c0, "cmcCx,V(b)", pa11, FLAG_STRICT}, |
{ "sths", 0x0c001240, 0xfc0013c0, "cmcCx,V(s,b)", pa11, FLAG_STRICT}, |
{ "sths", 0x0c001240, 0xfc00dfc0, "cMx,V(b)", pa10, 0}, |
{ "sths", 0x0c001240, 0xfc001fc0, "cMx,V(s,b)", pa10, 0}, |
{ "stbs", 0x0c001200, 0xfc00dfc0, "cMx,V(b)", pa10, FLAG_STRICT}, |
{ "stbs", 0x0c001200, 0xfc001fc0, "cMx,V(s,b)", pa10, FLAG_STRICT}, |
{ "stbs", 0x0c001200, 0xfc00d3c0, "cmcCx,V(b)", pa11, FLAG_STRICT}, |
{ "stbs", 0x0c001200, 0xfc0013c0, "cmcCx,V(s,b)", pa11, FLAG_STRICT}, |
{ "stbs", 0x0c001200, 0xfc00dfc0, "cMx,V(b)", pa10, 0}, |
{ "stbs", 0x0c001200, 0xfc001fc0, "cMx,V(s,b)", pa10, 0}, |
{ "stwas", 0x0c001380, 0xfc00dfc0, "cMx,V(b)", pa10, FLAG_STRICT}, |
{ "stwas", 0x0c001380, 0xfc00d3c0, "cmcCx,V(b)", pa11, FLAG_STRICT}, |
{ "stwas", 0x0c001380, 0xfc00dfc0, "cMx,V(b)", pa10, 0}, |
{ "stdby", 0x0c001340, 0xfc00d3c0, "cscCx,V(b)", pa20, FLAG_STRICT}, |
{ "stdby", 0x0c001340, 0xfc0013c0, "cscCx,V(s,b)", pa20, FLAG_STRICT}, |
{ "stbys", 0x0c001300, 0xfc00dfc0, "cAx,V(b)", pa10, FLAG_STRICT}, |
{ "stbys", 0x0c001300, 0xfc001fc0, "cAx,V(s,b)", pa10, FLAG_STRICT}, |
{ "stbys", 0x0c001300, 0xfc00d3c0, "cscCx,V(b)", pa11, FLAG_STRICT}, |
{ "stbys", 0x0c001300, 0xfc0013c0, "cscCx,V(s,b)", pa11, FLAG_STRICT}, |
{ "stbys", 0x0c001300, 0xfc00dfc0, "cAx,V(b)", pa10, 0}, |
{ "stbys", 0x0c001300, 0xfc001fc0, "cAx,V(s,b)", pa10, 0}, |
/* Immediate instructions. */ |
{ "ldo", 0x34000000, 0xfc000000, "l(b),x", pa20w, 0}, |
{ "ldo", 0x34000000, 0xfc00c000, "j(b),x", pa10, 0}, |
{ "ldil", 0x20000000, 0xfc000000, "k,b", pa10, 0}, |
{ "addil", 0x28000000, 0xfc000000, "k,b,Z", pa10, 0}, |
{ "addil", 0x28000000, 0xfc000000, "k,b", pa10, 0}, |
/* Branching instructions. */ |
{ "b", 0xe8008000, 0xfc00e000, "cpnXL", pa20, FLAG_STRICT}, |
{ "b", 0xe800a000, 0xfc00e000, "clnXL", pa20, FLAG_STRICT}, |
{ "b", 0xe8000000, 0xfc00e000, "clnW,b", pa10, FLAG_STRICT}, |
{ "b", 0xe8002000, 0xfc00e000, "cgnW,b", pa10, FLAG_STRICT}, |
{ "b", 0xe8000000, 0xffe0e000, "nW", pa10, 0}, /* b,l foo,r0 */ |
{ "bl", 0xe8000000, 0xfc00e000, "nW,b", pa10, 0}, |
{ "gate", 0xe8002000, 0xfc00e000, "nW,b", pa10, 0}, |
{ "blr", 0xe8004000, 0xfc00e001, "nx,b", pa10, 0}, |
{ "bv", 0xe800c000, 0xfc00fffd, "nx(b)", pa10, 0}, |
{ "bv", 0xe800c000, 0xfc00fffd, "n(b)", pa10, 0}, |
{ "bve", 0xe800f001, 0xfc1ffffd, "cpn(b)L", pa20, FLAG_STRICT}, |
{ "bve", 0xe800f000, 0xfc1ffffd, "cln(b)L", pa20, FLAG_STRICT}, |
{ "bve", 0xe800d001, 0xfc1ffffd, "cPn(b)", pa20, FLAG_STRICT}, |
{ "bve", 0xe800d000, 0xfc1ffffd, "n(b)", pa20, FLAG_STRICT}, |
{ "be", 0xe4000000, 0xfc000000, "clnz(S,b),Y", pa10, FLAG_STRICT}, |
{ "be", 0xe4000000, 0xfc000000, "clnz(b),Y", pa10, FLAG_STRICT}, |
{ "be", 0xe0000000, 0xfc000000, "nz(S,b)", pa10, 0}, |
{ "be", 0xe0000000, 0xfc000000, "nz(b)", pa10, 0}, |
{ "ble", 0xe4000000, 0xfc000000, "nz(S,b)", pa10, 0}, |
{ "movb", 0xc8000000, 0xfc000000, "?ynx,b,w", pa10, 0}, |
{ "movib", 0xcc000000, 0xfc000000, "?yn5,b,w", pa10, 0}, |
{ "combt", 0x80000000, 0xfc000000, "?tnx,b,w", pa10, 0}, |
{ "combf", 0x88000000, 0xfc000000, "?tnx,b,w", pa10, 0}, |
{ "comibt", 0x84000000, 0xfc000000, "?tn5,b,w", pa10, 0}, |
{ "comibf", 0x8c000000, 0xfc000000, "?tn5,b,w", pa10, 0}, |
{ "addbt", 0xa0000000, 0xfc000000, "?dnx,b,w", pa10, 0}, |
{ "addbf", 0xa8000000, 0xfc000000, "?dnx,b,w", pa10, 0}, |
{ "addibt", 0xa4000000, 0xfc000000, "?dn5,b,w", pa10, 0}, |
{ "addibf", 0xac000000, 0xfc000000, "?dn5,b,w", pa10, 0}, |
{ "bb", 0xc0006000, 0xffe06000, "?Bnx,!,w", pa20, FLAG_STRICT}, |
{ "bb", 0xc0004000, 0xffe06000, "?bnx,!,w", pa10, FLAG_STRICT}, |
{ "bb", 0xc4004000, 0xfc004000, "?Bnx,B,w", pa20, FLAG_STRICT}, |
{ "bb", 0xc4004000, 0xfc006000, "?bnx,Q,w", pa10, FLAG_STRICT}, |
{ "bb", 0xc4004000, 0xfc006000, "?bnx,Q,w", pa10, 0}, |
{ "bvb", 0xc0004000, 0xffe04000, "?bnx,w", pa10, 0}, |
{ "clrbts", 0xe8004005, 0xffffffff, "", pa20, FLAG_STRICT}, |
{ "popbts", 0xe8004005, 0xfffff007, "$", pa20, FLAG_STRICT}, |
{ "pushnom", 0xe8004001, 0xffffffff, "", pa20, FLAG_STRICT}, |
{ "pushbts", 0xe8004001, 0xffe0ffff, "x", pa20, FLAG_STRICT}, |
/* Computation Instructions. */ |
{ "cmpclr", 0x080008a0, 0xfc000fe0, "?Sx,b,t", pa20, FLAG_STRICT}, |
{ "cmpclr", 0x08000880, 0xfc000fe0, "?sx,b,t", pa10, FLAG_STRICT}, |
{ "comclr", 0x08000880, 0xfc000fe0, "?sx,b,t", pa10, 0}, |
{ "or", 0x08000260, 0xfc000fe0, "?Lx,b,t", pa20, FLAG_STRICT}, |
{ "or", 0x08000240, 0xfc000fe0, "?lx,b,t", pa10, 0}, |
{ "xor", 0x080002a0, 0xfc000fe0, "?Lx,b,t", pa20, FLAG_STRICT}, |
{ "xor", 0x08000280, 0xfc000fe0, "?lx,b,t", pa10, 0}, |
{ "and", 0x08000220, 0xfc000fe0, "?Lx,b,t", pa20, FLAG_STRICT}, |
{ "and", 0x08000200, 0xfc000fe0, "?lx,b,t", pa10, 0}, |
{ "andcm", 0x08000020, 0xfc000fe0, "?Lx,b,t", pa20, FLAG_STRICT}, |
{ "andcm", 0x08000000, 0xfc000fe0, "?lx,b,t", pa10, 0}, |
{ "uxor", 0x080003a0, 0xfc000fe0, "?Ux,b,t", pa20, FLAG_STRICT}, |
{ "uxor", 0x08000380, 0xfc000fe0, "?ux,b,t", pa10, 0}, |
{ "uaddcm", 0x080009a0, 0xfc000fa0, "cT?Ux,b,t", pa20, FLAG_STRICT}, |
{ "uaddcm", 0x08000980, 0xfc000fa0, "cT?ux,b,t", pa10, FLAG_STRICT}, |
{ "uaddcm", 0x08000980, 0xfc000fe0, "?ux,b,t", pa10, 0}, |
{ "uaddcmt", 0x080009c0, 0xfc000fe0, "?ux,b,t", pa10, 0}, |
{ "dcor", 0x08000ba0, 0xfc1f0fa0, "ci?Ub,t", pa20, FLAG_STRICT}, |
{ "dcor", 0x08000b80, 0xfc1f0fa0, "ci?ub,t", pa10, FLAG_STRICT}, |
{ "dcor", 0x08000b80, 0xfc1f0fe0, "?ub,t", pa10, 0}, |
{ "idcor", 0x08000bc0, 0xfc1f0fe0, "?ub,t", pa10, 0}, |
{ "addi", 0xb0000000, 0xfc000000, "ct?ai,b,x", pa10, FLAG_STRICT}, |
{ "addi", 0xb4000000, 0xfc000000, "cv?ai,b,x", pa10, FLAG_STRICT}, |
{ "addi", 0xb4000000, 0xfc000800, "?ai,b,x", pa10, 0}, |
{ "addio", 0xb4000800, 0xfc000800, "?ai,b,x", pa10, 0}, |
{ "addit", 0xb0000000, 0xfc000800, "?ai,b,x", pa10, 0}, |
{ "addito", 0xb0000800, 0xfc000800, "?ai,b,x", pa10, 0}, |
{ "add", 0x08000720, 0xfc0007e0, "cY?Ax,b,t", pa20, FLAG_STRICT}, |
{ "add", 0x08000700, 0xfc0007e0, "cy?ax,b,t", pa10, FLAG_STRICT}, |
{ "add", 0x08000220, 0xfc0003e0, "ca?Ax,b,t", pa20, FLAG_STRICT}, |
{ "add", 0x08000200, 0xfc0003e0, "ca?ax,b,t", pa10, FLAG_STRICT}, |
{ "add", 0x08000600, 0xfc000fe0, "?ax,b,t", pa10, 0}, |
{ "addl", 0x08000a00, 0xfc000fe0, "?ax,b,t", pa10, 0}, |
{ "addo", 0x08000e00, 0xfc000fe0, "?ax,b,t", pa10, 0}, |
{ "addc", 0x08000700, 0xfc000fe0, "?ax,b,t", pa10, 0}, |
{ "addco", 0x08000f00, 0xfc000fe0, "?ax,b,t", pa10, 0}, |
{ "sub", 0x080004e0, 0xfc0007e0, "ct?Sx,b,t", pa20, FLAG_STRICT}, |
{ "sub", 0x080004c0, 0xfc0007e0, "ct?sx,b,t", pa10, FLAG_STRICT}, |
{ "sub", 0x08000520, 0xfc0007e0, "cB?Sx,b,t", pa20, FLAG_STRICT}, |
{ "sub", 0x08000500, 0xfc0007e0, "cb?sx,b,t", pa10, FLAG_STRICT}, |
{ "sub", 0x08000420, 0xfc0007e0, "cv?Sx,b,t", pa20, FLAG_STRICT}, |
{ "sub", 0x08000400, 0xfc0007e0, "cv?sx,b,t", pa10, FLAG_STRICT}, |
{ "sub", 0x08000400, 0xfc000fe0, "?sx,b,t", pa10, 0}, |
{ "subo", 0x08000c00, 0xfc000fe0, "?sx,b,t", pa10, 0}, |
{ "subb", 0x08000500, 0xfc000fe0, "?sx,b,t", pa10, 0}, |
{ "subbo", 0x08000d00, 0xfc000fe0, "?sx,b,t", pa10, 0}, |
{ "subt", 0x080004c0, 0xfc000fe0, "?sx,b,t", pa10, 0}, |
{ "subto", 0x08000cc0, 0xfc000fe0, "?sx,b,t", pa10, 0}, |
{ "ds", 0x08000440, 0xfc000fe0, "?sx,b,t", pa10, 0}, |
{ "subi", 0x94000000, 0xfc000000, "cv?si,b,x", pa10, FLAG_STRICT}, |
{ "subi", 0x94000000, 0xfc000800, "?si,b,x", pa10, 0}, |
{ "subio", 0x94000800, 0xfc000800, "?si,b,x", pa10, 0}, |
{ "cmpiclr", 0x90000800, 0xfc000800, "?Si,b,x", pa20, FLAG_STRICT}, |
{ "cmpiclr", 0x90000000, 0xfc000800, "?si,b,x", pa10, FLAG_STRICT}, |
{ "comiclr", 0x90000000, 0xfc000800, "?si,b,x", pa10, 0}, |
{ "shladd", 0x08000220, 0xfc000320, "ca?Ax,.,b,t", pa20, FLAG_STRICT}, |
{ "shladd", 0x08000200, 0xfc000320, "ca?ax,.,b,t", pa10, FLAG_STRICT}, |
{ "sh1add", 0x08000640, 0xfc000fe0, "?ax,b,t", pa10, 0}, |
{ "sh1addl", 0x08000a40, 0xfc000fe0, "?ax,b,t", pa10, 0}, |
{ "sh1addo", 0x08000e40, 0xfc000fe0, "?ax,b,t", pa10, 0}, |
{ "sh2add", 0x08000680, 0xfc000fe0, "?ax,b,t", pa10, 0}, |
{ "sh2addl", 0x08000a80, 0xfc000fe0, "?ax,b,t", pa10, 0}, |
{ "sh2addo", 0x08000e80, 0xfc000fe0, "?ax,b,t", pa10, 0}, |
{ "sh3add", 0x080006c0, 0xfc000fe0, "?ax,b,t", pa10, 0}, |
{ "sh3addl", 0x08000ac0, 0xfc000fe0, "?ax,b,t", pa10, 0}, |
{ "sh3addo", 0x08000ec0, 0xfc000fe0, "?ax,b,t", pa10, 0}, |
/* Subword Operation Instructions. */ |
{ "hadd", 0x08000300, 0xfc00ff20, "cHx,b,t", pa20, FLAG_STRICT}, |
{ "havg", 0x080002c0, 0xfc00ffe0, "x,b,t", pa20, FLAG_STRICT}, |
{ "hshl", 0xf8008800, 0xffe0fc20, "x,*,t", pa20, FLAG_STRICT}, |
{ "hshladd", 0x08000700, 0xfc00ff20, "x,.,b,t", pa20, FLAG_STRICT}, |
{ "hshr", 0xf800c800, 0xfc1ff820, "cSb,*,t", pa20, FLAG_STRICT}, |
{ "hshradd", 0x08000500, 0xfc00ff20, "x,.,b,t", pa20, FLAG_STRICT}, |
{ "hsub", 0x08000100, 0xfc00ff20, "cHx,b,t", pa20, FLAG_STRICT}, |
{ "mixh", 0xf8008400, 0xfc009fe0, "chx,b,t", pa20, FLAG_STRICT}, |
{ "mixw", 0xf8008000, 0xfc009fe0, "chx,b,t", pa20, FLAG_STRICT}, |
{ "permh", 0xf8000000, 0xfc009020, "c*a,t", pa20, FLAG_STRICT}, |
/* Extract and Deposit Instructions. */ |
{ "shrpd", 0xd0000200, 0xfc001fe0, "?Xx,b,!,t", pa20, FLAG_STRICT}, |
{ "shrpd", 0xd0000400, 0xfc001400, "?Xx,b,~,t", pa20, FLAG_STRICT}, |
{ "shrpw", 0xd0000000, 0xfc001fe0, "?xx,b,!,t", pa10, FLAG_STRICT}, |
{ "shrpw", 0xd0000800, 0xfc001c00, "?xx,b,p,t", pa10, FLAG_STRICT}, |
{ "vshd", 0xd0000000, 0xfc001fe0, "?xx,b,t", pa10, 0}, |
{ "shd", 0xd0000800, 0xfc001c00, "?xx,b,p,t", pa10, 0}, |
{ "extrd", 0xd0001200, 0xfc001ae0, "cS?Xb,!,%,x", pa20, FLAG_STRICT}, |
{ "extrd", 0xd8000000, 0xfc000000, "cS?Xb,q,|,x", pa20, FLAG_STRICT}, |
{ "extrw", 0xd0001000, 0xfc001be0, "cS?xb,!,T,x", pa10, FLAG_STRICT}, |
{ "extrw", 0xd0001800, 0xfc001800, "cS?xb,P,T,x", pa10, FLAG_STRICT}, |
{ "vextru", 0xd0001000, 0xfc001fe0, "?xb,T,x", pa10, 0}, |
{ "vextrs", 0xd0001400, 0xfc001fe0, "?xb,T,x", pa10, 0}, |
{ "extru", 0xd0001800, 0xfc001c00, "?xb,P,T,x", pa10, 0}, |
{ "extrs", 0xd0001c00, 0xfc001c00, "?xb,P,T,x", pa10, 0}, |
{ "depd", 0xd4000200, 0xfc001ae0, "cz?Xx,!,%,b", pa20, FLAG_STRICT}, |
{ "depd", 0xf0000000, 0xfc000000, "cz?Xx,~,|,b", pa20, FLAG_STRICT}, |
{ "depdi", 0xd4001200, 0xfc001ae0, "cz?X5,!,%,b", pa20, FLAG_STRICT}, |
{ "depdi", 0xf4000000, 0xfc000000, "cz?X5,~,|,b", pa20, FLAG_STRICT}, |
{ "depw", 0xd4000000, 0xfc001be0, "cz?xx,!,T,b", pa10, FLAG_STRICT}, |
{ "depw", 0xd4000800, 0xfc001800, "cz?xx,p,T,b", pa10, FLAG_STRICT}, |
{ "depwi", 0xd4001000, 0xfc001be0, "cz?x5,!,T,b", pa10, FLAG_STRICT}, |
{ "depwi", 0xd4001800, 0xfc001800, "cz?x5,p,T,b", pa10, FLAG_STRICT}, |
{ "zvdep", 0xd4000000, 0xfc001fe0, "?xx,T,b", pa10, 0}, |
{ "vdep", 0xd4000400, 0xfc001fe0, "?xx,T,b", pa10, 0}, |
{ "zdep", 0xd4000800, 0xfc001c00, "?xx,p,T,b", pa10, 0}, |
{ "dep", 0xd4000c00, 0xfc001c00, "?xx,p,T,b", pa10, 0}, |
{ "zvdepi", 0xd4001000, 0xfc001fe0, "?x5,T,b", pa10, 0}, |
{ "vdepi", 0xd4001400, 0xfc001fe0, "?x5,T,b", pa10, 0}, |
{ "zdepi", 0xd4001800, 0xfc001c00, "?x5,p,T,b", pa10, 0}, |
{ "depi", 0xd4001c00, 0xfc001c00, "?x5,p,T,b", pa10, 0}, |
/* System Control Instructions. */ |
{ "break", 0x00000000, 0xfc001fe0, "r,A", pa10, 0}, |
{ "rfi", 0x00000c00, 0xffffff1f, "cr", pa10, FLAG_STRICT}, |
{ "rfi", 0x00000c00, 0xffffffff, "", pa10, 0}, |
{ "rfir", 0x00000ca0, 0xffffffff, "", pa11, 0}, |
{ "ssm", 0x00000d60, 0xfc00ffe0, "U,t", pa20, FLAG_STRICT}, |
{ "ssm", 0x00000d60, 0xffe0ffe0, "R,t", pa10, 0}, |
{ "rsm", 0x00000e60, 0xfc00ffe0, "U,t", pa20, FLAG_STRICT}, |
{ "rsm", 0x00000e60, 0xffe0ffe0, "R,t", pa10, 0}, |
{ "mtsm", 0x00001860, 0xffe0ffff, "x", pa10, 0}, |
{ "ldsid", 0x000010a0, 0xfc1fffe0, "(b),t", pa10, 0}, |
{ "ldsid", 0x000010a0, 0xfc1f3fe0, "(s,b),t", pa10, 0}, |
{ "mtsp", 0x00001820, 0xffe01fff, "x,S", pa10, 0}, |
{ "mtctl", 0x00001840, 0xfc00ffff, "x,^", pa10, 0}, |
{ "mtsarcm", 0x016018C0, 0xffe0ffff, "x", pa20, FLAG_STRICT}, |
{ "mfia", 0x000014A0, 0xffffffe0, "t", pa20, FLAG_STRICT}, |
{ "mfsp", 0x000004a0, 0xffff1fe0, "S,t", pa10, 0}, |
{ "mfctl", 0x016048a0, 0xffffffe0, "cW!,t", pa20, FLAG_STRICT}, |
{ "mfctl", 0x000008a0, 0xfc1fffe0, "^,t", pa10, 0}, |
{ "sync", 0x00000400, 0xffffffff, "", pa10, 0}, |
{ "syncdma", 0x00100400, 0xffffffff, "", pa10, 0}, |
{ "probe", 0x04001180, 0xfc00ffa0, "cw(b),x,t", pa10, FLAG_STRICT}, |
{ "probe", 0x04001180, 0xfc003fa0, "cw(s,b),x,t", pa10, FLAG_STRICT}, |
{ "probei", 0x04003180, 0xfc00ffa0, "cw(b),R,t", pa10, FLAG_STRICT}, |
{ "probei", 0x04003180, 0xfc003fa0, "cw(s,b),R,t", pa10, FLAG_STRICT}, |
{ "prober", 0x04001180, 0xfc00ffe0, "(b),x,t", pa10, 0}, |
{ "prober", 0x04001180, 0xfc003fe0, "(s,b),x,t", pa10, 0}, |
{ "proberi", 0x04003180, 0xfc00ffe0, "(b),R,t", pa10, 0}, |
{ "proberi", 0x04003180, 0xfc003fe0, "(s,b),R,t", pa10, 0}, |
{ "probew", 0x040011c0, 0xfc00ffe0, "(b),x,t", pa10, 0}, |
{ "probew", 0x040011c0, 0xfc003fe0, "(s,b),x,t", pa10, 0}, |
{ "probewi", 0x040031c0, 0xfc00ffe0, "(b),R,t", pa10, 0}, |
{ "probewi", 0x040031c0, 0xfc003fe0, "(s,b),R,t", pa10, 0}, |
{ "lpa", 0x04001340, 0xfc00ffc0, "cZx(b),t", pa10, 0}, |
{ "lpa", 0x04001340, 0xfc003fc0, "cZx(s,b),t", pa10, 0}, |
{ "lci", 0x04001300, 0xfc00ffe0, "x(b),t", pa11, 0}, |
{ "lci", 0x04001300, 0xfc003fe0, "x(s,b),t", pa11, 0}, |
{ "pdtlb", 0x04001600, 0xfc00ffdf, "cLcZx(b)", pa20, FLAG_STRICT}, |
{ "pdtlb", 0x04001600, 0xfc003fdf, "cLcZx(s,b)", pa20, FLAG_STRICT}, |
{ "pdtlb", 0x04001600, 0xfc1fffdf, "cLcZ@(b)", pa20, FLAG_STRICT}, |
{ "pdtlb", 0x04001600, 0xfc1f3fdf, "cLcZ@(s,b)", pa20, FLAG_STRICT}, |
{ "pdtlb", 0x04001200, 0xfc00ffdf, "cZx(b)", pa10, 0}, |
{ "pdtlb", 0x04001200, 0xfc003fdf, "cZx(s,b)", pa10, 0}, |
{ "pitlb", 0x04000600, 0xfc001fdf, "cLcZx(S,b)", pa20, FLAG_STRICT}, |
{ "pitlb", 0x04000600, 0xfc1f1fdf, "cLcZ@(S,b)", pa20, FLAG_STRICT}, |
{ "pitlb", 0x04000200, 0xfc001fdf, "cZx(S,b)", pa10, 0}, |
{ "pdtlbe", 0x04001240, 0xfc00ffdf, "cZx(b)", pa10, 0}, |
{ "pdtlbe", 0x04001240, 0xfc003fdf, "cZx(s,b)", pa10, 0}, |
{ "pitlbe", 0x04000240, 0xfc001fdf, "cZx(S,b)", pa10, 0}, |
{ "idtlba", 0x04001040, 0xfc00ffff, "x,(b)", pa10, 0}, |
{ "idtlba", 0x04001040, 0xfc003fff, "x,(s,b)", pa10, 0}, |
{ "iitlba", 0x04000040, 0xfc001fff, "x,(S,b)", pa10, 0}, |
{ "idtlbp", 0x04001000, 0xfc00ffff, "x,(b)", pa10, 0}, |
{ "idtlbp", 0x04001000, 0xfc003fff, "x,(s,b)", pa10, 0}, |
{ "iitlbp", 0x04000000, 0xfc001fff, "x,(S,b)", pa10, 0}, |
{ "pdc", 0x04001380, 0xfc00ffdf, "cZx(b)", pa10, 0}, |
{ "pdc", 0x04001380, 0xfc003fdf, "cZx(s,b)", pa10, 0}, |
{ "fdc", 0x04001280, 0xfc00ffdf, "cZx(b)", pa10, FLAG_STRICT}, |
{ "fdc", 0x04001280, 0xfc003fdf, "cZx(s,b)", pa10, FLAG_STRICT}, |
{ "fdc", 0x04003280, 0xfc00ffff, "5(b)", pa20, FLAG_STRICT}, |
{ "fdc", 0x04003280, 0xfc003fff, "5(s,b)", pa20, FLAG_STRICT}, |
{ "fdc", 0x04001280, 0xfc00ffdf, "cZx(b)", pa10, 0}, |
{ "fdc", 0x04001280, 0xfc003fdf, "cZx(s,b)", pa10, 0}, |
{ "fic", 0x040013c0, 0xfc00dfdf, "cZx(b)", pa20, FLAG_STRICT}, |
{ "fic", 0x04000280, 0xfc001fdf, "cZx(S,b)", pa10, 0}, |
{ "fdce", 0x040012c0, 0xfc00ffdf, "cZx(b)", pa10, 0}, |
{ "fdce", 0x040012c0, 0xfc003fdf, "cZx(s,b)", pa10, 0}, |
{ "fice", 0x040002c0, 0xfc001fdf, "cZx(S,b)", pa10, 0}, |
{ "diag", 0x14000000, 0xfc000000, "D", pa10, 0}, |
{ "idtlbt", 0x04001800, 0xfc00ffff, "x,b", pa20, FLAG_STRICT}, |
{ "iitlbt", 0x04000800, 0xfc00ffff, "x,b", pa20, FLAG_STRICT}, |
/* These may be specific to certain versions of the PA. Joel claimed |
they were 72000 (7200?) specific. However, I'm almost certain the |
mtcpu/mfcpu were undocumented, but available in the older 700 machines. */ |
{ "mtcpu", 0x14001600, 0xfc00ffff, "x,^", pa10, 0}, |
{ "mfcpu", 0x14001A00, 0xfc00ffff, "^,x", pa10, 0}, |
{ "tocen", 0x14403600, 0xffffffff, "", pa10, 0}, |
{ "tocdis", 0x14401620, 0xffffffff, "", pa10, 0}, |
{ "shdwgr", 0x14402600, 0xffffffff, "", pa10, 0}, |
{ "grshdw", 0x14400620, 0xffffffff, "", pa10, 0}, |
/* gfw and gfr are not in the HP PA 1.1 manual, but they are in either |
the Timex FPU or the Mustang ERS (not sure which) manual. */ |
{ "gfw", 0x04001680, 0xfc00ffdf, "cZx(b)", pa11, 0}, |
{ "gfw", 0x04001680, 0xfc003fdf, "cZx(s,b)", pa11, 0}, |
{ "gfr", 0x04001a80, 0xfc00ffdf, "cZx(b)", pa11, 0}, |
{ "gfr", 0x04001a80, 0xfc003fdf, "cZx(s,b)", pa11, 0}, |
/* Floating Point Coprocessor Instructions. */ |
{ "fldw", 0x24000000, 0xfc00df80, "cXx(b),fT", pa10, FLAG_STRICT}, |
{ "fldw", 0x24000000, 0xfc001f80, "cXx(s,b),fT", pa10, FLAG_STRICT}, |
{ "fldw", 0x24000000, 0xfc00d380, "cxccx(b),fT", pa11, FLAG_STRICT}, |
{ "fldw", 0x24000000, 0xfc001380, "cxccx(s,b),fT", pa11, FLAG_STRICT}, |
{ "fldw", 0x24001020, 0xfc1ff3a0, "cocc@(b),fT", pa20, FLAG_STRICT}, |
{ "fldw", 0x24001020, 0xfc1f33a0, "cocc@(s,b),fT", pa20, FLAG_STRICT}, |
{ "fldw", 0x24001000, 0xfc00df80, "cM5(b),fT", pa10, FLAG_STRICT}, |
{ "fldw", 0x24001000, 0xfc001f80, "cM5(s,b),fT", pa10, FLAG_STRICT}, |
{ "fldw", 0x24001000, 0xfc00d380, "cmcc5(b),fT", pa11, FLAG_STRICT}, |
{ "fldw", 0x24001000, 0xfc001380, "cmcc5(s,b),fT", pa11, FLAG_STRICT}, |
{ "fldw", 0x5c000000, 0xfc000004, "y(b),fe", pa20w, FLAG_STRICT}, |
{ "fldw", 0x58000000, 0xfc000000, "cJy(b),fe", pa20w, FLAG_STRICT}, |
{ "fldw", 0x5c000000, 0xfc00c004, "d(b),fe", pa20, FLAG_STRICT}, |
{ "fldw", 0x5c000000, 0xfc000004, "d(s,b),fe", pa20, FLAG_STRICT}, |
{ "fldw", 0x58000000, 0xfc00c000, "cJd(b),fe", pa20, FLAG_STRICT}, |
{ "fldw", 0x58000000, 0xfc000000, "cJd(s,b),fe", pa20, FLAG_STRICT}, |
{ "fldd", 0x2c000000, 0xfc00dfc0, "cXx(b),ft", pa10, FLAG_STRICT}, |
{ "fldd", 0x2c000000, 0xfc001fc0, "cXx(s,b),ft", pa10, FLAG_STRICT}, |
{ "fldd", 0x2c000000, 0xfc00d3c0, "cxccx(b),ft", pa11, FLAG_STRICT}, |
{ "fldd", 0x2c000000, 0xfc0013c0, "cxccx(s,b),ft", pa11, FLAG_STRICT}, |
{ "fldd", 0x2c001020, 0xfc1ff3e0, "cocc@(b),ft", pa20, FLAG_STRICT}, |
{ "fldd", 0x2c001020, 0xfc1f33e0, "cocc@(s,b),ft", pa20, FLAG_STRICT}, |
{ "fldd", 0x2c001000, 0xfc00dfc0, "cM5(b),ft", pa10, FLAG_STRICT}, |
{ "fldd", 0x2c001000, 0xfc001fc0, "cM5(s,b),ft", pa10, FLAG_STRICT}, |
{ "fldd", 0x2c001000, 0xfc00d3c0, "cmcc5(b),ft", pa11, FLAG_STRICT}, |
{ "fldd", 0x2c001000, 0xfc0013c0, "cmcc5(s,b),ft", pa11, FLAG_STRICT}, |
{ "fldd", 0x50000002, 0xfc000002, "cq&(b),fx", pa20w, FLAG_STRICT}, |
{ "fldd", 0x50000002, 0xfc00c002, "cq#(b),fx", pa20, FLAG_STRICT}, |
{ "fldd", 0x50000002, 0xfc000002, "cq#(s,b),fx", pa20, FLAG_STRICT}, |
{ "fstw", 0x24000200, 0xfc00df80, "cXfT,x(b)", pa10, FLAG_STRICT}, |
{ "fstw", 0x24000200, 0xfc001f80, "cXfT,x(s,b)", pa10, FLAG_STRICT}, |
{ "fstw", 0x24000200, 0xfc00d380, "cxcCfT,x(b)", pa11, FLAG_STRICT}, |
{ "fstw", 0x24000200, 0xfc001380, "cxcCfT,x(s,b)", pa11, FLAG_STRICT}, |
{ "fstw", 0x24001220, 0xfc1ff3a0, "cocCfT,@(b)", pa20, FLAG_STRICT}, |
{ "fstw", 0x24001220, 0xfc1f33a0, "cocCfT,@(s,b)", pa20, FLAG_STRICT}, |
{ "fstw", 0x24001200, 0xfc00df80, "cMfT,5(b)", pa10, FLAG_STRICT}, |
{ "fstw", 0x24001200, 0xfc001f80, "cMfT,5(s,b)", pa10, FLAG_STRICT}, |
{ "fstw", 0x24001200, 0xfc00df80, "cMfT,5(b)", pa10, FLAG_STRICT}, |
{ "fstw", 0x24001200, 0xfc001f80, "cMfT,5(s,b)", pa10, FLAG_STRICT}, |
{ "fstw", 0x7c000000, 0xfc000004, "fE,y(b)", pa20w, FLAG_STRICT}, |
{ "fstw", 0x78000000, 0xfc000000, "cJfE,y(b)", pa20w, FLAG_STRICT}, |
{ "fstw", 0x7c000000, 0xfc00c004, "fE,d(b)", pa20, FLAG_STRICT}, |
{ "fstw", 0x7c000000, 0xfc000004, "fE,d(s,b)", pa20, FLAG_STRICT}, |
{ "fstw", 0x78000000, 0xfc00c000, "cJfE,d(b)", pa20, FLAG_STRICT}, |
{ "fstw", 0x78000000, 0xfc000000, "cJfE,d(s,b)", pa20, FLAG_STRICT}, |
{ "fstd", 0x2c000200, 0xfc00dfc0, "cXft,x(b)", pa10, FLAG_STRICT}, |
{ "fstd", 0x2c000200, 0xfc001fc0, "cXft,x(s,b)", pa10, FLAG_STRICT}, |
{ "fstd", 0x2c000200, 0xfc00d3c0, "cxcCft,x(b)", pa11, FLAG_STRICT}, |
{ "fstd", 0x2c000200, 0xfc0013c0, "cxcCft,x(s,b)", pa11, FLAG_STRICT}, |
{ "fstd", 0x2c001220, 0xfc1ff3e0, "cocCft,@(b)", pa20, FLAG_STRICT}, |
{ "fstd", 0x2c001220, 0xfc1f33e0, "cocCft,@(s,b)", pa20, FLAG_STRICT}, |
{ "fstd", 0x2c001200, 0xfc00dfc0, "cMft,5(b)", pa10, FLAG_STRICT}, |
{ "fstd", 0x2c001200, 0xfc001fc0, "cMft,5(s,b)", pa10, FLAG_STRICT}, |
{ "fstd", 0x2c001200, 0xfc00d3c0, "cmcCft,5(b)", pa11, FLAG_STRICT}, |
{ "fstd", 0x2c001200, 0xfc0013c0, "cmcCft,5(s,b)", pa11, FLAG_STRICT}, |
{ "fstd", 0x70000002, 0xfc000002, "cqfx,&(b)", pa20w, FLAG_STRICT}, |
{ "fstd", 0x70000002, 0xfc00c002, "cqfx,#(b)", pa20, FLAG_STRICT}, |
{ "fstd", 0x70000002, 0xfc000002, "cqfx,#(s,b)", pa20, FLAG_STRICT}, |
{ "fldwx", 0x24000000, 0xfc00df80, "cXx(b),fT", pa10, FLAG_STRICT}, |
{ "fldwx", 0x24000000, 0xfc001f80, "cXx(s,b),fT", pa10, FLAG_STRICT}, |
{ "fldwx", 0x24000000, 0xfc00d380, "cxccx(b),fT", pa11, FLAG_STRICT}, |
{ "fldwx", 0x24000000, 0xfc001380, "cxccx(s,b),fT", pa11, FLAG_STRICT}, |
{ "fldwx", 0x24000000, 0xfc00df80, "cXx(b),fT", pa10, 0}, |
{ "fldwx", 0x24000000, 0xfc001f80, "cXx(s,b),fT", pa10, 0}, |
{ "flddx", 0x2c000000, 0xfc00dfc0, "cXx(b),ft", pa10, FLAG_STRICT}, |
{ "flddx", 0x2c000000, 0xfc001fc0, "cXx(s,b),ft", pa10, FLAG_STRICT}, |
{ "flddx", 0x2c000000, 0xfc00d3c0, "cxccx(b),ft", pa11, FLAG_STRICT}, |
{ "flddx", 0x2c000000, 0xfc0013c0, "cxccx(s,b),ft", pa11, FLAG_STRICT}, |
{ "flddx", 0x2c000000, 0xfc00dfc0, "cXx(b),ft", pa10, 0}, |
{ "flddx", 0x2c000000, 0xfc001fc0, "cXx(s,b),ft", pa10, 0}, |
{ "fstwx", 0x24000200, 0xfc00df80, "cxfT,x(b)", pa10, FLAG_STRICT}, |
{ "fstwx", 0x24000200, 0xfc001f80, "cxfT,x(s,b)", pa10, FLAG_STRICT}, |
{ "fstwx", 0x24000200, 0xfc00d380, "cxcCfT,x(b)", pa11, FLAG_STRICT}, |
{ "fstwx", 0x24000200, 0xfc001380, "cxcCfT,x(s,b)", pa11, FLAG_STRICT}, |
{ "fstwx", 0x24000200, 0xfc00df80, "cxfT,x(b)", pa10, 0}, |
{ "fstwx", 0x24000200, 0xfc001f80, "cxfT,x(s,b)", pa10, 0}, |
{ "fstdx", 0x2c000200, 0xfc00dfc0, "cxft,x(b)", pa10, FLAG_STRICT}, |
{ "fstdx", 0x2c000200, 0xfc001fc0, "cxft,x(s,b)", pa10, FLAG_STRICT}, |
{ "fstdx", 0x2c000200, 0xfc00d3c0, "cxcCft,x(b)", pa11, FLAG_STRICT}, |
{ "fstdx", 0x2c000200, 0xfc0013c0, "cxcCft,x(s,b)", pa11, FLAG_STRICT}, |
{ "fstdx", 0x2c000200, 0xfc00dfc0, "cxft,x(b)", pa10, 0}, |
{ "fstdx", 0x2c000200, 0xfc001fc0, "cxft,x(s,b)", pa10, 0}, |
{ "fstqx", 0x3c000200, 0xfc00dfc0, "cXft,x(b)", pa10, 0}, |
{ "fstqx", 0x3c000200, 0xfc001fc0, "cXft,x(s,b)", pa10, 0}, |
{ "fldws", 0x24001000, 0xfc00df80, "cm5(b),fT", pa10, FLAG_STRICT}, |
{ "fldws", 0x24001000, 0xfc001f80, "cm5(s,b),fT", pa10, FLAG_STRICT}, |
{ "fldws", 0x24001000, 0xfc00d380, "cmcc5(b),fT", pa11, FLAG_STRICT}, |
{ "fldws", 0x24001000, 0xfc001380, "cmcc5(s,b),fT", pa11, FLAG_STRICT}, |
{ "fldws", 0x24001000, 0xfc00df80, "cm5(b),fT", pa10, 0}, |
{ "fldws", 0x24001000, 0xfc001f80, "cm5(s,b),fT", pa10, 0}, |
{ "fldds", 0x2c001000, 0xfc00dfc0, "cm5(b),ft", pa10, FLAG_STRICT}, |
{ "fldds", 0x2c001000, 0xfc001fc0, "cm5(s,b),ft", pa10, FLAG_STRICT}, |
{ "fldds", 0x2c001000, 0xfc00d3c0, "cmcc5(b),ft", pa11, FLAG_STRICT}, |
{ "fldds", 0x2c001000, 0xfc0013c0, "cmcc5(s,b),ft", pa11, FLAG_STRICT}, |
{ "fldds", 0x2c001000, 0xfc00dfc0, "cm5(b),ft", pa10, 0}, |
{ "fldds", 0x2c001000, 0xfc001fc0, "cm5(s,b),ft", pa10, 0}, |
{ "fstws", 0x24001200, 0xfc00df80, "cmfT,5(b)", pa10, FLAG_STRICT}, |
{ "fstws", 0x24001200, 0xfc001f80, "cmfT,5(s,b)", pa10, FLAG_STRICT}, |
{ "fstws", 0x24001200, 0xfc00d380, "cmcCfT,5(b)", pa11, FLAG_STRICT}, |
{ "fstws", 0x24001200, 0xfc001380, "cmcCfT,5(s,b)", pa11, FLAG_STRICT}, |
{ "fstws", 0x24001200, 0xfc00df80, "cmfT,5(b)", pa10, 0}, |
{ "fstws", 0x24001200, 0xfc001f80, "cmfT,5(s,b)", pa10, 0}, |
{ "fstds", 0x2c001200, 0xfc00dfc0, "cmft,5(b)", pa10, FLAG_STRICT}, |
{ "fstds", 0x2c001200, 0xfc001fc0, "cmft,5(s,b)", pa10, FLAG_STRICT}, |
{ "fstds", 0x2c001200, 0xfc00d3c0, "cmcCft,5(b)", pa11, FLAG_STRICT}, |
{ "fstds", 0x2c001200, 0xfc0013c0, "cmcCft,5(s,b)", pa11, FLAG_STRICT}, |
{ "fstds", 0x2c001200, 0xfc00dfc0, "cmft,5(b)", pa10, 0}, |
{ "fstds", 0x2c001200, 0xfc001fc0, "cmft,5(s,b)", pa10, 0}, |
{ "fstqs", 0x3c001200, 0xfc00dfc0, "cMft,5(b)", pa10, 0}, |
{ "fstqs", 0x3c001200, 0xfc001fc0, "cMft,5(s,b)", pa10, 0}, |
{ "fadd", 0x30000600, 0xfc00e7e0, "Ffa,fb,fT", pa10, 0}, |
{ "fadd", 0x38000600, 0xfc00e720, "IfA,fB,fT", pa10, 0}, |
{ "fsub", 0x30002600, 0xfc00e7e0, "Ffa,fb,fT", pa10, 0}, |
{ "fsub", 0x38002600, 0xfc00e720, "IfA,fB,fT", pa10, 0}, |
{ "fmpy", 0x30004600, 0xfc00e7e0, "Ffa,fb,fT", pa10, 0}, |
{ "fmpy", 0x38004600, 0xfc00e720, "IfA,fB,fT", pa10, 0}, |
{ "fdiv", 0x30006600, 0xfc00e7e0, "Ffa,fb,fT", pa10, 0}, |
{ "fdiv", 0x38006600, 0xfc00e720, "IfA,fB,fT", pa10, 0}, |
{ "fsqrt", 0x30008000, 0xfc1fe7e0, "Ffa,fT", pa10, 0}, |
{ "fsqrt", 0x38008000, 0xfc1fe720, "FfA,fT", pa10, 0}, |
{ "fabs", 0x30006000, 0xfc1fe7e0, "Ffa,fT", pa10, 0}, |
{ "fabs", 0x38006000, 0xfc1fe720, "FfA,fT", pa10, 0}, |
{ "frem", 0x30008600, 0xfc00e7e0, "Ffa,fb,fT", pa10, 0}, |
{ "frem", 0x38008600, 0xfc00e720, "FfA,fB,fT", pa10, 0}, |
{ "frnd", 0x3000a000, 0xfc1fe7e0, "Ffa,fT", pa10, 0}, |
{ "frnd", 0x3800a000, 0xfc1fe720, "FfA,fT", pa10, 0}, |
{ "fcpy", 0x30004000, 0xfc1fe7e0, "Ffa,fT", pa10, 0}, |
{ "fcpy", 0x38004000, 0xfc1fe720, "FfA,fT", pa10, 0}, |
{ "fcnvff", 0x30000200, 0xfc1f87e0, "FGfa,fT", pa10, 0}, |
{ "fcnvff", 0x38000200, 0xfc1f8720, "FGfA,fT", pa10, 0}, |
{ "fcnvxf", 0x30008200, 0xfc1f87e0, "FGfa,fT", pa10, 0}, |
{ "fcnvxf", 0x38008200, 0xfc1f8720, "FGfA,fT", pa10, 0}, |
{ "fcnvfx", 0x30010200, 0xfc1f87e0, "FGfa,fT", pa10, 0}, |
{ "fcnvfx", 0x38010200, 0xfc1f8720, "FGfA,fT", pa10, 0}, |
{ "fcnvfxt", 0x30018200, 0xfc1f87e0, "FGfa,fT", pa10, 0}, |
{ "fcnvfxt", 0x38018200, 0xfc1f8720, "FGfA,fT", pa10, 0}, |
{ "fmpyfadd", 0xb8000000, 0xfc000020, "IfA,fB,fC,fT", pa20, FLAG_STRICT}, |
{ "fmpynfadd", 0xb8000020, 0xfc000020, "IfA,fB,fC,fT", pa20, FLAG_STRICT}, |
{ "fneg", 0x3000c000, 0xfc1fe7e0, "Ffa,fT", pa20, FLAG_STRICT}, |
{ "fneg", 0x3800c000, 0xfc1fe720, "IfA,fT", pa20, FLAG_STRICT}, |
{ "fnegabs", 0x3000e000, 0xfc1fe7e0, "Ffa,fT", pa20, FLAG_STRICT}, |
{ "fnegabs", 0x3800e000, 0xfc1fe720, "IfA,fT", pa20, FLAG_STRICT}, |
{ "fcnv", 0x30000200, 0xfc1c0720, "{_fa,fT", pa20, FLAG_STRICT}, |
{ "fcnv", 0x38000200, 0xfc1c0720, "FGfA,fT", pa20, FLAG_STRICT}, |
{ "fcmp", 0x30000400, 0xfc00e7e0, "F?ffa,fb", pa10, FLAG_STRICT}, |
{ "fcmp", 0x38000400, 0xfc00e720, "I?ffA,fB", pa10, FLAG_STRICT}, |
{ "fcmp", 0x30000400, 0xfc0007e0, "F?ffa,fb,h", pa20, FLAG_STRICT}, |
{ "fcmp", 0x38000400, 0xfc000720, "I?ffA,fB,h", pa20, FLAG_STRICT}, |
{ "fcmp", 0x30000400, 0xfc00e7e0, "F?ffa,fb", pa10, 0}, |
{ "fcmp", 0x38000400, 0xfc00e720, "I?ffA,fB", pa10, 0}, |
{ "xmpyu", 0x38004700, 0xfc00e720, "fX,fB,fT", pa11, 0}, |
{ "fmpyadd", 0x18000000, 0xfc000000, "Hfi,fj,fk,fl,fm", pa11, 0}, |
{ "fmpysub", 0x98000000, 0xfc000000, "Hfi,fj,fk,fl,fm", pa11, 0}, |
{ "ftest", 0x30002420, 0xffffffff, "", pa10, FLAG_STRICT}, |
{ "ftest", 0x30002420, 0xffffffe0, ",=", pa20, FLAG_STRICT}, |
{ "ftest", 0x30000420, 0xffff1fff, "m", pa20, FLAG_STRICT}, |
{ "fid", 0x30000000, 0xffffffff, "", pa11, 0}, |
/* Performance Monitor Instructions. */ |
{ "pmdis", 0x30000280, 0xffffffdf, "N", pa20, FLAG_STRICT}, |
{ "pmenb", 0x30000680, 0xffffffff, "", pa20, FLAG_STRICT}, |
/* Assist Instructions. */ |
{ "spop0", 0x10000000, 0xfc000600, "v,ON", pa10, 0}, |
{ "spop1", 0x10000200, 0xfc000600, "v,oNt", pa10, 0}, |
{ "spop2", 0x10000400, 0xfc000600, "v,1Nb", pa10, 0}, |
{ "spop3", 0x10000600, 0xfc000600, "v,0Nx,b", pa10, 0}, |
{ "copr", 0x30000000, 0xfc000000, "u,2N", pa10, 0}, |
{ "cldw", 0x24000000, 0xfc00de00, "ucXx(b),t", pa10, FLAG_STRICT}, |
{ "cldw", 0x24000000, 0xfc001e00, "ucXx(s,b),t", pa10, FLAG_STRICT}, |
{ "cldw", 0x24000000, 0xfc00d200, "ucxccx(b),t", pa11, FLAG_STRICT}, |
{ "cldw", 0x24000000, 0xfc001200, "ucxccx(s,b),t", pa11, FLAG_STRICT}, |
{ "cldw", 0x24001000, 0xfc00d200, "ucocc@(b),t", pa20, FLAG_STRICT}, |
{ "cldw", 0x24001000, 0xfc001200, "ucocc@(s,b),t", pa20, FLAG_STRICT}, |
{ "cldw", 0x24001000, 0xfc00de00, "ucM5(b),t", pa10, FLAG_STRICT}, |
{ "cldw", 0x24001000, 0xfc001e00, "ucM5(s,b),t", pa10, FLAG_STRICT}, |
{ "cldw", 0x24001000, 0xfc00d200, "ucmcc5(b),t", pa11, FLAG_STRICT}, |
{ "cldw", 0x24001000, 0xfc001200, "ucmcc5(s,b),t", pa11, FLAG_STRICT}, |
{ "cldd", 0x2c000000, 0xfc00de00, "ucXx(b),t", pa10, FLAG_STRICT}, |
{ "cldd", 0x2c000000, 0xfc001e00, "ucXx(s,b),t", pa10, FLAG_STRICT}, |
{ "cldd", 0x2c000000, 0xfc00d200, "ucxccx(b),t", pa11, FLAG_STRICT}, |
{ "cldd", 0x2c000000, 0xfc001200, "ucxccx(s,b),t", pa11, FLAG_STRICT}, |
{ "cldd", 0x2c001000, 0xfc00d200, "ucocc@(b),t", pa20, FLAG_STRICT}, |
{ "cldd", 0x2c001000, 0xfc001200, "ucocc@(s,b),t", pa20, FLAG_STRICT}, |
{ "cldd", 0x2c001000, 0xfc00de00, "ucM5(b),t", pa10, FLAG_STRICT}, |
{ "cldd", 0x2c001000, 0xfc001e00, "ucM5(s,b),t", pa10, FLAG_STRICT}, |
{ "cldd", 0x2c001000, 0xfc00d200, "ucmcc5(b),t", pa11, FLAG_STRICT}, |
{ "cldd", 0x2c001000, 0xfc001200, "ucmcc5(s,b),t", pa11, FLAG_STRICT}, |
{ "cstw", 0x24000200, 0xfc00de00, "ucXt,x(b)", pa10, FLAG_STRICT}, |
{ "cstw", 0x24000200, 0xfc001e00, "ucXt,x(s,b)", pa10, FLAG_STRICT}, |
{ "cstw", 0x24000200, 0xfc00d200, "ucxcCt,x(b)", pa11, FLAG_STRICT}, |
{ "cstw", 0x24000200, 0xfc001200, "ucxcCt,x(s,b)", pa11, FLAG_STRICT}, |
{ "cstw", 0x24001200, 0xfc00d200, "ucocCt,@(b)", pa20, FLAG_STRICT}, |
{ "cstw", 0x24001200, 0xfc001200, "ucocCt,@(s,b)", pa20, FLAG_STRICT}, |
{ "cstw", 0x24001200, 0xfc00de00, "ucMt,5(b)", pa10, FLAG_STRICT}, |
{ "cstw", 0x24001200, 0xfc001e00, "ucMt,5(s,b)", pa10, FLAG_STRICT}, |
{ "cstw", 0x24001200, 0xfc00d200, "ucmcCt,5(b)", pa11, FLAG_STRICT}, |
{ "cstw", 0x24001200, 0xfc001200, "ucmcCt,5(s,b)", pa11, FLAG_STRICT}, |
{ "cstd", 0x2c000200, 0xfc00de00, "ucXt,x(b)", pa10, FLAG_STRICT}, |
{ "cstd", 0x2c000200, 0xfc001e00, "ucXt,x(s,b)", pa10, FLAG_STRICT}, |
{ "cstd", 0x2c000200, 0xfc00d200, "ucxcCt,x(b)", pa11, FLAG_STRICT}, |
{ "cstd", 0x2c000200, 0xfc001200, "ucxcCt,x(s,b)", pa11, FLAG_STRICT}, |
{ "cstd", 0x2c001200, 0xfc00d200, "ucocCt,@(b)", pa20, FLAG_STRICT}, |
{ "cstd", 0x2c001200, 0xfc001200, "ucocCt,@(s,b)", pa20, FLAG_STRICT}, |
{ "cstd", 0x2c001200, 0xfc00de00, "ucMt,5(b)", pa10, FLAG_STRICT}, |
{ "cstd", 0x2c001200, 0xfc001e00, "ucMt,5(s,b)", pa10, FLAG_STRICT}, |
{ "cstd", 0x2c001200, 0xfc00d200, "ucmcCt,5(b)", pa11, FLAG_STRICT}, |
{ "cstd", 0x2c001200, 0xfc001200, "ucmcCt,5(s,b)", pa11, FLAG_STRICT}, |
{ "cldwx", 0x24000000, 0xfc00de00, "ucXx(b),t", pa10, FLAG_STRICT}, |
{ "cldwx", 0x24000000, 0xfc001e00, "ucXx(s,b),t", pa10, FLAG_STRICT}, |
{ "cldwx", 0x24000000, 0xfc00d200, "ucxccx(b),t", pa11, FLAG_STRICT}, |
{ "cldwx", 0x24000000, 0xfc001200, "ucxccx(s,b),t", pa11, FLAG_STRICT}, |
{ "cldwx", 0x24000000, 0xfc00de00, "ucXx(b),t", pa10, 0}, |
{ "cldwx", 0x24000000, 0xfc001e00, "ucXx(s,b),t", pa10, 0}, |
{ "clddx", 0x2c000000, 0xfc00de00, "ucXx(b),t", pa10, FLAG_STRICT}, |
{ "clddx", 0x2c000000, 0xfc001e00, "ucXx(s,b),t", pa10, FLAG_STRICT}, |
{ "clddx", 0x2c000000, 0xfc00d200, "ucxccx(b),t", pa11, FLAG_STRICT}, |
{ "clddx", 0x2c000000, 0xfc001200, "ucxccx(s,b),t", pa11, FLAG_STRICT}, |
{ "clddx", 0x2c000000, 0xfc00de00, "ucXx(b),t", pa10, 0}, |
{ "clddx", 0x2c000000, 0xfc001e00, "ucXx(s,b),t", pa10, 0}, |
{ "cstwx", 0x24000200, 0xfc00de00, "ucXt,x(b)", pa10, FLAG_STRICT}, |
{ "cstwx", 0x24000200, 0xfc001e00, "ucXt,x(s,b)", pa10, FLAG_STRICT}, |
{ "cstwx", 0x24000200, 0xfc00d200, "ucxcCt,x(b)", pa11, FLAG_STRICT}, |
{ "cstwx", 0x24000200, 0xfc001200, "ucxcCt,x(s,b)", pa11, FLAG_STRICT}, |
{ "cstwx", 0x24000200, 0xfc00de00, "ucXt,x(b)", pa10, 0}, |
{ "cstwx", 0x24000200, 0xfc001e00, "ucXt,x(s,b)", pa10, 0}, |
{ "cstdx", 0x2c000200, 0xfc00de00, "ucXt,x(b)", pa10, FLAG_STRICT}, |
{ "cstdx", 0x2c000200, 0xfc001e00, "ucXt,x(s,b)", pa10, FLAG_STRICT}, |
{ "cstdx", 0x2c000200, 0xfc00d200, "ucxcCt,x(b)", pa11, FLAG_STRICT}, |
{ "cstdx", 0x2c000200, 0xfc001200, "ucxcCt,x(s,b)", pa11, FLAG_STRICT}, |
{ "cstdx", 0x2c000200, 0xfc00de00, "ucXt,x(b)", pa10, 0}, |
{ "cstdx", 0x2c000200, 0xfc001e00, "ucXt,x(s,b)", pa10, 0}, |
{ "cldws", 0x24001000, 0xfc00de00, "ucM5(b),t", pa10, FLAG_STRICT}, |
{ "cldws", 0x24001000, 0xfc001e00, "ucM5(s,b),t", pa10, FLAG_STRICT}, |
{ "cldws", 0x24001000, 0xfc00d200, "ucmcc5(b),t", pa11, FLAG_STRICT}, |
{ "cldws", 0x24001000, 0xfc001200, "ucmcc5(s,b),t", pa11, FLAG_STRICT}, |
{ "cldws", 0x24001000, 0xfc00de00, "ucM5(b),t", pa10, 0}, |
{ "cldws", 0x24001000, 0xfc001e00, "ucM5(s,b),t", pa10, 0}, |
{ "cldds", 0x2c001000, 0xfc00de00, "ucM5(b),t", pa10, FLAG_STRICT}, |
{ "cldds", 0x2c001000, 0xfc001e00, "ucM5(s,b),t", pa10, FLAG_STRICT}, |
{ "cldds", 0x2c001000, 0xfc00d200, "ucmcc5(b),t", pa11, FLAG_STRICT}, |
{ "cldds", 0x2c001000, 0xfc001200, "ucmcc5(s,b),t", pa11, FLAG_STRICT}, |
{ "cldds", 0x2c001000, 0xfc00de00, "ucM5(b),t", pa10, 0}, |
{ "cldds", 0x2c001000, 0xfc001e00, "ucM5(s,b),t", pa10, 0}, |
{ "cstws", 0x24001200, 0xfc00de00, "ucMt,5(b)", pa10, FLAG_STRICT}, |
{ "cstws", 0x24001200, 0xfc001e00, "ucMt,5(s,b)", pa10, FLAG_STRICT}, |
{ "cstws", 0x24001200, 0xfc00d200, "ucmcCt,5(b)", pa11, FLAG_STRICT}, |
{ "cstws", 0x24001200, 0xfc001200, "ucmcCt,5(s,b)", pa11, FLAG_STRICT}, |
{ "cstws", 0x24001200, 0xfc00de00, "ucMt,5(b)", pa10, 0}, |
{ "cstws", 0x24001200, 0xfc001e00, "ucMt,5(s,b)", pa10, 0}, |
{ "cstds", 0x2c001200, 0xfc00de00, "ucMt,5(b)", pa10, FLAG_STRICT}, |
{ "cstds", 0x2c001200, 0xfc001e00, "ucMt,5(s,b)", pa10, FLAG_STRICT}, |
{ "cstds", 0x2c001200, 0xfc00d200, "ucmcCt,5(b)", pa11, FLAG_STRICT}, |
{ "cstds", 0x2c001200, 0xfc001200, "ucmcCt,5(s,b)", pa11, FLAG_STRICT}, |
{ "cstds", 0x2c001200, 0xfc00de00, "ucMt,5(b)", pa10, 0}, |
{ "cstds", 0x2c001200, 0xfc001e00, "ucMt,5(s,b)", pa10, 0}, |
/* More pseudo instructions which must follow the main table. */ |
{ "call", 0xe800f000, 0xfc1ffffd, "n(b)", pa20, FLAG_STRICT}, |
{ "call", 0xe800a000, 0xffe0e000, "nW", pa10, FLAG_STRICT}, |
{ "ret", 0xe840d000, 0xfffffffd, "n", pa20, FLAG_STRICT}, |
}; |
#define NUMOPCODES ((sizeof pa_opcodes)/(sizeof pa_opcodes[0])) |
/* SKV 12/18/92. Added some denotations for various operands. */ |
#define PA_IMM11_AT_31 'i' |
#define PA_IMM14_AT_31 'j' |
#define PA_IMM21_AT_31 'k' |
#define PA_DISP12 'w' |
#define PA_DISP17 'W' |
#define N_HPPA_OPERAND_FORMATS 5 |
/contrib/toolchain/binutils/include/opcode/i370.h |
---|
0,0 → 1,267 |
/* i370.h -- Header file for S/390 opcode table |
Copyright 1994, 1995, 1998, 1999, 2000, 2003, 2010 |
Free Software Foundation, Inc. |
PowerPC version written by Ian Lance Taylor, Cygnus Support |
Rewritten for i370 ESA/390 support, Linas Vepstas <linas@linas.org> |
This file is part of GDB, GAS, and the GNU binutils. |
GDB, GAS, and the GNU binutils are free software; you can redistribute |
them and/or modify them under the terms of the GNU General Public |
License as published by the Free Software Foundation; either version 3, |
or (at your option) any later version. |
GDB, GAS, and the GNU binutils are distributed in the hope that they |
will be useful, but WITHOUT ANY WARRANTY; without even the implied |
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See |
the GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this file; see the file COPYING3. If not, write to the Free |
Software Foundation, 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef I370_H |
#define I370_H |
/* The opcode table is an array of struct i370_opcode. */ |
typedef union |
{ |
unsigned int i[2]; |
unsigned short s[4]; |
unsigned char b[8]; |
} i370_insn_t; |
struct i370_opcode |
{ |
/* The opcode name. */ |
const char *name; |
/* the length of the instruction */ |
char len; |
/* The opcode itself. Those bits which will be filled in with |
operands are zeroes. */ |
i370_insn_t opcode; |
/* The opcode mask. This is used by the disassembler. This is a |
mask containing ones indicating those bits which must match the |
opcode field, and zeroes indicating those bits which need not |
match (and are presumably filled in by operands). */ |
i370_insn_t mask; |
/* One bit flags for the opcode. These are used to indicate which |
specific processors support the instructions. The defined values |
are listed below. */ |
unsigned long flags; |
/* An array of operand codes. Each code is an index into the |
operand table. They appear in the order which the operands must |
appear in assembly code, and are terminated by a zero. */ |
unsigned char operands[8]; |
}; |
/* The table itself is sorted by major opcode number, and is otherwise |
in the order in which the disassembler should consider |
instructions. */ |
extern const struct i370_opcode i370_opcodes[]; |
extern const int i370_num_opcodes; |
/* Values defined for the flags field of a struct i370_opcode. */ |
/* Opcode is defined for the original 360 architecture. */ |
#define I370_OPCODE_360 (0x01) |
/* Opcode is defined for the 370 architecture. */ |
#define I370_OPCODE_370 (0x02) |
/* Opcode is defined for the 370-XA architecture. */ |
#define I370_OPCODE_370_XA (0x04) |
/* Opcode is defined for the ESA/370 architecture. */ |
#define I370_OPCODE_ESA370 (0x08) |
/* Opcode is defined for the ESA/390 architecture. */ |
#define I370_OPCODE_ESA390 (0x10) |
/* Opcode is defined for the ESA/390 w/ BFP facility. */ |
#define I370_OPCODE_ESA390_BF (0x20) |
/* Opcode is defined for the ESA/390 w/ branch & set authority facility. */ |
#define I370_OPCODE_ESA390_BS (0x40) |
/* Opcode is defined for the ESA/390 w/ checksum facility. */ |
#define I370_OPCODE_ESA390_CK (0x80) |
/* Opcode is defined for the ESA/390 w/ compare & move extended facility. */ |
#define I370_OPCODE_ESA390_CM (0x100) |
/* Opcode is defined for the ESA/390 w/ flt.pt. support extensions facility. */ |
#define I370_OPCODE_ESA390_FX (0x200) |
/* Opcode is defined for the ESA/390 w/ HFP facility. */ |
#define I370_OPCODE_ESA390_HX (0x400) |
/* Opcode is defined for the ESA/390 w/ immediate & relative facility. */ |
#define I370_OPCODE_ESA390_IR (0x800) |
/* Opcode is defined for the ESA/390 w/ move-inverse facility. */ |
#define I370_OPCODE_ESA390_MI (0x1000) |
/* Opcode is defined for the ESA/390 w/ program-call-fast facility. */ |
#define I370_OPCODE_ESA390_PC (0x2000) |
/* Opcode is defined for the ESA/390 w/ perform-locked-op facility. */ |
#define I370_OPCODE_ESA390_PL (0x4000) |
/* Opcode is defined for the ESA/390 w/ square-root facility. */ |
#define I370_OPCODE_ESA390_QR (0x8000) |
/* Opcode is defined for the ESA/390 w/ resume-program facility. */ |
#define I370_OPCODE_ESA390_RP (0x10000) |
/* Opcode is defined for the ESA/390 w/ set-address-space-fast facility. */ |
#define I370_OPCODE_ESA390_SA (0x20000) |
/* Opcode is defined for the ESA/390 w/ subspace group facility. */ |
#define I370_OPCODE_ESA390_SG (0x40000) |
/* Opcode is defined for the ESA/390 w/ string facility. */ |
#define I370_OPCODE_ESA390_SR (0x80000) |
/* Opcode is defined for the ESA/390 w/ trap facility. */ |
#define I370_OPCODE_ESA390_TR (0x100000) |
#define I370_OPCODE_ESA390_SUPERSET (0x1fffff) |
/* The operands table is an array of struct i370_operand. */ |
struct i370_operand |
{ |
/* The number of bits in the operand. */ |
int bits; |
/* How far the operand is left shifted in the instruction. */ |
int shift; |
/* Insertion function. This is used by the assembler. To insert an |
operand value into an instruction, check this field. |
If it is NULL, execute |
i |= (op & ((1 << o->bits) - 1)) << o->shift; |
(i is the instruction which we are filling in, o is a pointer to |
this structure, and op is the opcode value; this assumes twos |
complement arithmetic). |
If this field is not NULL, then simply call it with the |
instruction and the operand value. It will return the new value |
of the instruction. If the ERRMSG argument is not NULL, then if |
the operand value is illegal, *ERRMSG will be set to a warning |
string (the operand will be inserted in any case). If the |
operand value is legal, *ERRMSG will be unchanged (most operands |
can accept any value). */ |
i370_insn_t (*insert) |
(i370_insn_t instruction, long op, const char **errmsg); |
/* Extraction function. This is used by the disassembler. To |
extract this operand type from an instruction, check this field. |
If it is NULL, compute |
op = ((i) >> o->shift) & ((1 << o->bits) - 1); |
if ((o->flags & I370_OPERAND_SIGNED) != 0 |
&& (op & (1 << (o->bits - 1))) != 0) |
op -= 1 << o->bits; |
(i is the instruction, o is a pointer to this structure, and op |
is the result; this assumes twos complement arithmetic). |
If this field is not NULL, then simply call it with the |
instruction value. It will return the value of the operand. If |
the INVALID argument is not NULL, *INVALID will be set to |
non-zero if this operand type can not actually be extracted from |
this operand (i.e., the instruction does not match). If the |
operand is valid, *INVALID will not be changed. */ |
long (*extract) (i370_insn_t instruction, int *invalid); |
/* One bit syntax flags. */ |
unsigned long flags; |
/* name -- handy for debugging, otherwise pointless */ |
char * name; |
}; |
/* Elements in the table are retrieved by indexing with values from |
the operands field of the i370_opcodes table. */ |
extern const struct i370_operand i370_operands[]; |
/* Values defined for the flags field of a struct i370_operand. */ |
/* This operand should be wrapped in parentheses rather than |
separated from the previous by a comma. This is used for S, RS and |
SS form instructions which want their operands to look like |
reg,displacement(basereg) */ |
#define I370_OPERAND_SBASE (0x01) |
/* This operand is a base register. It may or may not appear next |
to an index register, i.e. either of the two forms |
reg,displacement(basereg) |
reg,displacement(index,basereg) */ |
#define I370_OPERAND_BASE (0x02) |
/* This pair of operands should be wrapped in parentheses rather than |
separated from the last by a comma. This is used for the RX form |
instructions which want their operands to look like |
reg,displacement(index,basereg) */ |
#define I370_OPERAND_INDEX (0x04) |
/* This operand names a register. The disassembler uses this to print |
register names with a leading 'r'. */ |
#define I370_OPERAND_GPR (0x08) |
/* This operand names a floating point register. The disassembler |
prints these with a leading 'f'. */ |
#define I370_OPERAND_FPR (0x10) |
/* This operand is a displacement. */ |
#define I370_OPERAND_RELATIVE (0x20) |
/* This operand is a length, such as that in SS form instructions. */ |
#define I370_OPERAND_LENGTH (0x40) |
/* This operand is optional, and is zero if omitted. This is used for |
the optional B2 field in the shift-left, shift-right instructions. The |
assembler must count the number of operands remaining on the line, |
and the number of operands remaining for the opcode, and decide |
whether this operand is present or not. The disassembler should |
print this operand out only if it is not zero. */ |
#define I370_OPERAND_OPTIONAL (0x80) |
/* Define some misc macros. We keep them with the operands table |
for simplicity. The macro table is an array of struct i370_macro. */ |
struct i370_macro |
{ |
/* The macro name. */ |
const char *name; |
/* The number of operands the macro takes. */ |
unsigned int operands; |
/* One bit flags for the opcode. These are used to indicate which |
specific processors support the instructions. The values are the |
same as those for the struct i370_opcode flags field. */ |
unsigned long flags; |
/* A format string to turn the macro into a normal instruction. |
Each %N in the string is replaced with operand number N (zero |
based). */ |
const char *format; |
}; |
extern const struct i370_macro i370_macros[]; |
extern const int i370_num_macros; |
#endif /* I370_H */ |
/contrib/toolchain/binutils/include/opcode/i386.h |
---|
0,0 → 1,148 |
/* opcode/i386.h -- Intel 80386 opcode macros |
Copyright 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, |
2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 |
Free Software Foundation, Inc. |
This file is part of GAS, the GNU Assembler, and GDB, the GNU Debugger. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* The SystemV/386 SVR3.2 assembler, and probably all AT&T derived |
ix86 Unix assemblers, generate floating point instructions with |
reversed source and destination registers in certain cases. |
Unfortunately, gcc and possibly many other programs use this |
reversed syntax, so we're stuck with it. |
eg. `fsub %st(3),%st' results in st = st - st(3) as expected, but |
`fsub %st,%st(3)' results in st(3) = st - st(3), rather than |
the expected st(3) = st(3) - st |
This happens with all the non-commutative arithmetic floating point |
operations with two register operands, where the source register is |
%st, and destination register is %st(i). |
The affected opcode map is dceX, dcfX, deeX, defX. */ |
#ifndef OPCODE_I386_H |
#define OPCODE_I386_H |
#ifndef SYSV386_COMPAT |
/* Set non-zero for broken, compatible instructions. Set to zero for |
non-broken opcodes at your peril. gcc generates SystemV/386 |
compatible instructions. */ |
#define SYSV386_COMPAT 1 |
#endif |
#ifndef OLDGCC_COMPAT |
/* Set non-zero to cater for old (<= 2.8.1) versions of gcc that could |
generate nonsense fsubp, fsubrp, fdivp and fdivrp with operands |
reversed. */ |
#define OLDGCC_COMPAT SYSV386_COMPAT |
#endif |
#define MOV_AX_DISP32 0xa0 |
#define POP_SEG_SHORT 0x07 |
#define JUMP_PC_RELATIVE 0xeb |
#define INT_OPCODE 0xcd |
#define INT3_OPCODE 0xcc |
/* The opcode for the fwait instruction, which disassembler treats as a |
prefix when it can. */ |
#define FWAIT_OPCODE 0x9b |
/* Instruction prefixes. |
NOTE: For certain SSE* instructions, 0x66,0xf2,0xf3 are treated as |
part of the opcode. Other prefixes may still appear between them |
and the 0x0f part of the opcode. */ |
#define ADDR_PREFIX_OPCODE 0x67 |
#define DATA_PREFIX_OPCODE 0x66 |
#define LOCK_PREFIX_OPCODE 0xf0 |
#define CS_PREFIX_OPCODE 0x2e |
#define DS_PREFIX_OPCODE 0x3e |
#define ES_PREFIX_OPCODE 0x26 |
#define FS_PREFIX_OPCODE 0x64 |
#define GS_PREFIX_OPCODE 0x65 |
#define SS_PREFIX_OPCODE 0x36 |
#define REPNE_PREFIX_OPCODE 0xf2 |
#define REPE_PREFIX_OPCODE 0xf3 |
#define XACQUIRE_PREFIX_OPCODE 0xf2 |
#define XRELEASE_PREFIX_OPCODE 0xf3 |
#define BND_PREFIX_OPCODE 0xf2 |
#define TWO_BYTE_OPCODE_ESCAPE 0x0f |
#define NOP_OPCODE (char) 0x90 |
/* register numbers */ |
#define EAX_REG_NUM 0 |
#define ECX_REG_NUM 1 |
#define EDX_REG_NUM 2 |
#define EBX_REG_NUM 3 |
#define ESP_REG_NUM 4 |
#define EBP_REG_NUM 5 |
#define ESI_REG_NUM 6 |
#define EDI_REG_NUM 7 |
/* modrm_byte.regmem for twobyte escape */ |
#define ESCAPE_TO_TWO_BYTE_ADDRESSING ESP_REG_NUM |
/* index_base_byte.index for no index register addressing */ |
#define NO_INDEX_REGISTER ESP_REG_NUM |
/* index_base_byte.base for no base register addressing */ |
#define NO_BASE_REGISTER EBP_REG_NUM |
#define NO_BASE_REGISTER_16 6 |
/* modrm.mode = REGMEM_FIELD_HAS_REG when a register is in there */ |
#define REGMEM_FIELD_HAS_REG 0x3/* always = 0x3 */ |
#define REGMEM_FIELD_HAS_MEM (~REGMEM_FIELD_HAS_REG) |
/* Extract fields from the mod/rm byte. */ |
#define MODRM_MOD_FIELD(modrm) (((modrm) >> 6) & 3) |
#define MODRM_REG_FIELD(modrm) (((modrm) >> 3) & 7) |
#define MODRM_RM_FIELD(modrm) (((modrm) >> 0) & 7) |
/* Extract fields from the sib byte. */ |
#define SIB_SCALE_FIELD(sib) (((sib) >> 6) & 3) |
#define SIB_INDEX_FIELD(sib) (((sib) >> 3) & 7) |
#define SIB_BASE_FIELD(sib) (((sib) >> 0) & 7) |
/* x86-64 extension prefix. */ |
#define REX_OPCODE 0x40 |
/* Non-zero if OPCODE is the rex prefix. */ |
#define REX_PREFIX_P(opcode) (((opcode) & 0xf0) == REX_OPCODE) |
/* Indicates 64 bit operand size. */ |
#define REX_W 8 |
/* High extension to reg field of modrm byte. */ |
#define REX_R 4 |
/* High extension to SIB index field. */ |
#define REX_X 2 |
/* High extension to base field of modrm or SIB, or reg field of opcode. */ |
#define REX_B 1 |
/* max operands per insn */ |
#define MAX_OPERANDS 5 |
/* max immediates per insn (lcall, ljmp, insertq, extrq) */ |
#define MAX_IMMEDIATE_OPERANDS 2 |
/* max memory refs per insn (string ops) */ |
#define MAX_MEMORY_OPERANDS 2 |
/* max size of insn mnemonics. */ |
#define MAX_MNEM_SIZE 20 |
/* max size of register name in insn mnemonics. */ |
#define MAX_REG_NAME_SIZE 8 |
#endif /* OPCODE_I386_H */ |
/contrib/toolchain/binutils/include/opcode/i860.h |
---|
0,0 → 1,507 |
/* Table of opcodes for the i860. |
Copyright 1989, 1991, 2000, 2002, 2003, 2010 |
Free Software Foundation, Inc. |
This file is part of GAS, the GNU Assembler, and GDB, the GNU disassembler. |
GAS/GDB is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3, or (at your option) |
any later version. |
GAS/GDB is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with GAS or GDB; see the file COPYING3. If not, write to |
the Free Software Foundation, 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
/* Structure of an opcode table entry. */ |
struct i860_opcode |
{ |
/* The opcode name. */ |
const char *name; |
/* Bits that must be set. */ |
unsigned long match; |
/* Bits that must not be set. */ |
unsigned long lose; |
const char *args; |
/* Nonzero if this is a possible expand-instruction. */ |
char expand; |
}; |
enum expand_type |
{ |
E_MOV = 1, E_ADDR, E_U32, E_AND, E_S32, E_DELAY, XP_ONLY |
}; |
/* All i860 opcodes are 32 bits, except for the pseudo-instructions |
and the operations utilizing a 32-bit address expression, an |
unsigned 32-bit constant, or a signed 32-bit constant. |
These opcodes are expanded into a two-instruction sequence for |
any situation where the immediate operand does not fit in 32 bits. |
In the case of the add and subtract operations the expansion is |
to a three-instruction sequence (ex: orh, or, adds). In cases |
where the address is to be relocated, the instruction is |
expanded to handle the worse case, this could be optimized at |
the final link if the actual address were known. |
The pseudoinstructions are: mov, fmov, pmov, nop, and fnop. |
These instructions are implemented as a one or two instruction |
sequence of other operations. |
The match component is a mask saying which bits must match a |
particular opcode in order for an instruction to be an instance |
of that opcode. |
The args component is a string containing one character |
for each operand of the instruction. |
Kinds of operands: |
# Number used by optimizer. It is ignored. |
1 src1 integer register. |
2 src2 integer register. |
d dest register. |
c ctrlreg control register. |
i 16 bit immediate. |
I 16 bit immediate, aligned 2^0. (ld.b) |
J 16 bit immediate, aligned 2^1. (ld.s) |
K 16 bit immediate, aligned 2^2. (ld.l, {p}fld.l, fst.l) |
L 16 bit immediate, aligned 2^3. ({p}fld.d, fst.d) |
M 16 bit immediate, aligned 2^4. ({p}fld.q, fst.q) |
5 5 bit immediate. |
l lbroff 26 bit PC relative immediate. |
r sbroff 16 bit PC relative immediate. |
s split 16 bit immediate. |
S split 16 bit immediate, aligned 2^0. (st.b) |
T split 16 bit immediate, aligned 2^1. (st.s) |
U split 16 bit immediate, aligned 2^2. (st.l) |
e src1 floating point register. |
f src2 floating point register. |
g dest floating point register. */ |
/* The order of the opcodes in this table is significant. The assembler |
requires that all instances of the same mnemonic must be consecutive. |
If they aren't, the assembler will not function properly. |
The order of opcodes does not affect the disassembler. */ |
static const struct i860_opcode i860_opcodes[] = |
{ |
/* REG-Format Instructions. */ |
{ "ld.c", 0x30000000, 0xcc000000, "c,d", 0 }, /* ld.c csrc2,idest */ |
{ "ld.b", 0x00000000, 0xfc000000, "1(2),d", 0 }, /* ld.b isrc1(isrc2),idest */ |
{ "ld.b", 0x04000000, 0xf8000000, "I(2),d", E_ADDR }, /* ld.b #const(isrc2),idest */ |
{ "ld.s", 0x10000000, 0xec000001, "1(2),d", 0 }, /* ld.s isrc1(isrc2),idest */ |
{ "ld.s", 0x14000000, 0xe8000001, "J(2),d", E_ADDR }, /* ld.s #const(isrc2),idest */ |
{ "ld.l", 0x10000001, 0xec000000, "1(2),d", 0 }, /* ld.l isrc1(isrc2),idest */ |
{ "ld.l", 0x14000001, 0xe8000000, "K(2),d", E_ADDR }, /* ld.l #const(isrc2),idest */ |
{ "st.c", 0x38000000, 0xc4000000, "1,c", 0 }, /* st.c isrc1ni,csrc2 */ |
{ "st.b", 0x0c000000, 0xf0000000, "1,S(2)", E_ADDR }, /* st.b isrc1ni,#const(isrc2) */ |
{ "st.s", 0x1c000000, 0xe0000001, "1,T(2)", E_ADDR }, /* st.s isrc1ni,#const(isrc2) */ |
{ "st.l", 0x1c000001, 0xe0000000, "1,U(2)", E_ADDR }, /* st.l isrc1ni,#const(isrc2) */ |
{ "ixfr", 0x08000000, 0xf4000000, "1,g", 0 }, /* ixfr isrc1ni,fdest */ |
{ "fld.l", 0x20000002, 0xdc000001, "1(2),g", 0 }, /* fld.l isrc1(isrc2),fdest */ |
{ "fld.l", 0x24000002, 0xd8000001, "K(2),g", E_ADDR }, /* fld.l #const(isrc2),fdest */ |
{ "fld.l", 0x20000003, 0xdc000000, "1(2)++,g", 0 }, /* fld.l isrc1(isrc2)++,fdest */ |
{ "fld.l", 0x24000003, 0xd8000000, "K(2)++,g", E_ADDR }, /* fld.l #const(isrc2)++,fdest */ |
{ "fld.d", 0x20000000, 0xdc000007, "1(2),g", 0 }, /* fld.d isrc1(isrc2),fdest */ |
{ "fld.d", 0x24000000, 0xd8000007, "L(2),g", E_ADDR }, /* fld.d #const(isrc2),fdest */ |
{ "fld.d", 0x20000001, 0xdc000006, "1(2)++,g", 0 }, /* fld.d isrc1(isrc2)++,fdest */ |
{ "fld.d", 0x24000001, 0xd8000006, "L(2)++,g", E_ADDR }, /* fld.d #const(isrc2)++,fdest */ |
{ "fld.q", 0x20000004, 0xdc000003, "1(2),g", 0 }, /* fld.q isrc1(isrc2),fdest */ |
{ "fld.q", 0x24000004, 0xd8000003, "M(2),g", E_ADDR }, /* fld.q #const(isrc2),fdest */ |
{ "fld.q", 0x20000005, 0xdc000002, "1(2)++,g", 0 }, /* fld.q isrc1(isrc2)++,fdest */ |
{ "fld.q", 0x24000005, 0xd8000002, "M(2)++,g", E_ADDR }, /* fld.q #const(isrc2)++,fdest */ |
{ "pfld.l", 0x60000002, 0x9c000001, "1(2),g", 0 }, /* pfld.l isrc1(isrc2),fdest */ |
{ "pfld.l", 0x64000002, 0x98000001, "K(2),g", E_ADDR }, /* pfld.l #const(isrc2),fdest */ |
{ "pfld.l", 0x60000003, 0x9c000000, "1(2)++,g", 0 }, /* pfld.l isrc1(isrc2)++,fdest */ |
{ "pfld.l", 0x64000003, 0x98000000, "K(2)++,g", E_ADDR }, /* pfld.l #const(isrc2)++,fdest */ |
{ "pfld.d", 0x60000000, 0x9c000007, "1(2),g", 0 }, /* pfld.d isrc1(isrc2),fdest */ |
{ "pfld.d", 0x64000000, 0x98000007, "L(2),g", E_ADDR }, /* pfld.d #const(isrc2),fdest */ |
{ "pfld.d", 0x60000001, 0x9c000006, "1(2)++,g", 0 }, /* pfld.d isrc1(isrc2)++,fdest */ |
{ "pfld.d", 0x64000001, 0x98000006, "L(2)++,g", E_ADDR }, /* pfld.d #const(isrc2)++,fdest */ |
{ "pfld.q", 0x60000004, 0x9c000003, "1(2),g", XP_ONLY }, /* pfld.q isrc1(isrc2),fdest */ |
{ "pfld.q", 0x64000004, 0x98000003, "L(2),g", XP_ONLY }, /* pfld.q #const(isrc2),fdest */ |
{ "pfld.q", 0x60000005, 0x9c000002, "1(2)++,g", XP_ONLY }, /* pfld.q isrc1(isrc2)++,fdest */ |
{ "pfld.q", 0x64000005, 0x98000002, "L(2)++,g", XP_ONLY }, /* pfld.q #const(isrc2)++,fdest */ |
{ "fst.l", 0x28000002, 0xd4000001, "g,1(2)", 0 }, /* fst.l fdest,isrc1(isrc2) */ |
{ "fst.l", 0x2c000002, 0xd0000001, "g,K(2)", E_ADDR }, /* fst.l fdest,#const(isrc2) */ |
{ "fst.l", 0x28000003, 0xd4000000, "g,1(2)++", 0 }, /* fst.l fdest,isrc1(isrc2)++ */ |
{ "fst.l", 0x2c000003, 0xd0000000, "g,K(2)++", E_ADDR }, /* fst.l fdest,#const(isrc2)++ */ |
{ "fst.d", 0x28000000, 0xd4000007, "g,1(2)", 0 }, /* fst.d fdest,isrc1(isrc2) */ |
{ "fst.d", 0x2c000000, 0xd0000007, "g,L(2)", E_ADDR }, /* fst.d fdest,#const(isrc2) */ |
{ "fst.d", 0x28000001, 0xd4000006, "g,1(2)++", 0 }, /* fst.d fdest,isrc1(isrc2)++ */ |
{ "fst.d", 0x2c000001, 0xd0000006, "g,L(2)++", E_ADDR }, /* fst.d fdest,#const(isrc2)++ */ |
{ "fst.q", 0x28000004, 0xd4000003, "g,1(2)", 0 }, /* fst.d fdest,isrc1(isrc2) */ |
{ "fst.q", 0x2c000004, 0xd0000003, "g,M(2)", E_ADDR }, /* fst.d fdest,#const(isrc2) */ |
{ "fst.q", 0x28000005, 0xd4000002, "g,1(2)++", 0 }, /* fst.d fdest,isrc1(isrc2)++ */ |
{ "fst.q", 0x2c000005, 0xd0000002, "g,M(2)++", E_ADDR }, /* fst.d fdest,#const(isrc2)++ */ |
{ "pst.d", 0x3c000000, 0xc0000007, "g,L(2)", E_ADDR }, /* pst.d fdest,#const(isrc2) */ |
{ "pst.d", 0x3c000001, 0xc0000006, "g,L(2)++", E_ADDR }, /* pst.d fdest,#const(isrc2)++ */ |
{ "addu", 0x80000000, 0x7c000000, "1,2,d", 0 }, /* addu isrc1,isrc2,idest */ |
{ "addu", 0x84000000, 0x78000000, "i,2,d", E_S32 }, /* addu #const,isrc2,idest */ |
{ "adds", 0x90000000, 0x6c000000, "1,2,d", 0 }, /* adds isrc1,isrc2,idest */ |
{ "adds", 0x94000000, 0x68000000, "i,2,d", E_S32 }, /* adds #const,isrc2,idest */ |
{ "subu", 0x88000000, 0x74000000, "1,2,d", 0 }, /* subu isrc1,isrc2,idest */ |
{ "subu", 0x8c000000, 0x70000000, "i,2,d", E_S32 }, /* subu #const,isrc2,idest */ |
{ "subs", 0x98000000, 0x64000000, "1,2,d", 0 }, /* subs isrc1,isrc2,idest */ |
{ "subs", 0x9c000000, 0x60000000, "i,2,d", E_S32 }, /* subs #const,isrc2,idest */ |
{ "shl", 0xa0000000, 0x5c000000, "1,2,d", 0 }, /* shl isrc1,isrc2,idest */ |
{ "shl", 0xa4000000, 0x58000000, "i,2,d", 0 }, /* shl #const,isrc2,idest */ |
{ "shr", 0xa8000000, 0x54000000, "1,2,d", 0 }, /* shr isrc1,isrc2,idest */ |
{ "shr", 0xac000000, 0x50000000, "i,2,d", 0 }, /* shr #const,isrc2,idest */ |
{ "shrd", 0xb0000000, 0x4c000000, "1,2,d", 0 }, /* shrd isrc1,isrc2,idest */ |
{ "shra", 0xb8000000, 0x44000000, "1,2,d", 0 }, /* shra isrc1,isrc2,idest */ |
{ "shra", 0xbc000000, 0x40000000, "i,2,d", 0 }, /* shra #const,isrc2,idest */ |
{ "mov", 0xa0000000, 0x5c00f800, "2,d", 0 }, /* shl r0,isrc2,idest */ |
{ "mov", 0x94000000, 0x69e00000, "i,d", E_MOV }, /* adds #const,r0,idest */ |
{ "nop", 0xa0000000, 0x5ffff800, "", 0 }, /* shl r0,r0,r0 */ |
{ "fnop", 0xb0000000, 0x4ffff800, "", 0 }, /* shrd r0,r0,r0 */ |
{ "trap", 0x44000000, 0xb8000000, "1,2,d", 0 }, /* trap isrc1ni,isrc2,idest */ |
{ "flush", 0x34000004, 0xc81f0003, "L(2)", E_ADDR }, /* flush #const(isrc2) */ |
{ "flush", 0x34000005, 0xc81f0002, "L(2)++", E_ADDR }, /* flush #const(isrc2)++ */ |
{ "and", 0xc0000000, 0x3c000000, "1,2,d", 0 }, /* and isrc1,isrc2,idest */ |
{ "and", 0xc4000000, 0x38000000, "i,2,d", E_AND }, /* and #const,isrc2,idest */ |
{ "andh", 0xcc000000, 0x30000000, "i,2,d", 0 }, /* andh #const,isrc2,idest */ |
{ "andnot", 0xd0000000, 0x2c000000, "1,2,d", 0 }, /* andnot isrc1,isrc2,idest */ |
{ "andnot", 0xd4000000, 0x28000000, "i,2,d", E_U32 }, /* andnot #const,isrc2,idest */ |
{ "andnoth", 0xdc000000, 0x20000000, "i,2,d", 0 }, /* andnoth #const,isrc2,idest */ |
{ "or", 0xe0000000, 0x1c000000, "1,2,d", 0 }, /* or isrc1,isrc2,idest */ |
{ "or", 0xe4000000, 0x18000000, "i,2,d", E_U32 }, /* or #const,isrc2,idest */ |
{ "orh", 0xec000000, 0x10000000, "i,2,d", 0 }, /* orh #const,isrc2,idest */ |
{ "xor", 0xf0000000, 0x0c000000, "1,2,d", 0 }, /* xor isrc1,isrc2,idest */ |
{ "xor", 0xf4000000, 0x08000000, "i,2,d", E_U32 }, /* xor #const,isrc2,idest */ |
{ "xorh", 0xfc000000, 0x00000000, "i,2,d", 0 }, /* xorh #const,isrc2,idest */ |
{ "bte", 0x58000000, 0xa4000000, "1,2,r", 0 }, /* bte isrc1s,isrc2,sbroff */ |
{ "bte", 0x5c000000, 0xa0000000, "5,2,r", 0 }, /* bte #const5,isrc2,sbroff */ |
{ "btne", 0x50000000, 0xac000000, "1,2,r", 0 }, /* btne isrc1s,isrc2,sbroff */ |
{ "btne", 0x54000000, 0xa8000000, "5,2,r", 0 }, /* btne #const5,isrc2,sbroff */ |
{ "bla", 0xb4000000, 0x48000000, "1,2,r", E_DELAY }, /* bla isrc1s,isrc2,sbroff */ |
{ "bri", 0x40000000, 0xbc000000, "1", E_DELAY }, /* bri isrc1ni */ |
/* Core Escape Instruction Format */ |
{ "lock", 0x4c000001, 0xb000001e, "", 0 }, /* lock set BL in dirbase */ |
{ "calli", 0x4c000002, 0xb000001d, "1", E_DELAY }, /* calli isrc1ni */ |
{ "intovr", 0x4c000004, 0xb000001b, "", 0 }, /* intovr trap on integer overflow */ |
{ "unlock", 0x4c000007, 0xb0000018, "", 0 }, /* unlock clear BL in dirbase */ |
{ "ldio.l", 0x4c000408, 0xb00003f7, "2,d", XP_ONLY }, /* ldio.l isrc2,idest */ |
{ "ldio.s", 0x4c000208, 0xb00005f7, "2,d", XP_ONLY }, /* ldio.s isrc2,idest */ |
{ "ldio.b", 0x4c000008, 0xb00007f7, "2,d", XP_ONLY }, /* ldio.b isrc2,idest */ |
{ "stio.l", 0x4c000409, 0xb00003f6, "1,2", XP_ONLY }, /* stio.l isrc1ni,isrc2 */ |
{ "stio.s", 0x4c000209, 0xb00005f6, "1,2", XP_ONLY }, /* stio.s isrc1ni,isrc2 */ |
{ "stio.b", 0x4c000009, 0xb00007f6, "1,2", XP_ONLY }, /* stio.b isrc1ni,isrc2 */ |
{ "ldint.l", 0x4c00040a, 0xb00003f5, "2,d", XP_ONLY }, /* ldint.l isrc2,idest */ |
{ "ldint.s", 0x4c00020a, 0xb00005f5, "2,d", XP_ONLY }, /* ldint.s isrc2,idest */ |
{ "ldint.b", 0x4c00000a, 0xb00007f5, "2,d", XP_ONLY }, /* ldint.b isrc2,idest */ |
{ "scyc.b", 0x4c00000b, 0xb00007f4, "2", XP_ONLY }, /* scyc.b isrc2 */ |
/* CTRL-Format Instructions */ |
{ "br", 0x68000000, 0x94000000, "l", E_DELAY }, /* br lbroff */ |
{ "call", 0x6c000000, 0x90000000, "l", E_DELAY }, /* call lbroff */ |
{ "bc", 0x70000000, 0x8c000000, "l", 0 }, /* bc lbroff */ |
{ "bc.t", 0x74000000, 0x88000000, "l", E_DELAY }, /* bc.t lbroff */ |
{ "bnc", 0x78000000, 0x84000000, "l", 0 }, /* bnc lbroff */ |
{ "bnc.t", 0x7c000000, 0x80000000, "l", E_DELAY }, /* bnc.t lbroff */ |
/* Floating Point Escape Instruction Format - pfam.p fsrc1,fsrc2,fdest. */ |
{ "r2p1.ss", 0x48000400, 0xb40001ff, "e,f,g", 0 }, |
{ "r2p1.sd", 0x48000480, 0xb400017f, "e,f,g", 0 }, |
{ "r2p1.dd", 0x48000580, 0xb400007f, "e,f,g", 0 }, |
{ "r2pt.ss", 0x48000401, 0xb40001fe, "e,f,g", 0 }, |
{ "r2pt.sd", 0x48000481, 0xb400017e, "e,f,g", 0 }, |
{ "r2pt.dd", 0x48000581, 0xb400007e, "e,f,g", 0 }, |
{ "r2ap1.ss", 0x48000402, 0xb40001fd, "e,f,g", 0 }, |
{ "r2ap1.sd", 0x48000482, 0xb400017d, "e,f,g", 0 }, |
{ "r2ap1.dd", 0x48000582, 0xb400007d, "e,f,g", 0 }, |
{ "r2apt.ss", 0x48000403, 0xb40001fc, "e,f,g", 0 }, |
{ "r2apt.sd", 0x48000483, 0xb400017c, "e,f,g", 0 }, |
{ "r2apt.dd", 0x48000583, 0xb400007c, "e,f,g", 0 }, |
{ "i2p1.ss", 0x48000404, 0xb40001fb, "e,f,g", 0 }, |
{ "i2p1.sd", 0x48000484, 0xb400017b, "e,f,g", 0 }, |
{ "i2p1.dd", 0x48000584, 0xb400007b, "e,f,g", 0 }, |
{ "i2pt.ss", 0x48000405, 0xb40001fa, "e,f,g", 0 }, |
{ "i2pt.sd", 0x48000485, 0xb400017a, "e,f,g", 0 }, |
{ "i2pt.dd", 0x48000585, 0xb400007a, "e,f,g", 0 }, |
{ "i2ap1.ss", 0x48000406, 0xb40001f9, "e,f,g", 0 }, |
{ "i2ap1.sd", 0x48000486, 0xb4000179, "e,f,g", 0 }, |
{ "i2ap1.dd", 0x48000586, 0xb4000079, "e,f,g", 0 }, |
{ "i2apt.ss", 0x48000407, 0xb40001f8, "e,f,g", 0 }, |
{ "i2apt.sd", 0x48000487, 0xb4000178, "e,f,g", 0 }, |
{ "i2apt.dd", 0x48000587, 0xb4000078, "e,f,g", 0 }, |
{ "rat1p2.ss", 0x48000408, 0xb40001f7, "e,f,g", 0 }, |
{ "rat1p2.sd", 0x48000488, 0xb4000177, "e,f,g", 0 }, |
{ "rat1p2.dd", 0x48000588, 0xb4000077, "e,f,g", 0 }, |
{ "m12apm.ss", 0x48000409, 0xb40001f6, "e,f,g", 0 }, |
{ "m12apm.sd", 0x48000489, 0xb4000176, "e,f,g", 0 }, |
{ "m12apm.dd", 0x48000589, 0xb4000076, "e,f,g", 0 }, |
{ "ra1p2.ss", 0x4800040a, 0xb40001f5, "e,f,g", 0 }, |
{ "ra1p2.sd", 0x4800048a, 0xb4000175, "e,f,g", 0 }, |
{ "ra1p2.dd", 0x4800058a, 0xb4000075, "e,f,g", 0 }, |
{ "m12ttpa.ss", 0x4800040b, 0xb40001f4, "e,f,g", 0 }, |
{ "m12ttpa.sd", 0x4800048b, 0xb4000174, "e,f,g", 0 }, |
{ "m12ttpa.dd", 0x4800058b, 0xb4000074, "e,f,g", 0 }, |
{ "iat1p2.ss", 0x4800040c, 0xb40001f3, "e,f,g", 0 }, |
{ "iat1p2.sd", 0x4800048c, 0xb4000173, "e,f,g", 0 }, |
{ "iat1p2.dd", 0x4800058c, 0xb4000073, "e,f,g", 0 }, |
{ "m12tpm.ss", 0x4800040d, 0xb40001f2, "e,f,g", 0 }, |
{ "m12tpm.sd", 0x4800048d, 0xb4000172, "e,f,g", 0 }, |
{ "m12tpm.dd", 0x4800058d, 0xb4000072, "e,f,g", 0 }, |
{ "ia1p2.ss", 0x4800040e, 0xb40001f1, "e,f,g", 0 }, |
{ "ia1p2.sd", 0x4800048e, 0xb4000171, "e,f,g", 0 }, |
{ "ia1p2.dd", 0x4800058e, 0xb4000071, "e,f,g", 0 }, |
{ "m12tpa.ss", 0x4800040f, 0xb40001f0, "e,f,g", 0 }, |
{ "m12tpa.sd", 0x4800048f, 0xb4000170, "e,f,g", 0 }, |
{ "m12tpa.dd", 0x4800058f, 0xb4000070, "e,f,g", 0 }, |
/* Floating Point Escape Instruction Format - pfsm.p fsrc1,fsrc2,fdest. */ |
{ "r2s1.ss", 0x48000410, 0xb40001ef, "e,f,g", 0 }, |
{ "r2s1.sd", 0x48000490, 0xb400016f, "e,f,g", 0 }, |
{ "r2s1.dd", 0x48000590, 0xb400006f, "e,f,g", 0 }, |
{ "r2st.ss", 0x48000411, 0xb40001ee, "e,f,g", 0 }, |
{ "r2st.sd", 0x48000491, 0xb400016e, "e,f,g", 0 }, |
{ "r2st.dd", 0x48000591, 0xb400006e, "e,f,g", 0 }, |
{ "r2as1.ss", 0x48000412, 0xb40001ed, "e,f,g", 0 }, |
{ "r2as1.sd", 0x48000492, 0xb400016d, "e,f,g", 0 }, |
{ "r2as1.dd", 0x48000592, 0xb400006d, "e,f,g", 0 }, |
{ "r2ast.ss", 0x48000413, 0xb40001ec, "e,f,g", 0 }, |
{ "r2ast.sd", 0x48000493, 0xb400016c, "e,f,g", 0 }, |
{ "r2ast.dd", 0x48000593, 0xb400006c, "e,f,g", 0 }, |
{ "i2s1.ss", 0x48000414, 0xb40001eb, "e,f,g", 0 }, |
{ "i2s1.sd", 0x48000494, 0xb400016b, "e,f,g", 0 }, |
{ "i2s1.dd", 0x48000594, 0xb400006b, "e,f,g", 0 }, |
{ "i2st.ss", 0x48000415, 0xb40001ea, "e,f,g", 0 }, |
{ "i2st.sd", 0x48000495, 0xb400016a, "e,f,g", 0 }, |
{ "i2st.dd", 0x48000595, 0xb400006a, "e,f,g", 0 }, |
{ "i2as1.ss", 0x48000416, 0xb40001e9, "e,f,g", 0 }, |
{ "i2as1.sd", 0x48000496, 0xb4000169, "e,f,g", 0 }, |
{ "i2as1.dd", 0x48000596, 0xb4000069, "e,f,g", 0 }, |
{ "i2ast.ss", 0x48000417, 0xb40001e8, "e,f,g", 0 }, |
{ "i2ast.sd", 0x48000497, 0xb4000168, "e,f,g", 0 }, |
{ "i2ast.dd", 0x48000597, 0xb4000068, "e,f,g", 0 }, |
{ "rat1s2.ss", 0x48000418, 0xb40001e7, "e,f,g", 0 }, |
{ "rat1s2.sd", 0x48000498, 0xb4000167, "e,f,g", 0 }, |
{ "rat1s2.dd", 0x48000598, 0xb4000067, "e,f,g", 0 }, |
{ "m12asm.ss", 0x48000419, 0xb40001e6, "e,f,g", 0 }, |
{ "m12asm.sd", 0x48000499, 0xb4000166, "e,f,g", 0 }, |
{ "m12asm.dd", 0x48000599, 0xb4000066, "e,f,g", 0 }, |
{ "ra1s2.ss", 0x4800041a, 0xb40001e5, "e,f,g", 0 }, |
{ "ra1s2.sd", 0x4800049a, 0xb4000165, "e,f,g", 0 }, |
{ "ra1s2.dd", 0x4800059a, 0xb4000065, "e,f,g", 0 }, |
{ "m12ttsa.ss", 0x4800041b, 0xb40001e4, "e,f,g", 0 }, |
{ "m12ttsa.sd", 0x4800049b, 0xb4000164, "e,f,g", 0 }, |
{ "m12ttsa.dd", 0x4800059b, 0xb4000064, "e,f,g", 0 }, |
{ "iat1s2.ss", 0x4800041c, 0xb40001e3, "e,f,g", 0 }, |
{ "iat1s2.sd", 0x4800049c, 0xb4000163, "e,f,g", 0 }, |
{ "iat1s2.dd", 0x4800059c, 0xb4000063, "e,f,g", 0 }, |
{ "m12tsm.ss", 0x4800041d, 0xb40001e2, "e,f,g", 0 }, |
{ "m12tsm.sd", 0x4800049d, 0xb4000162, "e,f,g", 0 }, |
{ "m12tsm.dd", 0x4800059d, 0xb4000062, "e,f,g", 0 }, |
{ "ia1s2.ss", 0x4800041e, 0xb40001e1, "e,f,g", 0 }, |
{ "ia1s2.sd", 0x4800049e, 0xb4000161, "e,f,g", 0 }, |
{ "ia1s2.dd", 0x4800059e, 0xb4000061, "e,f,g", 0 }, |
{ "m12tsa.ss", 0x4800041f, 0xb40001e0, "e,f,g", 0 }, |
{ "m12tsa.sd", 0x4800049f, 0xb4000160, "e,f,g", 0 }, |
{ "m12tsa.dd", 0x4800059f, 0xb4000060, "e,f,g", 0 }, |
/* Floating Point Escape Instruction Format - pfmam.p fsrc1,fsrc2,fdest. */ |
{ "mr2p1.ss", 0x48000000, 0xb40005ff, "e,f,g", 0 }, |
{ "mr2p1.sd", 0x48000080, 0xb400057f, "e,f,g", 0 }, |
{ "mr2p1.dd", 0x48000180, 0xb400047f, "e,f,g", 0 }, |
{ "mr2pt.ss", 0x48000001, 0xb40005fe, "e,f,g", 0 }, |
{ "mr2pt.sd", 0x48000081, 0xb400057e, "e,f,g", 0 }, |
{ "mr2pt.dd", 0x48000181, 0xb400047e, "e,f,g", 0 }, |
{ "mr2mp1.ss", 0x48000002, 0xb40005fd, "e,f,g", 0 }, |
{ "mr2mp1.sd", 0x48000082, 0xb400057d, "e,f,g", 0 }, |
{ "mr2mp1.dd", 0x48000182, 0xb400047d, "e,f,g", 0 }, |
{ "mr2mpt.ss", 0x48000003, 0xb40005fc, "e,f,g", 0 }, |
{ "mr2mpt.sd", 0x48000083, 0xb400057c, "e,f,g", 0 }, |
{ "mr2mpt.dd", 0x48000183, 0xb400047c, "e,f,g", 0 }, |
{ "mi2p1.ss", 0x48000004, 0xb40005fb, "e,f,g", 0 }, |
{ "mi2p1.sd", 0x48000084, 0xb400057b, "e,f,g", 0 }, |
{ "mi2p1.dd", 0x48000184, 0xb400047b, "e,f,g", 0 }, |
{ "mi2pt.ss", 0x48000005, 0xb40005fa, "e,f,g", 0 }, |
{ "mi2pt.sd", 0x48000085, 0xb400057a, "e,f,g", 0 }, |
{ "mi2pt.dd", 0x48000185, 0xb400047a, "e,f,g", 0 }, |
{ "mi2mp1.ss", 0x48000006, 0xb40005f9, "e,f,g", 0 }, |
{ "mi2mp1.sd", 0x48000086, 0xb4000579, "e,f,g", 0 }, |
{ "mi2mp1.dd", 0x48000186, 0xb4000479, "e,f,g", 0 }, |
{ "mi2mpt.ss", 0x48000007, 0xb40005f8, "e,f,g", 0 }, |
{ "mi2mpt.sd", 0x48000087, 0xb4000578, "e,f,g", 0 }, |
{ "mi2mpt.dd", 0x48000187, 0xb4000478, "e,f,g", 0 }, |
{ "mrmt1p2.ss", 0x48000008, 0xb40005f7, "e,f,g", 0 }, |
{ "mrmt1p2.sd", 0x48000088, 0xb4000577, "e,f,g", 0 }, |
{ "mrmt1p2.dd", 0x48000188, 0xb4000477, "e,f,g", 0 }, |
{ "mm12mpm.ss", 0x48000009, 0xb40005f6, "e,f,g", 0 }, |
{ "mm12mpm.sd", 0x48000089, 0xb4000576, "e,f,g", 0 }, |
{ "mm12mpm.dd", 0x48000189, 0xb4000476, "e,f,g", 0 }, |
{ "mrm1p2.ss", 0x4800000a, 0xb40005f5, "e,f,g", 0 }, |
{ "mrm1p2.sd", 0x4800008a, 0xb4000575, "e,f,g", 0 }, |
{ "mrm1p2.dd", 0x4800018a, 0xb4000475, "e,f,g", 0 }, |
{ "mm12ttpm.ss",0x4800000b, 0xb40005f4, "e,f,g", 0 }, |
{ "mm12ttpm.sd",0x4800008b, 0xb4000574, "e,f,g", 0 }, |
{ "mm12ttpm.dd",0x4800018b, 0xb4000474, "e,f,g", 0 }, |
{ "mimt1p2.ss", 0x4800000c, 0xb40005f3, "e,f,g", 0 }, |
{ "mimt1p2.sd", 0x4800008c, 0xb4000573, "e,f,g", 0 }, |
{ "mimt1p2.dd", 0x4800018c, 0xb4000473, "e,f,g", 0 }, |
{ "mm12tpm.ss", 0x4800000d, 0xb40005f2, "e,f,g", 0 }, |
{ "mm12tpm.sd", 0x4800008d, 0xb4000572, "e,f,g", 0 }, |
{ "mm12tpm.dd", 0x4800018d, 0xb4000472, "e,f,g", 0 }, |
{ "mim1p2.ss", 0x4800000e, 0xb40005f1, "e,f,g", 0 }, |
{ "mim1p2.sd", 0x4800008e, 0xb4000571, "e,f,g", 0 }, |
{ "mim1p2.dd", 0x4800018e, 0xb4000471, "e,f,g", 0 }, |
/* Floating Point Escape Instruction Format - pfmsm.p fsrc1,fsrc2,fdest. */ |
{ "mr2s1.ss", 0x48000010, 0xb40005ef, "e,f,g", 0 }, |
{ "mr2s1.sd", 0x48000090, 0xb400056f, "e,f,g", 0 }, |
{ "mr2s1.dd", 0x48000190, 0xb400046f, "e,f,g", 0 }, |
{ "mr2st.ss", 0x48000011, 0xb40005ee, "e,f,g", 0 }, |
{ "mr2st.sd", 0x48000091, 0xb400056e, "e,f,g", 0 }, |
{ "mr2st.dd", 0x48000191, 0xb400046e, "e,f,g", 0 }, |
{ "mr2ms1.ss", 0x48000012, 0xb40005ed, "e,f,g", 0 }, |
{ "mr2ms1.sd", 0x48000092, 0xb400056d, "e,f,g", 0 }, |
{ "mr2ms1.dd", 0x48000192, 0xb400046d, "e,f,g", 0 }, |
{ "mr2mst.ss", 0x48000013, 0xb40005ec, "e,f,g", 0 }, |
{ "mr2mst.sd", 0x48000093, 0xb400056c, "e,f,g", 0 }, |
{ "mr2mst.dd", 0x48000193, 0xb400046c, "e,f,g", 0 }, |
{ "mi2s1.ss", 0x48000014, 0xb40005eb, "e,f,g", 0 }, |
{ "mi2s1.sd", 0x48000094, 0xb400056b, "e,f,g", 0 }, |
{ "mi2s1.dd", 0x48000194, 0xb400046b, "e,f,g", 0 }, |
{ "mi2st.ss", 0x48000015, 0xb40005ea, "e,f,g", 0 }, |
{ "mi2st.sd", 0x48000095, 0xb400056a, "e,f,g", 0 }, |
{ "mi2st.dd", 0x48000195, 0xb400046a, "e,f,g", 0 }, |
{ "mi2ms1.ss", 0x48000016, 0xb40005e9, "e,f,g", 0 }, |
{ "mi2ms1.sd", 0x48000096, 0xb4000569, "e,f,g", 0 }, |
{ "mi2ms1.dd", 0x48000196, 0xb4000469, "e,f,g", 0 }, |
{ "mi2mst.ss", 0x48000017, 0xb40005e8, "e,f,g", 0 }, |
{ "mi2mst.sd", 0x48000097, 0xb4000568, "e,f,g", 0 }, |
{ "mi2mst.dd", 0x48000197, 0xb4000468, "e,f,g", 0 }, |
{ "mrmt1s2.ss", 0x48000018, 0xb40005e7, "e,f,g", 0 }, |
{ "mrmt1s2.sd", 0x48000098, 0xb4000567, "e,f,g", 0 }, |
{ "mrmt1s2.dd", 0x48000198, 0xb4000467, "e,f,g", 0 }, |
{ "mm12msm.ss", 0x48000019, 0xb40005e6, "e,f,g", 0 }, |
{ "mm12msm.sd", 0x48000099, 0xb4000566, "e,f,g", 0 }, |
{ "mm12msm.dd", 0x48000199, 0xb4000466, "e,f,g", 0 }, |
{ "mrm1s2.ss", 0x4800001a, 0xb40005e5, "e,f,g", 0 }, |
{ "mrm1s2.sd", 0x4800009a, 0xb4000565, "e,f,g", 0 }, |
{ "mrm1s2.dd", 0x4800019a, 0xb4000465, "e,f,g", 0 }, |
{ "mm12ttsm.ss",0x4800001b, 0xb40005e4, "e,f,g", 0 }, |
{ "mm12ttsm.sd",0x4800009b, 0xb4000564, "e,f,g", 0 }, |
{ "mm12ttsm.dd",0x4800019b, 0xb4000464, "e,f,g", 0 }, |
{ "mimt1s2.ss", 0x4800001c, 0xb40005e3, "e,f,g", 0 }, |
{ "mimt1s2.sd", 0x4800009c, 0xb4000563, "e,f,g", 0 }, |
{ "mimt1s2.dd", 0x4800019c, 0xb4000463, "e,f,g", 0 }, |
{ "mm12tsm.ss", 0x4800001d, 0xb40005e2, "e,f,g", 0 }, |
{ "mm12tsm.sd", 0x4800009d, 0xb4000562, "e,f,g", 0 }, |
{ "mm12tsm.dd", 0x4800019d, 0xb4000462, "e,f,g", 0 }, |
{ "mim1s2.ss", 0x4800001e, 0xb40005e1, "e,f,g", 0 }, |
{ "mim1s2.sd", 0x4800009e, 0xb4000561, "e,f,g", 0 }, |
{ "mim1s2.dd", 0x4800019e, 0xb4000461, "e,f,g", 0 }, |
{ "fmul.ss", 0x48000020, 0xb40005df, "e,f,g", 0 }, /* fmul.p fsrc1,fsrc2,fdest */ |
{ "fmul.sd", 0x480000a0, 0xb400055f, "e,f,g", 0 }, /* fmul.p fsrc1,fsrc2,fdest */ |
{ "fmul.dd", 0x480001a0, 0xb400045f, "e,f,g", 0 }, /* fmul.p fsrc1,fsrc2,fdest */ |
{ "pfmul.ss", 0x48000420, 0xb40001df, "e,f,g", 0 }, /* pfmul.p fsrc1,fsrc2,fdest */ |
{ "pfmul.sd", 0x480004a0, 0xb400015f, "e,f,g", 0 }, /* pfmul.p fsrc1,fsrc2,fdest */ |
{ "pfmul.dd", 0x480005a0, 0xb400005f, "e,f,g", 0 }, /* pfmul.p fsrc1,fsrc2,fdest */ |
{ "pfmul3.dd", 0x480005a4, 0xb400005b, "e,f,g", 0 }, /* pfmul3.p fsrc1,fsrc2,fdest */ |
{ "fmlow.dd", 0x480001a1, 0xb400045e, "e,f,g", 0 }, /* fmlow.dd fsrc1,fsrc2,fdest */ |
{ "frcp.ss", 0x48000022, 0xb40005dd, "f,g", 0 }, /* frcp.p fsrc2,fdest */ |
{ "frcp.sd", 0x480000a2, 0xb400055d, "f,g", 0 }, /* frcp.p fsrc2,fdest */ |
{ "frcp.dd", 0x480001a2, 0xb400045d, "f,g", 0 }, /* frcp.p fsrc2,fdest */ |
{ "frsqr.ss", 0x48000023, 0xb40005dc, "f,g", 0 }, /* frsqr.p fsrc2,fdest */ |
{ "frsqr.sd", 0x480000a3, 0xb400055c, "f,g", 0 }, /* frsqr.p fsrc2,fdest */ |
{ "frsqr.dd", 0x480001a3, 0xb400045c, "f,g", 0 }, /* frsqr.p fsrc2,fdest */ |
{ "fadd.ss", 0x48000030, 0xb40005cf, "e,f,g", 0 }, /* fadd.p fsrc1,fsrc2,fdest */ |
{ "fadd.sd", 0x480000b0, 0xb400054f, "e,f,g", 0 }, /* fadd.p fsrc1,fsrc2,fdest */ |
{ "fadd.dd", 0x480001b0, 0xb400044f, "e,f,g", 0 }, /* fadd.p fsrc1,fsrc2,fdest */ |
{ "pfadd.ss", 0x48000430, 0xb40001cf, "e,f,g", 0 }, /* pfadd.p fsrc1,fsrc2,fdest */ |
{ "pfadd.sd", 0x480004b0, 0xb400014f, "e,f,g", 0 }, /* pfadd.p fsrc1,fsrc2,fdest */ |
{ "pfadd.dd", 0x480005b0, 0xb400004f, "e,f,g", 0 }, /* pfadd.p fsrc1,fsrc2,fdest */ |
{ "fsub.ss", 0x48000031, 0xb40005ce, "e,f,g", 0 }, /* fsub.p fsrc1,fsrc2,fdest */ |
{ "fsub.sd", 0x480000b1, 0xb400054e, "e,f,g", 0 }, /* fsub.p fsrc1,fsrc2,fdest */ |
{ "fsub.dd", 0x480001b1, 0xb400044e, "e,f,g", 0 }, /* fsub.p fsrc1,fsrc2,fdest */ |
{ "pfsub.ss", 0x48000431, 0xb40001ce, "e,f,g", 0 }, /* pfsub.p fsrc1,fsrc2,fdest */ |
{ "pfsub.sd", 0x480004b1, 0xb400014e, "e,f,g", 0 }, /* pfsub.p fsrc1,fsrc2,fdest */ |
{ "pfsub.dd", 0x480005b1, 0xb400004e, "e,f,g", 0 }, /* pfsub.p fsrc1,fsrc2,fdest */ |
{ "fix.sd", 0x480000b2, 0xb400054d, "e,g", 0 }, /* fix.p fsrc1,fdest */ |
{ "fix.dd", 0x480001b2, 0xb400044d, "e,g", 0 }, /* fix.p fsrc1,fdest */ |
{ "pfix.sd", 0x480004b2, 0xb400014d, "e,g", 0 }, /* pfix.p fsrc1,fdest */ |
{ "pfix.dd", 0x480005b2, 0xb400004d, "e,g", 0 }, /* pfix.p fsrc1,fdest */ |
{ "famov.ss", 0x48000033, 0xb40005cc, "e,g", 0 }, /* famov.p fsrc1,fdest */ |
{ "famov.ds", 0x48000133, 0xb40004cc, "e,g", 0 }, /* famov.p fsrc1,fdest */ |
{ "famov.sd", 0x480000b3, 0xb400054c, "e,g", 0 }, /* famov.p fsrc1,fdest */ |
{ "famov.dd", 0x480001b3, 0xb400044c, "e,g", 0 }, /* famov.p fsrc1,fdest */ |
{ "pfamov.ss", 0x48000433, 0xb40001cc, "e,g", 0 }, /* pfamov.p fsrc1,fdest */ |
{ "pfamov.ds", 0x48000533, 0xb40000cc, "e,g", 0 }, /* pfamov.p fsrc1,fdest */ |
{ "pfamov.sd", 0x480004b3, 0xb400014c, "e,g", 0 }, /* pfamov.p fsrc1,fdest */ |
{ "pfamov.dd", 0x480005b3, 0xb400004c, "e,g", 0 }, /* pfamov.p fsrc1,fdest */ |
/* Opcode pfgt has R bit cleared; pfle has R bit set. */ |
{ "pfgt.ss", 0x48000434, 0xb40001cb, "e,f,g", 0 }, /* pfgt.p fsrc1,fsrc2,fdest */ |
{ "pfgt.dd", 0x48000534, 0xb40000cb, "e,f,g", 0 }, /* pfgt.p fsrc1,fsrc2,fdest */ |
/* Opcode pfgt has R bit cleared; pfle has R bit set. */ |
{ "pfle.ss", 0x480004b4, 0xb400014b, "e,f,g", 0 }, /* pfle.p fsrc1,fsrc2,fdest */ |
{ "pfle.dd", 0x480005b4, 0xb400004b, "e,f,g", 0 }, /* pfle.p fsrc1,fsrc2,fdest */ |
{ "pfeq.ss", 0x48000435, 0xb40001ca, "e,f,g", 0 }, /* pfeq.p fsrc1,fsrc2,fdest */ |
{ "pfeq.dd", 0x48000535, 0xb40000ca, "e,f,g", 0 }, /* pfeq.p fsrc1,fsrc2,fdest */ |
{ "ftrunc.sd", 0x480000ba, 0xb4000545, "e,g", 0 }, /* ftrunc.p fsrc1,fdest */ |
{ "ftrunc.dd", 0x480001ba, 0xb4000445, "e,g", 0 }, /* ftrunc.p fsrc1,fdest */ |
{ "pftrunc.sd", 0x480004ba, 0xb4000145, "e,g", 0 }, /* pftrunc.p fsrc1,fdest */ |
{ "pftrunc.dd", 0x480005ba, 0xb4000045, "e,g", 0 }, /* pftrunc.p fsrc1,fdest */ |
{ "fxfr", 0x48000040, 0xb40005bf, "e,d", 0 }, /* fxfr fsrc1,idest */ |
{ "fiadd.ss", 0x48000049, 0xb40005b6, "e,f,g", 0 }, /* fiadd.w fsrc1,fsrc2,fdest */ |
{ "fiadd.dd", 0x480001c9, 0xb4000436, "e,f,g", 0 }, /* fiadd.w fsrc1,fsrc2,fdest */ |
{ "pfiadd.ss", 0x48000449, 0xb40001b6, "e,f,g", 0 }, /* pfiadd.w fsrc1,fsrc2,fdest */ |
{ "pfiadd.dd", 0x480005c9, 0xb4000036, "e,f,g", 0 }, /* pfiadd.w fsrc1,fsrc2,fdest */ |
{ "fisub.ss", 0x4800004d, 0xb40005b2, "e,f,g", 0 }, /* fisub.w fsrc1,fsrc2,fdest */ |
{ "fisub.dd", 0x480001cd, 0xb4000432, "e,f,g", 0 }, /* fisub.w fsrc1,fsrc2,fdest */ |
{ "pfisub.ss", 0x4800044d, 0xb40001b2, "e,f,g", 0 }, /* pfisub.w fsrc1,fsrc2,fdest */ |
{ "pfisub.dd", 0x480005cd, 0xb4000032, "e,f,g", 0 }, /* pfisub.w fsrc1,fsrc2,fdest */ |
{ "fzchkl", 0x480001d7, 0xb4000428, "e,f,g", 0 }, /* fzchkl fsrc1,fsrc2,fdest */ |
{ "pfzchkl", 0x480005d7, 0xb4000028, "e,f,g", 0 }, /* pfzchkl fsrc1,fsrc2,fdest */ |
{ "fzchks", 0x480001df, 0xb4000420, "e,f,g", 0 }, /* fzchks fsrc1,fsrc2,fdest */ |
{ "pfzchks", 0x480005df, 0xb4000020, "e,f,g", 0 }, /* pfzchks fsrc1,fsrc2,fdest */ |
{ "faddp", 0x480001d0, 0xb400042f, "e,f,g", 0 }, /* faddp fsrc1,fsrc2,fdest */ |
{ "pfaddp", 0x480005d0, 0xb400002f, "e,f,g", 0 }, /* pfaddp fsrc1,fsrc2,fdest */ |
{ "faddz", 0x480001d1, 0xb400042e, "e,f,g", 0 }, /* faddz fsrc1,fsrc2,fdest */ |
{ "pfaddz", 0x480005d1, 0xb400002e, "e,f,g", 0 }, /* pfaddz fsrc1,fsrc2,fdest */ |
{ "form", 0x480001da, 0xb4000425, "e,g", 0 }, /* form fsrc1,fdest */ |
{ "pform", 0x480005da, 0xb4000025, "e,g", 0 }, /* pform fsrc1,fdest */ |
/* Floating point pseudo-instructions. */ |
{ "fmov.ss", 0x48000049, 0xb7e005b6, "e,g", 0 }, /* fiadd.ss fsrc1,f0,fdest */ |
{ "fmov.dd", 0x480001c9, 0xb7e00436, "e,g", 0 }, /* fiadd.dd fsrc1,f0,fdest */ |
{ "fmov.sd", 0x480000b3, 0xb400054c, "e,g", 0 }, /* famov.sd fsrc1,fdest */ |
{ "fmov.ds", 0x48000133, 0xb40004cc, "e,g", 0 }, /* famov.ds fsrc1,fdest */ |
{ "pfmov.ds", 0x48000533, 0xb40000cc, "e,g", 0 }, /* pfamov.ds fsrc1,fdest */ |
{ "pfmov.dd", 0x480005c9, 0xb7e00036, "e,g", 0 }, /* pfiadd.dd fsrc1,f0,fdest */ |
{ 0, 0, 0, 0, 0 }, |
}; |
#define NUMOPCODES ((sizeof i860_opcodes)/(sizeof i860_opcodes[0])) |
/contrib/toolchain/binutils/include/opcode/i960.h |
---|
0,0 → 1,525 |
/* Basic 80960 instruction formats. |
Copyright 2001-2013 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3, or (at your option) |
any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
/* The 'COJ' instructions are actually COBR instructions with the 'b' in |
the mnemonic replaced by a 'j'; they are ALWAYS "de-optimized" if |
necessary: if the displacement will not fit in 13 bits, the assembler will |
replace them with the corresponding compare and branch instructions. |
All of the 'MEMn' instructions are the same format; the 'n' in the name |
indicates the default index scale factor (the size of the datum operated on). |
The FBRA formats are not actually an instruction format. They are the |
"convenience directives" for branching on floating-point comparisons, |
each of which generates 2 instructions (a 'bno' and one other branch). |
The CALLJ format is not actually an instruction format. It indicates that |
the instruction generated (a CTRL-format 'call') should have its relocation |
specially flagged for link-time replacement with a 'bal' or 'calls' if |
appropriate. */ |
#define CTRL 0 |
#define COBR 1 |
#define COJ 2 |
#define REG 3 |
#define MEM1 4 |
#define MEM2 5 |
#define MEM4 6 |
#define MEM8 7 |
#define MEM12 8 |
#define MEM16 9 |
#define FBRA 10 |
#define CALLJ 11 |
/* Masks for the mode bits in REG format instructions */ |
#define M1 0x0800 |
#define M2 0x1000 |
#define M3 0x2000 |
/* Generate the 12-bit opcode for a REG format instruction by placing the |
* high 8 bits in instruction bits 24-31, the low 4 bits in instruction bits |
* 7-10. |
*/ |
#define REG_OPC(opc) ((opc & 0xff0) << 20) | ((opc & 0xf) << 7) |
/* Generate a template for a REG format instruction: place the opcode bits |
* in the appropriate fields and OR in mode bits for the operands that will not |
* be used. I.e., |
* set m1=1, if src1 will not be used |
* set m2=1, if src2 will not be used |
* set m3=1, if dst will not be used |
* |
* Setting the "unused" mode bits to 1 speeds up instruction execution(!). |
* The information is also useful to us because some 1-operand REG instructions |
* use the src1 field, others the dst field; and some 2-operand REG instructions |
* use src1/src2, others src1/dst. The set mode bits enable us to distinguish. |
*/ |
#define R_0(opc) ( REG_OPC(opc) | M1 | M2 | M3 ) /* No operands */ |
#define R_1(opc) ( REG_OPC(opc) | M2 | M3 ) /* 1 operand: src1 */ |
#define R_1D(opc) ( REG_OPC(opc) | M1 | M2 ) /* 1 operand: dst */ |
#define R_2(opc) ( REG_OPC(opc) | M3 ) /* 2 ops: src1/src2 */ |
#define R_2D(opc) ( REG_OPC(opc) | M2 ) /* 2 ops: src1/dst */ |
#define R_3(opc) ( REG_OPC(opc) ) /* 3 operands */ |
/* DESCRIPTOR BYTES FOR REGISTER OPERANDS |
* |
* Interpret names as follows: |
* R: global or local register only |
* RS: global, local, or (if target allows) special-function register only |
* RL: global or local register, or integer literal |
* RSL: global, local, or (if target allows) special-function register; |
* or integer literal |
* F: global, local, or floating-point register |
* FL: global, local, or floating-point register; or literal (including |
* floating point) |
* |
* A number appended to a name indicates that registers must be aligned, |
* as follows: |
* 2: register number must be multiple of 2 |
* 4: register number must be multiple of 4 |
*/ |
#define SFR 0x10 /* Mask for the "sfr-OK" bit */ |
#define LIT 0x08 /* Mask for the "literal-OK" bit */ |
#define FP 0x04 /* Mask for "floating-point-OK" bit */ |
/* This macro ors the bits together. Note that 'align' is a mask |
* for the low 0, 1, or 2 bits of the register number, as appropriate. |
*/ |
#define OP(align,lit,fp,sfr) ( align | lit | fp | sfr ) |
#define R OP( 0, 0, 0, 0 ) |
#define RS OP( 0, 0, 0, SFR ) |
#define RL OP( 0, LIT, 0, 0 ) |
#define RSL OP( 0, LIT, 0, SFR ) |
#define F OP( 0, 0, FP, 0 ) |
#define FL OP( 0, LIT, FP, 0 ) |
#define R2 OP( 1, 0, 0, 0 ) |
#define RL2 OP( 1, LIT, 0, 0 ) |
#define F2 OP( 1, 0, FP, 0 ) |
#define FL2 OP( 1, LIT, FP, 0 ) |
#define R4 OP( 3, 0, 0, 0 ) |
#define RL4 OP( 3, LIT, 0, 0 ) |
#define F4 OP( 3, 0, FP, 0 ) |
#define FL4 OP( 3, LIT, FP, 0 ) |
#define M 0x7f /* Memory operand (MEMA & MEMB format instructions) */ |
/* Macros to extract info from the register operand descriptor byte 'od'. |
*/ |
#define SFR_OK(od) (od & SFR) /* TRUE if sfr operand allowed */ |
#define LIT_OK(od) (od & LIT) /* TRUE if literal operand allowed */ |
#define FP_OK(od) (od & FP) /* TRUE if floating-point op allowed */ |
#define REG_ALIGN(od,n) ((od & 0x3 & n) == 0) |
/* TRUE if reg #n is properly aligned */ |
#define MEMOP(od) (od == M) /* TRUE if operand is a memory operand*/ |
/* Description of a single i80960 instruction */ |
struct i960_opcode { |
long opcode; /* 32 bits, constant fields filled in, rest zeroed */ |
char *name; /* Assembler mnemonic */ |
short iclass; /* Class: see #defines below */ |
char format; /* REG, COBR, CTRL, MEMn, COJ, FBRA, or CALLJ */ |
char num_ops; /* Number of operands */ |
char operand[3];/* Operand descriptors; same order as assembler instr */ |
}; |
/* Classes of 960 instructions: |
* - each instruction falls into one class. |
* - each target architecture supports one or more classes. |
* |
* EACH CONSTANT MUST CONTAIN 1 AND ONLY 1 SET BIT!: see targ_has_iclass(). |
*/ |
#define I_BASE 0x01 /* 80960 base instruction set */ |
#define I_CX 0x02 /* 80960Cx instruction */ |
#define I_DEC 0x04 /* Decimal instruction */ |
#define I_FP 0x08 /* Floating point instruction */ |
#define I_KX 0x10 /* 80960Kx instruction */ |
#define I_MIL 0x20 /* Military instruction */ |
#define I_CASIM 0x40 /* CA simulator instruction */ |
#define I_CX2 0x80 /* Cx/Jx/Hx instructions */ |
#define I_JX 0x100 /* Jx/Hx instruction */ |
#define I_HX 0x200 /* Hx instructions */ |
/****************************************************************************** |
* |
* TABLE OF i960 INSTRUCTION DESCRIPTIONS |
* |
******************************************************************************/ |
const struct i960_opcode i960_opcodes[] = { |
/* if a CTRL instruction has an operand, it's always a displacement */ |
/* callj default=='call' */ |
{ 0x09000000, "callj", I_BASE, CALLJ, 1, { 0, 0, 0 } }, |
{ 0x08000000, "b", I_BASE, CTRL, 1, { 0, 0, 0 } }, |
{ 0x09000000, "call", I_BASE, CTRL, 1, { 0, 0, 0 } }, |
{ 0x0a000000, "ret", I_BASE, CTRL, 0, { 0, 0, 0 } }, |
{ 0x0b000000, "bal", I_BASE, CTRL, 1, { 0, 0, 0 } }, |
{ 0x10000000, "bno", I_BASE, CTRL, 1, { 0, 0, 0 } }, |
/* bf same as bno */ |
{ 0x10000000, "bf", I_BASE, CTRL, 1, { 0, 0, 0 } }, |
/* bru same as bno */ |
{ 0x10000000, "bru", I_BASE, CTRL, 1, { 0, 0, 0 } }, |
{ 0x11000000, "bg", I_BASE, CTRL, 1, { 0, 0, 0 } }, |
/* brg same as bg */ |
{ 0x11000000, "brg", I_BASE, CTRL, 1, { 0, 0, 0 } }, |
{ 0x12000000, "be", I_BASE, CTRL, 1, { 0, 0, 0 } }, |
/* bre same as be */ |
{ 0x12000000, "bre", I_BASE, CTRL, 1, { 0, 0, 0 } }, |
{ 0x13000000, "bge", I_BASE, CTRL, 1, { 0, 0, 0 } }, |
/* brge same as bge */ |
{ 0x13000000, "brge", I_BASE, CTRL, 1, { 0, 0, 0 } }, |
{ 0x14000000, "bl", I_BASE, CTRL, 1, { 0, 0, 0 } }, |
/* brl same as bl */ |
{ 0x14000000, "brl", I_BASE, CTRL, 1, { 0, 0, 0 } }, |
{ 0x15000000, "bne", I_BASE, CTRL, 1, { 0, 0, 0 } }, |
/* brlg same as bne */ |
{ 0x15000000, "brlg", I_BASE, CTRL, 1, { 0, 0, 0 } }, |
{ 0x16000000, "ble", I_BASE, CTRL, 1, { 0, 0, 0 } }, |
/* brle same as ble */ |
{ 0x16000000, "brle", I_BASE, CTRL, 1, { 0, 0, 0 } }, |
{ 0x17000000, "bo", I_BASE, CTRL, 1, { 0, 0, 0 } }, |
/* bt same as bo */ |
{ 0x17000000, "bt", I_BASE, CTRL, 1, { 0, 0, 0 } }, |
/* bro same as bo */ |
{ 0x17000000, "bro", I_BASE, CTRL, 1, { 0, 0, 0 } }, |
{ 0x18000000, "faultno", I_BASE, CTRL, 0, { 0, 0, 0 } }, |
/* faultf same as faultno */ |
{ 0x18000000, "faultf", I_BASE, CTRL, 0, { 0, 0, 0 } }, |
{ 0x19000000, "faultg", I_BASE, CTRL, 0, { 0, 0, 0 } }, |
{ 0x1a000000, "faulte", I_BASE, CTRL, 0, { 0, 0, 0 } }, |
{ 0x1b000000, "faultge", I_BASE, CTRL, 0, { 0, 0, 0 } }, |
{ 0x1c000000, "faultl", I_BASE, CTRL, 0, { 0, 0, 0 } }, |
{ 0x1d000000, "faultne", I_BASE, CTRL, 0, { 0, 0, 0 } }, |
{ 0x1e000000, "faultle", I_BASE, CTRL, 0, { 0, 0, 0 } }, |
{ 0x1f000000, "faulto", I_BASE, CTRL, 0, { 0, 0, 0 } }, |
/* faultt syn for faulto */ |
{ 0x1f000000, "faultt", I_BASE, CTRL, 0, { 0, 0, 0 } }, |
{ 0x01000000, "syscall", I_CASIM,CTRL, 0, { 0, 0, 0 } }, |
/* If a COBR (or COJ) has 3 operands, the last one is always a |
* displacement and does not appear explicitly in the table. |
*/ |
{ 0x20000000, "testno", I_BASE, COBR, 1, { R, 0, 0 } }, |
{ 0x21000000, "testg", I_BASE, COBR, 1, { R, 0, 0 } }, |
{ 0x22000000, "teste", I_BASE, COBR, 1, { R, 0, 0 } }, |
{ 0x23000000, "testge", I_BASE, COBR, 1, { R, 0, 0 } }, |
{ 0x24000000, "testl", I_BASE, COBR, 1, { R, 0, 0 } }, |
{ 0x25000000, "testne", I_BASE, COBR, 1, { R, 0, 0 } }, |
{ 0x26000000, "testle", I_BASE, COBR, 1, { R, 0, 0 } }, |
{ 0x27000000, "testo", I_BASE, COBR, 1, { R, 0, 0 } }, |
{ 0x30000000, "bbc", I_BASE, COBR, 3, { RL, RS, 0 } }, |
{ 0x31000000, "cmpobg", I_BASE, COBR, 3, { RL, RS, 0 } }, |
{ 0x32000000, "cmpobe", I_BASE, COBR, 3, { RL, RS, 0 } }, |
{ 0x33000000, "cmpobge", I_BASE, COBR, 3, { RL, RS, 0 } }, |
{ 0x34000000, "cmpobl", I_BASE, COBR, 3, { RL, RS, 0 } }, |
{ 0x35000000, "cmpobne", I_BASE, COBR, 3, { RL, RS, 0 } }, |
{ 0x36000000, "cmpoble", I_BASE, COBR, 3, { RL, RS, 0 } }, |
{ 0x37000000, "bbs", I_BASE, COBR, 3, { RL, RS, 0 } }, |
{ 0x38000000, "cmpibno", I_BASE, COBR, 3, { RL, RS, 0 } }, |
{ 0x39000000, "cmpibg", I_BASE, COBR, 3, { RL, RS, 0 } }, |
{ 0x3a000000, "cmpibe", I_BASE, COBR, 3, { RL, RS, 0 } }, |
{ 0x3b000000, "cmpibge", I_BASE, COBR, 3, { RL, RS, 0 } }, |
{ 0x3c000000, "cmpibl", I_BASE, COBR, 3, { RL, RS, 0 } }, |
{ 0x3d000000, "cmpibne", I_BASE, COBR, 3, { RL, RS, 0 } }, |
{ 0x3e000000, "cmpible", I_BASE, COBR, 3, { RL, RS, 0 } }, |
{ 0x3f000000, "cmpibo", I_BASE, COBR, 3, { RL, RS, 0 } }, |
{ 0x31000000, "cmpojg", I_BASE, COJ, 3, { RL, RS, 0 } }, |
{ 0x32000000, "cmpoje", I_BASE, COJ, 3, { RL, RS, 0 } }, |
{ 0x33000000, "cmpojge", I_BASE, COJ, 3, { RL, RS, 0 } }, |
{ 0x34000000, "cmpojl", I_BASE, COJ, 3, { RL, RS, 0 } }, |
{ 0x35000000, "cmpojne", I_BASE, COJ, 3, { RL, RS, 0 } }, |
{ 0x36000000, "cmpojle", I_BASE, COJ, 3, { RL, RS, 0 } }, |
{ 0x38000000, "cmpijno", I_BASE, COJ, 3, { RL, RS, 0 } }, |
{ 0x39000000, "cmpijg", I_BASE, COJ, 3, { RL, RS, 0 } }, |
{ 0x3a000000, "cmpije", I_BASE, COJ, 3, { RL, RS, 0 } }, |
{ 0x3b000000, "cmpijge", I_BASE, COJ, 3, { RL, RS, 0 } }, |
{ 0x3c000000, "cmpijl", I_BASE, COJ, 3, { RL, RS, 0 } }, |
{ 0x3d000000, "cmpijne", I_BASE, COJ, 3, { RL, RS, 0 } }, |
{ 0x3e000000, "cmpijle", I_BASE, COJ, 3, { RL, RS, 0 } }, |
{ 0x3f000000, "cmpijo", I_BASE, COJ, 3, { RL, RS, 0 } }, |
{ 0x80000000, "ldob", I_BASE, MEM1, 2, { M, R, 0 } }, |
{ 0x82000000, "stob", I_BASE, MEM1, 2, { R, M, 0 } }, |
{ 0x84000000, "bx", I_BASE, MEM1, 1, { M, 0, 0 } }, |
{ 0x85000000, "balx", I_BASE, MEM1, 2, { M, R, 0 } }, |
{ 0x86000000, "callx", I_BASE, MEM1, 1, { M, 0, 0 } }, |
{ 0x88000000, "ldos", I_BASE, MEM2, 2, { M, R, 0 } }, |
{ 0x8a000000, "stos", I_BASE, MEM2, 2, { R, M, 0 } }, |
{ 0x8c000000, "lda", I_BASE, MEM1, 2, { M, R, 0 } }, |
{ 0x90000000, "ld", I_BASE, MEM4, 2, { M, R, 0 } }, |
{ 0x92000000, "st", I_BASE, MEM4, 2, { R, M, 0 } }, |
{ 0x98000000, "ldl", I_BASE, MEM8, 2, { M, R2, 0 } }, |
{ 0x9a000000, "stl", I_BASE, MEM8, 2, { R2, M, 0 } }, |
{ 0xa0000000, "ldt", I_BASE, MEM12, 2, { M, R4, 0 } }, |
{ 0xa2000000, "stt", I_BASE, MEM12, 2, { R4, M, 0 } }, |
{ 0xb0000000, "ldq", I_BASE, MEM16, 2, { M, R4, 0 } }, |
{ 0xb2000000, "stq", I_BASE, MEM16, 2, { R4, M, 0 } }, |
{ 0xc0000000, "ldib", I_BASE, MEM1, 2, { M, R, 0 } }, |
{ 0xc2000000, "stib", I_BASE, MEM1, 2, { R, M, 0 } }, |
{ 0xc8000000, "ldis", I_BASE, MEM2, 2, { M, R, 0 } }, |
{ 0xca000000, "stis", I_BASE, MEM2, 2, { R, M, 0 } }, |
{ R_3(0x580), "notbit", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x581), "and", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x582), "andnot", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x583), "setbit", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x584), "notand", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x586), "xor", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x587), "or", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x588), "nor", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x589), "xnor", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_2D(0x58a), "not", I_BASE, REG, 2, { RSL,RS, 0 } }, |
{ R_3(0x58b), "ornot", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x58c), "clrbit", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x58d), "notor", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x58e), "nand", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x58f), "alterbit", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x590), "addo", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x591), "addi", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x592), "subo", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x593), "subi", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x598), "shro", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x59a), "shrdi", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x59b), "shri", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x59c), "shlo", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x59d), "rotate", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x59e), "shli", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_2(0x5a0), "cmpo", I_BASE, REG, 2, { RSL,RSL, 0 } }, |
{ R_2(0x5a1), "cmpi", I_BASE, REG, 2, { RSL,RSL, 0 } }, |
{ R_2(0x5a2), "concmpo", I_BASE, REG, 2, { RSL,RSL, 0 } }, |
{ R_2(0x5a3), "concmpi", I_BASE, REG, 2, { RSL,RSL, 0 } }, |
{ R_3(0x5a4), "cmpinco", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x5a5), "cmpinci", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x5a6), "cmpdeco", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x5a7), "cmpdeci", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_2(0x5ac), "scanbyte", I_BASE, REG, 2, { RSL,RSL, 0 } }, |
{ R_2(0x5ae), "chkbit", I_BASE, REG, 2, { RSL,RSL, 0 } }, |
{ R_3(0x5b0), "addc", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x5b2), "subc", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_2D(0x5cc), "mov", I_BASE, REG, 2, { RSL,RS, 0 } }, |
{ R_2D(0x5dc), "movl", I_BASE, REG, 2, { RL2,R2, 0 } }, |
{ R_2D(0x5ec), "movt", I_BASE, REG, 2, { RL4,R4, 0 } }, |
{ R_2D(0x5fc), "movq", I_BASE, REG, 2, { RL4,R4, 0 } }, |
{ R_3(0x610), "atmod", I_BASE, REG, 3, { RS, RSL,R } }, |
{ R_3(0x612), "atadd", I_BASE, REG, 3, { RS, RSL,RS } }, |
{ R_2D(0x640), "spanbit", I_BASE, REG, 2, { RSL,RS, 0 } }, |
{ R_2D(0x641), "scanbit", I_BASE, REG, 2, { RSL,RS, 0 } }, |
{ R_3(0x645), "modac", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x650), "modify", I_BASE, REG, 3, { RSL,RSL,R } }, |
{ R_3(0x651), "extract", I_BASE, REG, 3, { RSL,RSL,R } }, |
{ R_3(0x654), "modtc", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x655), "modpc", I_BASE, REG, 3, { RSL,RSL,R } }, |
{ R_1(0x660), "calls", I_BASE, REG, 1, { RSL, 0, 0 } }, |
{ R_0(0x66b), "mark", I_BASE, REG, 0, { 0, 0, 0 } }, |
{ R_0(0x66c), "fmark", I_BASE, REG, 0, { 0, 0, 0 } }, |
{ R_0(0x66d), "flushreg", I_BASE, REG, 0, { 0, 0, 0 } }, |
{ R_0(0x66f), "syncf", I_BASE, REG, 0, { 0, 0, 0 } }, |
{ R_3(0x670), "emul", I_BASE, REG, 3, { RSL,RSL,R2 } }, |
{ R_3(0x671), "ediv", I_BASE, REG, 3, { RSL,RL2,RS } }, |
{ R_2D(0x672), "cvtadr", I_CASIM,REG, 2, { RL, R2, 0 } }, |
{ R_3(0x701), "mulo", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x708), "remo", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x70b), "divo", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x741), "muli", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x748), "remi", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x749), "modi", I_BASE, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x74b), "divi", I_BASE, REG, 3, { RSL,RSL,RS } }, |
/* Floating-point instructions */ |
{ R_2D(0x674), "cvtir", I_FP, REG, 2, { RL, F, 0 } }, |
{ R_2D(0x675), "cvtilr", I_FP, REG, 2, { RL, F, 0 } }, |
{ R_3(0x676), "scalerl", I_FP, REG, 3, { RL, FL2,F2 } }, |
{ R_3(0x677), "scaler", I_FP, REG, 3, { RL, FL, F } }, |
{ R_3(0x680), "atanr", I_FP, REG, 3, { FL, FL, F } }, |
{ R_3(0x681), "logepr", I_FP, REG, 3, { FL, FL, F } }, |
{ R_3(0x682), "logr", I_FP, REG, 3, { FL, FL, F } }, |
{ R_3(0x683), "remr", I_FP, REG, 3, { FL, FL, F } }, |
{ R_2(0x684), "cmpor", I_FP, REG, 2, { FL, FL, 0 } }, |
{ R_2(0x685), "cmpr", I_FP, REG, 2, { FL, FL, 0 } }, |
{ R_2D(0x688), "sqrtr", I_FP, REG, 2, { FL, F, 0 } }, |
{ R_2D(0x689), "expr", I_FP, REG, 2, { FL, F, 0 } }, |
{ R_2D(0x68a), "logbnr", I_FP, REG, 2, { FL, F, 0 } }, |
{ R_2D(0x68b), "roundr", I_FP, REG, 2, { FL, F, 0 } }, |
{ R_2D(0x68c), "sinr", I_FP, REG, 2, { FL, F, 0 } }, |
{ R_2D(0x68d), "cosr", I_FP, REG, 2, { FL, F, 0 } }, |
{ R_2D(0x68e), "tanr", I_FP, REG, 2, { FL, F, 0 } }, |
{ R_1(0x68f), "classr", I_FP, REG, 1, { FL, 0, 0 } }, |
{ R_3(0x690), "atanrl", I_FP, REG, 3, { FL2,FL2,F2 } }, |
{ R_3(0x691), "logeprl", I_FP, REG, 3, { FL2,FL2,F2 } }, |
{ R_3(0x692), "logrl", I_FP, REG, 3, { FL2,FL2,F2 } }, |
{ R_3(0x693), "remrl", I_FP, REG, 3, { FL2,FL2,F2 } }, |
{ R_2(0x694), "cmporl", I_FP, REG, 2, { FL2,FL2, 0 } }, |
{ R_2(0x695), "cmprl", I_FP, REG, 2, { FL2,FL2, 0 } }, |
{ R_2D(0x698), "sqrtrl", I_FP, REG, 2, { FL2,F2, 0 } }, |
{ R_2D(0x699), "exprl", I_FP, REG, 2, { FL2,F2, 0 } }, |
{ R_2D(0x69a), "logbnrl", I_FP, REG, 2, { FL2,F2, 0 } }, |
{ R_2D(0x69b), "roundrl", I_FP, REG, 2, { FL2,F2, 0 } }, |
{ R_2D(0x69c), "sinrl", I_FP, REG, 2, { FL2,F2, 0 } }, |
{ R_2D(0x69d), "cosrl", I_FP, REG, 2, { FL2,F2, 0 } }, |
{ R_2D(0x69e), "tanrl", I_FP, REG, 2, { FL2,F2, 0 } }, |
{ R_1(0x69f), "classrl", I_FP, REG, 1, { FL2, 0, 0 } }, |
{ R_2D(0x6c0), "cvtri", I_FP, REG, 2, { FL, R, 0 } }, |
{ R_2D(0x6c1), "cvtril", I_FP, REG, 2, { FL, R2, 0 } }, |
{ R_2D(0x6c2), "cvtzri", I_FP, REG, 2, { FL, R, 0 } }, |
{ R_2D(0x6c3), "cvtzril", I_FP, REG, 2, { FL, R2, 0 } }, |
{ R_2D(0x6c9), "movr", I_FP, REG, 2, { FL, F, 0 } }, |
{ R_2D(0x6d9), "movrl", I_FP, REG, 2, { FL2,F2, 0 } }, |
{ R_2D(0x6e1), "movre", I_FP, REG, 2, { FL4,F4, 0 } }, |
{ R_3(0x6e2), "cpysre", I_FP, REG, 3, { FL4,FL4,F4 } }, |
{ R_3(0x6e3), "cpyrsre", I_FP, REG, 3, { FL4,FL4,F4 } }, |
{ R_3(0x78b), "divr", I_FP, REG, 3, { FL, FL, F } }, |
{ R_3(0x78c), "mulr", I_FP, REG, 3, { FL, FL, F } }, |
{ R_3(0x78d), "subr", I_FP, REG, 3, { FL, FL, F } }, |
{ R_3(0x78f), "addr", I_FP, REG, 3, { FL, FL, F } }, |
{ R_3(0x79b), "divrl", I_FP, REG, 3, { FL2,FL2,F2 } }, |
{ R_3(0x79c), "mulrl", I_FP, REG, 3, { FL2,FL2,F2 } }, |
{ R_3(0x79d), "subrl", I_FP, REG, 3, { FL2,FL2,F2 } }, |
{ R_3(0x79f), "addrl", I_FP, REG, 3, { FL2,FL2,F2 } }, |
/* These are the floating point branch instructions. Each actually |
* generates 2 branch instructions: the first a CTRL instruction with |
* the indicated opcode, and the second a 'bno'. |
*/ |
{ 0x12000000, "brue", I_FP, FBRA, 1, { 0, 0, 0 } }, |
{ 0x11000000, "brug", I_FP, FBRA, 1, { 0, 0, 0 } }, |
{ 0x13000000, "bruge", I_FP, FBRA, 1, { 0, 0, 0 } }, |
{ 0x14000000, "brul", I_FP, FBRA, 1, { 0, 0, 0 } }, |
{ 0x16000000, "brule", I_FP, FBRA, 1, { 0, 0, 0 } }, |
{ 0x15000000, "brulg", I_FP, FBRA, 1, { 0, 0, 0 } }, |
/* Decimal instructions */ |
{ R_3(0x642), "daddc", I_DEC, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x643), "dsubc", I_DEC, REG, 3, { RSL,RSL,RS } }, |
{ R_2D(0x644), "dmovt", I_DEC, REG, 2, { RSL,RS, 0 } }, |
/* KX extensions */ |
{ R_2(0x600), "synmov", I_KX, REG, 2, { R, R, 0 } }, |
{ R_2(0x601), "synmovl", I_KX, REG, 2, { R, R, 0 } }, |
{ R_2(0x602), "synmovq", I_KX, REG, 2, { R, R, 0 } }, |
{ R_2D(0x615), "synld", I_KX, REG, 2, { R, R, 0 } }, |
/* MC extensions */ |
{ R_3(0x603), "cmpstr", I_MIL, REG, 3, { R, R, RL } }, |
{ R_3(0x604), "movqstr", I_MIL, REG, 3, { R, R, RL } }, |
{ R_3(0x605), "movstr", I_MIL, REG, 3, { R, R, RL } }, |
{ R_2D(0x613), "inspacc", I_MIL, REG, 2, { R, R, 0 } }, |
{ R_2D(0x614), "ldphy", I_MIL, REG, 2, { R, R, 0 } }, |
{ R_3(0x617), "fill", I_MIL, REG, 3, { R, RL, RL } }, |
{ R_2D(0x646), "condrec", I_MIL, REG, 2, { R, R, 0 } }, |
{ R_2D(0x656), "receive", I_MIL, REG, 2, { R, R, 0 } }, |
{ R_3(0x662), "send", I_MIL, REG, 3, { R, RL, R } }, |
{ R_1(0x663), "sendserv", I_MIL, REG, 1, { R, 0, 0 } }, |
{ R_1(0x664), "resumprcs", I_MIL, REG, 1, { R, 0, 0 } }, |
{ R_1(0x665), "schedprcs", I_MIL, REG, 1, { R, 0, 0 } }, |
{ R_0(0x666), "saveprcs", I_MIL, REG, 0, { 0, 0, 0 } }, |
{ R_1(0x668), "condwait", I_MIL, REG, 1, { R, 0, 0 } }, |
{ R_1(0x669), "wait", I_MIL, REG, 1, { R, 0, 0 } }, |
{ R_1(0x66a), "signal", I_MIL, REG, 1, { R, 0, 0 } }, |
{ R_1D(0x673), "ldtime", I_MIL, REG, 1, { R2, 0, 0 } }, |
/* CX extensions */ |
{ R_3(0x5d8), "eshro", I_CX2, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x630), "sdma", I_CX, REG, 3, { RSL,RSL,RL } }, |
{ R_3(0x631), "udma", I_CX, REG, 0, { 0, 0, 0 } }, |
{ R_3(0x659), "sysctl", I_CX2, REG, 3, { RSL,RSL,RL } }, |
/* Jx extensions. */ |
{ R_3(0x780), "addono", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x790), "addog", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x7a0), "addoe", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x7b0), "addoge", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x7c0), "addol", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x7d0), "addone", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x7e0), "addole", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x7f0), "addoo", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x781), "addino", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x791), "addig", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x7a1), "addie", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x7b1), "addige", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x7c1), "addil", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x7d1), "addine", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x7e1), "addile", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x7f1), "addio", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_2D(0x5ad), "bswap", I_JX, REG, 2, { RSL, RS, 0 } }, |
{ R_2(0x594), "cmpob", I_JX, REG, 2, { RSL,RSL, 0 } }, |
{ R_2(0x595), "cmpib", I_JX, REG, 2, { RSL,RSL, 0 } }, |
{ R_2(0x596), "cmpos", I_JX, REG, 2, { RSL,RSL, 0 } }, |
{ R_2(0x597), "cmpis", I_JX, REG, 2, { RSL,RSL, 0 } }, |
{ R_3(0x784), "selno", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x794), "selg", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x7a4), "sele", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x7b4), "selge", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x7c4), "sell", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x7d4), "selne", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x7e4), "selle", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x7f4), "selo", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x782), "subono", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x792), "subog", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x7a2), "suboe", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x7b2), "suboge", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x7c2), "subol", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x7d2), "subone", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x7e2), "subole", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x7f2), "suboo", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x783), "subino", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x793), "subig", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x7a3), "subie", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x7b3), "subige", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x7c3), "subil", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x7d3), "subine", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x7e3), "subile", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x7f3), "subio", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_3(0x65c), "dcctl", I_JX, REG, 3, { RSL,RSL,RL } }, |
{ R_3(0x65b), "icctl", I_JX, REG, 3, { RSL,RSL,RS } }, |
{ R_2D(0x658), "intctl", I_JX, REG, 2, { RSL, RS, 0 } }, |
{ R_0(0x5b4), "intdis", I_JX, REG, 0, { 0, 0, 0 } }, |
{ R_0(0x5b5), "inten", I_JX, REG, 0, { 0, 0, 0 } }, |
{ R_0(0x65d), "halt", I_JX, REG, 1, { RSL, 0, 0 } }, |
/* Hx extensions. */ |
{ 0xac000000, "dcinva", I_HX, MEM1, 1, { M, 0, 0 } }, |
/* END OF TABLE */ |
{ 0, NULL, 0, 0, 0, { 0, 0, 0 } } |
}; |
/* end of i960-opcode.h */ |
/contrib/toolchain/binutils/include/opcode/ia64.h |
---|
0,0 → 1,422 |
/* ia64.h -- Header file for ia64 opcode table |
Copyright (C) 1998, 1999, 2000, 2002, 2005, 2006, 2010 |
Free Software Foundation, Inc. |
Contributed by David Mosberger-Tang <davidm@hpl.hp.com> |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef opcode_ia64_h |
#define opcode_ia64_h |
#include <sys/types.h> |
#include "bfd.h" |
typedef BFD_HOST_U_64_BIT ia64_insn; |
enum ia64_insn_type |
{ |
IA64_TYPE_NIL = 0, /* illegal type */ |
IA64_TYPE_A, /* integer alu (I- or M-unit) */ |
IA64_TYPE_I, /* non-alu integer (I-unit) */ |
IA64_TYPE_M, /* memory (M-unit) */ |
IA64_TYPE_B, /* branch (B-unit) */ |
IA64_TYPE_F, /* floating-point (F-unit) */ |
IA64_TYPE_X, /* long encoding (X-unit) */ |
IA64_TYPE_DYN, /* Dynamic opcode */ |
IA64_NUM_TYPES |
}; |
enum ia64_unit |
{ |
IA64_UNIT_NIL = 0, /* illegal unit */ |
IA64_UNIT_I, /* integer unit */ |
IA64_UNIT_M, /* memory unit */ |
IA64_UNIT_B, /* branching unit */ |
IA64_UNIT_F, /* floating-point unit */ |
IA64_UNIT_L, /* long "unit" */ |
IA64_UNIT_X, /* may be integer or branch unit */ |
IA64_NUM_UNITS |
}; |
/* Changes to this enumeration must be propagated to the operand table in |
bfd/cpu-ia64-opc.c |
*/ |
enum ia64_opnd |
{ |
IA64_OPND_NIL, /* no operand---MUST BE FIRST!*/ |
/* constants */ |
IA64_OPND_AR_CSD, /* application register csd (ar.csd) */ |
IA64_OPND_AR_CCV, /* application register ccv (ar.ccv) */ |
IA64_OPND_AR_PFS, /* application register pfs (ar.pfs) */ |
IA64_OPND_C1, /* the constant 1 */ |
IA64_OPND_C8, /* the constant 8 */ |
IA64_OPND_C16, /* the constant 16 */ |
IA64_OPND_GR0, /* gr0 */ |
IA64_OPND_IP, /* instruction pointer (ip) */ |
IA64_OPND_PR, /* predicate register (pr) */ |
IA64_OPND_PR_ROT, /* rotating predicate register (pr.rot) */ |
IA64_OPND_PSR, /* processor status register (psr) */ |
IA64_OPND_PSR_L, /* processor status register L (psr.l) */ |
IA64_OPND_PSR_UM, /* processor status register UM (psr.um) */ |
/* register operands: */ |
IA64_OPND_AR3, /* third application register # (bits 20-26) */ |
IA64_OPND_B1, /* branch register # (bits 6-8) */ |
IA64_OPND_B2, /* branch register # (bits 13-15) */ |
IA64_OPND_CR3, /* third control register # (bits 20-26) */ |
IA64_OPND_F1, /* first floating-point register # */ |
IA64_OPND_F2, /* second floating-point register # */ |
IA64_OPND_F3, /* third floating-point register # */ |
IA64_OPND_F4, /* fourth floating-point register # */ |
IA64_OPND_P1, /* first predicate # */ |
IA64_OPND_P2, /* second predicate # */ |
IA64_OPND_R1, /* first register # */ |
IA64_OPND_R2, /* second register # */ |
IA64_OPND_R3, /* third register # */ |
IA64_OPND_R3_2, /* third register # (limited to gr0-gr3) */ |
IA64_OPND_DAHR3, /* dahr reg # ( bits 23-25) */ |
/* memory operands: */ |
IA64_OPND_MR3, /* memory at addr of third register # */ |
/* indirect operands: */ |
IA64_OPND_CPUID_R3, /* cpuid[reg] */ |
IA64_OPND_DBR_R3, /* dbr[reg] */ |
IA64_OPND_DTR_R3, /* dtr[reg] */ |
IA64_OPND_ITR_R3, /* itr[reg] */ |
IA64_OPND_IBR_R3, /* ibr[reg] */ |
IA64_OPND_MSR_R3, /* msr[reg] */ |
IA64_OPND_PKR_R3, /* pkr[reg] */ |
IA64_OPND_PMC_R3, /* pmc[reg] */ |
IA64_OPND_PMD_R3, /* pmd[reg] */ |
IA64_OPND_DAHR_R3, /* dahr[reg] */ |
IA64_OPND_RR_R3, /* rr[reg] */ |
/* immediate operands: */ |
IA64_OPND_CCNT5, /* 5-bit count (31 - bits 20-24) */ |
IA64_OPND_CNT2a, /* 2-bit count (1 + bits 27-28) */ |
IA64_OPND_CNT2b, /* 2-bit count (bits 27-28): 1, 2, 3 */ |
IA64_OPND_CNT2c, /* 2-bit count (bits 30-31): 0, 7, 15, or 16 */ |
IA64_OPND_CNT5, /* 5-bit count (bits 14-18) */ |
IA64_OPND_CNT6, /* 6-bit count (bits 27-32) */ |
IA64_OPND_CPOS6a, /* 6-bit count (63 - bits 20-25) */ |
IA64_OPND_CPOS6b, /* 6-bit count (63 - bits 14-19) */ |
IA64_OPND_CPOS6c, /* 6-bit count (63 - bits 31-36) */ |
IA64_OPND_IMM1, /* signed 1-bit immediate (bit 36) */ |
IA64_OPND_IMMU2, /* unsigned 2-bit immediate (bits 13-14) */ |
IA64_OPND_IMMU5b, /* unsigned 5-bit immediate (32 + bits 14-18) */ |
IA64_OPND_IMMU7a, /* unsigned 7-bit immediate (bits 13-19) */ |
IA64_OPND_IMMU7b, /* unsigned 7-bit immediate (bits 20-26) */ |
IA64_OPND_SOF, /* 8-bit stack frame size */ |
IA64_OPND_SOL, /* 8-bit size of locals */ |
IA64_OPND_SOR, /* 6-bit number of rotating registers (scaled by 8) */ |
IA64_OPND_IMM8, /* signed 8-bit immediate (bits 13-19 & 36) */ |
IA64_OPND_IMM8U4, /* cmp4*u signed 8-bit immediate (bits 13-19 & 36) */ |
IA64_OPND_IMM8M1, /* signed 8-bit immediate -1 (bits 13-19 & 36) */ |
IA64_OPND_IMM8M1U4, /* cmp4*u signed 8-bit immediate -1 (bits 13-19 & 36)*/ |
IA64_OPND_IMM8M1U8, /* cmp*u signed 8-bit immediate -1 (bits 13-19 & 36) */ |
IA64_OPND_IMMU9, /* unsigned 9-bit immediate (bits 33-34, 20-26) */ |
IA64_OPND_IMM9a, /* signed 9-bit immediate (bits 6-12, 27, 36) */ |
IA64_OPND_IMM9b, /* signed 9-bit immediate (bits 13-19, 27, 36) */ |
IA64_OPND_IMM14, /* signed 14-bit immediate (bits 13-19, 27-32, 36) */ |
IA64_OPND_IMMU16, /* unsigned 16-bit immediate (bits 6-9, 12-22, 36) */ |
IA64_OPND_IMM17, /* signed 17-bit immediate (2*bits 6-12, 24-31, 36) */ |
IA64_OPND_IMMU19, /* unsigned 19-bit immediate (bits 6-9, 12-25, 36) */ |
IA64_OPND_IMMU21, /* unsigned 21-bit immediate (bits 6-25, 36) */ |
IA64_OPND_IMM22, /* signed 22-bit immediate (bits 13-19, 22-36) */ |
IA64_OPND_IMMU24, /* unsigned 24-bit immediate (bits 6-26, 31-32, 36) */ |
IA64_OPND_IMM44, /* signed 44-bit immediate (2^16*bits 6-32, 36) */ |
IA64_OPND_IMMU62, /* unsigned 62-bit immediate */ |
IA64_OPND_IMMU64, /* unsigned 64-bit immediate (lotsa bits...) */ |
IA64_OPND_INC3, /* signed 3-bit (bits 13-15): +/-1, 4, 8, 16 */ |
IA64_OPND_LEN4, /* 4-bit count (bits 27-30 + 1) */ |
IA64_OPND_LEN6, /* 6-bit count (bits 27-32 + 1) */ |
IA64_OPND_MBTYPE4, /* 4-bit mux type (bits 20-23) */ |
IA64_OPND_MHTYPE8, /* 8-bit mux type (bits 20-27) */ |
IA64_OPND_POS6, /* 6-bit count (bits 14-19) */ |
IA64_OPND_TAG13, /* signed 13-bit tag (ip + 16*bits 6-12, 33-34) */ |
IA64_OPND_TAG13b, /* signed 13-bit tag (ip + 16*bits 24-32) */ |
IA64_OPND_TGT25, /* signed 25-bit (ip + 16*bits 6-25, 36) */ |
IA64_OPND_TGT25b, /* signed 25-bit (ip + 16*bits 6-12, 20-32, 36) */ |
IA64_OPND_TGT25c, /* signed 25-bit (ip + 16*bits 13-32, 36) */ |
IA64_OPND_TGT64, /* 64-bit (ip + 16*bits 13-32, 36, 2-40(L)) */ |
IA64_OPND_LDXMOV, /* any symbol, generates R_IA64_LDXMOV. */ |
IA64_OPND_CNT6a, /* 6-bit count (bits 6-11) */ |
IA64_OPND_STRD5b, /* 5-bit stride (bits 13-17) */ |
IA64_OPND_COUNT /* # of operand types (MUST BE LAST!) */ |
}; |
enum ia64_dependency_mode |
{ |
IA64_DV_RAW, |
IA64_DV_WAW, |
IA64_DV_WAR, |
}; |
enum ia64_dependency_semantics |
{ |
IA64_DVS_NONE, |
IA64_DVS_IMPLIED, |
IA64_DVS_IMPLIEDF, |
IA64_DVS_DATA, |
IA64_DVS_INSTR, |
IA64_DVS_SPECIFIC, |
IA64_DVS_STOP, |
IA64_DVS_OTHER, |
}; |
enum ia64_resource_specifier |
{ |
IA64_RS_ANY, |
IA64_RS_AR_K, |
IA64_RS_AR_UNAT, |
IA64_RS_AR, /* 8-15, 20, 22-23, 31, 33-35, 37-39, 41-43, 45-47, 67-111 */ |
IA64_RS_ARb, /* 48-63, 112-127 */ |
IA64_RS_BR, |
IA64_RS_CFM, |
IA64_RS_CPUID, |
IA64_RS_CR_IIB, |
IA64_RS_CR_IRR, |
IA64_RS_CR_LRR, |
IA64_RS_CR, /* 3-7,10-15,18,28-63,75-79,82-127 */ |
IA64_RS_DAHR, |
IA64_RS_DBR, |
IA64_RS_FR, |
IA64_RS_FRb, |
IA64_RS_GR0, |
IA64_RS_GR, |
IA64_RS_IBR, |
IA64_RS_INSERVICE, /* CR[EOI] or CR[IVR] */ |
IA64_RS_MSR, |
IA64_RS_PKR, |
IA64_RS_PMC, |
IA64_RS_PMD, |
IA64_RS_PR, /* non-rotating, 1-15 */ |
IA64_RS_PRr, /* rotating, 16-62 */ |
IA64_RS_PR63, |
IA64_RS_RR, |
IA64_RS_ARX, /* ARs not in RS_AR or RS_ARb */ |
IA64_RS_CRX, /* CRs not in RS_CR */ |
IA64_RS_PSR, /* PSR bits */ |
IA64_RS_RSE, /* implementation-specific RSE resources */ |
IA64_RS_AR_FPSR, |
}; |
enum ia64_rse_resource |
{ |
IA64_RSE_N_STACKED_PHYS, |
IA64_RSE_BOF, |
IA64_RSE_STORE_REG, |
IA64_RSE_LOAD_REG, |
IA64_RSE_BSPLOAD, |
IA64_RSE_RNATBITINDEX, |
IA64_RSE_CFLE, |
IA64_RSE_NDIRTY, |
}; |
/* Information about a given resource dependency */ |
struct ia64_dependency |
{ |
/* Name of the resource */ |
const char *name; |
/* Does this dependency need further specification? */ |
enum ia64_resource_specifier specifier; |
/* Mode of dependency */ |
enum ia64_dependency_mode mode; |
/* Dependency semantics */ |
enum ia64_dependency_semantics semantics; |
/* Register index, if applicable (distinguishes AR, CR, and PSR deps) */ |
#define REG_NONE (-1) |
int regindex; |
/* Special info on semantics */ |
const char *info; |
}; |
/* Two arrays of indexes into the ia64_dependency table. |
chks are dependencies to check for conflicts when an opcode is |
encountered; regs are dependencies to register (mark as used) when an |
opcode is used. chks correspond to readers (RAW) or writers (WAW or |
WAR) of a resource, while regs correspond to writers (RAW or WAW) and |
readers (WAR) of a resource. */ |
struct ia64_opcode_dependency |
{ |
int nchks; |
const unsigned short *chks; |
int nregs; |
const unsigned short *regs; |
}; |
/* encode/extract the note/index for a dependency */ |
#define RDEP(N,X) (((N)<<11)|(X)) |
#define NOTE(X) (((X)>>11)&0x1F) |
#define DEP(X) ((X)&0x7FF) |
/* A template descriptor describes the execution units that are active |
for each of the three slots. It also specifies the location of |
instruction group boundaries that may be present between two slots. */ |
struct ia64_templ_desc |
{ |
int group_boundary; /* 0=no boundary, 1=between slot 0 & 1, etc. */ |
enum ia64_unit exec_unit[3]; |
const char *name; |
}; |
/* The opcode table is an array of struct ia64_opcode. */ |
struct ia64_opcode |
{ |
/* The opcode name. */ |
const char *name; |
/* The type of the instruction: */ |
enum ia64_insn_type type; |
/* Number of output operands: */ |
int num_outputs; |
/* The opcode itself. Those bits which will be filled in with |
operands are zeroes. */ |
ia64_insn opcode; |
/* The opcode mask. This is used by the disassembler. This is a |
mask containing ones indicating those bits which must match the |
opcode field, and zeroes indicating those bits which need not |
match (and are presumably filled in by operands). */ |
ia64_insn mask; |
/* An array of operand codes. Each code is an index into the |
operand table. They appear in the order which the operands must |
appear in assembly code, and are terminated by a zero. */ |
enum ia64_opnd operands[5]; |
/* One bit flags for the opcode. These are primarily used to |
indicate specific processors and environments support the |
instructions. The defined values are listed below. */ |
unsigned int flags; |
/* Used by ia64_find_next_opcode (). */ |
short ent_index; |
/* Opcode dependencies. */ |
const struct ia64_opcode_dependency *dependencies; |
}; |
/* Values defined for the flags field of a struct ia64_opcode. */ |
#define IA64_OPCODE_FIRST (1<<0) /* must be first in an insn group */ |
#define IA64_OPCODE_X_IN_MLX (1<<1) /* insn is allowed in X slot of MLX */ |
#define IA64_OPCODE_LAST (1<<2) /* must be last in an insn group */ |
#define IA64_OPCODE_PRIV (1<<3) /* privileged instruct */ |
#define IA64_OPCODE_SLOT2 (1<<4) /* insn allowed in slot 2 only */ |
#define IA64_OPCODE_NO_PRED (1<<5) /* insn cannot be predicated */ |
#define IA64_OPCODE_PSEUDO (1<<6) /* insn is a pseudo-op */ |
#define IA64_OPCODE_F2_EQ_F3 (1<<7) /* constraint: F2 == F3 */ |
#define IA64_OPCODE_LEN_EQ_64MCNT (1<<8) /* constraint: LEN == 64-CNT */ |
#define IA64_OPCODE_MOD_RRBS (1<<9) /* modifies all rrbs in CFM */ |
#define IA64_OPCODE_POSTINC (1<<10) /* postincrement MR3 operand */ |
/* A macro to extract the major opcode from an instruction. */ |
#define IA64_OP(i) (((i) >> 37) & 0xf) |
enum ia64_operand_class |
{ |
IA64_OPND_CLASS_CST, /* constant */ |
IA64_OPND_CLASS_REG, /* register */ |
IA64_OPND_CLASS_IND, /* indirect register */ |
IA64_OPND_CLASS_ABS, /* absolute value */ |
IA64_OPND_CLASS_REL, /* IP-relative value */ |
}; |
/* The operands table is an array of struct ia64_operand. */ |
struct ia64_operand |
{ |
enum ia64_operand_class op_class; |
/* Set VALUE as the operand bits for the operand of type SELF in the |
instruction pointed to by CODE. If an error occurs, *CODE is not |
modified and the returned string describes the cause of the |
error. If no error occurs, NULL is returned. */ |
const char *(*insert) (const struct ia64_operand *self, ia64_insn value, |
ia64_insn *code); |
/* Extract the operand bits for an operand of type SELF from |
instruction CODE store them in *VALUE. If an error occurs, the |
cause of the error is described by the string returned. If no |
error occurs, NULL is returned. */ |
const char *(*extract) (const struct ia64_operand *self, ia64_insn code, |
ia64_insn *value); |
/* A string whose meaning depends on the operand class. */ |
const char *str; |
struct bit_field |
{ |
/* The number of bits in the operand. */ |
int bits; |
/* How far the operand is left shifted in the instruction. */ |
int shift; |
} |
field[4]; /* no operand has more than this many bit-fields */ |
unsigned int flags; |
const char *desc; /* brief description */ |
}; |
/* Values defined for the flags field of a struct ia64_operand. */ |
/* Disassemble as signed decimal (instead of hex): */ |
#define IA64_OPND_FLAG_DECIMAL_SIGNED (1<<0) |
/* Disassemble as unsigned decimal (instead of hex): */ |
#define IA64_OPND_FLAG_DECIMAL_UNSIGNED (1<<1) |
extern const struct ia64_templ_desc ia64_templ_desc[16]; |
/* The tables are sorted by major opcode number and are otherwise in |
the order in which the disassembler should consider instructions. */ |
extern struct ia64_opcode ia64_opcodes_a[]; |
extern struct ia64_opcode ia64_opcodes_i[]; |
extern struct ia64_opcode ia64_opcodes_m[]; |
extern struct ia64_opcode ia64_opcodes_b[]; |
extern struct ia64_opcode ia64_opcodes_f[]; |
extern struct ia64_opcode ia64_opcodes_d[]; |
extern struct ia64_opcode *ia64_find_opcode (const char *); |
extern struct ia64_opcode *ia64_find_next_opcode (struct ia64_opcode *); |
extern struct ia64_opcode *ia64_dis_opcode (ia64_insn, |
enum ia64_insn_type); |
extern void ia64_free_opcode (struct ia64_opcode *); |
extern const struct ia64_dependency *ia64_find_dependency (int); |
/* To avoid circular library dependencies, this array is implemented |
in bfd/cpu-ia64-opc.c: */ |
extern const struct ia64_operand elf64_ia64_operands[IA64_OPND_COUNT]; |
#endif /* opcode_ia64_h */ |
/contrib/toolchain/binutils/include/opcode/m68hc11.h |
---|
0,0 → 1,456 |
/* m68hc11.h -- Header file for Motorola 68HC11 & 68HC12 opcode table |
Copyright 1999, 2000, 2002, 2003, 2010, 2012 |
Free Software Foundation, Inc. |
Written by Stephane Carrez (stcarrez@nerim.fr) |
This file is part of GDB, GAS, and the GNU binutils. |
GDB, GAS, and the GNU binutils are free software; you can redistribute |
them and/or modify them under the terms of the GNU General Public |
License as published by the Free Software Foundation; either version 3, |
or (at your option) any later version. |
GDB, GAS, and the GNU binutils are distributed in the hope that they |
will be useful, but WITHOUT ANY WARRANTY; without even the implied |
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See |
the GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this file; see the file COPYING3. If not, write to the Free |
Software Foundation, 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _OPCODE_M68HC11_H |
#define _OPCODE_M68HC11_H |
/* Flags for the definition of the 68HC11 & 68HC12 CCR. */ |
#define M6811_S_BIT 0x80 /* Stop disable */ |
#define M6811_X_BIT 0x40 /* X-interrupt mask */ |
#define M6811_H_BIT 0x20 /* Half carry flag */ |
#define M6811_I_BIT 0x10 /* I-interrupt mask */ |
#define M6811_N_BIT 0x08 /* Negative */ |
#define M6811_Z_BIT 0x04 /* Zero */ |
#define M6811_V_BIT 0x02 /* Overflow */ |
#define M6811_C_BIT 0x01 /* Carry */ |
/* 68HC11 register address offsets (range 0..0x3F or 0..64). |
The absolute address of the I/O register depends on the setting |
of the M6811_INIT register. At init time, the I/O registers are |
mapped at 0x1000. Address of registers is then: |
0x1000 + M6811_xxx. */ |
#define M6811_PORTA 0x00 /* Port A register */ |
#define M6811__RES1 0x01 /* Unused/Reserved */ |
#define M6811_PIOC 0x02 /* Parallel I/O Control register */ |
#define M6811_PORTC 0x03 /* Port C register */ |
#define M6811_PORTB 0x04 /* Port B register */ |
#define M6811_PORTCL 0x05 /* Alternate latched port C */ |
#define M6811__RES6 0x06 /* Unused/Reserved */ |
#define M6811_DDRC 0x07 /* Data direction register for port C */ |
#define M6811_PORTD 0x08 /* Port D register */ |
#define M6811_DDRD 0x09 /* Data direction register for port D */ |
#define M6811_PORTE 0x0A /* Port E input register */ |
#define M6811_CFORC 0x0B /* Compare Force Register */ |
#define M6811_OC1M 0x0C /* OC1 Action Mask register */ |
#define M6811_OC1D 0x0D /* OC1 Action Data register */ |
#define M6811_TCTN 0x0E /* Timer Counter Register */ |
#define M6811_TCTN_H 0x0E /* " " " High part */ |
#define M6811_TCTN_L 0x0F /* " " " Low part */ |
#define M6811_TIC1 0x10 /* Input capture 1 register */ |
#define M6811_TIC1_H 0x10 /* " " " High part */ |
#define M6811_TIC1_L 0x11 /* " " " Low part */ |
#define M6811_TIC2 0x12 /* Input capture 2 register */ |
#define M6811_TIC2_H 0x12 /* " " " High part */ |
#define M6811_TIC2_L 0x13 /* " " " Low part */ |
#define M6811_TIC3 0x14 /* Input capture 3 register */ |
#define M6811_TIC3_H 0x14 /* " " " High part */ |
#define M6811_TIC3_L 0x15 /* " " " Low part */ |
#define M6811_TOC1 0x16 /* Output Compare 1 register */ |
#define M6811_TOC1_H 0x16 /* " " " High part */ |
#define M6811_TOC1_L 0x17 /* " " " Low part */ |
#define M6811_TOC2 0x18 /* Output Compare 2 register */ |
#define M6811_TOC2_H 0x18 /* " " " High part */ |
#define M6811_TOC2_L 0x19 /* " " " Low part */ |
#define M6811_TOC3 0x1A /* Output Compare 3 register */ |
#define M6811_TOC3_H 0x1A /* " " " High part */ |
#define M6811_TOC3_L 0x1B /* " " " Low part */ |
#define M6811_TOC4 0x1C /* Output Compare 4 register */ |
#define M6811_TOC4_H 0x1C /* " " " High part */ |
#define M6811_TOC4_L 0x1D /* " " " Low part */ |
#define M6811_TOC5 0x1E /* Output Compare 5 register */ |
#define M6811_TOC5_H 0x1E /* " " " High part */ |
#define M6811_TOC5_L 0x1F /* " " " Low part */ |
#define M6811_TCTL1 0x20 /* Timer Control register 1 */ |
#define M6811_TCTL2 0x21 /* Timer Control register 2 */ |
#define M6811_TMSK1 0x22 /* Timer Interrupt Mask Register 1 */ |
#define M6811_TFLG1 0x23 /* Timer Interrupt Flag Register 1 */ |
#define M6811_TMSK2 0x24 /* Timer Interrupt Mask Register 2 */ |
#define M6811_TFLG2 0x25 /* Timer Interrupt Flag Register 2 */ |
#define M6811_PACTL 0x26 /* Pulse Accumulator Control Register */ |
#define M6811_PACNT 0x27 /* Pulse Accumulator Count Register */ |
#define M6811_SPCR 0x28 /* SPI Control register */ |
#define M6811_SPSR 0x29 /* SPI Status register */ |
#define M6811_SPDR 0x2A /* SPI Data register */ |
#define M6811_BAUD 0x2B /* SCI Baud register */ |
#define M6811_SCCR1 0x2C /* SCI Control register 1 */ |
#define M6811_SCCR2 0x2D /* SCI Control register 2 */ |
#define M6811_SCSR 0x2E /* SCI Status register */ |
#define M6811_SCDR 0x2F /* SCI Data (Read => RDR, Write => TDR) */ |
#define M6811_ADCTL 0x30 /* A/D Control register */ |
#define M6811_ADR1 0x31 /* A/D, Analog Result register 1 */ |
#define M6811_ADR2 0x32 /* A/D, Analog Result register 2 */ |
#define M6811_ADR3 0x33 /* A/D, Analog Result register 3 */ |
#define M6811_ADR4 0x34 /* A/D, Analog Result register 4 */ |
#define M6811__RES35 0x35 |
#define M6811__RES36 0x36 |
#define M6811__RES37 0x37 |
#define M6811__RES38 0x38 |
#define M6811_OPTION 0x39 /* System Configuration Options */ |
#define M6811_COPRST 0x3A /* Arm/Reset COP Timer Circuitry */ |
#define M6811_PPROG 0x3B /* EEPROM Programming Control Register */ |
#define M6811_HPRIO 0x3C /* Highest priority I-Bit int and misc */ |
#define M6811_INIT 0x3D /* Ram and I/O mapping register */ |
#define M6811_TEST1 0x3E /* Factory test control register */ |
#define M6811_CONFIG 0x3F /* COP, ROM and EEPROM enables */ |
/* Flags of the CONFIG register (in EEPROM). */ |
#define M6811_NOSEC 0x08 /* Security mode disable */ |
#define M6811_NOCOP 0x04 /* COP system disable */ |
#define M6811_ROMON 0x02 /* Enable on-chip rom */ |
#define M6811_EEON 0x01 /* Enable on-chip eeprom */ |
/* Flags of the PPROG register. */ |
#define M6811_BYTE 0x10 /* Byte mode */ |
#define M6811_ROW 0x08 /* Row mode */ |
#define M6811_ERASE 0x04 /* Erase mode select (1 = erase, 0 = read) */ |
#define M6811_EELAT 0x02 /* EEPROM Latch Control */ |
#define M6811_EEPGM 0x01 /* EEPROM Programming Voltage Enable */ |
/* Flags of the PIOC register. */ |
#define M6811_STAF 0x80 /* Strobe A Interrupt Status Flag */ |
#define M6811_STAI 0x40 /* Strobe A Interrupt Enable Mask */ |
#define M6811_CWOM 0x20 /* Port C Wire OR mode */ |
#define M6811_HNDS 0x10 /* Handshake mode */ |
#define M6811_OIN 0x08 /* Output or Input handshaking */ |
#define M6811_PLS 0x04 /* Pulse/Interlocked Handshake Operation */ |
#define M6811_EGA 0x02 /* Active Edge for Strobe A */ |
#define M6811_INVB 0x01 /* Invert Strobe B */ |
/* Flags of the SCCR1 register. */ |
#define M6811_R8 0x80 /* Receive Data bit 8 */ |
#define M6811_T8 0x40 /* Transmit data bit 8 */ |
#define M6811__SCCR1_5 0x20 /* Unused */ |
#define M6811_M 0x10 /* SCI Character length */ |
#define M6811_WAKE 0x08 /* Wake up method select (0=idle, 1=addr mark) */ |
/* Flags of the SCCR2 register. */ |
#define M6811_TIE 0x80 /* Transmit Interrupt enable */ |
#define M6811_TCIE 0x40 /* Transmit Complete Interrupt Enable */ |
#define M6811_RIE 0x20 /* Receive Interrupt Enable */ |
#define M6811_ILIE 0x10 /* Idle Line Interrupt Enable */ |
#define M6811_TE 0x08 /* Transmit Enable */ |
#define M6811_RE 0x04 /* Receive Enable */ |
#define M6811_RWU 0x02 /* Receiver Wake Up */ |
#define M6811_SBK 0x01 /* Send Break */ |
/* Flags of the SCSR register. */ |
#define M6811_TDRE 0x80 /* Transmit Data Register Empty */ |
#define M6811_TC 0x40 /* Transmit Complete */ |
#define M6811_RDRF 0x20 /* Receive Data Register Full */ |
#define M6811_IDLE 0x10 /* Idle Line Detect */ |
#define M6811_OR 0x08 /* Overrun Error */ |
#define M6811_NF 0x04 /* Noise Flag */ |
#define M6811_FE 0x02 /* Framing Error */ |
#define M6811__SCSR_0 0x01 /* Unused */ |
/* Flags of the BAUD register. */ |
#define M6811_TCLR 0x80 /* Clear Baud Rate (TEST mode) */ |
#define M6811__BAUD_6 0x40 /* Not used */ |
#define M6811_SCP1 0x20 /* SCI Baud rate prescaler select */ |
#define M6811_SCP0 0x10 |
#define M6811_RCKB 0x08 /* Baud Rate Clock Check (TEST mode) */ |
#define M6811_SCR2 0x04 /* SCI Baud rate select */ |
#define M6811_SCR1 0x02 |
#define M6811_SCR0 0x01 |
#define M6811_BAUD_DIV_1 (0) |
#define M6811_BAUD_DIV_3 (M6811_SCP0) |
#define M6811_BAUD_DIV_4 (M6811_SCP1) |
#define M6811_BAUD_DIV_13 (M6811_SCP1|M6811_SCP0) |
/* Flags of the SPCR register. */ |
#define M6811_SPIE 0x80 /* Serial Peripheral Interrupt Enable */ |
#define M6811_SPE 0x40 /* Serial Peripheral System Enable */ |
#define M6811_DWOM 0x20 /* Port D Wire-OR mode option */ |
#define M6811_MSTR 0x10 /* Master Mode Select */ |
#define M6811_CPOL 0x08 /* Clock Polarity */ |
#define M6811_CPHA 0x04 /* Clock Phase */ |
#define M6811_SPR1 0x02 /* SPI Clock Rate Select */ |
#define M6811_SPR0 0x01 |
/* Flags of the SPSR register. */ |
#define M6811_SPIF 0x80 /* SPI Transfer Complete flag */ |
#define M6811_WCOL 0x40 /* Write Collision */ |
#define M6811_MODF 0x10 /* Mode Fault */ |
/* Flags of the ADCTL register. */ |
#define M6811_CCF 0x80 /* Conversions Complete Flag */ |
#define M6811_SCAN 0x20 /* Continuous Scan Control */ |
#define M6811_MULT 0x10 /* Multiple Channel/Single Channel Control */ |
#define M6811_CD 0x08 /* Channel Select D */ |
#define M6811_CC 0x04 /* C */ |
#define M6811_CB 0x02 /* B */ |
#define M6811_CA 0x01 /* A */ |
/* Flags of the CFORC register. */ |
#define M6811_FOC1 0x80 /* Force Output Compare 1 */ |
#define M6811_FOC2 0x40 /* 2 */ |
#define M6811_FOC3 0x20 /* 3 */ |
#define M6811_FOC4 0x10 /* 4 */ |
#define M6811_FOC5 0x08 /* 5 */ |
/* Flags of the OC1M register. */ |
#define M6811_OC1M7 0x80 /* Output Compare 7 */ |
#define M6811_OC1M6 0x40 /* 6 */ |
#define M6811_OC1M5 0x20 /* 5 */ |
#define M6811_OC1M4 0x10 /* 4 */ |
#define M6811_OC1M3 0x08 /* 3 */ |
/* Flags of the OC1D register. */ |
#define M6811_OC1D7 0x80 |
#define M6811_OC1D6 0x40 |
#define M6811_OC1D5 0x20 |
#define M6811_OC1D4 0x10 |
#define M6811_OC1D3 0x08 |
/* Flags of the TCTL1 register. */ |
#define M6811_OM2 0x80 /* Output Mode 2 */ |
#define M6811_OL2 0x40 /* Output Level 2 */ |
#define M6811_OM3 0x20 |
#define M6811_OL3 0x10 |
#define M6811_OM4 0x08 |
#define M6811_OL4 0x04 |
#define M6811_OM5 0x02 |
#define M6811_OL5 0x01 |
/* Flags of the TCTL2 register. */ |
#define M6811_EDG1B 0x20 /* Input Edge Capture Control 1 */ |
#define M6811_EDG1A 0x10 |
#define M6811_EDG2B 0x08 /* Input 2 */ |
#define M6811_EDG2A 0x04 |
#define M6811_EDG3B 0x02 /* Input 3 */ |
#define M6811_EDG3A 0x01 |
/* Flags of the TMSK1 register. */ |
#define M6811_OC1I 0x80 /* Output Compare 1 Interrupt */ |
#define M6811_OC2I 0x40 /* 2 */ |
#define M6811_OC3I 0x20 /* 3 */ |
#define M6811_OC4I 0x10 /* 4 */ |
#define M6811_OC5I 0x08 /* 5 */ |
#define M6811_IC1I 0x04 /* Input Capture 1 Interrupt */ |
#define M6811_IC2I 0x02 /* 2 */ |
#define M6811_IC3I 0x01 /* 3 */ |
/* Flags of the TFLG1 register. */ |
#define M6811_OC1F 0x80 /* Output Compare 1 Flag */ |
#define M6811_OC2F 0x40 /* 2 */ |
#define M6811_OC3F 0x20 /* 3 */ |
#define M6811_OC4F 0x10 /* 4 */ |
#define M6811_OC5F 0x08 /* 5 */ |
#define M6811_IC1F 0x04 /* Input Capture 1 Flag */ |
#define M6811_IC2F 0x02 /* 2 */ |
#define M6811_IC3F 0x01 /* 3 */ |
/* Flags of Timer Interrupt Mask Register 2 (TMSK2). */ |
#define M6811_TOI 0x80 /* Timer Overflow Interrupt Enable */ |
#define M6811_RTII 0x40 /* RTI Interrupt Enable */ |
#define M6811_PAOVI 0x20 /* Pulse Accumulator Overflow Interrupt En. */ |
#define M6811_PAII 0x10 /* Pulse Accumulator Interrupt Enable */ |
#define M6811_PR1 0x02 /* Timer prescaler */ |
#define M6811_PR0 0x01 /* Timer prescaler */ |
#define M6811_TPR_1 0x00 /* " " prescale div 1 */ |
#define M6811_TPR_4 0x01 /* " " prescale div 4 */ |
#define M6811_TPR_8 0x02 /* " " prescale div 8 */ |
#define M6811_TPR_16 0x03 /* " " prescale div 16 */ |
/* Flags of Timer Interrupt Flag Register 2 (M6811_TFLG2). */ |
#define M6811_TOF 0x80 /* Timer overflow bit */ |
#define M6811_RTIF 0x40 /* Read time interrupt flag */ |
#define M6811_PAOVF 0x20 /* Pulse accumulator overflow Interrupt flag */ |
#define M6811_PAIF 0x10 /* Pulse accumulator Input Edge " " " */ |
/* Flags of Pulse Accumulator Control Register (PACTL). */ |
#define M6811_DDRA7 0x80 /* Data direction for port A bit 7 */ |
#define M6811_PAEN 0x40 /* Pulse accumulator system enable */ |
#define M6811_PAMOD 0x20 /* Pulse accumulator mode */ |
#define M6811_PEDGE 0x10 /* Pulse accumulator edge control */ |
#define M6811_RTR1 0x02 /* RTI Interrupt rates select */ |
#define M6811_RTR0 0x01 /* " " " " */ |
/* Flags of the Options register. */ |
#define M6811_ADPU 0x80 /* A/D Powerup */ |
#define M6811_CSEL 0x40 /* A/D/EE Charge pump clock source select */ |
#define M6811_IRQE 0x20 /* IRQ Edge/Level sensitive */ |
#define M6811_DLY 0x10 /* Stop exit turn on delay */ |
#define M6811_CME 0x08 /* Clock Monitor enable */ |
#define M6811_CR1 0x02 /* COP timer rate select */ |
#define M6811_CR0 0x01 /* COP timer rate select */ |
/* Flags of the HPRIO register. */ |
#define M6811_RBOOT 0x80 /* Read Bootstrap ROM */ |
#define M6811_SMOD 0x40 /* Special Mode */ |
#define M6811_MDA 0x20 /* Mode Select A */ |
#define M6811_IRV 0x10 /* Internal Read Visibility */ |
#define M6811_PSEL3 0x08 /* Priority Select */ |
#define M6811_PSEL2 0x04 |
#define M6811_PSEL1 0x02 |
#define M6811_PSEL0 0x01 |
/* Some insns used by gas to turn relative branches into absolute ones. */ |
#define M6811_BRA 0x20 |
#define M6811_JMP 0x7e |
#define M6811_BSR 0x8d |
#define M6811_JSR 0xbd |
#define M6812_JMP 0x06 |
#define M6812_BSR 0x07 |
#define M6812_JSR 0x16 |
/* Instruction code pages. Code page 1 is the default. */ |
/*#define M6811_OPCODE_PAGE1 0x00*/ |
#define M6811_OPCODE_PAGE2 0x18 |
#define M6811_OPCODE_PAGE3 0x1A |
#define M6811_OPCODE_PAGE4 0xCD |
/* 68HC11 operands formats as stored in the m6811_opcode table. These |
flags do not correspond to anything in the 68HC11 or 68HC12. |
They are only used by GAS to recognize operands. */ |
#define M6811_OP_NONE 0 /* No operand */ |
#define M6811_OP_DIRECT 0x0001 /* Page 0 addressing: *<val-8bits> */ |
#define M6811_OP_IMM8 0x0002 /* 8 bits immediat: #<val-8bits> */ |
#define M6811_OP_IMM16 0x0004 /* 16 bits immediat: #<val-16bits> */ |
#define M6811_OP_IND16 0x0008 /* Indirect abs: <val-16> */ |
#define M6812_OP_IND16_P2 0x0010 /* Second parameter indirect abs. */ |
#define M6812_OP_REG 0x0020 /* Register operand 1 */ |
#define M6812_OP_REG_2 0x0040 /* Register operand 2 */ |
#define M6811_OP_IX 0x0080 /* Indirect IX: <val-8>,x */ |
#define M6811_OP_IY 0x0100 /* Indirect IY: <val-8>,y */ |
#define M6812_OP_IDX 0x0200 /* Indirect: N,r N,[+-]r[+-] N:5-bits */ |
#define M6812_OP_IDX_1 0x0400 /* N,r N:9-bits */ |
#define M6812_OP_IDX_2 0x0800 /* N,r N:16-bits */ |
#define M6812_OP_D_IDX 0x1000 /* Indirect indexed: [D,r] */ |
#define M6812_OP_D_IDX_2 0x2000 /* [N,r] N:16-bits */ |
#define M6812_OP_PAGE 0x4000 /* Page number */ |
#define M6811_OP_MASK 0x07FFF |
#define M6811_OP_BRANCH 0x00008000 /* Branch, jsr, call */ |
#define M6811_OP_BITMASK 0x00010000 /* Bitmask: #<val-8> */ |
#define M6811_OP_JUMP_REL 0x00020000 /* Pc-Relative: <val-8> */ |
#define M6812_OP_JUMP_REL16 0x00040000 /* Pc-relative: <val-16> */ |
#define M6811_OP_PAGE1 0x0000 |
#define M6811_OP_PAGE2 0x00080000 /* Need a page2 opcode before */ |
#define M6811_OP_PAGE3 0x00100000 /* Need a page3 opcode before */ |
#define M6811_OP_PAGE4 0x00200000 /* Need a page4 opcode before */ |
#define M6811_MAX_OPERANDS 3 /* Max operands: brset <dst> <mask> <b> */ |
#define M6812_ACC_OFFSET 0x00400000 /* A,r B,r D,r */ |
#define M6812_ACC_IND 0x00800000 /* [D,r] */ |
#define M6812_PRE_INC 0x01000000 /* n,+r n = -8..8 */ |
#define M6812_PRE_DEC 0x02000000 /* n,-r */ |
#define M6812_POST_INC 0x04000000 /* n,r+ */ |
#define M6812_POST_DEC 0x08000000 /* n,r- */ |
#define M6812_INDEXED_IND 0x10000000 /* [n,r] n = 16-bits */ |
#define M6812_INDEXED 0x20000000 /* n,r n = 5, 9 or 16-bits */ |
#define M6812_OP_IDX_P2 0x40000000 |
/* XGATE defines. |
These overlap with HC11/12 as above but not used at the same time. */ |
#define M68XG_OP_NONE 0x0001 |
#define M68XG_OP_IMM3 0x0002 |
#define M68XG_OP_R 0x0004 |
#define M68XG_OP_R_R 0x0008 |
#define M68XG_OP_R_IMM4 0x0010 |
#define M68XG_OP_R_R_R 0x0020 |
#define M68XG_OP_REL9 0x0040 |
#define M68XG_OP_REL10 0x0080 |
#define M68XG_OP_R_R_OFFS5 0x0100 |
#define M68XG_OP_RD_RB_RI 0x0200 |
#define M68XG_OP_RD_RB_RIp 0x0400 |
#define M68XG_OP_RD_RB_mRI 0x0800 |
#define M68XG_OP_R_IMM8 0x1000 |
#define M68XG_OP_R_IMM16 0x2000 |
#define M68XG_OP_REG 0x4000 /* Register operand 1. */ |
#define M68XG_OP_REG_2 0x8000 /* Register operand 2. */ |
#define M68XG_MAX_OPERANDS 3 /* Max operands of triadic r1, r2, r3. */ |
/* Markers to identify some instructions. */ |
#define M6812_OP_EXG_MARKER 0x01000000 /* exg r1,r2 */ |
#define M6812_OP_TFR_MARKER 0x02000000 /* tfr r1,r2 */ |
#define M6812_OP_SEX_MARKER 0x04000000 /* sex r1,r2 */ |
#define M6812_OP_EQ_MARKER 0x80000000 /* dbeq/ibeq/tbeq */ |
#define M6812_OP_DBCC_MARKER 0x04000000 /* dbeq/dbne */ |
#define M6812_OP_IBCC_MARKER 0x02000000 /* ibeq/ibne */ |
#define M6812_OP_TBCC_MARKER 0x01000000 |
/* XGATE markers. */ |
#define M68XG_OP_B_MARKER 0x04000000 /* bXX rel9 */ |
#define M68XG_OP_BRA_MARKER 0x02000000 /* bra rel10 */ |
#define M6812_OP_TRAP_ID 0x80000000 /* trap #N */ |
#define M6811_OP_HIGH_ADDR 0x01000000 /* Used internally by gas. */ |
#define M6811_OP_LOW_ADDR 0x02000000 |
#define M68HC12_BANK_VIRT 0x010000 |
#define M68HC12_BANK_MASK 0x00003fff |
#define M68HC12_BANK_BASE 0x00008000 |
#define M68HC12_BANK_SHIFT 14 |
#define M68HC12_BANK_PAGE_MASK 0x0ff |
/* CPU identification. */ |
#define cpu6811 0x01 |
#define cpu6812 0x02 |
#define cpu6812s 0x04 |
#define cpu9s12x 0x08 /* 9S12X main cpu. */ |
#define cpuxgate 0x10 /* The XGATE module itself. */ |
/* The opcode table is an array of struct m68hc11_opcode. */ |
struct m68hc11_opcode |
{ |
const char * name; /* Op-code name. */ |
long format; |
unsigned char size; |
unsigned int opcode; |
unsigned char cycles_low; |
unsigned char cycles_high; |
unsigned char set_flags_mask; |
unsigned char clr_flags_mask; |
unsigned char chg_flags_mask; |
unsigned char arch; |
unsigned int xg_mask; /* Mask with zero in register place for xgate. */ |
}; |
/* Alias definition for 68HC12. */ |
struct m68hc12_opcode_alias |
{ |
const char* name; |
const char* translation; |
unsigned char size; |
unsigned char code1; |
unsigned char code2; |
}; |
/* The opcode table. The table contains all the opcodes (all pages). |
You can't rely on the order. */ |
extern const struct m68hc11_opcode m68hc11_opcodes[]; |
extern const int m68hc11_num_opcodes; |
/* Alias table for 68HC12. It translates some 68HC11 insn which are not |
implemented in 68HC12 but have equivalent translations. */ |
extern const struct m68hc12_opcode_alias m68hc12_alias[]; |
extern const int m68hc12_num_alias; |
#endif /* _OPCODE_M68HC11_H */ |
/contrib/toolchain/binutils/include/opcode/m68k.h |
---|
0,0 → 1,378 |
/* Opcode table header for m680[01234]0/m6888[12]/m68851. |
Copyright 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2001, |
2003, 2004, 2006, 2010 Free Software Foundation, Inc. |
This file is part of GDB, GAS, and the GNU binutils. |
GDB, GAS, and the GNU binutils are free software; you can redistribute |
them and/or modify them under the terms of the GNU General Public |
License as published by the Free Software Foundation; either version 3, |
or (at your option) any later version. |
GDB, GAS, and the GNU binutils are distributed in the hope that they |
will be useful, but WITHOUT ANY WARRANTY; without even the implied |
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See |
the GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this file; see the file COPYING3. If not, write to the Free |
Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA |
02110-1301, USA. */ |
/* These are used as bit flags for the arch field in the m68k_opcode |
structure. */ |
#define _m68k_undef 0 |
#define m68000 0x001 |
#define m68010 0x002 |
#define m68020 0x004 |
#define m68030 0x008 |
#define m68040 0x010 |
#define m68060 0x020 |
#define m68881 0x040 |
#define m68851 0x080 |
#define cpu32 0x100 /* e.g., 68332 */ |
#define fido_a 0x200 |
#define m68k_mask 0x3ff |
#define mcfmac 0x400 /* ColdFire MAC. */ |
#define mcfemac 0x800 /* ColdFire EMAC. */ |
#define cfloat 0x1000 /* ColdFire FPU. */ |
#define mcfhwdiv 0x2000 /* ColdFire hardware divide. */ |
#define mcfisa_a 0x4000 /* ColdFire ISA_A. */ |
#define mcfisa_aa 0x8000 /* ColdFire ISA_A+. */ |
#define mcfisa_b 0x10000 /* ColdFire ISA_B. */ |
#define mcfisa_c 0x20000 /* ColdFire ISA_C. */ |
#define mcfusp 0x40000 /* ColdFire USP instructions. */ |
#define mcf_mask 0x7e400 |
/* Handy aliases. */ |
#define m68040up (m68040 | m68060) |
#define m68030up (m68030 | m68040up) |
#define m68020up (m68020 | m68030up) |
#define m68010up (m68010 | cpu32 | fido_a | m68020up) |
#define m68000up (m68000 | m68010up) |
#define mfloat (m68881 | m68040 | m68060) |
#define mmmu (m68851 | m68030 | m68040 | m68060) |
/* The structure used to hold information for an opcode. */ |
struct m68k_opcode |
{ |
/* The opcode name. */ |
const char *name; |
/* The pseudo-size of the instruction(in bytes). Used to determine |
number of bytes necessary to disassemble the instruction. */ |
unsigned int size; |
/* The opcode itself. */ |
unsigned long opcode; |
/* The mask used by the disassembler. */ |
unsigned long match; |
/* The arguments. */ |
const char *args; |
/* The architectures which support this opcode. */ |
unsigned int arch; |
}; |
/* The structure used to hold information for an opcode alias. */ |
struct m68k_opcode_alias |
{ |
/* The alias name. */ |
const char *alias; |
/* The instruction for which this is an alias. */ |
const char *primary; |
}; |
/* We store four bytes of opcode for all opcodes because that is the |
most any of them need. The actual length of an instruction is |
always at least 2 bytes, and is as much longer as necessary to hold |
the operands it has. |
The match field is a mask saying which bits must match particular |
opcode in order for an instruction to be an instance of that |
opcode. |
The args field is a string containing two characters for each |
operand of the instruction. The first specifies the kind of |
operand; the second, the place it is stored. |
If the first char of args is '.', it indicates that the opcode is |
two words. This is only necessary when the match field does not |
have any bits set in the second opcode word. Such a '.' is skipped |
for operand processing. */ |
/* Kinds of operands: |
Characters used: AaBbCcDdEeFfGgHIiJjKkLlMmnOopQqRrSsTtUuVvWwXxYyZz01234|*~%;@!&$?/<>#^+- |
D data register only. Stored as 3 bits. |
A address register only. Stored as 3 bits. |
a address register indirect only. Stored as 3 bits. |
R either kind of register. Stored as 4 bits. |
r either kind of register indirect only. Stored as 4 bits. |
At the moment, used only for cas2 instruction. |
F floating point coprocessor register only. Stored as 3 bits. |
O an offset (or width): immediate data 0-31 or data register. |
Stored as 6 bits in special format for BF... insns. |
+ autoincrement only. Stored as 3 bits (number of the address register). |
- autodecrement only. Stored as 3 bits (number of the address register). |
Q quick immediate data. Stored as 3 bits. |
This matches an immediate operand only when value is in range 1 .. 8. |
M moveq immediate data. Stored as 8 bits. |
This matches an immediate operand only when value is in range -128..127 |
T trap vector immediate data. Stored as 4 bits. |
k K-factor for fmove.p instruction. Stored as a 7-bit constant or |
a three bit register offset, depending on the field type. |
# immediate data. Stored in special places (b, w or l) |
which say how many bits to store. |
^ immediate data for floating point instructions. Special places |
are offset by 2 bytes from '#'... |
B pc-relative address, converted to an offset |
that is treated as immediate data. |
d displacement and register. Stores the register as 3 bits |
and stores the displacement in the entire second word. |
C the CCR. No need to store it; this is just for filtering validity. |
S the SR. No need to store, just as with CCR. |
U the USP. No need to store, just as with CCR. |
E the MAC ACC. No need to store, just as with CCR. |
e the EMAC ACC[0123]. |
G the MAC/EMAC MACSR. No need to store, just as with CCR. |
g the EMAC ACCEXT{01,23}. |
H the MASK. No need to store, just as with CCR. |
i the MAC/EMAC scale factor. |
I Coprocessor ID. Not printed if 1. The Coprocessor ID is always |
extracted from the 'd' field of word one, which means that an extended |
coprocessor opcode can be skipped using the 'i' place, if needed. |
s System Control register for the floating point coprocessor. |
J Misc register for movec instruction, stored in 'j' format. |
Possible values: |
0x000 SFC Source Function Code reg [60, 40, 30, 20, 10] |
0x001 DFC Data Function Code reg [60, 40, 30, 20, 10] |
0x002 CACR Cache Control Register [60, 40, 30, 20, mcf] |
0x003 TC MMU Translation Control [60, 40] |
0x004 ITT0 Instruction Transparent |
Translation reg 0 [60, 40] |
0x005 ITT1 Instruction Transparent |
Translation reg 1 [60, 40] |
0x006 DTT0 Data Transparent |
Translation reg 0 [60, 40] |
0x007 DTT1 Data Transparent |
Translation reg 1 [60, 40] |
0x008 BUSCR Bus Control Register [60] |
0x800 USP User Stack Pointer [60, 40, 30, 20, 10] |
0x801 VBR Vector Base reg [60, 40, 30, 20, 10, mcf] |
0x802 CAAR Cache Address Register [ 30, 20] |
0x803 MSP Master Stack Pointer [ 40, 30, 20] |
0x804 ISP Interrupt Stack Pointer [ 40, 30, 20] |
0x805 MMUSR MMU Status reg [ 40] |
0x806 URP User Root Pointer [60, 40] |
0x807 SRP Supervisor Root Pointer [60, 40] |
0x808 PCR Processor Configuration reg [60] |
0xC00 ROMBAR ROM Base Address Register [520X] |
0xC04 RAMBAR0 RAM Base Address Register 0 [520X] |
0xC05 RAMBAR1 RAM Base Address Register 0 [520X] |
0xC0F MBAR0 RAM Base Address Register 0 [520X] |
0xC04 FLASHBAR FLASH Base Address Register [mcf528x] |
0xC05 RAMBAR Static RAM Base Address Register [mcf528x] |
L Register list of the type d0-d7/a0-a7 etc. |
(New! Improved! Can also hold fp0-fp7, as well!) |
The assembler tries to see if the registers match the insn by |
looking at where the insn wants them stored. |
l Register list like L, but with all the bits reversed. |
Used for going the other way. . . |
c cache identifier which may be "nc" for no cache, "ic" |
for instruction cache, "dc" for data cache, or "bc" |
for both caches. Used in cinv and cpush. Always |
stored in position "d". |
u Any register, with ``upper'' or ``lower'' specification. Used |
in the mac instructions with size word. |
The remainder are all stored as 6 bits using an address mode and a |
register number; they differ in which addressing modes they match. |
* all (modes 0-6,7.0-4) |
~ alterable memory (modes 2-6,7.0,7.1) |
(not 0,1,7.2-4) |
% alterable (modes 0-6,7.0,7.1) |
(not 7.2-4) |
; data (modes 0,2-6,7.0-4) |
(not 1) |
@ data, but not immediate (modes 0,2-6,7.0-3) |
(not 1,7.4) |
! control (modes 2,5,6,7.0-3) |
(not 0,1,3,4,7.4) |
& alterable control (modes 2,5,6,7.0,7.1) |
(not 0,1,3,4,7.2-4) |
$ alterable data (modes 0,2-6,7.0,7.1) |
(not 1,7.2-4) |
? alterable control, or data register (modes 0,2,5,6,7.0,7.1) |
(not 1,3,4,7.2-4) |
/ control, or data register (modes 0,2,5,6,7.0-3) |
(not 1,3,4,7.4) |
> *save operands (modes 2,4,5,6,7.0,7.1) |
(not 0,1,3,7.2-4) |
< *restore operands (modes 2,3,5,6,7.0-3) |
(not 0,1,4,7.4) |
coldfire move operands: |
m (modes 0-4) |
n (modes 5,7.2) |
o (modes 6,7.0,7.1,7.3,7.4) |
p (modes 0-5) |
coldfire bset/bclr/btst/mulsl/mulul operands: |
q (modes 0,2-5) |
v (modes 0,2-5,7.0,7.1) |
b (modes 0,2-5,7.2) |
w (modes 2-5,7.2) |
y (modes 2,5) |
z (modes 2,5,7.2) |
x mov3q immediate operand. |
j coprocessor ET operand. |
K coprocessor command number. |
4 (modes 2,3,4,5) |
*/ |
/* For the 68851: */ |
/* I didn't use much imagination in choosing the |
following codes, so many of them aren't very |
mnemonic. -rab |
0 32 bit pmmu register |
Possible values: |
000 TC Translation Control Register (68030, 68851) |
1 16 bit pmmu register |
111 AC Access Control (68851) |
2 8 bit pmmu register |
100 CAL Current Access Level (68851) |
101 VAL Validate Access Level (68851) |
110 SCC Stack Change Control (68851) |
3 68030-only pmmu registers (32 bit) |
010 TT0 Transparent Translation reg 0 |
(aka Access Control reg 0 -- AC0 -- on 68ec030) |
011 TT1 Transparent Translation reg 1 |
(aka Access Control reg 1 -- AC1 -- on 68ec030) |
W wide pmmu registers |
Possible values: |
001 DRP Dma Root Pointer (68851) |
010 SRP Supervisor Root Pointer (68030, 68851) |
011 CRP Cpu Root Pointer (68030, 68851) |
f function code register (68030, 68851) |
0 SFC |
1 DFC |
V VAL register only (68851) |
X BADx, BACx (16 bit) |
100 BAD Breakpoint Acknowledge Data (68851) |
101 BAC Breakpoint Acknowledge Control (68851) |
Y PSR (68851) (MMUSR on 68030) (ACUSR on 68ec030) |
Z PCSR (68851) |
| memory (modes 2-6, 7.*) |
t address test level (68030 only) |
Stored as 3 bits, range 0-7. |
Also used for breakpoint instruction now. |
*/ |
/* Places to put an operand, for non-general operands: |
Characters used: BbCcDdFfGgHhIijkLlMmNnostWw123456789/ |
s source, low bits of first word. |
d dest, shifted 9 in first word |
1 second word, shifted 12 |
2 second word, shifted 6 |
3 second word, shifted 0 |
4 third word, shifted 12 |
5 third word, shifted 6 |
6 third word, shifted 0 |
7 second word, shifted 7 |
8 second word, shifted 10 |
9 second word, shifted 5 |
E second word, shifted 9 |
D store in both place 1 and place 3; for divul and divsl. |
B first word, low byte, for branch displacements |
W second word (entire), for branch displacements |
L second and third words (entire), for branch displacements |
(also overloaded for move16) |
b second word, low byte |
w second word (entire) [variable word/long branch offset for dbra] |
W second word (entire) (must be signed 16 bit value) |
l second and third word (entire) |
g variable branch offset for bra and similar instructions. |
The place to store depends on the magnitude of offset. |
t store in both place 7 and place 8; for floating point operations |
c branch offset for cpBcc operations. |
The place to store is word two if bit six of word one is zero, |
and words two and three if bit six of word one is one. |
i Increment by two, to skip over coprocessor extended operands. Only |
works with the 'I' format. |
k Dynamic K-factor field. Bits 6-4 of word 2, used as a register number. |
Also used for dynamic fmovem instruction. |
C floating point coprocessor constant - 7 bits. Also used for static |
K-factors... |
j Movec register #, stored in 12 low bits of second word. |
m For M[S]ACx; 4 bits split with MSB shifted 6 bits in first word |
and remaining 3 bits of register shifted 9 bits in first word. |
Indicate upper/lower in 1 bit shifted 7 bits in second word. |
Use with `R' or `u' format. |
n `m' withouth upper/lower indication. (For M[S]ACx; 4 bits split |
with MSB shifted 6 bits in first word and remaining 3 bits of |
register shifted 9 bits in first word. No upper/lower |
indication is done.) Use with `R' or `u' format. |
o For M[S]ACw; 4 bits shifted 12 in second word (like `1'). |
Indicate upper/lower in 1 bit shifted 7 bits in second word. |
Use with `R' or `u' format. |
M For M[S]ACw; 4 bits in low bits of first word. Indicate |
upper/lower in 1 bit shifted 6 bits in second word. Use with |
`R' or `u' format. |
N For M[S]ACw; 4 bits in low bits of second word. Indicate |
upper/lower in 1 bit shifted 6 bits in second word. Use with |
`R' or `u' format. |
h shift indicator (scale factor), 1 bit shifted 10 in second word |
Places to put operand, for general operands: |
d destination, shifted 6 bits in first word |
b source, at low bit of first word, and immediate uses one byte |
w source, at low bit of first word, and immediate uses two bytes |
l source, at low bit of first word, and immediate uses four bytes |
s source, at low bit of first word. |
Used sometimes in contexts where immediate is not allowed anyway. |
f single precision float, low bit of 1st word, immediate uses 4 bytes |
F double precision float, low bit of 1st word, immediate uses 8 bytes |
x extended precision float, low bit of 1st word, immediate uses 12 bytes |
p packed float, low bit of 1st word, immediate uses 12 bytes |
G EMAC accumulator, load (bit 4 2nd word, !bit8 first word) |
H EMAC accumulator, non load (bit 4 2nd word, bit 8 first word) |
F EMAC ACCx |
f EMAC ACCy |
I MAC/EMAC scale factor |
/ Like 's', but set 2nd word, bit 5 if trailing_ampersand set |
] first word, bit 10 |
*/ |
extern const struct m68k_opcode m68k_opcodes[]; |
extern const struct m68k_opcode_alias m68k_opcode_aliases[]; |
extern const int m68k_numopcodes, m68k_numaliases; |
/* end of m68k-opcode.h */ |
/contrib/toolchain/binutils/include/opcode/m88k.h |
---|
0,0 → 1,455 |
/* Table of opcodes for the Motorola M88k family. |
Copyright 1989, 1990, 1991, 1993, 2001, 2002, 2010 |
Free Software Foundation, Inc. |
This file is part of GDB and GAS. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* |
* Disassembler Instruction Table |
* |
* The first field of the table is the opcode field. If an opcode |
* is specified which has any non-opcode bits on, a system error |
* will occur when the system attempts the install it into the |
* instruction table. The second parameter is a pointer to the |
* instruction mnemonic. Each operand is specified by offset, width, |
* and type. The offset is the bit number of the least significant |
* bit of the operand with bit 0 being the least significant bit of |
* the instruction. The width is the number of bits used to specify |
* the operand. The type specifies the output format to be used for |
* the operand. The valid formats are: register, register indirect, |
* hex constant, and bit field specification. The last field is a |
* pointer to the next instruction in the linked list. These pointers |
* are initialized by init_disasm(). |
* |
* Revision History |
* |
* Revision 1.0 11/08/85 Creation date |
* 1.1 02/05/86 Updated instruction mnemonic table MD |
* 1.2 06/16/86 Updated SIM_FLAGS for floating point |
* 1.3 09/20/86 Updated for new encoding |
* 05/11/89 R. Trawick adapted from Motorola disassembler |
*/ |
#include <stdio.h> |
/* Define the number of bits in the primary opcode field of the instruction, |
the destination field, the source 1 and source 2 fields. */ |
/* Size of opcode field. */ |
#define OP 8 |
/* Size of destination. */ |
#define DEST 6 |
/* Size of source1. */ |
#define SOURCE1 6 |
/* Size of source2. */ |
#define SOURCE2 6 |
/* Number of registers. */ |
#define REGs 32 |
/* Type definitions. */ |
typedef unsigned int UINT; |
#define WORD long |
#define FLAG unsigned |
#define STATE short |
/* The next four equates define the priorities that the various classes |
* of instructions have regarding writing results back into registers and |
* signalling exceptions. */ |
/* PMEM is also defined in <sys/param.h> on Delta 88's. Sigh! */ |
#undef PMEM |
/* Integer priority. */ |
#define PINT 0 |
/* Floating point priority. */ |
#define PFLT 1 |
/* Memory priority. */ |
#define PMEM 2 |
/* Not applicable, instruction doesn't write to regs. */ |
#define NA 3 |
/* Highest of these priorities. */ |
#define HIPRI 3 |
/* The instruction registers are an artificial mechanism to speed up |
* simulator execution. In the real processor, an instruction register |
* is 32 bits wide. In the simulator, the 32 bit instruction is kept in |
* a structure field called rawop, and the instruction is partially decoded, |
* and split into various fields and flags which make up the other fields |
* of the structure. |
* The partial decode is done when the instructions are initially loaded |
* into simulator memory. The simulator code memory is not an array of |
* 32 bit words, but is an array of instruction register structures. |
* Yes this wastes memory, but it executes much quicker. |
*/ |
struct IR_FIELDS |
{ |
unsigned op:OP, |
dest: DEST, |
src1: SOURCE1, |
src2: SOURCE2; |
int ltncy, |
extime, |
/* Writeback priority. */ |
wb_pri; |
/* Immediate size. */ |
unsigned imm_flags:2, |
/* Register source 1 used. */ |
rs1_used:1, |
/* Register source 2 used. */ |
rs2_used:1, |
/* Register source/dest. used. */ |
rsd_used:1, |
/* Complement. */ |
c_flag:1, |
/* Upper half word. */ |
u_flag:1, |
/* Execute next. */ |
n_flag:1, |
/* Uses writeback slot. */ |
wb_flag:1, |
/* Dest size. */ |
dest_64:1, |
/* Source 1 size. */ |
s1_64:1, |
/* Source 2 size. */ |
s2_64:1, |
scale_flag:1, |
/* Scaled register. */ |
brk_flg:1; |
}; |
struct mem_segs |
{ |
/* Pointer (returned by calloc) to segment. */ |
struct mem_wrd *seg; |
/* Base load address from file headers. */ |
unsigned long baseaddr; |
/* Ending address of segment. */ |
unsigned long endaddr; |
/* Segment control flags (none defined). */ |
int flags; |
}; |
#define MAXSEGS (10) /* max number of segment allowed */ |
#define MEMSEGSIZE (sizeof(struct mem_segs))/* size of mem_segs structure */ |
#if 0 |
#define BRK_RD (0x01) /* break on memory read */ |
#define BRK_WR (0x02) /* break on memory write */ |
#define BRK_EXEC (0x04) /* break on execution */ |
#define BRK_CNT (0x08) /* break on terminal count */ |
#endif |
struct mem_wrd |
{ |
/* Simulator instruction break down. */ |
struct IR_FIELDS opcode; |
union { |
/* Memory element break down. */ |
unsigned long l; |
unsigned short s[2]; |
unsigned char c[4]; |
} mem; |
}; |
/* Size of each 32 bit memory model. */ |
#define MEMWRDSIZE (sizeof (struct mem_wrd)) |
extern struct mem_segs memory[]; |
extern struct PROCESSOR m78000; |
struct PROCESSOR |
{ |
unsigned WORD |
/* Execute instruction pointer. */ |
ip, |
/* Vector base register. */ |
vbr, |
/* Processor status register. */ |
psr; |
/* Source 1. */ |
WORD S1bus, |
/* Source 2. */ |
S2bus, |
/* Destination. */ |
Dbus, |
/* Data address bus. */ |
DAbus, |
ALU, |
/* Data registers. */ |
Regs[REGs], |
/* Max clocks before reg is available. */ |
time_left[REGs], |
/* Writeback priority of reg. */ |
wb_pri[REGs], |
/* Integer unit control regs. */ |
SFU0_regs[REGs], |
/* Floating point control regs. */ |
SFU1_regs[REGs], |
Scoreboard[REGs], |
Vbr; |
unsigned WORD scoreboard, |
Psw, |
Tpsw; |
/* Waiting for a jump instruction. */ |
FLAG jump_pending:1; |
}; |
/* Size of immediate field. */ |
#define i26bit 1 |
#define i16bit 2 |
#define i10bit 3 |
/* Definitions for fields in psr. */ |
#define psr_mode 31 |
#define psr_rbo 30 |
#define psr_ser 29 |
#define psr_carry 28 |
#define psr_sf7m 11 |
#define psr_sf6m 10 |
#define psr_sf5m 9 |
#define psr_sf4m 8 |
#define psr_sf3m 7 |
#define psr_sf2m 6 |
#define psr_sf1m 5 |
#define psr_mam 4 |
#define psr_inm 3 |
#define psr_exm 2 |
#define psr_trm 1 |
#define psr_ovfm 0 |
/* The 1 clock operations. */ |
#define ADDU 1 |
#define ADDC 2 |
#define ADDUC 3 |
#define ADD 4 |
#define SUBU ADD+1 |
#define SUBB ADD+2 |
#define SUBUB ADD+3 |
#define SUB ADD+4 |
#define AND_ ADD+5 |
#define OR ADD+6 |
#define XOR ADD+7 |
#define CMP ADD+8 |
/* Loads. */ |
#define LDAB CMP+1 |
#define LDAH CMP+2 |
#define LDA CMP+3 |
#define LDAD CMP+4 |
#define LDB LDAD+1 |
#define LDH LDAD+2 |
#define LD LDAD+3 |
#define LDD LDAD+4 |
#define LDBU LDAD+5 |
#define LDHU LDAD+6 |
/* Stores. */ |
#define STB LDHU+1 |
#define STH LDHU+2 |
#define ST LDHU+3 |
#define STD LDHU+4 |
/* Exchange. */ |
#define XMEMBU LDHU+5 |
#define XMEM LDHU+6 |
/* Branches. */ |
#define JSR STD+1 |
#define BSR STD+2 |
#define BR STD+3 |
#define JMP STD+4 |
#define BB1 STD+5 |
#define BB0 STD+6 |
#define RTN STD+7 |
#define BCND STD+8 |
/* Traps. */ |
#define TB1 BCND+1 |
#define TB0 BCND+2 |
#define TCND BCND+3 |
#define RTE BCND+4 |
#define TBND BCND+5 |
/* Misc. */ |
#define MUL TBND + 1 |
#define DIV MUL +2 |
#define DIVU MUL +3 |
#define MASK MUL +4 |
#define FF0 MUL +5 |
#define FF1 MUL +6 |
#define CLR MUL +7 |
#define SET MUL +8 |
#define EXT MUL +9 |
#define EXTU MUL +10 |
#define MAK MUL +11 |
#define ROT MUL +12 |
/* Control register manipulations. */ |
#define LDCR ROT +1 |
#define STCR ROT +2 |
#define XCR ROT +3 |
#define FLDCR ROT +4 |
#define FSTCR ROT +5 |
#define FXCR ROT +6 |
#define NOP XCR +1 |
/* Floating point instructions. */ |
#define FADD NOP +1 |
#define FSUB NOP +2 |
#define FMUL NOP +3 |
#define FDIV NOP +4 |
#define FSQRT NOP +5 |
#define FCMP NOP +6 |
#define FIP NOP +7 |
#define FLT NOP +8 |
#define INT NOP +9 |
#define NINT NOP +10 |
#define TRNC NOP +11 |
#define FLDC NOP +12 |
#define FSTC NOP +13 |
#define FXC NOP +14 |
#define UEXT(src,off,wid) \ |
((((unsigned int)(src)) >> (off)) & ((1 << (wid)) - 1)) |
#define SEXT(src,off,wid) \ |
(((((int)(src))<<(32 - ((off) + (wid)))) >>(32 - (wid))) ) |
#define MAKE(src,off,wid) \ |
((((unsigned int)(src)) & ((1 << (wid)) - 1)) << (off)) |
#define opword(n) (unsigned long) (memaddr->mem.l) |
/* Constants and masks. */ |
#define SFU0 0x80000000 |
#define SFU1 0x84000000 |
#define SFU7 0x9c000000 |
#define RRI10 0xf0000000 |
#define RRR 0xf4000000 |
#define SFUMASK 0xfc00ffe0 |
#define RRRMASK 0xfc00ffe0 |
#define RRI10MASK 0xfc00fc00 |
#define DEFMASK 0xfc000000 |
#define CTRL 0x0000f000 |
#define CTRLMASK 0xfc00f800 |
/* Operands types. */ |
enum operand_type |
{ |
HEX = 1, |
REG = 2, |
CONT = 3, |
IND = 3, |
BF = 4, |
/* Scaled register. */ |
REGSC = 5, |
/* Control register. */ |
CRREG = 6, |
/* Floating point control register. */ |
FCRREG = 7, |
PCREL = 8, |
CONDMASK = 9, |
/* Extended register. */ |
XREG = 10, |
/* Decimal. */ |
DEC = 11 |
}; |
/* Hashing specification. */ |
#define HASHVAL 79 |
/* Structure templates. */ |
typedef struct |
{ |
unsigned int offset; |
unsigned int width; |
enum operand_type type; |
} OPSPEC; |
struct SIM_FLAGS |
{ |
int ltncy, /* latency (max number of clocks needed to execute). */ |
extime, /* execution time (min number of clocks needed to execute). */ |
wb_pri; /* writeback slot priority. */ |
unsigned op:OP, /* simulator version of opcode. */ |
imm_flags:2, /* 10,16 or 26 bit immediate flags. */ |
rs1_used:1, /* register source 1 used. */ |
rs2_used:1, /* register source 2 used. */ |
rsd_used:1, /* register source/dest used. */ |
c_flag:1, /* complement. */ |
u_flag:1, /* upper half word. */ |
n_flag:1, /* execute next. */ |
wb_flag:1, /* uses writeback slot. */ |
dest_64:1, /* double precision dest. */ |
s1_64:1, /* double precision source 1. */ |
s2_64:1, /* double precision source 2. */ |
scale_flag:1; /* register is scaled. */ |
}; |
typedef struct INSTRUCTAB { |
unsigned int opcode; |
char *mnemonic; |
OPSPEC op1,op2,op3; |
struct SIM_FLAGS flgs; |
} INSTAB; |
#define NO_OPERAND {0,0,0} |
extern const INSTAB instructions[]; |
/* |
* Local Variables: |
* fill-column: 131 |
* End: |
*/ |
/contrib/toolchain/binutils/include/opcode/metag.h |
---|
0,0 → 1,2079 |
/* Imagination Technologies Meta opcode table. |
Copyright (C) 2013 Free Software Foundation, Inc. |
Contributed by Imagination Technologies Ltd. |
This file is part of GDB and GAS. |
GDB and GAS are free software; you can redistribute it and/or |
modify it under the terms of the GNU General Public License as |
published by the Free Software Foundation; either version 3, or (at |
your option) any later version. |
GDB and GAS are distributed in the hope that it will be useful, but |
WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with GDB or GAS; see the file COPYING3. If not, write to the |
Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
enum metag_unit |
{ |
UNIT_CT, |
UNIT_D0, |
UNIT_D1, |
UNIT_A0, |
UNIT_A1, |
UNIT_PC, |
UNIT_RD, |
UNIT_TR, |
UNIT_TT, |
UNIT_FX, |
UNIT_DT, /* DSP Template Table */ |
UNIT_ACC_D0, |
UNIT_ACC_D1, |
UNIT_RAM_D0, |
UNIT_RAM_D1, |
}; |
typedef struct |
{ |
const char * name; |
enum metag_unit unit; |
unsigned int no; |
} metag_reg; |
static const metag_reg metag_regtab[] = |
{ |
{ "TXENABLE", UNIT_CT, 0 }, |
{ "CT.0", UNIT_CT, 0 }, |
{ "TXMODE", UNIT_CT, 1 }, |
{ "CT.1", UNIT_CT, 1 }, |
{ "TXSTATUS", UNIT_CT, 2 }, |
{ "CT.2", UNIT_CT, 2 }, |
{ "TXRPT", UNIT_CT, 3 }, |
{ "CT.3", UNIT_CT, 3 }, |
{ "TXTIMER", UNIT_CT, 4 }, |
{ "CT.4", UNIT_CT, 4 }, |
{ "TXL1START", UNIT_CT, 5 }, |
{ "CT.5", UNIT_CT, 5 }, |
{ "TXL1END", UNIT_CT, 6 }, |
{ "CT.6", UNIT_CT, 6 }, |
{ "TXL1COUNT", UNIT_CT, 7 }, |
{ "CT.7", UNIT_CT, 7 }, |
{ "TXL2START", UNIT_CT, 8 }, |
{ "CT.8", UNIT_CT, 8 }, |
{ "TXL2END", UNIT_CT, 9 }, |
{ "CT.9", UNIT_CT, 9 }, |
{ "TXL2COUNT", UNIT_CT, 10 }, |
{ "CT.10", UNIT_CT, 10 }, |
{ "TXBPOBITS", UNIT_CT, 11 }, |
{ "CT.11", UNIT_CT, 11 }, |
{ "TXMRSIZE", UNIT_CT, 12 }, |
{ "CT.12", UNIT_CT, 12 }, |
{ "TXTIMERI", UNIT_CT, 13 }, |
{ "CT.13", UNIT_CT, 13 }, |
{ "TXDRCTRL", UNIT_CT, 14 }, |
{ "CT.14", UNIT_CT, 14 }, |
{ "TXDRSIZE", UNIT_CT, 15 }, |
{ "CT.15", UNIT_CT, 15 }, |
{ "TXCATCH0", UNIT_CT, 16 }, |
{ "CT.16", UNIT_CT, 16 }, |
{ "TXCATCH1", UNIT_CT, 17 }, |
{ "CT.17", UNIT_CT, 17 }, |
{ "TXCATCH2", UNIT_CT, 18 }, |
{ "CT.18", UNIT_CT, 18 }, |
{ "TXCATCH3", UNIT_CT, 19 }, |
{ "CT.19", UNIT_CT, 19 }, |
{ "TXDEFR", UNIT_CT, 20 }, |
{ "CT.20", UNIT_CT, 20 }, |
{ "TXCPRS", UNIT_CT, 21 }, |
{ "CT.21", UNIT_CT, 21 }, |
{ "TXCLKCTRL", UNIT_CT, 22 }, |
{ "CT.22", UNIT_CT, 22 }, |
{ "TXINTERN0", UNIT_CT, 23 }, |
{ "TXSTATE", UNIT_CT, 23 }, |
{ "CT.23", UNIT_CT, 23 }, |
{ "TXAMAREG0", UNIT_CT, 24 }, |
{ "CT.24", UNIT_CT, 24 }, |
{ "TXAMAREG1", UNIT_CT, 25 }, |
{ "CT.25", UNIT_CT, 25 }, |
{ "TXAMAREG2", UNIT_CT, 26 }, |
{ "CT.26", UNIT_CT, 26 }, |
{ "TXAMAREG3", UNIT_CT, 27 }, |
{ "CT.27", UNIT_CT, 27 }, |
{ "TXDIVTIME", UNIT_CT, 28 }, |
{ "CT.28", UNIT_CT, 28 }, |
{ "TXPRIVEXT", UNIT_CT, 29 }, |
{ "CT.29", UNIT_CT, 29 }, |
{ "TXTACTCYC", UNIT_CT, 30 }, |
{ "TXACTCYC", UNIT_CT, 30 }, |
{ "CT.30", UNIT_CT, 30 }, |
{ "TXIDLECYC", UNIT_CT, 31 }, |
{ "CT.31", UNIT_CT, 31 }, |
{ "D0Re0", UNIT_D0, 0 }, |
{ "D0.0", UNIT_D0, 0 }, |
{ "D0Ar6", UNIT_D0, 1 }, |
{ "D0.1", UNIT_D0, 1 }, |
{ "D0Ar4", UNIT_D0, 2 }, |
{ "D0.2", UNIT_D0, 2 }, |
{ "D0Ar2", UNIT_D0, 3 }, |
{ "D0.3", UNIT_D0, 3 }, |
{ "D0FrT", UNIT_D0, 4 }, |
{ "D0.4", UNIT_D0, 4 }, |
{ "D0.5", UNIT_D0, 5 }, |
{ "D0.6", UNIT_D0, 6 }, |
{ "D0.7", UNIT_D0, 7 }, |
{ "D0.8", UNIT_D0, 8 }, |
{ "D0.9", UNIT_D0, 9 }, |
{ "D0.10", UNIT_D0, 10 }, |
{ "D0.11", UNIT_D0, 11 }, |
{ "D0.12", UNIT_D0, 12 }, |
{ "D0.13", UNIT_D0, 13 }, |
{ "D0.14", UNIT_D0, 14 }, |
{ "D0.15", UNIT_D0, 15 }, |
{ "D0.16", UNIT_D0, 16 }, |
{ "D0.17", UNIT_D0, 17 }, |
{ "D0.18", UNIT_D0, 18 }, |
{ "D0.19", UNIT_D0, 19 }, |
{ "D0.20", UNIT_D0, 20 }, |
{ "D0.21", UNIT_D0, 21 }, |
{ "D0.22", UNIT_D0, 22 }, |
{ "D0.23", UNIT_D0, 23 }, |
{ "D0.24", UNIT_D0, 24 }, |
{ "D0.25", UNIT_D0, 25 }, |
{ "D0.26", UNIT_D0, 26 }, |
{ "D0.27", UNIT_D0, 27 }, |
{ "D0.28", UNIT_D0, 28 }, |
{ "D0.29", UNIT_D0, 29 }, |
{ "D0.30", UNIT_D0, 30 }, |
{ "D0.31", UNIT_D0, 31 }, |
{ "D1Re0", UNIT_D1, 0 }, |
{ "D1.0", UNIT_D1, 0 }, |
{ "D1Ar5", UNIT_D1, 1 }, |
{ "D1.1", UNIT_D1, 1 }, |
{ "D1Ar3", UNIT_D1, 2 }, |
{ "D1.2", UNIT_D1, 2 }, |
{ "D1Ar1", UNIT_D1, 3 }, |
{ "D1.3", UNIT_D1, 3 }, |
{ "D1RtP", UNIT_D1, 4 }, |
{ "D1.4", UNIT_D1, 4 }, |
{ "D1.5", UNIT_D1, 5 }, |
{ "D1.6", UNIT_D1, 6 }, |
{ "D1.7", UNIT_D1, 7 }, |
{ "D1.8", UNIT_D1, 8 }, |
{ "D1.9", UNIT_D1, 9 }, |
{ "D1.10", UNIT_D1, 10 }, |
{ "D1.11", UNIT_D1, 11 }, |
{ "D1.12", UNIT_D1, 12 }, |
{ "D1.13", UNIT_D1, 13 }, |
{ "D1.14", UNIT_D1, 14 }, |
{ "D1.15", UNIT_D1, 15 }, |
{ "D1.16", UNIT_D1, 16 }, |
{ "D1.17", UNIT_D1, 17 }, |
{ "D1.18", UNIT_D1, 18 }, |
{ "D1.19", UNIT_D1, 19 }, |
{ "D1.20", UNIT_D1, 20 }, |
{ "D1.21", UNIT_D1, 21 }, |
{ "D1.22", UNIT_D1, 22 }, |
{ "D1.23", UNIT_D1, 23 }, |
{ "D1.24", UNIT_D1, 24 }, |
{ "D1.25", UNIT_D1, 25 }, |
{ "D1.26", UNIT_D1, 26 }, |
{ "D1.27", UNIT_D1, 27 }, |
{ "D1.28", UNIT_D1, 28 }, |
{ "D1.29", UNIT_D1, 29 }, |
{ "D1.30", UNIT_D1, 30 }, |
{ "D1.31", UNIT_D1, 31 }, |
{ "A0StP", UNIT_A0, 0 }, |
{ "A0.0", UNIT_A0, 0 }, |
{ "A0FrP", UNIT_A0, 1 }, |
{ "A0.1", UNIT_A0, 1 }, |
{ "A0.2", UNIT_A0, 2 }, |
{ "A0.3", UNIT_A0, 3 }, |
{ "A0.4", UNIT_A0, 4 }, |
{ "A0.5", UNIT_A0, 5 }, |
{ "A0.6", UNIT_A0, 6 }, |
{ "A0.7", UNIT_A0, 7 }, |
{ "A0.8", UNIT_A0, 8 }, |
{ "A0.9", UNIT_A0, 9 }, |
{ "A0.10", UNIT_A0, 10 }, |
{ "A0.11", UNIT_A0, 11 }, |
{ "A0.12", UNIT_A0, 12 }, |
{ "A0.13", UNIT_A0, 13 }, |
{ "A0.14", UNIT_A0, 14 }, |
{ "A0.15", UNIT_A0, 15 }, |
{ "CPC0", UNIT_A0, 16 }, |
{ "A1GbP", UNIT_A1, 0 }, |
{ "A1.0", UNIT_A1, 0 }, |
{ "A1LbP", UNIT_A1, 1 }, |
{ "A1.1", UNIT_A1, 1 }, |
{ "A1.2", UNIT_A1, 2 }, |
{ "A1.3", UNIT_A1, 3 }, |
{ "A1.4", UNIT_A1, 4 }, |
{ "A1.5", UNIT_A1, 5 }, |
{ "A1.6", UNIT_A1, 6 }, |
{ "A1.7", UNIT_A1, 7 }, |
{ "A1.8", UNIT_A1, 8 }, |
{ "A1.9", UNIT_A1, 9 }, |
{ "A1.10", UNIT_A1, 10 }, |
{ "A1.11", UNIT_A1, 11 }, |
{ "A1.12", UNIT_A1, 12 }, |
{ "A1.13", UNIT_A1, 13 }, |
{ "A1.14", UNIT_A1, 14 }, |
{ "A1.15", UNIT_A1, 15 }, |
{ "CPC1", UNIT_A1, 16 }, |
{ "PC", UNIT_PC, 0 }, |
{ "PCX", UNIT_PC, 1 }, |
{ "RD", UNIT_RD, 0 }, |
{ "RA", UNIT_RD, 16 }, |
{ "RD", UNIT_RD, 16 }, |
{ "RAPF", UNIT_RD, 17 }, |
{ "RAM8X32", UNIT_RD, 22 }, |
{ "RAM8X", UNIT_RD, 23 }, |
{ "RABZ", UNIT_RD, 24 }, |
{ "RAWZ", UNIT_RD, 25 }, |
{ "RADZ", UNIT_RD, 26 }, |
{ "RABX", UNIT_RD, 28 }, |
{ "RAWX", UNIT_RD, 29 }, |
{ "RADX", UNIT_RD, 30 }, |
{ "RAMX", UNIT_RD, 31 }, |
{ "RAM16X", UNIT_RD, 31 }, |
{ "TXSTAT", UNIT_TR, 0 }, |
{ "TR.0", UNIT_TR, 0 }, |
{ "TXMASK", UNIT_TR, 1 }, |
{ "TR.1", UNIT_TR, 1 }, |
{ "TXSTATI", UNIT_TR, 2 }, |
{ "TR.2", UNIT_TR, 2 }, |
{ "TXMASKI", UNIT_TR, 3 }, |
{ "TR.3", UNIT_TR, 3 }, |
{ "TXPOLL", UNIT_TR, 4 }, |
{ "TR.4", UNIT_TR, 4 }, |
{ "TXGPIOI", UNIT_TR, 5 }, |
{ "TR.5", UNIT_TR, 5 }, |
{ "TXPOLLI", UNIT_TR, 6 }, |
{ "TR.6", UNIT_TR, 6 }, |
{ "TXGPIOO", UNIT_TR, 7 }, |
{ "TR.7", UNIT_TR, 7 }, |
{ "TTEXEC", UNIT_TT, 0 }, |
{ "TT.0", UNIT_TT, 0 }, |
{ "TTCTRL", UNIT_TT, 1 }, |
{ "TT.1", UNIT_TT, 1 }, |
{ "TTMARK", UNIT_TT, 2 }, |
{ "TT.2", UNIT_TT, 2 }, |
{ "TTREC", UNIT_TT, 3 }, |
{ "TT.3", UNIT_TT, 3 }, |
{ "GTEXEC", UNIT_TT, 4 }, |
{ "TT.4", UNIT_TT, 4 }, |
{ "FX.0", UNIT_FX, 0 }, |
{ "FX.1", UNIT_FX, 1 }, |
{ "FX.2", UNIT_FX, 2 }, |
{ "FX.3", UNIT_FX, 3 }, |
{ "FX.4", UNIT_FX, 4 }, |
{ "FX.5", UNIT_FX, 5 }, |
{ "FX.6", UNIT_FX, 6 }, |
{ "FX.7", UNIT_FX, 7 }, |
{ "FX.8", UNIT_FX, 8 }, |
{ "FX.9", UNIT_FX, 9 }, |
{ "FX.10", UNIT_FX, 10 }, |
{ "FX.11", UNIT_FX, 11 }, |
{ "FX.12", UNIT_FX, 12 }, |
{ "FX.13", UNIT_FX, 13 }, |
{ "FX.14", UNIT_FX, 14 }, |
{ "FX.15", UNIT_FX, 15 }, |
}; |
static const metag_reg metag_dsp_regtab[] = |
{ |
{ "D0AR.0", UNIT_RAM_D0, 0 }, |
{ "D0AR.1", UNIT_RAM_D0, 1 }, |
{ "D0AW.0", UNIT_RAM_D0, 2 }, |
{ "D0AW.1", UNIT_RAM_D0, 3 }, |
{ "D0BR.0", UNIT_RAM_D0, 4 }, |
{ "D0BR.1", UNIT_RAM_D0, 5 }, |
{ "D0BW.0", UNIT_RAM_D0, 6 }, |
{ "D0BW.1", UNIT_RAM_D0, 7 }, |
{ "D0ARI.0", UNIT_RAM_D0, 8 }, |
{ "D0ARI.1", UNIT_RAM_D0, 9 }, |
{ "D0AWI.0", UNIT_RAM_D0, 10 }, |
{ "D0AWI.1", UNIT_RAM_D0, 11 }, |
{ "D0BRI.0", UNIT_RAM_D0, 12 }, |
{ "D0BRI.1", UNIT_RAM_D0, 13 }, |
{ "D0BWI.0", UNIT_RAM_D0, 14 }, |
{ "D0BWI.1", UNIT_RAM_D0, 15 }, |
{ "AC0.0", UNIT_ACC_D0, 16 }, |
{ "AC0.1", UNIT_ACC_D0, 17 }, |
{ "AC0.2", UNIT_ACC_D0, 18 }, |
{ "AC0.3", UNIT_ACC_D0, 19 }, |
{ "D1AR.0", UNIT_RAM_D1, 0 }, |
{ "D1AR.1", UNIT_RAM_D1, 1 }, |
{ "D1AW.0", UNIT_RAM_D1, 2 }, |
{ "D1AW.1", UNIT_RAM_D1, 3 }, |
{ "D1BR.0", UNIT_RAM_D1, 4 }, |
{ "D1BR.1", UNIT_RAM_D1, 5 }, |
{ "D1BW.0", UNIT_RAM_D1, 6 }, |
{ "D1BW.1", UNIT_RAM_D1, 7 }, |
{ "D1ARI.0", UNIT_RAM_D1, 8 }, |
{ "D1ARI.1", UNIT_RAM_D1, 9 }, |
{ "D1AWI.0", UNIT_RAM_D1, 10 }, |
{ "D1AWI.1", UNIT_RAM_D1, 11 }, |
{ "D1BRI.0", UNIT_RAM_D1, 12 }, |
{ "D1BRI.1", UNIT_RAM_D1, 13 }, |
{ "D1BWI.0", UNIT_RAM_D1, 14 }, |
{ "D1BWI.1", UNIT_RAM_D1, 15 }, |
{ "AC1.0", UNIT_ACC_D1, 16 }, |
{ "AC1.1", UNIT_ACC_D1, 17 }, |
{ "AC1.2", UNIT_ACC_D1, 18 }, |
{ "AC1.3", UNIT_ACC_D1, 19 }, |
{ "T0", UNIT_DT, 0 }, |
{ "T1", UNIT_DT, 1 }, |
{ "T2", UNIT_DT, 2 }, |
{ "T3", UNIT_DT, 3 }, |
{ "T4", UNIT_DT, 4 }, |
{ "T5", UNIT_DT, 5 }, |
{ "T6", UNIT_DT, 6 }, |
{ "T7", UNIT_DT, 7 }, |
{ "T8", UNIT_DT, 8 }, |
{ "T9", UNIT_DT, 9 }, |
{ "TA", UNIT_DT, 10 }, |
{ "TB", UNIT_DT, 11 }, |
{ "TC", UNIT_DT, 12 }, |
{ "TD", UNIT_DT, 13 }, |
{ "TE", UNIT_DT, 14 }, |
{ "TF", UNIT_DT, 15 }, |
}; |
/* This table differs from 'metag_dsp_regtab' in that the number |
fields in this table are suitable for insertion into DSPRAM |
template definition instruction encodings. |
The table is indexed by "load". The main benefit of this is that we |
can implicitly check that the correct DSPRAM register has been used |
when parsing, e.g. the read pointer only appears in the load table |
and the write pointer only exists in the store table. |
The ordering of the table entries might look a bit weird but it is |
based on matching the longest register string. */ |
static const metag_reg metag_dsp_tmpl_regtab[2][56] = |
{ |
{ |
{ "D0AW.0+D0AWI.0++", UNIT_RAM_D0, 18 }, |
{ "D0AW.0+D0AWI.0", UNIT_RAM_D0, 18 }, |
{ "D0AW.0+D0AWI.1++", UNIT_RAM_D0, 19 }, |
{ "D0AW.0+D0AWI.1", UNIT_RAM_D0, 19 }, |
{ "D0AW.0++", UNIT_RAM_D0, 17 }, |
{ "D0AW.0", UNIT_RAM_D0, 16 }, |
{ "D0AWI.0", UNIT_RAM_D0, 18 }, |
{ "D0AWI.1", UNIT_RAM_D0, 19 }, |
{ "D0AW.1+D0AWI.0++", UNIT_RAM_D0, 22 }, |
{ "D0AW.1+D0AWI.0", UNIT_RAM_D0, 22 }, |
{ "D0AW.1+D0AWI.1++", UNIT_RAM_D0, 23 }, |
{ "D0AW.1+D0AWI.1", UNIT_RAM_D0, 23 }, |
{ "D0AW.1++", UNIT_RAM_D0, 21 }, |
{ "D0AW.1", UNIT_RAM_D0, 20 }, |
{ "D0BW.0+D0BWI.0++", UNIT_RAM_D0, 26 }, |
{ "D0BW.0+D0BWI.0", UNIT_RAM_D0, 26 }, |
{ "D0BW.0+D0BWI.1++", UNIT_RAM_D0, 27 }, |
{ "D0BW.0+D0BWI.1", UNIT_RAM_D0, 27 }, |
{ "D0BW.0++", UNIT_RAM_D0, 25 }, |
{ "D0BW.0", UNIT_RAM_D0, 24 }, |
{ "D0BWI.0", UNIT_RAM_D0, 18 }, |
{ "D0BWI.1", UNIT_RAM_D0, 19 }, |
{ "D0BW.1+D0BWI.0++", UNIT_RAM_D0, 30 }, |
{ "D0BW.1+D0BWI.0", UNIT_RAM_D0, 30 }, |
{ "D0BW.1+D0BWI.1++", UNIT_RAM_D0, 31 }, |
{ "D0BW.1+D0BWI.1", UNIT_RAM_D0, 31 }, |
{ "D0BW.1++", UNIT_RAM_D0, 29 }, |
{ "D0BW.1", UNIT_RAM_D0, 28 }, |
{ "D1AW.0+D1AWI.0++", UNIT_RAM_D1, 18 }, |
{ "D1AW.0+D1AWI.0", UNIT_RAM_D1, 18 }, |
{ "D1AW.0+D1AWI.1++", UNIT_RAM_D1, 19 }, |
{ "D1AW.0+D1AWI.1", UNIT_RAM_D1, 19 }, |
{ "D1AW.0++", UNIT_RAM_D1, 17 }, |
{ "D1AW.0", UNIT_RAM_D1, 16 }, |
{ "D1AWI.0", UNIT_RAM_D1, 18 }, |
{ "D1AWI.1", UNIT_RAM_D1, 19 }, |
{ "D1AW.1+D1AWI.0++", UNIT_RAM_D1, 22 }, |
{ "D1AW.1+D1AWI.0", UNIT_RAM_D1, 22 }, |
{ "D1AW.1+D1AWI.1++", UNIT_RAM_D1, 23 }, |
{ "D1AW.1+D1AWI.1", UNIT_RAM_D1, 23 }, |
{ "D1AW.1++", UNIT_RAM_D1, 21 }, |
{ "D1AW.1", UNIT_RAM_D1, 20 }, |
{ "D1BW.0+D1BWI.0++", UNIT_RAM_D1, 26 }, |
{ "D1BW.0+D1BWI.0", UNIT_RAM_D1, 26 }, |
{ "D1BW.0+D1BWI.1++", UNIT_RAM_D1, 27 }, |
{ "D1BW.0+D1BWI.1", UNIT_RAM_D1, 27 }, |
{ "D1BW.0++", UNIT_RAM_D1, 25 }, |
{ "D1BW.0", UNIT_RAM_D1, 24 }, |
{ "D1BWI.0", UNIT_RAM_D1, 18 }, |
{ "D1BWI.1", UNIT_RAM_D1, 19 }, |
{ "D1BW.1+D1BWI.0++", UNIT_RAM_D1, 30 }, |
{ "D1BW.1+D1BWI.0", UNIT_RAM_D1, 30 }, |
{ "D1BW.1+D1BWI.1++", UNIT_RAM_D1, 31 }, |
{ "D1BW.1+D1BWI.1", UNIT_RAM_D1, 31 }, |
{ "D1BW.1++", UNIT_RAM_D1, 29 }, |
{ "D1BW.1", UNIT_RAM_D1, 28 }, |
}, |
{ |
{ "D0AR.0+D0ARI.0++", UNIT_RAM_D0, 18 }, |
{ "D0AR.0+D0ARI.0", UNIT_RAM_D0, 18 }, |
{ "D0AR.0+D0ARI.1++", UNIT_RAM_D0, 19 }, |
{ "D0AR.0+D0ARI.1", UNIT_RAM_D0, 19 }, |
{ "D0AR.0++", UNIT_RAM_D0, 17 }, |
{ "D0AR.0", UNIT_RAM_D0, 16 }, |
{ "D0ARI.0", UNIT_RAM_D0, 18 }, |
{ "D0ARI.1", UNIT_RAM_D0, 19 }, |
{ "D0AR.1+D0ARI.0++", UNIT_RAM_D0, 22 }, |
{ "D0AR.1+D0ARI.0", UNIT_RAM_D0, 22 }, |
{ "D0AR.1+D0ARI.1++", UNIT_RAM_D0, 23 }, |
{ "D0AR.1+D0ARI.1", UNIT_RAM_D0, 23 }, |
{ "D0AR.1++", UNIT_RAM_D0, 21 }, |
{ "D0AR.1", UNIT_RAM_D0, 20 }, |
{ "D0BR.0+D0BRI.0++", UNIT_RAM_D0, 26 }, |
{ "D0BR.0+D0BRI.0", UNIT_RAM_D0, 26 }, |
{ "D0BR.0+D0BRI.1++", UNIT_RAM_D0, 27 }, |
{ "D0BR.0+D0BRI.1", UNIT_RAM_D0, 27 }, |
{ "D0BR.0++", UNIT_RAM_D0, 25 }, |
{ "D0BR.0", UNIT_RAM_D0, 24 }, |
{ "D0BRI.0", UNIT_RAM_D0, 18 }, |
{ "D0BRI.1", UNIT_RAM_D0, 19 }, |
{ "D0BR.1+D0BRI.0++", UNIT_RAM_D0, 30 }, |
{ "D0BR.1+D0BRI.0", UNIT_RAM_D0, 30 }, |
{ "D0BR.1+D0BRI.1++", UNIT_RAM_D0, 31 }, |
{ "D0BR.1+D0BRI.1", UNIT_RAM_D0, 31 }, |
{ "D0BR.1++", UNIT_RAM_D0, 29 }, |
{ "D0BR.1", UNIT_RAM_D0, 28 }, |
{ "D1AR.0+D1ARI.0++", UNIT_RAM_D1, 18 }, |
{ "D1AR.0+D1ARI.0", UNIT_RAM_D1, 18 }, |
{ "D1AR.0+D1ARI.1++", UNIT_RAM_D1, 19 }, |
{ "D1AR.0+D1ARI.1", UNIT_RAM_D1, 19 }, |
{ "D1AR.0++", UNIT_RAM_D1, 17 }, |
{ "D1AR.0", UNIT_RAM_D1, 16 }, |
{ "D1ARI.0", UNIT_RAM_D1, 18 }, |
{ "D1ARI.1", UNIT_RAM_D1, 19 }, |
{ "D1AR.1+D1ARI.0++", UNIT_RAM_D1, 22 }, |
{ "D1AR.1+D1ARI.0", UNIT_RAM_D1, 22 }, |
{ "D1AR.1+D1ARI.1++", UNIT_RAM_D1, 23 }, |
{ "D1AR.1+D1ARI.1", UNIT_RAM_D1, 23 }, |
{ "D1AR.1++", UNIT_RAM_D1, 21 }, |
{ "D1AR.1", UNIT_RAM_D1, 20 }, |
{ "D1BR.0+D1BRI.0++", UNIT_RAM_D1, 26 }, |
{ "D1BR.0+D1BRI.0", UNIT_RAM_D1, 26 }, |
{ "D1BR.0+D1BRI.1++", UNIT_RAM_D1, 27 }, |
{ "D1BR.0+D1BRI.1", UNIT_RAM_D1, 27 }, |
{ "D1BR.0++", UNIT_RAM_D1, 25 }, |
{ "D1BR.0", UNIT_RAM_D1, 24 }, |
{ "D1BR.1+D1BRI.0++", UNIT_RAM_D1, 30 }, |
{ "D1BR.1+D1BRI.0", UNIT_RAM_D1, 30 }, |
{ "D1BR.1+D1BRI.1++", UNIT_RAM_D1, 31 }, |
{ "D1BR.1+D1BRI.1", UNIT_RAM_D1, 31 }, |
{ "D1BR.1++", UNIT_RAM_D1, 29 }, |
{ "D1BR.1", UNIT_RAM_D1, 28 }, |
{ "D1BRI.0", UNIT_RAM_D1, 18 }, |
{ "D1BRI.1", UNIT_RAM_D1, 19 }, |
}, |
}; |
typedef struct |
{ |
const char * name; |
unsigned int part; |
} metag_acf; |
static const metag_acf metag_acftab[] = |
{ |
{ "ACF.0", 0}, |
{ "ACF.1", 1}, |
{ "ACF.2", 2}, |
{ "ACF.3", 3}, |
}; |
enum insn_encoding |
{ |
ENC_NONE, |
ENC_MOV_U2U, |
ENC_MOV_PORT, |
ENC_MMOV, |
ENC_MDRD, |
ENC_MOVL_TTREC, |
ENC_GET_SET, |
ENC_GET_SET_EXT, |
ENC_MGET_MSET, |
ENC_COND_SET, |
ENC_XFR, |
ENC_MOV_CT, |
ENC_SWAP, |
ENC_JUMP, |
ENC_CALLR, |
ENC_ALU, |
ENC_SHIFT, |
ENC_MIN_MAX, |
ENC_BITOP, |
ENC_CMP, |
ENC_BRANCH, |
ENC_KICK, |
ENC_SWITCH, |
ENC_CACHER, |
ENC_CACHEW, |
ENC_ICACHE, |
ENC_LNKGET, |
ENC_FMOV, |
ENC_FMMOV, |
ENC_FMOV_DATA, |
ENC_FMOV_I, |
ENC_FPACK, |
ENC_FSWAP, |
ENC_FCMP, |
ENC_FMINMAX, |
ENC_FCONV, |
ENC_FCONVX, |
ENC_FBARITH, |
ENC_FEARITH, |
ENC_FREC, |
ENC_FSIMD, |
ENC_FGET_SET_ACF, |
ENC_DGET_SET, |
ENC_DTEMPLATE, |
ENC_DALU, |
ENC_MAX, |
}; |
enum insn_type |
{ |
INSN_GP, |
INSN_FPU, |
INSN_DSP, |
INSN_DSP_FPU, |
}; |
typedef struct |
{ |
const char *name; |
unsigned int core_flags; |
#define CoreMeta11 0x1 /* The earliest Meta core we support */ |
#define CoreMeta12 0x2 |
#define CoreMeta21 0x4 |
#define FpuMeta21 0x21 |
#define DspMeta21 0x100 |
unsigned int meta_opcode; |
unsigned int meta_mask; |
enum insn_type insn_type; |
enum insn_encoding encoding; |
#define DSP_ARGS_1 0x0000001 /* De.r,Dx.r,De.r (3 register operands) */ |
#define DSP_ARGS_ACC2 0x0000002 /* Accumulator source operand 2 */ |
#define DSP_ARGS_QR 0x0000004 /* QUICKRoT */ |
#define DSP_ARGS_XACC 0x0000008 /* Cross-unit accumulator op */ |
#define DSP_ARGS_DACC 0x0000010 /* Target accumulator as destination */ |
#define DSP_ARGS_SRD 0x0000020 /* Source the RD port */ |
#define DSP_ARGS_2 0x0000040 /* De.r,Dx.r (2 register operands) */ |
#define DSP_ARGS_DSP_SRC1 0x0000080 /* Source a DSP register */ |
#define DSP_ARGS_DSP_SRC2 0x0000100 /* Source a DSP register */ |
#define DSP_ARGS_IMM 0x0000200 /* Immediate value for src 2 */ |
#define DSP_ARGS_SPLIT8 0x0000400 /* Data unit split 8 operations */ |
#define DSP_ARGS_12 0x0000800 /* De.r,Dx.r */ |
#define DSP_ARGS_13 0x0001000 /* Dx.r,Rx.r */ |
#define DSP_ARGS_14 0x0002000 /* DSPe.r,Dx.r */ |
#define DSP_ARGS_15 0x0004000 /* DSPx.r,#I16 */ |
#define DSP_ARGS_16 0x0008000 /* De.r,DSPx.r */ |
#define DSP_ARGS_17 0x0010000 /* De.r|ACe.r,Dx.r,Rx.r|RD */ |
#define DSP_ARGS_18 0x0020000 /* De.r,Dx.r|ACx.r */ |
#define DSP_ARGS_20 0x0080000 /* De.r,Dx.r|ACx.r,De.r */ |
#define DSP_ARGS_21 0x0100000 /* De.r,Dx.r|ACx.r,#I5 */ |
#define DSP_ARGS_22 0x0200000 /* De.r,Dx.r|ACx.r,De.r|#I5 */ |
#define DSP_ARGS_23 0x0400000 /* Ux.r,Dx.r|ACx.r,De.r|#I5 */ |
#define GP_ARGS_QR 0x0000001 /* QUICKRoT */ |
unsigned int arg_type; |
} insn_template; |
enum major_opcode |
{ |
OPC_ADD, |
OPC_SUB, |
OPC_AND, |
OPC_OR, |
OPC_XOR, |
OPC_SHIFT, |
OPC_MUL, |
OPC_CMP, |
OPC_ADDR, |
OPC_9, |
OPC_MISC, |
OPC_SET, |
OPC_GET, |
OPC_XFR, |
OPC_CPR, |
OPC_FPU, |
}; |
#define GET_EXT_MINOR 0x7 |
#define MOV_EXT_MINOR 0x6 |
#define MOVL_MINOR 0x2 |
#define MAJOR_OPCODE(opcode) (((opcode) >> 28) & 0xf) |
#define MINOR_OPCODE(opcode) (((opcode) >> 24) & 0xf) |
enum cond_code |
{ |
COND_A, |
COND_EQ, |
COND_NE, |
COND_CS, |
COND_CC, |
COND_MI, |
COND_PL, |
COND_VS, |
COND_VC, |
COND_HI, |
COND_LS, |
COND_GE, |
COND_LT, |
COND_GT, |
COND_LE, |
COND_NV, |
}; |
enum scond_code |
{ |
SCOND_A, |
SCOND_LEQ, |
SCOND_LNE, |
SCOND_LLO, |
SCOND_LHS, |
SCOND_HEQ, |
SCOND_HNE, |
SCOND_HLO, |
SCOND_HHS, |
SCOND_LGR, |
SCOND_LLE, |
SCOND_HGR, |
SCOND_HLE, |
SCOND_EEQ, |
SCOND_ELO, |
SCOND_NV, |
}; |
typedef struct |
{ |
const char *name; |
enum scond_code code; |
} split_condition; |
static const split_condition metag_scondtab[] = |
{ |
{ "LEQ", SCOND_LEQ }, |
{ "LEZ", SCOND_LEQ }, |
{ "LNE", SCOND_LNE }, |
{ "LNZ", SCOND_LNE }, |
{ "LLO", SCOND_LLO }, |
{ "LCS", SCOND_LLO }, |
{ "LHS", SCOND_LHS }, |
{ "LCC", SCOND_LHS }, |
{ "HEQ", SCOND_HEQ }, |
{ "HEZ", SCOND_HEQ }, |
{ "HNE", SCOND_HNE }, |
{ "HNZ", SCOND_HNE }, |
{ "HLO", SCOND_HLO }, |
{ "HCS", SCOND_HLO }, |
{ "HHS", SCOND_HHS }, |
{ "HCC", SCOND_HHS }, |
{ "LGR", SCOND_LGR }, |
{ "LHI", SCOND_LGR }, |
{ "LLE", SCOND_LLE }, |
{ "LLS", SCOND_LLE }, |
{ "HGR", SCOND_HGR }, |
{ "HHI", SCOND_HGR }, |
{ "HLE", SCOND_HLE }, |
{ "HLS", SCOND_HLE }, |
{ "EEQ", SCOND_EEQ }, |
{ "EEZ", SCOND_EEQ }, |
{ "ELO", SCOND_ELO }, |
{ "ECS", SCOND_ELO }, |
}; |
static const split_condition metag_dsp_scondtab[] = |
{ |
{ "LEQ", SCOND_LEQ }, |
{ "LEZ", SCOND_LEQ }, |
{ "LNE", SCOND_LNE }, |
{ "LNZ", SCOND_LNE }, |
{ "LCS", SCOND_LLO }, |
{ "LLO", SCOND_LLO }, |
{ "LCC", SCOND_LHS }, |
{ "LHS", SCOND_LHS }, |
{ "HEQ", SCOND_HEQ }, |
{ "HEZ", SCOND_HEQ }, |
{ "HNE", SCOND_HNE }, |
{ "HNZ", SCOND_HNE }, |
{ "HCS", SCOND_HLO }, |
{ "HLO", SCOND_HLO }, |
{ "HCC", SCOND_HHS }, |
{ "HHS", SCOND_HHS }, |
{ "LHI", SCOND_LGR }, |
{ "LGR", SCOND_LGR }, |
{ "LLS", SCOND_LLE }, |
{ "LLE", SCOND_LLE }, |
{ "HHI", SCOND_HGR }, |
{ "HGR", SCOND_HGR }, |
{ "HLS", SCOND_HLE }, |
{ "HLE", SCOND_HLE }, |
{ "EEQ", SCOND_EEQ }, |
{ "EEZ", SCOND_EEQ }, |
{ "ECS", SCOND_ELO }, |
{ "ELO", SCOND_ELO }, |
}; |
static const split_condition metag_fpu_scondtab[] = |
{ |
{ "LEQ", SCOND_LEQ }, |
{ "LEZ", SCOND_LEQ }, |
{ "LNE", SCOND_LNE }, |
{ "LNZ", SCOND_LNE }, |
{ "LLO", SCOND_LLO }, |
{ "LCS", SCOND_LLO }, |
{ "LHS", SCOND_LHS }, |
{ "LCC", SCOND_LHS }, |
{ "HEQ", SCOND_HEQ }, |
{ "HEZ", SCOND_HEQ }, |
{ "HNE", SCOND_HNE }, |
{ "HNZ", SCOND_HNE }, |
{ "HLO", SCOND_HLO }, |
{ "HCS", SCOND_HLO }, |
{ "HHS", SCOND_HHS }, |
{ "HCC", SCOND_HHS }, |
{ "LGR", SCOND_LGR }, |
{ "LHI", SCOND_LGR }, |
{ "LLE", SCOND_LLE }, |
{ "LLS", SCOND_LLE }, |
{ "HGR", SCOND_HGR }, |
{ "HHI", SCOND_HGR }, |
{ "HLE", SCOND_HLE }, |
{ "HLS", SCOND_HLE }, |
{ "EEQ", SCOND_EEQ }, |
{ "EEZ", SCOND_EEQ }, |
{ "ELO", SCOND_ELO }, |
{ "ECS", SCOND_ELO }, |
}; |
enum fcond_code |
{ |
FCOND_A, |
FCOND_FEQ, |
FCOND_UNE, |
FCOND_FLT, |
FCOND_UGE, |
FCOND_UVS = 7, |
FCOND_FVC, |
FCOND_UGT, |
FCOND_FLE, |
FCOND_FGE, |
FCOND_ULT, |
FCOND_FGT, |
FCOND_ULE, |
FCOND_NV, |
}; |
#define COND_INSN(mnemonic, suffix, field_shift, flags, meta_opcode, \ |
meta_mask, insn_type, encoding, args) \ |
{ mnemonic suffix, flags, meta_opcode, meta_mask, \ |
insn_type, encoding, args }, \ |
{ mnemonic "A" suffix, flags, meta_opcode, meta_mask, \ |
insn_type, encoding, args }, \ |
{ mnemonic "EQ" suffix, flags, meta_opcode | (COND_EQ << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "Z" suffix, flags, meta_opcode | (COND_EQ << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "NE" suffix, flags, meta_opcode | (COND_NE << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "NZ" suffix, flags, meta_opcode | (COND_NE << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "CS" suffix, flags, meta_opcode | (COND_CS << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "LO" suffix, flags, meta_opcode | (COND_CS << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "CC" suffix, flags, meta_opcode | (COND_CC << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "HS" suffix, flags, meta_opcode | (COND_CC << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "MI" suffix, flags, meta_opcode | (COND_MI << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "N" suffix, flags, meta_opcode | (COND_MI << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "PL" suffix, flags, meta_opcode | (COND_PL << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "NC" suffix, flags, meta_opcode | (COND_PL << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "VS" suffix, flags, meta_opcode | (COND_VS << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "VC" suffix, flags, meta_opcode | (COND_VC << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "HI" suffix, flags, meta_opcode | (COND_HI << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "LS" suffix, flags, meta_opcode | (COND_LS << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "GE" suffix, flags, meta_opcode | (COND_GE << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "LT" suffix, flags, meta_opcode | (COND_LT << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "GT" suffix, flags, meta_opcode | (COND_GT << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "LE" suffix, flags, meta_opcode | (COND_LE << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "NV" suffix, flags, meta_opcode | (COND_NV << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "FEQ" suffix, flags, meta_opcode | \ |
(FCOND_FEQ << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "FZ" suffix, flags, meta_opcode | \ |
(FCOND_FEQ << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "UNE" suffix, flags, meta_opcode | \ |
(FCOND_UNE << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "UNZ" suffix, flags, meta_opcode | \ |
(FCOND_UNE << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "FLT" suffix, flags, meta_opcode | \ |
(FCOND_FLT << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "FLO" suffix, flags, meta_opcode | \ |
(FCOND_FLT << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "UGE" suffix, flags, meta_opcode | \ |
(FCOND_UGE << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "UHS" suffix, flags, meta_opcode | \ |
(FCOND_UGE << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "UVS" suffix, flags, meta_opcode | \ |
(FCOND_UVS << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "FVC" suffix, flags, meta_opcode | \ |
(FCOND_FVC << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "UGT" suffix, flags, meta_opcode | \ |
(FCOND_UGT << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "UHI" suffix, flags, meta_opcode | \ |
(FCOND_UGT << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "FLE" suffix, flags, meta_opcode | \ |
(FCOND_FLE << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "FGE" suffix, flags, meta_opcode | \ |
(FCOND_FGE << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "FHS" suffix, flags, meta_opcode | \ |
(FCOND_FGE << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "ULT" suffix, flags, meta_opcode | \ |
(FCOND_ULT << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "ULO" suffix, flags, meta_opcode | \ |
(FCOND_ULT << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "FGT" suffix, flags, meta_opcode | \ |
(FCOND_FGT << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "FHI" suffix, flags, meta_opcode | \ |
(FCOND_FGT << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "ULE" suffix, flags, meta_opcode | \ |
(FCOND_ULE << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "NV" suffix, flags, meta_opcode | \ |
(FCOND_NV << field_shift), meta_mask, INSN_FPU, encoding, args } |
#define FCOND_INSN(mnemonic, suffix, field_shift, flags, meta_opcode, \ |
meta_mask, insn_type, encoding, args) \ |
{ mnemonic suffix, flags, meta_opcode, meta_mask, \ |
insn_type, encoding, args }, \ |
{ mnemonic "A" suffix, flags, meta_opcode, meta_mask, \ |
insn_type, encoding, args }, \ |
{ mnemonic "FEQ" suffix, flags, meta_opcode | \ |
(FCOND_FEQ << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "FZ" suffix, flags, meta_opcode | \ |
(FCOND_FEQ << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "UNE" suffix, flags, meta_opcode | \ |
(FCOND_UNE << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "UNZ" suffix, flags, meta_opcode | \ |
(FCOND_UNE << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "FLO" suffix, flags, meta_opcode | \ |
(FCOND_FLT << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "FLT" suffix, flags, meta_opcode | \ |
(FCOND_FLT << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "UHS" suffix, flags, meta_opcode | \ |
(FCOND_UGE << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "UGE" suffix, flags, meta_opcode | \ |
(FCOND_UGE << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "UVS" suffix, flags, meta_opcode | \ |
(FCOND_UVS << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "FVC" suffix, flags, meta_opcode | \ |
(FCOND_FVC << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "UHI" suffix, flags, meta_opcode | \ |
(FCOND_UGT << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "UGT" suffix, flags, meta_opcode | \ |
(FCOND_UGT << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "FLE" suffix, flags, meta_opcode | \ |
(FCOND_FLE << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "FGE" suffix, flags, meta_opcode | \ |
(FCOND_FGE << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "FHS" suffix, flags, meta_opcode | \ |
(FCOND_FGE << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "ULT" suffix, flags, meta_opcode | \ |
(FCOND_ULT << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "ULO" suffix, flags, meta_opcode | \ |
(FCOND_ULT << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "FGT" suffix, flags, meta_opcode | \ |
(FCOND_FGT << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "FHI" suffix, flags, meta_opcode | \ |
(FCOND_FGT << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "ULE" suffix, flags, meta_opcode | \ |
(FCOND_ULE << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "NV" suffix, flags, meta_opcode | \ |
(FCOND_NV << field_shift), meta_mask, INSN_FPU, encoding, args }, \ |
{ mnemonic "EQ" suffix, flags, meta_opcode | (COND_EQ << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "Z" suffix, flags, meta_opcode | (COND_EQ << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "NE" suffix, flags, meta_opcode | (COND_NE << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "NZ" suffix, flags, meta_opcode | (COND_NE << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "CS" suffix, flags, meta_opcode | (COND_CS << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "LO" suffix, flags, meta_opcode | (COND_CS << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "CC" suffix, flags, meta_opcode | (COND_CC << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "HS" suffix, flags, meta_opcode | (COND_CC << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "MI" suffix, flags, meta_opcode | (COND_MI << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "N" suffix, flags, meta_opcode | (COND_MI << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "PL" suffix, flags, meta_opcode | (COND_PL << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "NC" suffix, flags, meta_opcode | (COND_PL << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "VS" suffix, flags, meta_opcode | (COND_VS << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "VC" suffix, flags, meta_opcode | (COND_VC << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "HI" suffix, flags, meta_opcode | (COND_HI << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "LS" suffix, flags, meta_opcode | (COND_LS << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "GE" suffix, flags, meta_opcode | (COND_GE << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "LT" suffix, flags, meta_opcode | (COND_LT << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "GT" suffix, flags, meta_opcode | (COND_GT << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "LE" suffix, flags, meta_opcode | (COND_LE << field_shift), \ |
meta_mask, insn_type, encoding, args }, \ |
{ mnemonic "NV" suffix, flags, meta_opcode | (COND_NV << field_shift), \ |
meta_mask, insn_type, encoding, args } |
#define TEMPLATE_INSN(flags, meta_opcode, meta_mask, insn_type) \ |
{ "T0", flags, meta_opcode | 0x0, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \ |
{ "T1", flags, meta_opcode | 0x1, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \ |
{ "T2", flags, meta_opcode | 0x2, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \ |
{ "T3", flags, meta_opcode | 0x3, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \ |
{ "T4", flags, meta_opcode | 0x4, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \ |
{ "T5", flags, meta_opcode | 0x5, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \ |
{ "T6", flags, meta_opcode | 0x6, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \ |
{ "T7", flags, meta_opcode | 0x7, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \ |
{ "T8", flags, meta_opcode | 0x8, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \ |
{ "T9", flags, meta_opcode | 0x9, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \ |
{ "TA", flags, meta_opcode | 0xa, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \ |
{ "TB", flags, meta_opcode | 0xb, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \ |
{ "TC", flags, meta_opcode | 0xc, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \ |
{ "TD", flags, meta_opcode | 0xd, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \ |
{ "TE", flags, meta_opcode | 0xe, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \ |
{ "TF", flags, meta_opcode | 0xf, meta_mask, insn_type, ENC_DTEMPLATE, 0 } |
/* Unimplemented GP instructions: |
CPR - coprocessor read |
CPW - coprocessor write |
MORT - morton order operation |
VPACK, VADD, VSUB - vector instructions |
The order of the entries in this table is extremely important. DO |
NOT modify it unless you know what you're doing. If you do modify |
it, be sure to run the entire testsuite to make sure you haven't |
caused a regression. */ |
static const insn_template metag_optab[] = |
{ |
/* Port-to-unit MOV */ |
COND_INSN ("MOVB", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0xa1800000, 0xfff83e1f, INSN_GP, ENC_MOV_PORT, 0), |
COND_INSN ("MOVW", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0xa1800001, 0xfff83e1f, INSN_GP, ENC_MOV_PORT, 0), |
COND_INSN ("MOVD", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0xa1800200, 0xfff83e1f, INSN_GP, ENC_MOV_PORT, 0), |
COND_INSN ("MOVL", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0xa2800000, 0xfff8019f, INSN_GP, ENC_MOV_PORT, 0), |
/* Read pipeline prime/drain */ |
{ "MMOVD", CoreMeta11|CoreMeta12|CoreMeta21, |
0xca000000, 0xff00001f, INSN_GP, ENC_MMOV, 0 }, |
{ "MMOVL", CoreMeta11|CoreMeta12|CoreMeta21, |
0xcb000000, 0xff00001f, INSN_GP, ENC_MMOV, 0 }, |
{ "MMOVD", CoreMeta11|CoreMeta12|CoreMeta21, |
0xcc000000, 0xff07c067, INSN_GP, ENC_MMOV, 0 }, |
{ "MMOVL", CoreMeta11|CoreMeta12|CoreMeta21, |
0xcd000000, 0xff07c067, INSN_GP, ENC_MMOV, 0 }, |
/* Read pipeline flush */ |
{ "MDRD", CoreMeta11|CoreMeta12|CoreMeta21, |
0xcc000002, 0xffffc07f, INSN_GP, ENC_MDRD, 0 }, |
/* Unit-to-TTREC MOVL */ |
COND_INSN ("MOVL", "", 1, CoreMeta12|CoreMeta21, |
0xa2002001, 0xff003e7f, INSN_GP, ENC_MOVL_TTREC, 0), |
/* MOV to RA (extended) */ |
{ "MOVB", CoreMeta11|CoreMeta12|CoreMeta21, |
0xa6000000, 0xff00001e, INSN_GP, ENC_GET_SET_EXT, 0 }, |
{ "MOVW", CoreMeta11|CoreMeta12|CoreMeta21, |
0xa6000002, 0xff00001e, INSN_GP, ENC_GET_SET_EXT, 0 }, |
{ "MOVD", CoreMeta11|CoreMeta12|CoreMeta21, |
0xa6000004, 0xff00001e, INSN_GP, ENC_GET_SET_EXT, 0 }, |
{ "MOVL", CoreMeta11|CoreMeta12|CoreMeta21, |
0xa6000006, 0xff00001e, INSN_GP, ENC_GET_SET_EXT, 0 }, |
/* Extended GET */ |
{ "GETB", CoreMeta11|CoreMeta12|CoreMeta21, |
0xa7000000, 0xff000006, INSN_GP, ENC_GET_SET_EXT, 0 }, |
{ "GETW", CoreMeta11|CoreMeta12|CoreMeta21, |
0xa7000002, 0xff000006, INSN_GP, ENC_GET_SET_EXT, 0 }, |
{ "GETD", CoreMeta11|CoreMeta12|CoreMeta21, |
0xa7000004, 0xff000006, INSN_GP, ENC_GET_SET_EXT, 0 }, |
{ "GETL", CoreMeta11|CoreMeta12|CoreMeta21, |
0xa7000006, 0xff000006, INSN_GP, ENC_GET_SET_EXT, 0 }, |
/* Extended SET */ |
{ "SETB", CoreMeta11|CoreMeta12|CoreMeta21, |
0xa5000000, 0xff000006, INSN_GP, ENC_GET_SET_EXT, 0 }, |
{ "SETW", CoreMeta11|CoreMeta12|CoreMeta21, |
0xa5000002, 0xff000006, INSN_GP, ENC_GET_SET_EXT, 0 }, |
{ "SETD", CoreMeta11|CoreMeta12|CoreMeta21, |
0xa5000004, 0xff000006, INSN_GP, ENC_GET_SET_EXT, 0 }, |
{ "SETL", CoreMeta11|CoreMeta12|CoreMeta21, |
0xa5000006, 0xff000006, INSN_GP, ENC_GET_SET_EXT, 0 }, |
/* MOV to RA */ |
{ "MOVB", CoreMeta11|CoreMeta12|CoreMeta21, |
0xc000000c, 0xfd00001e, INSN_GP, ENC_GET_SET, 0 }, |
{ "MOVW", CoreMeta11|CoreMeta12|CoreMeta21, |
0xc100000c, 0xfd00001e, INSN_GP, ENC_GET_SET, 0 }, |
{ "MOVD", CoreMeta11|CoreMeta12|CoreMeta21, |
0xc400000c, 0xfd00001e, INSN_GP, ENC_GET_SET, 0 }, |
{ "MOVL", CoreMeta11|CoreMeta12|CoreMeta21, |
0xc500000c, 0xfd00001e, INSN_GP, ENC_GET_SET, 0 }, |
/* Standard GET */ |
{ "GETB", CoreMeta11|CoreMeta12|CoreMeta21, |
0xc0000000, 0xfd000000, INSN_GP, ENC_GET_SET, 0 }, |
{ "GETW", CoreMeta11|CoreMeta12|CoreMeta21, |
0xc1000000, 0xfd000000, INSN_GP, ENC_GET_SET, 0 }, |
{ "GETD", CoreMeta11|CoreMeta12|CoreMeta21, |
0xc4000000, 0xfd000000, INSN_GP, ENC_GET_SET, 0 }, |
/* GET is a synonym for GETD. */ |
{ "GET", CoreMeta11|CoreMeta12|CoreMeta21, |
0xc4000000, 0xfd000000, INSN_GP, ENC_GET_SET, 0 }, |
{ "GETL", CoreMeta11|CoreMeta12|CoreMeta21, |
0xc5000000, 0xfd000000, INSN_GP, ENC_GET_SET, 0 }, |
/* Standard SET */ |
{ "SETB", CoreMeta11|CoreMeta12|CoreMeta21, |
0xb0000000, 0xfd000000, INSN_GP, ENC_GET_SET, 0 }, |
{ "SETW", CoreMeta11|CoreMeta12|CoreMeta21, |
0xb1000000, 0xfd000000, INSN_GP, ENC_GET_SET, 0 }, |
{ "SETD", CoreMeta11|CoreMeta12|CoreMeta21, |
0xb4000000, 0xfd000000, INSN_GP, ENC_GET_SET, 0 }, |
/* SET is a synonym for SETD. */ |
{ "SET", CoreMeta11|CoreMeta12|CoreMeta21, |
0xb4000000, 0xfd000000, INSN_GP, ENC_GET_SET, 0 }, |
{ "SETL", CoreMeta11|CoreMeta12|CoreMeta21, |
0xb5000000, 0xfd000000, INSN_GP, ENC_GET_SET, 0 }, |
/* Multiple GET */ |
{ "MGETD", CoreMeta11|CoreMeta12|CoreMeta21, |
0xc8000000, 0xff000007, INSN_GP, ENC_MGET_MSET, 0 }, |
{ "MGETL", CoreMeta11|CoreMeta12|CoreMeta21, |
0xc9000000, 0xff000007, INSN_GP, ENC_MGET_MSET, 0 }, |
/* Multiple SET */ |
{ "MSETD", CoreMeta11|CoreMeta12|CoreMeta21, |
0xb8000000, 0xff000007, INSN_GP, ENC_MGET_MSET, 0 }, |
{ "MSETL", CoreMeta11|CoreMeta12|CoreMeta21, |
0xb9000000, 0xff000007, INSN_GP, ENC_MGET_MSET, 0 }, |
/* Conditional SET */ |
COND_INSN ("SETB", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0xa4000000, 0xff00039f, INSN_GP, ENC_COND_SET, 0), |
COND_INSN ("SETW", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0xa4000001, 0xff00039f, INSN_GP, ENC_COND_SET, 0), |
COND_INSN ("SETD", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0xa4000200, 0xff00039f, INSN_GP, ENC_COND_SET, 0), |
COND_INSN ("SETL", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0xa4000201, 0xff00039f, INSN_GP, ENC_COND_SET, 0), |
{ "XFRD", CoreMeta11|CoreMeta12|CoreMeta21, |
0xd0000000, 0xf2000000, INSN_GP, ENC_XFR, 0 }, |
{ "XFRL", CoreMeta11|CoreMeta12|CoreMeta21, |
0xd2000000, 0xf2000000, INSN_GP, ENC_XFR, 0 }, |
/* Fast control register setup */ |
{ "MOV", CoreMeta11|CoreMeta12|CoreMeta21, |
0xa9000000, 0xff000005, INSN_GP, ENC_MOV_CT, 0 }, |
{ "MOVT", CoreMeta11|CoreMeta12|CoreMeta21, |
0xa9000001, 0xff000005, INSN_GP, ENC_MOV_CT, 0 }, |
{ "MOV", CoreMeta11|CoreMeta12|CoreMeta21, |
0xa9000004, 0xff000005, INSN_GP, ENC_MOV_CT, 0 }, |
{ "MOVT", CoreMeta11|CoreMeta12|CoreMeta21, |
0xa9000005, 0xff000005, INSN_GP, ENC_MOV_CT, 0 }, |
/* Internal transfer operations */ |
{ "JUMP", CoreMeta11|CoreMeta12|CoreMeta21, |
0xac000000, 0xff000004, INSN_GP, ENC_JUMP, 0 }, |
{ "CALL", CoreMeta11|CoreMeta12|CoreMeta21, |
0xac000004, 0xff000004, INSN_GP, ENC_JUMP, 0 }, |
{ "CALLR", CoreMeta11|CoreMeta12|CoreMeta21, |
0xab000000, 0xff000000, INSN_GP, ENC_CALLR, 0 }, |
/* Address unit ALU operations */ |
{ "MOV", CoreMeta11|CoreMeta12|CoreMeta21, |
0x80000004, 0xfe0001fc, INSN_GP, ENC_ALU, 0 }, |
{ "MOV", CoreMeta11|CoreMeta12|CoreMeta21, |
0x82000004, 0xfe000005, INSN_GP, ENC_ALU, 0 }, |
{ "MOVT", CoreMeta11|CoreMeta12|CoreMeta21, |
0x82000005, 0xfe000005, INSN_GP, ENC_ALU, 0 }, |
{ "ADD", CoreMeta11|CoreMeta12|CoreMeta21, |
0x80000000, 0xfe0001fc, INSN_GP, ENC_ALU, 0 }, |
{ "ADD", CoreMeta11|CoreMeta12|CoreMeta21, |
0x82000000, 0xfe000005, INSN_GP, ENC_ALU, 0 }, |
{ "ADDT", CoreMeta11|CoreMeta12|CoreMeta21, |
0x82000001, 0xfe000005, INSN_GP, ENC_ALU, 0 }, |
{ "ADD", CoreMeta11|CoreMeta12|CoreMeta21, |
0x86000020, 0xfe000021, INSN_GP, ENC_ALU, 0 }, |
COND_INSN ("ADD", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x84000000, 0xfe00001e, INSN_GP, ENC_ALU, 0), |
COND_INSN ("ADD", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x86000000, 0xfe00003f, INSN_GP, ENC_ALU, 0), |
{ "NEG", CoreMeta11|CoreMeta12|CoreMeta21, |
0x88000004, 0xfe0001fc, INSN_GP, ENC_ALU, 0 }, |
{ "NEG", CoreMeta11|CoreMeta12|CoreMeta21, |
0x8a000004, 0xfe000005, INSN_GP, ENC_ALU, 0 }, |
{ "NEGT", CoreMeta11|CoreMeta12|CoreMeta21, |
0x8a000005, 0xfe000005, INSN_GP, ENC_ALU, 0 }, |
{ "SUB", CoreMeta11|CoreMeta12|CoreMeta21, |
0x88000000, 0xfe0001fc, INSN_GP, ENC_ALU, 0 }, |
{ "SUB", CoreMeta11|CoreMeta12|CoreMeta21, |
0x8a000000, 0xfe000005, INSN_GP, ENC_ALU, 0 }, |
{ "SUBT", CoreMeta11|CoreMeta12|CoreMeta21, |
0x8a000001, 0xfe000005, INSN_GP, ENC_ALU, 0 }, |
{ "SUB", CoreMeta11|CoreMeta12|CoreMeta21, |
0x8e000020, 0xfe000021, INSN_GP, ENC_ALU, 0 }, |
COND_INSN ("SUB", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x8c000000, 0xfe00001e, INSN_GP, ENC_ALU, 0), |
COND_INSN ("SUB", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x8e000000, 0xfe00003f, INSN_GP, ENC_ALU, 0), |
/* Data unit ALU operations */ |
{ "MOV", CoreMeta11|CoreMeta12|CoreMeta21, |
0x00000004, 0xfe0001fc, INSN_GP, ENC_ALU, 0 }, |
{ "MOVS", CoreMeta11|CoreMeta12|CoreMeta21, |
0x08000004, 0xfe0001fc, INSN_GP, ENC_ALU, 0 }, |
{ "MOV", CoreMeta11|CoreMeta12|CoreMeta21, |
0x02000004, 0xfe000005, INSN_GP, ENC_ALU, 0 }, |
{ "MOVS", CoreMeta11|CoreMeta12|CoreMeta21, |
0x0a000004, 0xfe000005, INSN_GP, ENC_ALU, 0 }, |
{ "MOVT", CoreMeta11|CoreMeta12|CoreMeta21, |
0x02000005, 0xfe000007, INSN_GP, ENC_ALU, 0 }, |
{ "MOVST", CoreMeta11|CoreMeta12|CoreMeta21, |
0x0a000005, 0xfe000007, INSN_GP, ENC_ALU, 0 }, |
{ "ADD", DspMeta21, |
0x00000100, 0xfe000104, INSN_DSP, ENC_DALU, |
DSP_ARGS_1|DSP_ARGS_ACC2|DSP_ARGS_XACC|DSP_ARGS_IMM }, |
{ "ADD", DspMeta21, |
0x02000003, 0xfe000003, INSN_DSP, ENC_DALU, |
DSP_ARGS_1|DSP_ARGS_IMM }, |
COND_INSN ("ADD", "", 1, DspMeta21, |
0x040001e0, 0xfe0001fe, INSN_DSP, ENC_DALU, DSP_ARGS_1), |
{ "ADD", CoreMeta11|CoreMeta12|CoreMeta21, |
0x00000000, 0xfe0001fc, INSN_GP, ENC_ALU, 0 }, |
{ "ADDS", DspMeta21, |
0x08000100, 0xfe000104, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_ACC2 }, |
{ "ADDS", DspMeta21, |
0x0a000003, 0xfe000003, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_IMM }, |
{ "ADDS", CoreMeta11|CoreMeta12|CoreMeta21, |
0x08000000, 0xfe0001fc, INSN_GP, ENC_ALU, 0 }, |
{ "ADD", CoreMeta11|CoreMeta12|CoreMeta21, |
0x02000000, 0xfe000005, INSN_GP, ENC_ALU, 0 }, |
{ "ADDS", CoreMeta11|CoreMeta12|CoreMeta21, |
0x0a000000, 0xfe000005, INSN_GP, ENC_ALU, 0 }, |
{ "ADDT", CoreMeta11|CoreMeta12|CoreMeta21, |
0x02000001, 0xfe000005, INSN_GP, ENC_ALU, 0 }, |
{ "ADDST", CoreMeta11|CoreMeta12|CoreMeta21, |
0x0a000001, 0xfe000005, INSN_GP, ENC_ALU, 0 }, |
{ "ADD", CoreMeta11|CoreMeta12|CoreMeta21, |
0x06000020, 0xfe000021, INSN_GP, ENC_ALU, 0 }, |
COND_INSN ("ADDS", "", 1, DspMeta21, |
0x0c0001e0, 0xfe0001fe, INSN_DSP, ENC_DALU, DSP_ARGS_1), |
{ "ADDS", CoreMeta11|CoreMeta12|CoreMeta21, |
0x0e000020, 0xfe000021, INSN_GP, ENC_ALU, 0 }, |
COND_INSN ("ADD", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x04000000, 0xfe00001e, INSN_GP, ENC_ALU, 0), |
COND_INSN ("ADDS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x0c000000, 0xfe00001e, INSN_GP, ENC_ALU, 0), |
COND_INSN ("ADD", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x06000000, 0xfe00003f, INSN_GP, ENC_ALU, 0), |
COND_INSN ("ADDS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x0e000000, 0xfe00003f, INSN_GP, ENC_ALU, 0), |
{ "NEG", CoreMeta11|CoreMeta12|CoreMeta21, |
0x10000004, 0xfe0001fc, INSN_GP, ENC_ALU, 0 }, |
{ "NEGS", CoreMeta11|CoreMeta12|CoreMeta21, |
0x18000004, 0xfe0001fc, INSN_GP, ENC_ALU, 0 }, |
{ "NEG", CoreMeta11|CoreMeta12|CoreMeta21, |
0x12000004, 0xfe000005, INSN_GP, ENC_ALU, 0 }, |
{ "NEGS", CoreMeta11|CoreMeta12|CoreMeta21, |
0x1a000004, 0xfe000005, INSN_GP, ENC_ALU, 0 }, |
{ "NEGT", CoreMeta11|CoreMeta12|CoreMeta21, |
0x12000005, 0xfe000007, INSN_GP, ENC_ALU, 0 }, |
{ "NEGST", CoreMeta11|CoreMeta12|CoreMeta21, |
0x1a000005, 0xfe000007, INSN_GP, ENC_ALU, 0 }, |
{ "SUB", DspMeta21, |
0x10000100, 0xfe000104, INSN_DSP, ENC_DALU, |
DSP_ARGS_1|DSP_ARGS_ACC2|DSP_ARGS_XACC }, |
{ "SUB", DspMeta21, |
0x12000003, 0xfe000003, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_IMM }, |
{ "SUB", CoreMeta11|CoreMeta12|CoreMeta21, |
0x10000000, 0xfe0001fc, INSN_GP, ENC_ALU, 0 }, |
{ "SUBS", CoreMeta11|CoreMeta12|CoreMeta21, |
0x18000000, 0xfe0001fc, INSN_GP, ENC_ALU, 0 }, |
{ "SUB", CoreMeta11|CoreMeta12|CoreMeta21, |
0x12000000, 0xfe000005, INSN_GP, ENC_ALU, 0 }, |
{ "SUBS", CoreMeta11|CoreMeta12|CoreMeta21, |
0x1a000000, 0xfe000005, INSN_GP, ENC_ALU, 0 }, |
{ "SUBT", CoreMeta11|CoreMeta12|CoreMeta21, |
0x12000001, 0xfe000005, INSN_GP, ENC_ALU, 0 }, |
{ "SUBS", DspMeta21, |
0x18000100, 0xfe000104, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_ACC2 }, |
{ "SUBS", DspMeta21, |
0x1a000003, 0xfe000003, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_IMM }, |
{ "SUBST", CoreMeta11|CoreMeta12|CoreMeta21, |
0x1a000001, 0xfe000005, INSN_GP, ENC_ALU, 0 }, |
{ "SUB", CoreMeta11|CoreMeta12|CoreMeta21, |
0x16000020, 0xfe000021, INSN_GP, ENC_ALU, 0 }, |
{ "SUBS", CoreMeta11|CoreMeta12|CoreMeta21, |
0x1e000020, 0xfe000021, INSN_GP, ENC_ALU, 0 }, |
COND_INSN ("SUBS", "", 1, DspMeta21, |
0x1c0001e0, 0xfe0001fe, INSN_DSP, ENC_DALU, DSP_ARGS_1), |
COND_INSN ("SUB", "", 1, DspMeta21, |
0x140001e0, 0xfe0001fe, INSN_DSP, ENC_DALU, DSP_ARGS_1), |
COND_INSN ("SUB", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x14000000, 0xfe00001e, INSN_GP, ENC_ALU, 0), |
COND_INSN ("SUBS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x1c000000, 0xfe00001e, INSN_GP, ENC_ALU, 0), |
COND_INSN ("SUB", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x16000000, 0xfe00003f, INSN_GP, ENC_ALU, 0), |
COND_INSN ("SUBS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x1e000000, 0xfe00003f, INSN_GP, ENC_ALU, 0), |
{ "AND", CoreMeta11|CoreMeta12|CoreMeta21, |
0x20000000, 0xfe0001fe, INSN_GP, ENC_ALU, 0 }, |
{ "ANDS", CoreMeta11|CoreMeta12|CoreMeta21, |
0x28000000, 0xfe0001fe, INSN_GP, ENC_ALU, 0 }, |
{ "ANDQ", CoreMeta11|CoreMeta12|CoreMeta21, |
0x20000040, 0xfe00017e, INSN_GP, ENC_ALU, GP_ARGS_QR }, |
{ "ANDSQ", CoreMeta11|CoreMeta12|CoreMeta21, |
0x28000040, 0xfe00017e, INSN_GP, ENC_ALU, GP_ARGS_QR }, |
{ "AND", CoreMeta11|CoreMeta12|CoreMeta21, |
0x22000000, 0xfe000005, INSN_GP, ENC_ALU, 0 }, |
{ "ANDMB", CoreMeta11|CoreMeta12|CoreMeta21, |
0x22000004, 0xfe000005, INSN_GP, ENC_ALU, 0 }, |
{ "ANDS", CoreMeta11|CoreMeta12|CoreMeta21, |
0x2a000000, 0xfe000005, INSN_GP, ENC_ALU, 0 }, |
{ "ANDSMB", CoreMeta11|CoreMeta12|CoreMeta21, |
0x2a000004, 0xfe000005, INSN_GP, ENC_ALU, 0 }, |
{ "ANDT", CoreMeta11|CoreMeta12|CoreMeta21, |
0x22000001, 0xfe000007, INSN_GP, ENC_ALU, 0 }, |
{ "ANDMT", CoreMeta11|CoreMeta12|CoreMeta21, |
0x22000005, 0xfe000007, INSN_GP, ENC_ALU, 0 }, |
{ "ANDST", CoreMeta11|CoreMeta12|CoreMeta21, |
0x2a000001, 0xfe000007, INSN_GP, ENC_ALU, 0 }, |
{ "ANDSMT", CoreMeta11|CoreMeta12|CoreMeta21, |
0x2a000005, 0xfe000007, INSN_GP, ENC_ALU, 0 }, |
{ "AND", DspMeta21, |
0x20000100, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1 }, |
{ "AND", CoreMeta11|CoreMeta12|CoreMeta21, |
0x26000020, 0xfe000021, INSN_GP, ENC_ALU, 0 }, |
{ "ANDS", CoreMeta11|CoreMeta12|CoreMeta21, |
0x2e000020, 0xfe000021, INSN_GP, ENC_ALU, 0 }, |
{ "ANDQ", CoreMeta11|CoreMeta12|CoreMeta21, |
0x26000021, 0xfe000021, INSN_GP, ENC_ALU, GP_ARGS_QR }, |
{ "ANDSQ", CoreMeta11|CoreMeta12|CoreMeta21, |
0x2e000021, 0xfe000021, INSN_GP, ENC_ALU, GP_ARGS_QR }, |
{ "ANDQ", DspMeta21, |
0x20000140, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_QR }, |
COND_INSN ("ANDQ", "", 1, DspMeta21, |
0x240001c0, 0xfe0001de, INSN_DSP, ENC_DALU, |
DSP_ARGS_1|DSP_ARGS_QR), |
COND_INSN ("AND", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x24000000, 0xfe00001e, INSN_GP, ENC_ALU, 0), |
{ "ANDSQ", DspMeta21, |
0x28000140, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_QR }, |
COND_INSN ("ANDSQ", "", 1, DspMeta21, |
0x2c0001c0, 0xfe0001de, INSN_DSP, ENC_DALU, |
DSP_ARGS_1|DSP_ARGS_QR), |
COND_INSN ("ANDS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x2c000000, 0xfe00001e, INSN_GP, ENC_ALU, 0), |
COND_INSN ("AND", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x26000000, 0xfe00003f, INSN_GP, ENC_ALU, 0), |
COND_INSN ("ANDS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x2e000000, 0xfe00003f, INSN_GP, ENC_ALU, 0), |
COND_INSN ("ANDQ", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x26000001, 0xfe00003f, INSN_GP, ENC_ALU, GP_ARGS_QR), |
COND_INSN ("ANDSQ", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x2e000001, 0xfe00003f, INSN_GP, ENC_ALU, GP_ARGS_QR), |
{ "OR", CoreMeta11|CoreMeta12|CoreMeta21, |
0x30000000, 0xfe0001fe, INSN_GP, ENC_ALU, 0 }, |
{ "ORS", CoreMeta11|CoreMeta12|CoreMeta21, |
0x38000000, 0xfe0001fe, INSN_GP, ENC_ALU, 0 }, |
{ "ORQ", CoreMeta11|CoreMeta12|CoreMeta21, |
0x30000040, 0xfe00017e, INSN_GP, ENC_ALU, GP_ARGS_QR }, |
{ "ORSQ", CoreMeta11|CoreMeta12|CoreMeta21, |
0x38000040, 0xfe00017e, INSN_GP, ENC_ALU, GP_ARGS_QR }, |
{ "OR", CoreMeta11|CoreMeta12|CoreMeta21, |
0x32000000, 0xfe000005, INSN_GP, ENC_ALU, 0 }, |
{ "ORMB", CoreMeta11|CoreMeta12|CoreMeta21, |
0x32000004, 0xfe000005, INSN_GP, ENC_ALU, 0 }, |
{ "ORS", CoreMeta11|CoreMeta12|CoreMeta21, |
0x3a000000, 0xfe000005, INSN_GP, ENC_ALU, 0 }, |
{ "ORSMB", CoreMeta11|CoreMeta12|CoreMeta21, |
0x3a000004, 0xfe000005, INSN_GP, ENC_ALU, 0 }, |
{ "ORT", CoreMeta11|CoreMeta12|CoreMeta21, |
0x32000001, 0xfe000007, INSN_GP, ENC_ALU, 0 }, |
{ "ORMT", CoreMeta11|CoreMeta12|CoreMeta21, |
0x32000005, 0xfe000007, INSN_GP, ENC_ALU, 0 }, |
{ "ORST", CoreMeta11|CoreMeta12|CoreMeta21, |
0x3a000001, 0xfe000007, INSN_GP, ENC_ALU, 0 }, |
{ "ORSMT", CoreMeta11|CoreMeta12|CoreMeta21, |
0x3a000005, 0xfe000007, INSN_GP, ENC_ALU, 0 }, |
{ "OR", CoreMeta11|CoreMeta12|CoreMeta21, |
0x36000020, 0xfe000021, INSN_GP, ENC_ALU, 0 }, |
{ "ORS", CoreMeta11|CoreMeta12|CoreMeta21, |
0x3e000020, 0xfe000021, INSN_GP, ENC_ALU, 0 }, |
{ "ORQ", CoreMeta11|CoreMeta12|CoreMeta21, |
0x36000021, 0xfe000021, INSN_GP, ENC_ALU, GP_ARGS_QR }, |
{ "ORSQ", CoreMeta11|CoreMeta12|CoreMeta21, |
0x3e000021, 0xfe000021, INSN_GP, ENC_ALU, GP_ARGS_QR }, |
{ "ORQ", DspMeta21, |
0x30000140, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_QR }, |
COND_INSN ("ORQ", "", 1, DspMeta21, |
0x340001c0, 0xfe0001de, INSN_DSP, ENC_DALU, |
DSP_ARGS_1|DSP_ARGS_QR), |
COND_INSN ("OR", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x34000000, 0xfe00001e, INSN_GP, ENC_ALU, 0), |
{ "ORSQ", DspMeta21, |
0x38000140, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_QR }, |
COND_INSN ("ORSQ", "", 1, DspMeta21, |
0x3c0001c0, 0xfe0001de, INSN_DSP, ENC_DALU, |
DSP_ARGS_1|DSP_ARGS_QR), |
COND_INSN ("ORS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x3c000000, 0xfe00001e, INSN_GP, ENC_ALU, 0), |
COND_INSN ("OR", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x36000000, 0xfe00003f, INSN_GP, ENC_ALU, 0), |
COND_INSN ("ORS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x3e000000, 0xfe00003f, INSN_GP, ENC_ALU, 0), |
COND_INSN ("ORQ", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x36000001, 0xfe00003f, INSN_GP, ENC_ALU, GP_ARGS_QR), |
COND_INSN ("ORSQ", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x3e000001, 0xfe00003f, INSN_GP, ENC_ALU, GP_ARGS_QR), |
{ "XOR", CoreMeta11|CoreMeta12|CoreMeta21, |
0x40000000, 0xfe0001fe, INSN_GP, ENC_ALU, 0 }, |
{ "XORS", CoreMeta11|CoreMeta12|CoreMeta21, |
0x48000000, 0xfe0001fe, INSN_GP, ENC_ALU, 0 }, |
{ "XORQ", CoreMeta11|CoreMeta12|CoreMeta21, |
0x40000040, 0xfe00017e, INSN_GP, ENC_ALU, GP_ARGS_QR }, |
{ "XORSQ", CoreMeta11|CoreMeta12|CoreMeta21, |
0x48000040, 0xfe00017e, INSN_GP, ENC_ALU, GP_ARGS_QR }, |
{ "XOR", CoreMeta11|CoreMeta12|CoreMeta21, |
0x42000000, 0xfe000005, INSN_GP, ENC_ALU, 0 }, |
{ "XORMB", CoreMeta11|CoreMeta12|CoreMeta21, |
0x42000004, 0xfe000005, INSN_GP, ENC_ALU, 0 }, |
{ "XORS", CoreMeta11|CoreMeta12|CoreMeta21, |
0x4a000000, 0xfe000005, INSN_GP, ENC_ALU, 0 }, |
{ "XORSMB", CoreMeta11|CoreMeta12|CoreMeta21, |
0x4a000004, 0xfe000005, INSN_GP, ENC_ALU, 0 }, |
{ "XORT", CoreMeta11|CoreMeta12|CoreMeta21, |
0x42000001, 0xfe000007, INSN_GP, ENC_ALU, 0 }, |
{ "XORMT", CoreMeta11|CoreMeta12|CoreMeta21, |
0x42000005, 0xfe000007, INSN_GP, ENC_ALU, 0 }, |
{ "XORST", CoreMeta11|CoreMeta12|CoreMeta21, |
0x4a000001, 0xfe000007, INSN_GP, ENC_ALU, 0 }, |
{ "XORSMT", CoreMeta11|CoreMeta12|CoreMeta21, |
0x4a000005, 0xfe000007, INSN_GP, ENC_ALU, 0 }, |
{ "XOR", CoreMeta11|CoreMeta12|CoreMeta21, |
0x46000020, 0xfe000021, INSN_GP, ENC_ALU, 0 }, |
{ "XORS", CoreMeta11|CoreMeta12|CoreMeta21, |
0x4e000020, 0xfe000021, INSN_GP, ENC_ALU, 0 }, |
{ "XORQ", CoreMeta11|CoreMeta12|CoreMeta21, |
0x46000021, 0xfe000021, INSN_GP, ENC_ALU, GP_ARGS_QR }, |
{ "XORSQ", CoreMeta11|CoreMeta12|CoreMeta21, |
0x4e000021, 0xfe000021, INSN_GP, ENC_ALU, GP_ARGS_QR }, |
{ "XORQ", DspMeta21, |
0x40000140, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_QR }, |
COND_INSN ("XORQ", "", 1, DspMeta21, |
0x440001c0, 0xfe0001de, INSN_DSP, ENC_DALU, |
DSP_ARGS_1|DSP_ARGS_QR), |
COND_INSN ("XOR", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x44000000, 0xfe00001e, INSN_GP, ENC_ALU, 0), |
{ "XORSQ", DspMeta21, |
0x48000140, 0xfe000140, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_QR }, |
COND_INSN ("XORSQ", "", 1, DspMeta21, |
0x4c0001c0, 0xfe0001de, INSN_DSP, ENC_DALU, |
DSP_ARGS_1|DSP_ARGS_QR), |
COND_INSN ("XORS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x4c000000, 0xfe00001e, INSN_GP, ENC_ALU, 0), |
COND_INSN ("XOR", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x46000000, 0xfe00003f, INSN_GP, ENC_ALU, 0), |
COND_INSN ("XORS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x4e000000, 0xfe00003f, INSN_GP, ENC_ALU, 0), |
COND_INSN ("XORQ", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x46000001, 0xfe00003f, INSN_GP, ENC_ALU, GP_ARGS_QR), |
COND_INSN ("XORSQ", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x4e000001, 0xfe00003f, INSN_GP, ENC_ALU, GP_ARGS_QR), |
{ "LSL", CoreMeta11|CoreMeta12|CoreMeta21, |
0x50000000, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0 }, |
{ "LSL", CoreMeta11|CoreMeta12|CoreMeta21, |
0x54000020, 0xfc0001e0, INSN_GP, ENC_SHIFT, 0 }, |
COND_INSN ("LSL", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x54000000, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0), |
{ "LSLS", CoreMeta11|CoreMeta12|CoreMeta21, |
0x58000000, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0 }, |
{ "LSLS", CoreMeta11|CoreMeta12|CoreMeta21, |
0x5c000020, 0xfc0001e0, INSN_GP, ENC_SHIFT, 0 }, |
COND_INSN ("LSLS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x5c000000, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0), |
{ "LSR", CoreMeta11|CoreMeta12|CoreMeta21, |
0x50000040, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0 }, |
{ "LSR", CoreMeta11|CoreMeta12|CoreMeta21, |
0x54000060, 0xfc0001e0, INSN_GP, ENC_SHIFT, 0 }, |
COND_INSN ("LSR", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x54000040, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0), |
{ "LSRS", CoreMeta11|CoreMeta12|CoreMeta21, |
0x58000040, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0 }, |
{ "LSRS", CoreMeta11|CoreMeta12|CoreMeta21, |
0x5c000060, 0xfc0001e0, INSN_GP, ENC_SHIFT, 0 }, |
COND_INSN ("LSRS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x5c000040, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0), |
{ "ASL", CoreMeta11|CoreMeta12|CoreMeta21, |
0x50000080, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0 }, |
{ "ASL", CoreMeta11|CoreMeta12|CoreMeta21, |
0x540000a0, 0xfc0001e0, INSN_GP, ENC_SHIFT, 0 }, |
COND_INSN ("ASL", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x54000080, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0), |
{ "ASLS", CoreMeta11|CoreMeta12|CoreMeta21, |
0x58000080, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0 }, |
{ "ASLS", CoreMeta11|CoreMeta12|CoreMeta21, |
0x5c0000a0, 0xfc0001e0, INSN_GP, ENC_SHIFT, 0 }, |
COND_INSN ("ASLS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x5c000080, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0), |
{ "ASR", CoreMeta11|CoreMeta12|CoreMeta21, |
0x500000c0, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0 }, |
{ "ASR", CoreMeta11|CoreMeta12|CoreMeta21, |
0x540000e0, 0xfc0001e0, INSN_GP, ENC_SHIFT, 0 }, |
COND_INSN ("ASR", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x540000c0, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0), |
{ "ASRS", CoreMeta11|CoreMeta12|CoreMeta21, |
0x580000c0, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0 }, |
{ "ASRS", CoreMeta11|CoreMeta12|CoreMeta21, |
0x5c0000e0, 0xfc0001e0, INSN_GP, ENC_SHIFT, 0 }, |
COND_INSN ("ASRS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x5c0000c0, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0), |
{ "MULW", CoreMeta11|CoreMeta12|CoreMeta21, |
0x60000000, 0xfe0001fe, INSN_GP, ENC_ALU, 0 }, |
{ "MULD", CoreMeta11|CoreMeta12|CoreMeta21, |
0x60000040, 0xfe0001fe, INSN_GP, ENC_ALU, 0 }, |
/* MUL is a synonym from MULD. */ |
{ "MUL", CoreMeta11|CoreMeta12|CoreMeta21, |
0x60000040, 0xfe0001fe, INSN_GP, ENC_ALU, 0 }, |
{ "MULW", CoreMeta11|CoreMeta12|CoreMeta21, |
0x62000000, 0xfe000005, INSN_GP, ENC_ALU, 0 }, |
{ "MULD", CoreMeta11|CoreMeta12|CoreMeta21, |
0x62000004, 0xfe000005, INSN_GP, ENC_ALU, 0 }, |
{ "MUL", CoreMeta11|CoreMeta12|CoreMeta21, |
0x62000004, 0xfe000005, INSN_GP, ENC_ALU, 0 }, |
{ "MULWT", CoreMeta11|CoreMeta12|CoreMeta21, |
0x62000001, 0xfe000007, INSN_GP, ENC_ALU, 0 }, |
{ "MULDT", CoreMeta11|CoreMeta12|CoreMeta21, |
0x62000005, 0xfe000007, INSN_GP, ENC_ALU, 0 }, |
{ "MULT", CoreMeta11|CoreMeta12|CoreMeta21, |
0x62000005, 0xfe000007, INSN_GP, ENC_ALU, 0 }, |
{ "MULW", CoreMeta11|CoreMeta12|CoreMeta21, |
0x64000020, 0xfe0001e0, INSN_GP, ENC_ALU, 0 }, |
{ "MULD", CoreMeta11|CoreMeta12|CoreMeta21, |
0x64000060, 0xfe0001e0, INSN_GP, ENC_ALU, 0 }, |
{ "MUL", CoreMeta11|CoreMeta12|CoreMeta21, |
0x64000060, 0xfe0001e0, INSN_GP, ENC_ALU, 0 }, |
{ "MULW", CoreMeta11|CoreMeta12|CoreMeta21, |
0x66000020, 0xfe000021, INSN_GP, ENC_ALU, 0 }, |
{ "MULD", CoreMeta11|CoreMeta12|CoreMeta21, |
0x66000021, 0xfe000021, INSN_GP, ENC_ALU, 0 }, |
{ "MUL", CoreMeta11|CoreMeta12|CoreMeta21, |
0x66000021, 0xfe000021, INSN_GP, ENC_ALU, 0 }, |
COND_INSN ("MULW", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x64000000, 0xfe0001fe, INSN_GP, ENC_ALU, 0), |
COND_INSN ("MULD", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x64000040, 0xfe0001fe, INSN_GP, ENC_ALU, 0), |
COND_INSN ("MUL", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x64000040, 0xfe0001fe, INSN_GP, ENC_ALU, 0), |
COND_INSN ("MULW", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x66000000, 0xfe00003f, INSN_GP, ENC_ALU, 0), |
COND_INSN ("MULD", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x66000001, 0xfe00003f, INSN_GP, ENC_ALU, 0), |
COND_INSN ("MUL", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x66000001, 0xfe00003f, INSN_GP, ENC_ALU, 0), |
{ "MIN", CoreMeta11|CoreMeta12|CoreMeta21, |
0x70000020, 0xfe0001ff, INSN_GP, ENC_MIN_MAX, 0 }, |
{ "MAX", CoreMeta11|CoreMeta12|CoreMeta21, |
0x70000024, 0xfe0001ff, INSN_GP, ENC_MIN_MAX, 0 }, |
{ "FFB", CoreMeta11|CoreMeta12|CoreMeta21, |
0x70000004, 0xfe003fff, INSN_GP, ENC_BITOP, 0 }, |
{ "NORM", CoreMeta11|CoreMeta12|CoreMeta21, |
0x70000008, 0xfe003fff, INSN_GP, ENC_BITOP, 0 }, |
{ "ABS", CoreMeta11|CoreMeta12|CoreMeta21, |
0x70000028, 0xfe003fff, INSN_GP, ENC_BITOP, 0 }, |
{ "XSDB", CoreMeta11|CoreMeta12|CoreMeta21, |
0xaa000000, 0xff003ffe, INSN_GP, ENC_BITOP, 0 }, |
{ "XSDSB", CoreMeta11|CoreMeta12|CoreMeta21, |
0xaa000008, 0xff003ffe, INSN_GP, ENC_BITOP, 0 }, |
{ "XSDW", CoreMeta11|CoreMeta12|CoreMeta21, |
0xaa000002, 0xff003ffe, INSN_GP, ENC_BITOP, 0 }, |
{ "XSDSW", CoreMeta11|CoreMeta12|CoreMeta21, |
0xaa00000a, 0xff003ffe, INSN_GP, ENC_BITOP, 0 }, |
{ "RTDW", CoreMeta11|CoreMeta12|CoreMeta21, |
0xaa000006, 0xff003ffe, INSN_GP, ENC_BITOP, 0 }, |
{ "RTDSW", CoreMeta11|CoreMeta12|CoreMeta21, |
0xaa00000e, 0xff003ffe, INSN_GP, ENC_BITOP, 0 }, |
{ "NMIN", CoreMeta11|CoreMeta12|CoreMeta21, |
0x7000002c, 0xfe0001ff, INSN_GP, ENC_MIN_MAX, 0 }, |
/* Condition setting operations */ |
{ "CMP", CoreMeta11|CoreMeta12|CoreMeta21, |
0x70000000, 0xfef801fe, INSN_GP, ENC_CMP, 0 }, |
{ "TST", CoreMeta11|CoreMeta12|CoreMeta21, |
0x78000000, 0xfef801fe, INSN_GP, ENC_CMP, 0 }, |
{ "CMP", CoreMeta11|CoreMeta12|CoreMeta21, |
0x72000000, 0xfe000005, INSN_GP, ENC_CMP, 0 }, |
{ "CMPMB", CoreMeta11|CoreMeta12|CoreMeta21, |
0x72000004, 0xfe000005, INSN_GP, ENC_CMP, 0 }, |
{ "TST", CoreMeta11|CoreMeta12|CoreMeta21, |
0x7a000000, 0xfe000005, INSN_GP, ENC_CMP, 0 }, |
{ "TSTMB", CoreMeta11|CoreMeta12|CoreMeta21, |
0x7a000004, 0xfe000005, INSN_GP, ENC_CMP, 0 }, |
{ "CMPT", CoreMeta11|CoreMeta12|CoreMeta21, |
0x72000001, 0xfe000007, INSN_GP, ENC_CMP, 0 }, |
{ "CMPMT", CoreMeta11|CoreMeta12|CoreMeta21, |
0x72000005, 0xfe000007, INSN_GP, ENC_CMP, 0 }, |
{ "TSTT", CoreMeta11|CoreMeta12|CoreMeta21, |
0x7a000001, 0xfe000007, INSN_GP, ENC_CMP, 0 }, |
{ "TSTMT", CoreMeta11|CoreMeta12|CoreMeta21, |
0x7a000005, 0xfe000007, INSN_GP, ENC_CMP, 0 }, |
COND_INSN ("CMP", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x74000000, 0xfef801fe, INSN_GP, ENC_CMP, 0), |
COND_INSN ("TST", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x7c000000, 0xfef801fe, INSN_GP, ENC_CMP, 0), |
COND_INSN ("CMP", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x76000000, 0xfef8003e, INSN_GP, ENC_CMP, 0), |
COND_INSN ("TST", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0x7e000000, 0xfef8003e, INSN_GP, ENC_CMP, 0), |
/* No-op (BNV) */ |
{ "NOP", CoreMeta11|CoreMeta12|CoreMeta21, |
0xa0fffffe, 0xffffffff, INSN_GP, ENC_NONE, 0 }, |
/* Branch */ |
COND_INSN ("B", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0xa0000000, 0xff00001f, INSN_GP, ENC_BRANCH, 0), |
COND_INSN ("B", "R", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0xa0000001, 0xff00001f, INSN_GP, ENC_BRANCH, 0), |
/* System operations */ |
{ "LOCK0", CoreMeta11|CoreMeta12|CoreMeta21, |
0xa8000000, 0xffffffff, INSN_GP, ENC_NONE, 0 }, |
{ "LOCK1", CoreMeta11|CoreMeta12|CoreMeta21, |
0xa8000001, 0xffffffff, INSN_GP, ENC_NONE, 0 }, |
{ "LOCK2", CoreMeta11|CoreMeta12|CoreMeta21, |
0xa8000003, 0xffffffff, INSN_GP, ENC_NONE, 0 }, |
{ "RTI", CoreMeta11|CoreMeta12|CoreMeta21, |
0xa3ffffff, 0xffffffff, INSN_GP, ENC_NONE, 0 }, |
{ "RTH", CoreMeta11|CoreMeta12|CoreMeta21, |
0xa37fffff, 0xffffffff, INSN_GP, ENC_NONE, 0 }, |
COND_INSN ("KICK", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0xa3000001, 0xff003e1f, INSN_GP, ENC_KICK, 0), |
{ "SWITCH", CoreMeta11|CoreMeta12|CoreMeta21, |
0xaf000000, 0xff000000, INSN_GP, ENC_SWITCH, 0 }, |
{ "DCACHE", CoreMeta11|CoreMeta12|CoreMeta21, |
0xad000000, 0xff000087, INSN_GP, ENC_CACHEW, 0 }, |
{ "ICACHEEXIT", CoreMeta12|CoreMeta21, |
0xae000000, 0xffffffff, INSN_GP, ENC_NONE, 0 }, |
{ "ICACHEEXITR", CoreMeta12|CoreMeta21, |
0xae000001, 0xffffffff, INSN_GP, ENC_NONE, 0 }, |
{ "ICACHE", CoreMeta12|CoreMeta21, |
0xae000000, 0xff0001e1, INSN_GP, ENC_ICACHE, 0 }, |
{ "ICACHER", CoreMeta12|CoreMeta21, |
0xae000001, 0xff0001e1, INSN_GP, ENC_ICACHE, 0 }, |
/* Meta 2 instructions */ |
{ "CACHERD", CoreMeta21, |
0xad000081, 0xff000087, INSN_GP, ENC_CACHER, 0 }, |
{ "CACHERL", CoreMeta21, |
0xad000083, 0xff000087, INSN_GP, ENC_CACHER, 0 }, |
{ "CACHEWD", CoreMeta21, |
0xad000001, 0xff000087, INSN_GP, ENC_CACHEW, 0 }, |
{ "CACHEWL", CoreMeta21, |
0xad000003, 0xff000087, INSN_GP, ENC_CACHEW, 0 }, |
COND_INSN ("DEFR", "", 1, CoreMeta21, |
0xa3002001, 0xff003e1f, INSN_GP, ENC_KICK, 0), |
{ "BEXD", CoreMeta21, |
0xaa000004, 0xff003ffe, INSN_GP, ENC_BITOP, 0 }, |
{ "BEXSD", CoreMeta21, |
0xaa00000c, 0xff003ffe, INSN_GP, ENC_BITOP, 0 }, |
{ "BEXL", CoreMeta21, |
0xaa000014, 0xff003ffe, INSN_GP, ENC_BITOP, 0 }, |
{ "BEXSL", CoreMeta21, |
0xaa00001c, 0xff003ffe, INSN_GP, ENC_BITOP, 0 }, |
{ "LNKGETB", CoreMeta21, |
0xad000080, 0xff000087, INSN_GP, ENC_LNKGET, 0 }, |
{ "LNKGETW", CoreMeta21, |
0xad000082, 0xff000087, INSN_GP, ENC_LNKGET, 0 }, |
{ "LNKGETD", CoreMeta21, |
0xad000084, 0xff000087, INSN_GP, ENC_LNKGET, 0 }, |
{ "LNKGETL", CoreMeta21, |
0xad000086, 0xff000087, INSN_GP, ENC_LNKGET, 0 }, |
COND_INSN ("LNKSETB", "", 1, CoreMeta21, |
0xa4000080, 0xff00039f, INSN_GP, ENC_COND_SET, 0), |
COND_INSN ("LNKSETW", "", 1, CoreMeta21, |
0xa4000081, 0xff00039f, INSN_GP, ENC_COND_SET, 0), |
COND_INSN ("LNKSETD", "", 1, CoreMeta21, |
0xa4000280, 0xff00039f, INSN_GP, ENC_COND_SET, 0), |
COND_INSN ("LNKSETL", "", 1, CoreMeta21, |
0xa4000281, 0xff00039f, INSN_GP, ENC_COND_SET, 0), |
/* Meta 2 FPU instructions */ |
/* Port-to-unit MOV */ |
COND_INSN ("MOVL", "", 1, FpuMeta21, |
0xa1800201, 0xfff83e1f, INSN_FPU, ENC_MOV_PORT, 0), |
/* Read pipeline drain */ |
{ "MMOVD", FpuMeta21, |
0xce000006, 0xfffc007f, INSN_FPU, ENC_MMOV, 0 }, |
{ "MMOVL", FpuMeta21, |
0xcf000006, 0xfffc007f, INSN_FPU, ENC_MMOV, 0 }, |
/* FP data movement instructions */ |
FCOND_INSN ("ABS", "", 1, FpuMeta21, |
0xf0000080, 0xff843f9f, INSN_FPU, ENC_FMOV, 0), |
{ "MMOVD", FpuMeta21, |
0xbe000002, 0xff84007e, INSN_FPU, ENC_FMMOV, 0 }, |
{ "MMOVL", FpuMeta21, |
0xbf000002, 0xff84007e, INSN_FPU, ENC_FMMOV, 0 }, |
{ "MMOVD", FpuMeta21, |
0xce000002, 0xff84007e, INSN_FPU, ENC_FMMOV, 0 }, |
{ "MMOVL", FpuMeta21, |
0xcf000002, 0xff84007e, INSN_FPU, ENC_FMMOV, 0 }, |
{ "MOVD", FpuMeta21, |
0x08000144, 0xfe03e1ff, INSN_FPU, ENC_FMOV_DATA, 0 }, |
{ "MOVD", FpuMeta21, |
0x080001c4, 0xfe83c1ff, INSN_FPU, ENC_FMOV_DATA, 0 }, |
{ "MOVL", FpuMeta21, |
0x08000154, 0xfe03e1ff, INSN_FPU, ENC_FMOV_DATA, 0 }, |
{ "MOVL", FpuMeta21, |
0x080001d4, 0xfe83c1ff, INSN_FPU, ENC_FMOV_DATA, 0 }, |
FCOND_INSN ("MOV", "", 1, FpuMeta21, |
0xf0000000, 0xff843f9f, INSN_FPU, ENC_FMOV, 0), |
{ "MOV", FpuMeta21, |
0xf0000001, 0xff800001, INSN_FPU, ENC_FMOV_I, 0 }, |
FCOND_INSN ("NEG", "", 1, FpuMeta21, |
0xf0000100, 0xff843f9f, INSN_FPU, ENC_FMOV, 0), |
{ "PACK", FpuMeta21, |
0xf0000180, 0xff8c21ff, INSN_FPU, ENC_FPACK, 0 }, |
{ "SWAP", FpuMeta21, |
0xf00001c0, 0xff8c7fff, INSN_FPU, ENC_FSWAP, 0 }, |
/* FP comparison instructions */ |
FCOND_INSN ("CMP", "", 1, FpuMeta21, |
0xf3000000, 0xfff4201f, INSN_FPU, ENC_FCMP, 0), |
FCOND_INSN ("MAX", "", 1, FpuMeta21, |
0xf3000081, 0xff84219f, INSN_FPU, ENC_FMINMAX, 0), |
FCOND_INSN ("MIN", "", 1, FpuMeta21, |
0xf3000001, 0xff84219f, INSN_FPU, ENC_FMINMAX, 0), |
/* FP data conversion instructions */ |
FCOND_INSN ("DTOF", "", 1, FpuMeta21, |
0xf2000121, 0xff843fff, INSN_FPU, ENC_FCONV, 0), |
FCOND_INSN ("FTOD", "", 1, FpuMeta21, |
0xf2000101, 0xff843fff, INSN_FPU, ENC_FCONV, 0), |
FCOND_INSN ("DTOH", "", 1, FpuMeta21, |
0xf2000320, 0xff843fff, INSN_FPU, ENC_FCONV, 0), |
FCOND_INSN ("FTOH", "", 1, FpuMeta21, |
0xf2000300, 0xff843fbf, INSN_FPU, ENC_FCONV, 0), |
FCOND_INSN ("DTOI", "", 1, FpuMeta21, |
0xf2002120, 0xff842fff, INSN_FPU, ENC_FCONV, 0), |
FCOND_INSN ("FTOI", "", 1, FpuMeta21, |
0xf2002100, 0xff842fbf, INSN_FPU, ENC_FCONV, 0), |
FCOND_INSN ("DTOL", "", 1, FpuMeta21, |
0xf2002320, 0xff8c6fff, INSN_FPU, ENC_FCONV, 0), |
FCOND_INSN ("DTOX", "", 1, FpuMeta21, |
0xf2000020, 0xff8401bf, INSN_FPU, ENC_FCONVX, 0), |
FCOND_INSN ("FTOX", "", 1, FpuMeta21, |
0xf2000000, 0xff8401bf, INSN_FPU, ENC_FCONVX, 0), |
FCOND_INSN ("DTOXL", "", 1, FpuMeta21, |
0xf20000a0, 0xff8c40ff, INSN_FPU, ENC_FCONVX, 0), |
FCOND_INSN ("HTOD", "", 1, FpuMeta21, |
0xf2000321, 0xff843fff, INSN_FPU, ENC_FCONV, 0), |
FCOND_INSN ("HTOF", "", 1, FpuMeta21, |
0xf2000301, 0xff843fbf, INSN_FPU, ENC_FCONV, 0), |
FCOND_INSN ("ITOD", "", 1, FpuMeta21, |
0xf2002121, 0xff843fff, INSN_FPU, ENC_FCONV, 0), |
FCOND_INSN ("ITOF", "", 1, FpuMeta21, |
0xf2002101, 0xff843fbf, INSN_FPU, ENC_FCONV, 0), |
FCOND_INSN ("LTOD", "", 1, FpuMeta21, |
0xf2002321, 0xff8c7fff, INSN_FPU, ENC_FCONV, 0), |
FCOND_INSN ("XTOD", "", 1, FpuMeta21, |
0xf2000021, 0xff8401bf, INSN_FPU, ENC_FCONVX, 0), |
FCOND_INSN ("XTOF", "", 1, FpuMeta21, |
0xf2000001, 0xff8401bf, INSN_FPU, ENC_FCONVX, 0), |
FCOND_INSN ("XLTOD", "", 1, FpuMeta21, |
0xf20000a1, 0xff8c40ff, INSN_FPU, ENC_FCONVX, 0), |
/* FP basic arithmetic instructions */ |
FCOND_INSN ("ADD", "", 1, FpuMeta21, |
0xf1000001, 0xff84211f, INSN_FPU, ENC_FBARITH, 0), |
FCOND_INSN ("MUL", "", 1, FpuMeta21, |
0xf1000100, 0xff84211f, INSN_FPU, ENC_FBARITH, 0), |
FCOND_INSN ("SUB", "", 1, FpuMeta21, |
0xf1000101, 0xff84211f, INSN_FPU, ENC_FBARITH, 0), |
/* FP extended arithmetic instructions */ |
{ "MAC", FpuMeta21, |
0xf6000000, 0xfffc219f, INSN_FPU, ENC_FEARITH, 0 }, |
{ "MACS", FpuMeta21, |
0xf6000100, 0xfffc219f, INSN_FPU, ENC_FEARITH, 0 }, |
{ "MAR", FpuMeta21, |
0xf6000004, 0xff84211f, INSN_FPU, ENC_FEARITH, 0 }, |
{ "MARS", FpuMeta21, |
0xf6000104, 0xff84211f, INSN_FPU, ENC_FEARITH, 0 }, |
{ "MAW", FpuMeta21, |
0xf6000008, 0xff84219f, INSN_FPU, ENC_FEARITH, 0 }, |
{ "MAWS", FpuMeta21, |
0xf6000108, 0xff84219f, INSN_FPU, ENC_FEARITH, 0 }, |
{ "MAW1", FpuMeta21, |
0xf6000009, 0xff84219f, INSN_FPU, ENC_FEARITH, 0 }, |
{ "MAWS1", FpuMeta21, |
0xf6000109, 0xff84219f, INSN_FPU, ENC_FEARITH, 0 }, |
FCOND_INSN ("MXA", "", 1, FpuMeta21, |
0xf5000000, 0xff84211f, INSN_FPU, ENC_FEARITH, 0), |
FCOND_INSN ("MXAS", "", 1, FpuMeta21, |
0xf5000100, 0xff84211f, INSN_FPU, ENC_FEARITH, 0), |
FCOND_INSN ("MXA1", "", 1, FpuMeta21, |
0xf5000001, 0xff84211f, INSN_FPU, ENC_FEARITH, 0), |
FCOND_INSN ("MXAS1", "", 1, FpuMeta21, |
0xf5000101, 0xff84211f, INSN_FPU, ENC_FEARITH, 0), |
{ "MUZ", FpuMeta21, |
0xf6000010, 0xff84211d, INSN_FPU, ENC_FEARITH, 0 }, |
{ "MUZS", FpuMeta21, |
0xf6000110, 0xff84211d, INSN_FPU, ENC_FEARITH, 0 }, |
{ "MUZ1", FpuMeta21, |
0xf6000011, 0xff84211d, INSN_FPU, ENC_FEARITH, 0 }, |
{ "MUZS1", FpuMeta21, |
0xf6000111, 0xff84211d, INSN_FPU, ENC_FEARITH, 0 }, |
{ "RCP", FpuMeta21, |
0xf7000000, 0xff84391f, INSN_FPU, ENC_FREC, 0 }, |
{ "RSQ", FpuMeta21, |
0xf7000100, 0xff84391f, INSN_FPU, ENC_FREC, 0 }, |
/* FP SIMD arithmetic instructions */ |
{ "ADDRE", FpuMeta21, |
0xf4000000, 0xff8c637f, INSN_FPU, ENC_FSIMD, 0 }, |
{ "MULRE", FpuMeta21, |
0xf4000001, 0xff8c637f, INSN_FPU, ENC_FSIMD, 0 }, |
{ "SUBRE", FpuMeta21, |
0xf4000100, 0xff8c637f, INSN_FPU, ENC_FSIMD, 0 }, |
/* FP memory instructions */ |
{ "MGETD", FpuMeta21, |
0xce000000, 0xff00001f, INSN_FPU, ENC_MGET_MSET, 0 }, |
{ "MGET", FpuMeta21, |
0xce000000, 0xff00001f, INSN_FPU, ENC_MGET_MSET, 0 }, |
{ "MGETL", FpuMeta21, |
0xcf000000, 0xff00001f, INSN_FPU, ENC_MGET_MSET, 0 }, |
{ "MSETD", FpuMeta21, |
0xbe000000, 0xff00001f, INSN_FPU, ENC_MGET_MSET, 0 }, |
{ "MSET", FpuMeta21, |
0xbe000000, 0xff00001f, INSN_FPU, ENC_MGET_MSET, 0 }, |
{ "MSETL", FpuMeta21, |
0xbf000000, 0xff00001f, INSN_FPU, ENC_MGET_MSET, 0 }, |
/* FP accumulator memory instructions */ |
{ "GETL", FpuMeta21, |
0xcf000004, 0xffe03f9f, INSN_FPU, ENC_FGET_SET_ACF, 0 }, |
{ "SETL", FpuMeta21, |
0xbf000004, 0xffe03f9f, INSN_FPU, ENC_FGET_SET_ACF, 0 }, |
/* DSP FPU data movement */ |
{ "MOV", DspMeta21|FpuMeta21, |
0x08000146, 0xfe0001ee, INSN_DSP_FPU, ENC_DALU, |
DSP_ARGS_2|DSP_ARGS_DSP_SRC1 }, |
{ "MOV", DspMeta21|FpuMeta21, |
0x080001c6, 0xfe0001ee, INSN_DSP_FPU, ENC_DALU, |
DSP_ARGS_2|DSP_ARGS_DSP_SRC2 }, |
/* Unit-to-unit MOV */ |
COND_INSN ("MOV", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0xa3000000, 0xff00021f, INSN_GP, ENC_MOV_U2U, 0), |
COND_INSN ("TTMOV", "", 1, CoreMeta12|CoreMeta21, |
0xa3000201, 0xff00021f, INSN_GP, ENC_MOV_U2U, 0), |
COND_INSN ("SWAP", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, |
0xa3000200, 0xff00021f, INSN_GP, ENC_SWAP, 0), |
/* DSP memory instructions */ |
{ "GETD", DspMeta21, |
0x94000100, 0xff0001fc, INSN_DSP, ENC_DGET_SET, 0 }, |
{ "SETD", DspMeta21, |
0x94000000, 0xff0001fc, INSN_DSP, ENC_DGET_SET, 0 }, |
{ "GETL", DspMeta21, |
0x94000104, 0xff0001fc, INSN_DSP, ENC_DGET_SET, 0 }, |
{ "SETL", DspMeta21, |
0x94000004, 0xff0001fc, INSN_DSP, ENC_DGET_SET, 0 }, |
/* DSP read pipeline prime/drain */ |
{ "MMOVD", DspMeta21, |
0xca000001, 0xff00001f, INSN_DSP, ENC_MMOV, 0 }, |
{ "MMOVL", DspMeta21, |
0xcb000001, 0xff00001f, INSN_DSP, ENC_MMOV, 0 }, |
{ "MMOVD", DspMeta21, |
0xcc000001, 0xff07c067, INSN_DSP, ENC_MMOV, 0 }, |
{ "MMOVL", DspMeta21, |
0xcd000001, 0xff07c067, INSN_DSP, ENC_MMOV, 0 }, |
/* DSP Template instantiation */ |
TEMPLATE_INSN (DspMeta21, 0x90000000, 0xff00000f, INSN_DSP), |
TEMPLATE_INSN (DspMeta21, 0x93000000, 0xff0001ff, INSN_DSP), |
TEMPLATE_INSN (DspMeta21, 0x95000000, 0xff00000f, INSN_DSP), |
{ "AND", DspMeta21, |
0x22000003, 0xfe000003, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_IMM }, |
{ "ANDS", DspMeta21, |
0x28000100, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1 }, |
{ "ANDS", DspMeta21, |
0x2a000003, 0xfe000003, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_IMM }, |
{ "MAX", DspMeta21, |
0x70000124, 0xfe0001ec, INSN_DSP, ENC_DALU, DSP_ARGS_1 }, |
{ "MIN", DspMeta21, |
0x70000120, 0xfe0001ec, INSN_DSP, ENC_DALU, DSP_ARGS_1 }, |
{ "NMIN", DspMeta21, |
0x7000012c, 0xfe0001ec, INSN_DSP, ENC_DALU, DSP_ARGS_1 }, |
{ "OR", DspMeta21, |
0x30000100, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1 }, |
{ "OR", DspMeta21, |
0x32000003, 0xfe000003, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_IMM }, |
{ "ORS", DspMeta21, |
0x38000100, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1 }, |
{ "ORS", DspMeta21, |
0x3a000003, 0xfe000003, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_IMM }, |
{ "XOR", DspMeta21, |
0x40000100, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1 }, |
{ "XOR", DspMeta21, |
0x42000003, 0xfe000003, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_IMM }, |
{ "XORS", DspMeta21, |
0x48000100, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1 }, |
{ "XORS", DspMeta21, |
0x4a000003, 0xfe000003, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_IMM }, |
{ "ADDB8", DspMeta21, |
0x20000108, 0xfe00010c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_SPLIT8 }, |
{ "ADDT8", DspMeta21, |
0x2000010c, 0xfe00010c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_SPLIT8 }, |
{ "ADDSB8", DspMeta21, |
0x28000108, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_SPLIT8 }, |
{ "ADDST8", DspMeta21, |
0x2800010c, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_SPLIT8 }, |
{ "MULB8", DspMeta21, |
0x40000108, 0xfe00012c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_SPLIT8 }, |
{ "MULT8", DspMeta21, |
0x4000010c, 0xfe00012c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_SPLIT8 }, |
{ "MULSB8", DspMeta21, |
0x48000108, 0xfe00012c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_SPLIT8 }, |
{ "MULST8", DspMeta21, |
0x4800010c, 0xfe00012c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_SPLIT8 }, |
{ "SUBB8", DspMeta21, |
0x30000108, 0xfe00010c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_SPLIT8 }, |
{ "SUBT8", DspMeta21, |
0x3000010c, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_SPLIT8 }, |
{ "SUBSB8", DspMeta21, |
0x38000108, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_SPLIT8 }, |
{ "SUBST8", DspMeta21, |
0x3800010c, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_SPLIT8 }, |
{ "MUL", DspMeta21, |
0x60000100, 0xfe000100, INSN_DSP, ENC_DALU, |
DSP_ARGS_1|DSP_ARGS_DACC }, |
{ "MUL", DspMeta21, |
0x62000003, 0xfe000003, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_IMM }, |
{ "ABS", DspMeta21, |
0x70000128, 0xfe0001ec, INSN_DSP, ENC_DALU, DSP_ARGS_2 }, |
{ "FFB", DspMeta21, |
0x70000104, 0xfe0001ec, INSN_DSP, ENC_DALU, DSP_ARGS_2 }, |
{ "NORM", DspMeta21, |
0x70000108, 0xfe0001ec, INSN_DSP, ENC_DALU, DSP_ARGS_2 }, |
{ "CMP", DspMeta21, |
0x70000000, 0xfe0000ec, INSN_DSP, ENC_DALU, DSP_ARGS_2|DSP_ARGS_IMM }, |
{ "CMP", DspMeta21, |
0x72000003, 0xfe000003, INSN_DSP, ENC_DALU, DSP_ARGS_2|DSP_ARGS_IMM }, |
{ "TST", DspMeta21, |
0x78000100, 0xfe0001ec, INSN_DSP, ENC_DALU, DSP_ARGS_2|DSP_ARGS_IMM }, |
{ "TST", DspMeta21, |
0x7a000003, 0xfe000003, INSN_DSP, ENC_DALU, DSP_ARGS_2|DSP_ARGS_IMM }, |
{ "MOV", DspMeta21, |
0x00000104, 0xfe078146, INSN_DSP, ENC_DALU, |
DSP_ARGS_2|DSP_ARGS_DSP_SRC1|DSP_ARGS_DSP_SRC2|DSP_ARGS_IMM }, |
{ "MOVS", DspMeta21, |
0x08000104, 0xfe000146, INSN_DSP, ENC_DALU, DSP_ARGS_2|DSP_ARGS_DSP_SRC2 }, |
{ "MOV", DspMeta21, |
0x91000000, 0xff000000, INSN_DSP, ENC_DALU, |
DSP_ARGS_2|DSP_ARGS_DSP_SRC1|DSP_ARGS_IMM }, |
{ "MOV", DspMeta21, |
0x92000000, 0xff000000, INSN_DSP, ENC_DALU, DSP_ARGS_2|DSP_ARGS_DSP_SRC2 }, |
{ "NEG", DspMeta21, |
0x10000104, 0xfe000146, INSN_DSP, ENC_DALU, DSP_ARGS_2|DSP_ARGS_DSP_SRC2 }, |
{ "NEGS", DspMeta21, |
0x18000104, 0xfe000146, INSN_DSP, ENC_DALU, DSP_ARGS_2|DSP_ARGS_DSP_SRC2 }, |
{ "XSDB", DspMeta21, |
0xaa000100, 0xff0001ee, INSN_DSP, ENC_DALU, DSP_ARGS_2 }, |
{ "XSD", DspMeta21, |
0xaa000100, 0xff0001ee, INSN_DSP, ENC_DALU, DSP_ARGS_2 }, |
{ "XSDW", DspMeta21, |
0xaa000102, 0xff0001ee, INSN_DSP, ENC_DALU, DSP_ARGS_2 }, |
{ "XSDSB", DspMeta21, |
0xaa000108, 0xff0001ee, INSN_DSP, ENC_DALU, DSP_ARGS_2 }, |
{ "XSDS", DspMeta21, |
0xaa000108, 0xff0001ee, INSN_DSP, ENC_DALU, DSP_ARGS_2 }, |
{ "XSDSW", DspMeta21, |
0xaa00010a, 0xff0001ee, INSN_DSP, ENC_DALU, DSP_ARGS_2 }, |
{ "LSL", DspMeta21, |
0x50000100, 0xfc0001c0, INSN_DSP, ENC_DALU, 0 }, |
{ "LSR", DspMeta21, |
0x50000140, 0xfc0001c0, INSN_DSP, ENC_DALU, 0 }, |
{ "ASL", DspMeta21, |
0x50000180, 0xfc0001c0, INSN_DSP, ENC_DALU, 0 }, |
{ "ASR", DspMeta21, |
0x500001c0, 0xfc0001c0, INSN_DSP, ENC_DALU, 0 }, |
{ "LSL", DspMeta21, |
0x54000120, 0xfc0001e0, INSN_DSP, ENC_DALU, DSP_ARGS_IMM }, |
{ "LSR", DspMeta21, |
0x54000160, 0xfc0001e0, INSN_DSP, ENC_DALU, DSP_ARGS_IMM }, |
{ "ASL", DspMeta21, |
0x540001a0, 0xfc0001e0, INSN_DSP, ENC_DALU, DSP_ARGS_IMM }, |
{ "ASR", DspMeta21, |
0x540001e0, 0xfc0001e0, INSN_DSP, ENC_DALU, DSP_ARGS_IMM }, |
COND_INSN ("LSL", "", 1, DspMeta21, |
0x54000100, 0xfc0001fe, INSN_DSP, ENC_DALU, 0), |
COND_INSN ("LSR", "", 1, DspMeta21, |
0x54000140, 0xfc0001fe, INSN_DSP, ENC_DALU, 0), |
COND_INSN ("ASL", "", 1, DspMeta21, |
0x54000180, 0xfc0001fe, INSN_DSP, ENC_DALU, 0), |
COND_INSN ("ASR", "", 1, DspMeta21, |
0x540001c0, 0xfc0001fe, INSN_DSP, ENC_DALU, 0), |
{ "LSLS", DspMeta21, |
0x58000100, 0xfc0001c0, INSN_DSP, ENC_DALU, 0 }, |
{ "LSRS", DspMeta21, |
0x58000140, 0xfc0001c0, INSN_DSP, ENC_DALU, 0 }, |
{ "ASLS", DspMeta21, |
0x58000180, 0xfc0001c0, INSN_DSP, ENC_DALU, 0 }, |
{ "ASRS", DspMeta21, |
0x580001c0, 0xfc0001c0, INSN_DSP, ENC_DALU, 0 }, |
COND_INSN ("LSLS", "", 1, DspMeta21, |
0x5c000100, 0xfc0001fe, INSN_DSP, ENC_DALU, 0), |
COND_INSN ("LSRS", "", 1, DspMeta21, |
0x5c000140, 0xfc0001fe, INSN_DSP, ENC_DALU, 0), |
COND_INSN ("ASLS", "", 1, DspMeta21, |
0x5c000180, 0xfc0001fe, INSN_DSP, ENC_DALU, 0), |
COND_INSN ("ASRS", "", 1, DspMeta21, |
0x5c0001c0, 0xfc0001fe, INSN_DSP, ENC_DALU, 0), |
{ "LSLS", DspMeta21, |
0x5c000120, 0xfc0001e0, INSN_DSP, ENC_DALU, 0 }, |
{ "LSRS", DspMeta21, |
0x5c000160, 0xfc0001e0, INSN_DSP, ENC_DALU, 0 }, |
{ "ASLS", DspMeta21, |
0x5c0001a0, 0xfc0001e0, INSN_DSP, ENC_DALU, 0 }, |
{ "ASRS", DspMeta21, |
0x5c0001e0, 0xfc0001e0, INSN_DSP, ENC_DALU, 0 }, |
{ "RTDW", DspMeta21, |
0xaa000106, 0xff00010e, INSN_DSP, ENC_DALU, DSP_ARGS_2 }, |
{ "RTDSW", DspMeta21, |
0xaa00010e, 0xff00010e, INSN_DSP, ENC_DALU, DSP_ARGS_2 }, |
}; |
#define UNIT_MASK 0xf |
#define SHORT_UNIT_MASK 0x3 |
#define EXT_BASE_REG_MASK 0x1 |
#define REG_MASK 0x1f |
#define CC_MASK 0xf |
#define RMASK_MASK 0x7f |
#define GET_SET_IMM_MASK 0x3f |
#define GET_SET_IMM_BITS 6 |
#define GET_SET_EXT_IMM_MASK 0xfff |
#define GET_SET_EXT_IMM_BITS 12 |
#define DGET_SET_IMM_MASK 0x3 |
#define DGET_SET_IMM_BITS 2 |
#define MGET_MSET_MAX_REGS 8 |
#define MMOV_MAX_REGS 8 |
#define IMM16_MASK 0xffff |
#define IMM16_BITS 16 |
#define IMM19_MASK 0x7ffff |
#define IMM19_BITS 19 |
#define IMM8_MASK 0xff |
#define IMM8_BITS 8 |
#define IMM24_MASK 0xffffff |
#define IMM24_BITS 24 |
#define IMM5_MASK 0x1f |
#define IMM5_BITS 5 |
#define IMM6_MASK 0x3f |
#define IMM6_BITS 6 |
#define IMM15_MASK 0x7fff |
#define IMM15_BITS 15 |
#define IMM4_MASK 0x1f |
#define IMM4_BITS 4 |
#define CALLR_REG_MASK 0x7 |
#define CPC_REG_MASK 0xf |
#define O2R_REG_MASK 0x7 |
#define ACF_PART_MASK 0x3 |
#define DSP_REG_MASK 0xf |
#define DSP_PART_MASK 0x17 |
#define TEMPLATE_NUM_REGS 4 |
#define TEMPLATE_REGS_MASK 0xf |
#define IS_TEMPLATE_DEF(insn) (insn->dsp_daoppame_flags & DSP_DAOPPAME_TEMP) |
unsigned int metag_get_set_size_bytes (unsigned int opcode); |
unsigned int metag_get_set_ext_size_bytes (unsigned int opcode); |
unsigned int metag_cond_set_size_bytes (unsigned int opcode); |
/contrib/toolchain/binutils/include/opcode/mips.h |
---|
0,0 → 1,2082 |
/* mips.h. Mips opcode list for GDB, the GNU debugger. |
Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, |
2003, 2004, 2005, 2008, 2009, 2010, 2013 |
Free Software Foundation, Inc. |
Contributed by Ralph Campbell and OSF |
Commented and modified by Ian Lance Taylor, Cygnus Support |
This file is part of GDB, GAS, and the GNU binutils. |
GDB, GAS, and the GNU binutils are free software; you can redistribute |
them and/or modify them under the terms of the GNU General Public |
License as published by the Free Software Foundation; either version 3, |
or (at your option) any later version. |
GDB, GAS, and the GNU binutils are distributed in the hope that they |
will be useful, but WITHOUT ANY WARRANTY; without even the implied |
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See |
the GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this file; see the file COPYING3. If not, write to the Free |
Software Foundation, 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _MIPS_H_ |
#define _MIPS_H_ |
#include "bfd.h" |
/* These are bit masks and shift counts to use to access the various |
fields of an instruction. To retrieve the X field of an |
instruction, use the expression |
(i >> OP_SH_X) & OP_MASK_X |
To set the same field (to j), use |
i = (i &~ (OP_MASK_X << OP_SH_X)) | (j << OP_SH_X) |
Make sure you use fields that are appropriate for the instruction, |
of course. |
The 'i' format uses OP, RS, RT and IMMEDIATE. |
The 'j' format uses OP and TARGET. |
The 'r' format uses OP, RS, RT, RD, SHAMT and FUNCT. |
The 'b' format uses OP, RS, RT and DELTA. |
The floating point 'i' format uses OP, RS, RT and IMMEDIATE. |
The floating point 'r' format uses OP, FMT, FT, FS, FD and FUNCT. |
A breakpoint instruction uses OP, CODE and SPEC (10 bits of the |
breakpoint instruction are not defined; Kane says the breakpoint |
code field in BREAK is 20 bits; yet MIPS assemblers and debuggers |
only use ten bits). An optional two-operand form of break/sdbbp |
allows the lower ten bits to be set too, and MIPS32 and later |
architectures allow 20 bits to be set with a signal operand |
(using CODE20). |
The syscall instruction uses CODE20. |
The general coprocessor instructions use COPZ. */ |
#define OP_MASK_OP 0x3f |
#define OP_SH_OP 26 |
#define OP_MASK_RS 0x1f |
#define OP_SH_RS 21 |
#define OP_MASK_FR 0x1f |
#define OP_SH_FR 21 |
#define OP_MASK_FMT 0x1f |
#define OP_SH_FMT 21 |
#define OP_MASK_BCC 0x7 |
#define OP_SH_BCC 18 |
#define OP_MASK_CODE 0x3ff |
#define OP_SH_CODE 16 |
#define OP_MASK_CODE2 0x3ff |
#define OP_SH_CODE2 6 |
#define OP_MASK_RT 0x1f |
#define OP_SH_RT 16 |
#define OP_MASK_FT 0x1f |
#define OP_SH_FT 16 |
#define OP_MASK_CACHE 0x1f |
#define OP_SH_CACHE 16 |
#define OP_MASK_RD 0x1f |
#define OP_SH_RD 11 |
#define OP_MASK_FS 0x1f |
#define OP_SH_FS 11 |
#define OP_MASK_PREFX 0x1f |
#define OP_SH_PREFX 11 |
#define OP_MASK_CCC 0x7 |
#define OP_SH_CCC 8 |
#define OP_MASK_CODE20 0xfffff /* 20 bit syscall/breakpoint code. */ |
#define OP_SH_CODE20 6 |
#define OP_MASK_SHAMT 0x1f |
#define OP_SH_SHAMT 6 |
#define OP_MASK_EXTLSB OP_MASK_SHAMT |
#define OP_SH_EXTLSB OP_SH_SHAMT |
#define OP_MASK_STYPE OP_MASK_SHAMT |
#define OP_SH_STYPE OP_SH_SHAMT |
#define OP_MASK_FD 0x1f |
#define OP_SH_FD 6 |
#define OP_MASK_TARGET 0x3ffffff |
#define OP_SH_TARGET 0 |
#define OP_MASK_COPZ 0x1ffffff |
#define OP_SH_COPZ 0 |
#define OP_MASK_IMMEDIATE 0xffff |
#define OP_SH_IMMEDIATE 0 |
#define OP_MASK_DELTA 0xffff |
#define OP_SH_DELTA 0 |
#define OP_MASK_FUNCT 0x3f |
#define OP_SH_FUNCT 0 |
#define OP_MASK_SPEC 0x3f |
#define OP_SH_SPEC 0 |
#define OP_SH_LOCC 8 /* FP condition code. */ |
#define OP_SH_HICC 18 /* FP condition code. */ |
#define OP_MASK_CC 0x7 |
#define OP_SH_COP1NORM 25 /* Normal COP1 encoding. */ |
#define OP_MASK_COP1NORM 0x1 /* a single bit. */ |
#define OP_SH_COP1SPEC 21 /* COP1 encodings. */ |
#define OP_MASK_COP1SPEC 0xf |
#define OP_MASK_COP1SCLR 0x4 |
#define OP_MASK_COP1CMP 0x3 |
#define OP_SH_COP1CMP 4 |
#define OP_SH_FORMAT 21 /* FP short format field. */ |
#define OP_MASK_FORMAT 0x7 |
#define OP_SH_TRUE 16 |
#define OP_MASK_TRUE 0x1 |
#define OP_SH_GE 17 |
#define OP_MASK_GE 0x01 |
#define OP_SH_UNSIGNED 16 |
#define OP_MASK_UNSIGNED 0x1 |
#define OP_SH_HINT 16 |
#define OP_MASK_HINT 0x1f |
#define OP_SH_MMI 0 /* Multimedia (parallel) op. */ |
#define OP_MASK_MMI 0x3f |
#define OP_SH_MMISUB 6 |
#define OP_MASK_MMISUB 0x1f |
#define OP_MASK_PERFREG 0x1f /* Performance monitoring. */ |
#define OP_SH_PERFREG 1 |
#define OP_SH_SEL 0 /* Coprocessor select field. */ |
#define OP_MASK_SEL 0x7 /* The sel field of mfcZ and mtcZ. */ |
#define OP_SH_CODE19 6 /* 19 bit wait code. */ |
#define OP_MASK_CODE19 0x7ffff |
#define OP_SH_ALN 21 |
#define OP_MASK_ALN 0x7 |
#define OP_SH_VSEL 21 |
#define OP_MASK_VSEL 0x1f |
#define OP_MASK_VECBYTE 0x7 /* Selector field is really 4 bits, |
but 0x8-0xf don't select bytes. */ |
#define OP_SH_VECBYTE 22 |
#define OP_MASK_VECALIGN 0x7 /* Vector byte-align (alni.ob) op. */ |
#define OP_SH_VECALIGN 21 |
#define OP_MASK_INSMSB 0x1f /* "ins" MSB. */ |
#define OP_SH_INSMSB 11 |
#define OP_MASK_EXTMSBD 0x1f /* "ext" MSBD. */ |
#define OP_SH_EXTMSBD 11 |
/* MIPS DSP ASE */ |
#define OP_SH_DSPACC 11 |
#define OP_MASK_DSPACC 0x3 |
#define OP_SH_DSPACC_S 21 |
#define OP_MASK_DSPACC_S 0x3 |
#define OP_SH_DSPSFT 20 |
#define OP_MASK_DSPSFT 0x3f |
#define OP_SH_DSPSFT_7 19 |
#define OP_MASK_DSPSFT_7 0x7f |
#define OP_SH_SA3 21 |
#define OP_MASK_SA3 0x7 |
#define OP_SH_SA4 21 |
#define OP_MASK_SA4 0xf |
#define OP_SH_IMM8 16 |
#define OP_MASK_IMM8 0xff |
#define OP_SH_IMM10 16 |
#define OP_MASK_IMM10 0x3ff |
#define OP_SH_WRDSP 11 |
#define OP_MASK_WRDSP 0x3f |
#define OP_SH_RDDSP 16 |
#define OP_MASK_RDDSP 0x3f |
#define OP_SH_BP 11 |
#define OP_MASK_BP 0x3 |
/* MIPS MT ASE */ |
#define OP_SH_MT_U 5 |
#define OP_MASK_MT_U 0x1 |
#define OP_SH_MT_H 4 |
#define OP_MASK_MT_H 0x1 |
#define OP_SH_MTACC_T 18 |
#define OP_MASK_MTACC_T 0x3 |
#define OP_SH_MTACC_D 13 |
#define OP_MASK_MTACC_D 0x3 |
/* MIPS MCU ASE */ |
#define OP_MASK_3BITPOS 0x7 |
#define OP_SH_3BITPOS 12 |
#define OP_MASK_OFFSET12 0xfff |
#define OP_SH_OFFSET12 0 |
#define OP_OP_COP0 0x10 |
#define OP_OP_COP1 0x11 |
#define OP_OP_COP2 0x12 |
#define OP_OP_COP3 0x13 |
#define OP_OP_LWC1 0x31 |
#define OP_OP_LWC2 0x32 |
#define OP_OP_LWC3 0x33 /* a.k.a. pref */ |
#define OP_OP_LDC1 0x35 |
#define OP_OP_LDC2 0x36 |
#define OP_OP_LDC3 0x37 /* a.k.a. ld */ |
#define OP_OP_SWC1 0x39 |
#define OP_OP_SWC2 0x3a |
#define OP_OP_SWC3 0x3b |
#define OP_OP_SDC1 0x3d |
#define OP_OP_SDC2 0x3e |
#define OP_OP_SDC3 0x3f /* a.k.a. sd */ |
/* MIPS VIRT ASE */ |
#define OP_MASK_CODE10 0x3ff |
#define OP_SH_CODE10 11 |
/* Values in the 'VSEL' field. */ |
#define MDMX_FMTSEL_IMM_QH 0x1d |
#define MDMX_FMTSEL_IMM_OB 0x1e |
#define MDMX_FMTSEL_VEC_QH 0x15 |
#define MDMX_FMTSEL_VEC_OB 0x16 |
/* UDI */ |
#define OP_SH_UDI1 6 |
#define OP_MASK_UDI1 0x1f |
#define OP_SH_UDI2 6 |
#define OP_MASK_UDI2 0x3ff |
#define OP_SH_UDI3 6 |
#define OP_MASK_UDI3 0x7fff |
#define OP_SH_UDI4 6 |
#define OP_MASK_UDI4 0xfffff |
/* Octeon */ |
#define OP_SH_BBITIND 16 |
#define OP_MASK_BBITIND 0x1f |
#define OP_SH_CINSPOS 6 |
#define OP_MASK_CINSPOS 0x1f |
#define OP_SH_CINSLM1 11 |
#define OP_MASK_CINSLM1 0x1f |
#define OP_SH_SEQI 6 |
#define OP_MASK_SEQI 0x3ff |
/* Loongson */ |
#define OP_SH_OFFSET_A 6 |
#define OP_MASK_OFFSET_A 0xff |
#define OP_SH_OFFSET_B 3 |
#define OP_MASK_OFFSET_B 0xff |
#define OP_SH_OFFSET_C 6 |
#define OP_MASK_OFFSET_C 0x1ff |
#define OP_SH_RZ 0 |
#define OP_MASK_RZ 0x1f |
#define OP_SH_FZ 0 |
#define OP_MASK_FZ 0x1f |
/* Every MICROMIPSOP_X definition requires a corresponding OP_X |
definition, and vice versa. This simplifies various parts |
of the operand handling in GAS. The fields below only exist |
in the microMIPS encoding, so define each one to have an empty |
range. */ |
#define OP_MASK_TRAP 0 |
#define OP_SH_TRAP 0 |
#define OP_MASK_OFFSET10 0 |
#define OP_SH_OFFSET10 0 |
#define OP_MASK_RS3 0 |
#define OP_SH_RS3 0 |
#define OP_MASK_MB 0 |
#define OP_SH_MB 0 |
#define OP_MASK_MC 0 |
#define OP_SH_MC 0 |
#define OP_MASK_MD 0 |
#define OP_SH_MD 0 |
#define OP_MASK_ME 0 |
#define OP_SH_ME 0 |
#define OP_MASK_MF 0 |
#define OP_SH_MF 0 |
#define OP_MASK_MG 0 |
#define OP_SH_MG 0 |
#define OP_MASK_MH 0 |
#define OP_SH_MH 0 |
#define OP_MASK_MJ 0 |
#define OP_SH_MJ 0 |
#define OP_MASK_ML 0 |
#define OP_SH_ML 0 |
#define OP_MASK_MM 0 |
#define OP_SH_MM 0 |
#define OP_MASK_MN 0 |
#define OP_SH_MN 0 |
#define OP_MASK_MP 0 |
#define OP_SH_MP 0 |
#define OP_MASK_MQ 0 |
#define OP_SH_MQ 0 |
#define OP_MASK_IMMA 0 |
#define OP_SH_IMMA 0 |
#define OP_MASK_IMMB 0 |
#define OP_SH_IMMB 0 |
#define OP_MASK_IMMC 0 |
#define OP_SH_IMMC 0 |
#define OP_MASK_IMMF 0 |
#define OP_SH_IMMF 0 |
#define OP_MASK_IMMG 0 |
#define OP_SH_IMMG 0 |
#define OP_MASK_IMMH 0 |
#define OP_SH_IMMH 0 |
#define OP_MASK_IMMI 0 |
#define OP_SH_IMMI 0 |
#define OP_MASK_IMMJ 0 |
#define OP_SH_IMMJ 0 |
#define OP_MASK_IMML 0 |
#define OP_SH_IMML 0 |
#define OP_MASK_IMMM 0 |
#define OP_SH_IMMM 0 |
#define OP_MASK_IMMN 0 |
#define OP_SH_IMMN 0 |
#define OP_MASK_IMMO 0 |
#define OP_SH_IMMO 0 |
#define OP_MASK_IMMP 0 |
#define OP_SH_IMMP 0 |
#define OP_MASK_IMMQ 0 |
#define OP_SH_IMMQ 0 |
#define OP_MASK_IMMU 0 |
#define OP_SH_IMMU 0 |
#define OP_MASK_IMMW 0 |
#define OP_SH_IMMW 0 |
#define OP_MASK_IMMX 0 |
#define OP_SH_IMMX 0 |
#define OP_MASK_IMMY 0 |
#define OP_SH_IMMY 0 |
/* Enhanced VA Scheme */ |
#define OP_SH_EVAOFFSET 7 |
#define OP_MASK_EVAOFFSET 0x1ff |
/* Enumerates the various types of MIPS operand. */ |
enum mips_operand_type { |
/* Described by mips_int_operand. */ |
OP_INT, |
/* Described by mips_mapped_int_operand. */ |
OP_MAPPED_INT, |
/* Described by mips_msb_operand. */ |
OP_MSB, |
/* Described by mips_reg_operand. */ |
OP_REG, |
/* Like OP_REG, but can be omitted if the register is the same as the |
previous operand. */ |
OP_OPTIONAL_REG, |
/* Described by mips_reg_pair_operand. */ |
OP_REG_PAIR, |
/* Described by mips_pcrel_operand. */ |
OP_PCREL, |
/* A performance register. The field is 5 bits in size, but the supported |
values are much more restricted. */ |
OP_PERF_REG, |
/* The final operand in a microMIPS ADDIUSP instruction. It mostly acts |
as a normal 9-bit signed offset that is multiplied by four, but there |
are four special cases: |
-2 * 4 => -258 * 4 |
-1 * 4 => -257 * 4 |
0 * 4 => 256 * 4 |
1 * 4 => 257 * 4. */ |
OP_ADDIUSP_INT, |
/* The target of a (D)CLO or (D)CLZ instruction. The operand spans two |
5-bit register fields, both of which must be set to the destination |
register. */ |
OP_CLO_CLZ_DEST, |
/* A register list for a microMIPS LWM or SWM instruction. The operand |
size determines whether the 16-bit or 32-bit encoding is required. */ |
OP_LWM_SWM_LIST, |
/* The register list for an emulated MIPS16 ENTRY or EXIT instruction. */ |
OP_ENTRY_EXIT_LIST, |
/* The register list and frame size for a MIPS16 SAVE or RESTORE |
instruction. */ |
OP_SAVE_RESTORE_LIST, |
/* A 10-bit field VVVVVNNNNN used for octobyte and quadhalf instructions: |
V Meaning |
----- ------- |
0EEE0 8 copies of $vN[E], OB format |
0EE01 4 copies of $vN[E], QH format |
10110 all 8 elements of $vN, OB format |
10101 all 4 elements of $vN, QH format |
11110 8 copies of immediate N, OB format |
11101 4 copies of immediate N, QH format. */ |
OP_MDMX_IMM_REG, |
/* A register operand that must match the destination register. */ |
OP_REPEAT_DEST_REG, |
/* A register operand that must match the previous register. */ |
OP_REPEAT_PREV_REG, |
/* $pc, which has no encoding in the architectural instruction. */ |
OP_PC, |
/* A 4-bit XYZW channel mask or 2-bit XYZW index; the size determines |
which. */ |
OP_VU0_SUFFIX, |
/* Like OP_VU0_SUFFIX, but used when the operand's value has already |
been set. Any suffix used here must match the previous value. */ |
OP_VU0_MATCH_SUFFIX |
}; |
/* Enumerates the types of MIPS register. */ |
enum mips_reg_operand_type { |
/* General registers $0-$31. Software names like $at can also be used. */ |
OP_REG_GP, |
/* Floating-point registers $f0-$f31. */ |
OP_REG_FP, |
/* Coprocessor condition code registers $cc0-$cc7. FPU condition codes |
can also be written $fcc0-$fcc7. */ |
OP_REG_CCC, |
/* FPRs used in a vector capacity. They can be written $f0-$f31 |
or $v0-$v31, although the latter form is not used for the VR5400 |
vector instructions. */ |
OP_REG_VEC, |
/* DSP accumulator registers $ac0-$ac3. */ |
OP_REG_ACC, |
/* Coprocessor registers $0-$31. Mnemonic names like c0_cause can |
also be used in some contexts. */ |
OP_REG_COPRO, |
/* Hardware registers $0-$31. Mnemonic names like hwr_cpunum can |
also be used in some contexts. */ |
OP_REG_HW, |
/* Floating-point registers $vf0-$vf31. */ |
OP_REG_VF, |
/* Integer registers $vi0-$vi31. */ |
OP_REG_VI, |
/* R5900 VU0 registers $I, $Q, $R and $ACC. */ |
OP_REG_R5900_I, |
OP_REG_R5900_Q, |
OP_REG_R5900_R, |
OP_REG_R5900_ACC |
}; |
/* Base class for all operands. */ |
struct mips_operand |
{ |
/* The type of the operand. */ |
enum mips_operand_type type; |
/* The operand occupies SIZE bits of the instruction, starting at LSB. */ |
unsigned short size; |
unsigned short lsb; |
}; |
/* Describes an integer operand with a regular encoding pattern. */ |
struct mips_int_operand |
{ |
struct mips_operand root; |
/* The low ROOT.SIZE bits of MAX_VAL encodes (MAX_VAL + BIAS) << SHIFT. |
The cyclically previous field value encodes 1 << SHIFT less than that, |
and so on. E.g. |
- for { { T, 4, L }, 14, 0, 0 }, field values 0...14 encode themselves, |
but 15 encodes -1. |
- { { T, 8, L }, 127, 0, 2 } is a normal signed 8-bit operand that is |
shifted left two places. |
- { { T, 3, L }, 8, 0, 0 } is a normal unsigned 3-bit operand except |
that 0 encodes 8. |
- { { ... }, 0, 1, 3 } means that N encodes (N + 1) << 3. */ |
unsigned int max_val; |
int bias; |
unsigned int shift; |
/* True if the operand should be printed as hex rather than decimal. */ |
bfd_boolean print_hex; |
}; |
/* Uses a lookup table to describe a small integer operand. */ |
struct mips_mapped_int_operand |
{ |
struct mips_operand root; |
/* Maps each encoding value to the integer that it represents. */ |
const int *int_map; |
/* True if the operand should be printed as hex rather than decimal. */ |
bfd_boolean print_hex; |
}; |
/* An operand that encodes the most significant bit position of a bitfield. |
Given a bitfield that spans bits [MSB, LSB], some operands of this type |
encode MSB directly while others encode MSB - LSB. Each operand of this |
type is preceded by an integer operand that specifies LSB. |
The assembly form varies between instructions. For some instructions, |
such as EXT, the operand is written as the bitfield size. For others, |
such as EXTS, it is written in raw MSB - LSB form. */ |
struct mips_msb_operand |
{ |
struct mips_operand root; |
/* The assembly-level operand encoded by a field value of 0. */ |
int bias; |
/* True if the operand encodes MSB directly, false if it encodes |
MSB - LSB. */ |
bfd_boolean add_lsb; |
/* The maximum value of MSB + 1. */ |
unsigned int opsize; |
}; |
/* Describes a single register operand. */ |
struct mips_reg_operand |
{ |
struct mips_operand root; |
/* The type of register. */ |
enum mips_reg_operand_type reg_type; |
/* If nonnull, REG_MAP[N] gives the register associated with encoding N, |
otherwise the encoding is the same as the register number. */ |
const unsigned char *reg_map; |
}; |
/* Describes an operand that encodes a pair of registers. */ |
struct mips_reg_pair_operand |
{ |
struct mips_operand root; |
/* The type of register. */ |
enum mips_reg_operand_type reg_type; |
/* Encoding N represents REG1_MAP[N], REG2_MAP[N]. */ |
unsigned char *reg1_map; |
unsigned char *reg2_map; |
}; |
/* Describes an operand that is calculated relative to a base PC. |
The base PC is usually the address of the following instruction, |
but the rules for MIPS16 instructions like ADDIUPC are more complicated. */ |
struct mips_pcrel_operand |
{ |
/* Encodes the offset. */ |
struct mips_int_operand root; |
/* The low ALIGN_LOG2 bits of the base PC are cleared to give PC', |
which is then added to the offset encoded by ROOT. */ |
unsigned int align_log2 : 8; |
/* If INCLUDE_ISA_BIT, the ISA bit of the original base PC is then |
reinstated. This is true for jumps and branches and false for |
PC-relative data instructions. */ |
unsigned int include_isa_bit : 1; |
/* If FLIP_ISA_BIT, the ISA bit of the result is inverted. |
This is true for JALX and false otherwise. */ |
unsigned int flip_isa_bit : 1; |
}; |
/* Return true if the assembly syntax allows OPERAND to be omitted. */ |
static inline bfd_boolean |
mips_optional_operand_p (const struct mips_operand *operand) |
{ |
return (operand->type == OP_OPTIONAL_REG |
|| operand->type == OP_REPEAT_PREV_REG); |
} |
/* Return a version of INSN in which the field specified by OPERAND |
has value UVAL. */ |
static inline unsigned int |
mips_insert_operand (const struct mips_operand *operand, unsigned int insn, |
unsigned int uval) |
{ |
unsigned int mask; |
mask = (1 << operand->size) - 1; |
insn &= ~(mask << operand->lsb); |
insn |= (uval & mask) << operand->lsb; |
return insn; |
} |
/* Extract OPERAND from instruction INSN. */ |
static inline unsigned int |
mips_extract_operand (const struct mips_operand *operand, unsigned int insn) |
{ |
return (insn >> operand->lsb) & ((1 << operand->size) - 1); |
} |
/* UVAL is the value encoded by OPERAND. Return it in signed form. */ |
static inline int |
mips_signed_operand (const struct mips_operand *operand, unsigned int uval) |
{ |
unsigned int sign_bit, mask; |
mask = (1 << operand->size) - 1; |
sign_bit = 1 << (operand->size - 1); |
return ((uval + sign_bit) & mask) - sign_bit; |
} |
/* Return the integer that OPERAND encodes as UVAL. */ |
static inline int |
mips_decode_int_operand (const struct mips_int_operand *operand, |
unsigned int uval) |
{ |
uval |= (operand->max_val - uval) & -(1 << operand->root.size); |
uval += operand->bias; |
uval <<= operand->shift; |
return uval; |
} |
/* Return the maximum value that can be encoded by OPERAND. */ |
static inline int |
mips_int_operand_max (const struct mips_int_operand *operand) |
{ |
return (operand->max_val + operand->bias) << operand->shift; |
} |
/* Return the minimum value that can be encoded by OPERAND. */ |
static inline int |
mips_int_operand_min (const struct mips_int_operand *operand) |
{ |
unsigned int mask; |
mask = (1 << operand->root.size) - 1; |
return mips_int_operand_max (operand) - (mask << operand->shift); |
} |
/* Return the register that OPERAND encodes as UVAL. */ |
static inline int |
mips_decode_reg_operand (const struct mips_reg_operand *operand, |
unsigned int uval) |
{ |
if (operand->reg_map) |
uval = operand->reg_map[uval]; |
return uval; |
} |
/* PC-relative operand OPERAND has value UVAL and is relative to BASE_PC. |
Return the address that it encodes. */ |
static inline bfd_vma |
mips_decode_pcrel_operand (const struct mips_pcrel_operand *operand, |
bfd_vma base_pc, unsigned int uval) |
{ |
bfd_vma addr; |
addr = base_pc & -(1 << operand->align_log2); |
addr += mips_decode_int_operand (&operand->root, uval); |
if (operand->include_isa_bit) |
addr |= base_pc & 1; |
if (operand->flip_isa_bit) |
addr ^= 1; |
return addr; |
} |
/* This structure holds information for a particular instruction. */ |
struct mips_opcode |
{ |
/* The name of the instruction. */ |
const char *name; |
/* A string describing the arguments for this instruction. */ |
const char *args; |
/* The basic opcode for the instruction. When assembling, this |
opcode is modified by the arguments to produce the actual opcode |
that is used. If pinfo is INSN_MACRO, then this is 0. */ |
unsigned long match; |
/* If pinfo is not INSN_MACRO, then this is a bit mask for the |
relevant portions of the opcode when disassembling. If the |
actual opcode anded with the match field equals the opcode field, |
then we have found the correct instruction. If pinfo is |
INSN_MACRO, then this field is the macro identifier. */ |
unsigned long mask; |
/* For a macro, this is INSN_MACRO. Otherwise, it is a collection |
of bits describing the instruction, notably any relevant hazard |
information. */ |
unsigned long pinfo; |
/* A collection of additional bits describing the instruction. */ |
unsigned long pinfo2; |
/* A collection of bits describing the instruction sets of which this |
instruction or macro is a member. */ |
unsigned long membership; |
/* A collection of bits describing the ASE of which this instruction |
or macro is a member. */ |
unsigned long ase; |
/* A collection of bits describing the instruction sets of which this |
instruction or macro is not a member. */ |
unsigned long exclusions; |
}; |
/* These are the characters which may appear in the args field of an |
instruction. They appear in the order in which the fields appear |
when the instruction is used. Commas and parentheses in the args |
string are ignored when assembling, and written into the output |
when disassembling. |
Each of these characters corresponds to a mask field defined above. |
"1" 5 bit sync type (OP_*_STYPE) |
"<" 5 bit shift amount (OP_*_SHAMT) |
">" shift amount between 32 and 63, stored after subtracting 32 (OP_*_SHAMT) |
"a" 26 bit target address (OP_*_TARGET) |
"+i" likewise, but flips bit 0 |
"b" 5 bit base register (OP_*_RS) |
"c" 10 bit breakpoint code (OP_*_CODE) |
"d" 5 bit destination register specifier (OP_*_RD) |
"h" 5 bit prefx hint (OP_*_PREFX) |
"i" 16 bit unsigned immediate (OP_*_IMMEDIATE) |
"j" 16 bit signed immediate (OP_*_DELTA) |
"k" 5 bit cache opcode in target register position (OP_*_CACHE) |
"o" 16 bit signed offset (OP_*_DELTA) |
"p" 16 bit PC relative branch target address (OP_*_DELTA) |
"q" 10 bit extra breakpoint code (OP_*_CODE2) |
"r" 5 bit same register used as both source and target (OP_*_RS) |
"s" 5 bit source register specifier (OP_*_RS) |
"t" 5 bit target register (OP_*_RT) |
"u" 16 bit upper 16 bits of address (OP_*_IMMEDIATE) |
"v" 5 bit same register used as both source and destination (OP_*_RS) |
"w" 5 bit same register used as both target and destination (OP_*_RT) |
"U" 5 bit same destination register in both OP_*_RD and OP_*_RT |
(used by clo and clz) |
"C" 25 bit coprocessor function code (OP_*_COPZ) |
"B" 20 bit syscall/breakpoint function code (OP_*_CODE20) |
"J" 19 bit wait function code (OP_*_CODE19) |
"x" accept and ignore register name |
"z" must be zero register |
"K" 5 bit Hardware Register (rdhwr instruction) (OP_*_RD) |
"+A" 5 bit ins/ext/dins/dext/dinsm/dextm position, which becomes |
LSB (OP_*_SHAMT; OP_*_EXTLSB or OP_*_STYPE may be used for |
microMIPS compatibility). |
Enforces: 0 <= pos < 32. |
"+B" 5 bit ins/dins size, which becomes MSB (OP_*_INSMSB). |
Requires that "+A" or "+E" occur first to set position. |
Enforces: 0 < (pos+size) <= 32. |
"+C" 5 bit ext/dext size, which becomes MSBD (OP_*_EXTMSBD). |
Requires that "+A" or "+E" occur first to set position. |
Enforces: 0 < (pos+size) <= 32. |
(Also used by "dext" w/ different limits, but limits for |
that are checked by the M_DEXT macro.) |
"+E" 5 bit dinsu/dextu position, which becomes LSB-32 (OP_*_SHAMT). |
Enforces: 32 <= pos < 64. |
"+F" 5 bit "dinsm/dinsu" size, which becomes MSB-32 (OP_*_INSMSB). |
Requires that "+A" or "+E" occur first to set position. |
Enforces: 32 < (pos+size) <= 64. |
"+G" 5 bit "dextm" size, which becomes MSBD-32 (OP_*_EXTMSBD). |
Requires that "+A" or "+E" occur first to set position. |
Enforces: 32 < (pos+size) <= 64. |
"+H" 5 bit "dextu" size, which becomes MSBD (OP_*_EXTMSBD). |
Requires that "+A" or "+E" occur first to set position. |
Enforces: 32 < (pos+size) <= 64. |
Floating point instructions: |
"D" 5 bit destination register (OP_*_FD) |
"M" 3 bit compare condition code (OP_*_CCC) (only used for mips4 and up) |
"N" 3 bit branch condition code (OP_*_BCC) (only used for mips4 and up) |
"S" 5 bit fs source 1 register (OP_*_FS) |
"T" 5 bit ft source 2 register (OP_*_FT) |
"R" 5 bit fr source 3 register (OP_*_FR) |
"V" 5 bit same register used as floating source and destination (OP_*_FS) |
"W" 5 bit same register used as floating target and destination (OP_*_FT) |
Coprocessor instructions: |
"E" 5 bit target register (OP_*_RT) |
"G" 5 bit destination register (OP_*_RD) |
"H" 3 bit sel field for (d)mtc* and (d)mfc* (OP_*_SEL) |
"P" 5 bit performance-monitor register (OP_*_PERFREG) |
"e" 5 bit vector register byte specifier (OP_*_VECBYTE) |
"%" 3 bit immediate vr5400 vector alignment operand (OP_*_VECALIGN) |
Macro instructions: |
"A" General 32 bit expression |
"I" 32 bit immediate (value placed in imm_expr). |
"F" 64 bit floating point constant in .rdata |
"L" 64 bit floating point constant in .lit8 |
"f" 32 bit floating point constant |
"l" 32 bit floating point constant in .lit4 |
MDMX and VR5400 instruction operands (note that while these use the |
FP register fields, the MDMX instructions accept both $fN and $vN names |
for the registers): |
"O" alignment offset (OP_*_ALN) |
"Q" vector/scalar/immediate source (OP_*_VSEL and OP_*_FT) |
"X" destination register (OP_*_FD) |
"Y" source register (OP_*_FS) |
"Z" source register (OP_*_FT) |
R5900 VU0 Macromode instructions: |
"+5" 5 bit floating point register (FD) |
"+6" 5 bit floating point register (FS) |
"+7" 5 bit floating point register (FT) |
"+8" 5 bit integer register (FD) |
"+9" 5 bit integer register (FS) |
"+0" 5 bit integer register (FT) |
"+K" match an existing 4-bit channel mask starting at bit 21 |
"+L" 2-bit channel index starting at bit 21 |
"+M" 2-bit channel index starting at bit 23 |
"+N" match an existing 2-bit channel index starting at bit 0 |
"+f" 15 bit immediate for VCALLMS |
"+g" 5 bit signed immediate for VIADDI |
"+m" $ACC register (syntax only) |
"+q" $Q register (syntax only) |
"+r" $R register (syntax only) |
"+y" $I register (syntax only) |
"#+" "++" decorator in ($reg++) sequence |
"#-" "--" decorator in (--$reg) sequence |
DSP ASE usage: |
"2" 2 bit unsigned immediate for byte align (OP_*_BP) |
"3" 3 bit unsigned immediate (OP_*_SA3) |
"4" 4 bit unsigned immediate (OP_*_SA4) |
"5" 8 bit unsigned immediate (OP_*_IMM8) |
"6" 5 bit unsigned immediate (OP_*_RS) |
"7" 2 bit dsp accumulator register (OP_*_DSPACC) |
"8" 6 bit unsigned immediate (OP_*_WRDSP) |
"9" 2 bit dsp accumulator register (OP_*_DSPACC_S) |
"0" 6 bit signed immediate (OP_*_DSPSFT) |
":" 7 bit signed immediate (OP_*_DSPSFT_7) |
"'" 6 bit unsigned immediate (OP_*_RDDSP) |
"@" 10 bit signed immediate (OP_*_IMM10) |
MT ASE usage: |
"!" 1 bit usermode flag (OP_*_MT_U) |
"$" 1 bit load high flag (OP_*_MT_H) |
"*" 2 bit dsp/smartmips accumulator register (OP_*_MTACC_T) |
"&" 2 bit dsp/smartmips accumulator register (OP_*_MTACC_D) |
"g" 5 bit coprocessor 1 and 2 destination register (OP_*_RD) |
"+t" 5 bit coprocessor 0 destination register (OP_*_RT) |
MCU ASE usage: |
"~" 12 bit offset (OP_*_OFFSET12) |
"\" 3 bit position for aset and aclr (OP_*_3BITPOS) |
VIRT ASE usage: |
"+J" 10-bit hypcall code (OP_*CODE10) |
UDI immediates: |
"+1" UDI immediate bits 6-10 |
"+2" UDI immediate bits 6-15 |
"+3" UDI immediate bits 6-20 |
"+4" UDI immediate bits 6-25 |
Octeon: |
"+x" Bit index field of bbit. Enforces: 0 <= index < 32. |
"+X" Bit index field of bbit aliasing bbit32. Matches if 32 <= index < 64, |
otherwise skips to next candidate. |
"+p" Position field of cins/cins32/exts/exts32. Enforces 0 <= pos < 32. |
"+P" Position field of cins/exts aliasing cins32/exts32. Matches if |
32 <= pos < 64, otherwise skips to next candidate. |
"+Q" Immediate field of seqi/snei. Enforces -512 <= imm < 512. |
"+s" Length-minus-one field of cins32/exts32. Requires msb position |
of the field to be <= 31. |
"+S" Length-minus-one field of cins/exts. Requires msb position |
of the field to be <= 63. |
Loongson-3A: |
"+a" 8-bit signed offset in bit 6 (OP_*_OFFSET_A) |
"+b" 8-bit signed offset in bit 3 (OP_*_OFFSET_B) |
"+c" 9-bit signed offset in bit 6 (OP_*_OFFSET_C) |
"+z" 5-bit rz register (OP_*_RZ) |
"+Z" 5-bit fz register (OP_*_FZ) |
Enhanced VA Scheme: |
"+j" 9-bit signed offset in bit 7 (OP_*_EVAOFFSET) |
Other: |
"()" parens surrounding optional value |
"," separates operands |
"+" Start of extension sequence. |
Characters used so far, for quick reference when adding more: |
"1234567890" |
"%[]<>(),+:'@!#$*&\~" |
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" |
"abcdefghijklopqrstuvwxz" |
Extension character sequences used so far ("+" followed by the |
following), for quick reference when adding more: |
"1234567890" |
"ABCEFGHJKLMNPQSXZ" |
"abcfgijmpqrstxyz" |
*/ |
/* These are the bits which may be set in the pinfo field of an |
instructions, if it is not equal to INSN_MACRO. */ |
/* Writes to operand number N. */ |
#define INSN_WRITE_SHIFT 0 |
#define INSN_WRITE_1 0x00000001 |
#define INSN_WRITE_2 0x00000002 |
#define INSN_WRITE_ALL 0x00000003 |
/* Reads from operand number N. */ |
#define INSN_READ_SHIFT 2 |
#define INSN_READ_1 0x00000004 |
#define INSN_READ_2 0x00000008 |
#define INSN_READ_3 0x00000010 |
#define INSN_READ_4 0x00000020 |
#define INSN_READ_ALL 0x0000003c |
/* Modifies general purpose register 31. */ |
#define INSN_WRITE_GPR_31 0x00000040 |
/* Modifies coprocessor condition code. */ |
#define INSN_WRITE_COND_CODE 0x00000080 |
/* Reads coprocessor condition code. */ |
#define INSN_READ_COND_CODE 0x00000100 |
/* TLB operation. */ |
#define INSN_TLB 0x00000200 |
/* Reads coprocessor register other than floating point register. */ |
#define INSN_COP 0x00000400 |
/* Instruction loads value from memory, requiring delay. */ |
#define INSN_LOAD_MEMORY_DELAY 0x00000800 |
/* Instruction loads value from coprocessor, requiring delay. */ |
#define INSN_LOAD_COPROC_DELAY 0x00001000 |
/* Instruction has unconditional branch delay slot. */ |
#define INSN_UNCOND_BRANCH_DELAY 0x00002000 |
/* Instruction has conditional branch delay slot. */ |
#define INSN_COND_BRANCH_DELAY 0x00004000 |
/* Conditional branch likely: if branch not taken, insn nullified. */ |
#define INSN_COND_BRANCH_LIKELY 0x00008000 |
/* Moves to coprocessor register, requiring delay. */ |
#define INSN_COPROC_MOVE_DELAY 0x00010000 |
/* Loads coprocessor register from memory, requiring delay. */ |
#define INSN_COPROC_MEMORY_DELAY 0x00020000 |
/* Reads the HI register. */ |
#define INSN_READ_HI 0x00040000 |
/* Reads the LO register. */ |
#define INSN_READ_LO 0x00080000 |
/* Modifies the HI register. */ |
#define INSN_WRITE_HI 0x00100000 |
/* Modifies the LO register. */ |
#define INSN_WRITE_LO 0x00200000 |
/* Not to be placed in a branch delay slot, either architecturally |
or for ease of handling (such as with instructions that take a trap). */ |
#define INSN_NO_DELAY_SLOT 0x00400000 |
/* Instruction stores value into memory. */ |
#define INSN_STORE_MEMORY 0x00800000 |
/* Instruction uses single precision floating point. */ |
#define FP_S 0x01000000 |
/* Instruction uses double precision floating point. */ |
#define FP_D 0x02000000 |
/* Instruction is part of the tx39's integer multiply family. */ |
#define INSN_MULT 0x04000000 |
/* Reads general purpose register 24. */ |
#define INSN_READ_GPR_24 0x08000000 |
/* Writes to general purpose register 24. */ |
#define INSN_WRITE_GPR_24 0x10000000 |
/* A user-defined instruction. */ |
#define INSN_UDI 0x20000000 |
/* Instruction is actually a macro. It should be ignored by the |
disassembler, and requires special treatment by the assembler. */ |
#define INSN_MACRO 0xffffffff |
/* These are the bits which may be set in the pinfo2 field of an |
instruction. */ |
/* Instruction is a simple alias (I.E. "move" for daddu/addu/or) */ |
#define INSN2_ALIAS 0x00000001 |
/* Instruction reads MDMX accumulator. */ |
#define INSN2_READ_MDMX_ACC 0x00000002 |
/* Instruction writes MDMX accumulator. */ |
#define INSN2_WRITE_MDMX_ACC 0x00000004 |
/* Macro uses single-precision floating-point instructions. This should |
only be set for macros. For instructions, FP_S in pinfo carries the |
same information. */ |
#define INSN2_M_FP_S 0x00000008 |
/* Macro uses double-precision floating-point instructions. This should |
only be set for macros. For instructions, FP_D in pinfo carries the |
same information. */ |
#define INSN2_M_FP_D 0x00000010 |
/* Instruction has a branch delay slot that requires a 16-bit instruction. */ |
#define INSN2_BRANCH_DELAY_16BIT 0x00000020 |
/* Instruction has a branch delay slot that requires a 32-bit instruction. */ |
#define INSN2_BRANCH_DELAY_32BIT 0x00000040 |
/* Writes to the stack pointer ($29). */ |
#define INSN2_WRITE_SP 0x00000080 |
/* Reads from the stack pointer ($29). */ |
#define INSN2_READ_SP 0x00000100 |
/* Reads the RA ($31) register. */ |
#define INSN2_READ_GPR_31 0x00000200 |
/* Reads the program counter ($pc). */ |
#define INSN2_READ_PC 0x00000400 |
/* Is an unconditional branch insn. */ |
#define INSN2_UNCOND_BRANCH 0x00000800 |
/* Is a conditional branch insn. */ |
#define INSN2_COND_BRANCH 0x00001000 |
/* Reads from $16. This is true of the MIPS16 0x6500 nop. */ |
#define INSN2_READ_GPR_16 0x00002000 |
/* Has an "\.x?y?z?w?" suffix based on mips_vu0_channel_mask. */ |
#define INSN2_VU0_CHANNEL_SUFFIX 0x00004000 |
/* Masks used to mark instructions to indicate which MIPS ISA level |
they were introduced in. INSN_ISA_MASK masks an enumeration that |
specifies the base ISA level(s). The remainder of a 32-bit |
word constructed using these macros is a bitmask of the remaining |
INSN_* values below. */ |
#define INSN_ISA_MASK 0x0000000ful |
/* We cannot start at zero due to ISA_UNKNOWN below. */ |
#define INSN_ISA1 1 |
#define INSN_ISA2 2 |
#define INSN_ISA3 3 |
#define INSN_ISA4 4 |
#define INSN_ISA5 5 |
#define INSN_ISA32 6 |
#define INSN_ISA32R2 7 |
#define INSN_ISA64 8 |
#define INSN_ISA64R2 9 |
/* Below this point the INSN_* values correspond to combinations of ISAs. |
They are only for use in the opcodes table to indicate membership of |
a combination of ISAs that cannot be expressed using the usual inclusion |
ordering on the above INSN_* values. */ |
#define INSN_ISA3_32 10 |
#define INSN_ISA3_32R2 11 |
#define INSN_ISA4_32 12 |
#define INSN_ISA4_32R2 13 |
#define INSN_ISA5_32R2 14 |
/* Given INSN_ISA* values X and Y, where X ranges over INSN_ISA1 through |
INSN_ISA5_32R2 and Y ranges over INSN_ISA1 through INSN_ISA64R2, |
this table describes whether at least one of the ISAs described by X |
is/are implemented by ISA Y. (Think of Y as the ISA level supported by |
a particular core and X as the ISA level(s) at which a certain instruction |
is defined.) The ISA(s) described by X is/are implemented by Y iff |
(mips_isa_table[(Y & INSN_ISA_MASK) - 1] >> ((X & INSN_ISA_MASK) - 1)) & 1 |
is non-zero. */ |
static const unsigned int mips_isa_table[] = |
{ 0x0001, 0x0003, 0x0607, 0x1e0f, 0x3e1f, 0x0a23, 0x3e63, 0x3ebf, 0x3fff }; |
/* Masks used for Chip specific instructions. */ |
#define INSN_CHIP_MASK 0xc3ff0f20 |
/* Cavium Networks Octeon instructions. */ |
#define INSN_OCTEON 0x00000800 |
#define INSN_OCTEONP 0x00000200 |
#define INSN_OCTEON2 0x00000100 |
/* MIPS R5900 instruction */ |
#define INSN_5900 0x00004000 |
/* MIPS R4650 instruction. */ |
#define INSN_4650 0x00010000 |
/* LSI R4010 instruction. */ |
#define INSN_4010 0x00020000 |
/* NEC VR4100 instruction. */ |
#define INSN_4100 0x00040000 |
/* Toshiba R3900 instruction. */ |
#define INSN_3900 0x00080000 |
/* MIPS R10000 instruction. */ |
#define INSN_10000 0x00100000 |
/* Broadcom SB-1 instruction. */ |
#define INSN_SB1 0x00200000 |
/* NEC VR4111/VR4181 instruction. */ |
#define INSN_4111 0x00400000 |
/* NEC VR4120 instruction. */ |
#define INSN_4120 0x00800000 |
/* NEC VR5400 instruction. */ |
#define INSN_5400 0x01000000 |
/* NEC VR5500 instruction. */ |
#define INSN_5500 0x02000000 |
/* ST Microelectronics Loongson 2E. */ |
#define INSN_LOONGSON_2E 0x40000000 |
/* ST Microelectronics Loongson 2F. */ |
#define INSN_LOONGSON_2F 0x80000000 |
/* Loongson 3A. */ |
#define INSN_LOONGSON_3A 0x00000400 |
/* RMI Xlr instruction */ |
#define INSN_XLR 0x00000020 |
/* DSP ASE */ |
#define ASE_DSP 0x00000001 |
#define ASE_DSP64 0x00000002 |
/* DSP R2 ASE */ |
#define ASE_DSPR2 0x00000004 |
/* Enhanced VA Scheme */ |
#define ASE_EVA 0x00000008 |
/* MCU (MicroController) ASE */ |
#define ASE_MCU 0x00000010 |
/* MDMX ASE */ |
#define ASE_MDMX 0x00000020 |
/* MIPS-3D ASE */ |
#define ASE_MIPS3D 0x00000040 |
/* MT ASE */ |
#define ASE_MT 0x00000080 |
/* SmartMIPS ASE */ |
#define ASE_SMARTMIPS 0x00000100 |
/* Virtualization ASE */ |
#define ASE_VIRT 0x00000200 |
#define ASE_VIRT64 0x00000400 |
/* MIPS ISA defines, use instead of hardcoding ISA level. */ |
#define ISA_UNKNOWN 0 /* Gas internal use. */ |
#define ISA_MIPS1 INSN_ISA1 |
#define ISA_MIPS2 INSN_ISA2 |
#define ISA_MIPS3 INSN_ISA3 |
#define ISA_MIPS4 INSN_ISA4 |
#define ISA_MIPS5 INSN_ISA5 |
#define ISA_MIPS32 INSN_ISA32 |
#define ISA_MIPS64 INSN_ISA64 |
#define ISA_MIPS32R2 INSN_ISA32R2 |
#define ISA_MIPS64R2 INSN_ISA64R2 |
/* CPU defines, use instead of hardcoding processor number. Keep this |
in sync with bfd/archures.c in order for machine selection to work. */ |
#define CPU_UNKNOWN 0 /* Gas internal use. */ |
#define CPU_R3000 3000 |
#define CPU_R3900 3900 |
#define CPU_R4000 4000 |
#define CPU_R4010 4010 |
#define CPU_VR4100 4100 |
#define CPU_R4111 4111 |
#define CPU_VR4120 4120 |
#define CPU_R4300 4300 |
#define CPU_R4400 4400 |
#define CPU_R4600 4600 |
#define CPU_R4650 4650 |
#define CPU_R5000 5000 |
#define CPU_VR5400 5400 |
#define CPU_VR5500 5500 |
#define CPU_R5900 5900 |
#define CPU_R6000 6000 |
#define CPU_RM7000 7000 |
#define CPU_R8000 8000 |
#define CPU_RM9000 9000 |
#define CPU_R10000 10000 |
#define CPU_R12000 12000 |
#define CPU_R14000 14000 |
#define CPU_R16000 16000 |
#define CPU_MIPS16 16 |
#define CPU_MIPS32 32 |
#define CPU_MIPS32R2 33 |
#define CPU_MIPS5 5 |
#define CPU_MIPS64 64 |
#define CPU_MIPS64R2 65 |
#define CPU_SB1 12310201 /* octal 'SB', 01. */ |
#define CPU_LOONGSON_2E 3001 |
#define CPU_LOONGSON_2F 3002 |
#define CPU_LOONGSON_3A 3003 |
#define CPU_OCTEON 6501 |
#define CPU_OCTEONP 6601 |
#define CPU_OCTEON2 6502 |
#define CPU_XLR 887682 /* decimal 'XLR' */ |
/* Return true if the given CPU is included in INSN_* mask MASK. */ |
static inline bfd_boolean |
cpu_is_member (int cpu, unsigned int mask) |
{ |
switch (cpu) |
{ |
case CPU_R4650: |
case CPU_RM7000: |
case CPU_RM9000: |
return (mask & INSN_4650) != 0; |
case CPU_R4010: |
return (mask & INSN_4010) != 0; |
case CPU_VR4100: |
return (mask & INSN_4100) != 0; |
case CPU_R3900: |
return (mask & INSN_3900) != 0; |
case CPU_R10000: |
case CPU_R12000: |
case CPU_R14000: |
case CPU_R16000: |
return (mask & INSN_10000) != 0; |
case CPU_SB1: |
return (mask & INSN_SB1) != 0; |
case CPU_R4111: |
return (mask & INSN_4111) != 0; |
case CPU_VR4120: |
return (mask & INSN_4120) != 0; |
case CPU_VR5400: |
return (mask & INSN_5400) != 0; |
case CPU_VR5500: |
return (mask & INSN_5500) != 0; |
case CPU_R5900: |
return (mask & INSN_5900) != 0; |
case CPU_LOONGSON_2E: |
return (mask & INSN_LOONGSON_2E) != 0; |
case CPU_LOONGSON_2F: |
return (mask & INSN_LOONGSON_2F) != 0; |
case CPU_LOONGSON_3A: |
return (mask & INSN_LOONGSON_3A) != 0; |
case CPU_OCTEON: |
return (mask & INSN_OCTEON) != 0; |
case CPU_OCTEONP: |
return (mask & INSN_OCTEONP) != 0; |
case CPU_OCTEON2: |
return (mask & INSN_OCTEON2) != 0; |
case CPU_XLR: |
return (mask & INSN_XLR) != 0; |
default: |
return FALSE; |
} |
} |
/* Test for membership in an ISA including chip specific ISAs. INSN |
is pointer to an element of the opcode table; ISA is the specified |
ISA/ASE bitmask to test against; and CPU is the CPU specific ISA to |
test, or zero if no CPU specific ISA test is desired. Return true |
if instruction INSN is available to the given ISA and CPU. */ |
static inline bfd_boolean |
opcode_is_member (const struct mips_opcode *insn, int isa, int ase, int cpu) |
{ |
if (!cpu_is_member (cpu, insn->exclusions)) |
{ |
/* Test for ISA level compatibility. */ |
if ((isa & INSN_ISA_MASK) != 0 |
&& (insn->membership & INSN_ISA_MASK) != 0 |
&& ((mips_isa_table[(isa & INSN_ISA_MASK) - 1] |
>> ((insn->membership & INSN_ISA_MASK) - 1)) & 1) != 0) |
return TRUE; |
/* Test for ASE compatibility. */ |
if ((ase & insn->ase) != 0) |
return TRUE; |
/* Test for processor-specific extensions. */ |
if (cpu_is_member (cpu, insn->membership)) |
return TRUE; |
} |
return FALSE; |
} |
/* This is a list of macro expanded instructions. |
_I appended means immediate |
_A appended means target address of a jump |
_AB appended means address with (possibly zero) base register |
_D appended means 64 bit floating point constant |
_S appended means 32 bit floating point constant. */ |
enum |
{ |
M_ABS, |
M_ACLR_AB, |
M_ADD_I, |
M_ADDU_I, |
M_AND_I, |
M_ASET_AB, |
M_BALIGN, |
M_BC1FL, |
M_BC1TL, |
M_BC2FL, |
M_BC2TL, |
M_BEQ, |
M_BEQ_I, |
M_BEQL, |
M_BEQL_I, |
M_BGE, |
M_BGEL, |
M_BGE_I, |
M_BGEL_I, |
M_BGEU, |
M_BGEUL, |
M_BGEU_I, |
M_BGEUL_I, |
M_BGEZ, |
M_BGEZL, |
M_BGEZALL, |
M_BGT, |
M_BGTL, |
M_BGT_I, |
M_BGTL_I, |
M_BGTU, |
M_BGTUL, |
M_BGTU_I, |
M_BGTUL_I, |
M_BGTZ, |
M_BGTZL, |
M_BLE, |
M_BLEL, |
M_BLE_I, |
M_BLEL_I, |
M_BLEU, |
M_BLEUL, |
M_BLEU_I, |
M_BLEUL_I, |
M_BLEZ, |
M_BLEZL, |
M_BLT, |
M_BLTL, |
M_BLT_I, |
M_BLTL_I, |
M_BLTU, |
M_BLTUL, |
M_BLTU_I, |
M_BLTUL_I, |
M_BLTZ, |
M_BLTZL, |
M_BLTZALL, |
M_BNE, |
M_BNEL, |
M_BNE_I, |
M_BNEL_I, |
M_CACHE_AB, |
M_CACHEE_AB, |
M_DABS, |
M_DADD_I, |
M_DADDU_I, |
M_DDIV_3, |
M_DDIV_3I, |
M_DDIVU_3, |
M_DDIVU_3I, |
M_DIV_3, |
M_DIV_3I, |
M_DIVU_3, |
M_DIVU_3I, |
M_DLA_AB, |
M_DLCA_AB, |
M_DLI, |
M_DMUL, |
M_DMUL_I, |
M_DMULO, |
M_DMULO_I, |
M_DMULOU, |
M_DMULOU_I, |
M_DREM_3, |
M_DREM_3I, |
M_DREMU_3, |
M_DREMU_3I, |
M_DSUB_I, |
M_DSUBU_I, |
M_DSUBU_I_2, |
M_J_A, |
M_JAL_1, |
M_JAL_2, |
M_JAL_A, |
M_JALS_1, |
M_JALS_2, |
M_JALS_A, |
M_JRADDIUSP, |
M_JRC, |
M_L_DAB, |
M_LA_AB, |
M_LB_AB, |
M_LBE_AB, |
M_LBU_AB, |
M_LBUE_AB, |
M_LCA_AB, |
M_LD_AB, |
M_LDC1_AB, |
M_LDC2_AB, |
M_LQC2_AB, |
M_LDC3_AB, |
M_LDL_AB, |
M_LDM_AB, |
M_LDP_AB, |
M_LDR_AB, |
M_LH_AB, |
M_LHE_AB, |
M_LHU_AB, |
M_LHUE_AB, |
M_LI, |
M_LI_D, |
M_LI_DD, |
M_LI_S, |
M_LI_SS, |
M_LL_AB, |
M_LLD_AB, |
M_LLE_AB, |
M_LQ_AB, |
M_LW_AB, |
M_LWE_AB, |
M_LWC0_AB, |
M_LWC1_AB, |
M_LWC2_AB, |
M_LWC3_AB, |
M_LWL_AB, |
M_LWLE_AB, |
M_LWM_AB, |
M_LWP_AB, |
M_LWR_AB, |
M_LWRE_AB, |
M_LWU_AB, |
M_MSGSND, |
M_MSGLD, |
M_MSGLD_T, |
M_MSGWAIT, |
M_MSGWAIT_T, |
M_MOVE, |
M_MOVEP, |
M_MUL, |
M_MUL_I, |
M_MULO, |
M_MULO_I, |
M_MULOU, |
M_MULOU_I, |
M_NOR_I, |
M_OR_I, |
M_PREF_AB, |
M_PREFE_AB, |
M_REM_3, |
M_REM_3I, |
M_REMU_3, |
M_REMU_3I, |
M_DROL, |
M_ROL, |
M_DROL_I, |
M_ROL_I, |
M_DROR, |
M_ROR, |
M_DROR_I, |
M_ROR_I, |
M_S_DA, |
M_S_DAB, |
M_S_S, |
M_SAA_AB, |
M_SAAD_AB, |
M_SC_AB, |
M_SCD_AB, |
M_SCE_AB, |
M_SD_AB, |
M_SDC1_AB, |
M_SDC2_AB, |
M_SQC2_AB, |
M_SDC3_AB, |
M_SDL_AB, |
M_SDM_AB, |
M_SDP_AB, |
M_SDR_AB, |
M_SEQ, |
M_SEQ_I, |
M_SGE, |
M_SGE_I, |
M_SGEU, |
M_SGEU_I, |
M_SGT, |
M_SGT_I, |
M_SGTU, |
M_SGTU_I, |
M_SLE, |
M_SLE_I, |
M_SLEU, |
M_SLEU_I, |
M_SLT_I, |
M_SLTU_I, |
M_SNE, |
M_SNE_I, |
M_SB_AB, |
M_SBE_AB, |
M_SH_AB, |
M_SHE_AB, |
M_SQ_AB, |
M_SW_AB, |
M_SWE_AB, |
M_SWC0_AB, |
M_SWC1_AB, |
M_SWC2_AB, |
M_SWC3_AB, |
M_SWL_AB, |
M_SWLE_AB, |
M_SWM_AB, |
M_SWP_AB, |
M_SWR_AB, |
M_SWRE_AB, |
M_SUB_I, |
M_SUBU_I, |
M_SUBU_I_2, |
M_TEQ_I, |
M_TGE_I, |
M_TGEU_I, |
M_TLT_I, |
M_TLTU_I, |
M_TNE_I, |
M_TRUNCWD, |
M_TRUNCWS, |
M_ULD_AB, |
M_ULH_AB, |
M_ULHU_AB, |
M_ULW_AB, |
M_USH_AB, |
M_USW_AB, |
M_USD_AB, |
M_XOR_I, |
M_COP0, |
M_COP1, |
M_COP2, |
M_COP3, |
M_NUM_MACROS |
}; |
/* The order of overloaded instructions matters. Label arguments and |
register arguments look the same. Instructions that can have either |
for arguments must apear in the correct order in this table for the |
assembler to pick the right one. In other words, entries with |
immediate operands must apear after the same instruction with |
registers. |
Many instructions are short hand for other instructions (i.e., The |
jal <register> instruction is short for jalr <register>). */ |
extern const struct mips_operand mips_vu0_channel_mask; |
extern const struct mips_operand *decode_mips_operand (const char *); |
extern const struct mips_opcode mips_builtin_opcodes[]; |
extern const int bfd_mips_num_builtin_opcodes; |
extern struct mips_opcode *mips_opcodes; |
extern int bfd_mips_num_opcodes; |
#define NUMOPCODES bfd_mips_num_opcodes |
/* The rest of this file adds definitions for the mips16 TinyRISC |
processor. */ |
/* These are the bitmasks and shift counts used for the different |
fields in the instruction formats. Other than OP, no masks are |
provided for the fixed portions of an instruction, since they are |
not needed. |
The I format uses IMM11. |
The RI format uses RX and IMM8. |
The RR format uses RX, and RY. |
The RRI format uses RX, RY, and IMM5. |
The RRR format uses RX, RY, and RZ. |
The RRI_A format uses RX, RY, and IMM4. |
The SHIFT format uses RX, RY, and SHAMT. |
The I8 format uses IMM8. |
The I8_MOVR32 format uses RY and REGR32. |
The IR_MOV32R format uses REG32R and MOV32Z. |
The I64 format uses IMM8. |
The RI64 format uses RY and IMM5. |
*/ |
#define MIPS16OP_MASK_OP 0x1f |
#define MIPS16OP_SH_OP 11 |
#define MIPS16OP_MASK_IMM11 0x7ff |
#define MIPS16OP_SH_IMM11 0 |
#define MIPS16OP_MASK_RX 0x7 |
#define MIPS16OP_SH_RX 8 |
#define MIPS16OP_MASK_IMM8 0xff |
#define MIPS16OP_SH_IMM8 0 |
#define MIPS16OP_MASK_RY 0x7 |
#define MIPS16OP_SH_RY 5 |
#define MIPS16OP_MASK_IMM5 0x1f |
#define MIPS16OP_SH_IMM5 0 |
#define MIPS16OP_MASK_RZ 0x7 |
#define MIPS16OP_SH_RZ 2 |
#define MIPS16OP_MASK_IMM4 0xf |
#define MIPS16OP_SH_IMM4 0 |
#define MIPS16OP_MASK_REGR32 0x1f |
#define MIPS16OP_SH_REGR32 0 |
#define MIPS16OP_MASK_REG32R 0x1f |
#define MIPS16OP_SH_REG32R 3 |
#define MIPS16OP_EXTRACT_REG32R(i) ((((i) >> 5) & 7) | ((i) & 0x18)) |
#define MIPS16OP_MASK_MOVE32Z 0x7 |
#define MIPS16OP_SH_MOVE32Z 0 |
#define MIPS16OP_MASK_IMM6 0x3f |
#define MIPS16OP_SH_IMM6 5 |
/* These are the characters which may appears in the args field of a MIPS16 |
instruction. They appear in the order in which the fields appear when the |
instruction is used. Commas and parentheses in the args string are ignored |
when assembling, and written into the output when disassembling. |
"y" 3 bit register (MIPS16OP_*_RY) |
"x" 3 bit register (MIPS16OP_*_RX) |
"z" 3 bit register (MIPS16OP_*_RZ) |
"Z" 3 bit register (MIPS16OP_*_MOVE32Z) |
"v" 3 bit same register as source and destination (MIPS16OP_*_RX) |
"w" 3 bit same register as source and destination (MIPS16OP_*_RY) |
"0" zero register ($0) |
"S" stack pointer ($sp or $29) |
"P" program counter |
"R" return address register ($ra or $31) |
"X" 5 bit MIPS register (MIPS16OP_*_REGR32) |
"Y" 5 bit MIPS register (MIPS16OP_*_REG32R) |
"6" 6 bit unsigned break code (MIPS16OP_*_IMM6) |
"a" 26 bit jump address |
"i" likewise, but flips bit 0 |
"e" 11 bit extension value |
"l" register list for entry instruction |
"L" register list for exit instruction |
"I" an immediate value used for macros |
The remaining codes may be extended. Except as otherwise noted, |
the full extended operand is a 16 bit signed value. |
"<" 3 bit unsigned shift count * 0 (MIPS16OP_*_RZ) (full 5 bit unsigned) |
">" 3 bit unsigned shift count * 0 (MIPS16OP_*_RX) (full 5 bit unsigned) |
"[" 3 bit unsigned shift count * 0 (MIPS16OP_*_RZ) (full 6 bit unsigned) |
"]" 3 bit unsigned shift count * 0 (MIPS16OP_*_RX) (full 6 bit unsigned) |
"4" 4 bit signed immediate * 0 (MIPS16OP_*_IMM4) (full 15 bit signed) |
"5" 5 bit unsigned immediate * 0 (MIPS16OP_*_IMM5) |
"H" 5 bit unsigned immediate * 2 (MIPS16OP_*_IMM5) |
"W" 5 bit unsigned immediate * 4 (MIPS16OP_*_IMM5) |
"D" 5 bit unsigned immediate * 8 (MIPS16OP_*_IMM5) |
"j" 5 bit signed immediate * 0 (MIPS16OP_*_IMM5) |
"8" 8 bit unsigned immediate * 0 (MIPS16OP_*_IMM8) |
"V" 8 bit unsigned immediate * 4 (MIPS16OP_*_IMM8) |
"C" 8 bit unsigned immediate * 8 (MIPS16OP_*_IMM8) |
"U" 8 bit unsigned immediate * 0 (MIPS16OP_*_IMM8) (full 16 bit unsigned) |
"k" 8 bit signed immediate * 0 (MIPS16OP_*_IMM8) |
"K" 8 bit signed immediate * 8 (MIPS16OP_*_IMM8) |
"p" 8 bit conditional branch address (MIPS16OP_*_IMM8) |
"q" 11 bit branch address (MIPS16OP_*_IMM11) |
"A" 8 bit PC relative address * 4 (MIPS16OP_*_IMM8) |
"B" 5 bit PC relative address * 8 (MIPS16OP_*_IMM5) |
"E" 5 bit PC relative address * 4 (MIPS16OP_*_IMM5) |
"m" 7 bit register list for save instruction (18 bit extended) |
"M" 7 bit register list for restore instruction (18 bit extended) |
*/ |
/* Save/restore encoding for the args field when all 4 registers are |
either saved as arguments or saved/restored as statics. */ |
#define MIPS16_ALL_ARGS 0xe |
#define MIPS16_ALL_STATICS 0xb |
/* The following flags have the same value for the mips16 opcode |
table: |
INSN_ISA3 |
INSN_UNCOND_BRANCH_DELAY |
INSN_COND_BRANCH_DELAY |
INSN_COND_BRANCH_LIKELY (never used) |
INSN_READ_HI |
INSN_READ_LO |
INSN_WRITE_HI |
INSN_WRITE_LO |
INSN_TRAP |
FP_D (never used) |
*/ |
extern const struct mips_operand *decode_mips16_operand (char, bfd_boolean); |
extern const struct mips_opcode mips16_opcodes[]; |
extern const int bfd_mips16_num_opcodes; |
/* These are the bit masks and shift counts used for the different fields |
in the microMIPS instruction formats. No masks are provided for the |
fixed portions of an instruction, since they are not needed. */ |
#define MICROMIPSOP_MASK_IMMEDIATE 0xffff |
#define MICROMIPSOP_SH_IMMEDIATE 0 |
#define MICROMIPSOP_MASK_DELTA 0xffff |
#define MICROMIPSOP_SH_DELTA 0 |
#define MICROMIPSOP_MASK_CODE10 0x3ff |
#define MICROMIPSOP_SH_CODE10 16 /* 10-bit wait code. */ |
#define MICROMIPSOP_MASK_TRAP 0xf |
#define MICROMIPSOP_SH_TRAP 12 /* 4-bit trap code. */ |
#define MICROMIPSOP_MASK_SHAMT 0x1f |
#define MICROMIPSOP_SH_SHAMT 11 |
#define MICROMIPSOP_MASK_TARGET 0x3ffffff |
#define MICROMIPSOP_SH_TARGET 0 |
#define MICROMIPSOP_MASK_EXTLSB 0x1f /* "ext" LSB. */ |
#define MICROMIPSOP_SH_EXTLSB 6 |
#define MICROMIPSOP_MASK_EXTMSBD 0x1f /* "ext" MSBD. */ |
#define MICROMIPSOP_SH_EXTMSBD 11 |
#define MICROMIPSOP_MASK_INSMSB 0x1f /* "ins" MSB. */ |
#define MICROMIPSOP_SH_INSMSB 11 |
#define MICROMIPSOP_MASK_CODE 0x3ff |
#define MICROMIPSOP_SH_CODE 16 /* 10-bit higher break code. */ |
#define MICROMIPSOP_MASK_CODE2 0x3ff |
#define MICROMIPSOP_SH_CODE2 6 /* 10-bit lower break code. */ |
#define MICROMIPSOP_MASK_CACHE 0x1f |
#define MICROMIPSOP_SH_CACHE 21 /* 5-bit cache op. */ |
#define MICROMIPSOP_MASK_SEL 0x7 |
#define MICROMIPSOP_SH_SEL 11 |
#define MICROMIPSOP_MASK_OFFSET12 0xfff |
#define MICROMIPSOP_SH_OFFSET12 0 |
#define MICROMIPSOP_MASK_3BITPOS 0x7 |
#define MICROMIPSOP_SH_3BITPOS 21 |
#define MICROMIPSOP_MASK_STYPE 0x1f |
#define MICROMIPSOP_SH_STYPE 16 |
#define MICROMIPSOP_MASK_OFFSET10 0x3ff |
#define MICROMIPSOP_SH_OFFSET10 6 |
#define MICROMIPSOP_MASK_RS 0x1f |
#define MICROMIPSOP_SH_RS 16 |
#define MICROMIPSOP_MASK_RT 0x1f |
#define MICROMIPSOP_SH_RT 21 |
#define MICROMIPSOP_MASK_RD 0x1f |
#define MICROMIPSOP_SH_RD 11 |
#define MICROMIPSOP_MASK_FS 0x1f |
#define MICROMIPSOP_SH_FS 16 |
#define MICROMIPSOP_MASK_FT 0x1f |
#define MICROMIPSOP_SH_FT 21 |
#define MICROMIPSOP_MASK_FD 0x1f |
#define MICROMIPSOP_SH_FD 11 |
#define MICROMIPSOP_MASK_FR 0x1f |
#define MICROMIPSOP_SH_FR 6 |
#define MICROMIPSOP_MASK_RS3 0x1f |
#define MICROMIPSOP_SH_RS3 6 |
#define MICROMIPSOP_MASK_PREFX 0x1f |
#define MICROMIPSOP_SH_PREFX 11 |
#define MICROMIPSOP_MASK_BCC 0x7 |
#define MICROMIPSOP_SH_BCC 18 |
#define MICROMIPSOP_MASK_CCC 0x7 |
#define MICROMIPSOP_SH_CCC 13 |
#define MICROMIPSOP_MASK_COPZ 0x7fffff |
#define MICROMIPSOP_SH_COPZ 3 |
#define MICROMIPSOP_MASK_MB 0x7 |
#define MICROMIPSOP_SH_MB 23 |
#define MICROMIPSOP_MASK_MC 0x7 |
#define MICROMIPSOP_SH_MC 4 |
#define MICROMIPSOP_MASK_MD 0x7 |
#define MICROMIPSOP_SH_MD 7 |
#define MICROMIPSOP_MASK_ME 0x7 |
#define MICROMIPSOP_SH_ME 1 |
#define MICROMIPSOP_MASK_MF 0x7 |
#define MICROMIPSOP_SH_MF 3 |
#define MICROMIPSOP_MASK_MG 0x7 |
#define MICROMIPSOP_SH_MG 0 |
#define MICROMIPSOP_MASK_MH 0x7 |
#define MICROMIPSOP_SH_MH 7 |
#define MICROMIPSOP_MASK_MJ 0x1f |
#define MICROMIPSOP_SH_MJ 0 |
#define MICROMIPSOP_MASK_ML 0x7 |
#define MICROMIPSOP_SH_ML 4 |
#define MICROMIPSOP_MASK_MM 0x7 |
#define MICROMIPSOP_SH_MM 1 |
#define MICROMIPSOP_MASK_MN 0x7 |
#define MICROMIPSOP_SH_MN 4 |
#define MICROMIPSOP_MASK_MP 0x1f |
#define MICROMIPSOP_SH_MP 5 |
#define MICROMIPSOP_MASK_MQ 0x7 |
#define MICROMIPSOP_SH_MQ 7 |
#define MICROMIPSOP_MASK_IMMA 0x7f |
#define MICROMIPSOP_SH_IMMA 0 |
#define MICROMIPSOP_MASK_IMMB 0x7 |
#define MICROMIPSOP_SH_IMMB 1 |
#define MICROMIPSOP_MASK_IMMC 0xf |
#define MICROMIPSOP_SH_IMMC 0 |
#define MICROMIPSOP_MASK_IMMD 0x3ff |
#define MICROMIPSOP_SH_IMMD 0 |
#define MICROMIPSOP_MASK_IMME 0x7f |
#define MICROMIPSOP_SH_IMME 0 |
#define MICROMIPSOP_MASK_IMMF 0xf |
#define MICROMIPSOP_SH_IMMF 0 |
#define MICROMIPSOP_MASK_IMMG 0xf |
#define MICROMIPSOP_SH_IMMG 0 |
#define MICROMIPSOP_MASK_IMMH 0xf |
#define MICROMIPSOP_SH_IMMH 0 |
#define MICROMIPSOP_MASK_IMMI 0x7f |
#define MICROMIPSOP_SH_IMMI 0 |
#define MICROMIPSOP_MASK_IMMJ 0xf |
#define MICROMIPSOP_SH_IMMJ 0 |
#define MICROMIPSOP_MASK_IMML 0xf |
#define MICROMIPSOP_SH_IMML 0 |
#define MICROMIPSOP_MASK_IMMM 0x7 |
#define MICROMIPSOP_SH_IMMM 1 |
#define MICROMIPSOP_MASK_IMMN 0x3 |
#define MICROMIPSOP_SH_IMMN 4 |
#define MICROMIPSOP_MASK_IMMO 0xf |
#define MICROMIPSOP_SH_IMMO 0 |
#define MICROMIPSOP_MASK_IMMP 0x1f |
#define MICROMIPSOP_SH_IMMP 0 |
#define MICROMIPSOP_MASK_IMMQ 0x7fffff |
#define MICROMIPSOP_SH_IMMQ 0 |
#define MICROMIPSOP_MASK_IMMU 0x1f |
#define MICROMIPSOP_SH_IMMU 0 |
#define MICROMIPSOP_MASK_IMMW 0x3f |
#define MICROMIPSOP_SH_IMMW 1 |
#define MICROMIPSOP_MASK_IMMX 0xf |
#define MICROMIPSOP_SH_IMMX 1 |
#define MICROMIPSOP_MASK_IMMY 0x1ff |
#define MICROMIPSOP_SH_IMMY 1 |
/* MIPS DSP ASE */ |
#define MICROMIPSOP_MASK_DSPACC 0x3 |
#define MICROMIPSOP_SH_DSPACC 14 |
#define MICROMIPSOP_MASK_DSPSFT 0x3f |
#define MICROMIPSOP_SH_DSPSFT 16 |
#define MICROMIPSOP_MASK_SA3 0x7 |
#define MICROMIPSOP_SH_SA3 13 |
#define MICROMIPSOP_MASK_SA4 0xf |
#define MICROMIPSOP_SH_SA4 12 |
#define MICROMIPSOP_MASK_IMM8 0xff |
#define MICROMIPSOP_SH_IMM8 13 |
#define MICROMIPSOP_MASK_IMM10 0x3ff |
#define MICROMIPSOP_SH_IMM10 16 |
#define MICROMIPSOP_MASK_WRDSP 0x3f |
#define MICROMIPSOP_SH_WRDSP 14 |
#define MICROMIPSOP_MASK_BP 0x3 |
#define MICROMIPSOP_SH_BP 14 |
/* Placeholders for fields that only exist in the traditional 32-bit |
instruction encoding; see the comment above for details. */ |
#define MICROMIPSOP_MASK_CODE20 0 |
#define MICROMIPSOP_SH_CODE20 0 |
#define MICROMIPSOP_MASK_PERFREG 0 |
#define MICROMIPSOP_SH_PERFREG 0 |
#define MICROMIPSOP_MASK_CODE19 0 |
#define MICROMIPSOP_SH_CODE19 0 |
#define MICROMIPSOP_MASK_ALN 0 |
#define MICROMIPSOP_SH_ALN 0 |
#define MICROMIPSOP_MASK_VECBYTE 0 |
#define MICROMIPSOP_SH_VECBYTE 0 |
#define MICROMIPSOP_MASK_VECALIGN 0 |
#define MICROMIPSOP_SH_VECALIGN 0 |
#define MICROMIPSOP_MASK_DSPACC_S 0 |
#define MICROMIPSOP_SH_DSPACC_S 0 |
#define MICROMIPSOP_MASK_DSPSFT_7 0 |
#define MICROMIPSOP_SH_DSPSFT_7 0 |
#define MICROMIPSOP_MASK_RDDSP 0 |
#define MICROMIPSOP_SH_RDDSP 0 |
#define MICROMIPSOP_MASK_MT_U 0 |
#define MICROMIPSOP_SH_MT_U 0 |
#define MICROMIPSOP_MASK_MT_H 0 |
#define MICROMIPSOP_SH_MT_H 0 |
#define MICROMIPSOP_MASK_MTACC_T 0 |
#define MICROMIPSOP_SH_MTACC_T 0 |
#define MICROMIPSOP_MASK_MTACC_D 0 |
#define MICROMIPSOP_SH_MTACC_D 0 |
#define MICROMIPSOP_MASK_BBITIND 0 |
#define MICROMIPSOP_SH_BBITIND 0 |
#define MICROMIPSOP_MASK_CINSPOS 0 |
#define MICROMIPSOP_SH_CINSPOS 0 |
#define MICROMIPSOP_MASK_CINSLM1 0 |
#define MICROMIPSOP_SH_CINSLM1 0 |
#define MICROMIPSOP_MASK_SEQI 0 |
#define MICROMIPSOP_SH_SEQI 0 |
#define MICROMIPSOP_SH_OFFSET_A 0 |
#define MICROMIPSOP_MASK_OFFSET_A 0 |
#define MICROMIPSOP_SH_OFFSET_B 0 |
#define MICROMIPSOP_MASK_OFFSET_B 0 |
#define MICROMIPSOP_SH_OFFSET_C 0 |
#define MICROMIPSOP_MASK_OFFSET_C 0 |
#define MICROMIPSOP_SH_RZ 0 |
#define MICROMIPSOP_MASK_RZ 0 |
#define MICROMIPSOP_SH_FZ 0 |
#define MICROMIPSOP_MASK_FZ 0 |
/* microMIPS Enhanced VA Scheme */ |
#define MICROMIPSOP_SH_EVAOFFSET 0 |
#define MICROMIPSOP_MASK_EVAOFFSET 0x1ff |
/* These are the characters which may appears in the args field of a microMIPS |
instruction. They appear in the order in which the fields appear |
when the instruction is used. Commas and parentheses in the args |
string are ignored when assembling, and written into the output |
when disassembling. |
The followings are for 16-bit microMIPS instructions. |
"ma" must be $28 |
"mc" 3-bit MIPS registers 2-7, 16, 17 (MICROMIPSOP_*_MC) at bit 4 |
The same register used as both source and target. |
"md" 3-bit MIPS registers 2-7, 16, 17 (MICROMIPSOP_*_MD) at bit 7 |
"me" 3-bit MIPS registers 2-7, 16, 17 (MICROMIPSOP_*_ME) at bit 1 |
The same register used as both source and target. |
"mf" 3-bit MIPS registers 2-7, 16, 17 (MICROMIPSOP_*_MF) at bit 3 |
"mg" 3-bit MIPS registers 2-7, 16, 17 (MICROMIPSOP_*_MG) at bit 0 |
"mh" 3-bit MIPS register pair (MICROMIPSOP_*_MH) at bit 7 |
"mj" 5-bit MIPS registers (MICROMIPSOP_*_MJ) at bit 0 |
"ml" 3-bit MIPS registers 2-7, 16, 17 (MICROMIPSOP_*_ML) at bit 4 |
"mm" 3-bit MIPS registers 0, 2, 3, 16-20 (MICROMIPSOP_*_MM) at bit 1 |
"mn" 3-bit MIPS registers 0, 2, 3, 16-20 (MICROMIPSOP_*_MN) at bit 4 |
"mp" 5-bit MIPS registers (MICROMIPSOP_*_MP) at bit 5 |
"mq" 3-bit MIPS registers 0, 2-7, 17 (MICROMIPSOP_*_MQ) at bit 7 |
"mr" must be program counter |
"ms" must be $29 |
"mt" must be the same as the previous register |
"mx" must be the same as the destination register |
"my" must be $31 |
"mz" must be $0 |
"mA" 7-bit immediate (-64 .. 63) << 2 (MICROMIPSOP_*_IMMA) |
"mB" 3-bit immediate (-1, 1, 4, 8, 12, 16, 20, 24) (MICROMIPSOP_*_IMMB) |
"mC" 4-bit immediate (1, 2, 3, 4, 7, 8, 15, 16, 31, 32, 63, 64, 128, 255, |
32768, 65535) (MICROMIPSOP_*_IMMC) |
"mD" 10-bit branch address (-512 .. 511) << 1 (MICROMIPSOP_*_IMMD) |
"mE" 7-bit branch address (-64 .. 63) << 1 (MICROMIPSOP_*_IMME) |
"mF" 4-bit immediate (0 .. 15) (MICROMIPSOP_*_IMMF) |
"mG" 4-bit immediate (-1 .. 14) (MICROMIPSOP_*_IMMG) |
"mH" 4-bit immediate (0 .. 15) << 1 (MICROMIPSOP_*_IMMH) |
"mI" 7-bit immediate (-1 .. 126) (MICROMIPSOP_*_IMMI) |
"mJ" 4-bit immediate (0 .. 15) << 2 (MICROMIPSOP_*_IMMJ) |
"mL" 4-bit immediate (0 .. 15) (MICROMIPSOP_*_IMML) |
"mM" 3-bit immediate (1 .. 8) (MICROMIPSOP_*_IMMM) |
"mN" 2-bit immediate (0 .. 3) for register list (MICROMIPSOP_*_IMMN) |
"mO" 4-bit immediate (0 .. 15) (MICROMIPSOP_*_IMML) |
"mP" 5-bit immediate (0 .. 31) << 2 (MICROMIPSOP_*_IMMP) |
"mU" 5-bit immediate (0 .. 31) << 2 (MICROMIPSOP_*_IMMU) |
"mW" 6-bit immediate (0 .. 63) << 2 (MICROMIPSOP_*_IMMW) |
"mX" 4-bit immediate (-8 .. 7) (MICROMIPSOP_*_IMMX) |
"mY" 9-bit immediate (-258 .. -3, 2 .. 257) << 2 (MICROMIPSOP_*_IMMY) |
"mZ" must be zero |
In most cases 32-bit microMIPS instructions use the same characters |
as MIPS (with ADDIUPC being a notable exception, but there are some |
others too). |
"." 10-bit signed offset/number (MICROMIPSOP_*_OFFSET10) |
"1" 5-bit sync type (MICROMIPSOP_*_STYPE) |
"<" 5-bit shift amount (MICROMIPSOP_*_SHAMT) |
">" shift amount between 32 and 63, stored after subtracting 32 |
(MICROMIPSOP_*_SHAMT) |
"\" 3-bit position for ASET and ACLR (MICROMIPSOP_*_3BITPOS) |
"|" 4-bit trap code (MICROMIPSOP_*_TRAP) |
"~" 12-bit signed offset (MICROMIPSOP_*_OFFSET12) |
"a" 26-bit target address (MICROMIPSOP_*_TARGET) |
"+i" likewise, but flips bit 0 |
"b" 5-bit base register (MICROMIPSOP_*_RS) |
"c" 10-bit higher breakpoint code (MICROMIPSOP_*_CODE) |
"d" 5-bit destination register specifier (MICROMIPSOP_*_RD) |
"h" 5-bit PREFX hint (MICROMIPSOP_*_PREFX) |
"i" 16-bit unsigned immediate (MICROMIPSOP_*_IMMEDIATE) |
"j" 16-bit signed immediate (MICROMIPSOP_*_DELTA) |
"k" 5-bit cache opcode in target register position (MICROMIPSOP_*_CACHE) |
"n" register list for 32-bit LWM/SWM instruction (MICROMIPSOP_*_RT) |
"o" 16-bit signed offset (MICROMIPSOP_*_DELTA) |
"p" 16-bit PC-relative branch target address (MICROMIPSOP_*_DELTA) |
"q" 10-bit lower breakpoint code (MICROMIPSOP_*_CODE2) |
"r" 5-bit same register used as both source and target (MICROMIPSOP_*_RS) |
"s" 5-bit source register specifier (MICROMIPSOP_*_RS) |
"t" 5-bit target register (MICROMIPSOP_*_RT) |
"u" 16-bit upper 16 bits of address (MICROMIPSOP_*_IMMEDIATE) |
"v" 5-bit same register used as both source and destination |
(MICROMIPSOP_*_RS) |
"w" 5-bit same register used as both target and destination |
(MICROMIPSOP_*_RT) |
"y" 5-bit source 3 register for ALNV.PS (MICROMIPSOP_*_RS3) |
"z" must be zero register |
"C" 23-bit coprocessor function code (MICROMIPSOP_*_COPZ) |
"B" 10-bit syscall/wait function code (MICROMIPSOP_*_CODE10) |
"K" 5-bit Hardware Register (RDHWR instruction) (MICROMIPSOP_*_RS) |
"+A" 5-bit INS/EXT/DINS/DEXT/DINSM/DEXTM position, which becomes |
LSB (MICROMIPSOP_*_EXTLSB). |
Enforces: 0 <= pos < 32. |
"+B" 5-bit INS/DINS size, which becomes MSB (MICROMIPSOP_*_INSMSB). |
Requires that "+A" or "+E" occur first to set position. |
Enforces: 0 < (pos+size) <= 32. |
"+C" 5-bit EXT/DEXT size, which becomes MSBD (MICROMIPSOP_*_EXTMSBD). |
Requires that "+A" or "+E" occur first to set position. |
Enforces: 0 < (pos+size) <= 32. |
(Also used by DEXT w/ different limits, but limits for |
that are checked by the M_DEXT macro.) |
"+E" 5-bit DINSU/DEXTU position, which becomes LSB-32 (MICROMIPSOP_*_EXTLSB). |
Enforces: 32 <= pos < 64. |
"+F" 5-bit DINSM/DINSU size, which becomes MSB-32 (MICROMIPSOP_*_INSMSB). |
Requires that "+A" or "+E" occur first to set position. |
Enforces: 32 < (pos+size) <= 64. |
"+G" 5-bit DEXTM size, which becomes MSBD-32 (MICROMIPSOP_*_EXTMSBD). |
Requires that "+A" or "+E" occur first to set position. |
Enforces: 32 < (pos+size) <= 64. |
"+H" 5-bit DEXTU size, which becomes MSBD (MICROMIPSOP_*_EXTMSBD). |
Requires that "+A" or "+E" occur first to set position. |
Enforces: 32 < (pos+size) <= 64. |
PC-relative addition (ADDIUPC) instruction: |
"mQ" 23-bit offset (-4194304 .. 4194303) << 2 (MICROMIPSOP_*_IMMQ) |
"mb" 3-bit MIPS registers 2-7, 16, 17 (MICROMIPSOP_*_MB) at bit 23 |
Floating point instructions: |
"D" 5-bit destination register (MICROMIPSOP_*_FD) |
"M" 3-bit compare condition code (MICROMIPSOP_*_CCC) |
"N" 3-bit branch condition code (MICROMIPSOP_*_BCC) |
"R" 5-bit fr source 3 register (MICROMIPSOP_*_FR) |
"S" 5-bit fs source 1 register (MICROMIPSOP_*_FS) |
"T" 5-bit ft source 2 register (MICROMIPSOP_*_FT) |
"V" 5-bit same register used as floating source and destination or target |
(MICROMIPSOP_*_FS) |
Coprocessor instructions: |
"E" 5-bit target register (MICROMIPSOP_*_RT) |
"G" 5-bit source register (MICROMIPSOP_*_RS) |
"H" 3-bit sel field for (D)MTC* and (D)MFC* (MICROMIPSOP_*_SEL) |
Macro instructions: |
"A" general 32 bit expression |
"I" 32-bit immediate (value placed in imm_expr). |
"F" 64-bit floating point constant in .rdata |
"L" 64-bit floating point constant in .lit8 |
"f" 32-bit floating point constant |
"l" 32-bit floating point constant in .lit4 |
DSP ASE usage: |
"2" 2-bit unsigned immediate for byte align (MICROMIPSOP_*_BP) |
"3" 3-bit unsigned immediate (MICROMIPSOP_*_SA3) |
"4" 4-bit unsigned immediate (MICROMIPSOP_*_SA4) |
"5" 8-bit unsigned immediate (MICROMIPSOP_*_IMM8) |
"6" 5-bit unsigned immediate (MICROMIPSOP_*_RS) |
"7" 2-bit DSP accumulator register (MICROMIPSOP_*_DSPACC) |
"8" 6-bit unsigned immediate (MICROMIPSOP_*_WRDSP) |
"0" 6-bit signed immediate (MICROMIPSOP_*_DSPSFT) |
"@" 10-bit signed immediate (MICROMIPSOP_*_IMM10) |
"^" 5-bit unsigned immediate (MICROMIPSOP_*_RD) |
microMIPS Enhanced VA Scheme: |
"+j" 9-bit signed offset in bit 0 (OP_*_EVAOFFSET) |
Other: |
"()" parens surrounding optional value |
"," separates operands |
"+" start of extension sequence |
"m" start of microMIPS extension sequence |
Characters used so far, for quick reference when adding more: |
"12345678 0" |
"<>(),+.@\^|~" |
"ABCDEFGHI KLMN RST V " |
"abcd f hijklmnopqrstuvw yz" |
Extension character sequences used so far ("+" followed by the |
following), for quick reference when adding more: |
"" |
"" |
"ABCEFGH" |
"ij" |
Extension character sequences used so far ("m" followed by the |
following), for quick reference when adding more: |
"" |
"" |
" BCDEFGHIJ LMNOPQ U WXYZ" |
" bcdefghij lmn pq st xyz" |
*/ |
extern const struct mips_operand *decode_micromips_operand (const char *); |
extern const struct mips_opcode micromips_opcodes[]; |
extern const int bfd_micromips_num_opcodes; |
/* A NOP insn impemented as "or at,at,zero". |
Used to implement -mfix-loongson2f. */ |
#define LOONGSON2F_NOP_INSN 0x00200825 |
#endif /* _MIPS_H_ */ |
/contrib/toolchain/binutils/include/opcode/mmix.h |
---|
0,0 → 1,187 |
/* mmix.h -- Header file for MMIX opcode table |
Copyright (C) 2001, 2003, 2010 Free Software Foundation, Inc. |
Written by Hans-Peter Nilsson (hp@bitrange.com) |
This file is part of GDB, GAS, and the GNU binutils. |
GDB, GAS, and the GNU binutils are free software; you can redistribute |
them and/or modify them under the terms of the GNU General Public |
License as published by the Free Software Foundation; either version 3, |
or (at your option) any later version. |
GDB, GAS, and the GNU binutils are distributed in the hope that they |
will be useful, but WITHOUT ANY WARRANTY; without even the implied |
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See |
the GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this file; see the file COPYING3. If not, write to the Free |
Software Foundation, 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* We could have just a char*[] table indexed by the register number, but |
that would not allow for synonyms. The table is terminated with an |
entry with a NULL name. */ |
struct mmix_spec_reg |
{ |
const char *name; |
unsigned int number; |
}; |
/* General indication of the type of instruction. */ |
enum mmix_insn_type |
{ |
mmix_type_pseudo, |
mmix_type_normal, |
mmix_type_branch, |
mmix_type_condbranch, |
mmix_type_memaccess_octa, |
mmix_type_memaccess_tetra, |
mmix_type_memaccess_wyde, |
mmix_type_memaccess_byte, |
mmix_type_memaccess_block, |
mmix_type_jsr |
}; |
/* Type of operands an instruction takes. Use when parsing assembly code |
and disassembling. */ |
enum mmix_operands_type |
{ |
mmix_operands_none = 0, |
/* All operands are registers: "$X,$Y,$Z". */ |
mmix_operands_regs, |
/* "$X,YZ", like SETH. */ |
mmix_operands_reg_yz, |
/* The regular "$X,$Y,$Z|Z". |
The Z is optional; if only "$X,$Y" is given, then "$X,$Y,0" is |
assumed. */ |
mmix_operands_regs_z_opt, |
/* The regular "$X,$Y,$Z|Z". */ |
mmix_operands_regs_z, |
/* "Address"; only JMP. Zero operands allowed unless GNU syntax. */ |
mmix_operands_jmp, |
/* "$X|X,$Y,$Z|Z": PUSHGO; like "3", but X can be expressed as an |
integer. */ |
mmix_operands_pushgo, |
/* Two registers or a register and a byte, like FLOT, possibly with |
rounding: "$X,$Z|Z" or "$X,ROUND_MODE,$Z|Z". */ |
mmix_operands_roundregs_z, |
/* "X,YZ", POP. Unless GNU syntax, zero or one operand is allowed. */ |
mmix_operands_pop, |
/* Two registers, possibly with rounding: "$X,$Z" or |
"$X,ROUND_MODE,$Z". */ |
mmix_operands_roundregs, |
/* "XYZ", like SYNC. */ |
mmix_operands_sync, |
/* "X,$Y,$Z|Z", like SYNCD. */ |
mmix_operands_x_regs_z, |
/* "$X,Y,$Z|Z", like NEG and NEGU. The Y field is optional, default 0. */ |
mmix_operands_neg, |
/* "$X,Address, like GETA or branches. */ |
mmix_operands_regaddr, |
/* "$X|X,Address, like PUSHJ. */ |
mmix_operands_pushj, |
/* "$X,spec_reg"; GET. */ |
mmix_operands_get, |
/* "spec_reg,$Z|Z"; PUT. */ |
mmix_operands_put, |
/* Two registers, "$X,$Y". */ |
mmix_operands_set, |
/* "$X,0"; SAVE. */ |
mmix_operands_save, |
/* "0,$Z"; UNSAVE. */ |
mmix_operands_unsave, |
/* "X,Y,Z"; like SWYM or TRAP. Zero (or 1 if GNU syntax) to three |
operands, interpreted as 0; XYZ; X, YZ and X, Y, Z. */ |
mmix_operands_xyz_opt, |
/* Just "Z", like RESUME. Unless GNU syntax, the operand can be omitted |
and will then be assumed zero. */ |
mmix_operands_resume, |
/* These are specials to handle that pseudo-directives are specified |
like ordinary insns when being mmixal-compatible. They signify the |
specific pseudo-directive rather than the operands type. */ |
/* LOC. */ |
mmix_operands_loc, |
/* PREFIX. */ |
mmix_operands_prefix, |
/* BYTE. */ |
mmix_operands_byte, |
/* WYDE. */ |
mmix_operands_wyde, |
/* TETRA. */ |
mmix_operands_tetra, |
/* OCTA. */ |
mmix_operands_octa, |
/* LOCAL. */ |
mmix_operands_local, |
/* BSPEC. */ |
mmix_operands_bspec, |
/* ESPEC. */ |
mmix_operands_espec, |
}; |
struct mmix_opcode |
{ |
const char *name; |
unsigned long match; |
unsigned long lose; |
enum mmix_operands_type operands; |
/* This is used by the disassembly function. */ |
enum mmix_insn_type type; |
}; |
/* Declare the actual tables. */ |
extern const struct mmix_opcode mmix_opcodes[]; |
/* This one is terminated with an entry with a NULL name. */ |
extern const struct mmix_spec_reg mmix_spec_regs[]; |
/* Some insn values we use when padding and synthesizing address loads. */ |
#define IMM_OFFSET_BIT 1 |
#define COND_INV_BIT 0x8 |
#define PRED_INV_BIT 0x10 |
#define PUSHGO_INSN_BYTE 0xbe |
#define GO_INSN_BYTE 0x9e |
#define SETL_INSN_BYTE 0xe3 |
#define INCML_INSN_BYTE 0xe6 |
#define INCMH_INSN_BYTE 0xe5 |
#define INCH_INSN_BYTE 0xe4 |
#define SWYM_INSN_BYTE 0xfd |
#define JMP_INSN_BYTE 0xf0 |
/* We can have 256 - 32 (local registers) - 1 ($255 is not allocatable) |
global registers. */ |
#define MAX_GREGS 223 |
/contrib/toolchain/binutils/include/opcode/mn10200.h |
---|
0,0 → 1,111 |
/* mn10200.h -- Header file for Matsushita 10200 opcode table |
Copyright 1996, 1997, 2010 Free Software Foundation, Inc. |
Written by Jeff Law, Cygnus Support |
This file is part of GDB, GAS, and the GNU binutils. |
GDB, GAS, and the GNU binutils are free software; you can redistribute |
them and/or modify them under the terms of the GNU General Public |
License as published by the Free Software Foundation; either version 3, |
or (at your option) any later version. |
GDB, GAS, and the GNU binutils are distributed in the hope that they |
will be useful, but WITHOUT ANY WARRANTY; without even the implied |
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See |
the GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this file; see the file COPYING3. If not, write to the Free |
Software Foundation, 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef MN10200_H |
#define MN10200_H |
/* The opcode table is an array of struct mn10200_opcode. */ |
struct mn10200_opcode |
{ |
/* The opcode name. */ |
const char *name; |
/* The opcode itself. Those bits which will be filled in with |
operands are zeroes. */ |
unsigned long opcode; |
/* The opcode mask. This is used by the disassembler. This is a |
mask containing ones indicating those bits which must match the |
opcode field, and zeroes indicating those bits which need not |
match (and are presumably filled in by operands). */ |
unsigned long mask; |
/* The format of this opcode. */ |
unsigned char format; |
/* An array of operand codes. Each code is an index into the |
operand table. They appear in the order which the operands must |
appear in assembly code, and are terminated by a zero. */ |
unsigned char operands[8]; |
}; |
/* The table itself is sorted by major opcode number, and is otherwise |
in the order in which the disassembler should consider |
instructions. */ |
extern const struct mn10200_opcode mn10200_opcodes[]; |
extern const int mn10200_num_opcodes; |
/* The operands table is an array of struct mn10200_operand. */ |
struct mn10200_operand |
{ |
/* The number of bits in the operand. */ |
int bits; |
/* How far the operand is left shifted in the instruction. */ |
int shift; |
/* One bit syntax flags. */ |
int flags; |
}; |
/* Elements in the table are retrieved by indexing with values from |
the operands field of the mn10200_opcodes table. */ |
extern const struct mn10200_operand mn10200_operands[]; |
/* Values defined for the flags field of a struct mn10200_operand. */ |
#define MN10200_OPERAND_DREG 0x1 |
#define MN10200_OPERAND_AREG 0x2 |
#define MN10200_OPERAND_PSW 0x4 |
#define MN10200_OPERAND_MDR 0x8 |
#define MN10200_OPERAND_SIGNED 0x10 |
#define MN10200_OPERAND_PROMOTE 0x20 |
#define MN10200_OPERAND_PAREN 0x40 |
#define MN10200_OPERAND_REPEATED 0x80 |
#define MN10200_OPERAND_EXTENDED 0x100 |
#define MN10200_OPERAND_NOCHECK 0x200 |
#define MN10200_OPERAND_PCREL 0x400 |
#define MN10200_OPERAND_MEMADDR 0x800 |
#define MN10200_OPERAND_RELAX 0x1000 |
#define FMT_1 1 |
#define FMT_2 2 |
#define FMT_3 3 |
#define FMT_4 4 |
#define FMT_5 5 |
#define FMT_6 6 |
#define FMT_7 7 |
#endif /* MN10200_H */ |
/contrib/toolchain/binutils/include/opcode/mn10300.h |
---|
0,0 → 1,170 |
/* mn10300.h -- Header file for Matsushita 10300 opcode table |
Copyright 1996, 1997, 1998, 1999, 2003, 2010 Free Software Foundation, Inc. |
Written by Jeff Law, Cygnus Support |
This file is part of GDB, GAS, and the GNU binutils. |
GDB, GAS, and the GNU binutils are free software; you can redistribute |
them and/or modify them under the terms of the GNU General Public |
License as published by the Free Software Foundation; either version 3, |
or (at your option) any later version. |
GDB, GAS, and the GNU binutils are distributed in the hope that they |
will be useful, but WITHOUT ANY WARRANTY; without even the implied |
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See |
the GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this file; see the file COPYING3. If not, write to the Free |
Software Foundation, 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef MN10300_H |
#define MN10300_H |
/* The opcode table is an array of struct mn10300_opcode. */ |
#define MN10300_MAX_OPERANDS 8 |
struct mn10300_opcode |
{ |
/* The opcode name. */ |
const char *name; |
/* The opcode itself. Those bits which will be filled in with |
operands are zeroes. */ |
unsigned long opcode; |
/* The opcode mask. This is used by the disassembler. This is a |
mask containing ones indicating those bits which must match the |
opcode field, and zeroes indicating those bits which need not |
match (and are presumably filled in by operands). */ |
unsigned long mask; |
/* A bitmask. For each operand, nonzero if it must not have the same |
register specification as all other operands with a nonzero bit in |
this flag. ie 0x81 would indicate that operands 7 and 0 must not |
match. Note that we count operands from left to right as they appear |
in the operands specification below. */ |
unsigned int no_match_operands; |
/* The format of this opcode. */ |
unsigned char format; |
/* Bitmask indicating what cpu variants this opcode is available on. |
We assume mn10300 base opcodes are available everywhere, so we only |
have to note opcodes which are available on other variants. */ |
unsigned int machine; |
/* An array of operand codes. Each code is an index into the |
operand table. They appear in the order which the operands must |
appear in assembly code, and are terminated by a zero. */ |
unsigned char operands[MN10300_MAX_OPERANDS]; |
}; |
/* The table itself is sorted by major opcode number, and is otherwise |
in the order in which the disassembler should consider |
instructions. */ |
extern const struct mn10300_opcode mn10300_opcodes[]; |
extern const int mn10300_num_opcodes; |
/* The operands table is an array of struct mn10300_operand. */ |
struct mn10300_operand |
{ |
/* The number of bits in the operand. */ |
int bits; |
/* How far the operand is left shifted in the instruction. */ |
int shift; |
/* One bit syntax flags. */ |
int flags; |
}; |
/* Elements in the table are retrieved by indexing with values from |
the operands field of the mn10300_opcodes table. */ |
extern const struct mn10300_operand mn10300_operands[]; |
/* Values defined for the flags field of a struct mn10300_operand. */ |
#define MN10300_OPERAND_DREG 0x1 |
#define MN10300_OPERAND_AREG 0x2 |
#define MN10300_OPERAND_SP 0x4 |
#define MN10300_OPERAND_PSW 0x8 |
#define MN10300_OPERAND_MDR 0x10 |
#define MN10300_OPERAND_SIGNED 0x20 |
#define MN10300_OPERAND_PROMOTE 0x40 |
#define MN10300_OPERAND_PAREN 0x80 |
#define MN10300_OPERAND_REPEATED 0x100 |
#define MN10300_OPERAND_EXTENDED 0x200 |
#define MN10300_OPERAND_SPLIT 0x400 |
#define MN10300_OPERAND_REG_LIST 0x800 |
#define MN10300_OPERAND_PCREL 0x1000 |
#define MN10300_OPERAND_MEMADDR 0x2000 |
#define MN10300_OPERAND_RELAX 0x4000 |
#define MN10300_OPERAND_USP 0x8000 |
#define MN10300_OPERAND_SSP 0x10000 |
#define MN10300_OPERAND_MSP 0x20000 |
#define MN10300_OPERAND_PC 0x40000 |
#define MN10300_OPERAND_EPSW 0x80000 |
#define MN10300_OPERAND_RREG 0x100000 |
#define MN10300_OPERAND_XRREG 0x200000 |
#define MN10300_OPERAND_PLUS 0x400000 |
#define MN10300_OPERAND_24BIT 0x800000 |
#define MN10300_OPERAND_FSREG 0x1000000 |
#define MN10300_OPERAND_FDREG 0x2000000 |
#define MN10300_OPERAND_FPCR 0x4000000 |
/* Opcode Formats. */ |
#define FMT_S0 1 |
#define FMT_S1 2 |
#define FMT_S2 3 |
#define FMT_S4 4 |
#define FMT_S6 5 |
#define FMT_D0 6 |
#define FMT_D1 7 |
#define FMT_D2 8 |
#define FMT_D4 9 |
#define FMT_D5 10 |
#define FMT_D6 11 |
#define FMT_D7 12 |
#define FMT_D8 13 |
#define FMT_D9 14 |
#define FMT_D10 15 |
#define FMT_D3 16 |
/* Variants of the mn10300 which have additional opcodes. */ |
#define MN103 300 |
#define AM30 300 |
#define AM33 330 |
#define AM33_2 332 |
#endif /* MN10300_H */ |
/contrib/toolchain/binutils/include/opcode/moxie.h |
---|
0,0 → 1,74 |
/* Definitions for decoding the moxie opcode table. |
Copyright 2009 Free Software Foundation, Inc. |
Contributed by Anthony Green (green@moxielogic.com). |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA |
02110-1301, USA. */ |
/* Form 1 instructions come in different flavors: |
Some have no arguments (MOXIE_F1_NARG) |
Some only use the A operand (MOXIE_F1_A) |
Some use A and B registers (MOXIE_F1_AB) |
Some use A and consume a 4 byte immediate value (MOXIE_F1_A4) |
Some use just a 4 byte immediate value (MOXIE_F1_4) |
Some use just a 4 byte memory address (MOXIE_F1_M) |
Some use B and an indirect A (MOXIE_F1_AiB) |
Some use A and an indirect B (MOXIE_F1_ABi) |
Some consume a 4 byte immediate value and use X (MOXIE_F1_4A) |
Some use B and an indirect A plus 4 bytes (MOXIE_F1_AiB4) |
Some use A and an indirect B plus 4 bytes (MOXIE_F1_ABi4) |
Form 2 instructions also come in different flavors: |
Some have no arguments (MOXIE_F2_NARG) |
Some use the A register and an 8-bit value (MOXIE_F2_A8V) |
Form 3 instructions also come in different flavors: |
Some have no arguments (MOXIE_F3_NARG) |
Some have a 10-bit PC relative operand (MOXIE_F3_PCREL). */ |
#define MOXIE_F1_NARG 0x100 |
#define MOXIE_F1_A 0x101 |
#define MOXIE_F1_AB 0x102 |
/* #define MOXIE_F1_ABC 0x103 */ |
#define MOXIE_F1_A4 0x104 |
#define MOXIE_F1_4 0x105 |
#define MOXIE_F1_AiB 0x106 |
#define MOXIE_F1_ABi 0x107 |
#define MOXIE_F1_4A 0x108 |
#define MOXIE_F1_AiB4 0x109 |
#define MOXIE_F1_ABi4 0x10a |
#define MOXIE_F1_M 0x10b |
#define MOXIE_F2_NARG 0x200 |
#define MOXIE_F2_A8V 0x201 |
#define MOXIE_F3_NARG 0x300 |
#define MOXIE_F3_PCREL 0x301 |
#define MOXIE_BAD 0x400 |
typedef struct moxie_opc_info_t |
{ |
short opcode; |
unsigned itype; |
const char * name; |
} moxie_opc_info_t; |
extern const moxie_opc_info_t moxie_form1_opc_info[128]; |
extern const moxie_opc_info_t moxie_form2_opc_info[4]; |
extern const moxie_opc_info_t moxie_form3_opc_info[16]; |
/contrib/toolchain/binutils/include/opcode/msp430-decode.h |
---|
0,0 → 1,130 |
/* Opcode decoder for the TI MSP430 |
Copyright 2012-2013 Free Software Foundation, Inc. |
Written by DJ Delorie <dj@redhat.com> |
This file is part of GDB, the GNU Debugger. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA |
02110-1301, USA. */ |
typedef enum |
{ |
MSO_unknown, |
/* Double-operand instructions - all repeat .REPEATS times. */ |
MSO_mov, /* dest = src */ |
MSO_add, /* dest += src */ |
MSO_addc, /* dest += src + carry */ |
MSO_subc, /* dest -= (src-1) + carry */ |
MSO_sub, /* dest -= src */ |
MSO_cmp, /* dest - src -> status */ |
MSO_dadd, /* dest += src (as BCD) */ |
MSO_bit, /* dest & src -> status */ |
MSO_bic, /* dest &= ~src (bit clear) */ |
MSO_bis, /* dest |= src (bit set, OR) */ |
MSO_xor, /* dest ^= src */ |
MSO_and, /* dest &= src */ |
/* Single-operand instructions. */ |
MSO_rrc, /* Rotate through carry, dest >>= .REPEATS. */ |
MSO_swpb, /* Swap lower bytes of operand. */ |
MSO_rra, /* Signed shift dest >>= .REPEATS. */ |
MSO_sxt, /* Sign extend lower byte. */ |
MSO_push, /* Push .REPEATS registers (or other op) starting at SRC going towards R0. */ |
MSO_pop, /* Pop .REPEATS registers starting at DEST going towards R15. */ |
MSO_call, |
MSO_reti, |
/* Jumps. */ |
MSO_jmp, /* PC = SRC if .COND true. */ |
/* Extended single-operand instructions. */ |
MSO_rru, /* Unsigned shift right, dest >>= .REPEATS. */ |
} MSP430_Opcode_ID; |
typedef enum |
{ |
MSP430_Operand_None, |
MSP430_Operand_Immediate, |
MSP430_Operand_Register, |
MSP430_Operand_Indirect, |
MSP430_Operand_Indirect_Postinc |
} MSP430_Operand_Type; |
typedef enum |
{ |
MSR_0 = 0, |
MSR_PC = 0, |
MSR_SP = 1, |
MSR_SR = 2, |
MSR_CG = 3, |
MSR_None = 16, |
} MSP430_Register; |
typedef struct |
{ |
MSP430_Operand_Type type; |
int addend; |
MSP430_Register reg : 8; |
MSP430_Register reg2 : 8; |
unsigned char bit_number : 4; |
unsigned char condition : 3; |
} MSP430_Opcode_Operand; |
typedef enum |
{ |
MSP430_Byte = 0, |
MSP430_Word, |
MSP430_Addr |
} MSP430_Size; |
/* These numerically match the bit encoding. */ |
typedef enum |
{ |
MSC_nz = 0, |
MSC_z, |
MSC_nc, |
MSC_c, |
MSC_n, |
MSC_ge, |
MSC_l, |
MSC_true, |
} MSP430_Condition; |
#define MSP430_FLAG_C 0x01 |
#define MSP430_FLAG_Z 0x02 |
#define MSP430_FLAG_N 0x04 |
#define MSP430_FLAG_V 0x80 |
typedef struct |
{ |
int lineno; |
MSP430_Opcode_ID id; |
unsigned flags_1:8; /* These flags are set to '1' by the insn. */ |
unsigned flags_0:8; /* These flags are set to '0' by the insn. */ |
unsigned flags_set:8; /* These flags are set appropriately by the insn. */ |
unsigned zc:1; /* If set, pretend the carry bit is zero. */ |
unsigned repeat_reg:1; /* If set, count is in REG[repeats]. */ |
unsigned ofs_430x:1; /* If set, the offset in any operand is 430x (else use 430 compatibility mode). */ |
unsigned repeats:5; /* Contains COUNT-1, or register number. */ |
int n_bytes; /* Opcode size in BYTES. */ |
char * syntax; |
MSP430_Size size; /* Operand size in BITS. */ |
MSP430_Condition cond; |
/* By convention, these are [0]destination, [1]source. */ |
MSP430_Opcode_Operand op[2]; |
} MSP430_Opcode_Decoded; |
int msp430_decode_opcode (unsigned long, MSP430_Opcode_Decoded *, int (*)(void *), void *); |
/contrib/toolchain/binutils/include/opcode/msp430.h |
---|
0,0 → 1,194 |
/* Opcode table for the TI MSP430 microcontrollers |
Copyright 2002-2013 Free Software Foundation, Inc. |
Contributed by Dmitry Diky <diwil@mail.ru> |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3, or (at your option) |
any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef __MSP430_H_ |
#define __MSP430_H_ |
struct msp430_operand_s |
{ |
int ol; /* Operand length words. */ |
int am; /* Addr mode. */ |
int reg; /* Register. */ |
int mode; /* Pperand mode. */ |
#define OP_REG 0 |
#define OP_EXP 1 |
#ifndef DASM_SECTION |
expressionS exp; |
#endif |
}; |
#define BYTE_OPERATION (1 << 6) /* Byte operation flag for all instructions. */ |
struct msp430_opcode_s |
{ |
char *name; |
int fmt; |
int insn_opnumb; |
int bin_opcode; |
int bin_mask; |
}; |
#define MSP_INSN(name, size, numb, bin, mask) { #name, size, numb, bin, mask } |
static struct msp430_opcode_s msp430_opcodes[] = |
{ |
MSP_INSN (and, 1, 2, 0xf000, 0xf000), |
MSP_INSN (inv, 0, 1, 0xe330, 0xfff0), |
MSP_INSN (xor, 1, 2, 0xe000, 0xf000), |
MSP_INSN (setz, 0, 0, 0xd322, 0xffff), |
MSP_INSN (setc, 0, 0, 0xd312, 0xffff), |
MSP_INSN (eint, 0, 0, 0xd232, 0xffff), |
MSP_INSN (setn, 0, 0, 0xd222, 0xffff), |
MSP_INSN (bis, 1, 2, 0xd000, 0xf000), |
MSP_INSN (clrz, 0, 0, 0xc322, 0xffff), |
MSP_INSN (clrc, 0, 0, 0xc312, 0xffff), |
MSP_INSN (dint, 0, 0, 0xc232, 0xffff), |
MSP_INSN (clrn, 0, 0, 0xc222, 0xffff), |
MSP_INSN (bic, 1, 2, 0xc000, 0xf000), |
MSP_INSN (bit, 1, 2, 0xb000, 0xf000), |
MSP_INSN (dadc, 0, 1, 0xa300, 0xff30), |
MSP_INSN (dadd, 1, 2, 0xa000, 0xf000), |
MSP_INSN (tst, 0, 1, 0x9300, 0xff30), |
MSP_INSN (cmp, 1, 2, 0x9000, 0xf000), |
MSP_INSN (decd, 0, 1, 0x8320, 0xff30), |
MSP_INSN (dec, 0, 1, 0x8310, 0xff30), |
MSP_INSN (sub, 1, 2, 0x8000, 0xf000), |
MSP_INSN (sbc, 0, 1, 0x7300, 0xff30), |
MSP_INSN (subc, 1, 2, 0x7000, 0xf000), |
MSP_INSN (adc, 0, 1, 0x6300, 0xff30), |
MSP_INSN (rlc, 0, 2, 0x6000, 0xf000), |
MSP_INSN (addc, 1, 2, 0x6000, 0xf000), |
MSP_INSN (incd, 0, 1, 0x5320, 0xff30), |
MSP_INSN (inc, 0, 1, 0x5310, 0xff30), |
MSP_INSN (rla, 0, 2, 0x5000, 0xf000), |
MSP_INSN (add, 1, 2, 0x5000, 0xf000), |
MSP_INSN (nop, 0, 0, 0x4303, 0xffff), |
MSP_INSN (clr, 0, 1, 0x4300, 0xff30), |
MSP_INSN (ret, 0, 0, 0x4130, 0xff30), |
MSP_INSN (pop, 0, 1, 0x4130, 0xff30), |
MSP_INSN (br, 0, 3, 0x4000, 0xf000), |
MSP_INSN (mov, 1, 2, 0x4000, 0xf000), |
MSP_INSN (jmp, 3, 1, 0x3c00, 0xfc00), |
MSP_INSN (jl, 3, 1, 0x3800, 0xfc00), |
MSP_INSN (jge, 3, 1, 0x3400, 0xfc00), |
MSP_INSN (jn, 3, 1, 0x3000, 0xfc00), |
MSP_INSN (jc, 3, 1, 0x2c00, 0xfc00), |
MSP_INSN (jhs, 3, 1, 0x2c00, 0xfc00), |
MSP_INSN (jnc, 3, 1, 0x2800, 0xfc00), |
MSP_INSN (jlo, 3, 1, 0x2800, 0xfc00), |
MSP_INSN (jz, 3, 1, 0x2400, 0xfc00), |
MSP_INSN (jeq, 3, 1, 0x2400, 0xfc00), |
MSP_INSN (jnz, 3, 1, 0x2000, 0xfc00), |
MSP_INSN (jne, 3, 1, 0x2000, 0xfc00), |
MSP_INSN (reti, 2, 0, 0x1300, 0xffc0), |
MSP_INSN (call, 2, 1, 0x1280, 0xffc0), |
MSP_INSN (push, 2, 1, 0x1200, 0xff80), |
MSP_INSN (sxt, 2, 1, 0x1180, 0xffc0), |
MSP_INSN (rra, 2, 1, 0x1100, 0xff80), |
MSP_INSN (swpb, 2, 1, 0x1080, 0xffc0), |
MSP_INSN (rrc, 2, 1, 0x1000, 0xff80), |
/* Simple polymorphs. */ |
MSP_INSN (beq, 4, 0, 0, 0xffff), |
MSP_INSN (bne, 4, 1, 0, 0xffff), |
MSP_INSN (blt, 4, 2, 0, 0xffff), |
MSP_INSN (bltu, 4, 3, 0, 0xffff), |
MSP_INSN (bge, 4, 4, 0, 0xffff), |
MSP_INSN (bgeu, 4, 5, 0, 0xffff), |
MSP_INSN (bltn, 4, 6, 0, 0xffff), |
MSP_INSN (jump, 4, 7, 0, 0xffff), |
/* Long polymorphs. */ |
MSP_INSN (bgt, 5, 0, 0, 0xffff), |
MSP_INSN (bgtu, 5, 1, 0, 0xffff), |
MSP_INSN (bleu, 5, 2, 0, 0xffff), |
MSP_INSN (ble, 5, 3, 0, 0xffff), |
/* MSP430X instructions - these ones use an extension word. |
A negative format indicates an MSP430X instruction. */ |
MSP_INSN (addcx, -2, 2, 0x6000, 0xf000), |
MSP_INSN (addx, -2, 2, 0x5000, 0xf000), |
MSP_INSN (andx, -2, 2, 0xf000, 0xf000), |
MSP_INSN (bicx, -2, 2, 0xc000, 0xf000), |
MSP_INSN (bisx, -2, 2, 0xd000, 0xf000), |
MSP_INSN (bitx, -2, 2, 0xb000, 0xf000), |
MSP_INSN (cmpx, -2, 2, 0x9000, 0xf000), |
MSP_INSN (daddx, -2, 2, 0xa000, 0xf000), |
MSP_INSN (movx, -2, 2, 0x4000, 0xf000), |
MSP_INSN (subcx, -2, 2, 0x7000, 0xf000), |
MSP_INSN (subx, -2, 2, 0x8000, 0xf000), |
MSP_INSN (xorx, -2, 2, 0xe000, 0xf000), |
/* MSP430X Synthetic instructions. */ |
MSP_INSN (adcx, -1, 1, 0x6300, 0xff30), |
MSP_INSN (clra, -1, 1, 0x4300, 0xff30), |
MSP_INSN (clrx, -1, 1, 0x4300, 0xff30), |
MSP_INSN (dadcx, -1, 1, 0xa300, 0xff30), |
MSP_INSN (decx, -1, 1, 0x8310, 0xff30), |
MSP_INSN (decda, -1, 1, 0x8320, 0xff30), |
MSP_INSN (decdx, -1, 1, 0x8320, 0xff30), |
MSP_INSN (incx, -1, 1, 0x5310, 0xff30), |
MSP_INSN (incda, -1, 1, 0x5320, 0xff30), |
MSP_INSN (incdx, -1, 1, 0x5320, 0xff30), |
MSP_INSN (invx, -1, 1, 0xe330, 0xfff0), |
MSP_INSN (popx, -1, 1, 0x4130, 0xff30), |
MSP_INSN (rlax, -1, 2, 0x5000, 0xf000), |
MSP_INSN (rlcx, -1, 2, 0x6000, 0xf000), |
MSP_INSN (sbcx, -1, 1, 0x7300, 0xff30), |
MSP_INSN (tsta, -1, 1, 0x9300, 0xff30), |
MSP_INSN (tstx, -1, 1, 0x9300, 0xff30), |
MSP_INSN (pushx, -3, 1, 0x1200, 0xff80), |
MSP_INSN (rrax, -3, 1, 0x1100, 0xff80), |
MSP_INSN (rrcx, -3, 1, 0x1000, 0xff80), |
MSP_INSN (swpbx, -3, 1, 0x1080, 0xffc0), |
MSP_INSN (sxtx, -3, 1, 0x1180, 0xffc0), |
/* MSP430X Address instructions - no extension word needed. |
The insn_opnumb field is used to encode the nature of the |
instruction for assembly and disassembly purposes. */ |
MSP_INSN (calla, -1, 4, 0x1300, 0xff00), |
MSP_INSN (popm, -1, 5, 0x1600, 0xfe00), |
MSP_INSN (pushm, -1, 5, 0x1400, 0xfe00), |
MSP_INSN (rrcm, -1, 6, 0x0040, 0xf3e0), |
MSP_INSN (rram, -1, 6, 0x0140, 0xf3e0), |
MSP_INSN (rlam, -1, 6, 0x0240, 0xf3e0), |
MSP_INSN (rrum, -1, 6, 0x0340, 0xf3e0), |
MSP_INSN (rrux, -1, 7, 0x0340, 0xffe0), /* Synthesized in terms of RRUM. */ |
MSP_INSN (adda, -1, 8, 0x00a0, 0xf0b0), |
MSP_INSN (cmpa, -1, 8, 0x0090, 0xf0b0), |
MSP_INSN (suba, -1, 8, 0x00b0, 0xf0b0), |
MSP_INSN (reta, -1, 9, 0x0110, 0xffff), |
MSP_INSN (bra, -1, 9, 0x0000, 0xf0cf), |
MSP_INSN (mova, -1, 9, 0x0000, 0xf080), |
MSP_INSN (mova, -1, 9, 0x0080, 0xf0b0), |
MSP_INSN (mova, -1, 9, 0x00c0, 0xf0f0), |
/* Pseudo instruction to set the repeat field in the extension word. */ |
MSP_INSN (rpt, -1, 10, 0x0000, 0x0000), |
/* End of instruction set. */ |
{ NULL, 0, 0, 0, 0 } |
}; |
#endif |
/contrib/toolchain/binutils/include/opcode/nios2.h |
---|
0,0 → 1,522 |
/* Nios II opcode list for GAS, the GNU assembler. |
Copyright (C) 2012, 2013 Free Software Foundation, Inc. |
Contributed by Nigel Gray (ngray@altera.com). |
Contributed by Mentor Graphics, Inc. |
This file is part of GAS, the GNU Assembler, and GDB, the GNU disassembler. |
GAS/GDB is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3, or (at your option) |
any later version. |
GAS/GDB is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with GAS or GDB; see the file COPYING3. If not, write to |
the Free Software Foundation, 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
#ifndef _NIOS2_H_ |
#define _NIOS2_H_ |
#include "bfd.h" |
/**************************************************************************** |
* This file contains structures, bit masks and shift counts used |
* by the GNU toolchain to define the Nios II instruction set and |
* access various opcode fields. |
****************************************************************************/ |
/* Identify different overflow situations for error messages. */ |
enum overflow_type |
{ |
call_target_overflow = 0, |
branch_target_overflow, |
address_offset_overflow, |
signed_immed16_overflow, |
unsigned_immed16_overflow, |
unsigned_immed5_overflow, |
custom_opcode_overflow, |
no_overflow |
}; |
/* This structure holds information for a particular instruction. |
The args field is a string describing the operands. The following |
letters can appear in the args: |
c - a 5-bit control register index |
d - a 5-bit destination register index |
s - a 5-bit left source register index |
t - a 5-bit right source register index |
i - a 16-bit signed immediate |
u - a 16-bit unsigned immediate |
o - a 16-bit signed program counter relative offset |
j - a 5-bit unsigned immediate |
b - a 5-bit break instruction constant |
l - a 8-bit custom instruction constant |
m - a 26-bit unsigned immediate |
Literal ',', '(', and ')' characters may also appear in the args as |
delimiters. |
The pinfo field is INSN_MACRO for a macro. Otherwise, it is a collection |
of bits describing the instruction, notably any relevant hazard |
information. |
When assembling, the match field contains the opcode template, which |
is modified by the arguments to produce the actual opcode |
that is emitted. If pinfo is INSN_MACRO, then this is 0. |
If pinfo is INSN_MACRO, the mask field stores the macro identifier. |
Otherwise this is a bit mask for the relevant portions of the opcode |
when disassembling. If the actual opcode anded with the match field |
equals the opcode field, then we have found the correct instruction. */ |
struct nios2_opcode |
{ |
const char *name; /* The name of the instruction. */ |
const char *args; /* A string describing the arguments for this |
instruction. */ |
const char *args_test; /* Like args, but with an extra argument for |
the expected opcode. */ |
unsigned long num_args; /* The number of arguments the instruction |
takes. */ |
unsigned long match; /* The basic opcode for the instruction. */ |
unsigned long mask; /* Mask for the opcode field of the |
instruction. */ |
unsigned long pinfo; /* Is this a real instruction or instruction |
macro? */ |
enum overflow_type overflow_msg; /* Used to generate informative |
message when fixup overflows. */ |
}; |
/* This value is used in the nios2_opcode.pinfo field to indicate that the |
instruction is a macro or pseudo-op. This requires special treatment by |
the assembler, and is used by the disassembler to determine whether to |
check for a nop. */ |
#define NIOS2_INSN_MACRO 0x80000000 |
#define NIOS2_INSN_MACRO_MOV 0x80000001 |
#define NIOS2_INSN_MACRO_MOVI 0x80000002 |
#define NIOS2_INSN_MACRO_MOVIA 0x80000004 |
#define NIOS2_INSN_RELAXABLE 0x40000000 |
#define NIOS2_INSN_UBRANCH 0x00000010 |
#define NIOS2_INSN_CBRANCH 0x00000020 |
#define NIOS2_INSN_CALL 0x00000040 |
#define NIOS2_INSN_ADDI 0x00000080 |
#define NIOS2_INSN_ANDI 0x00000100 |
#define NIOS2_INSN_ORI 0x00000200 |
#define NIOS2_INSN_XORI 0x00000400 |
/* Associates a register name ($6) with a 5-bit index (eg 6). */ |
struct nios2_reg |
{ |
const char *name; |
const int index; |
}; |
/* These are bit masks and shift counts for accessing the various |
fields of a Nios II instruction. */ |
/* Macros for getting and setting an instruction field. */ |
#define GET_INSN_FIELD(X, i) \ |
(((i) & OP_MASK_##X) >> OP_SH_##X) |
#define SET_INSN_FIELD(X, i, j) \ |
((i) = (((i) & ~OP_MASK_##X) | (((j) << OP_SH_##X) & OP_MASK_##X))) |
/* Instruction field definitions. */ |
#define IW_A_LSB 27 |
#define IW_A_MSB 31 |
#define IW_A_SZ 5 |
#define IW_A_MASK 0x1f |
#define IW_B_LSB 22 |
#define IW_B_MSB 26 |
#define IW_B_SZ 5 |
#define IW_B_MASK 0x1f |
#define IW_C_LSB 17 |
#define IW_C_MSB 21 |
#define IW_C_SZ 5 |
#define IW_C_MASK 0x1f |
#define IW_IMM16_LSB 6 |
#define IW_IMM16_MSB 21 |
#define IW_IMM16_SZ 16 |
#define IW_IMM16_MASK 0xffff |
#define IW_IMM26_LSB 6 |
#define IW_IMM26_MSB 31 |
#define IW_IMM26_SZ 26 |
#define IW_IMM26_MASK 0x3ffffff |
#define IW_OP_LSB 0 |
#define IW_OP_MSB 5 |
#define IW_OP_SZ 6 |
#define IW_OP_MASK 0x3f |
#define IW_OPX_LSB 11 |
#define IW_OPX_MSB 16 |
#define IW_OPX_SZ 6 |
#define IW_OPX_MASK 0x3f |
#define IW_SHIFT_IMM5_LSB 6 |
#define IW_SHIFT_IMM5_MSB 10 |
#define IW_SHIFT_IMM5_SZ 5 |
#define IW_SHIFT_IMM5_MASK 0x1f |
#define IW_CONTROL_REGNUM_LSB 6 |
#define IW_CONTROL_REGNUM_MSB 9 |
#define IW_CONTROL_REGNUM_SZ 4 |
#define IW_CONTROL_REGNUM_MASK 0xf |
/* Operator mask and shift. */ |
#define OP_MASK_OP (IW_OP_MASK << IW_OP_LSB) |
#define OP_SH_OP IW_OP_LSB |
/* Masks and shifts for I-type instructions. */ |
#define OP_MASK_IOP (IW_OP_MASK << IW_OP_LSB) |
#define OP_SH_IOP IW_OP_LSB |
#define OP_MASK_IMM16 (IW_IMM16_MASK << IW_IMM16_LSB) |
#define OP_SH_IMM16 IW_IMM16_LSB |
#define OP_MASK_IRD (IW_B_MASK << IW_B_LSB) |
#define OP_SH_IRD IW_B_LSB /* The same as T for I-type. */ |
#define OP_MASK_IRT (IW_B_MASK << IW_B_LSB) |
#define OP_SH_IRT IW_B_LSB |
#define OP_MASK_IRS (IW_A_MASK << IW_A_LSB) |
#define OP_SH_IRS IW_A_LSB |
/* Masks and shifts for R-type instructions. */ |
#define OP_MASK_ROP (IW_OP_MASK << IW_OP_LSB) |
#define OP_SH_ROP IW_OP_LSB |
#define OP_MASK_ROPX (IW_OPX_MASK << IW_OPX_LSB) |
#define OP_SH_ROPX IW_OPX_LSB |
#define OP_MASK_RRD (IW_C_MASK << IW_C_LSB) |
#define OP_SH_RRD IW_C_LSB |
#define OP_MASK_RRT (IW_B_MASK << IW_B_LSB) |
#define OP_SH_RRT IW_B_LSB |
#define OP_MASK_RRS (IW_A_MASK << IW_A_LSB) |
#define OP_SH_RRS IW_A_LSB |
/* Masks and shifts for J-type instructions. */ |
#define OP_MASK_JOP (IW_OP_MASK << IW_OP_LSB) |
#define OP_SH_JOP IW_OP_LSB |
#define OP_MASK_IMM26 (IW_IMM26_MASK << IW_IMM26_LSB) |
#define OP_SH_IMM26 IW_IMM26_LSB |
/* Masks and shifts for CTL instructions. */ |
#define OP_MASK_RCTL 0x000007c0 |
#define OP_SH_RCTL 6 |
/* Break instruction imm5 field. */ |
#define OP_MASK_TRAP_IMM5 0x000007c0 |
#define OP_SH_TRAP_IMM5 6 |
/* Instruction imm5 field. */ |
#define OP_MASK_IMM5 (IW_SHIFT_IMM5_MASK << IW_SHIFT_IMM5_LSB) |
#define OP_SH_IMM5 IW_SHIFT_IMM5_LSB |
/* Cache operation fields (type j,i(s)). */ |
#define OP_MASK_CACHE_OPX (IW_B_MASK << IW_B_LSB) |
#define OP_SH_CACHE_OPX IW_B_LSB |
#define OP_MASK_CACHE_RRS (IW_A_MASK << IW_A_LSB) |
#define OP_SH_CACHE_RRS IW_A_LSB |
/* Custom instruction masks. */ |
#define OP_MASK_CUSTOM_A 0x00010000 |
#define OP_SH_CUSTOM_A 16 |
#define OP_MASK_CUSTOM_B 0x00008000 |
#define OP_SH_CUSTOM_B 15 |
#define OP_MASK_CUSTOM_C 0x00004000 |
#define OP_SH_CUSTOM_C 14 |
#define OP_MASK_CUSTOM_N 0x00003fc0 |
#define OP_SH_CUSTOM_N 6 |
#define OP_MAX_CUSTOM_N 255 |
/* OP instruction values. */ |
#define OP_ADDI 4 |
#define OP_ANDHI 44 |
#define OP_ANDI 12 |
#define OP_BEQ 38 |
#define OP_BGE 14 |
#define OP_BGEU 46 |
#define OP_BLT 22 |
#define OP_BLTU 54 |
#define OP_BNE 30 |
#define OP_BR 6 |
#define OP_CALL 0 |
#define OP_CMPEQI 32 |
#define OP_CMPGEI 8 |
#define OP_CMPGEUI 40 |
#define OP_CMPLTI 16 |
#define OP_CMPLTUI 48 |
#define OP_CMPNEI 24 |
#define OP_CUSTOM 50 |
#define OP_FLUSHD 59 |
#define OP_FLUSHDA 27 |
#define OP_INITD 51 |
#define OP_INITDA 19 |
#define OP_JMPI 1 |
#define OP_LDB 7 |
#define OP_LDBIO 39 |
#define OP_LDBU 3 |
#define OP_LDBUIO 35 |
#define OP_LDH 15 |
#define OP_LDHIO 47 |
#define OP_LDHU 11 |
#define OP_LDHUIO 43 |
#define OP_LDL 31 |
#define OP_LDW 23 |
#define OP_LDWIO 55 |
#define OP_MULI 36 |
#define OP_OPX 58 |
#define OP_ORHI 52 |
#define OP_ORI 20 |
#define OP_RDPRS 56 |
#define OP_STB 5 |
#define OP_STBIO 37 |
#define OP_STC 29 |
#define OP_STH 13 |
#define OP_STHIO 45 |
#define OP_STW 21 |
#define OP_STWIO 53 |
#define OP_XORHI 60 |
#define OP_XORI 28 |
/* OPX instruction values. */ |
#define OPX_ADD 49 |
#define OPX_AND 14 |
#define OPX_BREAK 52 |
#define OPX_BRET 9 |
#define OPX_CALLR 29 |
#define OPX_CMPEQ 32 |
#define OPX_CMPGE 8 |
#define OPX_CMPGEU 40 |
#define OPX_CMPLT 16 |
#define OPX_CMPLTU 48 |
#define OPX_CMPNE 24 |
#define OPX_CRST 62 |
#define OPX_DIV 37 |
#define OPX_DIVU 36 |
#define OPX_ERET 1 |
#define OPX_FLUSHI 12 |
#define OPX_FLUSHP 4 |
#define OPX_HBREAK 53 |
#define OPX_INITI 41 |
#define OPX_INTR 61 |
#define OPX_JMP 13 |
#define OPX_MUL 39 |
#define OPX_MULXSS 31 |
#define OPX_MULXSU 23 |
#define OPX_MULXUU 7 |
#define OPX_NEXTPC 28 |
#define OPX_NOR 6 |
#define OPX_OR 22 |
#define OPX_RDCTL 38 |
#define OPX_RET 5 |
#define OPX_ROL 3 |
#define OPX_ROLI 2 |
#define OPX_ROR 11 |
#define OPX_SLL 19 |
#define OPX_SLLI 18 |
#define OPX_SRA 59 |
#define OPX_SRAI 58 |
#define OPX_SRL 27 |
#define OPX_SRLI 26 |
#define OPX_SUB 57 |
#define OPX_SYNC 54 |
#define OPX_TRAP 45 |
#define OPX_WRCTL 46 |
#define OPX_WRPRS 20 |
#define OPX_XOR 30 |
/* The following macros define the opcode matches for each |
instruction code & OP_MASK_INST == OP_MATCH_INST. */ |
/* OP instruction matches. */ |
#define OP_MATCH_ADDI OP_ADDI |
#define OP_MATCH_ANDHI OP_ANDHI |
#define OP_MATCH_ANDI OP_ANDI |
#define OP_MATCH_BEQ OP_BEQ |
#define OP_MATCH_BGE OP_BGE |
#define OP_MATCH_BGEU OP_BGEU |
#define OP_MATCH_BLT OP_BLT |
#define OP_MATCH_BLTU OP_BLTU |
#define OP_MATCH_BNE OP_BNE |
#define OP_MATCH_BR OP_BR |
#define OP_MATCH_FLUSHD OP_FLUSHD |
#define OP_MATCH_FLUSHDA OP_FLUSHDA |
#define OP_MATCH_INITD OP_INITD |
#define OP_MATCH_INITDA OP_INITDA |
#define OP_MATCH_CALL OP_CALL |
#define OP_MATCH_CMPEQI OP_CMPEQI |
#define OP_MATCH_CMPGEI OP_CMPGEI |
#define OP_MATCH_CMPGEUI OP_CMPGEUI |
#define OP_MATCH_CMPLTI OP_CMPLTI |
#define OP_MATCH_CMPLTUI OP_CMPLTUI |
#define OP_MATCH_CMPNEI OP_CMPNEI |
#define OP_MATCH_JMPI OP_JMPI |
#define OP_MATCH_LDB OP_LDB |
#define OP_MATCH_LDBIO OP_LDBIO |
#define OP_MATCH_LDBU OP_LDBU |
#define OP_MATCH_LDBUIO OP_LDBUIO |
#define OP_MATCH_LDH OP_LDH |
#define OP_MATCH_LDHIO OP_LDHIO |
#define OP_MATCH_LDHU OP_LDHU |
#define OP_MATCH_LDHUIO OP_LDHUIO |
#define OP_MATCH_LDL OP_LDL |
#define OP_MATCH_LDW OP_LDW |
#define OP_MATCH_LDWIO OP_LDWIO |
#define OP_MATCH_MULI OP_MULI |
#define OP_MATCH_OPX OP_OPX |
#define OP_MATCH_ORHI OP_ORHI |
#define OP_MATCH_ORI OP_ORI |
#define OP_MATCH_RDPRS OP_RDPRS |
#define OP_MATCH_STB OP_STB |
#define OP_MATCH_STBIO OP_STBIO |
#define OP_MATCH_STC OP_STC |
#define OP_MATCH_STH OP_STH |
#define OP_MATCH_STHIO OP_STHIO |
#define OP_MATCH_STW OP_STW |
#define OP_MATCH_STWIO OP_STWIO |
#define OP_MATCH_CUSTOM OP_CUSTOM |
#define OP_MATCH_XORHI OP_XORHI |
#define OP_MATCH_XORI OP_XORI |
#define OP_MATCH_OPX OP_OPX |
/* OPX instruction values. */ |
#define OPX_MATCH(code) ((code << IW_OPX_LSB) | OP_OPX) |
#define OP_MATCH_ADD OPX_MATCH (OPX_ADD) |
#define OP_MATCH_AND OPX_MATCH (OPX_AND) |
#define OP_MATCH_BREAK ((0x1e << 17) | OPX_MATCH (OPX_BREAK)) |
#define OP_MATCH_BRET (0xf0000000 | OPX_MATCH (OPX_BRET)) |
#define OP_MATCH_CALLR ((0x1f << 17) | OPX_MATCH (OPX_CALLR)) |
#define OP_MATCH_CMPEQ OPX_MATCH (OPX_CMPEQ) |
#define OP_MATCH_CMPGE OPX_MATCH (OPX_CMPGE) |
#define OP_MATCH_CMPGEU OPX_MATCH (OPX_CMPGEU) |
#define OP_MATCH_CMPLT OPX_MATCH (OPX_CMPLT) |
#define OP_MATCH_CMPLTU OPX_MATCH (OPX_CMPLTU) |
#define OP_MATCH_CMPNE OPX_MATCH (OPX_CMPNE) |
#define OP_MATCH_DIV OPX_MATCH (OPX_DIV) |
#define OP_MATCH_DIVU OPX_MATCH (OPX_DIVU) |
#define OP_MATCH_JMP OPX_MATCH (OPX_JMP) |
#define OP_MATCH_MUL OPX_MATCH (OPX_MUL) |
#define OP_MATCH_MULXSS OPX_MATCH (OPX_MULXSS) |
#define OP_MATCH_MULXSU OPX_MATCH (OPX_MULXSU) |
#define OP_MATCH_MULXUU OPX_MATCH (OPX_MULXUU) |
#define OP_MATCH_NEXTPC OPX_MATCH (OPX_NEXTPC) |
#define OP_MATCH_NOR OPX_MATCH (OPX_NOR) |
#define OP_MATCH_OR OPX_MATCH (OPX_OR) |
#define OP_MATCH_RDCTL OPX_MATCH (OPX_RDCTL) |
#define OP_MATCH_RET (0xf8000000 | OPX_MATCH (OPX_RET)) |
#define OP_MATCH_ROL OPX_MATCH (OPX_ROL) |
#define OP_MATCH_ROLI OPX_MATCH (OPX_ROLI) |
#define OP_MATCH_ROR OPX_MATCH (OPX_ROR) |
#define OP_MATCH_SLL OPX_MATCH (OPX_SLL) |
#define OP_MATCH_SLLI OPX_MATCH (OPX_SLLI) |
#define OP_MATCH_SRA OPX_MATCH (OPX_SRA) |
#define OP_MATCH_SRAI OPX_MATCH (OPX_SRAI) |
#define OP_MATCH_SRL OPX_MATCH (OPX_SRL) |
#define OP_MATCH_SRLI OPX_MATCH (OPX_SRLI) |
#define OP_MATCH_SUB OPX_MATCH (OPX_SUB) |
#define OP_MATCH_SYNC OPX_MATCH (OPX_SYNC) |
#define OP_MATCH_TRAP ((0x1d << 17) | OPX_MATCH (OPX_TRAP)) |
#define OP_MATCH_ERET (0xef800000 | OPX_MATCH (OPX_ERET)) |
#define OP_MATCH_WRCTL OPX_MATCH (OPX_WRCTL) |
#define OP_MATCH_WRPRS OPX_MATCH (OPX_WRPRS) |
#define OP_MATCH_XOR OPX_MATCH (OPX_XOR) |
#define OP_MATCH_FLUSHI OPX_MATCH (OPX_FLUSHI) |
#define OP_MATCH_FLUSHP OPX_MATCH (OPX_FLUSHP) |
#define OP_MATCH_INITI OPX_MATCH (OPX_INITI) |
/* Some unusual op masks. */ |
#define OP_MASK_BREAK ((OP_MASK_RRS | OP_MASK_RRT | OP_MASK_RRD \ |
| OP_MASK_ROPX | OP_MASK_OP) \ |
& 0xfffff03f) |
#define OP_MASK_CALLR ((OP_MASK_RRT | OP_MASK_RRD | OP_MASK_ROPX \ |
| OP_MASK_OP)) |
#define OP_MASK_JMP ((OP_MASK_RRT | OP_MASK_RRD | OP_MASK_ROPX \ |
| OP_MASK_OP)) |
#define OP_MASK_SYNC ((OP_MASK_RRT | OP_MASK_RRD | OP_MASK_ROPX \ |
| OP_MASK_OP)) |
#define OP_MASK_TRAP ((OP_MASK_RRS | OP_MASK_RRT | OP_MASK_RRD \ |
| OP_MASK_ROPX | OP_MASK_OP) \ |
& 0xfffff83f) |
#define OP_MASK_WRCTL ((OP_MASK_RRT | OP_MASK_RRD | OP_MASK_ROPX \ |
| OP_MASK_OP)) /*& 0xfffff83f */ |
#define OP_MASK_NEXTPC ((OP_MASK_RRS | OP_MASK_RRT | OP_MASK_ROPX \ |
| OP_MASK_OP)) |
#define OP_MASK_FLUSHI ((OP_MASK_RRT | OP_MASK_RRD | OP_MASK_ROPX \ |
| OP_MASK_OP)) |
#define OP_MASK_INITI ((OP_MASK_RRT | OP_MASK_RRD | OP_MASK_ROPX \ |
| OP_MASK_OP)) |
#define OP_MASK_ROLI ((OP_MASK_RRT | OP_MASK_ROPX | OP_MASK_OP)) |
#define OP_MASK_SLLI ((OP_MASK_RRT | OP_MASK_ROPX | OP_MASK_OP)) |
#define OP_MASK_SRAI ((OP_MASK_RRT | OP_MASK_ROPX | OP_MASK_OP)) |
#define OP_MASK_SRLI ((OP_MASK_RRT | OP_MASK_ROPX | OP_MASK_OP)) |
#define OP_MASK_RDCTL ((OP_MASK_RRS | OP_MASK_RRT | OP_MASK_ROPX \ |
| OP_MASK_OP)) /*& 0xfffff83f */ |
#ifndef OP_MASK |
#define OP_MASK 0xffffffff |
#endif |
/* These convenience macros to extract instruction fields are used by GDB. */ |
#define GET_IW_A(Iw) \ |
(((Iw) >> IW_A_LSB) & IW_A_MASK) |
#define GET_IW_B(Iw) \ |
(((Iw) >> IW_B_LSB) & IW_B_MASK) |
#define GET_IW_C(Iw) \ |
(((Iw) >> IW_C_LSB) & IW_C_MASK) |
#define GET_IW_CONTROL_REGNUM(Iw) \ |
(((Iw) >> IW_CONTROL_REGNUM_LSB) & IW_CONTROL_REGNUM_MASK) |
#define GET_IW_IMM16(Iw) \ |
(((Iw) >> IW_IMM16_LSB) & IW_IMM16_MASK) |
#define GET_IW_IMM26(Iw) \ |
(((Iw) >> IW_IMM26_LSB) & IW_IMM26_MASK) |
#define GET_IW_OP(Iw) \ |
(((Iw) >> IW_OP_LSB) & IW_OP_MASK) |
#define GET_IW_OPX(Iw) \ |
(((Iw) >> IW_OPX_LSB) & IW_OPX_MASK) |
/* These are the data structures we use to hold the instruction information. */ |
extern const struct nios2_opcode nios2_builtin_opcodes[]; |
extern const int bfd_nios2_num_builtin_opcodes; |
extern struct nios2_opcode *nios2_opcodes; |
extern int bfd_nios2_num_opcodes; |
/* These are the data structures used to hold the register information. */ |
extern const struct nios2_reg nios2_builtin_regs[]; |
extern struct nios2_reg *nios2_regs; |
extern const int nios2_num_builtin_regs; |
extern int nios2_num_regs; |
/* Machine-independent macro for number of opcodes. */ |
#define NUMOPCODES bfd_nios2_num_opcodes |
#define NUMREGISTERS nios2_num_regs; |
/* This is made extern so that the assembler can use it to find out |
what instruction caused an error. */ |
extern const struct nios2_opcode *nios2_find_opcode_hash (unsigned long); |
#endif /* _NIOS2_H */ |
/contrib/toolchain/binutils/include/opcode/np1.h |
---|
0,0 → 1,421 |
/* Print GOULD NPL instructions for GDB, the GNU debugger. |
Copyright 1986, 1987, 1989, 1991, 2010 Free Software Foundation, Inc. |
This file is part of GDB. |
GDB is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3, or (at your option) |
any later version. |
GDB is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with GDB; see the file COPYING3. If not, write to |
the Free Software Foundation, 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
struct gld_opcode |
{ |
char *name; |
unsigned long opcode; |
unsigned long mask; |
char *args; |
int length; |
}; |
/* We store four bytes of opcode for all opcodes because that |
is the most any of them need. The actual length of an instruction |
is always at least 2 bytes, and at most four. The length of the |
instruction is based on the opcode. |
The mask component is a mask saying which bits must match |
particular opcode in order for an instruction to be an instance |
of that opcode. |
The args component is a string containing characters |
that are used to format the arguments to the instruction. */ |
/* Kinds of operands: |
r Register in first field |
R Register in second field |
b Base register in first field |
B Base register in second field |
v Vector register in first field |
V Vector register in first field |
A Optional address register (base register) |
X Optional index register |
I Immediate data (16bits signed) |
O Offset field (16bits signed) |
h Offset field (15bits signed) |
d Offset field (14bits signed) |
S Shift count field |
any other characters are printed as is... */ |
/* The assembler requires that this array be sorted as follows: |
all instances of the same mnemonic must be consecutive. |
All instances of the same mnemonic with the same number of operands |
must be consecutive. */ |
struct gld_opcode gld_opcodes[] = |
{ |
{ "lb", 0xb4080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "lnb", 0xb8080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "lbs", 0xec080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "lh", 0xb4000001, 0xfc080001, "r,xOA,X", 4 }, |
{ "lnh", 0xb8000001, 0xfc080001, "r,xOA,X", 4 }, |
{ "lw", 0xb4000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "lnw", 0xb8000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "ld", 0xb4000002, 0xfc080002, "r,xOA,X", 4 }, |
{ "lnd", 0xb8000002, 0xfc080002, "r,xOA,X", 4 }, |
{ "li", 0xf8000000, 0xfc7f0000, "r,I", 4 }, |
{ "lpa", 0x50080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "la", 0x50000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "labr", 0x58080000, 0xfc080000, "b,xOA,X", 4 }, |
{ "lbp", 0x90080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "lhp", 0x90000001, 0xfc080001, "r,xOA,X", 4 }, |
{ "lwp", 0x90000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "ldp", 0x90000002, 0xfc080002, "r,xOA,X", 4 }, |
{ "suabr", 0x58000000, 0xfc080000, "b,xOA,X", 4 }, |
{ "lf", 0xbc000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "lfbr", 0xbc080000, 0xfc080000, "b,xOA,X", 4 }, |
{ "lwbr", 0x5c000000, 0xfc080000, "b,xOA,X", 4 }, |
{ "stb", 0xd4080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "sth", 0xd4000001, 0xfc080001, "r,xOA,X", 4 }, |
{ "stw", 0xd4000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "std", 0xd4000002, 0xfc080002, "r,xOA,X", 4 }, |
{ "stf", 0xdc000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "stfbr", 0xdc080000, 0xfc080000, "b,xOA,X", 4 }, |
{ "stwbr", 0x54000000, 0xfc080000, "b,xOA,X", 4 }, |
{ "zmb", 0xd8080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "zmh", 0xd8000001, 0xfc080001, "r,xOA,X", 4 }, |
{ "zmw", 0xd8000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "zmd", 0xd8000002, 0xfc080002, "r,xOA,X", 4 }, |
{ "stbp", 0x94080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "sthp", 0x94000001, 0xfc080001, "r,xOA,X", 4 }, |
{ "stwp", 0x94000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "stdp", 0x94000002, 0xfc080002, "r,xOA,X", 4 }, |
{ "lil", 0xf80b0000, 0xfc7f0000, "r,D", 4 }, |
{ "lwsl1", 0xec000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "lwsl2", 0xfc000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "lwsl3", 0xfc080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "lvb", 0xb0080000, 0xfc080000, "v,xOA,X", 4 }, |
{ "lvh", 0xb0000001, 0xfc080001, "v,xOA,X", 4 }, |
{ "lvw", 0xb0000000, 0xfc080000, "v,xOA,X", 4 }, |
{ "lvd", 0xb0000002, 0xfc080002, "v,xOA,X", 4 }, |
{ "liv", 0x3c040000, 0xfc0f0000, "v,R", 2 }, |
{ "livf", 0x3c080000, 0xfc0f0000, "v,R", 2 }, |
{ "stvb", 0xd0080000, 0xfc080000, "v,xOA,X", 4 }, |
{ "stvh", 0xd0000001, 0xfc080001, "v,xOA,X", 4 }, |
{ "stvw", 0xd0000000, 0xfc080000, "v,xOA,X", 4 }, |
{ "stvd", 0xd0000002, 0xfc080002, "v,xOA,X", 4 }, |
{ "trr", 0x2c000000, 0xfc0f0000, "r,R", 2 }, |
{ "trn", 0x2c040000, 0xfc0f0000, "r,R", 2 }, |
{ "trnd", 0x2c0c0000, 0xfc0f0000, "r,R", 2 }, |
{ "trabs", 0x2c010000, 0xfc0f0000, "r,R", 2 }, |
{ "trabsd", 0x2c090000, 0xfc0f0000, "r,R", 2 }, |
{ "trc", 0x2c030000, 0xfc0f0000, "r,R", 2 }, |
{ "xcr", 0x28040000, 0xfc0f0000, "r,R", 2 }, |
{ "cxcr", 0x2c060000, 0xfc0f0000, "r,R", 2 }, |
{ "cxcrd", 0x2c0e0000, 0xfc0f0000, "r,R", 2 }, |
{ "tbrr", 0x2c020000, 0xfc0f0000, "r,B", 2 }, |
{ "trbr", 0x28030000, 0xfc0f0000, "b,R", 2 }, |
{ "xcbr", 0x28020000, 0xfc0f0000, "b,B", 2 }, |
{ "tbrbr", 0x28010000, 0xfc0f0000, "b,B", 2 }, |
{ "trvv", 0x28050000, 0xfc0f0000, "v,V", 2 }, |
{ "trvvn", 0x2c050000, 0xfc0f0000, "v,V", 2 }, |
{ "trvvnd", 0x2c0d0000, 0xfc0f0000, "v,V", 2 }, |
{ "trvab", 0x2c070000, 0xfc0f0000, "v,V", 2 }, |
{ "trvabd", 0x2c0f0000, 0xfc0f0000, "v,V", 2 }, |
{ "cmpv", 0x14060000, 0xfc0f0000, "v,V", 2 }, |
{ "expv", 0x14070000, 0xfc0f0000, "v,V", 2 }, |
{ "mrvvlt", 0x10030000, 0xfc0f0000, "v,V", 2 }, |
{ "mrvvle", 0x10040000, 0xfc0f0000, "v,V", 2 }, |
{ "mrvvgt", 0x14030000, 0xfc0f0000, "v,V", 2 }, |
{ "mrvvge", 0x14040000, 0xfc0f0000, "v,V", 2 }, |
{ "mrvveq", 0x10050000, 0xfc0f0000, "v,V", 2 }, |
{ "mrvvne", 0x10050000, 0xfc0f0000, "v,V", 2 }, |
{ "mrvrlt", 0x100d0000, 0xfc0f0000, "v,R", 2 }, |
{ "mrvrle", 0x100e0000, 0xfc0f0000, "v,R", 2 }, |
{ "mrvrgt", 0x140d0000, 0xfc0f0000, "v,R", 2 }, |
{ "mrvrge", 0x140e0000, 0xfc0f0000, "v,R", 2 }, |
{ "mrvreq", 0x100f0000, 0xfc0f0000, "v,R", 2 }, |
{ "mrvrne", 0x140f0000, 0xfc0f0000, "v,R", 2 }, |
{ "trvr", 0x140b0000, 0xfc0f0000, "r,V", 2 }, |
{ "trrv", 0x140c0000, 0xfc0f0000, "v,R", 2 }, |
{ "bu", 0x40000000, 0xff880000, "xOA,X", 4 }, |
{ "bns", 0x70080000, 0xff880000, "xOA,X", 4 }, |
{ "bnco", 0x70880000, 0xff880000, "xOA,X", 4 }, |
{ "bge", 0x71080000, 0xff880000, "xOA,X", 4 }, |
{ "bne", 0x71880000, 0xff880000, "xOA,X", 4 }, |
{ "bunge", 0x72080000, 0xff880000, "xOA,X", 4 }, |
{ "bunle", 0x72880000, 0xff880000, "xOA,X", 4 }, |
{ "bgt", 0x73080000, 0xff880000, "xOA,X", 4 }, |
{ "bnany", 0x73880000, 0xff880000, "xOA,X", 4 }, |
{ "bs" , 0x70000000, 0xff880000, "xOA,X", 4 }, |
{ "bco", 0x70800000, 0xff880000, "xOA,X", 4 }, |
{ "blt", 0x71000000, 0xff880000, "xOA,X", 4 }, |
{ "beq", 0x71800000, 0xff880000, "xOA,X", 4 }, |
{ "buge", 0x72000000, 0xff880000, "xOA,X", 4 }, |
{ "bult", 0x72800000, 0xff880000, "xOA,X", 4 }, |
{ "ble", 0x73000000, 0xff880000, "xOA,X", 4 }, |
{ "bany", 0x73800000, 0xff880000, "xOA,X", 4 }, |
{ "brlnk", 0x44000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "bib", 0x48000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "bih", 0x48080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "biw", 0x4c000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "bid", 0x4c080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "bivb", 0x60000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "bivh", 0x60080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "bivw", 0x64000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "bivd", 0x64080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "bvsb", 0x68000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "bvsh", 0x68080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "bvsw", 0x6c000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "bvsd", 0x6c080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "camb", 0x80080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "camh", 0x80000001, 0xfc080001, "r,xOA,X", 4 }, |
{ "camw", 0x80000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "camd", 0x80000002, 0xfc080002, "r,xOA,X", 4 }, |
{ "car", 0x10000000, 0xfc0f0000, "r,R", 2 }, |
{ "card", 0x14000000, 0xfc0f0000, "r,R", 2 }, |
{ "ci", 0xf8050000, 0xfc7f0000, "r,I", 4 }, |
{ "chkbnd", 0x5c080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "cavv", 0x10010000, 0xfc0f0000, "v,V", 2 }, |
{ "cavr", 0x10020000, 0xfc0f0000, "v,R", 2 }, |
{ "cavvd", 0x10090000, 0xfc0f0000, "v,V", 2 }, |
{ "cavrd", 0x100b0000, 0xfc0f0000, "v,R", 2 }, |
{ "anmb", 0x84080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "anmh", 0x84000001, 0xfc080001, "r,xOA,X", 4 }, |
{ "anmw", 0x84000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "anmd", 0x84000002, 0xfc080002, "r,xOA,X", 4 }, |
{ "anr", 0x04000000, 0xfc0f0000, "r,R", 2 }, |
{ "ani", 0xf8080000, 0xfc7f0000, "r,I", 4 }, |
{ "ormb", 0xb8080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "ormh", 0xb8000001, 0xfc080001, "r,xOA,X", 4 }, |
{ "ormw", 0xb8000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "ormd", 0xb8000002, 0xfc080002, "r,xOA,X", 4 }, |
{ "orr", 0x08000000, 0xfc0f0000, "r,R", 2 }, |
{ "oi", 0xf8090000, 0xfc7f0000, "r,I", 4 }, |
{ "eomb", 0x8c080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "eomh", 0x8c000001, 0xfc080001, "r,xOA,X", 4 }, |
{ "eomw", 0x8c000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "eomd", 0x8c000002, 0xfc080002, "r,xOA,X", 4 }, |
{ "eor", 0x0c000000, 0xfc0f0000, "r,R", 2 }, |
{ "eoi", 0xf80a0000, 0xfc7f0000, "r,I", 4 }, |
{ "anvv", 0x04010000, 0xfc0f0000, "v,V", 2 }, |
{ "anvr", 0x04020000, 0xfc0f0000, "v,R", 2 }, |
{ "orvv", 0x08010000, 0xfc0f0000, "v,V", 2 }, |
{ "orvr", 0x08020000, 0xfc0f0000, "v,R", 2 }, |
{ "eovv", 0x0c010000, 0xfc0f0000, "v,V", 2 }, |
{ "eovr", 0x0c020000, 0xfc0f0000, "v,R", 2 }, |
{ "sacz", 0x100c0000, 0xfc0f0000, "r,R", 2 }, |
{ "sla", 0x1c400000, 0xfc600000, "r,S", 2 }, |
{ "sll", 0x1c600000, 0xfc600000, "r,S", 2 }, |
{ "slc", 0x24400000, 0xfc600000, "r,S", 2 }, |
{ "slad", 0x20400000, 0xfc600000, "r,S", 2 }, |
{ "slld", 0x20600000, 0xfc600000, "r,S", 2 }, |
{ "sra", 0x1c000000, 0xfc600000, "r,S", 2 }, |
{ "srl", 0x1c200000, 0xfc600000, "r,S", 2 }, |
{ "src", 0x24000000, 0xfc600000, "r,S", 2 }, |
{ "srad", 0x20000000, 0xfc600000, "r,S", 2 }, |
{ "srld", 0x20200000, 0xfc600000, "r,S", 2 }, |
{ "sda", 0x3c030000, 0xfc0f0000, "r,R", 2 }, |
{ "sdl", 0x3c020000, 0xfc0f0000, "r,R", 2 }, |
{ "sdc", 0x3c010000, 0xfc0f0000, "r,R", 2 }, |
{ "sdad", 0x3c0b0000, 0xfc0f0000, "r,R", 2 }, |
{ "sdld", 0x3c0a0000, 0xfc0f0000, "r,R", 2 }, |
{ "svda", 0x3c070000, 0xfc0f0000, "v,R", 2 }, |
{ "svdl", 0x3c060000, 0xfc0f0000, "v,R", 2 }, |
{ "svdc", 0x3c050000, 0xfc0f0000, "v,R", 2 }, |
{ "svdad", 0x3c0e0000, 0xfc0f0000, "v,R", 2 }, |
{ "svdld", 0x3c0d0000, 0xfc0f0000, "v,R", 2 }, |
{ "sbm", 0xac080000, 0xfc080000, "f,xOA,X", 4 }, |
{ "zbm", 0xac000000, 0xfc080000, "f,xOA,X", 4 }, |
{ "tbm", 0xa8080000, 0xfc080000, "f,xOA,X", 4 }, |
{ "incmb", 0xa0000000, 0xfc080000, "xOA,X", 4 }, |
{ "incmh", 0xa0080000, 0xfc080000, "xOA,X", 4 }, |
{ "incmw", 0xa4000000, 0xfc080000, "xOA,X", 4 }, |
{ "incmd", 0xa4080000, 0xfc080000, "xOA,X", 4 }, |
{ "sbmd", 0x7c080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "zbmd", 0x7c000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "tbmd", 0x78080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "ssm", 0x9c080000, 0xfc080000, "f,xOA,X", 4 }, |
{ "zsm", 0x9c000000, 0xfc080000, "f,xOA,X", 4 }, |
{ "tsm", 0x98080000, 0xfc080000, "f,xOA,X", 4 }, |
{ "admb", 0xc8080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "admh", 0xc8000001, 0xfc080001, "r,xOA,X", 4 }, |
{ "admw", 0xc8000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "admd", 0xc8000002, 0xfc080002, "r,xOA,X", 4 }, |
{ "adr", 0x38000000, 0xfc0f0000, "r,R", 2 }, |
{ "armb", 0xe8080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "armh", 0xe8000001, 0xfc080001, "r,xOA,X", 4 }, |
{ "armw", 0xe8000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "armd", 0xe8000002, 0xfc080002, "r,xOA,X", 4 }, |
{ "adi", 0xf8010000, 0xfc0f0000, "r,I", 4 }, |
{ "sumb", 0xcc080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "sumh", 0xcc000001, 0xfc080001, "r,xOA,X", 4 }, |
{ "sumw", 0xcc000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "sumd", 0xcc000002, 0xfc080002, "r,xOA,X", 4 }, |
{ "sur", 0x3c000000, 0xfc0f0000, "r,R", 2 }, |
{ "sui", 0xf8020000, 0xfc0f0000, "r,I", 4 }, |
{ "mpmb", 0xc0080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "mpmh", 0xc0000001, 0xfc080001, "r,xOA,X", 4 }, |
{ "mpmw", 0xc0000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "mpr", 0x38020000, 0xfc0f0000, "r,R", 2 }, |
{ "mprd", 0x3c0f0000, 0xfc0f0000, "r,R", 2 }, |
{ "mpi", 0xf8030000, 0xfc0f0000, "r,I", 4 }, |
{ "dvmb", 0xc4080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "dvmh", 0xc4000001, 0xfc080001, "r,xOA,X", 4 }, |
{ "dvmw", 0xc4000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "dvr", 0x380a0000, 0xfc0f0000, "r,R", 2 }, |
{ "dvi", 0xf8040000, 0xfc0f0000, "r,I", 4 }, |
{ "exs", 0x38080000, 0xfc0f0000, "r,R", 2 }, |
{ "advv", 0x30000000, 0xfc0f0000, "v,V", 2 }, |
{ "advvd", 0x30080000, 0xfc0f0000, "v,V", 2 }, |
{ "adrv", 0x34000000, 0xfc0f0000, "v,R", 2 }, |
{ "adrvd", 0x34080000, 0xfc0f0000, "v,R", 2 }, |
{ "suvv", 0x30010000, 0xfc0f0000, "v,V", 2 }, |
{ "suvvd", 0x30090000, 0xfc0f0000, "v,V", 2 }, |
{ "surv", 0x34010000, 0xfc0f0000, "v,R", 2 }, |
{ "survd", 0x34090000, 0xfc0f0000, "v,R", 2 }, |
{ "mpvv", 0x30020000, 0xfc0f0000, "v,V", 2 }, |
{ "mprv", 0x34020000, 0xfc0f0000, "v,R", 2 }, |
{ "adfw", 0xe0080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "adfd", 0xe0080002, 0xfc080002, "r,xOA,X", 4 }, |
{ "adrfw", 0x38010000, 0xfc0f0000, "r,R", 2 }, |
{ "adrfd", 0x38090000, 0xfc0f0000, "r,R", 2 }, |
{ "surfw", 0xe0000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "surfd", 0xe0000002, 0xfc080002, "r,xOA,X", 4 }, |
{ "surfw", 0x38030000, 0xfc0f0000, "r,R", 2 }, |
{ "surfd", 0x380b0000, 0xfc0f0000, "r,R", 2 }, |
{ "mpfw", 0xe4080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "mpfd", 0xe4080002, 0xfc080002, "r,xOA,X", 4 }, |
{ "mprfw", 0x38060000, 0xfc0f0000, "r,R", 2 }, |
{ "mprfd", 0x380e0000, 0xfc0f0000, "r,R", 2 }, |
{ "rfw", 0xe4000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "rfd", 0xe4000002, 0xfc080002, "r,xOA,X", 4 }, |
{ "rrfw", 0x0c0e0000, 0xfc0f0000, "r", 2 }, |
{ "rrfd", 0x0c0f0000, 0xfc0f0000, "r", 2 }, |
{ "advvfw", 0x30040000, 0xfc0f0000, "v,V", 2 }, |
{ "advvfd", 0x300c0000, 0xfc0f0000, "v,V", 2 }, |
{ "adrvfw", 0x34040000, 0xfc0f0000, "v,R", 2 }, |
{ "adrvfd", 0x340c0000, 0xfc0f0000, "v,R", 2 }, |
{ "suvvfw", 0x30050000, 0xfc0f0000, "v,V", 2 }, |
{ "suvvfd", 0x300d0000, 0xfc0f0000, "v,V", 2 }, |
{ "survfw", 0x34050000, 0xfc0f0000, "v,R", 2 }, |
{ "survfd", 0x340d0000, 0xfc0f0000, "v,R", 2 }, |
{ "mpvvfw", 0x30060000, 0xfc0f0000, "v,V", 2 }, |
{ "mpvvfd", 0x300e0000, 0xfc0f0000, "v,V", 2 }, |
{ "mprvfw", 0x34060000, 0xfc0f0000, "v,R", 2 }, |
{ "mprvfd", 0x340e0000, 0xfc0f0000, "v,R", 2 }, |
{ "rvfw", 0x30070000, 0xfc0f0000, "v", 2 }, |
{ "rvfd", 0x300f0000, 0xfc0f0000, "v", 2 }, |
{ "fltw", 0x38070000, 0xfc0f0000, "r,R", 2 }, |
{ "fltd", 0x380f0000, 0xfc0f0000, "r,R", 2 }, |
{ "fixw", 0x38050000, 0xfc0f0000, "r,R", 2 }, |
{ "fixd", 0x380d0000, 0xfc0f0000, "r,R", 2 }, |
{ "cfpds", 0x3c090000, 0xfc0f0000, "r,R", 2 }, |
{ "fltvw", 0x080d0000, 0xfc0f0000, "v,V", 2 }, |
{ "fltvd", 0x080f0000, 0xfc0f0000, "v,V", 2 }, |
{ "fixvw", 0x080c0000, 0xfc0f0000, "v,V", 2 }, |
{ "fixvd", 0x080e0000, 0xfc0f0000, "v,V", 2 }, |
{ "cfpvds", 0x0c0d0000, 0xfc0f0000, "v,V", 2 }, |
{ "orvrn", 0x000a0000, 0xfc0f0000, "r,V", 2 }, |
{ "andvrn", 0x00080000, 0xfc0f0000, "r,V", 2 }, |
{ "frsteq", 0x04090000, 0xfc0f0000, "r,V", 2 }, |
{ "sigma", 0x0c080000, 0xfc0f0000, "r,V", 2 }, |
{ "sigmad", 0x0c0a0000, 0xfc0f0000, "r,V", 2 }, |
{ "sigmf", 0x08080000, 0xfc0f0000, "r,V", 2 }, |
{ "sigmfd", 0x080a0000, 0xfc0f0000, "r,V", 2 }, |
{ "prodf", 0x04080000, 0xfc0f0000, "r,V", 2 }, |
{ "prodfd", 0x040a0000, 0xfc0f0000, "r,V", 2 }, |
{ "maxv", 0x10080000, 0xfc0f0000, "r,V", 2 }, |
{ "maxvd", 0x100a0000, 0xfc0f0000, "r,V", 2 }, |
{ "minv", 0x14080000, 0xfc0f0000, "r,V", 2 }, |
{ "minvd", 0x140a0000, 0xfc0f0000, "r,V", 2 }, |
{ "lpsd", 0xf0000000, 0xfc080000, "xOA,X", 4 }, |
{ "ldc", 0xf0080000, 0xfc080000, "xOA,X", 4 }, |
{ "spm", 0x040c0000, 0xfc0f0000, "r", 2 }, |
{ "rpm", 0x040d0000, 0xfc0f0000, "r", 2 }, |
{ "tritr", 0x00070000, 0xfc0f0000, "r", 2 }, |
{ "trrit", 0x00060000, 0xfc0f0000, "r", 2 }, |
{ "rpswt", 0x04080000, 0xfc0f0000, "r", 2 }, |
{ "exr", 0xf8070000, 0xfc0f0000, "", 4 }, |
{ "halt", 0x00000000, 0xfc0f0000, "", 2 }, |
{ "wait", 0x00010000, 0xfc0f0000, "", 2 }, |
{ "nop", 0x00020000, 0xfc0f0000, "", 2 }, |
{ "eiae", 0x00030000, 0xfc0f0000, "", 2 }, |
{ "efae", 0x000d0000, 0xfc0f0000, "", 2 }, |
{ "diae", 0x000e0000, 0xfc0f0000, "", 2 }, |
{ "dfae", 0x000f0000, 0xfc0f0000, "", 2 }, |
{ "spvc", 0xf8060000, 0xfc0f0000, "r,T,N", 4 }, |
{ "rdsts", 0x00090000, 0xfc0f0000, "r", 2 }, |
{ "setcpu", 0x000c0000, 0xfc0f0000, "r", 2 }, |
{ "cmc", 0x000b0000, 0xfc0f0000, "r", 2 }, |
{ "trrcu", 0x00040000, 0xfc0f0000, "r", 2 }, |
{ "attnio", 0x00050000, 0xfc0f0000, "", 2 }, |
{ "fudit", 0x28080000, 0xfc0f0000, "", 2 }, |
{ "break", 0x28090000, 0xfc0f0000, "", 2 }, |
{ "frzss", 0x280a0000, 0xfc0f0000, "", 2 }, |
{ "ripi", 0x04040000, 0xfc0f0000, "r,R", 2 }, |
{ "xcp", 0x04050000, 0xfc0f0000, "r", 2 }, |
{ "block", 0x04060000, 0xfc0f0000, "", 2 }, |
{ "unblock", 0x04070000, 0xfc0f0000, "", 2 }, |
{ "trsc", 0x08060000, 0xfc0f0000, "r,R", 2 }, |
{ "tscr", 0x08070000, 0xfc0f0000, "r,R", 2 }, |
{ "fq", 0x04080000, 0xfc0f0000, "r", 2 }, |
{ "flupte", 0x2c080000, 0xfc0f0000, "r", 2 }, |
{ "rviu", 0x040f0000, 0xfc0f0000, "", 2 }, |
{ "ldel", 0x280c0000, 0xfc0f0000, "r,R", 2 }, |
{ "ldu", 0x280d0000, 0xfc0f0000, "r,R", 2 }, |
{ "stdecc", 0x280b0000, 0xfc0f0000, "r,R", 2 }, |
{ "trpc", 0x08040000, 0xfc0f0000, "r", 2 }, |
{ "tpcr", 0x08050000, 0xfc0f0000, "r", 2 }, |
{ "ghalt", 0x0c050000, 0xfc0f0000, "r", 2 }, |
{ "grun", 0x0c040000, 0xfc0f0000, "", 2 }, |
{ "tmpr", 0x2c0a0000, 0xfc0f0000, "r,R", 2 }, |
{ "trmp", 0x2c0b0000, 0xfc0f0000, "r,R", 2 }, |
{ "trrve", 0x28060000, 0xfc0f0000, "r", 2 }, |
{ "trver", 0x28070000, 0xfc0f0000, "r", 2 }, |
{ "trvlr", 0x280f0000, 0xfc0f0000, "r", 2 }, |
{ "linkfl", 0x18000000, 0xfc0f0000, "r,R", 2 }, |
{ "linkbl", 0x18020000, 0xfc0f0000, "r,R", 2 }, |
{ "linkfp", 0x18010000, 0xfc0f0000, "r,R", 2 }, |
{ "linkbp", 0x18030000, 0xfc0f0000, "r,R", 2 }, |
{ "linkpl", 0x18040000, 0xfc0f0000, "r,R", 2 }, |
{ "ulinkl", 0x18080000, 0xfc0f0000, "r,R", 2 }, |
{ "ulinkp", 0x18090000, 0xfc0f0000, "r,R", 2 }, |
{ "ulinktl", 0x180a0000, 0xfc0f0000, "r,R", 2 }, |
{ "ulinktp", 0x180b0000, 0xfc0f0000, "r,R", 2 }, |
}; |
int numopcodes = sizeof(gld_opcodes) / sizeof(gld_opcodes[0]); |
struct gld_opcode *endop = gld_opcodes + sizeof(gld_opcodes) / |
sizeof(gld_opcodes[0]); |
/contrib/toolchain/binutils/include/opcode/ns32k.h |
---|
0,0 → 1,487 |
/* ns32k-opcode.h -- Opcode table for National Semi 32k processor |
Copyright 1987, 1991, 1994, 2002, 2010 Free Software Foundation, Inc. |
This file is part of GAS, the GNU Assembler. |
GAS is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3, or (at your option) |
any later version. |
GAS is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with GAS; see the file COPYING3. If not, write to |
the Free Software Foundation, 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
#ifdef SEQUENT_COMPATABILITY |
#define DEF_MODEC 20 |
#define DEF_MODEL 21 |
#endif |
#ifndef DEF_MODEC |
#define DEF_MODEC 20 |
#endif |
#ifndef DEF_MODEL |
#define DEF_MODEL 20 |
#endif |
/* |
After deciding the instruction entry (via hash.c) the instruction parser |
will try to match the operands after the instruction to the required set |
given in the entry operandfield. Every operand will result in a change in |
the opcode or the addition of data to the opcode. |
The operands in the source instruction are checked for inconsistent |
semantics. |
F : 32 bit float general form |
L : 64 bit float " |
B : byte " |
W : word " |
D : double-word " |
A : double-word gen-address-form ie no regs, no immediate |
I : integer writeable gen int except immediate (A + reg) |
Z : floating writeable gen float except immediate (Z + freg) |
d : displacement |
b : displacement - pc relative addressing acb |
p : displacement - pc relative addressing br bcond bsr cxp |
q : quick |
i : immediate (8 bits) |
This is not a standard ns32k operandtype, it is used to build |
instructions like svc arg1,arg2 |
Svc is the instruction SuperVisorCall and is sometimes used to |
call OS-routines from usermode. Some args might be handy! |
r : register number (3 bits) |
O : setcfg instruction optionslist |
C : cinv instruction optionslist |
S : stringinstruction optionslist |
U : registerlist save,enter |
u : registerlist restore,exit |
M : mmu register |
P : cpu register |
g : 3:rd operand of inss or exts instruction |
G : 4:th operand of inss or exts instruction |
Those operands are encoded in the same byte. |
This byte is placed last in the instruction. |
f : operand of sfsr |
H : sequent-hack for bsr (Warning) |
column 1 instructions |
2 number of bits in opcode. |
3 number of bits in opcode explicitly |
determined by the instruction type. |
4 opcodeseed, the number we build our opcode |
from. |
5 operandtypes, used by operandparser. |
6 size in bytes of immediate |
*/ |
struct ns32k_opcode { |
const char *name; |
unsigned char opcode_id_size; /* not used by the assembler */ |
unsigned char opcode_size; |
unsigned long opcode_seed; |
const char *operands; |
unsigned char im_size; /* not used by dissassembler */ |
const char *default_args; /* default to those args when none given */ |
char default_modec; /* default to this addr-mode when ambigous |
ie when the argument of a general addr-mode |
is a plain constant */ |
char default_model; /* is a plain label */ |
}; |
#ifdef comment |
/* This section was from the gdb version of this file. */ |
#ifndef ns32k_opcodeT |
#define ns32k_opcodeT int |
#endif /* no ns32k_opcodeT */ |
struct not_wot /* ns32k opcode table: wot to do with this */ |
/* particular opcode */ |
{ |
int obits; /* number of opcode bits */ |
int ibits; /* number of instruction bits */ |
ns32k_opcodeT code; /* op-code (may be > 8 bits!) */ |
const char *args; /* how to compile said opcode */ |
}; |
struct not /* ns32k opcode text */ |
{ |
const char *name; /* opcode name: lowercase string [key] */ |
struct not_wot detail; /* rest of opcode table [datum] */ |
}; |
/* Instructions look like this: |
basic instruction--1, 2, or 3 bytes |
index byte for operand A, if operand A is indexed--1 byte |
index byte for operand B, if operand B is indexed--1 byte |
addressing extension for operand A |
addressing extension for operand B |
implied operands |
Operand A is the operand listed first in the following opcode table. |
Operand B is the operand listed second in the following opcode table. |
All instructions have at most 2 general operands, so this is enough. |
The implied operands are associated with operands other than A and B. |
Each operand has a digit and a letter. |
The digit gives the position in the assembly language. The letter, |
one of the following, tells us what kind of operand it is. */ |
/* F : 32 bit float |
* L : 64 bit float |
* B : byte |
* W : word |
* D : double-word |
* I : integer not immediate |
* Z : floating not immediate |
* d : displacement |
* q : quick |
* i : immediate (8 bits) |
* r : register number (3 bits) |
* p : displacement - pc relative addressing |
*/ |
#endif /* comment */ |
static const struct ns32k_opcode ns32k_opcodes[]= |
{ |
{ "absf", 14,24, 0x35be, "1F2Z", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "absl", 14,24, 0x34be, "1L2Z", 8, "", DEF_MODEC,DEF_MODEL }, |
{ "absb", 14,24, 0x304e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "absw", 14,24, 0x314e, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "absd", 14,24, 0x334e, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "acbb", 7,16, 0x4c, "2I1q3p", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "acbw", 7,16, 0x4d, "2I1q3p", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "acbd", 7,16, 0x4f, "2I1q3p", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "addf", 14,24, 0x01be, "1F2Z", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "addl", 14,24, 0x00be, "1L2Z", 8, "", DEF_MODEC,DEF_MODEL }, |
{ "addb", 6,16, 0x00, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "addw", 6,16, 0x01, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "addd", 6,16, 0x03, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "addcb", 6,16, 0x10, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "addcw", 6,16, 0x11, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "addcd", 6,16, 0x13, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "addpb", 14,24, 0x3c4e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "addpw", 14,24, 0x3d4e, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "addpd", 14,24, 0x3f4e, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "addqb", 7,16, 0x0c, "2I1q", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "addqw", 7,16, 0x0d, "2I1q", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "addqd", 7,16, 0x0f, "2I1q", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "addr", 6,16, 0x27, "1A2I", 4, "", 21,21 }, |
{ "adjspb", 11,16, 0x057c, "1B", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "adjspw", 11,16, 0x057d, "1W", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "adjspd", 11,16, 0x057f, "1D", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "andb", 6,16, 0x28, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "andw", 6,16, 0x29, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "andd", 6,16, 0x2b, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "ashb", 14,24, 0x044e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "ashw", 14,24, 0x054e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "ashd", 14,24, 0x074e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "beq", 8,8, 0x0a, "1p", 0, "", 21,21 }, |
{ "bne", 8,8, 0x1a, "1p", 0, "", 21,21 }, |
{ "bcs", 8,8, 0x2a, "1p", 0, "", 21,21 }, |
{ "bcc", 8,8, 0x3a, "1p", 0, "", 21,21 }, |
{ "bhi", 8,8, 0x4a, "1p", 0, "", 21,21 }, |
{ "bls", 8,8, 0x5a, "1p", 0, "", 21,21 }, |
{ "bgt", 8,8, 0x6a, "1p", 0, "", 21,21 }, |
{ "ble", 8,8, 0x7a, "1p", 0, "", 21,21 }, |
{ "bfs", 8,8, 0x8a, "1p", 0, "", 21,21 }, |
{ "bfc", 8,8, 0x9a, "1p", 0, "", 21,21 }, |
{ "blo", 8,8, 0xaa, "1p", 0, "", 21,21 }, |
{ "bhs", 8,8, 0xba, "1p", 0, "", 21,21 }, |
{ "blt", 8,8, 0xca, "1p", 0, "", 21,21 }, |
{ "bge", 8,8, 0xda, "1p", 0, "", 21,21 }, |
{ "but", 8,8, 0xea, "1p", 0, "", 21,21 }, |
{ "buf", 8,8, 0xfa, "1p", 0, "", 21,21 }, |
{ "bicb", 6,16, 0x08, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "bicw", 6,16, 0x09, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "bicd", 6,16, 0x0b, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "bicpsrb", 11,16, 0x17c, "1B", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "bicpsrw", 11,16, 0x17d, "1W", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "bispsrb", 11,16, 0x37c, "1B", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "bispsrw", 11,16, 0x37d, "1W", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "bpt", 8,8, 0xf2, "", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "br", 8,8, 0xea, "1p", 0, "", 21,21 }, |
#ifdef SEQUENT_COMPATABILITY |
{ "bsr", 8,8, 0x02, "1H", 0, "", 21,21 }, |
#else |
{ "bsr", 8,8, 0x02, "1p", 0, "", 21,21 }, |
#endif |
{ "caseb", 11,16, 0x77c, "1B", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "casew", 11,16, 0x77d, "1W", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "cased", 11,16, 0x77f, "1D", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "cbitb", 14,24, 0x084e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "cbitw", 14,24, 0x094e, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "cbitd", 14,24, 0x0b4e, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "cbitib", 14,24, 0x0c4e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "cbitiw", 14,24, 0x0d4e, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "cbitid", 14,24, 0x0f4e, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "checkb", 11,24, 0x0ee, "2A3B1r", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "checkw", 11,24, 0x1ee, "2A3W1r", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "checkd", 11,24, 0x3ee, "2A3D1r", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "cinv", 14,24, 0x271e, "2D1C", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "cmpf", 14,24, 0x09be, "1F2F", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "cmpl", 14,24, 0x08be, "1L2L", 8, "", DEF_MODEC,DEF_MODEL }, |
{ "cmpb", 6,16, 0x04, "1B2B", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "cmpw", 6,16, 0x05, "1W2W", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "cmpd", 6,16, 0x07, "1D2D", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "cmpmb", 14,24, 0x04ce, "1A2A3b", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "cmpmw", 14,24, 0x05ce, "1A2A3b", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "cmpmd", 14,24, 0x07ce, "1A2A3b", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "cmpqb", 7,16, 0x1c, "2B1q", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "cmpqw", 7,16, 0x1d, "2W1q", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "cmpqd", 7,16, 0x1f, "2D1q", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "cmpsb", 16,24, 0x040e, "1S", 0, "[]", DEF_MODEC,DEF_MODEL }, |
{ "cmpsw", 16,24, 0x050e, "1S", 0, "[]", DEF_MODEC,DEF_MODEL }, |
{ "cmpsd", 16,24, 0x070e, "1S", 0, "[]", DEF_MODEC,DEF_MODEL }, |
{ "cmpst", 16,24, 0x840e, "1S", 0, "[]", DEF_MODEC,DEF_MODEL }, |
{ "comb", 14,24, 0x344e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "comw", 14,24, 0x354e, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "comd", 14,24, 0x374e, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "cvtp", 11,24, 0x036e, "2A3D1r", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "cxp", 8,8, 0x22, "1p", 0, "", 21,21 }, |
{ "cxpd", 11,16, 0x07f, "1A", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "deib", 14,24, 0x2cce, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "deiw", 14,24, 0x2dce, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "deid", 14,24, 0x2fce, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "dia", 8,8, 0xc2, "", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "divf", 14,24, 0x21be, "1F2Z", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "divl", 14,24, 0x20be, "1L2Z", 8, "", DEF_MODEC,DEF_MODEL }, |
{ "divb", 14,24, 0x3cce, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "divw", 14,24, 0x3dce, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "divd", 14,24, 0x3fce, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "enter", 8,8, 0x82, "1U2d", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "exit", 8,8, 0x92, "1u", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "extb", 11,24, 0x02e, "2I3B1r4d", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "extw", 11,24, 0x12e, "2I3W1r4d", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "extd", 11,24, 0x32e, "2I3D1r4d", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "extsb", 14,24, 0x0cce, "1I2I4G3g", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "extsw", 14,24, 0x0dce, "1I2I4G3g", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "extsd", 14,24, 0x0fce, "1I2I4G3g", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "ffsb", 14,24, 0x046e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "ffsw", 14,24, 0x056e, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "ffsd", 14,24, 0x076e, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "flag", 8,8, 0xd2, "", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "floorfb", 14,24, 0x3c3e, "1F2I", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "floorfw", 14,24, 0x3d3e, "1F2I", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "floorfd", 14,24, 0x3f3e, "1F2I", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "floorlb", 14,24, 0x383e, "1L2I", 8, "", DEF_MODEC,DEF_MODEL }, |
{ "floorlw", 14,24, 0x393e, "1L2I", 8, "", DEF_MODEC,DEF_MODEL }, |
{ "floorld", 14,24, 0x3b3e, "1L2I", 8, "", DEF_MODEC,DEF_MODEL }, |
{ "ibitb", 14,24, 0x384e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "ibitw", 14,24, 0x394e, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "ibitd", 14,24, 0x3b4e, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "indexb", 11,24, 0x42e, "2B3B1r", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "indexw", 11,24, 0x52e, "2W3W1r", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "indexd", 11,24, 0x72e, "2D3D1r", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "insb", 11,24, 0x0ae, "2B3I1r4d", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "insw", 11,24, 0x1ae, "2W3I1r4d", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "insd", 11,24, 0x3ae, "2D3I1r4d", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "inssb", 14,24, 0x08ce, "1B2I4G3g", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "inssw", 14,24, 0x09ce, "1W2I4G3g", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "inssd", 14,24, 0x0bce, "1D2I4G3g", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "jsr", 11,16, 0x67f, "1A", 4, "", 21,21 }, |
{ "jump", 11,16, 0x27f, "1A", 4, "", 21,21 }, |
{ "lfsr", 19,24, 0x00f3e,"1D", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "lmr", 15,24, 0x0b1e, "2D1M", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "lprb", 7,16, 0x6c, "2B1P", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "lprw", 7,16, 0x6d, "2W1P", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "lprd", 7,16, 0x6f, "2D1P", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "lshb", 14,24, 0x144e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "lshw", 14,24, 0x154e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "lshd", 14,24, 0x174e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "meib", 14,24, 0x24ce, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "meiw", 14,24, 0x25ce, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "meid", 14,24, 0x27ce, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "modb", 14,24, 0x38ce, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "modw", 14,24, 0x39ce, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "modd", 14,24, 0x3bce, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "movf", 14,24, 0x05be, "1F2Z", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "movl", 14,24, 0x04be, "1L2Z", 8, "", DEF_MODEC,DEF_MODEL }, |
{ "movb", 6,16, 0x14, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "movw", 6,16, 0x15, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "movd", 6,16, 0x17, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "movbf", 14,24, 0x043e, "1B2Z", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "movwf", 14,24, 0x053e, "1W2Z", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "movdf", 14,24, 0x073e, "1D2Z", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "movbl", 14,24, 0x003e, "1B2Z", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "movwl", 14,24, 0x013e, "1W2Z", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "movdl", 14,24, 0x033e, "1D2Z", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "movfl", 14,24, 0x1b3e, "1F2Z", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "movlf", 14,24, 0x163e, "1L2Z", 8, "", DEF_MODEC,DEF_MODEL }, |
{ "movmb", 14,24, 0x00ce, "1A2A3b", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "movmw", 14,24, 0x01ce, "1A2A3b", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "movmd", 14,24, 0x03ce, "1A2A3b", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "movqb", 7,16, 0x5c, "2I1q", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "movqw", 7,16, 0x5d, "2I1q", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "movqd", 7,16, 0x5f, "2I1q", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "movsb", 16,24, 0x000e, "1S", 0, "[]", DEF_MODEC,DEF_MODEL }, |
{ "movsw", 16,24, 0x010e, "1S", 0, "[]", DEF_MODEC,DEF_MODEL }, |
{ "movsd", 16,24, 0x030e, "1S", 0, "[]", DEF_MODEC,DEF_MODEL }, |
{ "movst", 16,24, 0x800e, "1S", 0, "[]", DEF_MODEC,DEF_MODEL }, |
{ "movsub", 14,24, 0x0cae, "1A2A", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "movsuw", 14,24, 0x0dae, "1A2A", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "movsud", 14,24, 0x0fae, "1A2A", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "movusb", 14,24, 0x1cae, "1A2A", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "movusw", 14,24, 0x1dae, "1A2A", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "movusd", 14,24, 0x1fae, "1A2A", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "movxbd", 14,24, 0x1cce, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "movxwd", 14,24, 0x1dce, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "movxbw", 14,24, 0x10ce, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "movzbd", 14,24, 0x18ce, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "movzwd", 14,24, 0x19ce, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "movzbw", 14,24, 0x14ce, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "mulf", 14,24, 0x31be, "1F2Z", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "mull", 14,24, 0x30be, "1L2Z", 8, "", DEF_MODEC,DEF_MODEL }, |
{ "mulb", 14,24, 0x20ce, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "mulw", 14,24, 0x21ce, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "muld", 14,24, 0x23ce, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "negf", 14,24, 0x15be, "1F2Z", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "negl", 14,24, 0x14be, "1L2Z", 8, "", DEF_MODEC,DEF_MODEL }, |
{ "negb", 14,24, 0x204e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "negw", 14,24, 0x214e, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "negd", 14,24, 0x234e, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "nop", 8,8, 0xa2, "", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "notb", 14,24, 0x244e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "notw", 14,24, 0x254e, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "notd", 14,24, 0x274e, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "orb", 6,16, 0x18, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "orw", 6,16, 0x19, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "ord", 6,16, 0x1b, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "quob", 14,24, 0x30ce, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "quow", 14,24, 0x31ce, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "quod", 14,24, 0x33ce, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "rdval", 19,24, 0x0031e,"1A", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "remb", 14,24, 0x34ce, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "remw", 14,24, 0x35ce, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "remd", 14,24, 0x37ce, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "restore", 8,8, 0x72, "1u", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "ret", 8,8, 0x12, "1d", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "reti", 8,8, 0x52, "", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "rett", 8,8, 0x42, "1d", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "rotb", 14,24, 0x004e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "rotw", 14,24, 0x014e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "rotd", 14,24, 0x034e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "roundfb", 14,24, 0x243e, "1F2I", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "roundfw", 14,24, 0x253e, "1F2I", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "roundfd", 14,24, 0x273e, "1F2I", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "roundlb", 14,24, 0x203e, "1L2I", 8, "", DEF_MODEC,DEF_MODEL }, |
{ "roundlw", 14,24, 0x213e, "1L2I", 8, "", DEF_MODEC,DEF_MODEL }, |
{ "roundld", 14,24, 0x233e, "1L2I", 8, "", DEF_MODEC,DEF_MODEL }, |
{ "rxp", 8,8, 0x32, "1d", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "seqb", 11,16, 0x3c, "1B", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "seqw", 11,16, 0x3d, "1W", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "seqd", 11,16, 0x3f, "1D", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "sneb", 11,16, 0xbc, "1B", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "snew", 11,16, 0xbd, "1W", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "sned", 11,16, 0xbf, "1D", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "scsb", 11,16, 0x13c, "1B", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "scsw", 11,16, 0x13d, "1W", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "scsd", 11,16, 0x13f, "1D", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "sccb", 11,16, 0x1bc, "1B", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "sccw", 11,16, 0x1bd, "1W", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "sccd", 11,16, 0x1bf, "1D", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "shib", 11,16, 0x23c, "1B", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "shiw", 11,16, 0x23d, "1W", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "shid", 11,16, 0x23f, "1D", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "slsb", 11,16, 0x2bc, "1B", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "slsw", 11,16, 0x2bd, "1W", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "slsd", 11,16, 0x2bf, "1D", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "sgtb", 11,16, 0x33c, "1B", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "sgtw", 11,16, 0x33d, "1W", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "sgtd", 11,16, 0x33f, "1D", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "sleb", 11,16, 0x3bc, "1B", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "slew", 11,16, 0x3bd, "1W", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "sled", 11,16, 0x3bf, "1D", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "sfsb", 11,16, 0x43c, "1B", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "sfsw", 11,16, 0x43d, "1W", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "sfsd", 11,16, 0x43f, "1D", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "sfcb", 11,16, 0x4bc, "1B", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "sfcw", 11,16, 0x4bd, "1W", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "sfcd", 11,16, 0x4bf, "1D", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "slob", 11,16, 0x53c, "1B", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "slow", 11,16, 0x53d, "1W", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "slod", 11,16, 0x53f, "1D", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "shsb", 11,16, 0x5bc, "1B", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "shsw", 11,16, 0x5bd, "1W", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "shsd", 11,16, 0x5bf, "1D", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "sltb", 11,16, 0x63c, "1B", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "sltw", 11,16, 0x63d, "1W", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "sltd", 11,16, 0x63f, "1D", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "sgeb", 11,16, 0x6bc, "1B", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "sgew", 11,16, 0x6bd, "1W", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "sged", 11,16, 0x6bf, "1D", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "sutb", 11,16, 0x73c, "1B", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "sutw", 11,16, 0x73d, "1W", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "sutd", 11,16, 0x73f, "1D", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "sufb", 11,16, 0x7bc, "1B", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "sufw", 11,16, 0x7bd, "1W", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "sufd", 11,16, 0x7bf, "1D", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "save", 8,8, 0x62, "1U", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "sbitb", 14,24, 0x184e, "1B2A", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "sbitw", 14,24, 0x194e, "1W2A", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "sbitd", 14,24, 0x1b4e, "1D2A", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "sbitib", 14,24, 0x1c4e, "1B2A", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "sbitiw", 14,24, 0x1d4e, "1W2A", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "sbitid", 14,24, 0x1f4e, "1D2A", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "setcfg", 15,24, 0x0b0e, "1O", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "sfsr", 14,24, 0x373e, "1f", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "skpsb", 16,24, 0x0c0e, "1S", 0, "[]", DEF_MODEC,DEF_MODEL }, |
{ "skpsw", 16,24, 0x0d0e, "1S", 0, "[]", DEF_MODEC,DEF_MODEL }, |
{ "skpsd", 16,24, 0x0f0e, "1S", 0, "[]", DEF_MODEC,DEF_MODEL }, |
{ "skpst", 16,24, 0x8c0e, "1S", 0, "[]", DEF_MODEC,DEF_MODEL }, |
{ "smr", 15,24, 0x0f1e, "2I1M", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "sprb", 7,16, 0x2c, "2I1P", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "sprw", 7,16, 0x2d, "2I1P", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "sprd", 7,16, 0x2f, "2I1P", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "subf", 14,24, 0x11be, "1F2Z", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "subl", 14,24, 0x10be, "1L2Z", 8, "", DEF_MODEC,DEF_MODEL }, |
{ "subb", 6,16, 0x20, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "subw", 6,16, 0x21, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "subd", 6,16, 0x23, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "subcb", 6,16, 0x30, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "subcw", 6,16, 0x31, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "subcd", 6,16, 0x33, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "subpb", 14,24, 0x2c4e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "subpw", 14,24, 0x2d4e, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "subpd", 14,24, 0x2f4e, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, |
#ifdef NS32K_SVC_IMMED_OPERANDS |
{ "svc", 8,8, 0xe2, "2i1i", 1, "", DEF_MODEC,DEF_MODEL }, /* not really, but some unix uses it */ |
#else |
{ "svc", 8,8, 0xe2, "", 0, "", DEF_MODEC,DEF_MODEL }, |
#endif |
{ "tbitb", 6,16, 0x34, "1B2A", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "tbitw", 6,16, 0x35, "1W2A", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "tbitd", 6,16, 0x37, "1D2A", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "truncfb", 14,24, 0x2c3e, "1F2I", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "truncfw", 14,24, 0x2d3e, "1F2I", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "truncfd", 14,24, 0x2f3e, "1F2I", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "trunclb", 14,24, 0x283e, "1L2I", 8, "", DEF_MODEC,DEF_MODEL }, |
{ "trunclw", 14,24, 0x293e, "1L2I", 8, "", DEF_MODEC,DEF_MODEL }, |
{ "truncld", 14,24, 0x2b3e, "1L2I", 8, "", DEF_MODEC,DEF_MODEL }, |
{ "wait", 8,8, 0xb2, "", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "wrval", 19,24, 0x0071e,"1A", 0, "", DEF_MODEC,DEF_MODEL }, |
{ "xorb", 6,16, 0x38, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, |
{ "xorw", 6,16, 0x39, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, |
{ "xord", 6,16, 0x3b, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "dotf", 14,24, 0x0dfe, "1F2F", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "dotl", 14,24, 0x0cfe, "1L2L", 8, "", DEF_MODEC,DEF_MODEL }, |
{ "logbf", 14,24, 0x15fe, "1F2Z", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "logbl", 14,24, 0x14fe, "1L2Z", 8, "", DEF_MODEC,DEF_MODEL }, |
{ "polyf", 14,24, 0x09fe, "1F2F", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "polyl", 14,24, 0x08fe, "1L2L", 8, "", DEF_MODEC,DEF_MODEL }, |
{ "scalbf", 14,24, 0x11fe, "1F2Z", 4, "", DEF_MODEC,DEF_MODEL }, |
{ "scalbl", 14,24, 0x10fe, "1L2Z", 8, "", DEF_MODEC,DEF_MODEL }, |
}; |
#define MAX_ARGS 4 |
#define ARG_LEN 50 |
/contrib/toolchain/binutils/include/opcode/or32.h |
---|
0,0 → 1,181 |
/* Table of opcodes for the OpenRISC 1000 ISA. |
Copyright 2002, 2003, 2010 Free Software Foundation, Inc. |
Contributed by Damjan Lampret (lampret@opencores.org). |
This file is part of or1k_gen_isa, or1ksim, GDB and GAS. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* We treat all letters the same in encode/decode routines so |
we need to assign some characteristics to them like signess etc. */ |
#ifndef OR32_H_ISA |
#define OR32_H_ISA |
#define NUM_UNSIGNED (0) |
#define NUM_SIGNED (1) |
#define MAX_GPRS 32 |
#define PAGE_SIZE 4096 |
#undef __HALF_WORD_INSN__ |
#define OPERAND_DELIM (',') |
#define OR32_IF_DELAY (1) |
#define OR32_W_FLAG (2) |
#define OR32_R_FLAG (4) |
struct or32_letter |
{ |
char letter; |
int sign; |
/* int reloc; relocation per letter ?? */ |
}; |
/* Main instruction specification array. */ |
struct or32_opcode |
{ |
/* Name of the instruction. */ |
char *name; |
/* A string of characters which describe the operands. |
Valid characters are: |
,() Itself. Characters appears in the assembly code. |
rA Register operand. |
rB Register operand. |
rD Register operand. |
I An immediate operand, range -32768 to 32767. |
J An immediate operand, range . (unused) |
K An immediate operand, range 0 to 65535. |
L An immediate operand, range 0 to 63. |
M An immediate operand, range . (unused) |
N An immediate operand, range -33554432 to 33554431. |
O An immediate operand, range . (unused). */ |
char *args; |
/* Opcode and operand encoding. */ |
char *encoding; |
void (*exec) (void); |
unsigned int flags; |
}; |
#define OPTYPE_LAST (0x80000000) |
#define OPTYPE_OP (0x40000000) |
#define OPTYPE_REG (0x20000000) |
#define OPTYPE_SIG (0x10000000) |
#define OPTYPE_DIS (0x08000000) |
#define OPTYPE_DST (0x04000000) |
#define OPTYPE_SBIT (0x00001F00) |
#define OPTYPE_SHR (0x0000001F) |
#define OPTYPE_SBIT_SHR (8) |
/* MM: Data how to decode operands. */ |
extern struct insn_op_struct |
{ |
unsigned long type; |
unsigned long data; |
} **op_start; |
#ifdef HAS_EXECUTION |
extern void l_invalid (void); |
extern void l_sfne (void); |
extern void l_bf (void); |
extern void l_add (void); |
extern void l_sw (void); |
extern void l_sb (void); |
extern void l_sh (void); |
extern void l_lwz (void); |
extern void l_lbs (void); |
extern void l_lbz (void); |
extern void l_lhs (void); |
extern void l_lhz (void); |
extern void l_movhi (void); |
extern void l_and (void); |
extern void l_or (void); |
extern void l_xor (void); |
extern void l_sub (void); |
extern void l_mul (void); |
extern void l_div (void); |
extern void l_divu (void); |
extern void l_sll (void); |
extern void l_sra (void); |
extern void l_srl (void); |
extern void l_j (void); |
extern void l_jal (void); |
extern void l_jalr (void); |
extern void l_jr (void); |
extern void l_rfe (void); |
extern void l_nop (void); |
extern void l_bnf (void); |
extern void l_sfeq (void); |
extern void l_sfgts (void); |
extern void l_sfges (void); |
extern void l_sflts (void); |
extern void l_sfles (void); |
extern void l_sfgtu (void); |
extern void l_sfgeu (void); |
extern void l_sfltu (void); |
extern void l_sfleu (void); |
extern void l_mtspr (void); |
extern void l_mfspr (void); |
extern void l_sys (void); |
extern void l_trap (void); /* CZ 21/06/01. */ |
extern void l_macrc (void); |
extern void l_mac (void); |
extern void l_msb (void); |
extern void l_invalid (void); |
extern void l_cust1 (void); |
extern void l_cust2 (void); |
extern void l_cust3 (void); |
extern void l_cust4 (void); |
#endif |
extern void l_none (void); |
extern const struct or32_letter or32_letters[]; |
extern const struct or32_opcode or32_opcodes[]; |
extern const unsigned int or32_num_opcodes; |
/* Calculates instruction length in bytes. Always 4 for OR32. */ |
extern int insn_len (int); |
/* Is individual insn's operand signed or unsigned? */ |
extern int letter_signed (char); |
/* Number of letters in the individual lettered operand. */ |
extern int letter_range (char); |
/* MM: Returns index of given instruction name. */ |
extern int insn_index (char *); |
/* MM: Returns instruction name from index. */ |
extern const char *insn_name (int); |
/* MM: Constructs new FSM, based on or32_opcodes. */ |
extern void build_automata (void); |
/* MM: Destructs FSM. */ |
extern void destruct_automata (void); |
/* MM: Decodes instruction using FSM. Call build_automata first. */ |
extern int insn_decode (unsigned int); |
/* Disassemble one instruction from insn to disassemble. |
Return the size of the instruction. */ |
int disassemble_insn (unsigned long); |
#endif |
/contrib/toolchain/binutils/include/opcode/pdp11.h |
---|
0,0 → 1,84 |
/* PDP-11 opcde list. |
Copyright 2001, 2002, 2010 Free Software Foundation, Inc. |
This file is part of GDB and GAS. |
GDB and GAS are free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3, or (at your option) |
any later version. |
GDB and GAS are distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with GDB or GAS; see the file COPYING3. If not, write to |
the Free Software Foundation, 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
/* PDP-11 opcode types. */ |
#define PDP11_OPCODE_NO_OPS 0 |
#define PDP11_OPCODE_REG 1 /* register */ |
#define PDP11_OPCODE_OP 2 /* generic operand */ |
#define PDP11_OPCODE_REG_OP 3 /* register and generic operand */ |
#define PDP11_OPCODE_REG_OP_REV 4 /* register and generic operand, |
reversed syntax */ |
#define PDP11_OPCODE_AC_FOP 5 /* fpu accumulator and generic float |
operand */ |
#define PDP11_OPCODE_OP_OP 6 /* two generic operands */ |
#define PDP11_OPCODE_DISPL 7 /* pc-relative displacement */ |
#define PDP11_OPCODE_REG_DISPL 8 /* redister and pc-relative |
displacement */ |
#define PDP11_OPCODE_IMM8 9 /* 8-bit immediate */ |
#define PDP11_OPCODE_IMM6 10 /* 6-bit immediate */ |
#define PDP11_OPCODE_IMM3 11 /* 3-bit immediate */ |
#define PDP11_OPCODE_ILLEGAL 12 /* illegal instruction */ |
#define PDP11_OPCODE_FOP_AC 13 /* generic float argument, then fpu |
accumulator */ |
#define PDP11_OPCODE_FOP 14 /* generic float operand */ |
#define PDP11_OPCODE_AC_OP 15 /* fpu accumulator and generic int |
operand */ |
#define PDP11_OPCODE_OP_AC 16 /* generic int argument, then fpu |
accumulator */ |
/* |
* PDP-11 instruction set extensions. |
* |
* Please keep the numbers low, as they are used as indices into |
* an array. |
*/ |
#define PDP11_NONE 0 /* not in instruction set */ |
#define PDP11_BASIC 1 /* basic instruction set (11/20 etc) */ |
#define PDP11_CSM 2 /* commercial instruction set */ |
#define PDP11_CIS 3 /* commercial instruction set */ |
#define PDP11_EIS 4 /* extended instruction set (11/45 etc) */ |
#define PDP11_FIS 5 /* KEV11 floating-point instructions */ |
#define PDP11_FPP 6 /* FP-11 floating-point instructions */ |
#define PDP11_LEIS 7 /* limited extended instruction set |
(11/40 etc) */ |
#define PDP11_MFPT 8 /* move from processor type */ |
#define PDP11_MPROC 9 /* multiprocessor instructions: tstset, |
wrtlck */ |
#define PDP11_MXPS 10 /* move from/to processor status */ |
#define PDP11_SPL 11 /* set priority level */ |
#define PDP11_UCODE 12 /* microcode instructions: ldub, med, xfc */ |
#define PDP11_EXT_NUM 13 /* total number of extension types */ |
struct pdp11_opcode |
{ |
const char *name; |
int opcode; |
int mask; |
int type; |
int extension; |
}; |
extern const struct pdp11_opcode pdp11_opcodes[]; |
extern const struct pdp11_opcode pdp11_aliases[]; |
extern const int pdp11_num_opcodes, pdp11_num_aliases; |
/* end of pdp11.h */ |
/contrib/toolchain/binutils/include/opcode/pj.h |
---|
0,0 → 1,49 |
/* Definitions for decoding the picoJava opcode table. |
Copyright 1999, 2002, 2003, 2010 Free Software Foundation, Inc. |
Contributed by Steve Chamberlain of Transmeta (sac@pobox.com). |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* Names used to describe the type of instruction arguments, used by |
the assembler and disassembler. Attributes are encoded in various fields. */ |
/* reloc size pcrel uns */ |
#define O_N 0 |
#define O_16 (1<<4 | 2 | (0<<6) | (0<<3)) |
#define O_U16 (1<<4 | 2 | (0<<6) | (1<<3)) |
#define O_R16 (2<<4 | 2 | (1<<6) | (0<<3)) |
#define O_8 (3<<4 | 1 | (0<<6) | (0<<3)) |
#define O_U8 (3<<4 | 1 | (0<<6) | (1<<3)) |
#define O_R8 (4<<4 | 1 | (0<<6) | (0<<3)) |
#define O_R32 (5<<4 | 4 | (1<<6) | (0<<3)) |
#define O_32 (6<<4 | 4 | (0<<6) | (0<<3)) |
#define ASIZE(x) ((x) & 0x7) |
#define PCREL(x) (!!((x) & (1<<6))) |
#define UNS(x) (!!((x) & (1<<3))) |
typedef struct pj_opc_info_t |
{ |
short opcode; |
short opcode_next; |
char len; |
unsigned char arg[2]; |
union { |
const char *name; |
void (*func) (struct pj_opc_info_t *, char *); |
} u; |
} pj_opc_info_t; |
/contrib/toolchain/binutils/include/opcode/pn.h |
---|
0,0 → 1,283 |
/* Print GOULD PN (PowerNode) instructions for GDB, the GNU debugger. |
Copyright 1986, 1987, 1989, 1991, 2010 Free Software Foundation, Inc. |
This file is part of GDB. |
GDB is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3, or (at your option) |
any later version. |
GDB is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with GDB; see the file COPYING3. If not, write to |
the Free Software Foundation, 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
struct gld_opcode |
{ |
char *name; |
unsigned long opcode; |
unsigned long mask; |
char *args; |
int length; |
}; |
/* We store four bytes of opcode for all opcodes because that |
is the most any of them need. The actual length of an instruction |
is always at least 2 bytes, and at most four. The length of the |
instruction is based on the opcode. |
The mask component is a mask saying which bits must match |
particular opcode in order for an instruction to be an instance |
of that opcode. |
The args component is a string containing characters |
that are used to format the arguments to the instruction. */ |
/* Kinds of operands: |
r Register in first field |
R Register in second field |
b Base register in first field |
B Base register in second field |
v Vector register in first field |
V Vector register in first field |
A Optional address register (base register) |
X Optional index register |
I Immediate data (16bits signed) |
O Offset field (16bits signed) |
h Offset field (15bits signed) |
d Offset field (14bits signed) |
S Shift count field |
any other characters are printed as is... |
*/ |
/* The assembler requires that this array be sorted as follows: |
all instances of the same mnemonic must be consecutive. |
All instances of the same mnemonic with the same number of operands |
must be consecutive. |
*/ |
struct gld_opcode gld_opcodes[] = |
{ |
{ "abm", 0xa0080000, 0xfc080000, "f,xOA,X", 4 }, |
{ "abr", 0x18080000, 0xfc0c0000, "r,f", 2 }, |
{ "aci", 0xfc770000, 0xfc7f8000, "r,I", 4 }, |
{ "adfd", 0xe0080002, 0xfc080002, "r,xOA,X", 4 }, |
{ "adfw", 0xe0080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "adi", 0xc8010000, 0xfc7f0000, "r,I", 4 }, |
{ "admb", 0xb8080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "admd", 0xb8000002, 0xfc080002, "r,xOA,X", 4 }, |
{ "admh", 0xb8000001, 0xfc080001, "r,xOA,X", 4 }, |
{ "admw", 0xb8000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "adr", 0x38000000, 0xfc0f0000, "r,R", 2 }, |
{ "adrfd", 0x38090000, 0xfc0f0000, "r,R", 2 }, |
{ "adrfw", 0x38010000, 0xfc0f0000, "r,R", 2 }, |
{ "adrm", 0x38080000, 0xfc0f0000, "r,R", 2 }, |
{ "ai", 0xfc030000, 0xfc07ffff, "I", 4 }, |
{ "anmb", 0x84080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "anmd", 0x84000002, 0xfc080002, "r,xOA,X", 4 }, |
{ "anmh", 0x84000001, 0xfc080001, "r,xOA,X", 4 }, |
{ "anmw", 0x84000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "anr", 0x04000000, 0xfc0f0000, "r,R", 2 }, |
{ "armb", 0xe8080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "armd", 0xe8000002, 0xfc080002, "r,xOA,X", 4 }, |
{ "armh", 0xe8000001, 0xfc080001, "r,xOA,X", 4 }, |
{ "armw", 0xe8000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "bcf", 0xf0000000, 0xfc080000, "I,xOA,X", 4 }, |
{ "bct", 0xec000000, 0xfc080000, "I,xOA,X", 4 }, |
{ "bei", 0x00060000, 0xffff0000, "", 2 }, |
{ "bft", 0xf0000000, 0xff880000, "xOA,X", 4 }, |
{ "bib", 0xf4000000, 0xfc780000, "r,xOA", 4 }, |
{ "bid", 0xf4600000, 0xfc780000, "r,xOA", 4 }, |
{ "bih", 0xf4200000, 0xfc780000, "r,xOA", 4 }, |
{ "biw", 0xf4400000, 0xfc780000, "r,xOA", 4 }, |
{ "bl", 0xf8800000, 0xff880000, "xOA,X", 4 }, |
{ "bsub", 0x5c080000, 0xff8f0000, "", 2 }, |
{ "bsubm", 0x28080000, 0xfc080000, "", 4 }, |
{ "bu", 0xec000000, 0xff880000, "xOA,X", 4 }, |
{ "call", 0x28080000, 0xfc0f0000, "", 2 }, |
{ "callm", 0x5c080000, 0xff880000, "", 4 }, |
{ "camb", 0x90080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "camd", 0x90000002, 0xfc080002, "r,xOA,X", 4 }, |
{ "camh", 0x90000001, 0xfc080001, "r,xOA,X", 4 }, |
{ "camw", 0x90000000, 0xfc080000, "r.xOA,X", 4 }, |
{ "car", 0x10000000, 0xfc0f0000, "r,R", 2 }, |
{ "cd", 0xfc060000, 0xfc070000, "r,f", 4 }, |
{ "cea", 0x000f0000, 0xffff0000, "", 2 }, |
{ "ci", 0xc8050000, 0xfc7f0000, "r,I", 4 }, |
{ "cmc", 0x040a0000, 0xfc7f0000, "r", 2 }, |
{ "cmmb", 0x94080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "cmmd", 0x94000002, 0xfc080002, "r,xOA,X", 4 }, |
{ "cmmh", 0x94000001, 0xfc080001, "r,xOA,X", 4 }, |
{ "cmmw", 0x94000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "cmr", 0x14000000, 0xfc0f0000, "r,R", 2 }, |
{ "daci", 0xfc7f0000, 0xfc7f8000, "r,I", 4 }, |
{ "dae", 0x000e0000, 0xffff0000, "", 2 }, |
{ "dai", 0xfc040000, 0xfc07ffff, "I", 4 }, |
{ "dci", 0xfc6f0000, 0xfc7f8000, "r,I", 4 }, |
{ "di", 0xfc010000, 0xfc07ffff, "I", 4 }, |
{ "dvfd", 0xe4000002, 0xfc080002, "r,xOA,X", 4 }, |
{ "dvfw", 0xe4000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "dvi", 0xc8040000, 0xfc7f0000, "r,I", 4 }, |
{ "dvmb", 0xc4080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "dvmh", 0xc4000001, 0xfc080001, "r,xOA,X", 4 }, |
{ "dvmw", 0xc4000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "dvr", 0x380a0000, 0xfc0f0000, "r,R", 2 }, |
{ "dvrfd", 0x380c0000, 0xfc0f0000, "r,R", 4 }, |
{ "dvrfw", 0x38040000, 0xfc0f0000, "r,xOA,X", 4 }, |
{ "eae", 0x00080000, 0xffff0000, "", 2 }, |
{ "eci", 0xfc670000, 0xfc7f8080, "r,I", 4 }, |
{ "ecwcs", 0xfc4f0000, 0xfc7f8000, "", 4 }, |
{ "ei", 0xfc000000, 0xfc07ffff, "I", 4 }, |
{ "eomb", 0x8c080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "eomd", 0x8c000002, 0xfc080002, "r,xOA,X", 4 }, |
{ "eomh", 0x8c000001, 0xfc080001, "r,xOA,X", 4 }, |
{ "eomw", 0x8c000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "eor", 0x0c000000, 0xfc0f0000, "r,R", 2 }, |
{ "eorm", 0x0c080000, 0xfc0f0000, "r,R", 2 }, |
{ "es", 0x00040000, 0xfc7f0000, "r", 2 }, |
{ "exm", 0xa8000000, 0xff880000, "xOA,X", 4 }, |
{ "exr", 0xc8070000, 0xfc7f0000, "r", 2 }, |
{ "exrr", 0xc8070002, 0xfc7f0002, "r", 2 }, |
{ "fixd", 0x380d0000, 0xfc0f0000, "r,R", 2 }, |
{ "fixw", 0x38050000, 0xfc0f0000, "r,R", 2 }, |
{ "fltd", 0x380f0000, 0xfc0f0000, "r,R", 2 }, |
{ "fltw", 0x38070000, 0xfc0f0000, "r,R", 2 }, |
{ "grio", 0xfc3f0000, 0xfc7f8000, "r,I", 4 }, |
{ "halt", 0x00000000, 0xffff0000, "", 2 }, |
{ "hio", 0xfc370000, 0xfc7f8000, "r,I", 4 }, |
{ "jwcs", 0xfa080000, 0xff880000, "xOA,X", 4 }, |
{ "la", 0x50000000, 0xfc000000, "r,xOA,X", 4 }, |
{ "labr", 0x58080000, 0xfc080000, "b,xOA,X", 4 }, |
{ "lb", 0xac080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "lcs", 0x00030000, 0xfc7f0000, "r", 2 }, |
{ "ld", 0xac000002, 0xfc080002, "r,xOA,X", 4 }, |
{ "lear", 0x80000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "lf", 0xcc000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "lfbr", 0xcc080000, 0xfc080000, "b,xOA,X", 4 }, |
{ "lh", 0xac000001, 0xfc080001, "r,xOA,X", 4 }, |
{ "li", 0xc8000000, 0xfc7f0000, "r,I", 4 }, |
{ "lmap", 0x2c070000, 0xfc7f0000, "r", 2 }, |
{ "lmb", 0xb0080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "lmd", 0xb0000002, 0xfc080002, "r,xOA,X", 4 }, |
{ "lmh", 0xb0000001, 0xfc080001, "r,xOA,X", 4 }, |
{ "lmw", 0xb0000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "lnb", 0xb4080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "lnd", 0xb4000002, 0xfc080002, "r,xOA,X", 4 }, |
{ "lnh", 0xb4000001, 0xfc080001, "r,xOA,X", 4 }, |
{ "lnw", 0xb4000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "lpsd", 0xf9800000, 0xff880000, "r,xOA,X", 4 }, |
{ "lpsdcm", 0xfa800000, 0xff880000, "r,xOA,X", 4 }, |
{ "lw", 0xac000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "lwbr", 0x5c000000, 0xfc080000, "b,xOA,X", 4 }, |
{ "mpfd", 0xe4080002, 0xfc080002, "r,xOA,X", 4 }, |
{ "mpfw", 0xe4080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "mpi", 0xc8030000, 0xfc7f0000, "r,I", 4 }, |
{ "mpmb", 0xc0080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "mpmh", 0xc0000001, 0xfc080001, "r,xOA,X", 4 }, |
{ "mpmw", 0xc0000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "mpr", 0x38020000, 0xfc0f0000, "r,R", 2 }, |
{ "mprfd", 0x380e0000, 0xfc0f0000, "r,R", 2 }, |
{ "mprfw", 0x38060000, 0xfc0f0000, "r,R", 2 }, |
{ "nop", 0x00020000, 0xffff0000, "", 2 }, |
{ "ormb", 0x88080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "ormd", 0x88000002, 0xfc080002, "r,xOA,X", 4 }, |
{ "ormh", 0x88000001, 0xfc080001, "r,xOA,X", 4 }, |
{ "ormw", 0x88000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "orr", 0x08000000, 0xfc0f0000, "r,R", 2 }, |
{ "orrm", 0x08080000, 0xfc0f0000, "r,R", 2 }, |
{ "rdsts", 0x00090000, 0xfc7f0000, "r", 2 }, |
{ "return", 0x280e0000, 0xfc7f0000, "", 2 }, |
{ "ri", 0xfc020000, 0xfc07ffff, "I", 4 }, |
{ "rnd", 0x00050000, 0xfc7f0000, "r", 2 }, |
{ "rpswt", 0x040b0000, 0xfc7f0000, "r", 2 }, |
{ "rschnl", 0xfc2f0000, 0xfc7f8000, "r,I", 4 }, |
{ "rsctl", 0xfc470000, 0xfc7f8000, "r,I", 4 }, |
{ "rwcs", 0x000b0000, 0xfc0f0000, "r,R", 2 }, |
{ "sacz", 0x10080000, 0xfc0f0000, "r,R", 2 }, |
{ "sbm", 0x98080000, 0xfc080000, "f,xOA,X", 4 }, |
{ "sbr", 0x18000000, 0xfc0c0000, "r,f", 4 }, |
{ "sea", 0x000d0000, 0xffff0000, "", 2 }, |
{ "setcpu", 0x2c090000, 0xfc7f0000, "r", 2 }, |
{ "sio", 0xfc170000, 0xfc7f8000, "r,I", 4 }, |
{ "sipu", 0x000a0000, 0xffff0000, "", 2 }, |
{ "sla", 0x1c400000, 0xfc600000, "r,S", 2 }, |
{ "slad", 0x20400000, 0xfc600000, "r,S", 2 }, |
{ "slc", 0x24400000, 0xfc600000, "r,S", 2 }, |
{ "sll", 0x1c600000, 0xfc600000, "r,S", 2 }, |
{ "slld", 0x20600000, 0xfc600000, "r,S", 2 }, |
{ "smc", 0x04070000, 0xfc070000, "", 2 }, |
{ "sra", 0x1c000000, 0xfc600000, "r,S", 2 }, |
{ "srad", 0x20000000, 0xfc600000, "r,S", 2 }, |
{ "src", 0x24000000, 0xfc600000, "r,S", 2 }, |
{ "srl", 0x1c200000, 0xfc600000, "r,S", 2 }, |
{ "srld", 0x20200000, 0xfc600000, "r,S", 2 }, |
{ "stb", 0xd4080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "std", 0xd4000002, 0xfc080002, "r,xOA,X", 4 }, |
{ "stf", 0xdc000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "stfbr", 0x54000000, 0xfc080000, "b,xOA,X", 4 }, |
{ "sth", 0xd4000001, 0xfc080001, "r,xOA,X", 4 }, |
{ "stmb", 0xd8080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "stmd", 0xd8000002, 0xfc080002, "r,xOA,X", 4 }, |
{ "stmh", 0xd8000001, 0xfc080001, "r,xOA,X", 4 }, |
{ "stmw", 0xd8000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "stpio", 0xfc270000, 0xfc7f8000, "r,I", 4 }, |
{ "stw", 0xd4000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "stwbr", 0x54000000, 0xfc080000, "b,xOA,X", 4 }, |
{ "suabr", 0x58000000, 0xfc080000, "b,xOA,X", 4 }, |
{ "sufd", 0xe0000002, 0xfc080002, "r,xOA,X", 4 }, |
{ "sufw", 0xe0000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "sui", 0xc8020000, 0xfc7f0000, "r,I", 4 }, |
{ "sumb", 0xbc080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "sumd", 0xbc000002, 0xfc080002, "r,xOA,X", 4 }, |
{ "sumh", 0xbc000001, 0xfc080001, "r,xOA,X", 4 }, |
{ "sumw", 0xbc000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "sur", 0x3c000000, 0xfc0f0000, "r,R", 2 }, |
{ "surfd", 0x380b0000, 0xfc0f0000, "r,xOA,X", 4 }, |
{ "surfw", 0x38030000, 0xfc0f0000, "r,R", 2 }, |
{ "surm", 0x3c080000, 0xfc0f0000, "r,R", 2 }, |
{ "svc", 0xc8060000, 0xffff0000, "", 4 }, |
{ "tbm", 0xa4080000, 0xfc080000, "f,xOA,X", 4 }, |
{ "tbr", 0x180c0000, 0xfc0c0000, "r,f", 2 }, |
{ "tbrr", 0x2c020000, 0xfc0f0000, "r,B", 2 }, |
{ "tccr", 0x28040000, 0xfc7f0000, "", 2 }, |
{ "td", 0xfc050000, 0xfc070000, "r,f", 4 }, |
{ "tio", 0xfc1f0000, 0xfc7f8000, "r,I", 4 }, |
{ "tmapr", 0x2c0a0000, 0xfc0f0000, "r,R", 2 }, |
{ "tpcbr", 0x280c0000, 0xfc7f0000, "r", 2 }, |
{ "trbr", 0x2c010000, 0xfc0f0000, "b,R", 2 }, |
{ "trc", 0x2c030000, 0xfc0f0000, "r,R", 2 }, |
{ "trcc", 0x28050000, 0xfc7f0000, "", 2 }, |
{ "trcm", 0x2c0b0000, 0xfc0f0000, "r,R", 2 }, |
{ "trn", 0x2c040000, 0xfc0f0000, "r,R", 2 }, |
{ "trnm", 0x2c0c0000, 0xfc0f0000, "r,R", 2 }, |
{ "trr", 0x2c000000, 0xfc0f0000, "r,R", 2 }, |
{ "trrm", 0x2c080000, 0xfc0f0000, "r,R", 2 }, |
{ "trsc", 0x2c0e0000, 0xfc0f0000, "r,R", 2 }, |
{ "trsw", 0x28000000, 0xfc7f0000, "r", 2 }, |
{ "tscr", 0x2c0f0000, 0xfc0f0000, "r,R", 2 }, |
{ "uei", 0x00070000, 0xffff0000, "", 2 }, |
{ "wait", 0x00010000, 0xffff0000, "", 2 }, |
{ "wcwcs", 0xfc5f0000, 0xfc7f8000, "", 4 }, |
{ "wwcs", 0x000c0000, 0xfc0f0000, "r,R", 2 }, |
{ "xcbr", 0x28020000, 0xfc0f0000, "b,B", 2 }, |
{ "xcr", 0x2c050000, 0xfc0f0000, "r,R", 2 }, |
{ "xcrm", 0x2c0d0000, 0xfc0f0000, "r,R", 2 }, |
{ "zbm", 0x9c080000, 0xfc080000, "f,xOA,X", 4 }, |
{ "zbr", 0x18040000, 0xfc0c0000, "r,f", 2 }, |
{ "zmb", 0xf8080000, 0xfc080000, "r,xOA,X", 4 }, |
{ "zmd", 0xf8000002, 0xfc080002, "r,xOA,X", 4 }, |
{ "zmh", 0xf8000001, 0xfc080001, "r,xOA,X", 4 }, |
{ "zmw", 0xf8000000, 0xfc080000, "r,xOA,X", 4 }, |
{ "zr", 0x0c000000, 0xfc0f0000, "r", 2 }, |
}; |
int numopcodes = sizeof(gld_opcodes) / sizeof(gld_opcodes[0]); |
struct gld_opcode *endop = gld_opcodes + sizeof(gld_opcodes) / |
sizeof(gld_opcodes[0]); |
/contrib/toolchain/binutils/include/opcode/ppc.h |
---|
0,0 → 1,413 |
/* ppc.h -- Header file for PowerPC opcode table |
Copyright 1994, 1995, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, |
2007, 2008, 2009, 2010, 2012 Free Software Foundation, Inc. |
Written by Ian Lance Taylor, Cygnus Support |
This file is part of GDB, GAS, and the GNU binutils. |
GDB, GAS, and the GNU binutils are free software; you can redistribute |
them and/or modify them under the terms of the GNU General Public |
License as published by the Free Software Foundation; either version 3, |
or (at your option) any later version. |
GDB, GAS, and the GNU binutils are distributed in the hope that they |
will be useful, but WITHOUT ANY WARRANTY; without even the implied |
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See |
the GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this file; see the file COPYING3. If not, write to the Free |
Software Foundation, 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef PPC_H |
#define PPC_H |
#include "bfd_stdint.h" |
typedef uint64_t ppc_cpu_t; |
/* The opcode table is an array of struct powerpc_opcode. */ |
struct powerpc_opcode |
{ |
/* The opcode name. */ |
const char *name; |
/* The opcode itself. Those bits which will be filled in with |
operands are zeroes. */ |
unsigned long opcode; |
/* The opcode mask. This is used by the disassembler. This is a |
mask containing ones indicating those bits which must match the |
opcode field, and zeroes indicating those bits which need not |
match (and are presumably filled in by operands). */ |
unsigned long mask; |
/* One bit flags for the opcode. These are used to indicate which |
specific processors support the instructions. The defined values |
are listed below. */ |
ppc_cpu_t flags; |
/* One bit flags for the opcode. These are used to indicate which |
specific processors no longer support the instructions. The defined |
values are listed below. */ |
ppc_cpu_t deprecated; |
/* An array of operand codes. Each code is an index into the |
operand table. They appear in the order which the operands must |
appear in assembly code, and are terminated by a zero. */ |
unsigned char operands[8]; |
}; |
/* The table itself is sorted by major opcode number, and is otherwise |
in the order in which the disassembler should consider |
instructions. */ |
extern const struct powerpc_opcode powerpc_opcodes[]; |
extern const int powerpc_num_opcodes; |
extern const struct powerpc_opcode vle_opcodes[]; |
extern const int vle_num_opcodes; |
/* Values defined for the flags field of a struct powerpc_opcode. */ |
/* Opcode is defined for the PowerPC architecture. */ |
#define PPC_OPCODE_PPC 1 |
/* Opcode is defined for the POWER (RS/6000) architecture. */ |
#define PPC_OPCODE_POWER 2 |
/* Opcode is defined for the POWER2 (Rios 2) architecture. */ |
#define PPC_OPCODE_POWER2 4 |
/* Opcode is supported by the Motorola PowerPC 601 processor. The 601 |
is assumed to support all PowerPC (PPC_OPCODE_PPC) instructions, |
but it also supports many additional POWER instructions. */ |
#define PPC_OPCODE_601 8 |
/* Opcode is supported in both the Power and PowerPC architectures |
(ie, compiler's -mcpu=common or assembler's -mcom). More than just |
the intersection of PPC_OPCODE_PPC with the union of PPC_OPCODE_POWER |
and PPC_OPCODE_POWER2 because many instructions changed mnemonics |
between POWER and POWERPC. */ |
#define PPC_OPCODE_COMMON 0x10 |
/* Opcode is supported for any Power or PowerPC platform (this is |
for the assembler's -many option, and it eliminates duplicates). */ |
#define PPC_OPCODE_ANY 0x20 |
/* Opcode is only defined on 64 bit architectures. */ |
#define PPC_OPCODE_64 0x40 |
/* Opcode is supported as part of the 64-bit bridge. */ |
#define PPC_OPCODE_64_BRIDGE 0x80 |
/* Opcode is supported by Altivec Vector Unit */ |
#define PPC_OPCODE_ALTIVEC 0x100 |
/* Opcode is supported by PowerPC 403 processor. */ |
#define PPC_OPCODE_403 0x200 |
/* Opcode is supported by PowerPC BookE processor. */ |
#define PPC_OPCODE_BOOKE 0x400 |
/* Opcode is supported by PowerPC 440 processor. */ |
#define PPC_OPCODE_440 0x800 |
/* Opcode is only supported by Power4 architecture. */ |
#define PPC_OPCODE_POWER4 0x1000 |
/* Opcode is only supported by Power7 architecture. */ |
#define PPC_OPCODE_POWER7 0x2000 |
/* Opcode is only supported by e500x2 Core. */ |
#define PPC_OPCODE_SPE 0x4000 |
/* Opcode is supported by e500x2 Integer select APU. */ |
#define PPC_OPCODE_ISEL 0x8000 |
/* Opcode is an e500 SPE floating point instruction. */ |
#define PPC_OPCODE_EFS 0x10000 |
/* Opcode is supported by branch locking APU. */ |
#define PPC_OPCODE_BRLOCK 0x20000 |
/* Opcode is supported by performance monitor APU. */ |
#define PPC_OPCODE_PMR 0x40000 |
/* Opcode is supported by cache locking APU. */ |
#define PPC_OPCODE_CACHELCK 0x80000 |
/* Opcode is supported by machine check APU. */ |
#define PPC_OPCODE_RFMCI 0x100000 |
/* Opcode is only supported by Power5 architecture. */ |
#define PPC_OPCODE_POWER5 0x200000 |
/* Opcode is supported by PowerPC e300 family. */ |
#define PPC_OPCODE_E300 0x400000 |
/* Opcode is only supported by Power6 architecture. */ |
#define PPC_OPCODE_POWER6 0x800000 |
/* Opcode is only supported by PowerPC Cell family. */ |
#define PPC_OPCODE_CELL 0x1000000 |
/* Opcode is supported by CPUs with paired singles support. */ |
#define PPC_OPCODE_PPCPS 0x2000000 |
/* Opcode is supported by Power E500MC */ |
#define PPC_OPCODE_E500MC 0x4000000 |
/* Opcode is supported by PowerPC 405 processor. */ |
#define PPC_OPCODE_405 0x8000000 |
/* Opcode is supported by Vector-Scalar (VSX) Unit */ |
#define PPC_OPCODE_VSX 0x10000000 |
/* Opcode is supported by A2. */ |
#define PPC_OPCODE_A2 0x20000000 |
/* Opcode is supported by PowerPC 476 processor. */ |
#define PPC_OPCODE_476 0x40000000 |
/* Opcode is supported by AppliedMicro Titan core */ |
#define PPC_OPCODE_TITAN 0x80000000 |
/* Opcode which is supported by the e500 family */ |
#define PPC_OPCODE_E500 0x100000000ull |
/* Opcode is supported by Extended Altivec Vector Unit */ |
#define PPC_OPCODE_ALTIVEC2 0x200000000ull |
/* Opcode is supported by Power E6500 */ |
#define PPC_OPCODE_E6500 0x400000000ull |
/* Opcode is supported by Thread management APU */ |
#define PPC_OPCODE_TMR 0x800000000ull |
/* Opcode which is supported by the VLE extension. */ |
#define PPC_OPCODE_VLE 0x1000000000ull |
/* Opcode is only supported by Power8 architecture. */ |
#define PPC_OPCODE_POWER8 0x2000000000ull |
/* Opcode which is supported by the Hardware Transactional Memory extension. */ |
/* Currently, this is the same as the POWER8 mask. If another cpu comes out |
that isn't a superset of POWER8, we can define this to its own mask. */ |
#define PPC_OPCODE_HTM PPC_OPCODE_POWER8 |
/* A macro to extract the major opcode from an instruction. */ |
#define PPC_OP(i) (((i) >> 26) & 0x3f) |
/* A macro to determine if the instruction is a 2-byte VLE insn. */ |
#define PPC_OP_SE_VLE(m) ((m) <= 0xffff) |
/* A macro to extract the major opcode from a VLE instruction. */ |
#define VLE_OP(i,m) (((i) >> ((m) <= 0xffff ? 10 : 26)) & 0x3f) |
/* A macro to convert a VLE opcode to a VLE opcode segment. */ |
#define VLE_OP_TO_SEG(i) ((i) >> 1) |
/* The operands table is an array of struct powerpc_operand. */ |
struct powerpc_operand |
{ |
/* A bitmask of bits in the operand. */ |
unsigned int bitm; |
/* The shift operation to be applied to the operand. No shift |
is made if this is zero. For positive values, the operand |
is shifted left by SHIFT. For negative values, the operand |
is shifted right by -SHIFT. Use PPC_OPSHIFT_INV to indicate |
that BITM and SHIFT cannot be used to determine where the |
operand goes in the insn. */ |
int shift; |
/* Insertion function. This is used by the assembler. To insert an |
operand value into an instruction, check this field. |
If it is NULL, execute |
if (o->shift >= 0) |
i |= (op & o->bitm) << o->shift; |
else |
i |= (op & o->bitm) >> -o->shift; |
(i is the instruction which we are filling in, o is a pointer to |
this structure, and op is the operand value). |
If this field is not NULL, then simply call it with the |
instruction and the operand value. It will return the new value |
of the instruction. If the ERRMSG argument is not NULL, then if |
the operand value is illegal, *ERRMSG will be set to a warning |
string (the operand will be inserted in any case). If the |
operand value is legal, *ERRMSG will be unchanged (most operands |
can accept any value). */ |
unsigned long (*insert) |
(unsigned long instruction, long op, ppc_cpu_t dialect, const char **errmsg); |
/* Extraction function. This is used by the disassembler. To |
extract this operand type from an instruction, check this field. |
If it is NULL, compute |
if (o->shift >= 0) |
op = (i >> o->shift) & o->bitm; |
else |
op = (i << -o->shift) & o->bitm; |
if ((o->flags & PPC_OPERAND_SIGNED) != 0) |
sign_extend (op); |
(i is the instruction, o is a pointer to this structure, and op |
is the result). |
If this field is not NULL, then simply call it with the |
instruction value. It will return the value of the operand. If |
the INVALID argument is not NULL, *INVALID will be set to |
non-zero if this operand type can not actually be extracted from |
this operand (i.e., the instruction does not match). If the |
operand is valid, *INVALID will not be changed. */ |
long (*extract) (unsigned long instruction, ppc_cpu_t dialect, int *invalid); |
/* One bit syntax flags. */ |
unsigned long flags; |
}; |
/* Elements in the table are retrieved by indexing with values from |
the operands field of the powerpc_opcodes table. */ |
extern const struct powerpc_operand powerpc_operands[]; |
extern const unsigned int num_powerpc_operands; |
/* Use with the shift field of a struct powerpc_operand to indicate |
that BITM and SHIFT cannot be used to determine where the operand |
goes in the insn. */ |
#define PPC_OPSHIFT_INV (-1 << 31) |
/* Values defined for the flags field of a struct powerpc_operand. */ |
/* This operand takes signed values. */ |
#define PPC_OPERAND_SIGNED (0x1) |
/* This operand takes signed values, but also accepts a full positive |
range of values when running in 32 bit mode. That is, if bits is |
16, it takes any value from -0x8000 to 0xffff. In 64 bit mode, |
this flag is ignored. */ |
#define PPC_OPERAND_SIGNOPT (0x2) |
/* This operand does not actually exist in the assembler input. This |
is used to support extended mnemonics such as mr, for which two |
operands fields are identical. The assembler should call the |
insert function with any op value. The disassembler should call |
the extract function, ignore the return value, and check the value |
placed in the valid argument. */ |
#define PPC_OPERAND_FAKE (0x4) |
/* The next operand should be wrapped in parentheses rather than |
separated from this one by a comma. This is used for the load and |
store instructions which want their operands to look like |
reg,displacement(reg) |
*/ |
#define PPC_OPERAND_PARENS (0x8) |
/* This operand may use the symbolic names for the CR fields, which |
are |
lt 0 gt 1 eq 2 so 3 un 3 |
cr0 0 cr1 1 cr2 2 cr3 3 |
cr4 4 cr5 5 cr6 6 cr7 7 |
These may be combined arithmetically, as in cr2*4+gt. These are |
only supported on the PowerPC, not the POWER. */ |
#define PPC_OPERAND_CR_BIT (0x10) |
/* This operand names a register. The disassembler uses this to print |
register names with a leading 'r'. */ |
#define PPC_OPERAND_GPR (0x20) |
/* Like PPC_OPERAND_GPR, but don't print a leading 'r' for r0. */ |
#define PPC_OPERAND_GPR_0 (0x40) |
/* This operand names a floating point register. The disassembler |
prints these with a leading 'f'. */ |
#define PPC_OPERAND_FPR (0x80) |
/* This operand is a relative branch displacement. The disassembler |
prints these symbolically if possible. */ |
#define PPC_OPERAND_RELATIVE (0x100) |
/* This operand is an absolute branch address. The disassembler |
prints these symbolically if possible. */ |
#define PPC_OPERAND_ABSOLUTE (0x200) |
/* This operand is optional, and is zero if omitted. This is used for |
example, in the optional BF field in the comparison instructions. The |
assembler must count the number of operands remaining on the line, |
and the number of operands remaining for the opcode, and decide |
whether this operand is present or not. The disassembler should |
print this operand out only if it is not zero. */ |
#define PPC_OPERAND_OPTIONAL (0x400) |
/* This flag is only used with PPC_OPERAND_OPTIONAL. If this operand |
is omitted, then for the next operand use this operand value plus |
1, ignoring the next operand field for the opcode. This wretched |
hack is needed because the Power rotate instructions can take |
either 4 or 5 operands. The disassembler should print this operand |
out regardless of the PPC_OPERAND_OPTIONAL field. */ |
#define PPC_OPERAND_NEXT (0x800) |
/* This operand should be regarded as a negative number for the |
purposes of overflow checking (i.e., the normal most negative |
number is disallowed and one more than the normal most positive |
number is allowed). This flag will only be set for a signed |
operand. */ |
#define PPC_OPERAND_NEGATIVE (0x1000) |
/* This operand names a vector unit register. The disassembler |
prints these with a leading 'v'. */ |
#define PPC_OPERAND_VR (0x2000) |
/* This operand is for the DS field in a DS form instruction. */ |
#define PPC_OPERAND_DS (0x4000) |
/* This operand is for the DQ field in a DQ form instruction. */ |
#define PPC_OPERAND_DQ (0x8000) |
/* Valid range of operand is 0..n rather than 0..n-1. */ |
#define PPC_OPERAND_PLUS1 (0x10000) |
/* Xilinx APU and FSL related operands */ |
#define PPC_OPERAND_FSL (0x20000) |
#define PPC_OPERAND_FCR (0x40000) |
#define PPC_OPERAND_UDI (0x80000) |
/* This operand names a vector-scalar unit register. The disassembler |
prints these with a leading 'vs'. */ |
#define PPC_OPERAND_VSR (0x100000) |
/* This is a CR FIELD that does not use symbolic names. */ |
#define PPC_OPERAND_CR_REG (0x200000) |
/* The POWER and PowerPC assemblers use a few macros. We keep them |
with the operands table for simplicity. The macro table is an |
array of struct powerpc_macro. */ |
struct powerpc_macro |
{ |
/* The macro name. */ |
const char *name; |
/* The number of operands the macro takes. */ |
unsigned int operands; |
/* One bit flags for the opcode. These are used to indicate which |
specific processors support the instructions. The values are the |
same as those for the struct powerpc_opcode flags field. */ |
ppc_cpu_t flags; |
/* A format string to turn the macro into a normal instruction. |
Each %N in the string is replaced with operand number N (zero |
based). */ |
const char *format; |
}; |
extern const struct powerpc_macro powerpc_macros[]; |
extern const int powerpc_num_macros; |
extern ppc_cpu_t ppc_parse_cpu (ppc_cpu_t, ppc_cpu_t *, const char *); |
#endif /* PPC_H */ |
/contrib/toolchain/binutils/include/opcode/pyr.h |
---|
0,0 → 1,305 |
/* pyramid.opcode.h -- gdb initial attempt. |
Copyright 2001, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3, or (at your option) |
any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
/* pyramid opcode table: wot to do with this |
particular opcode */ |
struct pyr_datum |
{ |
char nargs; |
char * args; /* how to compile said opcode */ |
unsigned long mask; /* Bit vector: which operand modes are valid |
for this opcode */ |
unsigned char code; /* op-code (always 6(?) bits */ |
}; |
typedef struct pyr_insn_format |
{ |
unsigned int mode :4; |
unsigned int operator :8; |
unsigned int index_scale :2; |
unsigned int index_reg :6; |
unsigned int operand_1 :6; |
unsigned int operand_2:6; |
} pyr_insn_format; |
/* We store four bytes of opcode for all opcodes. |
Pyramid is sufficiently RISCy that: |
- insns are always an integral number of words; |
- the length of any insn can be told from the first word of |
the insn. (ie, if there are zero, one, or two words of |
immediate operand/offset). |
The args component is a string containing two characters for each |
operand of the instruction. The first specifies the kind of operand; |
the second, the place it is stored. */ |
/* Kinds of operands: |
mask assembler syntax description |
0x0001: movw Rn,Rn register to register |
0x0002: movw K,Rn quick immediate to register |
0x0004: movw I,Rn long immediate to register |
0x0008: movw (Rn),Rn register indirect to register |
movw (Rn)[x],Rn register indirect to register |
0x0010: movw I(Rn),Rn offset register indirect to register |
movw I(Rn)[x],Rn offset register indirect, indexed, to register |
0x0020: movw Rn,(Rn) register to register indirect |
0x0040: movw K,(Rn) quick immediate to register indirect |
0x0080: movw I,(Rn) long immediate to register indirect |
0x0100: movw (Rn),(Rn) register indirect to-register indirect |
0x0100: movw (Rn),(Rn) register indirect to-register indirect |
0x0200: movw I(Rn),(Rn) register indirect+offset to register indirect |
0x0200: movw I(Rn),(Rn) register indirect+offset to register indirect |
0x0400: movw Rn,I(Rn) register to register indirect+offset |
0x0800: movw K,I(Rn) quick immediate to register indirect+offset |
0x1000: movw I,I(Rn) long immediate to register indirect+offset |
0x1000: movw (Rn),I(Rn) register indirect to-register indirect+offset |
0x1000: movw I(Rn),I(Rn) register indirect+offset to register indirect |
+offset |
0x0000: (irregular) ??? |
Each insn has a four-bit field encoding the type(s) of its operands. |
*/ |
/* Some common combinations |
*/ |
/* the first 5,(0x1|0x2|0x4|0x8|0x10) ie (1|2|4|8|16), ie ( 32 -1)*/ |
#define GEN_TO_REG (31) |
#define UNKNOWN ((unsigned long)-1) |
#define ANY (GEN_TO_REG | (GEN_TO_REG << 5) | (GEN_TO_REG << 15)) |
#define CONVERT (1|8|0x10|0x20|0x200) |
#define K_TO_REG (2) |
#define I_TO_REG (4) |
#define NOTK_TO_REG (GEN_TO_REG & ~K_TO_REG) |
#define NOTI_TO_REG (GEN_TO_REG & ~I_TO_REG) |
/* The assembler requires that this array be sorted as follows: |
all instances of the same mnemonic must be consecutive. |
All instances of the same mnemonic with the same number of operands |
must be consecutive. |
*/ |
struct pyr_opcode /* pyr opcode text */ |
{ |
char * name; /* opcode name: lowercase string [key] */ |
struct pyr_datum datum; /* rest of opcode table [datum] */ |
}; |
#define pyr_how args |
#define pyr_nargs nargs |
#define pyr_mask mask |
#define pyr_name name |
struct pyr_opcode pyr_opcodes[] = |
{ |
{"movb", { 2, "", UNKNOWN, 0x11}, }, |
{"movh", { 2, "", UNKNOWN, 0x12} }, |
{"movw", { 2, "", ANY, 0x10} }, |
{"movl", { 2, "", ANY, 0x13} }, |
{"mnegw", { 2, "", (0x1|0x8|0x10), 0x14} }, |
{"mnegf", { 2, "", 0x1, 0x15} }, |
{"mnegd", { 2, "", 0x1, 0x16} }, |
{"mcomw", { 2, "", (0x1|0x8|0x10), 0x17} }, |
{"mabsw", { 2, "", (0x1|0x8|0x10), 0x18} }, |
{"mabsf", { 2, "", 0x1, 0x19} }, |
{"mabsd", { 2, "", 0x1, 0x1a} }, |
{"mtstw", { 2, "", (0x1|0x8|0x10), 0x1c} }, |
{"mtstf", { 2, "", 0x1, 0x1d} }, |
{"mtstd", { 2, "", 0x1, 0x1e} }, |
{"mova", { 2, "", 0x8|0x10, 0x1f} }, |
{"movzbw", { 2, "", (0x1|0x8|0x10), 0x20} }, |
{"movzhw", { 2, "", (0x1|0x8|0x10), 0x21} }, |
/* 2 insns out of order here */ |
{"movbl", { 2, "", 1, 0x4f} }, |
{"filbl", { 2, "", 1, 0x4e} }, |
{"cvtbw", { 2, "", CONVERT, 0x22} }, |
{"cvthw", { 2, "", CONVERT, 0x23} }, |
{"cvtwb", { 2, "", CONVERT, 0x24} }, |
{"cvtwh", { 2, "", CONVERT, 0x25} }, |
{"cvtwf", { 2, "", CONVERT, 0x26} }, |
{"cvtwd", { 2, "", CONVERT, 0x27} }, |
{"cvtfw", { 2, "", CONVERT, 0x28} }, |
{"cvtfd", { 2, "", CONVERT, 0x29} }, |
{"cvtdw", { 2, "", CONVERT, 0x2a} }, |
{"cvtdf", { 2, "", CONVERT, 0x2b} }, |
{"addw", { 2, "", GEN_TO_REG, 0x40} }, |
{"addwc", { 2, "", GEN_TO_REG, 0x41} }, |
{"subw", { 2, "", GEN_TO_REG, 0x42} }, |
{"subwb", { 2, "", GEN_TO_REG, 0x43} }, |
{"rsubw", { 2, "", GEN_TO_REG, 0x44} }, |
{"mulw", { 2, "", GEN_TO_REG, 0x45} }, |
{"emul", { 2, "", GEN_TO_REG, 0x47} }, |
{"umulw", { 2, "", GEN_TO_REG, 0x46} }, |
{"divw", { 2, "", GEN_TO_REG, 0x48} }, |
{"ediv", { 2, "", GEN_TO_REG, 0x4a} }, |
{"rdivw", { 2, "", GEN_TO_REG, 0x4b} }, |
{"udivw", { 2, "", GEN_TO_REG, 0x49} }, |
{"modw", { 2, "", GEN_TO_REG, 0x4c} }, |
{"umodw", { 2, "", GEN_TO_REG, 0x4d} }, |
{"addf", { 2, "", 1, 0x50} }, |
{"addd", { 2, "", 1, 0x51} }, |
{"subf", { 2, "", 1, 0x52} }, |
{"subd", { 2, "", 1, 0x53} }, |
{"mulf", { 2, "", 1, 0x56} }, |
{"muld", { 2, "", 1, 0x57} }, |
{"divf", { 2, "", 1, 0x58} }, |
{"divd", { 2, "", 1, 0x59} }, |
{"cmpb", { 2, "", UNKNOWN, 0x61} }, |
{"cmph", { 2, "", UNKNOWN, 0x62} }, |
{"cmpw", { 2, "", UNKNOWN, 0x60} }, |
{"ucmpb", { 2, "", UNKNOWN, 0x66} }, |
/* WHY no "ucmph"??? */ |
{"ucmpw", { 2, "", UNKNOWN, 0x65} }, |
{"xchw", { 2, "", UNKNOWN, 0x0f} }, |
{"andw", { 2, "", GEN_TO_REG, 0x30} }, |
{"orw", { 2, "", GEN_TO_REG, 0x31} }, |
{"xorw", { 2, "", GEN_TO_REG, 0x32} }, |
{"bicw", { 2, "", GEN_TO_REG, 0x33} }, |
{"lshlw", { 2, "", GEN_TO_REG, 0x38} }, |
{"ashlw", { 2, "", GEN_TO_REG, 0x3a} }, |
{"ashll", { 2, "", GEN_TO_REG, 0x3c} }, |
{"ashrw", { 2, "", GEN_TO_REG, 0x3b} }, |
{"ashrl", { 2, "", GEN_TO_REG, 0x3d} }, |
{"rotlw", { 2, "", GEN_TO_REG, 0x3e} }, |
{"rotrw", { 2, "", GEN_TO_REG, 0x3f} }, |
/* push and pop insns are "going away next release". */ |
{"pushw", { 2, "", GEN_TO_REG, 0x0c} }, |
{"popw", { 2, "", (0x1|0x8|0x10), 0x0d} }, |
{"pusha", { 2, "", (0x8|0x10), 0x0e} }, |
{"bitsw", { 2, "", UNKNOWN, 0x35} }, |
{"bitcw", { 2, "", UNKNOWN, 0x36} }, |
/* some kind of ibra/dbra insns??*/ |
{"icmpw", { 2, "", UNKNOWN, 0x67} }, |
{"dcmpw", { 2, "", (1|4|0x20|0x80|0x400|0x1000), 0x69} },/*FIXME*/ |
{"acmpw", { 2, "", 1, 0x6b} }, |
/* Call is written as a 1-op insn, but is always (dis)assembled as a 2-op |
insn with a 2nd op of tr14. The assembler will have to grok this. */ |
{"call", { 2, "", GEN_TO_REG, 0x04} }, |
{"call", { 1, "", GEN_TO_REG, 0x04} }, |
{"callk", { 1, "", UNKNOWN, 0x06} },/* system call?*/ |
/* Ret is usually written as a 0-op insn, but gets disassembled as a |
1-op insn. The operand is always tr15. */ |
{"ret", { 0, "", UNKNOWN, 0x09} }, |
{"ret", { 1, "", UNKNOWN, 0x09} }, |
{"adsf", { 2, "", (1|2|4), 0x08} }, |
{"retd", { 2, "", UNKNOWN, 0x0a} }, |
{"btc", { 2, "", UNKNOWN, 0x01} }, |
{"bfc", { 2, "", UNKNOWN, 0x02} }, |
/* Careful: halt is 0x00000000. Jump must have some other (mode?)bit set?? */ |
{"jump", { 1, "", UNKNOWN, 0x00} }, |
{"btp", { 2, "", UNKNOWN, 0xf00} }, |
/* read control-stack pointer is another 1-or-2 operand insn. */ |
{"rcsp", { 2, "", UNKNOWN, 0x01f} }, |
{"rcsp", { 1, "", UNKNOWN, 0x01f} } |
}; |
/* end: pyramid.opcode.h */ |
/* One day I will have to take the time to find out what operands |
are valid for these insns, and guess at what they mean. |
I can't imagine what the "I???" insns (iglob, etc) do. |
the arithmetic-sounding insns ending in "p" sound awfully like BCD |
arithmetic insns: |
dshlp -> Decimal SHift Left Packed |
dshrp -> Decimal SHift Right Packed |
and cvtlp would be convert long to packed. |
I have no idea how the operands are interpreted; but having them be |
a long register with (address, length) of an in-memory packed BCD operand |
would not be surprising. |
They are unlikely to be a packed bcd string: 64 bits of long give |
is only 15 digits+sign, which isn't enough for COBOL. |
*/ |
#if 0 |
{"wcsp", { 2, "", UNKNOWN, 0x00} }, /*write csp?*/ |
/* The OSx Operating System Porting Guide claims SSL does things |
with tr12 (a register reserved to it) to do with static block-structure |
references. SSL=Set Static Link? It's "Going away next release". */ |
{"ssl", { 2, "", UNKNOWN, 0x00} }, |
{"ccmps", { 2, "", UNKNOWN, 0x00} }, |
{"lcd", { 2, "", UNKNOWN, 0x00} }, |
{"uemul", { 2, "", UNKNOWN, 0x00} }, /*unsigned emul*/ |
{"srf", { 2, "", UNKNOWN, 0x00} }, /*Gidget time???*/ |
{"mnegp", { 2, "", UNKNOWN, 0x00} }, /move-neg phys?*/ |
{"ldp", { 2, "", UNKNOWN, 0x00} }, /*load phys?*/ |
{"ldti", { 2, "", UNKNOWN, 0x00} }, |
{"ldb", { 2, "", UNKNOWN, 0x00} }, |
{"stp", { 2, "", UNKNOWN, 0x00} }, |
{"stti", { 2, "", UNKNOWN, 0x00} }, |
{"stb", { 2, "", UNKNOWN, 0x00} }, |
{"stu", { 2, "", UNKNOWN, 0x00} }, |
{"addp", { 2, "", UNKNOWN, 0x00} }, |
{"subp", { 2, "", UNKNOWN, 0x00} }, |
{"mulp", { 2, "", UNKNOWN, 0x00} }, |
{"divp", { 2, "", UNKNOWN, 0x00} }, |
{"dshlp", { 2, "", UNKNOWN, 0x00} }, /* dec shl packed? */ |
{"dshrp", { 2, "", UNKNOWN, 0x00} }, /* dec shr packed? */ |
{"movs", { 2, "", UNKNOWN, 0x00} }, /*move (string?)?*/ |
{"cmpp", { 2, "", UNKNOWN, 0x00} }, /* cmp phys?*/ |
{"cmps", { 2, "", UNKNOWN, 0x00} }, /* cmp (string?)?*/ |
{"cvtlp", { 2, "", UNKNOWN, 0x00} }, /* cvt long to p??*/ |
{"cvtpl", { 2, "", UNKNOWN, 0x00} }, /* cvt p to l??*/ |
{"dintr", { 2, "", UNKNOWN, 0x00} }, /* ?? intr ?*/ |
{"rphysw", { 2, "", UNKNOWN, 0x00} }, /* read phys word?*/ |
{"wphysw", { 2, "", UNKNOWN, 0x00} }, /* write phys word?*/ |
{"cmovs", { 2, "", UNKNOWN, 0x00} }, |
{"rsubw", { 2, "", UNKNOWN, 0x00} }, |
{"bicpsw", { 2, "", UNKNOWN, 0x00} }, /* clr bit in psw? */ |
{"bispsw", { 2, "", UNKNOWN, 0x00} }, /* set bit in psw? */ |
{"eio", { 2, "", UNKNOWN, 0x00} }, /* ?? ?io ? */ |
{"callp", { 2, "", UNKNOWN, 0x00} }, /* call phys?*/ |
{"callr", { 2, "", UNKNOWN, 0x00} }, |
{"lpcxt", { 2, "", UNKNOWN, 0x00} }, /*load proc context*/ |
{"rei", { 2, "", UNKNOWN, 0x00} }, /*ret from intrpt*/ |
{"rport", { 2, "", UNKNOWN, 0x00} }, /*read-port?*/ |
{"rtod", { 2, "", UNKNOWN, 0x00} }, /*read-time-of-day?*/ |
{"ssi", { 2, "", UNKNOWN, 0x00} }, |
{"vtpa", { 2, "", UNKNOWN, 0x00} }, /*virt-to-phys-addr?*/ |
{"wicl", { 2, "", UNKNOWN, 0x00} }, /* write icl ? */ |
{"wport", { 2, "", UNKNOWN, 0x00} }, /*write-port?*/ |
{"wtod", { 2, "", UNKNOWN, 0x00} }, /*write-time-of-day?*/ |
{"flic", { 2, "", UNKNOWN, 0x00} }, |
{"iglob", { 2, "", UNKNOWN, 0x00} }, /* I global? */ |
{"iphys", { 2, "", UNKNOWN, 0x00} }, /* I physical? */ |
{"ipid", { 2, "", UNKNOWN, 0x00} }, /* I pid? */ |
{"ivect", { 2, "", UNKNOWN, 0x00} }, /* I vector? */ |
{"lamst", { 2, "", UNKNOWN, 0x00} }, |
{"tio", { 2, "", UNKNOWN, 0x00} }, |
#endif |
/contrib/toolchain/binutils/include/opcode/rl78.h |
---|
0,0 → 1,168 |
/* Opcode decoder for the Renesas RL78 |
Copyright 2011 |
Free Software Foundation, Inc. |
Written by DJ Delorie <dj@redhat.com> |
This file is part of GDB, the GNU Debugger and GAS, the GNU Assembler. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA |
02110-1301, USA. */ |
/* The RL78 decoder in libopcodes is used by the simulator, gdb's |
analyzer, and the disassembler. Given an opcode data source, it |
decodes the next opcode into the following structures. */ |
#ifndef RL78_OPCODES_H_INCLUDED |
#define RL78_OPCODES_H_INCLUDED |
/* For the purposes of these structures, the RL78 registers are as |
follows, despite most of these being memory-mapped and |
bank-switched: */ |
typedef enum { |
RL78_Reg_None, |
/* The order of these matches the encodings. */ |
RL78_Reg_X, |
RL78_Reg_A, |
RL78_Reg_C, |
RL78_Reg_B, |
RL78_Reg_E, |
RL78_Reg_D, |
RL78_Reg_L, |
RL78_Reg_H, |
/* The order of these matches the encodings. */ |
RL78_Reg_AX, |
RL78_Reg_BC, |
RL78_Reg_DE, |
RL78_Reg_HL, |
/* Unordered. */ |
RL78_Reg_SP, |
RL78_Reg_PSW, |
RL78_Reg_CS, |
RL78_Reg_ES, |
RL78_Reg_PMC, |
RL78_Reg_MEM |
} RL78_Register; |
typedef enum |
{ |
RL78_Byte = 0, |
RL78_Word |
} RL78_Size; |
typedef enum { |
RL78_Condition_T, |
RL78_Condition_F, |
RL78_Condition_C, |
RL78_Condition_NC, |
RL78_Condition_H, |
RL78_Condition_NH, |
RL78_Condition_Z, |
RL78_Condition_NZ |
} RL78_Condition; |
typedef enum { |
RL78_Operand_None = 0, |
RL78_Operand_Immediate, /* #addend */ |
RL78_Operand_Register, /* reg */ |
RL78_Operand_Indirect, /* [reg + reg2 + addend] */ |
RL78_Operand_Bit, /* reg.bit */ |
RL78_Operand_BitIndirect, /* [reg+reg2+addend].bit */ |
RL78_Operand_PreDec, /* [--reg] = push */ |
RL78_Operand_PostInc /* [reg++] = pop */ |
} RL78_Operand_Type; |
typedef enum |
{ |
RLO_unknown, |
RLO_add, /* d += s */ |
RLO_addc, /* d += s + CY */ |
RLO_and, /* d &= s (byte, word, bit) */ |
RLO_branch, /* pc = d */ |
RLO_branch_cond, /* pc = d if cond(src) */ |
RLO_branch_cond_clear, /* pc = d if cond(src), and clear(src) */ |
RLO_break, /* BRK */ |
RLO_call, /* call */ |
RLO_cmp, /* cmp d, s */ |
RLO_divhu, /* DIVHU */ |
RLO_divwu, /* DIVWU */ |
RLO_halt, /* HALT */ |
RLO_mov, /* d = s */ |
RLO_mach, /* MACH */ |
RLO_machu, /* MACHU */ |
RLO_mulu, /* MULU */ |
RLO_mulh, /* MULH */ |
RLO_mulhu, /* MULHU */ |
RLO_nop, /* NOP */ |
RLO_or, /* d |= s */ |
RLO_ret, /* RET */ |
RLO_reti, /* RETI */ |
RLO_rol, /* d <<= s, MSB to LSB and CY */ |
RLO_rolc, /* d <<= s, MSB to CY, CY, to LSB */ |
RLO_ror, /* d >>= s, LSB to MSB and CY */ |
RLO_rorc, /* d >>= s, LSB to CY, CY, to MSB */ |
RLO_sar, /* d >>= s, signed */ |
RLO_sel, /* rb = s */ |
RLO_shr, /* d >>= s, unsigned */ |
RLO_shl, /* d <<= s */ |
RLO_skip, /* skip next insn is cond(s) */ |
RLO_stop, /* STOP */ |
RLO_sub, /* d -= s */ |
RLO_subc, /* d -= s - CY */ |
RLO_xch, /* swap d, s */ |
RLO_xor, /* d ^= s */ |
} RL78_Opcode_ID; |
typedef struct { |
RL78_Operand_Type type; |
int addend; |
RL78_Register reg : 8; |
RL78_Register reg2 : 8; |
unsigned char bit_number : 4; |
unsigned char condition : 3; |
unsigned char use_es : 1; |
} RL78_Opcode_Operand; |
/* PSW flag bits */ |
#define RL78_PSW_IE 0x80 |
#define RL78_PSW_Z 0x40 |
#define RL78_PSW_RBS1 0x20 |
#define RL78_PSW_AC 0x10 |
#define RL78_PSW_RBS0 0x08 |
#define RL78_PSW_ISP1 0x04 |
#define RL78_PSW_ISP0 0x02 |
#define RL78_PSW_CY 0x01 |
#define RL78_SFR_SP 0xffff8 |
#define RL78_SFR_PSW 0xffffa |
#define RL78_SFR_CS 0xffffc |
#define RL78_SFR_ES 0xffffd |
#define RL78_SFR_PMC 0xffffe |
#define RL78_SFR_MEM 0xfffff |
typedef struct |
{ |
int lineno; |
RL78_Opcode_ID id:24; |
unsigned flags:8; /* PSW mask, for side effects only */ |
int n_bytes; |
char * syntax; |
RL78_Size size; |
/* By convention, these are destination, source. */ |
RL78_Opcode_Operand op[2]; |
} RL78_Opcode_Decoded; |
int rl78_decode_opcode (unsigned long, RL78_Opcode_Decoded *, int (*)(void *), void *); |
#endif |
/contrib/toolchain/binutils/include/opcode/rx.h |
---|
0,0 → 1,215 |
/* Opcode decoder for the Renesas RX |
Copyright 2008, 2009, 2010 |
Free Software Foundation, Inc. |
Written by DJ Delorie <dj@redhat.com> |
This file is part of GDB, the GNU Debugger and GAS, the GNU Assembler. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA |
02110-1301, USA. */ |
/* The RX decoder in libopcodes is used by the simulator, gdb's |
analyzer, and the disassembler. Given an opcode data source, |
it decodes the next opcode into the following structures. */ |
typedef enum |
{ |
RX_AnySize = 0, |
RX_Byte, /* undefined extension */ |
RX_UByte, |
RX_SByte, |
RX_Word, /* undefined extension */ |
RX_UWord, |
RX_SWord, |
RX_3Byte, |
RX_Long, |
} RX_Size; |
typedef enum |
{ |
RX_Operand_None, |
RX_Operand_Immediate, /* #addend */ |
RX_Operand_Register, /* Rn */ |
RX_Operand_Indirect, /* [Rn + addend] */ |
RX_Operand_Postinc, /* [Rn+] */ |
RX_Operand_Predec, /* [-Rn] */ |
RX_Operand_Condition, /* eq, gtu, etc */ |
RX_Operand_Flag, /* [UIOSZC] */ |
RX_Operand_TwoReg, /* [Rn + scale*R2] */ |
} RX_Operand_Type; |
typedef enum |
{ |
RXO_unknown, |
RXO_mov, /* d = s (signed) */ |
RXO_movbi, /* d = [s,s2] (signed) */ |
RXO_movbir, /* [s,s2] = d (signed) */ |
RXO_pushm, /* s..s2 */ |
RXO_popm, /* s..s2 */ |
RXO_xchg, /* s <-> d */ |
RXO_stcc, /* d = s if cond(s2) */ |
RXO_rtsd, /* rtsd, 1=imm, 2-0 = reg if reg type */ |
/* These are all either d OP= s or, if s2 is set, d = s OP s2. Note |
that d may be "None". */ |
RXO_and, |
RXO_or, |
RXO_xor, |
RXO_add, |
RXO_sub, |
RXO_mul, |
RXO_div, |
RXO_divu, |
RXO_shll, |
RXO_shar, |
RXO_shlr, |
RXO_adc, /* d = d + s + carry */ |
RXO_sbb, /* d = d - s - ~carry */ |
RXO_abs, /* d = |s| */ |
RXO_max, /* d = max(d,s) */ |
RXO_min, /* d = min(d,s) */ |
RXO_emul, /* d:64 = d:32 * s */ |
RXO_emulu, /* d:64 = d:32 * s (unsigned) */ |
RXO_rolc, /* d <<= 1 through carry */ |
RXO_rorc, /* d >>= 1 through carry*/ |
RXO_rotl, /* d <<= #s without carry */ |
RXO_rotr, /* d >>= #s without carry*/ |
RXO_revw, /* d = revw(s) */ |
RXO_revl, /* d = revl(s) */ |
RXO_branch, /* pc = d if cond(s) */ |
RXO_branchrel,/* pc += d if cond(s) */ |
RXO_jsr, /* pc = d */ |
RXO_jsrrel, /* pc += d */ |
RXO_rts, |
RXO_nop, |
RXO_nop2, |
RXO_nop3, |
RXO_scmpu, |
RXO_smovu, |
RXO_smovb, |
RXO_suntil, |
RXO_swhile, |
RXO_smovf, |
RXO_sstr, |
RXO_rmpa, |
RXO_mulhi, |
RXO_mullo, |
RXO_machi, |
RXO_maclo, |
RXO_mvtachi, |
RXO_mvtaclo, |
RXO_mvfachi, |
RXO_mvfacmi, |
RXO_mvfaclo, |
RXO_racw, |
RXO_sat, /* sat(d) */ |
RXO_satr, |
RXO_fadd, /* d op= s */ |
RXO_fcmp, |
RXO_fsub, |
RXO_ftoi, |
RXO_fmul, |
RXO_fdiv, |
RXO_round, |
RXO_itof, |
RXO_bset, /* d |= (1<<s) */ |
RXO_bclr, /* d &= ~(1<<s) */ |
RXO_btst, /* s & (1<<s2) */ |
RXO_bnot, /* d ^= (1<<s) */ |
RXO_bmcc, /* d<s> = cond(s2) */ |
RXO_clrpsw, /* flag index in d */ |
RXO_setpsw, /* flag index in d */ |
RXO_mvtipl, /* new IPL in s */ |
RXO_rtfi, |
RXO_rte, |
RXO_rtd, /* undocumented */ |
RXO_brk, |
RXO_dbt, /* undocumented */ |
RXO_int, /* vector id in s */ |
RXO_stop, |
RXO_wait, |
RXO_sccnd, /* d = cond(s) ? 1 : 0 */ |
} RX_Opcode_ID; |
/* Condition bitpatterns, as registers. */ |
#define RXC_eq 0 |
#define RXC_z 0 |
#define RXC_ne 1 |
#define RXC_nz 1 |
#define RXC_c 2 |
#define RXC_nc 3 |
#define RXC_gtu 4 |
#define RXC_leu 5 |
#define RXC_pz 6 |
#define RXC_n 7 |
#define RXC_ge 8 |
#define RXC_lt 9 |
#define RXC_gt 10 |
#define RXC_le 11 |
#define RXC_o 12 |
#define RXC_no 13 |
#define RXC_always 14 |
#define RXC_never 15 |
typedef struct |
{ |
RX_Operand_Type type; |
int reg; |
int addend; |
RX_Size size; |
} RX_Opcode_Operand; |
typedef struct |
{ |
RX_Opcode_ID id; |
int n_bytes; |
int prefix; |
char * syntax; |
RX_Size size; |
/* By convention, these are destination, source1, source2. */ |
RX_Opcode_Operand op[3]; |
/* The logic here is: |
newflags = (oldflags & ~(int)flags_0) | flags_1 | (op_flags & flags_s) |
Only the O, S, Z, and C flags are affected. */ |
char flags_0; /* This also clears out flags-to-be-set. */ |
char flags_1; |
char flags_s; |
} RX_Opcode_Decoded; |
/* Within the syntax, %c-style format specifiers are as follows: |
%% = '%' character |
%0 = operand[0] (destination) |
%1 = operand[1] (source) |
%2 = operand[2] (2nd source) |
%s = operation size (b/w/l) |
%SN = operand size [N] (N=0,1,2) |
%aN = op[N] as an address (N=0,1,2) |
Register numbers 0..15 are general registers. 16..31 are control |
registers. 32..47 are condition codes. */ |
int rx_decode_opcode (unsigned long, RX_Opcode_Decoded *, int (*)(void *), void *); |
/contrib/toolchain/binutils/include/opcode/s390.h |
---|
0,0 → 1,154 |
/* s390.h -- Header file for S390 opcode table |
Copyright 2000, 2001, 2003, 2010 Free Software Foundation, Inc. |
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA |
02110-1301, USA. */ |
#ifndef S390_H |
#define S390_H |
/* List of instruction sets variations. */ |
enum s390_opcode_mode_val |
{ |
S390_OPCODE_ESA = 0, |
S390_OPCODE_ZARCH |
}; |
enum s390_opcode_cpu_val |
{ |
S390_OPCODE_G5 = 0, |
S390_OPCODE_G6, |
S390_OPCODE_Z900, |
S390_OPCODE_Z990, |
S390_OPCODE_Z9_109, |
S390_OPCODE_Z9_EC, |
S390_OPCODE_Z10, |
S390_OPCODE_Z196, |
S390_OPCODE_ZEC12, |
S390_OPCODE_MAXCPU |
}; |
/* The opcode table is an array of struct s390_opcode. */ |
struct s390_opcode |
{ |
/* The opcode name. */ |
const char * name; |
/* The opcode itself. Those bits which will be filled in with |
operands are zeroes. */ |
unsigned char opcode[6]; |
/* The opcode mask. This is used by the disassembler. This is a |
mask containing ones indicating those bits which must match the |
opcode field, and zeroes indicating those bits which need not |
match (and are presumably filled in by operands). */ |
unsigned char mask[6]; |
/* The opcode length in bytes. */ |
int oplen; |
/* An array of operand codes. Each code is an index into the |
operand table. They appear in the order which the operands must |
appear in assembly code, and are terminated by a zero. */ |
unsigned char operands[6]; |
/* Bitmask of execution modes this opcode is available for. */ |
unsigned int modes; |
/* First cpu this opcode is available for. */ |
enum s390_opcode_cpu_val min_cpu; |
}; |
/* The table itself is sorted by major opcode number, and is otherwise |
in the order in which the disassembler should consider |
instructions. */ |
extern const struct s390_opcode s390_opcodes[]; |
extern const int s390_num_opcodes; |
/* A opcode format table for the .insn pseudo mnemonic. */ |
extern const struct s390_opcode s390_opformats[]; |
extern const int s390_num_opformats; |
/* Values defined for the flags field of a struct powerpc_opcode. */ |
/* The operands table is an array of struct s390_operand. */ |
struct s390_operand |
{ |
/* The number of bits in the operand. */ |
int bits; |
/* How far the operand is left shifted in the instruction. */ |
int shift; |
/* One bit syntax flags. */ |
unsigned long flags; |
}; |
/* Elements in the table are retrieved by indexing with values from |
the operands field of the powerpc_opcodes table. */ |
extern const struct s390_operand s390_operands[]; |
/* Values defined for the flags field of a struct s390_operand. */ |
/* This operand names a register. The disassembler uses this to print |
register names with a leading 'r'. */ |
#define S390_OPERAND_GPR 0x1 |
/* This operand names a floating point register. The disassembler |
prints these with a leading 'f'. */ |
#define S390_OPERAND_FPR 0x2 |
/* This operand names an access register. The disassembler |
prints these with a leading 'a'. */ |
#define S390_OPERAND_AR 0x4 |
/* This operand names a control register. The disassembler |
prints these with a leading 'c'. */ |
#define S390_OPERAND_CR 0x8 |
/* This operand is a displacement. */ |
#define S390_OPERAND_DISP 0x10 |
/* This operand names a base register. */ |
#define S390_OPERAND_BASE 0x20 |
/* This operand names an index register, it can be skipped. */ |
#define S390_OPERAND_INDEX 0x40 |
/* This operand is a relative branch displacement. The disassembler |
prints these symbolically if possible. */ |
#define S390_OPERAND_PCREL 0x80 |
/* This operand takes signed values. */ |
#define S390_OPERAND_SIGNED 0x100 |
/* This operand is a length. */ |
#define S390_OPERAND_LENGTH 0x200 |
/* This operand is optional. Only a single operand at the end of |
the instruction may be optional. */ |
#define S390_OPERAND_OPTIONAL 0x400 |
/* The operand needs to be a valid GP or FP register pair. */ |
#define S390_OPERAND_REG_PAIR 0x800 |
#endif /* S390_H */ |
/contrib/toolchain/binutils/include/opcode/score-datadep.h |
---|
0,0 → 1,65 |
/* score-datadep.h -- Score Instructions data dependency table |
Copyright 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. |
Contributed by: |
Brain.lin (brain.lin@sunplusct.com) |
Mei Ligang (ligang@sunnorth.com.cn) |
Pei-Lin Tsai (pltsai@sunplus.com) |
This file is part of GAS, the GNU Assembler. |
GAS is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3, or (at your option) |
any later version. |
GAS is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with GAS; see the file COPYING3. If not, write to the Free |
Software Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
#ifndef SCORE_DATA_DEPENDENCY_H |
#define SCORE_DATA_DEPENDENCY_H |
#define INSN_NAME_LEN 16 |
enum insn_type_for_dependency |
{ |
D_mtcr, |
D_all_insn |
}; |
struct insn_to_dependency |
{ |
char *insn_name; |
enum insn_type_for_dependency type; |
}; |
struct data_dependency |
{ |
enum insn_type_for_dependency pre_insn_type; |
char pre_reg[6]; |
enum insn_type_for_dependency cur_insn_type; |
char cur_reg[6]; |
int bubblenum_7; |
int bubblenum_3; |
int warn_or_error; /* warning - 0; error - 1 */ |
}; |
static const struct insn_to_dependency insn_to_dependency_table[] = |
{ |
/* move spectial instruction. */ |
{"mtcr", D_mtcr}, |
}; |
static const struct data_dependency data_dependency_table[] = |
{ |
/* Status regiser. */ |
{D_mtcr, "cr0", D_all_insn, "", 5, 1, 0}, |
}; |
#endif |
/contrib/toolchain/binutils/include/opcode/score-inst.h |
---|
0,0 → 1,236 |
/* score-inst.h -- Score Instructions Table |
Copyright 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. |
Contributed by: |
Brain.lin (brain.lin@sunplusct.com) |
Mei Ligang (ligang@sunnorth.com.cn) |
Pei-Lin Tsai (pltsai@sunplus.com) |
This file is part of GAS, the GNU Assembler. |
GAS is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3, or (at your option) |
any later version. |
GAS is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with GAS; see the file COPYING3. If not, write to the Free |
Software Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA |
02110-1301, USA. */ |
#ifndef SCORE_INST_H |
#define SCORE_INST_H |
#define LDST_UNALIGN_MASK 0x0000007f |
#define UA_LCB 0x00000060 |
#define UA_LCW 0x00000062 |
#define UA_LCE 0x00000066 |
#define UA_SCB 0x00000068 |
#define UA_SCW 0x0000006a |
#define UA_SCE 0x0000006e |
#define UA_LL 0x0000000c |
#define UA_SC 0x0000000e |
#define LDST16_RR_MASK 0x0000000f |
#define N16_LW 8 |
#define N16_LH 9 |
#define N16_POP 10 |
#define N16_LBU 11 |
#define N16_SW 12 |
#define N16_SH 13 |
#define N16_PUSH 14 |
#define N16_SB 15 |
#define LDST16_RI_MASK 0x7007 |
#define N16_LWP 0x7000 |
#define N16_LHP 0x7001 |
#define N16_LBUP 0x7003 |
#define N16_SWP 0x7004 |
#define N16_SHP 0x7005 |
#define N16_SBP 0x7007 |
#define N16_LIU 0x5000 |
#define OPC_PSEUDOLDST_MASK 0x00000007 |
enum |
{ |
INSN_LW = 0, |
INSN_LH = 1, |
INSN_LHU = 2, |
INSN_LB = 3, |
INSN_SW = 4, |
INSN_SH = 5, |
INSN_LBU = 6, |
INSN_SB = 7, |
}; |
/* Sub opcdoe opcode. */ |
enum |
{ |
INSN16_LBU = 11, |
INSN16_LH = 9, |
INSN16_LW = 8, |
INSN16_SB = 15, |
INSN16_SH = 13, |
INSN16_SW = 12, |
}; |
enum |
{ |
LDST_NOUPDATE = 0, |
LDST_PRE = 1, |
LDST_POST = 2, |
}; |
enum score_insn_type |
{ |
Rd_I4, |
Rd_I5, |
Rd_rvalueBP_I5, |
Rd_lvalueBP_I5, |
Rd_Rs_I5, |
x_Rs_I5, |
x_I5_x, |
Rd_I8, |
Rd_Rs_I14, |
I15, |
Rd_I16, |
Rd_I30, |
Rd_I32, |
Rd_rvalueRs_SI10, |
Rd_lvalueRs_SI10, |
Rd_rvalueRs_preSI12, |
Rd_rvalueRs_postSI12, |
Rd_lvalueRs_preSI12, |
Rd_lvalueRs_postSI12, |
Rd_Rs_SI14, |
Rd_rvalueRs_SI15, |
Rd_lvalueRs_SI15, |
Rd_SI5, |
Rd_SI6, |
Rd_SI16, |
PC_DISP8div2, |
PC_DISP11div2, |
PC_DISP19div2, |
PC_DISP24div2, |
Rd_Rs_Rs, |
x_Rs_x, |
x_Rs_Rs, |
Rd_Rs_x, |
Rd_x_Rs, |
Rd_x_x, |
Rd_Rs, |
Rd_HighRs, |
Rd_lvalueRs, |
Rd_rvalueRs, |
Rd_lvalue32Rs, |
Rd_rvalue32Rs, |
x_Rs, |
NO_OPD, |
NO16_OPD, |
OP5_rvalueRs_SI15, |
I5_Rs_Rs_I5_OP5, |
x_rvalueRs_post4, |
Rd_rvalueRs_post4, |
Rd_x_I5, |
Rd_lvalueRs_post4, |
x_lvalueRs_post4, |
Rd_LowRs, |
Rd_Rs_Rs_imm, |
Insn_Type_PCE, |
Insn_Type_SYN, |
Insn_GP, |
Insn_PIC, |
Insn_internal, |
Insn_BCMP, |
Ra_I9_I5, |
}; |
enum score_data_type |
{ |
_IMM4 = 0, |
_IMM5, |
_IMM8, |
_IMM14, |
_IMM15, |
_IMM16, |
_SIMM10 = 6, |
_SIMM12, |
_SIMM14, |
_SIMM15, |
_SIMM16, |
_SIMM14_NEG = 11, |
_IMM16_NEG, |
_SIMM16_NEG, |
_IMM20, |
_IMM25, |
_DISP8div2 = 16, |
_DISP11div2, |
_DISP19div2, |
_DISP24div2, |
_VALUE, |
_VALUE_HI16, |
_VALUE_LO16, |
_VALUE_LDST_LO16 = 23, |
_SIMM16_LA, |
_IMM5_RSHIFT_1, |
_IMM5_RSHIFT_2, |
_SIMM16_LA_POS, |
_IMM5_RANGE_8_31, |
_IMM10_RSHIFT_2, |
_GP_IMM15 = 30, |
_GP_IMM14 = 31, |
_SIMM16_pic = 42, /* Index in score_df_range. */ |
_IMM16_LO16_pic = 43, |
_IMM16_pic = 44, |
_SIMM5 = 45, |
_SIMM6 = 46, |
_IMM32 = 47, |
_SIMM32 = 48, |
_IMM11 = 49, |
_IMM5_MULTI_LOAD = 50, |
}; |
#define REG_TMP 1 |
#define OP_REG_TYPE (1 << 6) |
#define OP_IMM_TYPE (1 << 7) |
#define OP_SH_REGD (OP_REG_TYPE |20) |
#define OP_SH_REGS1 (OP_REG_TYPE |15) |
#define OP_SH_REGS2 (OP_REG_TYPE |10) |
#define OP_SH_I (OP_IMM_TYPE | 1) |
#define OP_SH_RI15 (OP_IMM_TYPE | 0) |
#define OP_SH_I12 (OP_IMM_TYPE | 3) |
#define OP_SH_DISP24 (OP_IMM_TYPE | 1) |
#define OP_SH_DISP19_p1 (OP_IMM_TYPE |15) |
#define OP_SH_DISP19_p2 (OP_IMM_TYPE | 1) |
#define OP_SH_I5 (OP_IMM_TYPE |10) |
#define OP_SH_I10 (OP_IMM_TYPE | 5) |
#define OP_SH_COPID (OP_IMM_TYPE | 5) |
#define OP_SH_TRAPI5 (OP_IMM_TYPE |15) |
#define OP_SH_I15 (OP_IMM_TYPE |10) |
#define OP16_SH_REGD (OP_REG_TYPE | 8) |
#define OP16_SH_REGS1 (OP_REG_TYPE | 4) |
#define OP16_SH_I45 (OP_IMM_TYPE | 3) |
#define OP16_SH_I8 (OP_IMM_TYPE | 0) |
#define OP16_SH_DISP8 (OP_IMM_TYPE | 0) |
#define OP16_SH_DISP11 (OP_IMM_TYPE | 1) |
enum insn_class |
{ |
INSN_CLASS_16, |
INSN_CLASS_32, |
INSN_CLASS_48, |
INSN_CLASS_PCE, |
INSN_CLASS_SYN |
}; |
/* s3_s7: Globals for both tc-score.c and elf32-score.c. */ |
extern int score3; |
extern int score7; |
#endif |
/contrib/toolchain/binutils/include/opcode/sparc.h |
---|
0,0 → 1,280 |
/* Definitions for opcode table for the sparc. |
Copyright 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000, 2002, |
2003, 2005, 2010, 2011 Free Software Foundation, Inc. |
This file is part of GAS, the GNU Assembler, GDB, the GNU debugger, and |
the GNU Binutils. |
GAS/GDB is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3, or (at your option) |
any later version. |
GAS/GDB is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with GAS or GDB; see the file COPYING3. If not, write to |
the Free Software Foundation, 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
#include "ansidecl.h" |
/* The SPARC opcode table (and other related data) is defined in |
the opcodes library in sparc-opc.c. If you change anything here, make |
sure you fix up that file, and vice versa. */ |
/* FIXME-someday: perhaps the ,a's and such should be embedded in the |
instruction's name rather than the args. This would make gas faster, pinsn |
slower, but would mess up some macros a bit. xoxorich. */ |
/* List of instruction sets variations. |
These values are such that each element is either a superset of a |
preceding each one or they conflict in which case SPARC_OPCODE_CONFLICT_P |
returns non-zero. |
The values are indices into `sparc_opcode_archs' defined in sparc-opc.c. |
Don't change this without updating sparc-opc.c. */ |
enum sparc_opcode_arch_val |
{ |
SPARC_OPCODE_ARCH_V6 = 0, |
SPARC_OPCODE_ARCH_V7, |
SPARC_OPCODE_ARCH_V8, |
SPARC_OPCODE_ARCH_LEON, |
SPARC_OPCODE_ARCH_SPARCLET, |
SPARC_OPCODE_ARCH_SPARCLITE, |
/* V9 variants must appear last. */ |
SPARC_OPCODE_ARCH_V9, |
SPARC_OPCODE_ARCH_V9A, /* V9 with ultrasparc additions. */ |
SPARC_OPCODE_ARCH_V9B, /* V9 with ultrasparc and cheetah additions. */ |
SPARC_OPCODE_ARCH_BAD /* Error return from sparc_opcode_lookup_arch. */ |
}; |
/* The highest architecture in the table. */ |
#define SPARC_OPCODE_ARCH_MAX (SPARC_OPCODE_ARCH_BAD - 1) |
/* Given an enum sparc_opcode_arch_val, return the bitmask to use in |
insn encoding/decoding. */ |
#define SPARC_OPCODE_ARCH_MASK(arch) (1 << (arch)) |
/* Given a valid sparc_opcode_arch_val, return non-zero if it's v9. */ |
#define SPARC_OPCODE_ARCH_V9_P(arch) ((arch) >= SPARC_OPCODE_ARCH_V9) |
/* Table of cpu variants. */ |
typedef struct sparc_opcode_arch |
{ |
const char *name; |
/* Mask of sparc_opcode_arch_val's supported. |
EG: For v7 this would be |
(SPARC_OPCODE_ARCH_MASK (..._V6) | SPARC_OPCODE_ARCH_MASK (..._V7)). |
These are short's because sparc_opcode.architecture is. */ |
short supported; |
} sparc_opcode_arch; |
extern const struct sparc_opcode_arch sparc_opcode_archs[]; |
/* Given architecture name, look up it's sparc_opcode_arch_val value. */ |
extern enum sparc_opcode_arch_val sparc_opcode_lookup_arch (const char *); |
/* Return the bitmask of supported architectures for ARCH. */ |
#define SPARC_OPCODE_SUPPORTED(ARCH) (sparc_opcode_archs[ARCH].supported) |
/* Non-zero if ARCH1 conflicts with ARCH2. |
IE: ARCH1 as a supported bit set that ARCH2 doesn't, and vice versa. */ |
#define SPARC_OPCODE_CONFLICT_P(ARCH1, ARCH2) \ |
(((SPARC_OPCODE_SUPPORTED (ARCH1) & SPARC_OPCODE_SUPPORTED (ARCH2)) \ |
!= SPARC_OPCODE_SUPPORTED (ARCH1)) \ |
&& ((SPARC_OPCODE_SUPPORTED (ARCH1) & SPARC_OPCODE_SUPPORTED (ARCH2)) \ |
!= SPARC_OPCODE_SUPPORTED (ARCH2))) |
/* Structure of an opcode table entry. */ |
typedef struct sparc_opcode |
{ |
const char *name; |
unsigned long match; /* Bits that must be set. */ |
unsigned long lose; /* Bits that must not be set. */ |
const char *args; |
/* This was called "delayed" in versions before the flags. */ |
unsigned int flags; |
unsigned int hwcaps; |
short architecture; /* Bitmask of sparc_opcode_arch_val's. */ |
} sparc_opcode; |
/* FIXME: Add F_ANACHRONISTIC flag for v9. */ |
#define F_DELAYED 0x00000001 /* Delayed branch. */ |
#define F_ALIAS 0x00000002 /* Alias for a "real" instruction. */ |
#define F_UNBR 0x00000004 /* Unconditional branch. */ |
#define F_CONDBR 0x00000008 /* Conditional branch. */ |
#define F_JSR 0x00000010 /* Subroutine call. */ |
#define F_FLOAT 0x00000020 /* Floating point instruction (not a branch). */ |
#define F_FBR 0x00000040 /* Floating point branch. */ |
#define F_PREFERRED 0x00000080 /* A preferred alias. */ |
#define F_PREF_ALIAS (F_ALIAS|F_PREFERRED) |
/* These must match the HWCAP_* values precisely. */ |
#define HWCAP_MUL32 0x00000001 /* umul/umulcc/smul/smulcc insns */ |
#define HWCAP_DIV32 0x00000002 /* udiv/udivcc/sdiv/sdivcc insns */ |
#define HWCAP_FSMULD 0x00000004 /* 'fsmuld' insn */ |
#define HWCAP_V8PLUS 0x00000008 /* v9 insns available to 32bit */ |
#define HWCAP_POPC 0x00000010 /* 'popc' insn */ |
#define HWCAP_VIS 0x00000020 /* VIS insns */ |
#define HWCAP_VIS2 0x00000040 /* VIS2 insns */ |
#define HWCAP_ASI_BLK_INIT \ |
0x00000080 /* block init ASIs */ |
#define HWCAP_FMAF 0x00000100 /* fused multiply-add */ |
#define HWCAP_VIS3 0x00000400 /* VIS3 insns */ |
#define HWCAP_HPC 0x00000800 /* HPC insns */ |
#define HWCAP_RANDOM 0x00001000 /* 'random' insn */ |
#define HWCAP_TRANS 0x00002000 /* transaction insns */ |
#define HWCAP_FJFMAU 0x00004000 /* unfused multiply-add */ |
#define HWCAP_IMA 0x00008000 /* integer multiply-add */ |
#define HWCAP_ASI_CACHE_SPARING \ |
0x00010000 /* cache sparing ASIs */ |
#define HWCAP_AES 0x00020000 /* AES crypto insns */ |
#define HWCAP_DES 0x00040000 /* DES crypto insns */ |
#define HWCAP_KASUMI 0x00080000 /* KASUMI crypto insns */ |
#define HWCAP_CAMELLIA 0x00100000 /* CAMELLIA crypto insns */ |
#define HWCAP_MD5 0x00200000 /* MD5 hashing insns */ |
#define HWCAP_SHA1 0x00400000 /* SHA1 hashing insns */ |
#define HWCAP_SHA256 0x00800000 /* SHA256 hashing insns */ |
#define HWCAP_SHA512 0x01000000 /* SHA512 hashing insns */ |
#define HWCAP_MPMUL 0x02000000 /* Multiple Precision Multiply */ |
#define HWCAP_MONT 0x04000000 /* Montgomery Mult/Sqrt */ |
#define HWCAP_PAUSE 0x08000000 /* Pause insn */ |
#define HWCAP_CBCOND 0x10000000 /* Compare and Branch insns */ |
#define HWCAP_CRC32C 0x20000000 /* CRC32C insn */ |
/* All sparc opcodes are 32 bits, except for the `set' instruction (really a |
macro), which is 64 bits. It is handled as a special case. |
The match component is a mask saying which bits must match a particular |
opcode in order for an instruction to be an instance of that opcode. |
The args component is a string containing one character for each operand of the |
instruction. |
Kinds of operands: |
# Number used by optimizer. It is ignored. |
1 rs1 register. |
2 rs2 register. |
d rd register. |
e frs1 floating point register. |
v frs1 floating point register (double/even). |
V frs1 floating point register (quad/multiple of 4). |
f frs2 floating point register. |
B frs2 floating point register (double/even). |
R frs2 floating point register (quad/multiple of 4). |
4 frs3 floating point register. |
5 frs3 floating point register (doube/even). |
g frsd floating point register. |
H frsd floating point register (double/even). |
J frsd floating point register (quad/multiple of 4). |
b crs1 coprocessor register |
c crs2 coprocessor register |
D crsd coprocessor register |
m alternate space register (asr) in rd |
M alternate space register (asr) in rs1 |
h 22 high bits. |
X 5 bit unsigned immediate |
Y 6 bit unsigned immediate |
3 SIAM mode (3 bits). (v9b) |
K MEMBAR mask (7 bits). (v9) |
j 10 bit Immediate. (v9) |
I 11 bit Immediate. (v9) |
i 13 bit Immediate. |
n 22 bit immediate. |
k 2+14 bit PC relative immediate. (v9) |
G 19 bit PC relative immediate. (v9) |
l 22 bit PC relative immediate. |
L 30 bit PC relative immediate. |
a Annul. The annul bit is set. |
A Alternate address space. Stored as 8 bits. |
C Coprocessor state register. |
F floating point state register. |
p Processor state register. |
N Branch predict clear ",pn" (v9) |
T Branch predict set ",pt" (v9) |
z %icc. (v9) |
Z %xcc. (v9) |
q Floating point queue. |
r Single register that is both rs1 and rd. |
O Single register that is both rs2 and rd. |
Q Coprocessor queue. |
S Special case. |
t Trap base register. |
w Window invalid mask register. |
y Y register. |
u sparclet coprocessor registers in rd position |
U sparclet coprocessor registers in rs1 position |
E %ccr. (v9) |
s %fprs. (v9) |
P %pc. (v9) |
W %tick. (v9) |
o %asi. (v9) |
6 %fcc0. (v9) |
7 %fcc1. (v9) |
8 %fcc2. (v9) |
9 %fcc3. (v9) |
! Privileged Register in rd (v9) |
? Privileged Register in rs1 (v9) |
* Prefetch function constant. (v9) |
x OPF field (v9 impdep). |
0 32/64 bit immediate for set or setx (v9) insns |
_ Ancillary state register in rd (v9a) |
/ Ancillary state register in rs1 (v9a) |
( entire floating point state register (%efsr) |
) 5 bit immediate placed in RS3 field |
= 2+8 bit PC relative immediate. (v9) */ |
#define OP2(x) (((x) & 0x7) << 22) /* Op2 field of format2 insns. */ |
#define OP3(x) (((x) & 0x3f) << 19) /* Op3 field of format3 insns. */ |
#define OP(x) ((unsigned) ((x) & 0x3) << 30) /* Op field of all insns. */ |
#define OPF(x) (((x) & 0x1ff) << 5) /* Opf field of float insns. */ |
#define OPF_LOW5(x) OPF ((x) & 0x1f) /* V9. */ |
#define OPF_LOW4(x) OPF ((x) & 0xf) /* V9. */ |
#define F3F(x, y, z) (OP (x) | OP3 (y) | OPF (z)) /* Format3 float insns. */ |
#define F3F4(x, y, z) (OP (x) | OP3 (y) | OPF_LOW4 (z)) |
#define F3I(x) (((x) & 0x1) << 13) /* Immediate field of format 3 insns. */ |
#define F2(x, y) (OP (x) | OP2(y)) /* Format 2 insns. */ |
#define F3(x, y, z) (OP (x) | OP3(y) | F3I(z)) /* Format3 insns. */ |
#define F1(x) (OP (x)) |
#define DISP30(x) ((x) & 0x3fffffff) |
#define ASI(x) (((x) & 0xff) << 5) /* Asi field of format3 insns. */ |
#define RS2(x) ((x) & 0x1f) /* Rs2 field. */ |
#define SIMM13(x) ((x) & 0x1fff) /* Simm13 field. */ |
#define RD(x) (((x) & 0x1f) << 25) /* Destination register field. */ |
#define RS1(x) (((x) & 0x1f) << 14) /* Rs1 field. */ |
#define RS3(x) (((x) & 0x1f) << 9) /* Rs3 field. */ |
#define ASI_RS2(x) (SIMM13 (x)) |
#define MEMBAR(x) ((x) & 0x7f) |
#define SLCPOP(x) (((x) & 0x7f) << 6) /* Sparclet cpop. */ |
#define ANNUL (1 << 29) |
#define BPRED (1 << 19) /* V9. */ |
#define IMMED F3I (1) |
#define RD_G0 RD (~0) |
#define RS1_G0 RS1 (~0) |
#define RS2_G0 RS2 (~0) |
extern const struct sparc_opcode sparc_opcodes[]; |
extern const int sparc_num_opcodes; |
extern int sparc_encode_asi (const char *); |
extern const char *sparc_decode_asi (int); |
extern int sparc_encode_membar (const char *); |
extern const char *sparc_decode_membar (int); |
extern int sparc_encode_prefetch (const char *); |
extern const char *sparc_decode_prefetch (int); |
extern int sparc_encode_sparclet_cpreg (const char *); |
extern const char *sparc_decode_sparclet_cpreg (int); |
/* Local Variables: |
fill-column: 131 |
comment-column: 0 |
End: */ |
/contrib/toolchain/binutils/include/opcode/spu-insns.h |
---|
0,0 → 1,417 |
/* SPU ELF support for BFD. |
Copyright 2006, 2007, 2010 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
/* SPU Opcode Table |
-=-=-= FORMAT =-=-=- |
+----+-------+-------+-------+-------+ +------------+-------+-------+-------+ |
RRR | op | RC | RB | RA | RT | RI7 | op | I7 | RA | RT | |
+----+-------+-------+-------+-------+ +------------+-------+-------+-------+ |
0 3 1 1 2 3 0 1 1 2 3 |
0 7 4 1 0 7 4 1 |
+-----------+--------+-------+-------+ +---------+----------+-------+-------+ |
RI8 | op | I8 | RA | RT | RI10 | op | I10 | RA | RT | |
+-----------+--------+-------+-------+ +---------+----------+-------+-------+ |
0 9 1 2 3 0 7 1 2 3 |
7 4 1 7 4 1 |
+----------+-----------------+-------+ +--------+-------------------+-------+ |
RI16 | op | I16 | RT | RI18 | op | I18 | RT | |
+----------+-----------------+-------+ +--------+-------------------+-------+ |
0 8 2 3 0 6 2 3 |
4 1 4 1 |
+------------+-------+-------+-------+ +-------+--+-----------------+-------+ |
RR | op | RB | RA | RT | LBT | op |RO| I16 | RO | |
+------------+-------+-------+-------+ +-------+--+-----------------+-------+ |
0 1 1 2 3 0 6 8 2 3 |
0 7 4 1 4 1 |
+------------+----+--+-------+-------+ |
LBTI | op | // |RO| RA | RO | |
+------------+----+--+-------+-------+ |
0 1 1 1 2 3 |
0 5 7 4 1 |
-=-=-= OPCODE =-=-=- |
OPCODE field specifies the most significant 11bit of the instruction. Some formats don't have 11bits for opcode field, and in this |
case, bit field other than op are defined as 0s. For example, opcode of fma instruction which is RRR format is defined as 0x700, |
since 0x700 -> 11'b11100000000, this means opcode is 4'b1110, and other 7bits are defined as 7'b0000000. |
-=-=-= ASM_FORMAT =-=-=- |
RRR category RI7 category |
ASM_RRR mnemonic RC, RA, RB, RT ASM_RI4 mnemonic RT, RA, I4 |
ASM_RI7 mnemonic RT, RA, I7 |
RI8 category RI10 category |
ASM_RUI8 mnemonic RT, RA, UI8 ASM_AI10 mnemonic RA, I10 |
ASM_RI10 mnemonic RT, RA, R10 |
ASM_RI10IDX mnemonic RT, I10(RA) |
RI16 category RI18 category |
ASM_I16W mnemonic I16W ASM_RI18 mnemonic RT, I18 |
ASM_RI16 mnemonic RT, I16 |
ASM_RI16W mnemonic RT, I16W |
RR category LBT category |
ASM_MFSPR mnemonic RT, SA ASM_LBT mnemonic brinst, brtarg |
ASM_MTSPR mnemonic SA, RT |
ASM_NOOP mnemonic LBTI category |
ASM_RA mnemonic RA ASM_LBTI mnemonic brinst, RA |
ASM_RAB mnemonic RA, RB |
ASM_RDCH mnemonic RT, CA |
ASM_RR mnemonic RT, RA, RB |
ASM_RT mnemonic RT |
ASM_RTA mnemonic RT, RA |
ASM_WRCH mnemonic CA, RT |
Note that RRR instructions have the names for RC and RT reversed from |
what's in the ISA, in order to put RT in the same position it appears |
for other formats. |
-=-=-= DEPENDENCY =-=-=- |
DEPENDENCY filed consists of 5 digits. This represents which register is used as source and which register is used as target. |
The first(most significant) digit is always 0. Then it is followd by RC, RB, RA and RT digits. |
If the digit is 0, this means the corresponding register is not used in the instruction. |
If the digit is 1, this means the corresponding register is used as a source in the instruction. |
If the digit is 2, this means the corresponding register is used as a target in the instruction. |
If the digit is 3, this means the corresponding register is used as both source and target in the instruction. |
For example, fms instruction has 00113 as the DEPENDENCY field. This means RC is not used in this operation, RB and RA are |
used as sources and RT is the target. |
-=-=-= PIPE =-=-=- |
This field shows which execution pipe is used for the instruction |
pipe0 execution pipelines: |
FP6 SP floating pipeline |
FP7 integer operations executed in SP floating pipeline |
FPD DP floating pipeline |
FX2 FXU pipeline |
FX3 Rotate/Shift pipeline |
FXB Byte pipeline |
NOP No pipeline |
pipe1 execution pipelines: |
BR Branch pipeline |
LNOP No pipeline |
LS Load/Store pipeline |
SHUF Shuffle pipeline |
SPR SPR/CH pipeline |
*/ |
#define _A0() {0} |
#define _A1(a) {1,a} |
#define _A2(a,b) {2,a,b} |
#define _A3(a,b,c) {3,a,b,c} |
#define _A4(a,b,c,d) {4,a,b,c,d} |
/* TAG FORMAT OPCODE MNEMONIC ASM_FORMAT DEPENDENCY PIPE COMMENT */ |
/* 0[RC][RB][RA][RT] */ |
/* 1:src, 2:target */ |
APUOP(M_BR, RI16, 0x190, "br", _A1(A_R18), 00000, BR) /* BRel IP<-IP+I16 */ |
APUOP(M_BRSL, RI16, 0x198, "brsl", _A2(A_T,A_R18), 00002, BR) /* BRelSetLink RT,IP<-IP,IP+I16 */ |
APUOP(M_BRA, RI16, 0x180, "bra", _A1(A_S18), 00000, BR) /* BRAbs IP<-I16 */ |
APUOP(M_BRASL, RI16, 0x188, "brasl", _A2(A_T,A_S18), 00002, BR) /* BRAbsSetLink RT,IP<-IP,I16 */ |
APUOP(M_FSMBI, RI16, 0x194, "fsmbi", _A2(A_T,A_X16), 00002, SHUF) /* FormSelMask%I RT<-fsm(I16) */ |
APUOP(M_LQA, RI16, 0x184, "lqa", _A2(A_T,A_S18), 00002, LS) /* LoadQAbs RT<-M[I16] */ |
APUOP(M_LQR, RI16, 0x19C, "lqr", _A2(A_T,A_R18), 00002, LS) /* LoadQRel RT<-M[IP+I16] */ |
APUOP(M_STOP, RR, 0x000, "stop", _A0(), 00000, BR) /* STOP stop */ |
APUOP(M_STOP2, RR, 0x000, "stop", _A1(A_U14), 00000, BR) /* STOP stop */ |
APUOP(M_STOPD, RR, 0x140, "stopd", _A3(A_T,A_A,A_B), 00111, BR) /* STOPD stop (with register dependencies) */ |
APUOP(M_LNOP, RR, 0x001, "lnop", _A0(), 00000, LNOP) /* LNOP no_operation */ |
APUOP(M_SYNC, RR, 0x002, "sync", _A0(), 00000, BR) /* SYNC flush_pipe */ |
APUOP(M_DSYNC, RR, 0x003, "dsync", _A0(), 00000, BR) /* DSYNC flush_store_queue */ |
APUOP(M_MFSPR, RR, 0x00c, "mfspr", _A2(A_T,A_S), 00002, SPR) /* MFSPR RT<-SA */ |
APUOP(M_RDCH, RR, 0x00d, "rdch", _A2(A_T,A_H), 00002, SPR) /* ReaDCHannel RT<-CA:data */ |
APUOP(M_RCHCNT, RR, 0x00f, "rchcnt", _A2(A_T,A_H), 00002, SPR) /* ReaDCHanCouNT RT<-CA:count */ |
APUOP(M_HBRA, LBT, 0x080, "hbra", _A2(A_S11,A_S18), 00000, LS) /* HBRA BTB[B9]<-M[I16] */ |
APUOP(M_HBRR, LBT, 0x090, "hbrr", _A2(A_S11,A_R18), 00000, LS) /* HBRR BTB[B9]<-M[IP+I16] */ |
APUOP(M_BRZ, RI16, 0x100, "brz", _A2(A_T,A_R18), 00001, BR) /* BRZ IP<-IP+I16_if(RT) */ |
APUOP(M_BRNZ, RI16, 0x108, "brnz", _A2(A_T,A_R18), 00001, BR) /* BRNZ IP<-IP+I16_if(RT) */ |
APUOP(M_BRHZ, RI16, 0x110, "brhz", _A2(A_T,A_R18), 00001, BR) /* BRHZ IP<-IP+I16_if(RT) */ |
APUOP(M_BRHNZ, RI16, 0x118, "brhnz", _A2(A_T,A_R18), 00001, BR) /* BRHNZ IP<-IP+I16_if(RT) */ |
APUOP(M_STQA, RI16, 0x104, "stqa", _A2(A_T,A_S18), 00001, LS) /* SToreQAbs M[I16]<-RT */ |
APUOP(M_STQR, RI16, 0x11C, "stqr", _A2(A_T,A_R18), 00001, LS) /* SToreQRel M[IP+I16]<-RT */ |
APUOP(M_MTSPR, RR, 0x10c, "mtspr", _A2(A_S,A_T), 00001, SPR) /* MTSPR SA<-RT */ |
APUOP(M_WRCH, RR, 0x10d, "wrch", _A2(A_H,A_T), 00001, SPR) /* ChanWRite CA<-RT */ |
APUOP(M_LQD, RI10, 0x1a0, "lqd", _A4(A_T,A_S14,A_P,A_A), 00012, LS) /* LoadQDisp RT<-M[Ra+I10] */ |
APUOP(M_BI, RR, 0x1a8, "bi", _A1(A_A), 00010, BR) /* BI IP<-RA */ |
APUOP(M_BISL, RR, 0x1a9, "bisl", _A2(A_T,A_A), 00012, BR) /* BISL RT,IP<-IP,RA */ |
APUOP(M_IRET, RR, 0x1aa, "iret", _A1(A_A), 00010, BR) /* IRET IP<-SRR0 */ |
APUOP(M_IRET2, RR, 0x1aa, "iret", _A0(), 00010, BR) /* IRET IP<-SRR0 */ |
APUOP(M_BISLED, RR, 0x1ab, "bisled", _A2(A_T,A_A), 00012, BR) /* BISLED RT,IP<-IP,RA_if(ext) */ |
APUOP(M_HBR, LBTI, 0x1ac, "hbr", _A2(A_S11I,A_A), 00010, LS) /* HBR BTB[B9]<-M[Ra] */ |
APUOP(M_FREST, RR, 0x1b8, "frest", _A2(A_T,A_A), 00012, SHUF) /* FREST RT<-recip(RA) */ |
APUOP(M_FRSQEST, RR, 0x1b9, "frsqest", _A2(A_T,A_A), 00012, SHUF) /* FRSQEST RT<-rsqrt(RA) */ |
APUOP(M_FSM, RR, 0x1b4, "fsm", _A2(A_T,A_A), 00012, SHUF) /* FormSelMask% RT<-expand(Ra) */ |
APUOP(M_FSMH, RR, 0x1b5, "fsmh", _A2(A_T,A_A), 00012, SHUF) /* FormSelMask% RT<-expand(Ra) */ |
APUOP(M_FSMB, RR, 0x1b6, "fsmb", _A2(A_T,A_A), 00012, SHUF) /* FormSelMask% RT<-expand(Ra) */ |
APUOP(M_GB, RR, 0x1b0, "gb", _A2(A_T,A_A), 00012, SHUF) /* GatherBits% RT<-gather(RA) */ |
APUOP(M_GBH, RR, 0x1b1, "gbh", _A2(A_T,A_A), 00012, SHUF) /* GatherBits% RT<-gather(RA) */ |
APUOP(M_GBB, RR, 0x1b2, "gbb", _A2(A_T,A_A), 00012, SHUF) /* GatherBits% RT<-gather(RA) */ |
APUOP(M_CBD, RI7, 0x1f4, "cbd", _A4(A_T,A_U7,A_P,A_A), 00012, SHUF) /* genCtl%%insD RT<-sta(Ra+I4,siz) */ |
APUOP(M_CHD, RI7, 0x1f5, "chd", _A4(A_T,A_U7,A_P,A_A), 00012, SHUF) /* genCtl%%insD RT<-sta(Ra+I4,siz) */ |
APUOP(M_CWD, RI7, 0x1f6, "cwd", _A4(A_T,A_U7,A_P,A_A), 00012, SHUF) /* genCtl%%insD RT<-sta(Ra+I4,siz) */ |
APUOP(M_CDD, RI7, 0x1f7, "cdd", _A4(A_T,A_U7,A_P,A_A), 00012, SHUF) /* genCtl%%insD RT<-sta(Ra+I4,siz) */ |
APUOP(M_ROTQBII, RI7, 0x1f8, "rotqbii", _A3(A_T,A_A,A_U3), 00012, SHUF) /* ROTQBII RT<-RA<<<I7 */ |
APUOP(M_ROTQBYI, RI7, 0x1fc, "rotqbyi", _A3(A_T,A_A,A_S7N), 00012, SHUF) /* ROTQBYI RT<-RA<<<(I7*8) */ |
APUOP(M_ROTQMBII, RI7, 0x1f9, "rotqmbii", _A3(A_T,A_A,A_S3), 00012, SHUF) /* ROTQMBII RT<-RA<<I7 */ |
APUOP(M_ROTQMBYI, RI7, 0x1fd, "rotqmbyi", _A3(A_T,A_A,A_S6), 00012, SHUF) /* ROTQMBYI RT<-RA<<I7 */ |
APUOP(M_SHLQBII, RI7, 0x1fb, "shlqbii", _A3(A_T,A_A,A_U3), 00012, SHUF) /* SHLQBII RT<-RA<<I7 */ |
APUOP(M_SHLQBYI, RI7, 0x1ff, "shlqbyi", _A3(A_T,A_A,A_U5), 00012, SHUF) /* SHLQBYI RT<-RA<<I7 */ |
APUOP(M_STQD, RI10, 0x120, "stqd", _A4(A_T,A_S14,A_P,A_A), 00011, LS) /* SToreQDisp M[Ra+I10]<-RT */ |
APUOP(M_BIHNZ, RR, 0x12b, "bihnz", _A2(A_T,A_A), 00011, BR) /* BIHNZ IP<-RA_if(RT) */ |
APUOP(M_BIHZ, RR, 0x12a, "bihz", _A2(A_T,A_A), 00011, BR) /* BIHZ IP<-RA_if(RT) */ |
APUOP(M_BINZ, RR, 0x129, "binz", _A2(A_T,A_A), 00011, BR) /* BINZ IP<-RA_if(RT) */ |
APUOP(M_BIZ, RR, 0x128, "biz", _A2(A_T,A_A), 00011, BR) /* BIZ IP<-RA_if(RT) */ |
APUOP(M_CBX, RR, 0x1d4, "cbx", _A3(A_T,A_A,A_B), 00112, SHUF) /* genCtl%%insX RT<-sta(Ra+Rb,siz) */ |
APUOP(M_CHX, RR, 0x1d5, "chx", _A3(A_T,A_A,A_B), 00112, SHUF) /* genCtl%%insX RT<-sta(Ra+Rb,siz) */ |
APUOP(M_CWX, RR, 0x1d6, "cwx", _A3(A_T,A_A,A_B), 00112, SHUF) /* genCtl%%insX RT<-sta(Ra+Rb,siz) */ |
APUOP(M_CDX, RR, 0x1d7, "cdx", _A3(A_T,A_A,A_B), 00112, SHUF) /* genCtl%%insX RT<-sta(Ra+Rb,siz) */ |
APUOP(M_LQX, RR, 0x1c4, "lqx", _A3(A_T,A_A,A_B), 00112, LS) /* LoadQindeX RT<-M[Ra+Rb] */ |
APUOP(M_ROTQBI, RR, 0x1d8, "rotqbi", _A3(A_T,A_A,A_B), 00112, SHUF) /* ROTQBI RT<-RA<<<Rb */ |
APUOP(M_ROTQMBI, RR, 0x1d9, "rotqmbi", _A3(A_T,A_A,A_B), 00112, SHUF) /* ROTQMBI RT<-RA<<Rb */ |
APUOP(M_SHLQBI, RR, 0x1db, "shlqbi", _A3(A_T,A_A,A_B), 00112, SHUF) /* SHLQBI RT<-RA<<Rb */ |
APUOP(M_ROTQBY, RR, 0x1dc, "rotqby", _A3(A_T,A_A,A_B), 00112, SHUF) /* ROTQBY RT<-RA<<<(Rb*8) */ |
APUOP(M_ROTQMBY, RR, 0x1dd, "rotqmby", _A3(A_T,A_A,A_B), 00112, SHUF) /* ROTQMBY RT<-RA<<Rb */ |
APUOP(M_SHLQBY, RR, 0x1df, "shlqby", _A3(A_T,A_A,A_B), 00112, SHUF) /* SHLQBY RT<-RA<<Rb */ |
APUOP(M_ROTQBYBI, RR, 0x1cc, "rotqbybi", _A3(A_T,A_A,A_B), 00112, SHUF) /* ROTQBYBI RT<-RA<<Rb */ |
APUOP(M_ROTQMBYBI, RR, 0x1cd, "rotqmbybi", _A3(A_T,A_A,A_B), 00112, SHUF) /* ROTQMBYBI RT<-RA<<Rb */ |
APUOP(M_SHLQBYBI, RR, 0x1cf, "shlqbybi", _A3(A_T,A_A,A_B), 00112, SHUF) /* SHLQBYBI RT<-RA<<Rb */ |
APUOP(M_STQX, RR, 0x144, "stqx", _A3(A_T,A_A,A_B), 00111, LS) /* SToreQindeX M[Ra+Rb]<-RT */ |
APUOP(M_SHUFB, RRR, 0x580, "shufb", _A4(A_C,A_A,A_B,A_T), 02111, SHUF) /* SHUFfleBytes RC<-f(RA,RB,RT) */ |
APUOP(M_IL, RI16, 0x204, "il", _A2(A_T,A_S16), 00002, FX2) /* ImmLoad RT<-sxt(I16) */ |
APUOP(M_ILH, RI16, 0x20c, "ilh", _A2(A_T,A_X16), 00002, FX2) /* ImmLoadH RT<-I16 */ |
APUOP(M_ILHU, RI16, 0x208, "ilhu", _A2(A_T,A_X16), 00002, FX2) /* ImmLoadHUpper RT<-I16<<16 */ |
APUOP(M_ILA, RI18, 0x210, "ila", _A2(A_T,A_U18), 00002, FX2) /* ImmLoadAddr RT<-zxt(I18) */ |
APUOP(M_NOP, RR, 0x201, "nop", _A1(A_T), 00000, NOP) /* XNOP no_operation */ |
APUOP(M_NOP2, RR, 0x201, "nop", _A0(), 00000, NOP) /* XNOP no_operation */ |
APUOP(M_IOHL, RI16, 0x304, "iohl", _A2(A_T,A_X16), 00003, FX2) /* AddImmeXt RT<-RT+sxt(I16) */ |
APUOP(M_ANDBI, RI10, 0x0b0, "andbi", _A3(A_T,A_A,A_S10B), 00012, FX2) /* AND%I RT<-RA&I10 */ |
APUOP(M_ANDHI, RI10, 0x0a8, "andhi", _A3(A_T,A_A,A_S10), 00012, FX2) /* AND%I RT<-RA&I10 */ |
APUOP(M_ANDI, RI10, 0x0a0, "andi", _A3(A_T,A_A,A_S10), 00012, FX2) /* AND%I RT<-RA&I10 */ |
APUOP(M_ORBI, RI10, 0x030, "orbi", _A3(A_T,A_A,A_S10B), 00012, FX2) /* OR%I RT<-RA|I10 */ |
APUOP(M_ORHI, RI10, 0x028, "orhi", _A3(A_T,A_A,A_S10), 00012, FX2) /* OR%I RT<-RA|I10 */ |
APUOP(M_ORI, RI10, 0x020, "ori", _A3(A_T,A_A,A_S10), 00012, FX2) /* OR%I RT<-RA|I10 */ |
APUOP(M_ORX, RR, 0x1f0, "orx", _A2(A_T,A_A), 00012, BR) /* ORX RT<-RA.w0|RA.w1|RA.w2|RA.w3 */ |
APUOP(M_XORBI, RI10, 0x230, "xorbi", _A3(A_T,A_A,A_S10B), 00012, FX2) /* XOR%I RT<-RA^I10 */ |
APUOP(M_XORHI, RI10, 0x228, "xorhi", _A3(A_T,A_A,A_S10), 00012, FX2) /* XOR%I RT<-RA^I10 */ |
APUOP(M_XORI, RI10, 0x220, "xori", _A3(A_T,A_A,A_S10), 00012, FX2) /* XOR%I RT<-RA^I10 */ |
APUOP(M_AHI, RI10, 0x0e8, "ahi", _A3(A_T,A_A,A_S10), 00012, FX2) /* Add%Immed RT<-RA+I10 */ |
APUOP(M_AI, RI10, 0x0e0, "ai", _A3(A_T,A_A,A_S10), 00012, FX2) /* Add%Immed RT<-RA+I10 */ |
APUOP(M_SFHI, RI10, 0x068, "sfhi", _A3(A_T,A_A,A_S10), 00012, FX2) /* SubFrom%Imm RT<-I10-RA */ |
APUOP(M_SFI, RI10, 0x060, "sfi", _A3(A_T,A_A,A_S10), 00012, FX2) /* SubFrom%Imm RT<-I10-RA */ |
APUOP(M_CGTBI, RI10, 0x270, "cgtbi", _A3(A_T,A_A,A_S10B), 00012, FX2) /* CGT%I RT<-(RA>I10) */ |
APUOP(M_CGTHI, RI10, 0x268, "cgthi", _A3(A_T,A_A,A_S10), 00012, FX2) /* CGT%I RT<-(RA>I10) */ |
APUOP(M_CGTI, RI10, 0x260, "cgti", _A3(A_T,A_A,A_S10), 00012, FX2) /* CGT%I RT<-(RA>I10) */ |
APUOP(M_CLGTBI, RI10, 0x2f0, "clgtbi", _A3(A_T,A_A,A_S10B), 00012, FX2) /* CLGT%I RT<-(RA>I10) */ |
APUOP(M_CLGTHI, RI10, 0x2e8, "clgthi", _A3(A_T,A_A,A_S10), 00012, FX2) /* CLGT%I RT<-(RA>I10) */ |
APUOP(M_CLGTI, RI10, 0x2e0, "clgti", _A3(A_T,A_A,A_S10), 00012, FX2) /* CLGT%I RT<-(RA>I10) */ |
APUOP(M_CEQBI, RI10, 0x3f0, "ceqbi", _A3(A_T,A_A,A_S10B), 00012, FX2) /* CEQ%I RT<-(RA=I10) */ |
APUOP(M_CEQHI, RI10, 0x3e8, "ceqhi", _A3(A_T,A_A,A_S10), 00012, FX2) /* CEQ%I RT<-(RA=I10) */ |
APUOP(M_CEQI, RI10, 0x3e0, "ceqi", _A3(A_T,A_A,A_S10), 00012, FX2) /* CEQ%I RT<-(RA=I10) */ |
APUOP(M_HGTI, RI10, 0x278, "hgti", _A3(A_T,A_A,A_S10), 00010, FX2) /* HaltGTI halt_if(RA>I10) */ |
APUOP(M_HGTI2, RI10, 0x278, "hgti", _A2(A_A,A_S10), 00010, FX2) /* HaltGTI halt_if(RA>I10) */ |
APUOP(M_HLGTI, RI10, 0x2f8, "hlgti", _A3(A_T,A_A,A_S10), 00010, FX2) /* HaltLGTI halt_if(RA>I10) */ |
APUOP(M_HLGTI2, RI10, 0x2f8, "hlgti", _A2(A_A,A_S10), 00010, FX2) /* HaltLGTI halt_if(RA>I10) */ |
APUOP(M_HEQI, RI10, 0x3f8, "heqi", _A3(A_T,A_A,A_S10), 00010, FX2) /* HaltEQImm halt_if(RA=I10) */ |
APUOP(M_HEQI2, RI10, 0x3f8, "heqi", _A2(A_A,A_S10), 00010, FX2) /* HaltEQImm halt_if(RA=I10) */ |
APUOP(M_MPYI, RI10, 0x3a0, "mpyi", _A3(A_T,A_A,A_S10), 00012, FP7) /* MPYI RT<-RA*I10 */ |
APUOP(M_MPYUI, RI10, 0x3a8, "mpyui", _A3(A_T,A_A,A_S10), 00012, FP7) /* MPYUI RT<-RA*I10 */ |
APUOP(M_CFLTS, RI8, 0x3b0, "cflts", _A3(A_T,A_A,A_U7A), 00012, FP7) /* CFLTS RT<-int(RA,I8) */ |
APUOP(M_CFLTU, RI8, 0x3b2, "cfltu", _A3(A_T,A_A,A_U7A), 00012, FP7) /* CFLTU RT<-int(RA,I8) */ |
APUOP(M_CSFLT, RI8, 0x3b4, "csflt", _A3(A_T,A_A,A_U7B), 00012, FP7) /* CSFLT RT<-flt(RA,I8) */ |
APUOP(M_CUFLT, RI8, 0x3b6, "cuflt", _A3(A_T,A_A,A_U7B), 00012, FP7) /* CUFLT RT<-flt(RA,I8) */ |
APUOP(M_FESD, RR, 0x3b8, "fesd", _A2(A_T,A_A), 00012, FPD) /* FESD RT<-double(RA) */ |
APUOP(M_FRDS, RR, 0x3b9, "frds", _A2(A_T,A_A), 00012, FPD) /* FRDS RT<-single(RA) */ |
APUOP(M_FSCRRD, RR, 0x398, "fscrrd", _A1(A_T), 00002, FPD) /* FSCRRD RT<-FP_status */ |
APUOP(M_FSCRWR, RR, 0x3ba, "fscrwr", _A2(A_T,A_A), 00010, FP7) /* FSCRWR FP_status<-RA */ |
APUOP(M_FSCRWR2, RR, 0x3ba, "fscrwr", _A1(A_A), 00010, FP7) /* FSCRWR FP_status<-RA */ |
APUOP(M_CLZ, RR, 0x2a5, "clz", _A2(A_T,A_A), 00012, FX2) /* CLZ RT<-clz(RA) */ |
APUOP(M_CNTB, RR, 0x2b4, "cntb", _A2(A_T,A_A), 00012, FXB) /* CNT RT<-pop(RA) */ |
APUOP(M_XSBH, RR, 0x2b6, "xsbh", _A2(A_T,A_A), 00012, FX2) /* eXtSignBtoH RT<-sign_ext(RA) */ |
APUOP(M_XSHW, RR, 0x2ae, "xshw", _A2(A_T,A_A), 00012, FX2) /* eXtSignHtoW RT<-sign_ext(RA) */ |
APUOP(M_XSWD, RR, 0x2a6, "xswd", _A2(A_T,A_A), 00012, FX2) /* eXtSignWtoD RT<-sign_ext(RA) */ |
APUOP(M_ROTI, RI7, 0x078, "roti", _A3(A_T,A_A,A_S7N), 00012, FX3) /* ROT%I RT<-RA<<<I7 */ |
APUOP(M_ROTMI, RI7, 0x079, "rotmi", _A3(A_T,A_A,A_S7), 00012, FX3) /* ROT%MI RT<-RA<<I7 */ |
APUOP(M_ROTMAI, RI7, 0x07a, "rotmai", _A3(A_T,A_A,A_S7), 00012, FX3) /* ROTMA%I RT<-RA<<I7 */ |
APUOP(M_SHLI, RI7, 0x07b, "shli", _A3(A_T,A_A,A_U6), 00012, FX3) /* SHL%I RT<-RA<<I7 */ |
APUOP(M_ROTHI, RI7, 0x07c, "rothi", _A3(A_T,A_A,A_S7N), 00012, FX3) /* ROT%I RT<-RA<<<I7 */ |
APUOP(M_ROTHMI, RI7, 0x07d, "rothmi", _A3(A_T,A_A,A_S6), 00012, FX3) /* ROT%MI RT<-RA<<I7 */ |
APUOP(M_ROTMAHI, RI7, 0x07e, "rotmahi", _A3(A_T,A_A,A_S6), 00012, FX3) /* ROTMA%I RT<-RA<<I7 */ |
APUOP(M_SHLHI, RI7, 0x07f, "shlhi", _A3(A_T,A_A,A_U5), 00012, FX3) /* SHL%I RT<-RA<<I7 */ |
APUOP(M_A, RR, 0x0c0, "a", _A3(A_T,A_A,A_B), 00112, FX2) /* Add% RT<-RA+RB */ |
APUOP(M_AH, RR, 0x0c8, "ah", _A3(A_T,A_A,A_B), 00112, FX2) /* Add% RT<-RA+RB */ |
APUOP(M_SF, RR, 0x040, "sf", _A3(A_T,A_A,A_B), 00112, FX2) /* SubFrom% RT<-RB-RA */ |
APUOP(M_SFH, RR, 0x048, "sfh", _A3(A_T,A_A,A_B), 00112, FX2) /* SubFrom% RT<-RB-RA */ |
APUOP(M_CGT, RR, 0x240, "cgt", _A3(A_T,A_A,A_B), 00112, FX2) /* CGT% RT<-(RA>RB) */ |
APUOP(M_CGTB, RR, 0x250, "cgtb", _A3(A_T,A_A,A_B), 00112, FX2) /* CGT% RT<-(RA>RB) */ |
APUOP(M_CGTH, RR, 0x248, "cgth", _A3(A_T,A_A,A_B), 00112, FX2) /* CGT% RT<-(RA>RB) */ |
APUOP(M_CLGT, RR, 0x2c0, "clgt", _A3(A_T,A_A,A_B), 00112, FX2) /* CLGT% RT<-(RA>RB) */ |
APUOP(M_CLGTB, RR, 0x2d0, "clgtb", _A3(A_T,A_A,A_B), 00112, FX2) /* CLGT% RT<-(RA>RB) */ |
APUOP(M_CLGTH, RR, 0x2c8, "clgth", _A3(A_T,A_A,A_B), 00112, FX2) /* CLGT% RT<-(RA>RB) */ |
APUOP(M_CEQ, RR, 0x3c0, "ceq", _A3(A_T,A_A,A_B), 00112, FX2) /* CEQ% RT<-(RA=RB) */ |
APUOP(M_CEQB, RR, 0x3d0, "ceqb", _A3(A_T,A_A,A_B), 00112, FX2) /* CEQ% RT<-(RA=RB) */ |
APUOP(M_CEQH, RR, 0x3c8, "ceqh", _A3(A_T,A_A,A_B), 00112, FX2) /* CEQ% RT<-(RA=RB) */ |
APUOP(M_HGT, RR, 0x258, "hgt", _A3(A_T,A_A,A_B), 00110, FX2) /* HaltGT halt_if(RA>RB) */ |
APUOP(M_HGT2, RR, 0x258, "hgt", _A2(A_A,A_B), 00110, FX2) /* HaltGT halt_if(RA>RB) */ |
APUOP(M_HLGT, RR, 0x2d8, "hlgt", _A3(A_T,A_A,A_B), 00110, FX2) /* HaltLGT halt_if(RA>RB) */ |
APUOP(M_HLGT2, RR, 0x2d8, "hlgt", _A2(A_A,A_B), 00110, FX2) /* HaltLGT halt_if(RA>RB) */ |
APUOP(M_HEQ, RR, 0x3d8, "heq", _A3(A_T,A_A,A_B), 00110, FX2) /* HaltEQ halt_if(RA=RB) */ |
APUOP(M_HEQ2, RR, 0x3d8, "heq", _A2(A_A,A_B), 00110, FX2) /* HaltEQ halt_if(RA=RB) */ |
APUOP(M_FCEQ, RR, 0x3c2, "fceq", _A3(A_T,A_A,A_B), 00112, FX2) /* FCEQ RT<-(RA=RB) */ |
APUOP(M_FCMEQ, RR, 0x3ca, "fcmeq", _A3(A_T,A_A,A_B), 00112, FX2) /* FCMEQ RT<-(|RA|=|RB|) */ |
APUOP(M_FCGT, RR, 0x2c2, "fcgt", _A3(A_T,A_A,A_B), 00112, FX2) /* FCGT RT<-(RA<RB) */ |
APUOP(M_FCMGT, RR, 0x2ca, "fcmgt", _A3(A_T,A_A,A_B), 00112, FX2) /* FCMGT RT<-(|RA|<|RB|) */ |
APUOP(M_AND, RR, 0x0c1, "and", _A3(A_T,A_A,A_B), 00112, FX2) /* AND RT<-RA&RB */ |
APUOP(M_NAND, RR, 0x0c9, "nand", _A3(A_T,A_A,A_B), 00112, FX2) /* NAND RT<-!(RA&RB) */ |
APUOP(M_OR, RR, 0x041, "or", _A3(A_T,A_A,A_B), 00112, FX2) /* OR RT<-RA|RB */ |
APUOP(M_NOR, RR, 0x049, "nor", _A3(A_T,A_A,A_B), 00112, FX2) /* NOR RT<-!(RA&RB) */ |
APUOP(M_XOR, RR, 0x241, "xor", _A3(A_T,A_A,A_B), 00112, FX2) /* XOR RT<-RA^RB */ |
APUOP(M_EQV, RR, 0x249, "eqv", _A3(A_T,A_A,A_B), 00112, FX2) /* EQuiValent RT<-!(RA^RB) */ |
APUOP(M_ANDC, RR, 0x2c1, "andc", _A3(A_T,A_A,A_B), 00112, FX2) /* ANDComplement RT<-RA&!RB */ |
APUOP(M_ORC, RR, 0x2c9, "orc", _A3(A_T,A_A,A_B), 00112, FX2) /* ORComplement RT<-RA|!RB */ |
APUOP(M_ABSDB, RR, 0x053, "absdb", _A3(A_T,A_A,A_B), 00112, FXB) /* ABSoluteDiff RT<-|RA-RB| */ |
APUOP(M_AVGB, RR, 0x0d3, "avgb", _A3(A_T,A_A,A_B), 00112, FXB) /* AVG% RT<-(RA+RB+1)/2 */ |
APUOP(M_SUMB, RR, 0x253, "sumb", _A3(A_T,A_A,A_B), 00112, FXB) /* SUM% RT<-f(RA,RB) */ |
APUOP(M_DFA, RR, 0x2cc, "dfa", _A3(A_T,A_A,A_B), 00112, FPD) /* DFAdd RT<-RA+RB */ |
APUOP(M_DFM, RR, 0x2ce, "dfm", _A3(A_T,A_A,A_B), 00112, FPD) /* DFMul RT<-RA*RB */ |
APUOP(M_DFS, RR, 0x2cd, "dfs", _A3(A_T,A_A,A_B), 00112, FPD) /* DFSub RT<-RA-RB */ |
APUOP(M_FA, RR, 0x2c4, "fa", _A3(A_T,A_A,A_B), 00112, FP6) /* FAdd RT<-RA+RB */ |
APUOP(M_FM, RR, 0x2c6, "fm", _A3(A_T,A_A,A_B), 00112, FP6) /* FMul RT<-RA*RB */ |
APUOP(M_FS, RR, 0x2c5, "fs", _A3(A_T,A_A,A_B), 00112, FP6) /* FSub RT<-RA-RB */ |
APUOP(M_MPY, RR, 0x3c4, "mpy", _A3(A_T,A_A,A_B), 00112, FP7) /* MPY RT<-RA*RB */ |
APUOP(M_MPYH, RR, 0x3c5, "mpyh", _A3(A_T,A_A,A_B), 00112, FP7) /* MPYH RT<-(RAh*RB)<<16 */ |
APUOP(M_MPYHH, RR, 0x3c6, "mpyhh", _A3(A_T,A_A,A_B), 00112, FP7) /* MPYHH RT<-RAh*RBh */ |
APUOP(M_MPYHHU, RR, 0x3ce, "mpyhhu", _A3(A_T,A_A,A_B), 00112, FP7) /* MPYHHU RT<-RAh*RBh */ |
APUOP(M_MPYS, RR, 0x3c7, "mpys", _A3(A_T,A_A,A_B), 00112, FP7) /* MPYS RT<-(RA*RB)>>16 */ |
APUOP(M_MPYU, RR, 0x3cc, "mpyu", _A3(A_T,A_A,A_B), 00112, FP7) /* MPYU RT<-RA*RB */ |
APUOP(M_FI, RR, 0x3d4, "fi", _A3(A_T,A_A,A_B), 00112, FP7) /* FInterpolate RT<-f(RA,RB) */ |
APUOP(M_ROT, RR, 0x058, "rot", _A3(A_T,A_A,A_B), 00112, FX3) /* ROT% RT<-RA<<<RB */ |
APUOP(M_ROTM, RR, 0x059, "rotm", _A3(A_T,A_A,A_B), 00112, FX3) /* ROT%M RT<-RA<<Rb */ |
APUOP(M_ROTMA, RR, 0x05a, "rotma", _A3(A_T,A_A,A_B), 00112, FX3) /* ROTMA% RT<-RA<<Rb */ |
APUOP(M_SHL, RR, 0x05b, "shl", _A3(A_T,A_A,A_B), 00112, FX3) /* SHL% RT<-RA<<Rb */ |
APUOP(M_ROTH, RR, 0x05c, "roth", _A3(A_T,A_A,A_B), 00112, FX3) /* ROT% RT<-RA<<<RB */ |
APUOP(M_ROTHM, RR, 0x05d, "rothm", _A3(A_T,A_A,A_B), 00112, FX3) /* ROT%M RT<-RA<<Rb */ |
APUOP(M_ROTMAH, RR, 0x05e, "rotmah", _A3(A_T,A_A,A_B), 00112, FX3) /* ROTMA% RT<-RA<<Rb */ |
APUOP(M_SHLH, RR, 0x05f, "shlh", _A3(A_T,A_A,A_B), 00112, FX3) /* SHL% RT<-RA<<Rb */ |
APUOP(M_MPYHHA, RR, 0x346, "mpyhha", _A3(A_T,A_A,A_B), 00113, FP7) /* MPYHHA RT<-RAh*RBh+RT */ |
APUOP(M_MPYHHAU, RR, 0x34e, "mpyhhau", _A3(A_T,A_A,A_B), 00113, FP7) /* MPYHHAU RT<-RAh*RBh+RT */ |
APUOP(M_DFMA, RR, 0x35c, "dfma", _A3(A_T,A_A,A_B), 00113, FPD) /* DFMAdd RT<-RT+RA*RB */ |
APUOP(M_DFMS, RR, 0x35d, "dfms", _A3(A_T,A_A,A_B), 00113, FPD) /* DFMSub RT<-RA*RB-RT */ |
APUOP(M_DFNMS, RR, 0x35e, "dfnms", _A3(A_T,A_A,A_B), 00113, FPD) /* DFNMSub RT<-RT-RA*RB */ |
APUOP(M_DFNMA, RR, 0x35f, "dfnma", _A3(A_T,A_A,A_B), 00113, FPD) /* DFNMAdd RT<-(-RT)-RA*RB */ |
APUOP(M_FMA, RRR, 0x700, "fma", _A4(A_C,A_A,A_B,A_T), 02111, FP6) /* FMAdd RC<-RT+RA*RB */ |
APUOP(M_FMS, RRR, 0x780, "fms", _A4(A_C,A_A,A_B,A_T), 02111, FP6) /* FMSub RC<-RA*RB-RT */ |
APUOP(M_FNMS, RRR, 0x680, "fnms", _A4(A_C,A_A,A_B,A_T), 02111, FP6) /* FNMSub RC<-RT-RA*RB */ |
APUOP(M_MPYA, RRR, 0x600, "mpya", _A4(A_C,A_A,A_B,A_T), 02111, FP7) /* MPYA RC<-RA*RB+RT */ |
APUOP(M_SELB, RRR, 0x400, "selb", _A4(A_C,A_A,A_B,A_T), 02111, FX2) /* SELectBits RC<-RA&RT|RB&!RT */ |
/* for system function call, this uses op-code of mtspr */ |
APUOP(M_SYSCALL, RI7, 0x10c, "syscall", _A3(A_T,A_A,A_S7N), 00002, SPR) /* System Call */ |
/* |
pseudo instruction: |
system call |
value of I9 operation |
0 halt |
1 rt[0] = open(MEM[ra[0]], ra[1]) |
2 rt[0] = close(ra[0]) |
3 rt[0] = read(ra[0], MEM[ra[1]], ra[2]) |
4 rt[0] = write(ra[0], MEM[ra[1]], ra[2]) |
5 printf(MEM[ra[0]], ra[1], ra[2], ra[3]) |
42 rt[0] = clock() |
52 rt[0] = lseek(ra0, ra1, ra2) |
*/ |
/* new multiprecision add/sub */ |
APUOP(M_ADDX, RR, 0x340, "addx", _A3(A_T,A_A,A_B), 00113, FX2) /* Add_eXtended RT<-RA+RB+RT */ |
APUOP(M_CG, RR, 0x0c2, "cg", _A3(A_T,A_A,A_B), 00112, FX2) /* CarryGenerate RT<-cout(RA+RB) */ |
APUOP(M_CGX, RR, 0x342, "cgx", _A3(A_T,A_A,A_B), 00113, FX2) /* CarryGen_eXtd RT<-cout(RA+RB+RT) */ |
APUOP(M_SFX, RR, 0x341, "sfx", _A3(A_T,A_A,A_B), 00113, FX2) /* Add_eXtended RT<-RA+RB+RT */ |
APUOP(M_BG, RR, 0x042, "bg", _A3(A_T,A_A,A_B), 00112, FX2) /* CarryGenerate RT<-cout(RA+RB) */ |
APUOP(M_BGX, RR, 0x343, "bgx", _A3(A_T,A_A,A_B), 00113, FX2) /* CarryGen_eXtd RT<-cout(RA+RB+RT) */ |
/* |
The following ops are a subset of above except with feature bits set. |
Feature bits are bits 11-17 of the instruction: |
11 - C & P feature bit |
12 - disable interrupts |
13 - enable interrupts |
*/ |
APUOPFB(M_BID, RR, 0x1a8, 0x20, "bid", _A1(A_A), 00010, BR) /* BI IP<-RA */ |
APUOPFB(M_BIE, RR, 0x1a8, 0x10, "bie", _A1(A_A), 00010, BR) /* BI IP<-RA */ |
APUOPFB(M_BISLD, RR, 0x1a9, 0x20, "bisld", _A2(A_T,A_A), 00012, BR) /* BISL RT,IP<-IP,RA */ |
APUOPFB(M_BISLE, RR, 0x1a9, 0x10, "bisle", _A2(A_T,A_A), 00012, BR) /* BISL RT,IP<-IP,RA */ |
APUOPFB(M_IRETD, RR, 0x1aa, 0x20, "iretd", _A1(A_A), 00010, BR) /* IRET IP<-SRR0 */ |
APUOPFB(M_IRETD2, RR, 0x1aa, 0x20, "iretd", _A0(), 00010, BR) /* IRET IP<-SRR0 */ |
APUOPFB(M_IRETE, RR, 0x1aa, 0x10, "irete", _A1(A_A), 00010, BR) /* IRET IP<-SRR0 */ |
APUOPFB(M_IRETE2, RR, 0x1aa, 0x10, "irete", _A0(), 00010, BR) /* IRET IP<-SRR0 */ |
APUOPFB(M_BISLEDD, RR, 0x1ab, 0x20, "bisledd", _A2(A_T,A_A), 00012, BR) /* BISLED RT,IP<-IP,RA_if(ext) */ |
APUOPFB(M_BISLEDE, RR, 0x1ab, 0x10, "bislede", _A2(A_T,A_A), 00012, BR) /* BISLED RT,IP<-IP,RA_if(ext) */ |
APUOPFB(M_BIHNZD, RR, 0x12b, 0x20, "bihnzd", _A2(A_T,A_A), 00011, BR) /* BIHNZ IP<-RA_if(RT) */ |
APUOPFB(M_BIHNZE, RR, 0x12b, 0x10, "bihnze", _A2(A_T,A_A), 00011, BR) /* BIHNZ IP<-RA_if(RT) */ |
APUOPFB(M_BIHZD, RR, 0x12a, 0x20, "bihzd", _A2(A_T,A_A), 00011, BR) /* BIHZ IP<-RA_if(RT) */ |
APUOPFB(M_BIHZE, RR, 0x12a, 0x10, "bihze", _A2(A_T,A_A), 00011, BR) /* BIHZ IP<-RA_if(RT) */ |
APUOPFB(M_BINZD, RR, 0x129, 0x20, "binzd", _A2(A_T,A_A), 00011, BR) /* BINZ IP<-RA_if(RT) */ |
APUOPFB(M_BINZE, RR, 0x129, 0x10, "binze", _A2(A_T,A_A), 00011, BR) /* BINZ IP<-RA_if(RT) */ |
APUOPFB(M_BIZD, RR, 0x128, 0x20, "bizd", _A2(A_T,A_A), 00011, BR) /* BIZ IP<-RA_if(RT) */ |
APUOPFB(M_BIZE, RR, 0x128, 0x10, "bize", _A2(A_T,A_A), 00011, BR) /* BIZ IP<-RA_if(RT) */ |
APUOPFB(M_SYNCC, RR, 0x002, 0x40, "syncc", _A0(), 00000, BR) /* SYNCC flush_pipe */ |
APUOPFB(M_HBRP, LBTI, 0x1ac, 0x40, "hbrp", _A0(), 00010, LS) /* HBR BTB[B9]<-M[Ra] */ |
/* Synonyms required by the AS manual. */ |
APUOP(M_LR, RI10, 0x020, "lr", _A2(A_T,A_A), 00012, FX2) /* OR%I RT<-RA|I10 */ |
APUOP(M_BIHT, RR, 0x12b, "biht", _A2(A_T,A_A), 00011, BR) /* BIHNZ IP<-RA_if(RT) */ |
APUOP(M_BIHF, RR, 0x12a, "bihf", _A2(A_T,A_A), 00011, BR) /* BIHZ IP<-RA_if(RT) */ |
APUOP(M_BIT, RR, 0x129, "bit", _A2(A_T,A_A), 00011, BR) /* BINZ IP<-RA_if(RT) */ |
APUOP(M_BIF, RR, 0x128, "bif", _A2(A_T,A_A), 00011, BR) /* BIZ IP<-RA_if(RT) */ |
APUOPFB(M_BIHTD, RR, 0x12b, 0x20, "bihtd", _A2(A_T,A_A), 00011, BR) /* BIHNF IP<-RA_if(RT) */ |
APUOPFB(M_BIHTE, RR, 0x12b, 0x10, "bihte", _A2(A_T,A_A), 00011, BR) /* BIHNF IP<-RA_if(RT) */ |
APUOPFB(M_BIHFD, RR, 0x12a, 0x20, "bihfd", _A2(A_T,A_A), 00011, BR) /* BIHZ IP<-RA_if(RT) */ |
APUOPFB(M_BIHFE, RR, 0x12a, 0x10, "bihfe", _A2(A_T,A_A), 00011, BR) /* BIHZ IP<-RA_if(RT) */ |
APUOPFB(M_BITD, RR, 0x129, 0x20, "bitd", _A2(A_T,A_A), 00011, BR) /* BINF IP<-RA_if(RT) */ |
APUOPFB(M_BITE, RR, 0x129, 0x10, "bite", _A2(A_T,A_A), 00011, BR) /* BINF IP<-RA_if(RT) */ |
APUOPFB(M_BIFD, RR, 0x128, 0x20, "bifd", _A2(A_T,A_A), 00011, BR) /* BIZ IP<-RA_if(RT) */ |
APUOPFB(M_BIFE, RR, 0x128, 0x10, "bife", _A2(A_T,A_A), 00011, BR) /* BIZ IP<-RA_if(RT) */ |
/* New soma double-float insns. */ |
APUOP(M_DFCEQ, RR, 0x3c3, "dfceq", _A3(A_T,A_A,A_B), 00112, FX2) /* DFCEQ RT<-(RA=RB) */ |
APUOP(M_DFCMEQ, RR, 0x3cb, "dfcmeq", _A3(A_T,A_A,A_B), 00112, FX2) /* DFCMEQ RT<-(|RA|=|RB|) */ |
APUOP(M_DFCGT, RR, 0x2c3, "dfcgt", _A3(A_T,A_A,A_B), 00112, FX2) /* DFCGT RT<-(RA>RB) */ |
APUOP(M_DFCMGT, RR, 0x2cb, "dfcmgt", _A3(A_T,A_A,A_B), 00112, FX2) /* DFCMGT RT<-(|RA|>|RB|) */ |
APUOP(M_DFTSV, RI7, 0x3bf, "dftsv", _A3(A_T,A_A,A_U7), 00012, FX2) /* DFTSV RT<-testspecial(RA,I7) */ |
#undef _A0 |
#undef _A1 |
#undef _A2 |
#undef _A3 |
#undef _A4 |
/contrib/toolchain/binutils/include/opcode/spu.h |
---|
0,0 → 1,125 |
/* SPU ELF support for BFD. |
Copyright 2006, 2010 Free Software Foundation, Inc. |
This file is part of GDB, GAS, and the GNU binutils. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
/* These two enums are from rel_apu/common/spu_asm_format.h */ |
/* definition of instruction format */ |
typedef enum { |
RRR, |
RI18, |
RI16, |
RI10, |
RI8, |
RI7, |
RR, |
LBT, |
LBTI, |
IDATA, |
UNKNOWN_IFORMAT |
} spu_iformat; |
/* These values describe assembly instruction arguments. They indicate |
* how to encode, range checking and which relocation to use. */ |
typedef enum { |
A_T, /* register at pos 0 */ |
A_A, /* register at pos 7 */ |
A_B, /* register at pos 14 */ |
A_C, /* register at pos 21 */ |
A_S, /* special purpose register at pos 7 */ |
A_H, /* channel register at pos 7 */ |
A_P, /* parenthesis, this has to separate regs from immediates */ |
A_S3, |
A_S6, |
A_S7N, |
A_S7, |
A_U7A, |
A_U7B, |
A_S10B, |
A_S10, |
A_S11, |
A_S11I, |
A_S14, |
A_S16, |
A_S18, |
A_R18, |
A_U3, |
A_U5, |
A_U6, |
A_U7, |
A_U14, |
A_X16, |
A_U18, |
A_MAX |
} spu_aformat; |
enum spu_insns { |
#define APUOP(TAG,MACFORMAT,OPCODE,MNEMONIC,ASMFORMAT,DEP,PIPE) \ |
TAG, |
#define APUOPFB(TAG,MACFORMAT,OPCODE,FB,MNEMONIC,ASMFORMAT,DEP,PIPE) \ |
TAG, |
#include "opcode/spu-insns.h" |
#undef APUOP |
#undef APUOPFB |
M_SPU_MAX |
}; |
struct spu_opcode |
{ |
spu_iformat insn_type; |
unsigned int opcode; |
char *mnemonic; |
int arg[5]; |
}; |
#define SIGNED_EXTRACT(insn,size,pos) (((int)((insn) << (32-size-pos))) >> (32-size)) |
#define UNSIGNED_EXTRACT(insn,size,pos) (((insn) >> pos) & ((1 << size)-1)) |
#define DECODE_INSN_RT(insn) (insn & 0x7f) |
#define DECODE_INSN_RA(insn) ((insn >> 7) & 0x7f) |
#define DECODE_INSN_RB(insn) ((insn >> 14) & 0x7f) |
#define DECODE_INSN_RC(insn) ((insn >> 21) & 0x7f) |
#define DECODE_INSN_I10(insn) SIGNED_EXTRACT(insn,10,14) |
#define DECODE_INSN_U10(insn) UNSIGNED_EXTRACT(insn,10,14) |
/* For branching, immediate loads, hbr and lqa/stqa. */ |
#define DECODE_INSN_I16(insn) SIGNED_EXTRACT(insn,16,7) |
#define DECODE_INSN_U16(insn) UNSIGNED_EXTRACT(insn,16,7) |
/* for stop */ |
#define DECODE_INSN_U14(insn) UNSIGNED_EXTRACT(insn,14,0) |
/* For ila */ |
#define DECODE_INSN_I18(insn) SIGNED_EXTRACT(insn,18,7) |
#define DECODE_INSN_U18(insn) UNSIGNED_EXTRACT(insn,18,7) |
/* For rotate and shift and generate control mask */ |
#define DECODE_INSN_I7(insn) SIGNED_EXTRACT(insn,7,14) |
#define DECODE_INSN_U7(insn) UNSIGNED_EXTRACT(insn,7,14) |
/* For float <-> int conversion */ |
#define DECODE_INSN_I8(insn) SIGNED_EXTRACT(insn,8,14) |
#define DECODE_INSN_U8(insn) UNSIGNED_EXTRACT(insn,8,14) |
/* For hbr */ |
#define DECODE_INSN_I9a(insn) ((SIGNED_EXTRACT(insn,2,23) << 7) | UNSIGNED_EXTRACT(insn,7,0)) |
#define DECODE_INSN_I9b(insn) ((SIGNED_EXTRACT(insn,2,14) << 7) | UNSIGNED_EXTRACT(insn,7,0)) |
#define DECODE_INSN_U9a(insn) ((UNSIGNED_EXTRACT(insn,2,23) << 7) | UNSIGNED_EXTRACT(insn,7,0)) |
#define DECODE_INSN_U9b(insn) ((UNSIGNED_EXTRACT(insn,2,14) << 7) | UNSIGNED_EXTRACT(insn,7,0)) |
/contrib/toolchain/binutils/include/opcode/tahoe.h |
---|
0,0 → 1,232 |
/* |
* Ported by the State University of New York at Buffalo by the Distributed |
* Computer Systems Lab, Department of Computer Science, 1991. |
*/ |
/* Copyright 2012 Free Software Foundation, Inc. |
This file is part of GDB and BINUTILS. |
GDB and BINUTILS are free software; you can redistribute them and/or |
modify them under the terms of the GNU General Public License as |
published by the Free Software Foundation; either version 3, or (at |
your option) any later version. |
GDB and BINUTILS are distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with GDB or BINUTILS; see the file COPYING3. If not, write |
to the Free Software Foundation, 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
#ifndef tahoe_opcodeT |
#define tahoe_opcodeT int |
#endif /* no tahoe_opcodeT */ |
struct vot_wot /* tahoe opcode table: wot to do with this */ |
/* particular opcode */ |
{ |
char * args; /* how to compile said opcode */ |
tahoe_opcodeT code; /* op-code (may be > 8 bits!) */ |
}; |
struct vot /* tahoe opcode text */ |
{ |
char * name; /* opcode name: lowercase string [key] */ |
struct vot_wot detail; /* rest of opcode table [datum] */ |
}; |
#define vot_how args |
#define vot_code code |
#define vot_detail detail |
#define vot_name name |
static struct vot |
votstrs[] = |
{ |
{ "halt", {"", 0x00 } }, |
{ "sinf", {"", 0x05 } }, |
{ "ldf", {"rl", 0x06 } }, |
{ "ldd", {"rq", 0x07 } }, |
{ "addb2", {"rbmb", 0x08 } }, |
{ "movb", {"rbwb", 0x09 } }, |
{ "addw2", {"rwmw", 0x0a } }, |
{ "movw", {"rwww", 0x0b } }, |
{ "addl2", {"rlml", 0x0c } }, |
{ "movl", {"rlwl", 0x0d } }, |
{ "bbs", {"rlvlbw", 0x0e } }, |
{ "nop", {"", 0x10 } }, |
{ "brb", {"bb", 0x11 } }, |
{ "brw", {"bw", 0x13 } }, |
{ "cosf", {"", 0x15 } }, |
{ "lnf", {"rl", 0x16 } }, |
{ "lnd", {"rq", 0x17 } }, |
{ "addb3", {"rbrbwb", 0x18 } }, |
{ "cmpb", {"rbwb", 0x19 } }, |
{ "addw3", {"rwrwww", 0x1a } }, |
{ "cmpw", {"rwww", 0x1b } }, |
{ "addl3", {"rlrlwl", 0x1c } }, |
{ "cmpl", {"rlwl", 0x1d } }, |
{ "bbc", {"rlvlbw", 0x1e } }, |
{ "rei", {"", 0x20 } }, |
{ "bneq", {"bb", 0x21 } }, |
{ "bnequ", {"bb", 0x21 } }, |
{ "cvtwl", {"rwwl", 0x23 } }, |
{ "stf", {"wl", 0x26 } }, |
{ "std", {"wq", 0x27 } }, |
{ "subb2", {"rbmb", 0x28 } }, |
{ "mcomb", {"rbwb", 0x29 } }, |
{ "subw2", {"rwmw", 0x2a } }, |
{ "mcomw", {"rwww", 0x2b } }, |
{ "subl2", {"rlml", 0x2c } }, |
{ "mcoml", {"rlwl", 0x2d } }, |
{ "emul", {"rlrlrlwq", 0x2e } }, |
{ "aoblss", {"rlmlbw", 0x2f } }, |
{ "bpt", {"", 0x30 } }, |
{ "beql", {"bb", 0x31 } }, |
{ "beqlu", {"bb", 0x31 } }, |
{ "cvtwb", {"rwwb", 0x33 } }, |
{ "logf", {"", 0x35 } }, |
{ "cmpf", {"rl", 0x36 } }, |
{ "cmpd", {"rq", 0x37 } }, |
{ "subb3", {"rbrbwb", 0x38 } }, |
{ "bitb", {"rbrb", 0x39 } }, |
{ "subw3", {"rwrwww", 0x3a } }, |
{ "bitw", {"rwrw", 0x3b } }, |
{ "subl3", {"rlrlwl", 0x3c } }, |
{ "bitl", {"rlrl", 0x3d } }, |
{ "ediv", {"rlrqwlwl", 0x3e } }, |
{ "aobleq", {"rlmlbw", 0x3f } }, |
{ "ret", {"", 0x40 } }, |
{ "bgtr", {"bb", 0x41 } }, |
{ "sqrtf", {"", 0x45 } }, |
{ "cmpf2", {"rl", 0x46 } }, |
{ "cmpd2", {"rqrq", 0x47 } }, |
{ "shll", {"rbrlwl", 0x48 } }, |
{ "clrb", {"wb", 0x49 } }, |
{ "shlq", {"rbrqwq", 0x4a } }, |
{ "clrw", {"ww", 0x4b } }, |
{ "mull2", {"rlml", 0x4c } }, |
{ "clrl", {"wl", 0x4d } }, |
{ "shal", {"rbrlwl", 0x4e } }, |
{ "bleq", {"bb", 0x51 } }, |
{ "expf", {"", 0x55 } }, |
{ "tstf", {"", 0x56 } }, |
{ "tstd", {"", 0x57 } }, |
{ "shrl", {"rbrlwl", 0x58 } }, |
{ "tstb", {"rb", 0x59 } }, |
{ "shrq", {"rbrqwq", 0x5a } }, |
{ "tstw", {"rw", 0x5b } }, |
{ "mull3", {"rlrlwl", 0x5c } }, |
{ "tstl", {"rl", 0x5d } }, |
{ "shar", {"rbrlwl", 0x5e } }, |
{ "bbssi", {"rlmlbw", 0x5f } }, |
{ "ldpctx", {"", 0x60 } }, |
{ "pushd", {"", 0x67 } }, |
{ "incb", {"mb", 0x69 } }, |
{ "incw", {"mw", 0x6b } }, |
{ "divl2", {"rlml", 0x6c } }, |
{ "incl", {"ml", 0x6d } }, |
{ "cvtlb", {"rlwb", 0x6f } }, |
{ "svpctx", {"", 0x70 } }, |
{ "jmp", {"ab", 0x71 } }, |
{ "cvlf", {"rl", 0x76 } }, |
{ "cvld", {"rl", 0x77 } }, |
{ "decb", {"mb", 0x79 } }, |
{ "decw", {"mw", 0x7b } }, |
{ "divl3", {"rlrlwl", 0x7c } }, |
{ "decl", {"ml", 0x7d } }, |
{ "cvtlw", {"rlww", 0x7f } }, |
{ "bgeq", {"bb", 0x81 } }, |
{ "movs2", {"abab", 0x82 } }, |
{ "cvfl", {"wl", 0x86 } }, |
{ "cvdl", {"wl", 0x87 } }, |
{ "orb2", {"rbmb", 0x88 } }, |
{ "cvtbl", {"rbwl", 0x89 } }, |
{ "orw2", {"rwmw", 0x8a } }, |
{ "bispsw", {"rw", 0x8b } }, |
{ "orl2", {"rlml", 0x8c } }, |
{ "adwc", {"rlml", 0x8d } }, |
{ "adda", {"rlml", 0x8e } }, |
{ "blss", {"bb", 0x91 } }, |
{ "cmps2", {"abab", 0x92 } }, |
{ "ldfd", {"rl", 0x97 } }, |
{ "orb3", {"rbrbwb", 0x98 } }, |
{ "cvtbw", {"rbww", 0x99 } }, |
{ "orw3", {"rwrwww", 0x9a } }, |
{ "bicpsw", {"rw", 0x9b } }, |
{ "orl3", {"rlrlwl", 0x9c } }, |
{ "sbwc", {"rlml", 0x9d } }, |
{ "suba", {"rlml", 0x9e } }, |
{ "bgtru", {"bb", 0xa1 } }, |
{ "cvdf", {"", 0xa6 } }, |
{ "andb2", {"rbmb", 0xa8 } }, |
{ "movzbl", {"rbwl", 0xa9 } }, |
{ "andw2", {"rwmw", 0xaa } }, |
{ "loadr", {"rwal", 0xab } }, |
{ "andl2", {"rlml", 0xac } }, |
{ "mtpr", {"rlrl", 0xad } }, |
{ "ffs", {"rlwl", 0xae } }, |
{ "blequ", {"bb", 0xb1 } }, |
{ "negf", {"", 0xb6 } }, |
{ "negd", {"", 0xb7 } }, |
{ "andb3", {"rbrbwb", 0xb8 } }, |
{ "movzbw", {"rbww", 0xb9 } }, |
{ "andw3", {"rwrwww", 0xba } }, |
{ "storer", {"rwal", 0xbb } }, |
{ "andl3", {"rlrlwl", 0xbc } }, |
{ "mfpr", {"rlwl", 0xbd } }, |
{ "ffc", {"rlwl", 0xbe } }, |
{ "calls", {"rbab", 0xbf } }, |
{ "prober", {"rbabrl", 0xc0 } }, |
{ "bvc", {"bb", 0xc1 } }, |
{ "movs3", {"ababrw", 0xc2 } }, |
{ "movzwl", {"rwwl", 0xc3 } }, |
{ "addf", {"rl", 0xc6 } }, |
{ "addd", {"rq", 0xc7 } }, |
{ "xorb2", {"rbmb", 0xc8 } }, |
{ "movob", {"rbwb", 0xc9 } }, |
{ "xorw2", {"rwmw", 0xca } }, |
{ "movow", {"rwww", 0xcb } }, |
{ "xorl2", {"rlml", 0xcc } }, |
{ "movpsl", {"wl", 0xcd } }, |
{ "kcall", {"rw", 0xcf } }, |
{ "probew", {"rbabrl", 0xd0 } }, |
{ "bvs", {"bb", 0xd1 } }, |
{ "cmps3", {"ababrw", 0xd2 } }, |
{ "subf", {"rq", 0xd6 } }, |
{ "subd", {"rq", 0xd7 } }, |
{ "xorb3", {"rbrbwb", 0xd8 } }, |
{ "pushb", {"rb", 0xd9 } }, |
{ "xorw3", {"rwrwww", 0xda } }, |
{ "pushw", {"rw", 0xdb } }, |
{ "xorl3", {"rlrlwl", 0xdc } }, |
{ "pushl", {"rl", 0xdd } }, |
{ "insque", {"abab", 0xe0 } }, |
{ "bcs", {"bb", 0xe1 } }, |
{ "bgequ", {"bb", 0xe1 } }, |
{ "mulf", {"rq", 0xe6 } }, |
{ "muld", {"rq", 0xe7 } }, |
{ "mnegb", {"rbwb", 0xe8 } }, |
{ "movab", {"abwl", 0xe9 } }, |
{ "mnegw", {"rwww", 0xea } }, |
{ "movaw", {"awwl", 0xeb } }, |
{ "mnegl", {"rlwl", 0xec } }, |
{ "moval", {"alwl", 0xed } }, |
{ "remque", {"ab", 0xf0 } }, |
{ "bcc", {"bb", 0xf1 } }, |
{ "blssu", {"bb", 0xf1 } }, |
{ "divf", {"rq", 0xf6 } }, |
{ "divd", {"rq", 0xf7 } }, |
{ "movblk", {"alalrw", 0xf8 } }, |
{ "pushab", {"ab", 0xf9 } }, |
{ "pushaw", {"aw", 0xfb } }, |
{ "casel", {"rlrlrl", 0xfc } }, |
{ "pushal", {"al", 0xfd } }, |
{ "callf", {"rbab", 0xfe } }, |
{ "" , "" } /* empty is end sentinel */ |
}; |
/contrib/toolchain/binutils/include/opcode/tic30.h |
---|
0,0 → 1,691 |
/* tic30.h -- Header file for TI TMS320C30 opcode table |
Copyright 1998, 2005, 2009, 2010 Free Software Foundation, Inc. |
Contributed by Steven Haworth (steve@pm.cse.rmit.edu.au) |
This file is part of GDB, GAS, and the GNU binutils. |
GDB, GAS, and the GNU binutils are free software; you can redistribute |
them and/or modify them under the terms of the GNU General Public |
License as published by the Free Software Foundation; either version 3, |
or (at your option) any later version. |
GDB, GAS, and the GNU binutils are distributed in the hope that they |
will be useful, but WITHOUT ANY WARRANTY; without even the implied |
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See |
the GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this file; see the file COPYING3. If not, write to the Free |
Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA |
02110-1301, USA. */ |
/* FIXME: The opcode table should be in opcodes/tic30-opc.c, not in a |
header file. */ |
#ifndef _TMS320_H_ |
#define _TMS320_H_ |
struct _register |
{ |
char *name; |
unsigned char opcode; |
unsigned char regtype; |
}; |
typedef struct _register reg; |
#define REG_Rn 0x01 |
#define REG_ARn 0x02 |
#define REG_DP 0x03 |
#define REG_OTHER 0x04 |
static const reg tic30_regtab[] = { |
{ "r0", 0x00, REG_Rn }, |
{ "r1", 0x01, REG_Rn }, |
{ "r2", 0x02, REG_Rn }, |
{ "r3", 0x03, REG_Rn }, |
{ "r4", 0x04, REG_Rn }, |
{ "r5", 0x05, REG_Rn }, |
{ "r6", 0x06, REG_Rn }, |
{ "r7", 0x07, REG_Rn }, |
{ "ar0",0x08, REG_ARn }, |
{ "ar1",0x09, REG_ARn }, |
{ "ar2",0x0A, REG_ARn }, |
{ "ar3",0x0B, REG_ARn }, |
{ "ar4",0x0C, REG_ARn }, |
{ "ar5",0x0D, REG_ARn }, |
{ "ar6",0x0E, REG_ARn }, |
{ "ar7",0x0F, REG_ARn }, |
{ "dp", 0x10, REG_DP }, |
{ "ir0",0x11, REG_OTHER }, |
{ "ir1",0x12, REG_OTHER }, |
{ "bk", 0x13, REG_OTHER }, |
{ "sp", 0x14, REG_OTHER }, |
{ "st", 0x15, REG_OTHER }, |
{ "ie", 0x16, REG_OTHER }, |
{ "if", 0x17, REG_OTHER }, |
{ "iof",0x18, REG_OTHER }, |
{ "rs", 0x19, REG_OTHER }, |
{ "re", 0x1A, REG_OTHER }, |
{ "rc", 0x1B, REG_OTHER }, |
{ "R0", 0x00, REG_Rn }, |
{ "R1", 0x01, REG_Rn }, |
{ "R2", 0x02, REG_Rn }, |
{ "R3", 0x03, REG_Rn }, |
{ "R4", 0x04, REG_Rn }, |
{ "R5", 0x05, REG_Rn }, |
{ "R6", 0x06, REG_Rn }, |
{ "R7", 0x07, REG_Rn }, |
{ "AR0",0x08, REG_ARn }, |
{ "AR1",0x09, REG_ARn }, |
{ "AR2",0x0A, REG_ARn }, |
{ "AR3",0x0B, REG_ARn }, |
{ "AR4",0x0C, REG_ARn }, |
{ "AR5",0x0D, REG_ARn }, |
{ "AR6",0x0E, REG_ARn }, |
{ "AR7",0x0F, REG_ARn }, |
{ "DP", 0x10, REG_DP }, |
{ "IR0",0x11, REG_OTHER }, |
{ "IR1",0x12, REG_OTHER }, |
{ "BK", 0x13, REG_OTHER }, |
{ "SP", 0x14, REG_OTHER }, |
{ "ST", 0x15, REG_OTHER }, |
{ "IE", 0x16, REG_OTHER }, |
{ "IF", 0x17, REG_OTHER }, |
{ "IOF",0x18, REG_OTHER }, |
{ "RS", 0x19, REG_OTHER }, |
{ "RE", 0x1A, REG_OTHER }, |
{ "RC", 0x1B, REG_OTHER }, |
{ "", 0, 0 } |
}; |
static const reg *const tic30_regtab_end |
= tic30_regtab + sizeof(tic30_regtab)/sizeof(tic30_regtab[0]); |
/* Indirect Addressing Modes Modification Fields */ |
/* Indirect Addressing with Displacement */ |
#define PreDisp_Add 0x00 |
#define PreDisp_Sub 0x01 |
#define PreDisp_Add_Mod 0x02 |
#define PreDisp_Sub_Mod 0x03 |
#define PostDisp_Add_Mod 0x04 |
#define PostDisp_Sub_Mod 0x05 |
#define PostDisp_Add_Circ 0x06 |
#define PostDisp_Sub_Circ 0x07 |
/* Indirect Addressing with Index Register IR0 */ |
#define PreIR0_Add 0x08 |
#define PreIR0_Sub 0x09 |
#define PreIR0_Add_Mod 0x0A |
#define PreIR0_Sub_Mod 0x0B |
#define PostIR0_Add_Mod 0x0C |
#define PostIR0_Sub_Mod 0x0D |
#define PostIR0_Add_Circ 0x0E |
#define PostIR0_Sub_Circ 0x0F |
/* Indirect Addressing with Index Register IR1 */ |
#define PreIR1_Add 0x10 |
#define PreIR1_Sub 0x11 |
#define PreIR1_Add_Mod 0x12 |
#define PreIR1_Sub_Mod 0x13 |
#define PostIR1_Add_Mod 0x14 |
#define PostIR1_Sub_Mod 0x15 |
#define PostIR1_Add_Circ 0x16 |
#define PostIR1_Sub_Circ 0x17 |
/* Indirect Addressing (Special Cases) */ |
#define IndirectOnly 0x18 |
#define PostIR0_Add_BitRev 0x19 |
typedef struct { |
char *syntax; |
unsigned char modfield; |
unsigned char displacement; |
} ind_addr_type; |
#define IMPLIED_DISP 0x01 |
#define DISP_REQUIRED 0x02 |
#define NO_DISP 0x03 |
static const ind_addr_type tic30_indaddr_tab[] = { |
{ "*+ar", PreDisp_Add, IMPLIED_DISP }, |
{ "*-ar", PreDisp_Sub, IMPLIED_DISP }, |
{ "*++ar", PreDisp_Add_Mod, IMPLIED_DISP }, |
{ "*--ar", PreDisp_Sub_Mod, IMPLIED_DISP }, |
{ "*ar++", PostDisp_Add_Mod, IMPLIED_DISP }, |
{ "*ar--", PostDisp_Sub_Mod, IMPLIED_DISP }, |
{ "*ar++%", PostDisp_Add_Circ, IMPLIED_DISP }, |
{ "*ar--%", PostDisp_Sub_Circ, IMPLIED_DISP }, |
{ "*+ar()", PreDisp_Add, DISP_REQUIRED }, |
{ "*-ar()", PreDisp_Sub, DISP_REQUIRED }, |
{ "*++ar()", PreDisp_Add_Mod, DISP_REQUIRED }, |
{ "*--ar()", PreDisp_Sub_Mod, DISP_REQUIRED }, |
{ "*ar++()", PostDisp_Add_Mod, DISP_REQUIRED }, |
{ "*ar--()", PostDisp_Sub_Mod, DISP_REQUIRED }, |
{ "*ar++()%", PostDisp_Add_Circ, DISP_REQUIRED }, |
{ "*ar--()%", PostDisp_Sub_Circ, DISP_REQUIRED }, |
{ "*+ar(ir0)", PreIR0_Add, NO_DISP }, |
{ "*-ar(ir0)", PreIR0_Sub, NO_DISP }, |
{ "*++ar(ir0)", PreIR0_Add_Mod, NO_DISP }, |
{ "*--ar(ir0)", PreIR0_Sub_Mod, NO_DISP }, |
{ "*ar++(ir0)", PostIR0_Add_Mod, NO_DISP }, |
{ "*ar--(ir0)", PostIR0_Sub_Mod, NO_DISP }, |
{ "*ar++(ir0)%",PostIR0_Add_Circ, NO_DISP }, |
{ "*ar--(ir0)%",PostIR0_Sub_Circ, NO_DISP }, |
{ "*+ar(ir1)", PreIR1_Add, NO_DISP }, |
{ "*-ar(ir1)", PreIR1_Sub, NO_DISP }, |
{ "*++ar(ir1)", PreIR1_Add_Mod, NO_DISP }, |
{ "*--ar(ir1)", PreIR1_Sub_Mod, NO_DISP }, |
{ "*ar++(ir1)", PostIR1_Add_Mod, NO_DISP }, |
{ "*ar--(ir1)", PostIR1_Sub_Mod, NO_DISP }, |
{ "*ar++(ir1)%",PostIR1_Add_Circ, NO_DISP }, |
{ "*ar--(ir1)%",PostIR1_Sub_Circ, NO_DISP }, |
{ "*ar", IndirectOnly, NO_DISP }, |
{ "*ar++(ir0)b",PostIR0_Add_BitRev, NO_DISP }, |
{ "", 0,0 } |
}; |
static const ind_addr_type *const tic30_indaddrtab_end |
= tic30_indaddr_tab + sizeof(tic30_indaddr_tab)/sizeof(tic30_indaddr_tab[0]); |
/* Possible operand types */ |
/* Register types */ |
#define Rn 0x0001 |
#define ARn 0x0002 |
#define DPReg 0x0004 |
#define OtherReg 0x0008 |
/* Addressing mode types */ |
#define Direct 0x0010 |
#define Indirect 0x0020 |
#define Imm16 0x0040 |
#define Disp 0x0080 |
#define Imm24 0x0100 |
#define Abs24 0x0200 |
/* 3 operand addressing mode types */ |
#define op3T1 0x0400 |
#define op3T2 0x0800 |
/* Interrupt vector */ |
#define IVector 0x1000 |
/* Not required */ |
#define NotReq 0x2000 |
#define GAddr1 Rn | Direct | Indirect | Imm16 |
#define GAddr2 GAddr1 | AllReg |
#define TAddr1 op3T1 | Rn | Indirect |
#define TAddr2 op3T2 | Rn | Indirect |
#define Reg Rn | ARn |
#define AllReg Reg | DPReg | OtherReg |
typedef struct _template |
{ |
char *name; |
unsigned int operands; /* how many operands */ |
unsigned int base_opcode; /* base_opcode is the fundamental opcode byte */ |
/* the bits in opcode_modifier are used to generate the final opcode from |
the base_opcode. These bits also are used to detect alternate forms of |
the same instruction */ |
unsigned int opcode_modifier; |
/* opcode_modifier bits: */ |
#define AddressMode 0x00600000 |
#define PCRel 0x02000000 |
#define StackOp 0x001F0000 |
#define Rotate StackOp |
/* operand_types[i] describes the type of operand i. This is made |
by OR'ing together all of the possible type masks. (e.g. |
'operand_types[i] = Reg|Imm' specifies that operand i can be |
either a register or an immediate operand */ |
unsigned int operand_types[3]; |
/* This defines the number type of an immediate argument to an instruction. */ |
int imm_arg_type; |
#define Imm_None 0 |
#define Imm_Float 1 |
#define Imm_SInt 2 |
#define Imm_UInt 3 |
} |
insn_template; |
static const insn_template tic30_optab[] = { |
{ "absf" ,2,0x00000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "absi" ,2,0x00800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "addc" ,2,0x01000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "addc3" ,3,0x20000000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, AllReg }, Imm_None }, |
{ "addf" ,2,0x01800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "addf3" ,3,0x20800000,AddressMode, { TAddr1, TAddr2, Rn }, Imm_None }, |
{ "addi" ,2,0x02000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "addi3" ,3,0x21000000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, AllReg }, Imm_None }, |
{ "and" ,2,0x02800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_UInt }, |
{ "and3" ,3,0x21800000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, AllReg }, Imm_None }, |
{ "andn" ,2,0x03000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_UInt }, |
{ "andn3" ,3,0x22000000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, AllReg }, Imm_None }, |
{ "ash" ,2,0x03800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "ash3" ,3,0x22800000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, AllReg }, Imm_None }, |
{ "b" ,1,0x68000000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bu" ,1,0x68000000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "blo" ,1,0x68010000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bls" ,1,0x68020000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bhi" ,1,0x68030000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bhs" ,1,0x68040000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "beq" ,1,0x68050000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bne" ,1,0x68060000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "blt" ,1,0x68070000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "ble" ,1,0x68080000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bgt" ,1,0x68090000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bge" ,1,0x680A0000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bz" ,1,0x68050000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bnz" ,1,0x68060000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bp" ,1,0x68090000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bn" ,1,0x68070000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bnn" ,1,0x680A0000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bnv" ,1,0x680C0000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bv" ,1,0x680D0000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bnuf" ,1,0x680E0000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "buf" ,1,0x680F0000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bnc" ,1,0x68040000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bc" ,1,0x68010000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bnlv" ,1,0x68100000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "blv" ,1,0x68110000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bnluf" ,1,0x68120000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bluf" ,1,0x68130000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bzuf" ,1,0x68140000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bd" ,1,0x68200000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bud" ,1,0x68200000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "blod" ,1,0x68210000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "blsd" ,1,0x68220000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bhid" ,1,0x68230000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bhsd" ,1,0x68240000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "beqd" ,1,0x68250000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bned" ,1,0x68260000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bltd" ,1,0x68270000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bled" ,1,0x68280000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bgtd" ,1,0x68290000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bged" ,1,0x682A0000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bzd" ,1,0x68250000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bnzd" ,1,0x68260000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bpd" ,1,0x68290000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bnd" ,1,0x68270000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bnnd" ,1,0x682A0000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bnvd" ,1,0x682C0000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bvd" ,1,0x682D0000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bnufd" ,1,0x682E0000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bufd" ,1,0x682F0000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bncd" ,1,0x68240000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bcd" ,1,0x68210000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bnlvd" ,1,0x68300000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "blvd" ,1,0x68310000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bnlufd" ,1,0x68320000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "blufd" ,1,0x68330000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "bzufd" ,1,0x68340000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, |
{ "br" ,1,0x60000000,0, { Imm24, 0, 0 }, Imm_UInt }, |
{ "brd" ,1,0x61000000,0, { Imm24, 0, 0 }, Imm_UInt }, |
{ "call" ,1,0x62000000,0, { Imm24, 0, 0 }, Imm_UInt }, |
{ "callu" ,1,0x70000000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, |
{ "calllo" ,1,0x70010000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, |
{ "callls" ,1,0x70020000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, |
{ "callhi" ,1,0x70030000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, |
{ "callhs" ,1,0x70040000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, |
{ "calleq" ,1,0x70050000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, |
{ "callne" ,1,0x70060000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, |
{ "calllt" ,1,0x70070000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, |
{ "callle" ,1,0x70080000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, |
{ "callgt" ,1,0x70090000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, |
{ "callge" ,1,0x700A0000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, |
{ "callz" ,1,0x70050000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, |
{ "callnz" ,1,0x70060000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, |
{ "callp" ,1,0x70090000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, |
{ "calln" ,1,0x70070000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, |
{ "callnn" ,1,0x700A0000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, |
{ "callnv" ,1,0x700C0000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, |
{ "callv" ,1,0x700D0000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, |
{ "callnuf",1,0x700E0000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, |
{ "calluf" ,1,0x700F0000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, |
{ "callnc" ,1,0x70040000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, |
{ "callc" ,1,0x70010000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, |
{ "callnlv",1,0x70100000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, |
{ "calllv" ,1,0x70110000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, |
{ "callnluf",1,0x70120000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, |
{ "callluf",1,0x70130000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, |
{ "callzuf",1,0x70140000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, |
{ "cmpf" ,2,0x04000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "cmpf3" ,2,0x23000000,AddressMode, { TAddr1, TAddr2, 0 }, Imm_None }, |
{ "cmpi" ,2,0x04800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "cmpi3" ,2,0x23800000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, 0 }, Imm_None }, |
{ "db" ,2,0x6C000000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbu" ,2,0x6C000000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dblo" ,2,0x6C010000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbls" ,2,0x6C020000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbhi" ,2,0x6C030000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbhs" ,2,0x6C040000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbeq" ,2,0x6C050000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbne" ,2,0x6C060000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dblt" ,2,0x6C070000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dble" ,2,0x6C080000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbgt" ,2,0x6C090000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbge" ,2,0x6C0A0000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbz" ,2,0x6C050000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbnz" ,2,0x6C060000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbp" ,2,0x6C090000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbn" ,2,0x6C070000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbnn" ,2,0x6C0A0000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbnv" ,2,0x6C0C0000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbv" ,2,0x6C0D0000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbnuf" ,2,0x6C0E0000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbuf" ,2,0x6C0F0000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbnc" ,2,0x6C040000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbc" ,2,0x6C010000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbnlv" ,2,0x6C100000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dblv" ,2,0x6C110000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbnluf" ,2,0x6C120000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbluf" ,2,0x6C130000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbzuf" ,2,0x6C140000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbd" ,2,0x6C200000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbud" ,2,0x6C200000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dblod" ,2,0x6C210000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dblsd" ,2,0x6C220000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbhid" ,2,0x6C230000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbhsd" ,2,0x6C240000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbeqd" ,2,0x6C250000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbned" ,2,0x6C260000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbltd" ,2,0x6C270000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbled" ,2,0x6C280000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbgtd" ,2,0x6C290000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbged" ,2,0x6C2A0000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbzd" ,2,0x6C250000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbnzd" ,2,0x6C260000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbpd" ,2,0x6C290000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbnd" ,2,0x6C270000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbnnd" ,2,0x6C2A0000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbnvd" ,2,0x6C2C0000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbvd" ,2,0x6C2D0000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbnufd" ,2,0x6C2E0000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbufd" ,2,0x6C2F0000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbncd" ,2,0x6C240000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbcd" ,2,0x6C210000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbnlvd" ,2,0x6C300000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dblvd" ,2,0x6C310000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbnlufd",2,0x6C320000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dblufd" ,2,0x6C330000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "dbzufd" ,2,0x6C340000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, |
{ "fix" ,2,0x05000000,AddressMode, { GAddr1, AllReg, 0 }, Imm_Float }, |
{ "float" ,2,0x05800000,AddressMode, { GAddr2, Rn, 0 }, Imm_SInt }, |
{ "iack" ,1,0x1B000000,AddressMode, { Direct|Indirect, 0, 0 }, Imm_None }, |
{ "idle" ,0,0x06000000,0, { 0, 0, 0 }, Imm_None }, |
{ "idle2" ,0,0x06000001,0, { 0, 0, 0 }, Imm_None }, /* LC31 Only */ |
{ "lde" ,2,0x06800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "ldf" ,2,0x07000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "ldfu" ,2,0x40000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "ldflo" ,2,0x40800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "ldfls" ,2,0x41000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "ldfhi" ,2,0x41800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "ldfhs" ,2,0x42000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "ldfeq" ,2,0x42800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "ldfne" ,2,0x43000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "ldflt" ,2,0x43800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "ldfle" ,2,0x44000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "ldfgt" ,2,0x44800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "ldfge" ,2,0x45000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "ldfz" ,2,0x42800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "ldfnz" ,2,0x43000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "ldfp" ,2,0x44800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "ldfn" ,2,0x43800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "ldfnn" ,2,0x45000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "ldfnv" ,2,0x46000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "ldfv" ,2,0x46800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "ldfnuf" ,2,0x47000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "ldfuf" ,2,0x47800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "ldfnc" ,2,0x42000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "ldfc" ,2,0x40800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "ldfnlv" ,2,0x48000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "ldflv" ,2,0x48800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "ldfnluf",2,0x49000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "ldfluf" ,2,0x49800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "ldfzuf" ,2,0x4A000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "ldfi" ,2,0x07800000,AddressMode, { Direct|Indirect, Rn, 0 }, Imm_None }, |
{ "ldi" ,2,0x08000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "ldiu" ,2,0x50000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "ldilo" ,2,0x50800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "ldils" ,2,0x51000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "ldihi" ,2,0x51800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "ldihs" ,2,0x52000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "ldieq" ,2,0x52800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "ldine" ,2,0x53000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "ldilt" ,2,0x53800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "ldile" ,2,0x54000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "ldigt" ,2,0x54800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "ldige" ,2,0x55000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "ldiz" ,2,0x52800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "ldinz" ,2,0x53000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "ldip" ,2,0x54800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "ldin" ,2,0x53800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "ldinn" ,2,0x55000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "ldinv" ,2,0x56000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "ldiv" ,2,0x56800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "ldinuf" ,2,0x57000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "ldiuf" ,2,0x57800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "ldinc" ,2,0x52000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "ldic" ,2,0x50800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "ldinlv" ,2,0x58000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "ldilv" ,2,0x58800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "ldinluf",2,0x59000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "ldiluf" ,2,0x59800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "ldizuf" ,2,0x5A000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "ldii" ,2,0x08800000,AddressMode, { Direct|Indirect, AllReg, 0 }, Imm_None }, |
{ "ldm" ,2,0x09000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "ldp" ,2,0x08700000,0, { Abs24|Direct, DPReg|NotReq, 0 }, Imm_UInt }, |
{ "lopower",0,0x10800001,0, { 0, 0, 0 }, Imm_None }, /* LC31 Only */ |
{ "lsh" ,2,0x09800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_UInt }, |
{ "lsh3" ,3,0x24000000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, AllReg }, Imm_None }, |
{ "maxspeed",0,0x10800000,0, { 0, 0, 0 }, Imm_None }, /* LC31 Only */ |
{ "mpyf" ,2,0x0A000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "mpyf3" ,3,0x24800000,AddressMode, { TAddr1, TAddr2, Rn }, Imm_None }, |
{ "mpyi" ,2,0x0A800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "mpyi3" ,3,0x25000000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, AllReg }, Imm_None }, |
{ "negb" ,2,0x0B000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "negf" ,2,0x0B800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "negi" ,2,0x0C000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "nop" ,1,0x0C800000,AddressMode, { AllReg|Indirect|NotReq, 0, 0 }, Imm_None }, |
{ "norm" ,2,0x0D000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, /*Check another source*/ |
{ "not" ,2,0x0D800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_UInt }, |
{ "or" ,2,0x10000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_UInt }, |
{ "or3" ,3,0x25800000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, AllReg }, Imm_None }, |
{ "pop" ,1,0x0E200000,StackOp, { AllReg, 0, 0 }, Imm_None }, |
{ "popf" ,1,0x0EA00000,StackOp, { Rn, 0, 0 }, Imm_None }, |
{ "push" ,1,0x0F200000,StackOp, { AllReg, 0, 0 }, Imm_None }, |
{ "pushf" ,1,0x0FA00000,StackOp, { Rn, 0, 0 }, Imm_None }, |
{ "reti" ,0,0x78000000,0, { 0, 0, 0 }, Imm_None }, |
{ "retiu" ,0,0x78000000,0, { 0, 0, 0 }, Imm_None }, |
{ "retilo" ,0,0x78010000,0, { 0, 0, 0 }, Imm_None }, |
{ "retils" ,0,0x78020000,0, { 0, 0, 0 }, Imm_None }, |
{ "retihi" ,0,0x78030000,0, { 0, 0, 0 }, Imm_None }, |
{ "retihs" ,0,0x78040000,0, { 0, 0, 0 }, Imm_None }, |
{ "retieq" ,0,0x78050000,0, { 0, 0, 0 }, Imm_None }, |
{ "retine" ,0,0x78060000,0, { 0, 0, 0 }, Imm_None }, |
{ "retilt" ,0,0x78070000,0, { 0, 0, 0 }, Imm_None }, |
{ "retile" ,0,0x78080000,0, { 0, 0, 0 }, Imm_None }, |
{ "retigt" ,0,0x78090000,0, { 0, 0, 0 }, Imm_None }, |
{ "retige" ,0,0x780A0000,0, { 0, 0, 0 }, Imm_None }, |
{ "retiz" ,0,0x78050000,0, { 0, 0, 0 }, Imm_None }, |
{ "retinz" ,0,0x78060000,0, { 0, 0, 0 }, Imm_None }, |
{ "retip" ,0,0x78090000,0, { 0, 0, 0 }, Imm_None }, |
{ "retin" ,0,0x78070000,0, { 0, 0, 0 }, Imm_None }, |
{ "retinn" ,0,0x780A0000,0, { 0, 0, 0 }, Imm_None }, |
{ "retinv" ,0,0x780C0000,0, { 0, 0, 0 }, Imm_None }, |
{ "retiv" ,0,0x780D0000,0, { 0, 0, 0 }, Imm_None }, |
{ "retinuf",0,0x780E0000,0, { 0, 0, 0 }, Imm_None }, |
{ "retiuf" ,0,0x780F0000,0, { 0, 0, 0 }, Imm_None }, |
{ "retinc" ,0,0x78040000,0, { 0, 0, 0 }, Imm_None }, |
{ "retic" ,0,0x78010000,0, { 0, 0, 0 }, Imm_None }, |
{ "retinlv",0,0x78100000,0, { 0, 0, 0 }, Imm_None }, |
{ "retilv" ,0,0x78110000,0, { 0, 0, 0 }, Imm_None }, |
{ "retinluf",0,0x78120000,0, { 0, 0, 0 }, Imm_None }, |
{ "retiluf",0,0x78130000,0, { 0, 0, 0 }, Imm_None }, |
{ "retizuf",0,0x78140000,0, { 0, 0, 0 }, Imm_None }, |
{ "rets" ,0,0x78800000,0, { 0, 0, 0 }, Imm_None }, |
{ "retsu" ,0,0x78800000,0, { 0, 0, 0 }, Imm_None }, |
{ "retslo" ,0,0x78810000,0, { 0, 0, 0 }, Imm_None }, |
{ "retsls" ,0,0x78820000,0, { 0, 0, 0 }, Imm_None }, |
{ "retshi" ,0,0x78830000,0, { 0, 0, 0 }, Imm_None }, |
{ "retshs" ,0,0x78840000,0, { 0, 0, 0 }, Imm_None }, |
{ "retseq" ,0,0x78850000,0, { 0, 0, 0 }, Imm_None }, |
{ "retsne" ,0,0x78860000,0, { 0, 0, 0 }, Imm_None }, |
{ "retslt" ,0,0x78870000,0, { 0, 0, 0 }, Imm_None }, |
{ "retsle" ,0,0x78880000,0, { 0, 0, 0 }, Imm_None }, |
{ "retsgt" ,0,0x78890000,0, { 0, 0, 0 }, Imm_None }, |
{ "retsge" ,0,0x788A0000,0, { 0, 0, 0 }, Imm_None }, |
{ "retsz" ,0,0x78850000,0, { 0, 0, 0 }, Imm_None }, |
{ "retsnz" ,0,0x78860000,0, { 0, 0, 0 }, Imm_None }, |
{ "retsp" ,0,0x78890000,0, { 0, 0, 0 }, Imm_None }, |
{ "retsn" ,0,0x78870000,0, { 0, 0, 0 }, Imm_None }, |
{ "retsnn" ,0,0x788A0000,0, { 0, 0, 0 }, Imm_None }, |
{ "retsnv" ,0,0x788C0000,0, { 0, 0, 0 }, Imm_None }, |
{ "retsv" ,0,0x788D0000,0, { 0, 0, 0 }, Imm_None }, |
{ "retsnuf",0,0x788E0000,0, { 0, 0, 0 }, Imm_None }, |
{ "retsuf" ,0,0x788F0000,0, { 0, 0, 0 }, Imm_None }, |
{ "retsnc" ,0,0x78840000,0, { 0, 0, 0 }, Imm_None }, |
{ "retsc" ,0,0x78810000,0, { 0, 0, 0 }, Imm_None }, |
{ "retsnlv",0,0x78900000,0, { 0, 0, 0 }, Imm_None }, |
{ "retslv" ,0,0x78910000,0, { 0, 0, 0 }, Imm_None }, |
{ "retsnluf",0,0x78920000,0, { 0, 0, 0 }, Imm_None }, |
{ "retsluf",0,0x78930000,0, { 0, 0, 0 }, Imm_None }, |
{ "retszuf",0,0x78940000,0, { 0, 0, 0 }, Imm_None }, |
{ "rnd" ,2,0x11000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "rol" ,1,0x11E00001,Rotate, { AllReg, 0, 0 }, Imm_None }, |
{ "rolc" ,1,0x12600001,Rotate, { AllReg, 0, 0 }, Imm_None }, |
{ "ror" ,1,0x12E0FFFF,Rotate, { AllReg, 0, 0 }, Imm_None }, |
{ "rorc" ,1,0x1360FFFF,Rotate, { AllReg, 0, 0 }, Imm_None }, |
{ "rptb" ,1,0x64000000,0, { Imm24, 0, 0 }, Imm_UInt }, |
{ "rpts" ,1,0x139B0000,AddressMode, { GAddr2, 0, 0 }, Imm_UInt }, |
{ "sigi" ,0,0x16000000,0, { 0, 0, 0 }, Imm_None }, |
{ "stf" ,2,0x14000000,AddressMode, { Rn, Direct|Indirect, 0 }, Imm_Float }, |
{ "stfi" ,2,0x14800000,AddressMode, { Rn, Direct|Indirect, 0 }, Imm_Float }, |
{ "sti" ,2,0x15000000,AddressMode, { AllReg, Direct|Indirect, 0 }, Imm_SInt }, |
{ "stii" ,2,0x15800000,AddressMode, { AllReg, Direct|Indirect, 0 }, Imm_SInt }, |
{ "subb" ,2,0x16800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "subb3" ,3,0x26000000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, AllReg }, Imm_None }, |
{ "subc" ,2,0x17000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_UInt }, |
{ "subf" ,2,0x17800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "subf3" ,3,0x26800000,AddressMode, { TAddr1, TAddr2, Rn }, Imm_None }, |
{ "subi" ,2,0x18000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "subi3" ,3,0x27000000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, AllReg }, Imm_None }, |
{ "subrb" ,2,0x18800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "subrf" ,2,0x19000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, |
{ "subri" ,2,0x19800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, |
{ "swi" ,0,0x66000000,0, { 0, 0, 0 }, Imm_None }, |
{ "trap" ,1,0x74800020,0, { IVector, 0, 0 }, Imm_None }, |
{ "trapu" ,1,0x74800020,0, { IVector, 0, 0 }, Imm_None }, |
{ "traplo" ,1,0x74810020,0, { IVector, 0, 0 }, Imm_None }, |
{ "trapls" ,1,0x74820020,0, { IVector, 0, 0 }, Imm_None }, |
{ "traphi" ,1,0x74830020,0, { IVector, 0, 0 }, Imm_None }, |
{ "traphs" ,1,0x74840020,0, { IVector, 0, 0 }, Imm_None }, |
{ "trapeq" ,1,0x74850020,0, { IVector, 0, 0 }, Imm_None }, |
{ "trapne" ,1,0x74860020,0, { IVector, 0, 0 }, Imm_None }, |
{ "traplt" ,1,0x74870020,0, { IVector, 0, 0 }, Imm_None }, |
{ "traple" ,1,0x74880020,0, { IVector, 0, 0 }, Imm_None }, |
{ "trapgt" ,1,0x74890020,0, { IVector, 0, 0 }, Imm_None }, |
{ "trapge" ,1,0x748A0020,0, { IVector, 0, 0 }, Imm_None }, |
{ "trapz" ,1,0x74850020,0, { IVector, 0, 0 }, Imm_None }, |
{ "trapnz" ,1,0x74860020,0, { IVector, 0, 0 }, Imm_None }, |
{ "trapp" ,1,0x74890020,0, { IVector, 0, 0 }, Imm_None }, |
{ "trapn" ,1,0x74870020,0, { IVector, 0, 0 }, Imm_None }, |
{ "trapnn" ,1,0x748A0020,0, { IVector, 0, 0 }, Imm_None }, |
{ "trapnv" ,1,0x748C0020,0, { IVector, 0, 0 }, Imm_None }, |
{ "trapv" ,1,0x748D0020,0, { IVector, 0, 0 }, Imm_None }, |
{ "trapnuf",1,0x748E0020,0, { IVector, 0, 0 }, Imm_None }, |
{ "trapuf" ,1,0x748F0020,0, { IVector, 0, 0 }, Imm_None }, |
{ "trapnc" ,1,0x74840020,0, { IVector, 0, 0 }, Imm_None }, |
{ "trapc" ,1,0x74810020,0, { IVector, 0, 0 }, Imm_None }, |
{ "trapnlv",1,0x74900020,0, { IVector, 0, 0 }, Imm_None }, |
{ "traplv" ,1,0x74910020,0, { IVector, 0, 0 }, Imm_None }, |
{ "trapnluf",1,0x74920020,0, { IVector, 0, 0 }, Imm_None }, |
{ "trapluf",1,0x74930020,0, { IVector, 0, 0 }, Imm_None }, |
{ "trapzuf",1,0x74940020,0, { IVector, 0, 0 }, Imm_None }, |
{ "tstb" ,2,0x1A000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_UInt }, |
{ "tstb3" ,2,0x27800000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, 0 }, Imm_None }, |
{ "xor" ,2,0x1A800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_UInt }, |
{ "xor3" ,3,0x28000000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, AllReg }, Imm_None }, |
{ "" ,0,0x00000000,0, { 0, 0, 0 }, 0 } |
}; |
static const insn_template *const tic30_optab_end = |
tic30_optab + sizeof(tic30_optab)/sizeof(tic30_optab[0]); |
typedef struct { |
char *name; |
unsigned int operands_1; |
unsigned int operands_2; |
unsigned int base_opcode; |
unsigned int operand_types[2][3]; |
/* Which operand fits into which part of the final opcode word. */ |
int oporder; |
} partemplate; |
/* oporder defines - not very descriptive. */ |
#define OO_4op1 0 |
#define OO_4op2 1 |
#define OO_4op3 2 |
#define OO_5op1 3 |
#define OO_5op2 4 |
#define OO_PField 5 |
static const partemplate tic30_paroptab[] = { |
{ "q_absf_stf", 2,2,0xC8000000, { { Indirect, Rn, 0 }, { Rn, Indirect, 0 } }, |
OO_4op1 }, |
{ "q_absi_sti", 2,2,0xCA000000, { { Indirect, Rn, 0 }, { Rn, Indirect, 0 } }, |
OO_4op1 }, |
{ "q_addf3_stf", 3,2,0xCC000000, { { Indirect, Rn, Rn }, { Rn, Indirect, 0 } }, |
OO_5op1 }, |
{ "q_addi3_sti", 3,2,0xCE000000, { { Indirect, Rn, Rn }, { Rn, Indirect, 0 } }, |
OO_5op1 }, |
{ "q_and3_sti", 3,2,0xD0000000, { { Indirect, Rn, Rn }, { Rn, Indirect, 0 } }, |
OO_5op1 }, |
{ "q_ash3_sti", 3,2,0xD2000000, { { Rn, Indirect, Rn }, { Rn, Indirect, 0 } }, |
OO_5op2 }, |
{ "q_fix_sti", 2,2,0xD4000000, { { Indirect, Rn, 0 }, { Rn, Indirect, 0 } }, |
OO_4op1 }, |
{ "q_float_stf", 2,2,0xD6000000, { { Indirect, Rn, 0 }, { Rn, Indirect, 0 } }, |
OO_4op1 }, |
{ "q_ldf_ldf", 2,2,0xC4000000, { { Indirect, Rn, 0 }, { Indirect, Rn, 0 } }, |
OO_4op2 }, |
{ "q_ldf_stf", 2,2,0xD8000000, { { Indirect, Rn, 0 }, { Rn, Indirect, 0 } }, |
OO_4op1 }, |
{ "q_ldi_ldi", 2,2,0xC6000000, { { Indirect, Rn, 0 }, { Indirect, Rn, 0 } }, |
OO_4op2 }, |
{ "q_ldi_sti", 2,2,0xDA000000, { { Indirect, Rn, 0 }, { Rn, Indirect, 0 } }, |
OO_4op1 }, |
{ "q_lsh3_sti", 3,2,0xDC000000, { { Rn, Indirect, Rn }, { Rn, Indirect, 0 } }, |
OO_5op2 }, |
{ "q_mpyf3_addf3",3,3,0x80000000, { { Rn | Indirect, Rn | Indirect, Rn }, |
{ Rn | Indirect, Rn | Indirect, Rn } }, OO_PField }, |
{ "q_mpyf3_stf", 3,2,0xDE000000, { { Indirect, Rn, Rn }, { Rn, Indirect, 0 } }, |
OO_5op1 }, |
{ "q_mpyf3_subf3",3,3,0x84000000, { { Rn | Indirect, Rn | Indirect, Rn }, |
{ Rn | Indirect, Rn | Indirect, Rn } }, OO_PField }, |
{ "q_mpyi3_addi3",3,3,0x88000000, { { Rn | Indirect, Rn | Indirect, Rn }, |
{ Rn | Indirect, Rn | Indirect, Rn } }, OO_PField }, |
{ "q_mpyi3_sti", 3,2,0xE0000000, { { Indirect, Rn, Rn }, { Rn, Indirect, 0 } }, |
OO_5op1 }, |
{ "q_mpyi3_subi3",3,3,0x8C000000, { { Rn | Indirect, Rn | Indirect, Rn }, |
{ Rn | Indirect, Rn | Indirect, Rn } }, OO_PField }, |
{ "q_negf_stf", 2,2,0xE2000000, { { Indirect, Rn, 0 }, { Rn, Indirect, 0 } }, |
OO_4op1 }, |
{ "q_negi_sti", 2,2,0xE4000000, { { Indirect, Rn, 0 }, { Rn, Indirect, 0 } }, |
OO_4op1 }, |
{ "q_not_sti", 2,2,0xE6000000, { { Indirect, Rn, 0 }, { Rn, Indirect, 0 } }, |
OO_4op1 }, |
{ "q_or3_sti", 3,2,0xE8000000, { { Indirect, Rn, Rn }, { Rn, Indirect, 0 } }, |
OO_5op1 }, |
{ "q_stf_stf", 2,2,0xC0000000, { { Rn, Indirect, 0 }, { Rn, Indirect, 0 } }, |
OO_4op3 }, |
{ "q_sti_sti", 2,2,0xC2000000, { { Rn, Indirect, 0 }, { Rn, Indirect, 0 } }, |
OO_4op3 }, |
{ "q_subf3_stf", 3,2,0xEA000000, { { Rn, Indirect, Rn }, { Rn, Indirect, 0 } }, |
OO_5op2 }, |
{ "q_subi3_sti", 3,2,0xEC000000, { { Rn, Indirect, Rn }, { Rn, Indirect, 0 } }, |
OO_5op2 }, |
{ "q_xor3_sti", 3,2,0xEE000000, { { Indirect, Rn, Rn }, { Rn, Indirect, 0 } }, |
OO_5op1 }, |
{ "", 0,0,0x00000000, { { 0, 0, 0 }, { 0, 0, 0 } }, 0 } |
}; |
static const partemplate *const tic30_paroptab_end = |
tic30_paroptab + sizeof(tic30_paroptab)/sizeof(tic30_paroptab[0]); |
#endif |
/contrib/toolchain/binutils/include/opcode/tic4x.h |
---|
0,0 → 1,1079 |
/* Table of opcodes for the Texas Instruments TMS320C[34]X family. |
Copyright (C) 2002, 2003, 2010 Free Software Foundation. |
Contributed by Michael P. Hayes (m.hayes@elec.canterbury.ac.nz) |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#define IS_CPU_TIC3X(v) ((v) == 30 || (v) == 31 || (v) == 32 || (v) == 33) |
#define IS_CPU_TIC4X(v) ((v) == 0 || (v) == 40 || (v) == 44) |
/* Define some bitfield extraction/insertion macros. */ |
#define EXTR(inst, m, l) ((inst) << (31 - (m)) >> (31 - ((m) - (l)))) |
#define EXTRU(inst, m, l) EXTR ((unsigned long)(inst), (m), (l)) |
#define EXTRS(inst, m, l) EXTR ((long)(inst), (m), (l)) |
#define INSERTU(inst, val, m, l) (inst |= ((val) << (l))) |
#define INSERTS(inst, val, m, l) INSERTU (inst, ((val) & ((1 << ((m) - (l) + 1)) - 1)), m, l) |
/* Define register numbers. */ |
typedef enum |
{ |
REG_R0, REG_R1, REG_R2, REG_R3, |
REG_R4, REG_R5, REG_R6, REG_R7, |
REG_AR0, REG_AR1, REG_AR2, REG_AR3, |
REG_AR4, REG_AR5, REG_AR6, REG_AR7, |
REG_DP, REG_IR0, REG_IR1, REG_BK, |
REG_SP, REG_ST, REG_DIE, REG_IIE, |
REG_IIF, REG_RS, REG_RE, REG_RC, |
REG_R8, REG_R9, REG_R10, REG_R11, |
REG_IVTP, REG_TVTP |
} |
c4x_reg_t; |
/* Note that the actual register numbers for IVTP is 0 and TVTP is 1. */ |
#define REG_IE REG_DIE /* C3x only */ |
#define REG_IF REG_IIE /* C3x only */ |
#define REG_IOF REG_IIF /* C3x only */ |
#define TIC3X_REG_MAX REG_RC |
#define TIC4X_REG_MAX REG_TVTP |
/* Register table size including C4x expansion regs. */ |
#define REG_TABLE_SIZE (TIC4X_REG_MAX + 1) |
struct tic4x_register |
{ |
char * name; |
unsigned long regno; |
}; |
typedef struct tic4x_register tic4x_register_t; |
/* We could store register synonyms here. */ |
static const tic4x_register_t tic3x_registers[] = |
{ |
{"f0", REG_R0}, |
{"r0", REG_R0}, |
{"f1", REG_R1}, |
{"r1", REG_R1}, |
{"f2", REG_R2}, |
{"r2", REG_R2}, |
{"f3", REG_R3}, |
{"r3", REG_R3}, |
{"f4", REG_R4}, |
{"r4", REG_R4}, |
{"f5", REG_R5}, |
{"r5", REG_R5}, |
{"f6", REG_R6}, |
{"r6", REG_R6}, |
{"f7", REG_R7}, |
{"r7", REG_R7}, |
{"ar0", REG_AR0}, |
{"ar1", REG_AR1}, |
{"ar2", REG_AR2}, |
{"ar3", REG_AR3}, |
{"ar4", REG_AR4}, |
{"ar5", REG_AR5}, |
{"ar6", REG_AR6}, |
{"ar7", REG_AR7}, |
{"dp", REG_DP}, |
{"ir0", REG_IR0}, |
{"ir1", REG_IR1}, |
{"bk", REG_BK}, |
{"sp", REG_SP}, |
{"st", REG_ST}, |
{"ie", REG_IE}, |
{"if", REG_IF}, |
{"iof", REG_IOF}, |
{"rs", REG_RS}, |
{"re", REG_RE}, |
{"rc", REG_RC}, |
{"", 0} |
}; |
const unsigned int tic3x_num_registers = (((sizeof tic3x_registers) / (sizeof tic3x_registers[0])) - 1); |
/* Define C4x registers in addition to C3x registers. */ |
static const tic4x_register_t tic4x_registers[] = |
{ |
{"die", REG_DIE}, /* Clobbers C3x REG_IE */ |
{"iie", REG_IIE}, /* Clobbers C3x REG_IF */ |
{"iif", REG_IIF}, /* Clobbers C3x REG_IOF */ |
{"f8", REG_R8}, |
{"r8", REG_R8}, |
{"f9", REG_R9}, |
{"r9", REG_R9}, |
{"f10", REG_R10}, |
{"r10", REG_R10}, |
{"f11", REG_R11}, |
{"r11", REG_R11}, |
{"ivtp", REG_IVTP}, |
{"tvtp", REG_TVTP}, |
{"", 0} |
}; |
const unsigned int tic4x_num_registers = (((sizeof tic4x_registers) / (sizeof tic4x_registers[0])) - 1); |
struct tic4x_cond |
{ |
char * name; |
unsigned long cond; |
}; |
typedef struct tic4x_cond tic4x_cond_t; |
/* Define conditional branch/load suffixes. Put desired form for |
disassembler last. */ |
static const tic4x_cond_t tic4x_conds[] = |
{ |
{ "u", 0x00 }, |
{ "c", 0x01 }, { "lo", 0x01 }, |
{ "ls", 0x02 }, |
{ "hi", 0x03 }, |
{ "nc", 0x04 }, { "hs", 0x04 }, |
{ "z", 0x05 }, { "eq", 0x05 }, |
{ "nz", 0x06 }, { "ne", 0x06 }, |
{ "n", 0x07 }, { "l", 0x07 }, { "lt", 0x07 }, |
{ "le", 0x08 }, |
{ "p", 0x09 }, { "gt", 0x09 }, |
{ "nn", 0x0a }, { "ge", 0x0a }, |
{ "nv", 0x0c }, |
{ "v", 0x0d }, |
{ "nuf", 0x0e }, |
{ "uf", 0x0f }, |
{ "nlv", 0x10 }, |
{ "lv", 0x11 }, |
{ "nluf", 0x12 }, |
{ "luf", 0x13 }, |
{ "zuf", 0x14 }, |
/* Dummy entry, not included in num_conds. This |
lets code examine entry i+1 without checking |
if we've run off the end of the table. */ |
{ "", 0x0} |
}; |
const unsigned int tic4x_num_conds = (((sizeof tic4x_conds) / (sizeof tic4x_conds[0])) - 1); |
struct tic4x_indirect |
{ |
char * name; |
unsigned long modn; |
}; |
typedef struct tic4x_indirect tic4x_indirect_t; |
/* Define indirect addressing modes where: |
d displacement (signed) |
y ir0 |
z ir1 */ |
static const tic4x_indirect_t tic4x_indirects[] = |
{ |
{ "*+a(d)", 0x00 }, |
{ "*-a(d)", 0x01 }, |
{ "*++a(d)", 0x02 }, |
{ "*--a(d)", 0x03 }, |
{ "*a++(d)", 0x04 }, |
{ "*a--(d)", 0x05 }, |
{ "*a++(d)%", 0x06 }, |
{ "*a--(d)%", 0x07 }, |
{ "*+a(y)", 0x08 }, |
{ "*-a(y)", 0x09 }, |
{ "*++a(y)", 0x0a }, |
{ "*--a(y)", 0x0b }, |
{ "*a++(y)", 0x0c }, |
{ "*a--(y)", 0x0d }, |
{ "*a++(y)%", 0x0e }, |
{ "*a--(y)%", 0x0f }, |
{ "*+a(z)", 0x10 }, |
{ "*-a(z)", 0x11 }, |
{ "*++a(z)", 0x12 }, |
{ "*--a(z)", 0x13 }, |
{ "*a++(z)", 0x14 }, |
{ "*a--(z)", 0x15 }, |
{ "*a++(z)%", 0x16 }, |
{ "*a--(z)%", 0x17 }, |
{ "*a", 0x18 }, |
{ "*a++(y)b", 0x19 }, |
/* Dummy entry, not included in num_indirects. This |
lets code examine entry i+1 without checking |
if we've run off the end of the table. */ |
{ "", 0x0} |
}; |
#define TIC3X_MODN_MAX 0x19 |
const unsigned int tic4x_num_indirects = (((sizeof tic4x_indirects) / (sizeof tic4x_indirects[0])) - 1); |
/* Instruction template. */ |
struct tic4x_inst |
{ |
char * name; |
unsigned long opcode; |
unsigned long opmask; |
char * args; |
unsigned long oplevel; |
}; |
typedef struct tic4x_inst tic4x_inst_t; |
/* Opcode infix |
B condition 16--20 U,C,Z,LO,HI, etc. |
C condition 23--27 U,C,Z,LO,HI, etc. |
Arguments |
, required arg follows |
; optional arg follows |
Argument types bits [classes] - example |
----------------------------------------------------------- |
* indirect (all) 0--15 [A,AB,AU,AF,A2,A3,A6,A7,AY,B,BA,BB,BI,B6,B7] - *+AR0(5), *++AR0(IR0) |
# direct (for LDP) 0--15 [Z] - @start, start |
@ direct 0--15 [A,AB,AU,AF,A3,A6,A7,AY,B,BA,BB,BI,B6,B7] - @start, start |
A address register 22--24 [D] - AR0, AR7 |
B unsigned integer 0--23 [I,I2] - @start, start (absolute on C3x, relative on C4x) |
C indirect (disp - C4x) 0--7 [S,SC,S2,T,TC,T2,T2C] - *+AR0(5) |
E register (all) 0--7 [T,TC,T2,T2C] - R0, R7, R11, AR0, DP |
e register (0-11) 0--7 [S,SC,S2] - R0, R7, R11 |
F short float immediate 0--15 [AF,B,BA,BB] - 3.5, 0e-3.5e-1 |
G register (all) 8--15 [T,TC,T2,T2C] - R0, R7, R11, AR0, DP |
g register (0-11) 0--7 [S,SC,S2] - R0, R7, R11 |
H register (0-7) 18--16 [LS,M,P,Q] - R0, R7 |
I indirect (no disp) 0--7 [S,SC,S2,T,TC,T2,T2C] - *+AR0(1), *+AR0(IR0) |
i indirect (enhanced) 0--7 [LL,LS,M,P,Q,QC] - *+AR0(1), R5 |
J indirect (no disp) 8--15 [LL,LS,P,Q,QC,S,SC,S2,T,TC,T2,T2C] - *+AR0(1), *+AR0(IR0) |
j indirect (enhanced) 8--15 [M] - *+AR0(1), R5 |
K register 19--21 [LL,M,Q,QC] - R0, R7 |
L register 22--24 [LL,LS,P,Q,QC] - R0, R7 |
M register (R2,R3) 22--22 [M] R2, R3 |
N register (R0,R1) 23--23 [M] R0, R1 |
O indirect(disp - C4x) 8--15 [S,SC,S2,T,TC,T2] - *+AR0(5) |
P displacement (PC Rel) 0--15 [D,J,JS] - @start, start |
Q register (all) 0--15 [A,AB,AU,A2,A3,AY,BA,BI,D,I2,J,JS] - R0, AR0, DP, SP |
q register (0-11) 0--15 [AF,B,BB] - R0, R7, R11 |
R register (all) 16--20 [A,AB,AU,AF,A6,A7,R,T,TC] - R0, AR0, DP, SP |
r register (0-11) 16--20 [B,BA,BB,BI,B6,B7,RF,S,SC] - R0, R1, R11 |
S short int immediate 0--15 [A,AB,AY,BI] - -5, 5 |
T integer (C4x) 16--20 [Z] - -5, 12 |
U unsigned integer 0--15 [AU,A3] - 0, 65535 |
V vector (C4x: 0--8) 0--4 [Z] - 25, 7 |
W short int (C4x) 0--7 [T,TC,T2,T2C] - -3, 5 |
X expansion reg (C4x) 0--4 [Z] - IVTP, TVTP |
Y address reg (C4x) 16--20 [Z] - AR0, DP, SP, IR0 |
Z expansion reg (C4x) 16--20 [Z] - IVTP, TVTP |
*/ |
#define TIC4X_OPERANDS_MAX 7 /* Max number of operands for an inst. */ |
#define TIC4X_NAME_MAX 16 /* Max number of chars in parallel name. */ |
/* Define the instruction level */ |
#define OP_C3X 0x1 /* C30 support - supported by all */ |
#define OP_C4X 0x2 /* C40 support - C40, C44 */ |
#define OP_ENH 0x4 /* Class LL,LS,M,P,Q,QC enhancements. Argument type |
I and J is enhanced in these classes - C31>=6.0, |
C32>=2.0, C33 */ |
#define OP_LPWR 0x8 /* Low power support (LOPOWER, MAXSPEED) - C30>=7.0, |
LC31, C31>=5.0, C32 */ |
#define OP_IDLE2 0x10 /* Idle2 support (IDLE2) - C30>=7.0, LC31, C31>=5.0, |
C32, C33, C40>=5.0, C44 */ |
/* The following class definition is a classification scheme for |
putting instructions with similar type of arguments together. It |
simplifies the op-code definitions significantly, as we then only |
need to use the class macroes for 95% of the DSP's opcodes. |
*/ |
/* A: General 2-operand integer operations |
Syntax: <i> src, dst |
src = Register (Q), Direct (@), Indirect (*), Signed immediate (S) |
dst = Register (R) |
Instr: 15/8 - ABSI, ADDC, ADDI, ASH, CMPI, LDI, LSH, MPYI, NEGB, NEGI, |
SUBB, SUBC, SUBI, SUBRB, SUBRI, C4x: LBn, LHn, LWLn, LWRn, |
MBn, MHn, MPYSHI, MPYUHI |
*/ |
#define A_CLASS_INSN(name, opcode, level) \ |
{ name, opcode|0x00000000, 0xffe00000, "Q;R", level }, \ |
{ name, opcode|0x00200000, 0xffe00000, "@,R", level }, \ |
{ name, opcode|0x00400000, 0xffe00000, "*,R", level }, \ |
{ name, opcode|0x00600000, 0xffe00000, "S,R", level } |
/* AB: General 2-operand integer operation with condition |
Syntax: <i>c src, dst |
c = Condition |
src = Register (Q), Direct (@), Indirect (*), Signed immediate (S) |
dst = Register (R) |
Instr: 1/0 - LDIc |
*/ |
#define AB_CLASS_INSN(name, opcode, level) \ |
{ name, opcode|0x40000000, 0xf0600000, "Q;R", level }, \ |
{ name, opcode|0x40200000, 0xf0600000, "@,R", level }, \ |
{ name, opcode|0x40400000, 0xf0600000, "*,R", level }, \ |
{ name, opcode|0x40600000, 0xf0600000, "S,R", level } |
/* AU: General 2-operand unsigned integer operation |
Syntax: <i> src, dst |
src = Register (Q), Direct (@), Indirect (*), Unsigned immediate (U) |
dst = Register (R) |
Instr: 6/2 - AND, ANDN, NOT, OR, TSTB, XOR, C4x: LBUn, LHUn |
*/ |
#define AU_CLASS_INSN(name, opcode, level) \ |
{ name, opcode|0x00000000, 0xffe00000, "Q;R", level }, \ |
{ name, opcode|0x00200000, 0xffe00000, "@,R", level }, \ |
{ name, opcode|0x00400000, 0xffe00000, "*,R", level }, \ |
{ name, opcode|0x00600000, 0xffe00000, "U,R", level } |
/* AF: General 2-operand float to integer operation |
Syntax: <i> src, dst |
src = Register 0-11 (q), Direct (@), Indirect (*), Float immediate (F) |
dst = Register (R) |
Instr: 1/0 - FIX |
*/ |
#define AF_CLASS_INSN(name, opcode, level) \ |
{ name, opcode|0x00000000, 0xffe00000, "q;R", level }, \ |
{ name, opcode|0x00200000, 0xffe00000, "@,R", level }, \ |
{ name, opcode|0x00400000, 0xffe00000, "*,R", level }, \ |
{ name, opcode|0x00600000, 0xffe00000, "F,R", level } |
/* A2: Limited 1-operand (integer) operation |
Syntax: <i> src |
src = Register (Q), Indirect (*), None |
Instr: 1/0 - NOP |
*/ |
#define A2_CLASS_INSN(name, opcode, level) \ |
{ name, opcode|0x00000000, 0xffe00000, "Q", level }, \ |
{ name, opcode|0x00400000, 0xffe00000, "*", level }, \ |
{ name, opcode|0x00000000, 0xffe00000, "" , level } |
/* A3: General 1-operand unsigned integer operation |
Syntax: <i> src |
src = Register (Q), Direct (@), Indirect (*), Unsigned immediate (U) |
Instr: 1/0 - RPTS |
*/ |
#define A3_CLASS_INSN(name, opcode, level) \ |
{ name, opcode|0x00000000, 0xffff0000, "Q", level }, \ |
{ name, opcode|0x00200000, 0xffff0000, "@", level }, \ |
{ name, opcode|0x00400000, 0xffff0000, "*", level }, \ |
{ name, opcode|0x00600000, 0xffff0000, "U", level } |
/* A6: Limited 2-operand integer operation |
Syntax: <i> src, dst |
src = Direct (@), Indirect (*) |
dst = Register (R) |
Instr: 1/1 - LDII, C4x: SIGI |
*/ |
#define A6_CLASS_INSN(name, opcode, level) \ |
{ name, opcode|0x00200000, 0xffe00000, "@,R", level }, \ |
{ name, opcode|0x00400000, 0xffe00000, "*,R", level } |
/* A7: Limited 2-operand integer store operation |
Syntax: <i> src, dst |
src = Register (R) |
dst = Direct (@), Indirect (*) |
Instr: 2/0 - STI, STII |
*/ |
#define A7_CLASS_INSN(name, opcode, level) \ |
{ name, opcode|0x00200000, 0xffe00000, "R,@", level }, \ |
{ name, opcode|0x00400000, 0xffe00000, "R,*", level } |
/* AY: General 2-operand signed address load operation |
Syntax: <i> src, dst |
src = Register (Q), Direct (@), Indirect (*), Signed immediate (S) |
dst = Address register - ARx, IRx, DP, BK, SP (Y) |
Instr: 0/1 - C4x: LDA |
Note: Q and Y should *never* be the same register |
*/ |
#define AY_CLASS_INSN(name, opcode, level) \ |
{ name, opcode|0x00000000, 0xffe00000, "Q,Y", level }, \ |
{ name, opcode|0x00200000, 0xffe00000, "@,Y", level }, \ |
{ name, opcode|0x00400000, 0xffe00000, "*,Y", level }, \ |
{ name, opcode|0x00600000, 0xffe00000, "S,Y", level } |
/* B: General 2-operand float operation |
Syntax: <i> src, dst |
src = Register 0-11 (q), Direct (@), Indirect (*), Float immediate (F) |
dst = Register 0-11 (r) |
Instr: 12/2 - ABSF, ADDF, CMPF, LDE, LDF, LDM, MPYF, NEGF, NORM, RND, |
SUBF, SUBRF, C4x: RSQRF, TOIEEE |
*/ |
#define B_CLASS_INSN(name, opcode, level) \ |
{ name, opcode|0x00000000, 0xffe00000, "q;r", level }, \ |
{ name, opcode|0x00200000, 0xffe00000, "@,r", level }, \ |
{ name, opcode|0x00400000, 0xffe00000, "*,r", level }, \ |
{ name, opcode|0x00600000, 0xffe00000, "F,r", level } |
/* BA: General 2-operand integer to float operation |
Syntax: <i> src, dst |
src = Register (Q), Direct (@), Indirect (*), Float immediate (F) |
dst = Register 0-11 (r) |
Instr: 0/1 - C4x: CRCPF |
*/ |
#define BA_CLASS_INSN(name, opcode, level) \ |
{ name, opcode|0x00000000, 0xffe00000, "Q;r", level }, \ |
{ name, opcode|0x00200000, 0xffe00000, "@,r", level }, \ |
{ name, opcode|0x00400000, 0xffe00000, "*,r", level }, \ |
{ name, opcode|0x00600000, 0xffe00000, "F,r", level } |
/* BB: General 2-operand conditional float operation |
Syntax: <i>c src, dst |
c = Condition |
src = Register 0-11 (q), Direct (@), Indirect (*), Float immediate (F) |
dst = Register 0-11 (r) |
Instr: 1/0 - LDFc |
*/ |
#define BB_CLASS_INSN(name, opcode, level) \ |
{ name, opcode|0x40000000, 0xf0600000, "q;r", level }, \ |
{ name, opcode|0x40200000, 0xf0600000, "@,r", level }, \ |
{ name, opcode|0x40400000, 0xf0600000, "*,r", level }, \ |
{ name, opcode|0x40600000, 0xf0600000, "F,r", level } |
/* BI: General 2-operand integer to float operation (yet different to BA) |
Syntax: <i> src, dst |
src = Register (Q), Direct (@), Indirect (*), Signed immediate (S) |
dst = Register 0-11 (r) |
Instr: 1/0 - FLOAT |
*/ |
#define BI_CLASS_INSN(name, opcode, level) \ |
{ name, opcode|0x00000000, 0xffe00000, "Q;r", level }, \ |
{ name, opcode|0x00200000, 0xffe00000, "@,r", level }, \ |
{ name, opcode|0x00400000, 0xffe00000, "*,r", level }, \ |
{ name, opcode|0x00600000, 0xffe00000, "S,r", level } |
/* B6: Limited 2-operand float operation |
Syntax: <i> src, dst |
src = Direct (@), Indirect (*) |
dst = Register 0-11 (r) |
Instr: 1/1 - LDFI, C4x: FRIEEE |
*/ |
#define B6_CLASS_INSN(name, opcode, level) \ |
{ name, opcode|0x00200000, 0xffe00000, "@,r", level }, \ |
{ name, opcode|0x00400000, 0xffe00000, "*,r", level } |
/* B7: Limited 2-operand float store operation |
Syntax: <i> src, dst |
src = Register 0-11 (r) |
dst = Direct (@), Indirect (*) |
Instr: 2/0 - STF, STFI |
*/ |
#define B7_CLASS_INSN(name, opcode, level) \ |
{ name, opcode|0x00200000, 0xffe00000, "r,@", level }, \ |
{ name, opcode|0x00400000, 0xffe00000, "r,*", level } |
/* D: Decrement and brach operations |
Syntax: <i>c ARn, dst |
c = condition |
ARn = AR register 0-7 (A) |
dst = Register (Q), PC-relative (P) |
Instr: 2/0 - DBc, DBcD |
Alias: <name1> <name2> |
*/ |
#define D_CLASS_INSN(name1, name2, opcode, level) \ |
{ name1, opcode|0x00000000, 0xfe200000, "A,Q", level }, \ |
{ name1, opcode|0x02000000, 0xfe200000, "A,P", level }, \ |
{ name2, opcode|0x00000000, 0xfe200000, "A,Q", level }, \ |
{ name2, opcode|0x02000000, 0xfe200000, "A,P", level } |
/* I: General branch operations |
Syntax: <i> dst |
dst = Address (B) |
Instr: 3/1 - BR, BRD, CALL, C4x: LAJ |
*/ |
/* I2: General branch operations (C4x addition) |
Syntax: <i> dst |
dst = Address (B), C4x: Register (Q) |
Instr: 2/0 - RPTB, RPTBD |
*/ |
/* J: General conditional branch operations |
Syntax: <i>c dst |
c = Condition |
dst = Register (Q), PC-relative (P) |
Instr: 2/3 - Bc, BcD, C4x: BcAF, BcAT, LAJc |
Alias: <name1> <name2> |
*/ |
#define J_CLASS_INSN(name1, name2, opcode, level) \ |
{ name1, opcode|0x00000000, 0xffe00000, "Q", level }, \ |
{ name1, opcode|0x02000000, 0xffe00000, "P", level }, \ |
{ name2, opcode|0x00000000, 0xffe00000, "Q", level }, \ |
{ name2, opcode|0x02000000, 0xffe00000, "P", level } |
/* JS: General conditional branch operations |
Syntax: <i>c dst |
c = Condition |
dst = Register (Q), PC-relative (P) |
Instr: 1/1 - CALLc, C4X: LAJc |
*/ |
/* LL: Load-load parallell operation |
Syntax: <i> src2, dst2 || <i> src1, dst1 |
src1 = Indirect 0,1,IR0,IR1 (J) |
dst1 = Register 0-7 (K) |
src2 = Indirect 0,1,IR0,IR1, ENH: Register (i) |
dst2 = Register 0-7 (L) |
Instr: 2/0 - LDF||LDF, LDI||LDI |
Alias: i||i, i1||i2, i2||i1 |
*/ |
#define LL_CLASS_INSN(name, opcode, level) \ |
{ name "_" name , opcode, 0xfe000000, "i;L|J,K", level }, \ |
{ name "2_" name "1", opcode, 0xfe000000, "i;L|J,K", level }, \ |
{ name "1_" name "2", opcode, 0xfe000000, "J,K|i;L", level } |
/* LS: Store-store parallell operation |
Syntax: <i> src2, dst2 || <i> src1, dst1 |
src1 = Register 0-7 (H) |
dst1 = Indirect 0,1,IR0,IR1 (J) |
src2 = Register 0-7 (L) |
dst2 = Indirect 0,1,IR0,IR1, ENH: register (i) |
Instr: 2/0 - STF||STF, STI||STI |
Alias: i||i, i1||i2, i2||i1. |
*/ |
#define LS_CLASS_INSN(name, opcode, level) \ |
{ name "_" name , opcode, 0xfe000000, "L;i|H,J", level }, \ |
{ name "2_" name "1", opcode, 0xfe000000, "L;i|H,J", level }, \ |
{ name "1_" name "2", opcode, 0xfe000000, "H,J|L;i", level } |
/* M: General multiply and add/sub operations |
Syntax: <ia> src3,src4,dst1 || <ib> src2,src1,dst2 [00] - Manual |
<ia> src3,src1,dst1 || <ib> src2,src4,dst2 [01] - Manual |
<ia> src1,src3,dst1 || <ib> src2,src4,dst2 [01] |
<ia> src1,src2,dst1 || <ib> src4,src3,dst2 [02] - Manual |
<ia> src3,src1,dst1 || <ib> src4,src2,dst2 [03] - Manual |
<ia> src1,src3,dst1 || <ib> src4,src2,dst2 [03] |
src1 = Register 0-7 (K) |
src2 = Register 0-7 (H) |
src3 = Indirect 0,1,IR0,IR1, ENH: register (j) |
src4 = Indirect 0,1,IR0,IR1, ENH: register (i) |
dst1 = Register 0-1 (N) |
dst2 = Register 2-3 (M) |
Instr: 4/0 - MPYF3||ADDF3, MPYF3||SUBF3, MPYI3||ADDI3, MPYI3||SUBI3 |
Alias: a||b, a3||n, a||b3, a3||b3, b||a, b3||a, b||a3, b3||a3 |
*/ |
#define M_CLASS_INSN(namea, nameb, opcode, level) \ |
{ namea "_" nameb, opcode|0x00000000, 0xff000000, "i;j;N|H;K;M", level }, \ |
{ namea "_" nameb, opcode|0x01000000, 0xff000000, "j;K;N|H;i;M", level }, \ |
{ namea "_" nameb, opcode|0x01000000, 0xff000000, "K;j;N|H;i;M", level }, \ |
{ namea "_" nameb, opcode|0x02000000, 0xff000000, "H;K;N|i;j;M", level }, \ |
{ namea "_" nameb, opcode|0x03000000, 0xff000000, "j;K;N|i;H;M", level }, \ |
{ namea "_" nameb, opcode|0x03000000, 0xff000000, "K;j;N|i;H;M", level }, \ |
{ namea "3_" nameb, opcode|0x00000000, 0xff000000, "i;j;N|H;K;M", level }, \ |
{ namea "3_" nameb, opcode|0x01000000, 0xff000000, "j;K;N|H;i;M", level }, \ |
{ namea "3_" nameb, opcode|0x01000000, 0xff000000, "K;j;N|H;i;M", level }, \ |
{ namea "3_" nameb, opcode|0x02000000, 0xff000000, "H;K;N|i;j;M", level }, \ |
{ namea "3_" nameb, opcode|0x03000000, 0xff000000, "j;K;N|i;H;M", level }, \ |
{ namea "3_" nameb, opcode|0x03000000, 0xff000000, "K;j;N|i;H;M", level }, \ |
{ namea "_" nameb "3", opcode|0x00000000, 0xff000000, "i;j;N|H;K;M", level }, \ |
{ namea "_" nameb "3", opcode|0x01000000, 0xff000000, "j;K;N|H;i;M", level }, \ |
{ namea "_" nameb "3", opcode|0x01000000, 0xff000000, "K;j;N|H;i;M", level }, \ |
{ namea "_" nameb "3", opcode|0x02000000, 0xff000000, "H;K;N|i;j;M", level }, \ |
{ namea "_" nameb "3", opcode|0x03000000, 0xff000000, "j;K;N|i;H;M", level }, \ |
{ namea "_" nameb "3", opcode|0x03000000, 0xff000000, "K;j;N|i;H;M", level }, \ |
{ namea "3_" nameb "3", opcode|0x00000000, 0xff000000, "i;j;N|H;K;M", level }, \ |
{ namea "3_" nameb "3", opcode|0x01000000, 0xff000000, "j;K;N|H;i;M", level }, \ |
{ namea "3_" nameb "3", opcode|0x01000000, 0xff000000, "K;j;N|H;i;M", level }, \ |
{ namea "3_" nameb "3", opcode|0x02000000, 0xff000000, "H;K;N|i;j;M", level }, \ |
{ namea "3_" nameb "3", opcode|0x03000000, 0xff000000, "j;K;N|i;H;M", level }, \ |
{ namea "3_" nameb "3", opcode|0x03000000, 0xff000000, "K;j;N|i;H;M", level }, \ |
{ nameb "_" namea, opcode|0x00000000, 0xff000000, "H;K;M|i;j;N", level }, \ |
{ nameb "_" namea, opcode|0x01000000, 0xff000000, "H;i;M|j;K;N", level }, \ |
{ nameb "_" namea, opcode|0x01000000, 0xff000000, "H;i;M|K;j;N", level }, \ |
{ nameb "_" namea, opcode|0x02000000, 0xff000000, "i;j;M|H;K;N", level }, \ |
{ nameb "_" namea, opcode|0x03000000, 0xff000000, "i;H;M|j;K;N", level }, \ |
{ nameb "_" namea, opcode|0x03000000, 0xff000000, "i;H;M|K;j;N", level }, \ |
{ nameb "3_" namea, opcode|0x00000000, 0xff000000, "H;K;M|i;j;N", level }, \ |
{ nameb "3_" namea, opcode|0x01000000, 0xff000000, "H;i;M|j;K;N", level }, \ |
{ nameb "3_" namea, opcode|0x01000000, 0xff000000, "H;i;M|K;j;N", level }, \ |
{ nameb "3_" namea, opcode|0x02000000, 0xff000000, "i;j;M|H;K;N", level }, \ |
{ nameb "3_" namea, opcode|0x03000000, 0xff000000, "i;H;M|j;K;N", level }, \ |
{ nameb "3_" namea, opcode|0x03000000, 0xff000000, "i;H;M|K;j;N", level }, \ |
{ nameb "_" namea "3", opcode|0x00000000, 0xff000000, "H;K;M|i;j;N", level }, \ |
{ nameb "_" namea "3", opcode|0x01000000, 0xff000000, "H;i;M|j;K;N", level }, \ |
{ nameb "_" namea "3", opcode|0x01000000, 0xff000000, "H;i;M|K;j;N", level }, \ |
{ nameb "_" namea "3", opcode|0x02000000, 0xff000000, "i;j;M|H;K;N", level }, \ |
{ nameb "_" namea "3", opcode|0x03000000, 0xff000000, "i;H;M|j;K;N", level }, \ |
{ nameb "_" namea "3", opcode|0x03000000, 0xff000000, "i;H;M|K;j;N", level }, \ |
{ nameb "3_" namea "3", opcode|0x00000000, 0xff000000, "H;K;M|i;j;N", level }, \ |
{ nameb "3_" namea "3", opcode|0x01000000, 0xff000000, "H;i;M|j;K;N", level }, \ |
{ nameb "3_" namea "3", opcode|0x01000000, 0xff000000, "H;i;M|K;j;N", level }, \ |
{ nameb "3_" namea "3", opcode|0x02000000, 0xff000000, "i;j;M|H;K;N", level }, \ |
{ nameb "3_" namea "3", opcode|0x03000000, 0xff000000, "i;H;M|j;K;N", level }, \ |
{ nameb "3_" namea "3", opcode|0x03000000, 0xff000000, "i;H;M|K;j;N", level } |
/* P: General 2-operand operation with parallell store |
Syntax: <ia> src2, dst1 || <ib> src3, dst2 |
src2 = Indirect 0,1,IR0,IR1, ENH: register (i) |
dst1 = Register 0-7 (L) |
src3 = Register 0-7 (H) |
dst2 = Indirect 0,1,IR0,IR1 (J) |
Instr: 9/2 - ABSF||STF, ABSI||STI, FIX||STI, FLOAT||STF, LDF||STF, |
LDI||STI, NEGF||STF, NEGI||STI, NOT||STI, C4x: FRIEEE||STF, |
TOIEEE||STF |
Alias: a||b, b||a |
*/ |
#define P_CLASS_INSN(namea, nameb, opcode, level) \ |
{ namea "_" nameb, opcode, 0xfe000000, "i;L|H,J", level }, \ |
{ nameb "_" namea, opcode, 0xfe000000, "H,J|i;L", level } |
/* Q: General 3-operand operation with parallell store |
Syntax: <ia> src1, src2, dst1 || <ib> src3, dst2 |
src1 = Register 0-7 (K) |
src2 = Indirect 0,1,IR0,IR1, ENH: register (i) |
dst1 = Register 0-7 (L) |
src3 = Register 0-7 (H) |
dst2 = Indirect 0,1,IR0,IR1 (J) |
Instr: 4/0 - ASH3||STI, LSH3||STI, SUBF3||STF, SUBI3||STI |
Alias: a||b, b||a, a3||b, b||a3 |
*/ |
#define Q_CLASS_INSN(namea, nameb, opcode, level) \ |
{ namea "_" nameb , opcode, 0xfe000000, "K,i;L|H,J", level }, \ |
{ nameb "_" namea , opcode, 0xfe000000, "H,J|K,i;L", level }, \ |
{ namea "3_" nameb , opcode, 0xfe000000, "K,i;L|H,J", level }, \ |
{ nameb "_" namea "3", opcode, 0xfe000000, "H,J|K,i;L", level } |
/* QC: General commutative 3-operand operation with parallell store |
Syntax: <ia> src2, src1, dst1 || <ib> src3, dst2 |
<ia> src1, src2, dst1 || <ib> src3, dst2 - Manual |
src1 = Register 0-7 (K) |
src2 = Indirect 0,1,IR0,IR1, ENH: register (i) |
dst1 = Register 0-7 (L) |
src3 = Register 0-7 (H) |
dst2 = Indirect 0,1,IR0,IR1 (J) |
Instr: 7/0 - ADDF3||STF, ADDI3||STI, AND3||STI, MPYF3||STF, MPYI3||STI, |
OR3||STI, XOR3||STI |
Alias: a||b, b||a, a3||b, b||a3 |
*/ |
#define QC_CLASS_INSN(namea, nameb, opcode, level) \ |
{ namea "_" nameb , opcode, 0xfe000000, "i;K;L|H,J", level }, \ |
{ namea "_" nameb , opcode, 0xfe000000, "K;i;L|H,J", level }, \ |
{ nameb "_" namea , opcode, 0xfe000000, "H,J|i;K;L", level }, \ |
{ nameb "_" namea , opcode, 0xfe000000, "H,J|K;i;L", level }, \ |
{ namea "3_" nameb , opcode, 0xfe000000, "i;K;L|H,J", level }, \ |
{ namea "3_" nameb , opcode, 0xfe000000, "K;i;L|H,J", level }, \ |
{ nameb "_" namea "3", opcode, 0xfe000000, "H,J|i;K;L", level }, \ |
{ nameb "_" namea "3", opcode, 0xfe000000, "H,J|K;i;L", level } |
/* R: General register integer operation |
Syntax: <i> dst |
dst = Register (R) |
Instr: 6/0 - POP, PUSH, ROL, ROLC, ROR, RORC |
*/ |
#define R_CLASS_INSN(name, opcode, level) \ |
{ name, opcode, 0xffe0ffff, "R", level } |
/* RF: General register float operation |
Syntax: <i> dst |
dst = Register 0-11 (r) |
Instr: 2/0 - POPF, PUSHF |
*/ |
#define RF_CLASS_INSN(name, opcode, level) \ |
{ name, opcode, 0xffe0ffff, "r", level } |
/* S: General 3-operand float operation |
Syntax: <i> src2, src1, dst |
src2 = Register 0-11 (e), Indirect 0,1,IR0,IR1 (I), C4x T2: Indirect (C) |
src1 = Register 0-11 (g), Indirect 0,1,IR0,IR1 (J), C4x T2: Indirect (O) |
dst = Register 0-11 (r) |
Instr: 1/0 - SUBF3 |
Alias: i, i3 |
*/ |
#define S_CLASS_INSN(name, opcode, level) \ |
{ name, opcode|0x20000000, 0xffe00000, "e,g;r", level }, \ |
{ name, opcode|0x20200000, 0xffe00000, "e,J,r", level }, \ |
{ name, opcode|0x20400000, 0xffe00000, "I,g;r", level }, \ |
{ name, opcode|0x20600000, 0xffe00000, "I,J,r", level }, \ |
{ name, opcode|0x30200000, 0xffe00000, "C,g;r", OP_C4X }, \ |
{ name, opcode|0x30600000, 0xffe00000, "C,O,r", OP_C4X }, \ |
{ name "3", opcode|0x20000000, 0xffe00000, "e,g;r", level }, \ |
{ name "3", opcode|0x20200000, 0xffe00000, "e,J,r", level }, \ |
{ name "3", opcode|0x20400000, 0xffe00000, "I,g;r", level }, \ |
{ name "3", opcode|0x20600000, 0xffe00000, "I,J,r", level }, \ |
{ name "3", opcode|0x30200000, 0xffe00000, "C,g;r", OP_C4X }, \ |
{ name "3", opcode|0x30600000, 0xffe00000, "C,O,r", OP_C4X } |
/* SC: General commutative 3-operand float operation |
Syntax: <i> src2, src1, dst - Manual |
<i> src1, src2, dst |
src2 = Register 0-11 (e), Indirect 0,1,IR0,IR1 (I), C4x T2: Indirect (C) |
src1 = Register 0-11 (g), Indirect 0,1,IR0,IR1 (J), C4x T2: Indirect (O) |
dst = Register 0-11 (r) |
Instr: 2/0 - ADDF3, MPYF3 |
Alias: i, i3 |
*/ |
#define SC_CLASS_INSN(name, opcode, level) \ |
{ name, opcode|0x20000000, 0xffe00000, "e,g;r", level }, \ |
{ name, opcode|0x20200000, 0xffe00000, "e,J,r", level }, \ |
{ name, opcode|0x20400000, 0xffe00000, "I,g;r", level }, \ |
{ name, opcode|0x20600000, 0xffe00000, "I,J,r", level }, \ |
{ name, opcode|0x30200000, 0xffe00000, "C,g;r", OP_C4X }, \ |
{ name, opcode|0x30200000, 0xffe00000, "g,C,r", OP_C4X }, \ |
{ name, opcode|0x30600000, 0xffe00000, "C,O,r", OP_C4X }, \ |
{ name "3", opcode|0x20000000, 0xffe00000, "e,g;r", level }, \ |
{ name "3", opcode|0x20200000, 0xffe00000, "e,J,r", level }, \ |
{ name "3", opcode|0x20400000, 0xffe00000, "I,g;r", level }, \ |
{ name "3", opcode|0x20600000, 0xffe00000, "I,J,r", level }, \ |
{ name "3", opcode|0x30200000, 0xffe00000, "g,C,r", OP_C4X }, \ |
{ name "3", opcode|0x30200000, 0xffe00000, "C,g;r", OP_C4X }, \ |
{ name "3", opcode|0x30600000, 0xffe00000, "C,O,r", OP_C4X } |
/* S2: General 3-operand float operation with 2 args |
Syntax: <i> src2, src1 |
src2 = Register 0-11 (e), Indirect 0,1,IR0,IR1 (I), C4x T2: Indirect (C) |
src1 = Register 0-11 (g), Indirect 0,1,IR0,IR1 (J), C4x T2: Indirect (O) |
Instr: 1/0 - CMPF3 |
Alias: i, i3 |
*/ |
#define S2_CLASS_INSN(name, opcode, level) \ |
{ name, opcode|0x20000000, 0xffe00000, "e,g", level }, \ |
{ name, opcode|0x20200000, 0xffe00000, "e,J", level }, \ |
{ name, opcode|0x20400000, 0xffe00000, "I,g", level }, \ |
{ name, opcode|0x20600000, 0xffe00000, "I,J", level }, \ |
{ name, opcode|0x30200000, 0xffe00000, "C,g", OP_C4X }, \ |
{ name, opcode|0x30600000, 0xffe00000, "C,O", OP_C4X }, \ |
{ name "3", opcode|0x20000000, 0xffe00000, "e,g", level }, \ |
{ name "3", opcode|0x20200000, 0xffe00000, "e,J", level }, \ |
{ name "3", opcode|0x20400000, 0xffe00000, "I,g", level }, \ |
{ name "3", opcode|0x20600000, 0xffe00000, "I,J", level }, \ |
{ name "3", opcode|0x30200000, 0xffe00000, "C,g", OP_C4X }, \ |
{ name "3", opcode|0x30600000, 0xffe00000, "C,O", OP_C4X } |
/* T: General 3-operand integer operand |
Syntax: <i> src2, src1, dst |
src2 = Register (E), Indirect 0,1,IR0,IR1 (I), C4x T2: Indirect (C), Immediate (W) |
src1 = Register (G), Indirect 0,1,IR0,IR1 (J), C4x T2: Indirect (O) |
dst = Register (R) |
Instr: 5/0 - ANDN3, ASH3, LSH3, SUBB3, SUBI3 |
Alias: i, i3 |
*/ |
#define T_CLASS_INSN(name, opcode, level) \ |
{ name, opcode|0x20000000, 0xffe00000, "E,G;R", level }, \ |
{ name, opcode|0x20200000, 0xffe00000, "E,J,R", level }, \ |
{ name, opcode|0x20400000, 0xffe00000, "I,G;R", level }, \ |
{ name, opcode|0x20600000, 0xffe00000, "I,J,R", level }, \ |
{ name, opcode|0x30000000, 0xffe00000, "W,G;R", OP_C4X }, \ |
{ name, opcode|0x30200000, 0xffe00000, "C,G;R", OP_C4X }, \ |
{ name, opcode|0x30400000, 0xffe00000, "W,O,R", OP_C4X }, \ |
{ name, opcode|0x30600000, 0xffe00000, "C,O,R", OP_C4X }, \ |
{ name "3", opcode|0x20000000, 0xffe00000, "E,G;R", level }, \ |
{ name "3", opcode|0x20200000, 0xffe00000, "E,J,R", level }, \ |
{ name "3", opcode|0x20400000, 0xffe00000, "I,G;R", level }, \ |
{ name "3", opcode|0x20600000, 0xffe00000, "I,J,R", level }, \ |
{ name "3", opcode|0x30000000, 0xffe00000, "W,G;R", OP_C4X }, \ |
{ name "3", opcode|0x30200000, 0xffe00000, "C,G;R", OP_C4X }, \ |
{ name "3", opcode|0x30400000, 0xffe00000, "W,O,R", OP_C4X }, \ |
{ name "3", opcode|0x30600000, 0xffe00000, "C,O,R", OP_C4X } |
/* TC: General commutative 3-operand integer operation |
Syntax: <i> src2, src1, dst |
<i> src1, src2, dst |
src2 = Register (E), Indirect 0,1,IR0,IR1 (I), C4x T2: Indirect (C), Immediate (W) |
src1 = Register (G), Indirect 0,1,IR0,IR1 (J), C4x T2: Indirect (O) |
dst = Register (R) |
Instr: 6/2 - ADDC3, ADDI3, AND3, MPYI3, OR3, XOR3, C4x: MPYSHI, MPYUHI |
Alias: i, i3 |
*/ |
#define TC_CLASS_INSN(name, opcode, level) \ |
{ name, opcode|0x20000000, 0xffe00000, "E,G;R", level }, \ |
{ name, opcode|0x20200000, 0xffe00000, "E,J,R", level }, \ |
{ name, opcode|0x20400000, 0xffe00000, "I,G;R", level }, \ |
{ name, opcode|0x20600000, 0xffe00000, "I,J,R", level }, \ |
{ name, opcode|0x30000000, 0xffe00000, "W,G;R", OP_C4X }, \ |
{ name, opcode|0x30000000, 0xffe00000, "G,W,R", OP_C4X }, \ |
{ name, opcode|0x30200000, 0xffe00000, "C,G;R", OP_C4X }, \ |
{ name, opcode|0x30200000, 0xffe00000, "G,C,R", OP_C4X }, \ |
{ name, opcode|0x30400000, 0xffe00000, "W,O,R", OP_C4X }, \ |
{ name, opcode|0x30400000, 0xffe00000, "O,W,R", OP_C4X }, \ |
{ name, opcode|0x30600000, 0xffe00000, "C,O,R", OP_C4X }, \ |
{ name "3", opcode|0x20000000, 0xffe00000, "E,G;R", level }, \ |
{ name "3", opcode|0x20200000, 0xffe00000, "E,J,R", level }, \ |
{ name "3", opcode|0x20400000, 0xffe00000, "I,G;R", level }, \ |
{ name "3", opcode|0x20600000, 0xffe00000, "I,J,R", level }, \ |
{ name "3", opcode|0x30000000, 0xffe00000, "W,G;R", OP_C4X }, \ |
{ name "3", opcode|0x30000000, 0xffe00000, "G,W,R", OP_C4X }, \ |
{ name "3", opcode|0x30200000, 0xffe00000, "C,G;R", OP_C4X }, \ |
{ name "3", opcode|0x30200000, 0xffe00000, "G,C,R", OP_C4X }, \ |
{ name "3", opcode|0x30400000, 0xffe00000, "W,O,R", OP_C4X }, \ |
{ name "3", opcode|0x30400000, 0xffe00000, "O,W,R", OP_C4X }, \ |
{ name "3", opcode|0x30600000, 0xffe00000, "C,O,R", OP_C4X } |
/* T2: General 3-operand integer operation with 2 args |
Syntax: <i> src2, src1 |
src2 = Register (E), Indirect 0,1,IR0,IR1 (I), C4x T2: Indirect (C), Immediate (W) |
src1 = Register (G), Indirect 0,1,IR0,IR1 (J), C4x T2: Indirect (O) |
Instr: 1/0 - CMPI3 |
Alias: i, i3 |
*/ |
#define T2_CLASS_INSN(name, opcode, level) \ |
{ name, opcode|0x20000000, 0xffe00000, "E,G", level }, \ |
{ name, opcode|0x20200000, 0xffe00000, "E,J", level }, \ |
{ name, opcode|0x20400000, 0xffe00000, "I,G", level }, \ |
{ name, opcode|0x20600000, 0xffe00000, "I,J", level }, \ |
{ name, opcode|0x30000000, 0xffe00000, "W,G", OP_C4X }, \ |
{ name, opcode|0x30200000, 0xffe00000, "C,G", OP_C4X }, \ |
{ name, opcode|0x30400000, 0xffe00000, "W,O", OP_C4X }, \ |
{ name, opcode|0x30600000, 0xffe00000, "C,O", OP_C4X }, \ |
{ name "3", opcode|0x20000000, 0xffe00000, "E,G", level }, \ |
{ name "3", opcode|0x20200000, 0xffe00000, "E,J", level }, \ |
{ name "3", opcode|0x20400000, 0xffe00000, "I,G", level }, \ |
{ name "3", opcode|0x20600000, 0xffe00000, "I,J", level }, \ |
{ name "3", opcode|0x30000000, 0xffe00000, "W,G", OP_C4X }, \ |
{ name "3", opcode|0x30200000, 0xffe00000, "C,G", OP_C4X }, \ |
{ name "3", opcode|0x30400000, 0xffe00000, "W,O", OP_C4X }, \ |
{ name "3", opcode|0x30600000, 0xffe00000, "C,O", OP_C4X } |
/* T2C: General commutative 3-operand integer operation with 2 args |
Syntax: <i> src2, src1 - Manual |
<i> src1, src2 |
src2 = Register (E), Indirect 0,1,IR0,IR1 (I), C4x T2: Indirect (C), Immediate (W) |
src1 = Register (G), Indirect 0,1,IR0,IR1 (J), C4x T2: Indirect (0) |
Instr: 1/0 - TSTB3 |
Alias: i, i3 |
*/ |
#define T2C_CLASS_INSN(name, opcode, level) \ |
{ name, opcode|0x20000000, 0xffe00000, "E,G", level }, \ |
{ name, opcode|0x20200000, 0xffe00000, "E,J", level }, \ |
{ name, opcode|0x20400000, 0xffe00000, "I,G", level }, \ |
{ name, opcode|0x20600000, 0xffe00000, "I,J", level }, \ |
{ name, opcode|0x30000000, 0xffe00000, "W,G", OP_C4X }, \ |
{ name, opcode|0x30000000, 0xffe00000, "G,W", OP_C4X }, \ |
{ name, opcode|0x30200000, 0xffe00000, "C,G", OP_C4X }, \ |
{ name, opcode|0x30200000, 0xffe00000, "G,C", OP_C4X }, \ |
{ name, opcode|0x30400000, 0xffe00000, "W,O", OP_C4X }, \ |
{ name, opcode|0x30400000, 0xffe00000, "O,W", OP_C4X }, \ |
{ name, opcode|0x30600000, 0xffe00000, "C,O", OP_C4X }, \ |
{ name "3", opcode|0x20000000, 0xffe00000, "E,G", level }, \ |
{ name "3", opcode|0x20200000, 0xffe00000, "E,J", level }, \ |
{ name "3", opcode|0x20400000, 0xffe00000, "I,G", level }, \ |
{ name "3", opcode|0x20600000, 0xffe00000, "I,J", level }, \ |
{ name "3", opcode|0x30000000, 0xffe00000, "W,G", OP_C4X }, \ |
{ name "3", opcode|0x30000000, 0xffe00000, "G,W", OP_C4X }, \ |
{ name "3", opcode|0x30200000, 0xffe00000, "C,G", OP_C4X }, \ |
{ name "3", opcode|0x30200000, 0xffe00000, "G,C", OP_C4X }, \ |
{ name "3", opcode|0x30400000, 0xffe00000, "W,O", OP_C4X }, \ |
{ name "3", opcode|0x30400000, 0xffe00000, "O,W", OP_C4X }, \ |
{ name "3", opcode|0x30600000, 0xffe00000, "C,O", OP_C4X } |
/* Z: Misc operations with or without arguments |
Syntax: <i> <arg1>,... |
Instr: 16 - RETIc, RETSc, SIGI(c3X), SWI, IDLE, IDLE2, RETIcD, |
TRAPc, LATc, LDEP, LDEHI, LDEPE, LDPK, STIK, LDP, IACK |
*/ |
/* Define tic4x opcodes for assembler and disassembler. */ |
static const tic4x_inst_t tic4x_insts[] = |
{ |
/* Put synonyms after the desired forms in table so that they get |
overwritten in the lookup table. The disassembler will thus |
print the `proper' mnemonics. Note that the disassembler |
only decodes the 11 MSBs, so instructions like ldp @0x500 will |
be printed as ldiu 5, dp. Note that with parallel instructions, |
the second part is executed before the first part, unless |
the sti1||sti2 form is used. We also allow sti2||sti1 |
which is equivalent to the default sti||sti form. |
*/ |
B_CLASS_INSN( "absf", 0x00000000, OP_C3X ), |
P_CLASS_INSN( "absf", "stf", 0xc8000000, OP_C3X ), |
A_CLASS_INSN( "absi", 0x00800000, OP_C3X ), |
P_CLASS_INSN( "absi", "sti", 0xca000000, OP_C3X ), |
A_CLASS_INSN( "addc", 0x01000000, OP_C3X ), |
TC_CLASS_INSN( "addc", 0x00000000, OP_C3X ), |
B_CLASS_INSN( "addf", 0x01800000, OP_C3X ), |
SC_CLASS_INSN( "addf", 0x00800000, OP_C3X ), |
QC_CLASS_INSN( "addf", "stf", 0xcc000000, OP_C3X ), |
A_CLASS_INSN( "addi", 0x02000000, OP_C3X ), |
TC_CLASS_INSN( "addi", 0x01000000, OP_C3X ), |
QC_CLASS_INSN( "addi", "sti", 0xce000000, OP_C3X ), |
AU_CLASS_INSN( "and", 0x02800000, OP_C3X ), |
TC_CLASS_INSN( "and", 0x01800000, OP_C3X ), |
QC_CLASS_INSN( "and", "sti", 0xd0000000, OP_C3X ), |
AU_CLASS_INSN( "andn", 0x03000000, OP_C3X ), |
T_CLASS_INSN( "andn", 0x02000000, OP_C3X ), |
A_CLASS_INSN( "ash", 0x03800000, OP_C3X ), |
T_CLASS_INSN( "ash", 0x02800000, OP_C3X ), |
Q_CLASS_INSN( "ash", "sti", 0xd2000000, OP_C3X ), |
J_CLASS_INSN( "bB", "b", 0x68000000, OP_C3X ), |
J_CLASS_INSN( "bBd", "bd", 0x68200000, OP_C3X ), |
J_CLASS_INSN( "bBaf", "baf", 0x68a00000, OP_C4X ), |
J_CLASS_INSN( "bBat", "bat", 0x68600000, OP_C4X ), |
{ "br", 0x60000000, 0xff000000, "B" , OP_C3X }, /* I_CLASS */ |
{ "brd", 0x61000000, 0xff000000, "B" , OP_C3X }, /* I_CLASS */ |
{ "call", 0x62000000, 0xff000000, "B" , OP_C3X }, /* I_CLASS */ |
{ "callB", 0x70000000, 0xffe00000, "Q" , OP_C3X }, /* JS_CLASS */ |
{ "callB", 0x72000000, 0xffe00000, "P" , OP_C3X }, /* JS_CLASS */ |
B_CLASS_INSN( "cmpf", 0x04000000, OP_C3X ), |
S2_CLASS_INSN( "cmpf", 0x03000000, OP_C3X ), |
A_CLASS_INSN( "cmpi", 0x04800000, OP_C3X ), |
T2_CLASS_INSN( "cmpi", 0x03800000, OP_C3X ), |
D_CLASS_INSN( "dbB", "db", 0x6c000000, OP_C3X ), |
D_CLASS_INSN( "dbBd", "dbd", 0x6c200000, OP_C3X ), |
AF_CLASS_INSN( "fix", 0x05000000, OP_C3X ), |
P_CLASS_INSN( "fix", "sti", 0xd4000000, OP_C3X ), |
BI_CLASS_INSN( "float", 0x05800000, OP_C3X ), |
P_CLASS_INSN( "float", "stf", 0xd6000000, OP_C3X ), |
B6_CLASS_INSN( "frieee", 0x1c000000, OP_C4X ), |
P_CLASS_INSN( "frieee","stf", 0xf2000000, OP_C4X ), |
{ "iack", 0x1b200000, 0xffe00000, "@" , OP_C3X }, /* Z_CLASS */ |
{ "iack", 0x1b400000, 0xffe00000, "*" , OP_C3X }, /* Z_CLASS */ |
{ "idle", 0x06000000, 0xffffffff, "" , OP_C3X }, /* Z_CLASS */ |
{ "idlez", 0x06000000, 0xffffffff, "" , OP_C3X }, /* Z_CLASS */ |
{ "idle2", 0x06000001, 0xffffffff, "" , OP_IDLE2 }, /* Z_CLASS */ |
{ "laj", 0x63000000, 0xff000000, "B" , OP_C4X }, /* I_CLASS */ |
{ "lajB", 0x70200000, 0xffe00000, "Q" , OP_C4X }, /* JS_CLASS */ |
{ "lajB", 0x72200000, 0xffe00000, "P" , OP_C4X }, /* JS_CLASS */ |
{ "latB", 0x74800000, 0xffe00000, "V" , OP_C4X }, /* Z_CLASS */ |
A_CLASS_INSN( "lb0", 0xb0000000, OP_C4X ), |
A_CLASS_INSN( "lb1", 0xb0800000, OP_C4X ), |
A_CLASS_INSN( "lb2", 0xb1000000, OP_C4X ), |
A_CLASS_INSN( "lb3", 0xb1800000, OP_C4X ), |
AU_CLASS_INSN( "lbu0", 0xb2000000, OP_C4X ), |
AU_CLASS_INSN( "lbu1", 0xb2800000, OP_C4X ), |
AU_CLASS_INSN( "lbu2", 0xb3000000, OP_C4X ), |
AU_CLASS_INSN( "lbu3", 0xb3800000, OP_C4X ), |
AY_CLASS_INSN( "lda", 0x1e800000, OP_C4X ), |
B_CLASS_INSN( "lde", 0x06800000, OP_C3X ), |
{ "ldep", 0x76000000, 0xffe00000, "X,R" , OP_C4X }, /* Z_CLASS */ |
B_CLASS_INSN( "ldf", 0x07000000, OP_C3X ), |
LL_CLASS_INSN( "ldf", 0xc4000000, OP_C3X ), |
P_CLASS_INSN( "ldf", "stf", 0xd8000000, OP_C3X ), |
BB_CLASS_INSN( "ldfC", 0x00000000, OP_C3X ), |
B6_CLASS_INSN( "ldfi", 0x07800000, OP_C3X ), |
{ "ldhi", 0x1fe00000, 0xffe00000, "U,R" , OP_C4X }, /* Z_CLASS */ |
{ "ldhi", 0x1fe00000, 0xffe00000, "#,R" , OP_C4X }, /* Z_CLASS */ |
A_CLASS_INSN( "ldi", 0x08000000, OP_C3X ), |
LL_CLASS_INSN( "ldi", 0xc6000000, OP_C3X ), |
P_CLASS_INSN( "ldi", "sti", 0xda000000, OP_C3X ), |
AB_CLASS_INSN( "ldiC", 0x10000000, OP_C3X ), |
A6_CLASS_INSN( "ldii", 0x08800000, OP_C3X ), |
{ "ldp", 0x50700000, 0xffff0000, "#" , OP_C3X }, /* Z_CLASS - synonym for ldiu #,dp */ |
B_CLASS_INSN( "ldm", 0x09000000, OP_C3X ), |
{ "ldpe", 0x76800000, 0xffe00000, "Q,Z" , OP_C4X }, /* Z_CLASS */ |
{ "ldpk", 0x1F700000, 0xffff0000, "#" , OP_C4X }, /* Z_CLASS */ |
A_CLASS_INSN( "lh0", 0xba000000, OP_C4X ), |
A_CLASS_INSN( "lh1", 0xba800000, OP_C4X ), |
AU_CLASS_INSN( "lhu0", 0xbb000000, OP_C4X ), |
AU_CLASS_INSN( "lhu1", 0xbb800000, OP_C4X ), |
{ "lopower", 0x10800001,0xffffffff, "" , OP_LPWR }, /* Z_CLASS */ |
A_CLASS_INSN( "lsh", 0x09800000, OP_C3X ), |
T_CLASS_INSN( "lsh", 0x04000000, OP_C3X ), |
Q_CLASS_INSN( "lsh", "sti", 0xdc000000, OP_C3X ), |
A_CLASS_INSN( "lwl0", 0xb4000000, OP_C4X ), |
A_CLASS_INSN( "lwl1", 0xb4800000, OP_C4X ), |
A_CLASS_INSN( "lwl2", 0xb5000000, OP_C4X ), |
A_CLASS_INSN( "lwl3", 0xb5800000, OP_C4X ), |
A_CLASS_INSN( "lwr0", 0xb6000000, OP_C4X ), |
A_CLASS_INSN( "lwr1", 0xb6800000, OP_C4X ), |
A_CLASS_INSN( "lwr2", 0xb7000000, OP_C4X ), |
A_CLASS_INSN( "lwr3", 0xb7800000, OP_C4X ), |
{ "maxspeed",0x10800000,0xffffffff, "" , OP_LPWR }, /* Z_CLASS */ |
A_CLASS_INSN( "mb0", 0xb8000000, OP_C4X ), |
A_CLASS_INSN( "mb1", 0xb8800000, OP_C4X ), |
A_CLASS_INSN( "mb2", 0xb9000000, OP_C4X ), |
A_CLASS_INSN( "mb3", 0xb9800000, OP_C4X ), |
A_CLASS_INSN( "mh0", 0xbc000000, OP_C4X ), |
A_CLASS_INSN( "mh1", 0xbc800000, OP_C4X ), |
A_CLASS_INSN( "mh2", 0xbd000000, OP_C4X ), |
A_CLASS_INSN( "mh3", 0xbd800000, OP_C4X ), |
B_CLASS_INSN( "mpyf", 0x0a000000, OP_C3X ), |
SC_CLASS_INSN( "mpyf", 0x04800000, OP_C3X ), |
M_CLASS_INSN( "mpyf", "addf", 0x80000000, OP_C3X ), |
QC_CLASS_INSN( "mpyf", "stf", 0xde000000, OP_C3X ), |
M_CLASS_INSN( "mpyf", "subf", 0x84000000, OP_C3X ), |
A_CLASS_INSN( "mpyi", 0x0a800000, OP_C3X ), |
TC_CLASS_INSN( "mpyi", 0x05000000, OP_C3X ), |
M_CLASS_INSN( "mpyi", "addi", 0x88000000, OP_C3X ), |
QC_CLASS_INSN( "mpyi", "sti", 0xe0000000, OP_C3X ), |
M_CLASS_INSN( "mpyi", "subi", 0x8c000000, OP_C3X ), |
A_CLASS_INSN( "mpyshi", 0x1d800000, OP_C4X ), |
TC_CLASS_INSN( "mpyshi", 0x28800000, OP_C4X ), |
A_CLASS_INSN( "mpyuhi", 0x1e000000, OP_C4X ), |
TC_CLASS_INSN( "mpyuhi", 0x29000000, OP_C4X ), |
A_CLASS_INSN( "negb", 0x0b000000, OP_C3X ), |
B_CLASS_INSN( "negf", 0x0b800000, OP_C3X ), |
P_CLASS_INSN( "negf", "stf", 0xe2000000, OP_C3X ), |
A_CLASS_INSN( "negi", 0x0c000000, OP_C3X ), |
P_CLASS_INSN( "negi", "sti", 0xe4000000, OP_C3X ), |
A2_CLASS_INSN( "nop", 0x0c800000, OP_C3X ), |
B_CLASS_INSN( "norm", 0x0d000000, OP_C3X ), |
AU_CLASS_INSN( "not", 0x0d800000, OP_C3X ), |
P_CLASS_INSN( "not", "sti", 0xe6000000, OP_C3X ), |
AU_CLASS_INSN( "or", 0x10000000, OP_C3X ), |
TC_CLASS_INSN( "or", 0x05800000, OP_C3X ), |
QC_CLASS_INSN( "or", "sti", 0xe8000000, OP_C3X ), |
R_CLASS_INSN( "pop", 0x0e200000, OP_C3X ), |
RF_CLASS_INSN( "popf", 0x0ea00000, OP_C3X ), |
R_CLASS_INSN( "push", 0x0f200000, OP_C3X ), |
RF_CLASS_INSN( "pushf", 0x0fa00000, OP_C3X ), |
BA_CLASS_INSN( "rcpf", 0x1d000000, OP_C4X ), |
{ "retiB", 0x78000000, 0xffe00000, "" , OP_C3X }, /* Z_CLASS */ |
{ "reti", 0x78000000, 0xffe00000, "" , OP_C3X }, /* Z_CLASS - Alias for retiu */ |
{ "retiBd", 0x78200000, 0xffe00000, "" , OP_C4X }, /* Z_CLASS */ |
{ "retid", 0x78200000, 0xffe00000, "" , OP_C4X }, /* Z_CLASS - Alias for retiud */ |
{ "retsB", 0x78800000, 0xffe00000, "" , OP_C3X }, /* Z_CLASS */ |
{ "rets", 0x78800000, 0xffe00000, "" , OP_C3X }, /* Z_CLASS - Alias for retsu */ |
B_CLASS_INSN( "rnd", 0x11000000, OP_C3X ), |
R_CLASS_INSN( "rol", 0x11e00001, OP_C3X ), |
R_CLASS_INSN( "rolc", 0x12600001, OP_C3X ), |
R_CLASS_INSN( "ror", 0x12e0ffff, OP_C3X ), |
R_CLASS_INSN( "rorc", 0x1360ffff, OP_C3X ), |
{ "rptb", 0x64000000, 0xff000000, "B" , OP_C3X }, /* I2_CLASS */ |
{ "rptb", 0x79000000, 0xff000000, "Q" , OP_C4X }, /* I2_CLASS */ |
{ "rptbd", 0x65000000, 0xff000000, "B" , OP_C4X }, /* I2_CLASS */ |
{ "rptbd", 0x79800000, 0xff000000, "Q" , OP_C4X }, /* I2_CLASS */ |
A3_CLASS_INSN( "rpts", 0x139b0000, OP_C3X ), |
B_CLASS_INSN( "rsqrf", 0x1c800000, OP_C4X ), |
{ "sigi", 0x16000000, 0xffe00000, "" , OP_C3X }, /* Z_CLASS */ |
A6_CLASS_INSN( "sigi", 0x16000000, OP_C4X ), |
B7_CLASS_INSN( "stf", 0x14000000, OP_C3X ), |
LS_CLASS_INSN( "stf", 0xc0000000, OP_C3X ), |
B7_CLASS_INSN( "stfi", 0x14800000, OP_C3X ), |
A7_CLASS_INSN( "sti", 0x15000000, OP_C3X ), |
{ "sti", 0x15000000, 0xffe00000, "T,@" , OP_C4X }, /* Class A7 - Alias for stik */ |
{ "sti", 0x15600000, 0xffe00000, "T,*" , OP_C4X }, /* Class A7 */ |
LS_CLASS_INSN( "sti", 0xc2000000, OP_C3X ), |
A7_CLASS_INSN( "stii", 0x15800000, OP_C3X ), |
{ "stik", 0x15000000, 0xffe00000, "T,@" , OP_C4X }, /* Z_CLASS */ |
{ "stik", 0x15600000, 0xffe00000, "T,*" , OP_C4X }, /* Z_CLASS */ |
A_CLASS_INSN( "subb", 0x16800000, OP_C3X ), |
T_CLASS_INSN( "subb", 0x06000000, OP_C3X ), |
A_CLASS_INSN( "subc", 0x17000000, OP_C3X ), |
B_CLASS_INSN( "subf", 0x17800000, OP_C3X ), |
S_CLASS_INSN( "subf", 0x06800000, OP_C3X ), |
Q_CLASS_INSN( "subf", "stf", 0xea000000, OP_C3X ), |
A_CLASS_INSN( "subi", 0x18000000, OP_C3X ), |
T_CLASS_INSN( "subi", 0x07000000, OP_C3X ), |
Q_CLASS_INSN( "subi", "sti", 0xec000000, OP_C3X ), |
A_CLASS_INSN( "subrb", 0x18800000, OP_C3X ), |
B_CLASS_INSN( "subrf", 0x19000000, OP_C3X ), |
A_CLASS_INSN( "subri", 0x19800000, OP_C3X ), |
{ "swi", 0x66000000, 0xffffffff, "" , OP_C3X }, /* Z_CLASS */ |
B_CLASS_INSN( "toieee", 0x1b800000, OP_C4X ), |
P_CLASS_INSN( "toieee","stf", 0xf0000000, OP_C4X ), |
{ "trapB", 0x74000000, 0xffe00000, "V" , OP_C3X }, /* Z_CLASS */ |
{ "trap", 0x74000000, 0xffe00000, "V" , OP_C3X }, /* Z_CLASS - Alias for trapu */ |
AU_CLASS_INSN( "tstb", 0x1a000000, OP_C3X ), |
T2C_CLASS_INSN("tstb", 0x07800000, OP_C3X ), |
AU_CLASS_INSN( "xor", 0x1a800000, OP_C3X ), |
TC_CLASS_INSN( "xor", 0x08000000, OP_C3X ), |
QC_CLASS_INSN( "xor", "sti", 0xee000000, OP_C3X ), |
/* Dummy entry, not included in tic4x_num_insts. This |
lets code examine entry i + 1 without checking |
if we've run off the end of the table. */ |
{ "", 0x0, 0x00, "", 0 } |
}; |
const unsigned int tic4x_num_insts = (((sizeof tic4x_insts) / (sizeof tic4x_insts[0])) - 1); |
/contrib/toolchain/binutils/include/opcode/tic54x.h |
---|
0,0 → 1,163 |
/* tic54x.h -- Header file for TI TMS320C54X opcode table |
Copyright 1999, 2000, 2001, 2005, 2009, 2010 Free Software Foundation, Inc. |
Written by Timothy Wall (twall@cygnus.com) |
This file is part of GDB, GAS, and the GNU binutils. |
GDB, GAS, and the GNU binutils are free software; you can redistribute |
them and/or modify them under the terms of the GNU General Public |
License as published by the Free Software Foundation; either version 3, |
or (at your option) any later version. |
GDB, GAS, and the GNU binutils are distributed in the hope that they |
will be useful, but WITHOUT ANY WARRANTY; without even the implied |
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See |
the GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this file; see the file COPYING3. If not, write to the Free |
Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA |
02110-1301, USA. */ |
#ifndef _opcode_tic54x_h_ |
#define _opcode_tic54x_h_ |
typedef struct _symbol |
{ |
const char *name; |
unsigned short value; |
} symbol; |
enum optype { |
OPT = 0x8000, |
OP_None = 0x0, |
OP_Xmem, /* AR3 or AR4, indirect */ |
OP_Ymem, /* AR3 or AR4, indirect */ |
OP_pmad, /* PROG mem, direct */ |
OP_dmad, /* DATA mem, direct */ |
OP_Smem, |
OP_Lmem, /* 32-bit single-addressed (direct/indirect) */ |
OP_MMR, |
OP_PA, |
OP_Sind, |
OP_xpmad, |
OP_xpmad_ms7, |
OP_MMRX, |
OP_MMRY, |
OP_SRC1, /* src accumulator in bit 8 */ |
OP_SRC, /* src accumulator in bit 9 */ |
OP_RND, /* rounded result dst accumulator, opposite of bit 8 */ |
OP_DST, /* dst accumulator in bit 8 */ |
OP_ARX, /* arX in bits 0-3 */ |
OP_SHIFT, /* -16 to 15 (SHIFT), bits 0-4 */ |
OP_SHFT, /* 0 to 15 (SHIFT1 in summary), bits 0-3 */ |
OP_B, /* ACC B only */ |
OP_A, /* ACC A only */ |
OP_lk, /* 16-bit immediate, '#' optional */ |
OP_TS, |
OP_k8, /* -128 <= k <= 128 */ |
OP_16, /* literal "16" */ |
OP_BITC, /* 0 to 16 */ |
OP_CC, /* condition code */ |
OP_CC2, /* 4-bit condition code */ |
OP_CC3, /* 2-bit condition code */ |
OP_123, /* 1, 2, or 3 */ |
OP_031, /* 0-31, numeric */ |
OP_k5, /* 0 to 31 */ |
OP_k8u, /* 0 to 255 */ |
OP_ASM, /* "ASM" */ |
OP_T, /* "T" */ |
OP_DP, /* "DP" */ |
OP_ARP, /* "ARP" */ |
OP_k3, /* 0-7 */ |
OP_lku, /* 0 to 65535 */ |
OP_N, /* 0/1 or ST0/ST1 */ |
OP_SBIT, /* status bit or 0-15 */ |
OP_12, /* one or two */ |
OP_k9, /* 9 bits of data page (DP) address */ |
OP_TRN, /* "TRN" */ |
}; |
typedef struct _template |
{ |
/* The opcode mnemonic */ |
const char *name; |
unsigned int words; /* insn size in words */ |
int minops, maxops; /* min/max operand count */ |
/* The significant bits in the opcode. Other bits are zero. |
Instructions with more than 16 bits of opcode store the rest in the upper |
16 bits. |
*/ |
unsigned short opcode; |
#define INDIRECT(OP) ((OP)&0x80) |
#define MOD(OP) (((OP)>>3)&0xF) |
#define ARF(OP) ((OP)&0x7) |
#define IS_LKADDR(OP) (INDIRECT(OP) && MOD(OP)>=12) |
#define SRC(OP) ((OP)&0x200) |
#define DST(OP) ((OP)&0x100) |
#define SRC1(OP) ((OP)&0x100) |
#define SHIFT(OP) (((OP)&0x10)?(((OP)&0x1F)-32):((OP)&0x1F)) |
#define SHFT(OP) ((OP)&0xF) |
#define ARX(OP) ((OP)&0x7) |
#define XMEM(OP) (((OP)&0x00F0)>>4) |
#define YMEM(OP) ((OP)&0x000F) |
#define XMOD(C) (((C)&0xC)>>2) |
#define XARX(C) (((C)&0x3)+2) |
#define CC3(OP) (((OP)>>8)&0x3) |
#define SBIT(OP) ((OP)&0xF) |
#define MMR(OP) ((OP)&0x7F) |
#define MMRX(OP) ((((OP)>>4)&0xF)+16) |
#define MMRY(OP) (((OP)&0xF)+16) |
#define OPTYPE(X) ((X)&~OPT) |
/* Ones in this mask indicate which bits must match the opcode field. |
Zeroes indicate don't care bits (operands and/or opcode options) */ |
unsigned short mask; |
/* An array of operand codes (at most 4 operands) */ |
#define MAX_OPERANDS 4 |
enum optype operand_types[MAX_OPERANDS]; |
/* Special purpose flags (e.g. branch type, parallel, delay, etc) |
*/ |
unsigned short flags; |
#define B_NEXT 0 /* normal execution, next insn is next address */ |
#define B_BRANCH 1 /* next insn is in opcode */ |
#define B_RET 2 /* next insn is on stack */ |
#define B_BACC 3 /* next insn is in acc */ |
#define B_REPEAT 4 /* next insn repeats */ |
#define FL_BMASK 0x07 |
#define FL_DELAY 0x10 /* instruction uses delay slots */ |
#define FL_EXT 0x20 /* instruction takes two words */ |
#define FL_FAR 0x40 /* far mode addressing */ |
#define FL_LP 0x80 /* LP-only instruction */ |
#define FL_NR 0x100 /* no repeat allowed */ |
#define FL_SMR 0x200 /* Smem read (for flagging write-only *+ARx */ |
#define FL_PAR 0x400 /* Parallel instruction. */ |
unsigned short opcode2, mask2; /* some insns have an extended opcode */ |
const char* parname; |
enum optype paroperand_types[MAX_OPERANDS]; |
} insn_template; |
extern const insn_template tic54x_unknown_opcode; |
extern const insn_template tic54x_optab[]; |
extern const insn_template tic54x_paroptab[]; |
extern const symbol mmregs[], regs[]; |
extern const symbol condition_codes[], cc2_codes[], status_bits[]; |
extern const symbol cc3_codes[]; |
extern const char *misc_symbols[]; |
struct disassemble_info; |
extern const insn_template* tic54x_get_insn (struct disassemble_info *, |
bfd_vma, unsigned short, int *); |
#endif /* _opcode_tic54x_h_ */ |
/contrib/toolchain/binutils/include/opcode/tic6x-control-registers.h |
---|
0,0 → 1,56 |
/* TI C6X control register information. |
Copyright 2010 |
Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* Define the CTRL macro before including this file; it takes as |
arguments the fields from tic6x_ctrl (defined in tic6x.h). The |
control register name is given as an identifier; the isa_variants |
field without the leading TIC6X_INSN_; the rw field without the |
leading tic6x_rw_. */ |
CTRL(amr, C62X, read_write, 0x0, 0x10) |
CTRL(csr, C62X, read_write, 0x1, 0x10) |
CTRL(dnum, C64XP, read, 0x11, 0x1f) |
CTRL(ecr, C64XP, write, 0x1d, 0x1f) |
CTRL(efr, C64XP, read, 0x1d, 0x1f) |
CTRL(fadcr, C67X, read_write, 0x12, 0x1f) |
CTRL(faucr, C67X, read_write, 0x13, 0x1f) |
CTRL(fmcr, C67X, read_write, 0x14, 0x1f) |
CTRL(gfpgfr, C64X, read_write, 0x18, 0x1f) |
CTRL(gplya, C64XP, read_write, 0x16, 0x1f) |
CTRL(gplyb, C64XP, read_write, 0x17, 0x1f) |
CTRL(icr, C62X, write, 0x3, 0x10) |
CTRL(ier, C62X, read_write, 0x4, 0x10) |
CTRL(ierr, C64XP, read_write, 0x1f, 0x1f) |
CTRL(ifr, C62X, read, 0x2, 0x1d) |
CTRL(ilc, C64XP, read_write, 0xd, 0x1f) |
CTRL(irp, C62X, read_write, 0x6, 0x10) |
CTRL(isr, C62X, write, 0x2, 0x10) |
CTRL(istp, C62X, read_write, 0x5, 0x10) |
CTRL(itsr, C64XP, read_write, 0x1b, 0x1f) |
CTRL(nrp, C62X, read_write, 0x7, 0x10) |
CTRL(ntsr, C64XP, read_write, 0x1c, 0x1f) |
CTRL(pce1, C62X, read, 0x10, 0xf) |
CTRL(rep, C64XP, read_write, 0xf, 0x1f) |
CTRL(rilc, C64XP, read_write, 0xe, 0x1f) |
CTRL(ssr, C64XP, read_write, 0x15, 0x1f) |
CTRL(tsch, C64XP, read, 0xb, 0x1f) |
/* Contrary to Table 3-26 in SPRUFE8, this register is read-write, as |
documented in section 2.9.13. */ |
CTRL(tscl, C64XP, read_write, 0xa, 0x1f) |
CTRL(tsr, C64XP, read_write, 0x1a, 0x1f) |
/contrib/toolchain/binutils/include/opcode/tic6x-insn-formats.h |
---|
0,0 → 1,616 |
/* TI C6X instruction format information. |
Copyright 2010-2013 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* Define the FMT macro before including this file; it takes a name |
and the fields from tic6x_insn_format (defined in tic6x.h). */ |
/* Expansion fields values for 16 bits insn. */ |
#define SAT(a) (((a) & 1) << TIC6X_COMPACT_SAT_POS) |
#define BR(a) (((a) & 1) << TIC6X_COMPACT_BR_POS) |
#define DSZ(a) (((a) & 7) << TIC6X_COMPACT_DSZ_POS) |
/* Composite fields for 16 bits insn. */ |
#define BFLD(low_pos, width, pos) { (low_pos), (width), (pos) } |
#define BFLD1(a) 1, { a } |
#define BFLD2(a, b) 2, { a, b } |
#define BFLD3(a, b, c) 3, { a, b, c } |
#define BFLD4(a, b, c, d) 4, { a, b, c, d } |
#define COMPFLD(name, bitfields) { CONCAT2(tic6x_field_,name), bitfields } |
/**/ |
#define FLD(name, pos, width) { CONCAT2(tic6x_field_,name), BFLD1(BFLD(pos, width, 0)) } |
#define CFLDS FLD(p, 0, 1), FLD(creg, 29, 3), FLD(z, 28, 1) |
#define CFLDS2(a, b) 5, { CFLDS, a, b } |
#define CFLDS3(a, b, c) 6, { CFLDS, a, b, c } |
#define CFLDS4(a, b, c, d) 7, { CFLDS, a, b, c, d } |
#define CFLDS5(a, b, c, d, e) 8, { CFLDS, a, b, c, d, e } |
#define CFLDS6(a, b, c, d, e, f) 9, { CFLDS, a, b, c, d, e, f } |
#define CFLDS7(a, b, c, d, e, f, g) 10, { CFLDS, a, b, c, d, e, f, g } |
#define CFLDS8(a, b, c, d, e, f, g, h) 11, { CFLDS, a, b, c, d, e, f, g, h } |
#define NFLDS FLD(p, 0, 1) |
#define NFLDS1(a) 2, { NFLDS, a } |
#define NFLDS2(a, b) 3, { NFLDS, a, b } |
#define NFLDS3(a, b, c) 4, { NFLDS, a, b, c } |
#define NFLDS5(a, b, c, d, e) 6, { NFLDS, a, b, c, d, e } |
#define NFLDS6(a, b, c, d, e, f) 7, { NFLDS, a, b, c, d, e, f } |
#define NFLDS7(a, b, c, d, e, f, g) 8, { NFLDS, a, b, c, d, e, f, g } |
/* 16 bits insn */ |
#define FLDS1(a) 1, { a } |
#define FLDS2(a, b) 2, { a, b } |
#define FLDS3(a, b, c) 3, { a, b, c } |
#define FLDS4(a, b, c, d) 4, { a, b, c, d } |
#define FLDS5(a, b, c, d, e) 5, { a, b, c, d, e } |
#define SFLDS FLD(s, 0, 1) |
#define SFLDS1(a) 2, { SFLDS, a } |
#define SFLDS2(a, b) 3, { SFLDS, a, b } |
#define SFLDS3(a, b, c) 4, { SFLDS, a, b, c } |
#define SFLDS4(a, b, c, d) 5, { SFLDS, a, b, c, d } |
#define SFLDS5(a, b, c, d, e) 6, { SFLDS, a, b, c, d, e } |
#define SFLDS6(a, b, c, d, e, f) 7, { SFLDS, a, b, c, d, e, f } |
#define SFLDS7(a, b, c, d, e, f, g) 8, { SFLDS, a, b, c, d, e, f, g } |
/**/ |
/* These are in the order from SPRUFE8, appendices C-H. */ |
/* Appendix C 32-bit formats. */ |
FMT(d_1_or_2_src, 32, 0x40, 0x7c, |
CFLDS5(FLD(s, 1, 1), FLD(op, 7, 6), FLD(src1, 13, 5), FLD(src2, 18, 5), |
FLD(dst, 23, 5))) |
FMT(d_ext_1_or_2_src, 32, 0x830, 0xc3c, |
CFLDS6(FLD(s, 1, 1), FLD(op, 6, 4), FLD(x, 12, 1), FLD(src1, 13, 5), |
FLD(src2, 18, 5), FLD(dst, 23, 5))) |
FMT(d_load_store, 32, 0x4, 0xc, |
CFLDS8(FLD(s, 1, 1), FLD(op, 4, 3), FLD(y, 7, 1), FLD(r, 8, 1), |
FLD(mode, 9, 4), FLD(offsetR, 13, 5), FLD(baseR, 18, 5), |
FLD(srcdst, 23, 5))) |
/* The nonaligned loads and stores have the formats shown in the |
individual instruction descriptions; the appendix is incorrect. */ |
FMT(d_load_nonaligned, 32, 0x124, 0x17c, |
CFLDS7(FLD(s, 1, 1), FLD(y, 7, 1), FLD(mode, 9, 4), FLD(offsetR, 13, 5), |
FLD(baseR, 18, 5), FLD(sc, 23, 1), FLD(dst, 24, 4))) |
FMT(d_store_nonaligned, 32, 0x174, 0x17c, |
CFLDS7(FLD(s, 1, 1), FLD(y, 7, 1), FLD(mode, 9, 4), FLD(offsetR, 13, 5), |
FLD(baseR, 18, 5), FLD(sc, 23, 1), FLD(src, 24, 4))) |
FMT(d_load_store_long, 32, 0xc, 0xc, |
CFLDS5(FLD(s, 1, 1), FLD(op, 4, 3), FLD(y, 7, 1), FLD(offsetR, 8, 15), |
FLD(dst, 23, 5))) |
FMT(d_adda_long, 32, 0x1000000c, 0xf000000c, |
NFLDS5(FLD(s, 1, 1), FLD(op, 4, 3), FLD(y, 7, 1), FLD(offsetR, 8, 15), |
FLD(dst, 23, 5))) |
/* Appendix C 16-bit formats will go here. */ |
/* C-8 */ |
FMT(d_doff4_dsz_0xx, 16, DSZ(0) | 0x0004, DSZ(0x4) | 0x0406, |
SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), FLD(t, 12, 1), |
COMPFLD(cst, BFLD2(BFLD(13, 3, 0), BFLD(11, 1, 3))))) |
FMT(d_doff4_dsz_100, 16, DSZ(4) | 0x0004, DSZ(0x7) | 0x0406, |
SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), FLD(t, 12, 1), |
COMPFLD(cst, BFLD2(BFLD(13, 3, 0), BFLD(11, 1, 3))))) |
FMT(d_doff4_dsz_000, 16, DSZ(0) | 0x0004, DSZ(0x7) | 0x0406, |
SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), FLD(t, 12, 1), |
COMPFLD(cst, BFLD2(BFLD(13, 3, 0), BFLD(11, 1, 3))))) |
FMT(d_doff4_dsz_x01, 16, DSZ(1) | 0x0004, DSZ(0x3) | 0x0406, |
SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), FLD(t, 12, 1), |
COMPFLD(cst, BFLD2(BFLD(13, 3, 0), BFLD(11, 1, 3))))) |
FMT(d_doff4_dsz_01x, 16, DSZ(2) | 0x0004, DSZ(0x6) | 0x0406, |
SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), FLD(t, 12, 1), |
COMPFLD(cst, BFLD2(BFLD(13, 3, 0), BFLD(11, 1, 3))))) |
FMT(d_doff4_dsz_111, 16, DSZ(7) | 0x0004, DSZ(0x7) | 0x0406, |
SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), FLD(t, 12, 1), |
COMPFLD(cst, BFLD2(BFLD(13, 3, 0), BFLD(11, 1, 3))))) |
FMT(d_doff4_dsz_x11, 16, DSZ(3) | 0x0004, DSZ(0x3) | 0x0406, |
SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), FLD(t, 12, 1), |
COMPFLD(cst, BFLD2(BFLD(13, 3, 0), BFLD(11, 1, 3))))) |
FMT(d_doff4_dsz_010, 16, DSZ(2) | 0x0004, DSZ(0x7) | 0x0406, |
SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), FLD(t, 12, 1), |
COMPFLD(cst, BFLD2(BFLD(13, 3, 0), BFLD(11, 1, 3))))) |
FMT(d_doff4_dsz_110, 16, DSZ(6) | 0x0004, DSZ(0x7) | 0x0406, |
SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), FLD(t, 12, 1), |
COMPFLD(cst, BFLD2(BFLD(13, 3, 0), BFLD(11, 1, 3))))) |
/* C-9 */ |
FMT(d_doff4dw, 16, DSZ(4) | 0x0004, DSZ(0x4) | 0x0406, |
SFLDS7(FLD(op, 3, 1), FLD(na, 4, 1), FLD(srcdst, 5, 2), FLD(ptr, 7, 2), FLD(sz, 9, 1), FLD(t, 12, 1), |
COMPFLD(cst, BFLD2(BFLD(13, 3, 0), BFLD(11, 1, 3))))) |
/* C-10 */ |
FMT(d_dind_dsz_0xx, 16, DSZ(0) | 0x0404, DSZ(0x4) | 0x0c06, |
SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), |
FLD(t, 12, 1), FLD(src1, 13, 3))) |
FMT(d_dind_dsz_x01, 16, DSZ(1) | 0x0404, DSZ(0x3) | 0x0c06, |
SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), |
FLD(t, 12, 1), FLD(src1, 13, 3))) |
FMT(d_dind_dsz_x11, 16, DSZ(3) | 0x0404, DSZ(0x3) | 0x0c06, |
SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), |
FLD(t, 12, 1), FLD(src1, 13, 3))) |
FMT(d_dind_dsz_01x, 16, DSZ(2) | 0x0404, DSZ(0x6) | 0x0c06, |
SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), |
FLD(t, 12, 1), FLD(src1, 13, 3))) |
FMT(d_dind_dsz_000, 16, DSZ(0) | 0x0404, DSZ(0x7) | 0x0c06, |
SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), |
FLD(t, 12, 1), FLD(src1, 13, 3))) |
FMT(d_dind_dsz_010, 16, DSZ(2) | 0x0404, DSZ(0x7) | 0x0c06, |
SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), |
FLD(t, 12, 1), FLD(src1, 13, 3))) |
FMT(d_dind_dsz_100, 16, DSZ(4) | 0x0404, DSZ(0x7) | 0x0c06, |
SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), |
FLD(t, 12, 1), FLD(src1, 13, 3))) |
FMT(d_dind_dsz_110, 16, DSZ(6) | 0x0404, DSZ(0x7) | 0x0c06, |
SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), |
FLD(t, 12, 1), FLD(src1, 13, 3))) |
FMT(d_dind_dsz_111, 16, DSZ(7) | 0x0404, DSZ(0x7) | 0x0c06, |
SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), |
FLD(t, 12, 1), FLD(src1, 13, 3))) |
/* C-11 */ |
FMT(d_dinddw, 16, DSZ(4) | 0x0404, DSZ(0x4) | 0x0c06, |
SFLDS7(FLD(op, 3, 1), FLD(na, 4, 1), FLD(srcdst, 5, 2), FLD(ptr, 7, 2), |
FLD(sz, 9, 1), FLD(t, 12, 1), FLD(src1, 13, 3))) |
/* C-12 */ |
FMT(d_dinc_dsz_x01, 16, DSZ(1) | 0x0c04, DSZ(0x3) | 0xcc06, |
SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), |
FLD(t, 12, 1), FLD(cst, 13, 1))) |
FMT(d_dinc_dsz_0xx, 16, DSZ(0) | 0x0c04, DSZ(0x4) | 0xcc06, |
SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), |
FLD(t, 12, 1), FLD(cst, 13, 1))) |
FMT(d_dinc_dsz_01x, 16, DSZ(2) | 0x0c04, DSZ(0x6) | 0xcc06, |
SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), |
FLD(t, 12, 1), FLD(cst, 13, 1))) |
FMT(d_dinc_dsz_x11,16, DSZ(3) | 0x0c04, DSZ(0x3) | 0xcc06, |
SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), |
FLD(t, 12, 1), FLD(cst, 13, 1))) |
FMT(d_dinc_dsz_000, 16, DSZ(0) | 0x0c04, DSZ(0x7) | 0xcc06, |
SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), |
FLD(t, 12, 1), FLD(cst, 13, 1))) |
FMT(d_dinc_dsz_010, 16, DSZ(2) | 0x0c04, DSZ(0x7) | 0xcc06, |
SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), |
FLD(t, 12, 1), FLD(cst, 13, 1))) |
FMT(d_dinc_dsz_100, 16, DSZ(4) | 0x0c04, DSZ(0x7) | 0xcc06, |
SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), |
FLD(t, 12, 1), FLD(cst, 13, 1))) |
FMT(d_dinc_dsz_110, 16, DSZ(6) | 0x0c04, DSZ(0x7) | 0xcc06, |
SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), |
FLD(t, 12, 1), FLD(cst, 13, 1))) |
FMT(d_dinc_dsz_111, 16, DSZ(7) | 0x0c04, DSZ(0x7) | 0xcc06, |
SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), |
FLD(t, 12, 1), FLD(cst, 13, 1))) |
/* C-13*/ |
FMT(d_dincdw, 16, DSZ(4) | 0x0c04, DSZ(0x4) | 0xcc06, |
SFLDS7(FLD(op, 3, 1), FLD(na, 4, 1), FLD(srcdst, 5, 2), FLD(ptr, 7, 2), |
FLD(sz, 9, 1), FLD(t, 12, 1), FLD(cst, 13, 1))) |
/* C-14 */ |
FMT(d_ddec_dsz_01x, 16, DSZ(2) | 0x4c04, DSZ(0x6) | 0xcc06, |
SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), |
FLD(t, 12, 1), FLD(cst, 13, 1))) |
FMT(d_ddec_dsz_0xx, 16, DSZ(0) | 0x4c04, DSZ(0x4) | 0xcc06, |
SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), |
FLD(t, 12, 1), FLD(cst, 13, 1))) |
FMT(d_ddec_dsz_x01, 16, DSZ(1) | 0x4c04, DSZ(0x3) | 0xcc06, |
SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), |
FLD(t, 12, 1), FLD(cst, 13, 1))) |
FMT(d_ddec_dsz_x11, 16, DSZ(3) | 0x4c04, DSZ(0x3) | 0xcc06, |
SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), |
FLD(t, 12, 1), FLD(cst, 13, 1))) |
FMT(d_ddec_dsz_000, 16, DSZ(0) | 0x4c04, DSZ(0x7) | 0xcc06, |
SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), |
FLD(t, 12, 1), FLD(cst, 13, 1))) |
FMT(d_ddec_dsz_010, 16, DSZ(2) | 0x4c04, DSZ(0x7) | 0xcc06, |
SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), |
FLD(t, 12, 1), FLD(cst, 13, 1))) |
FMT(d_ddec_dsz_100, 16, DSZ(4) | 0x4c04, DSZ(0x7) | 0xcc06, |
SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), |
FLD(t, 12, 1), FLD(cst, 13, 1))) |
FMT(d_ddec_dsz_110, 16, DSZ(6) | 0x4c04, DSZ(0x7) | 0xcc06, |
SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), |
FLD(t, 12, 1), FLD(cst, 13, 1))) |
FMT(d_ddec_dsz_111, 16, DSZ(7) | 0x4c04, DSZ(0x7) | 0xcc06, |
SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), |
FLD(t, 12, 1), FLD(cst, 13, 1))) |
/* C-15 */ |
FMT(d_ddecdw, 16, DSZ(4) | 0x4c04, DSZ(0x4) | 0xcc06, |
SFLDS7(FLD(op, 3, 1), FLD(na, 4, 1), FLD(srcdst, 5, 2), FLD(ptr, 7, 2), |
FLD(sz, 9, 1), FLD(t, 12, 1), FLD(cst, 13, 1))) |
/* C-16 */ |
FMT(d_dstk, 16, 0x8c04, 0x8c06, |
SFLDS4(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(t, 12, 1), |
COMPFLD(cst, BFLD2(BFLD(7, 3, 2), BFLD(13, 2, 0))))) |
/* C-17 */ |
FMT(d_dx2op, 16, 0x0036, 0x047e, |
SFLDS4(FLD(src2, 7, 3), FLD(op, 11, 1), FLD(x, 12, 1), FLD(srcdst, 13, 3))) |
/* C-18 */ |
FMT(d_dx5, 16, 0x0436, 0x047e, |
SFLDS2(FLD(dst, 7, 3), |
COMPFLD(cst, BFLD2(BFLD(11, 2, 3), BFLD(13, 3, 0))))) |
/* C-19 */ |
FMT(d_dx5p, 16, 0x0c76, 0x1c7e, |
SFLDS2(FLD(op, 7, 1), |
COMPFLD(cst, BFLD2(BFLD(8, 2, 3), BFLD(13, 3, 0))))) |
/* C-20 */ |
FMT(d_dx1, 16, 0x1876, 0x1c7e, |
SFLDS2(FLD(srcdst, 7, 3), FLD(op, 13, 3))) |
/* C-21 */ |
FMT(d_dpp, 16, 0x0077, 0x087f, |
SFLDS5(FLD(srcdst, 7, 4), FLD(t, 12, 1), FLD(cst, 13, 1), FLD(op, 14, 1), |
FLD(dw, 15, 1))) |
/* Appendix D 32-bit formats. */ |
FMT(l_1_or_2_src, 32, 0x18, 0x1c, |
CFLDS6(FLD(s, 1, 1), FLD(op, 5, 7), FLD(x, 12, 1), FLD(src1, 13, 5), |
FLD(src2, 18, 5), FLD(dst, 23, 5))) |
FMT(l_1_or_2_src_noncond, 32, 0x10000018, 0xf000001c, |
NFLDS6(FLD(s, 1, 1), FLD(op, 5, 7), FLD(x, 12, 1), FLD(src1, 13, 5), |
FLD(src2, 18, 5), FLD(dst, 23, 5))) |
FMT(l_unary, 32, 0x358, 0xffc, |
CFLDS5(FLD(s, 1, 1), FLD(x, 12, 1), FLD(op, 13, 5), FLD(src2, 18, 5), |
FLD(dst, 23, 5))) |
/* Appendix D 16-bit formats will go here. */ |
/* D-4 */ |
FMT(l_l3_sat_0, 16, SAT(0) | 0x0000, SAT(1) | 0x040e, |
SFLDS5(FLD(dst, 4, 3), FLD(src2, 7, 3), FLD(op, 11, 1), FLD(x, 12, 1), |
FLD(src1, 13, 3))) |
FMT(l_l3_sat_1, 16, SAT(1) | 0x0000, SAT(1) | 0x040e, |
SFLDS5(FLD(dst, 4, 3), FLD(src2, 7, 3), FLD(op, 11, 1), FLD(x, 12, 1), |
FLD(src1, 13, 3))) |
/* D-5 - combine cst3 and n fields into a single field cst */ |
FMT(l_l3i, 16, 0x0400, 0x040e, |
SFLDS5(FLD(dst, 4, 3), FLD(src2, 7, 3), FLD(sn, 11, 1), FLD(x, 12, 1), |
COMPFLD(cst, BFLD2(BFLD(13, 3, 0), BFLD(11, 1, 3))))) |
/* D-6 Mtbd ? */ |
/* D-7 */ |
FMT(l_l2c, 16, 0x0408, 0x040e, |
SFLDS5(FLD(dst, 4, 1), FLD(src2, 7, 3), FLD(x, 12, 1), FLD(src1, 13, 3), |
COMPFLD(op, BFLD2(BFLD(5, 2, 0), BFLD(11, 1, 2))))) |
/* D-8 */ |
FMT(l_lx5, 16, 0x0426, 0x047e, |
SFLDS2(FLD(dst, 7, 3), |
COMPFLD(cst, BFLD2(BFLD(11, 2, 3), BFLD(13, 3, 0))))) |
/* D-9 */ |
FMT(l_lx3c, 16, 0x0026, 0x147e, |
SFLDS3(FLD(src2, 7, 3), FLD(dst, 11, 1), FLD(cst, 13, 3))) |
/* D-10 */ |
FMT(l_lx1c, 16, 0x1026, 0x147e, |
SFLDS4(FLD(src2, 7, 3), FLD(dst, 11, 1), FLD(cst, 13, 1), FLD(op, 14, 2))) |
/* D-11 */ |
FMT(l_lx1, 16, 0x1866, 0x1c7e, |
SFLDS2(FLD(srcdst, 7, 3), FLD(op, 13, 3))) |
/* Appendix E 32-bit formats. */ |
FMT(m_compound, 32, 0x30, 0x83c, |
CFLDS6(FLD(s, 1, 1), FLD(op, 6, 5), FLD(x, 12, 1), FLD(src1, 13, 5), |
FLD(src2, 18, 5), FLD(dst, 23, 5))) |
FMT(m_1_or_2_src, 32, 0x10000030, 0xf000083c, |
NFLDS6(FLD(s, 1, 1), FLD(op, 6, 5), FLD(x, 12, 1), FLD(src1, 13, 5), |
FLD(src2, 18, 5), FLD(dst, 23, 5))) |
/* Contrary to SPRUFE8, this does have predicate fields. */ |
FMT(m_unary, 32, 0xf0, 0xffc, |
CFLDS5(FLD(s, 1, 1), FLD(x, 12, 1), FLD(op, 13, 5), FLD(src2, 18, 5), |
FLD(dst, 23, 5))) |
/* M-unit formats missing from Appendix E. */ |
FMT(m_mpy, 32, 0x0, 0x7c, |
CFLDS6(FLD(s, 1, 1), FLD(op, 7, 5), FLD(x, 12, 1), FLD(src1, 13, 5), |
FLD(src2, 18, 5), FLD(dst, 23, 5))) |
/* Appendix E 16-bit formats will go here. */ |
FMT(m_m3_sat_0, 16, SAT(0) | 0x001e, SAT(1) | 0x001e, |
SFLDS5(FLD(op, 5, 2), FLD(src2, 7, 3), FLD(dst, 10, 2), |
FLD(x, 12, 1), FLD(src1, 13, 3))) |
FMT(m_m3_sat_1, 16, SAT(1) | 0x001e, SAT(1) | 0x001e, |
SFLDS5(FLD(op, 5, 2), FLD(src2, 7, 3), FLD(dst, 10, 2), |
FLD(x, 12, 1), FLD(src1, 13, 3))) |
/* Appendix F 32-bit formats. */ |
FMT(s_1_or_2_src, 32, 0x20, 0x3c, |
CFLDS6(FLD(s, 1, 1), FLD(op, 6, 6), FLD(x, 12, 1), FLD(src1, 13, 5), |
FLD(src2, 18, 5), FLD(dst, 23 ,5))) |
FMT(s_ext_1_or_2_src, 32, 0xc30, 0xc3c, |
CFLDS6(FLD(s, 1, 1), FLD(op, 6, 4), FLD(x, 12, 1), FLD(src1, 13, 5), |
FLD(src2, 18, 5), FLD(dst, 23, 5))) |
FMT(s_ext_1_or_2_src_noncond, 32, 0xc30, 0xe0000c3c, |
NFLDS7(FLD(s, 1, 1), FLD(op, 6, 4), FLD(x, 12, 1), FLD(src1, 13, 5), |
FLD(src2, 18, 5), FLD(dst, 23, 5), FLD(z, 28, 1))) |
FMT(s_unary, 32, 0xf20, 0xffc, |
CFLDS5(FLD(s, 1, 1), FLD(x, 12, 1), FLD(op, 13, 5), FLD(src2, 18, 5), |
FLD(dst, 23, 5))) |
FMT(s_ext_branch_cond_imm, 32, 0x10, 0x7c, |
CFLDS2(FLD(s, 1, 1), FLD(cst, 7, 21))) |
FMT(s_call_imm_nop, 32, 0x10, 0xe000007c, |
NFLDS3(FLD(s, 1, 1), FLD(cst, 7, 21), FLD(z, 28, 1))) |
FMT(s_branch_nop_cst, 32, 0x120, 0x1ffc, |
CFLDS3(FLD(s, 1, 1), FLD(src1, 13, 3), FLD(src2, 16, 12))) |
FMT(s_branch_nop_reg, 32, 0x800360, 0xf830ffc, |
CFLDS4(FLD(s, 1, 1), FLD(x, 12, 1), FLD(src1, 13, 3), FLD(src2, 18, 5))) |
FMT(s_branch, 32, 0x360, 0xf83effc, |
CFLDS3(FLD(s, 1, 1), FLD(x, 12, 1), FLD(src2, 18, 5))) |
FMT(s_mvk, 32, 0x28, 0x3c, |
CFLDS4(FLD(s, 1, 1), FLD(h, 6, 1), FLD(cst, 7, 16), FLD(dst, 23, 5))) |
FMT(s_field, 32, 0x8, 0x3c, |
CFLDS6(FLD(s, 1, 1), FLD(op, 6, 2), FLD(cstb, 8, 5), FLD(csta, 13, 5), |
FLD(src2, 18, 5), FLD(dst, 23, 5))) |
/* S-unit formats missing from Appendix F. */ |
FMT(s_addk, 32, 0x50, 0x7c, |
CFLDS3(FLD(s, 1, 1), FLD(cst, 7, 16), FLD(dst, 23, 5))) |
FMT(s_addkpc, 32, 0x160, 0x1ffc, |
CFLDS4(FLD(s, 1, 1), FLD(src2, 13, 3), FLD(src1, 16, 7), FLD(dst, 23, 5))) |
FMT(s_b_irp, 32, 0x1800e0, 0x7feffc, |
CFLDS3(FLD(s, 1, 1), FLD(x, 12, 1), FLD(dst, 23, 5))) |
FMT(s_b_nrp, 32, 0x1c00e0, 0x7feffc, |
CFLDS3(FLD(s, 1, 1), FLD(x, 12, 1), FLD(dst, 23, 5))) |
FMT(s_bdec, 32, 0x1020, 0x1ffc, |
CFLDS3(FLD(s, 1, 1), FLD(src, 13, 10), FLD(dst, 23, 5))) |
FMT(s_bpos, 32, 0x20, 0x1ffc, |
CFLDS3(FLD(s, 1, 1), FLD(src, 13, 10), FLD(dst, 23, 5))) |
/* Appendix F 16-bit formats will go here. */ |
/* F-17 Sbs7 Instruction Format */ |
FMT(s_sbs7, 16, BR(1) | 0x000a, BR(1) | 0x003e, |
SFLDS2(FLD(cst, 6, 7), FLD(n, 13, 3))) |
/* F-18 Sbu8 Instruction Format */ |
FMT(s_sbu8, 16, BR(1) | 0xc00a, BR(1) | 0xc03e, |
SFLDS1(FLD(cst, 6, 8))) |
/* F-19 Scs10 Instruction Format */ |
FMT(s_scs10, 16, BR(1) | 0x001a, BR(1) | 0x003e, |
SFLDS1(FLD(cst, 6, 10))) |
/* F-20 Sbs7c Instruction Format */ |
FMT(s_sbs7c, 16, BR(1) | 0x002a, BR(1) | 0x002e, |
SFLDS3(FLD(z, 4, 1), FLD(cst, 6, 7), FLD(n, 13, 3))) |
/* F-21 Sbu8c Instruction Format */ |
FMT(s_sbu8c, 16, BR(1) | 0xc02a, BR(1) | 0xc02e, |
SFLDS2(FLD(z, 4, 1), FLD(cst, 6, 8))) |
/* F-22 S3 Instruction Format */ |
FMT(s_s3, 16, BR(0) | 0x000a, BR(1) | 0x040e, |
SFLDS5(FLD(dst, 4, 3), FLD(src2, 7, 3), FLD(op, 11, 1), FLD(x, 12, 1), |
FLD(src1, 13, 3))) |
FMT(s_s3_sat_x, 16, BR(0) | SAT(0) | 0x000a, BR(1) | SAT(0) | 0x040e, |
SFLDS5(FLD(dst, 4, 3), FLD(src2, 7, 3), FLD(op, 11, 1), FLD(x, 12, 1), |
FLD(src1, 13, 3))) |
FMT(s_s3_sat_0, 16, BR(0) | SAT(0) | 0x000a, BR(1) | SAT(1) | 0x040e, |
SFLDS5(FLD(dst, 4, 3), FLD(src2, 7, 3), FLD(op, 11, 1), FLD(x, 12, 1), |
FLD(src1, 13, 3))) |
FMT(s_s3_sat_1, 16, BR(0) | SAT(1) | 0x000a, BR(1) | SAT(1) | 0x040e, |
SFLDS5(FLD(dst, 4, 3), FLD(src2, 7, 3), FLD(op, 11, 1), FLD(x, 12, 1), |
FLD(src1, 13, 3))) |
/* F-23 S3i Instruction Format */ |
FMT(s_s3i, 16, BR(0) | 0x040a, BR(1) | 0x040e, |
SFLDS5(FLD(dst, 4, 3), FLD(src2, 7, 3), FLD(op, 11, 1), FLD(x, 12, 1), |
FLD(cst, 13, 3))) |
/* F-24 Smvk8 Instruction Format */ |
FMT(s_smvk8, 16, 0x0012, 0x001e, |
SFLDS2(FLD(dst, 7, 3), |
COMPFLD(cst, BFLD4(BFLD(10, 1, 7), BFLD(5, 2, 5), BFLD(11, 2, 3), BFLD(13, 3, 0))))) |
/* F-25 Ssh5 Instruction Format */ |
FMT(s_ssh5_sat_x, 16, SAT(0) | 0x0402, SAT(0) | 0x041e, |
SFLDS3(FLD(op, 5, 2), FLD(srcdst, 7, 3), |
COMPFLD(cst, BFLD2(BFLD(11, 2, 3), BFLD(13, 3, 0))))) |
FMT(s_ssh5_sat_0, 16, SAT(0) | 0x0402, SAT(1) | 0x041e, |
SFLDS3(FLD(op, 5, 2), FLD(srcdst, 7, 3), |
COMPFLD(cst, BFLD2(BFLD(11, 2, 3), BFLD(13, 3, 0))))) |
FMT(s_ssh5_sat_1, 16, SAT(1) | 0x0402, SAT(1) | 0x041e, |
SFLDS3(FLD(op, 5, 2), FLD(srcdst, 7, 3), |
COMPFLD(cst, BFLD2(BFLD(11, 2, 3), BFLD(13, 3, 0))))) |
/* F-26 S2sh Instruction Format */ |
FMT(s_s2sh, 16, 0x0462, 0x047e, |
SFLDS3(FLD(srcdst, 7, 3), FLD(op, 11, 2), FLD(src1, 13, 3))) |
/* F-27 Sc5 Instruction Format */ |
FMT(s_sc5, 16, 0x0002, 0x041e, |
SFLDS3(FLD(op, 5, 2), FLD(srcdst, 7, 3), |
COMPFLD(cst, BFLD2(BFLD(11, 2, 3), BFLD(13, 3, 0))))) |
/* F-28 S2ext Instruction Format */ |
FMT(s_s2ext, 16, 0x0062, 0x047e, |
SFLDS3(FLD(src, 7, 3), FLD(op, 11, 2), FLD(dst, 13, 3))) |
/* F-29 Sx2op Instruction Format */ |
FMT(s_sx2op, 16, 0x002e, 0x047e, |
SFLDS4(FLD(src2, 7, 3), FLD(op, 11, 1), FLD(x, 12, 1), |
FLD(srcdst, 13, 3))) |
/* F-30 Sx5 Instruction Format */ |
FMT(s_sx5, 16, 0x042e, 0x047e, |
SFLDS2(FLD(dst, 7, 3), |
COMPFLD(cst, BFLD2(BFLD(11, 2, 3), BFLD(13, 3, 0))))) |
/* F-31 Sx1 Instruction Format */ |
FMT(s_sx1, 16, 0x186e, 0x1c7e, |
SFLDS2(FLD(srcdst, 7, 3), FLD(op, 13, 3))) |
/* F-32 Sx1b Instruction Format */ |
FMT(s_sx1b, 16, 0x006e, 0x187e, |
SFLDS2(FLD(src2, 7, 4), FLD(n, 13, 3))) |
/* Appendix G 16-bit formats will go here. */ |
FMT(lsdmvto, 16, 0x0006, 0x0066, |
SFLDS4(FLD(unit, 3, 2), |
FLD(x, 12, 1), FLD(dst, 13, 3), |
COMPFLD(src2, BFLD2(BFLD(10, 2, 3), BFLD(7, 3, 0))))) |
FMT(lsdmvfr, 16, 0x0046, 0x0066, |
SFLDS4(FLD(unit, 3, 2), FLD(src2, 7, 3), FLD(x, 12, 1), |
COMPFLD(dst, BFLD2(BFLD(10, 2, 3), BFLD(13, 3, 0))))) |
/* G-3 */ |
FMT(lsdx1c, 16, 0x0866, 0x1c66, |
SFLDS4(FLD(unit, 3, 2), FLD(dst, 7, 3), FLD(cst, 13, 1), |
FLD(cc, 14, 2))) |
/* G-4 */ |
FMT(lsdx1, 16, 0x1866, 0x1c66, |
SFLDS3(FLD(unit, 3, 2), FLD(srcdst, 7, 3), FLD(op, 13, 3))) |
/* Appendix H 32-bit formats. */ |
FMT(nfu_loop_buffer, 32, 0x00020000, 0x00021ffc, |
CFLDS4(FLD(s, 1, 1), FLD(op, 13, 4), FLD(csta, 18, 5), FLD(cstb, 23, 5))) |
/* Corrected relative to Appendix H. */ |
FMT(nfu_nop_idle, 32, 0x00000000, 0xfffe1ffc, |
NFLDS2(FLD(s, 1, 1), FLD(op, 13, 4))) |
/* No-unit formats missing from Appendix H (given the NOP and IDLE |
correction). */ |
FMT(nfu_dint, 32, 0x10004000, 0xfffffffc, |
NFLDS1(FLD(s, 1, 1))) |
FMT(nfu_rint, 32, 0x10006000, 0xfffffffc, |
NFLDS1(FLD(s, 1, 1))) |
FMT(nfu_swe, 32, 0x10000000, 0xfffffffc, |
NFLDS1(FLD(s, 1, 1))) |
FMT(nfu_swenr, 32, 0x10002000, 0xfffffffc, |
NFLDS1(FLD(s, 1, 1))) |
/* Although formally covered by the loop buffer format, the fields in |
that format are not useful for all such instructions and not all |
instructions can be predicated. */ |
FMT(nfu_spkernel, 32, 0x00034000, 0xf03ffffc, |
NFLDS2(FLD(s, 1, 1), FLD(fstgfcyc, 22, 6))) |
FMT(nfu_spkernelr, 32, 0x00036000, 0xfffffffc, |
NFLDS1(FLD(s, 1, 1))) |
FMT(nfu_spmask, 32, 0x00020000, 0xfc021ffc, |
NFLDS3(FLD(s, 1, 1), FLD(op, 13, 4), FLD(mask, 18, 8))) |
/* Appendix H 16-bit formats will go here. */ |
/* H-5 */ |
FMT(nfu_uspl, 16, 0x0c66, 0xbc7e, |
FLDS2(FLD(op, 0, 1), COMPFLD(ii, BFLD2(BFLD(7, 3, 0), BFLD(14, 1, 3))))) |
/* H-6 */ |
/* make up some fields to pretend to have s and z fields s for this format |
so as to fit in other predicated compact instruction to avoid special- |
casing this instruction in tic6x-dis.c |
use op field as a predicate adress register selector (s field) |
use the first zeroed bit as a z value as this insn only supports [a0] |
and [b0] predicate forms. |
*/ |
FMT(nfu_uspldr, 16, 0x8c66, 0xbc7e, |
FLDS4(FLD(op, 0, 1), FLD(s, 0, 1), FLD(z, 3, 1), |
COMPFLD(ii, BFLD2(BFLD(7, 3, 0), BFLD(14, 1, 3))))) |
/* H-7 */ |
FMT(nfu_uspk, 16, 0x1c66, 0x3c7e, |
FLDS1(COMPFLD(fstgfcyc, BFLD3(BFLD(0, 1, 0), BFLD(7, 3, 1), BFLD(14, 2, 4))))) |
/* H-8a */ |
FMT(nfu_uspma, 16, 0x2c66, 0x3c7e, |
FLDS1(COMPFLD(mask, BFLD3(BFLD(0, 1, 0), BFLD(7, 3, 1), BFLD(14, 2, 4))))) |
/* H-8b */ |
FMT(nfu_uspmb, 16, 0x3c66, 0x3c7e, |
FLDS1(COMPFLD(mask, BFLD3(BFLD(0, 1, 0), BFLD(7, 3, 1), BFLD(14, 2, 4))))) |
/* H-9 */ |
FMT(nfu_unop, 16, 0x0c6e, 0x1fff, |
FLDS1(FLD(n, 13, 3))) |
#undef FLD |
#undef CFLDS |
#undef CFLDS2 |
#undef CFLDS3 |
#undef CFLDS4 |
#undef CFLDS5 |
#undef CFLDS6 |
#undef CFLDS7 |
#undef CFLDS8 |
#undef NFLDS |
#undef NFLDS1 |
#undef NFLDS2 |
#undef NFLDS3 |
#undef NFLDS5 |
#undef NFLDS6 |
#undef NFLDS7 |
#undef SFLDS |
#undef SFLDS1 |
#undef SFLDS2 |
#undef SFLDS3 |
#undef SFLDS4 |
#undef SFLDS5 |
#undef SFLDS6 |
#undef SFLDS7 |
#undef BFLD |
#undef BFLD1 |
#undef BFLD2 |
#undef BFLD3 |
#undef BFLD4 |
#undef FLDS1 |
#undef FLDS2 |
#undef FLDS3 |
#undef FLDS4 |
#undef FLDS5 |
#undef COMPFLD |
#undef DSZ |
#undef BR |
#undef SAT |
/contrib/toolchain/binutils/include/opcode/tic6x-opcode-table.h |
---|
0,0 → 1,3677 |
/* TI C6X opcode table. |
Copyright 2010-2013 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* Define the INSN macro before including this file; it takes as |
arguments the fields from tic6x_opcode (defined in tic6x.h). The |
name is given as an identifier; the subsequent four operands should |
have "tic6x_func_unit_", "tic6x_insn_format_", "tic6x_pipeline_" |
and "TIC6X_INSN_", respectively, prepended to them by the macro |
definition. Also define INSNE, which has a second argument that |
goes after tic6x_opcode_NAME_ to form the enumeration value for |
this instruction, where the value otherwise formed from the name, |
functional unit and format is ambiguous, but otherwise has the same |
arguments as INSN. */ |
#define TIC6X_INSN_C64X_AND_C67X TIC6X_INSN_C64X|TIC6X_INSN_C67X |
#define tic6x_insn_format_nfu_s_branch_nop_cst \ |
tic6x_insn_format_s_branch_nop_cst |
#define tic6x_insn_format_s_l_1_or_2_src tic6x_insn_format_l_1_or_2_src |
#define RAN(id, min, max) { CONCAT2(tic6x_field_,id), (min), (max) } |
#define FIX(id, val) RAN(id, val, val) |
#define FIX0() 0, { { 0, 0, 0 } } |
#define FIX1(a) 1, { a } |
#define FIX2(a, b) 2, { a, b } |
#define FIX3(a, b, c) 3, { a, b, c } |
#define FIX4(a, b, c, d) 4, { a, b, c, d } |
#define OP0() 0, { { 0, 0, FALSE, 0, 0, 0, 0 } } |
#define OP1(a) 1, { a } |
#define OP2(a, b) 2, { a, b } |
#define OP3(a, b, c) 3, { a, b, c } |
#define OP4(a, b, c, d) 4, { a, b, c, d } |
#define OACST { tic6x_operand_asm_const, 0, tic6x_rw_none, 0, 0, 0, 0 } |
#define OLCST { tic6x_operand_link_const, 0, tic6x_rw_none, 0, 0, 0, 0 } |
#define OHWCSTM1 { tic6x_operand_hw_const_minus_1, 0, tic6x_rw_none, 0, 0, 0, 0 } |
#define OHWCST0 { tic6x_operand_hw_const_0, 0, tic6x_rw_none, 0, 0, 0, 0 } |
#define OHWCST1 { tic6x_operand_hw_const_1, 0, tic6x_rw_none, 0, 0, 0, 0 } |
#define OHWCST5 { tic6x_operand_hw_const_5, 0, tic6x_rw_none, 0, 0, 0, 0 } |
#define OHWCST16 { tic6x_operand_hw_const_16, 0, tic6x_rw_none, 0, 0, 0, 0 } |
#define OHWCST24 { tic6x_operand_hw_const_24, 0, tic6x_rw_none, 0, 0, 0, 0 } |
#define OHWCST31 { tic6x_operand_hw_const_31, 0, tic6x_rw_none, 0, 0, 0, 0 } |
#define OFULIST { tic6x_operand_func_unit, 0, tic6x_rw_none, 0, 0, 0, 0 } |
#define ORIRP1 { tic6x_operand_irp, 4, tic6x_rw_read, 1, 1, 0, 0 } |
#define ORNRP1 { tic6x_operand_nrp, 4, tic6x_rw_read, 1, 1, 0, 0 } |
#define OWREG1 { tic6x_operand_reg, 4, tic6x_rw_write, 1, 1, 0, 0 } |
#define OWREG1Z { tic6x_operand_zreg, 4, tic6x_rw_write, 1, 1, 0, 0 } |
#define OWREG1NORS { tic6x_operand_reg_nors, 4, tic6x_rw_write, 1, 1, 0, 0 } |
#define ORREG1B { tic6x_operand_reg_bside, 4, tic6x_rw_write, 1, 1, 0, 0 } |
#define ORREG1BNORS { tic6x_operand_reg_bside_nors, 4, tic6x_rw_write, 1, 1, 0, 0 } |
#define OWRETREG1 { tic6x_operand_retreg, 4, tic6x_rw_write, 1, 1, 0, 0 } |
#define ORREG1 { tic6x_operand_reg, 4, tic6x_rw_read, 1, 1, 0, 0 } |
#define ORDREG1 { tic6x_operand_dreg, 4, tic6x_rw_read, 1, 1, 0, 0 } |
#define ORTREG1 { tic6x_operand_treg, 4, tic6x_rw_read, 1, 1, 0, 0 } |
#define ORWREG1 { tic6x_operand_reg, 4, tic6x_rw_read_write, 1, 1, 0, 0 } |
#define ORB15REG1 { tic6x_operand_b15reg, 4, tic6x_rw_read, 1, 1, 0, 0 } |
#define OWB15REG1 { tic6x_operand_b15reg, 4, tic6x_rw_write, 1, 1, 0, 0 } |
#define ORAREG1 { tic6x_operand_areg, 4, tic6x_rw_read, 1, 1, 0, 0 } |
#define ORXREG1 { tic6x_operand_xreg, 4, tic6x_rw_read, 1, 1, 0, 0 } |
#define ORREG12 { tic6x_operand_reg, 4, tic6x_rw_read, 1, 2, 0, 0 } |
#define ORREG14 { tic6x_operand_reg, 4, tic6x_rw_read, 1, 4, 0, 0 } |
#define ORXREG14 { tic6x_operand_xreg, 4, tic6x_rw_read, 1, 4, 0, 0 } |
#define OWREG2 { tic6x_operand_reg, 4, tic6x_rw_write, 2, 2, 0, 0 } |
#define OWREG4 { tic6x_operand_reg, 4, tic6x_rw_write, 4, 4, 0, 0 } |
#define OWREG9 { tic6x_operand_reg, 4, tic6x_rw_write, 9, 9, 0, 0 } |
#define OWDREG5 { tic6x_operand_dreg, 4, tic6x_rw_write, 5, 5, 0, 0 } |
#define OWTREG5 { tic6x_operand_treg, 4, tic6x_rw_write, 5, 5, 0, 0 } |
#define OWREGL1 { tic6x_operand_regpair, 5, tic6x_rw_write, 1, 1, 1, 1 } |
#define ORREGL1 { tic6x_operand_regpair, 5, tic6x_rw_read, 1, 1, 1, 1 } |
#define OWREGD1 { tic6x_operand_regpair, 8, tic6x_rw_write, 1, 1, 1, 1 } |
#define OWREGD12 { tic6x_operand_regpair, 8, tic6x_rw_write, 1, 1, 2, 2 } |
#define OWREGD4 { tic6x_operand_regpair, 8, tic6x_rw_write, 4, 4, 4, 4 } |
#define ORREGD1 { tic6x_operand_regpair, 8, tic6x_rw_read, 1, 1, 1, 1 } |
#define OWREGD45 { tic6x_operand_regpair, 8, tic6x_rw_write, 4, 4, 5, 5 } |
#define OWREGD67 { tic6x_operand_regpair, 8, tic6x_rw_write, 6, 6, 7, 7 } |
#define ORDREGD1 { tic6x_operand_dregpair, 8, tic6x_rw_read, 1, 1, 1, 1 } |
#define ORTREGD1 { tic6x_operand_tregpair, 8, tic6x_rw_read, 1, 1, 1, 1 } |
#define OWDREGD5 { tic6x_operand_dregpair, 8, tic6x_rw_write, 5, 5, 5, 5 } |
#define OWTREGD5 { tic6x_operand_tregpair, 8, tic6x_rw_write, 5, 5, 5, 5 } |
#define ORREGD12 { tic6x_operand_regpair, 8, tic6x_rw_read, 1, 1, 2, 2 } |
#define ORXREGD12 { tic6x_operand_xregpair, 8, tic6x_rw_read, 1, 1, 2, 2 } |
#define ORREGD1234 { tic6x_operand_regpair, 8, tic6x_rw_read, 1, 2, 3, 4 } |
#define ORXREGD1324 { tic6x_operand_xregpair, 8, tic6x_rw_read, 1, 3, 2, 4 } |
#define OWREGD910 { tic6x_operand_regpair, 8, tic6x_rw_write, 9, 9, 10, 10 } |
#define ORCREG1 { tic6x_operand_ctrl, 4, tic6x_rw_read, 1, 1, 0, 0 } |
#define OWCREG1 { tic6x_operand_ctrl, 4, tic6x_rw_write, 1, 1, 0, 0 } |
#define OWILC1 { tic6x_operand_ilc, 4, tic6x_rw_write, 1, 1, 0, 0 } |
#define ORMEMDW { tic6x_operand_mem_deref, 4, tic6x_rw_read, 3, 3, 0, 0 } |
#define OWMEMDW { tic6x_operand_mem_deref, 4, tic6x_rw_write, 3, 3, 0, 0 } |
#define ORMEMSB { tic6x_operand_mem_short, 1, tic6x_rw_read, 3, 3, 0, 0 } |
#define OWMEMSB { tic6x_operand_mem_short, 1, tic6x_rw_write, 3, 3, 0, 0 } |
#define ORMEMLB { tic6x_operand_mem_long, 1, tic6x_rw_read, 3, 3, 0, 0 } |
#define OWMEMLB { tic6x_operand_mem_long, 1, tic6x_rw_write, 3, 3, 0, 0 } |
#define ORMEMSH { tic6x_operand_mem_short, 2, tic6x_rw_read, 3, 3, 0, 0 } |
#define OWMEMSH { tic6x_operand_mem_short, 2, tic6x_rw_write, 3, 3, 0, 0 } |
#define ORMEMLH { tic6x_operand_mem_long, 2, tic6x_rw_read, 3, 3, 0, 0 } |
#define OWMEMLH { tic6x_operand_mem_long, 2, tic6x_rw_write, 3, 3, 0, 0 } |
#define ORMEMSW { tic6x_operand_mem_short, 4, tic6x_rw_read, 3, 3, 0, 0 } |
#define OWMEMSW { tic6x_operand_mem_short, 4, tic6x_rw_write, 3, 3, 0, 0 } |
#define ORMEMLW { tic6x_operand_mem_long, 4, tic6x_rw_read, 3, 3, 0, 0 } |
#define OWMEMLW { tic6x_operand_mem_long, 4, tic6x_rw_write, 3, 3, 0, 0 } |
#define ORMEMSD { tic6x_operand_mem_short, 8, tic6x_rw_read, 3, 3, 0, 0 } |
#define OWMEMSD { tic6x_operand_mem_short, 8, tic6x_rw_write, 3, 3, 0, 0 } |
#define ORMEMND { tic6x_operand_mem_ndw, 8, tic6x_rw_read, 3, 3, 0, 0 } |
#define OWMEMND { tic6x_operand_mem_ndw, 8, tic6x_rw_write, 3, 3, 0, 0 } |
#define ENC(id, meth, op) { \ |
CONCAT2(tic6x_field_,id), \ |
CONCAT2(tic6x_coding_,meth), \ |
op \ |
} |
#define ENC0() 0, { { 0, 0, 0 } } |
#define ENC1(a) 1, { a } |
#define ENC2(a, b) 2, { a, b } |
#define ENC3(a, b, c) 3, { a, b, c } |
#define ENC4(a, b, c, d) 4, { a, b, c, d } |
#define ENC5(a, b, c, d, e) 5, { a, b, c, d, e } |
#define ENC6(a, b, c, d, e, f) 6, { a, b, c, d, e, f } |
#define ENC7(a, b, c, d, e, f, g) 7, { a, b, c, d, e, f, g } |
INSN(abs, l, unary, 1cycle, C62X, 0, |
FIX1(FIX(op, 0)), |
OP2(ORXREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(dst, reg, 1))) |
INSN(abs, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, |
FIX3(FIX(op, 0x38), FIX(x, 0), FIX(src1, 0)), |
OP2(ORREGL1, OWREGL1), |
ENC3(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(dst, reg, 1))) |
INSN(abs2, l, unary, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x4)), |
OP2(ORXREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(dst, reg, 1))) |
INSN(absdp, s, 1_or_2_src, 2cycle_dp, C67X, TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(op, 0x2c), FIX(x, 0)), |
OP2(ORREGD1, OWREGD12), |
ENC4(ENC(s, fu, 0), ENC(src2, regpair_msb, 0), ENC(src1, regpair_lsb, 0), |
ENC(dst, reg, 1))) |
INSN(abssp, s, unary, 1cycle, C67X, 0, |
FIX1(FIX(op, 0)), |
OP2(ORXREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(dst, reg, 1))) |
INSNE(add, l_si_xsi_si, l, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x3)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(add, l_si_xsi_sl, l, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x23)), |
OP3(ORREG1, ORXREG1, OWREGL1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(add, l_xsi_sl_sl, l, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x21)), |
OP3(ORXREG1, ORREGL1, OWREGL1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(add, l_s5_xsi_si, l, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x2)), |
OP3(OACST, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(add, l_s5_sl_sl, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(op, 0x20), FIX(x, 0)), |
OP3(OACST, ORREGL1, OWREGL1), |
ENC4(ENC(s, fu, 0), ENC(src1, scst, 0), ENC(src2, reg, 1), |
ENC(dst, reg, 2))) |
INSNE(add, s_si_xsi_si, s, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x7)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(add, s_s5_xsi_si, s, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x6)), |
OP3(OACST, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(add, d_si_si_si, d, 1_or_2_src, 1cycle, C62X, |
TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_PREFER(1), |
FIX1(FIX(op, 0x10)), |
OP3(ORREG1, ORREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, reg, 1), |
ENC(dst, reg, 2))) |
INSNE(add, d_si_u5_si, d, 1_or_2_src, 1cycle, C62X, |
TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_PREFER(1), |
FIX1(FIX(op, 0x12)), |
OP3(ORREG1, OACST, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, ucst, 1), |
ENC(dst, reg, 2))) |
INSNE(add, d_si_xsi_si, d, ext_1_or_2_src, 1cycle, C64X, TIC6X_FLAG_PREFER(0), |
FIX1(FIX(op, 0xa)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(add, d_xsi_s5_si, d, ext_1_or_2_src, 1cycle, C64X, TIC6X_FLAG_PREFER(0), |
FIX1(FIX(op, 0xb)), |
OP3(ORXREG1, OACST, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(src1, scst, 1), ENC(dst, reg, 2))) |
/* 16 bits insn */ |
INSN(add, l, l3_sat_0, 1cycle, C64XP, 0, |
FIX1(FIX(op, 0x0)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(add, l, l3i, 1cycle, C64XP, 0, |
FIX0(), |
OP3(OACST, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(cst, scst_l3i, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(add, l, lx1, 1cycle, C64XP, |
TIC6X_FLAG_NO_CROSS, |
FIX1(FIX(op, 0x3)), |
OP3(OHWCSTM1, ORREG1, OWREG1), |
ENC3(ENC(s, fu, 0), ENC(srcdst, reg, 1), ENC(srcdst, reg, 2))) |
INSN(add, s, s3_sat_0, 1cycle, C64XP, 0, |
FIX1(FIX(op, 0x0)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(add, s, sx1, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, |
FIX1(FIX(op, 0x3)), |
OP3(OHWCSTM1, ORREG1, OWREG1), |
ENC3(ENC(s, fu, 0), ENC(srcdst, reg, 1), ENC(srcdst, reg, 2))) |
INSN(add, s, sx2op, 1cycle, C64XP, 0, |
FIX1(FIX(op, 0x0)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(srcdst, reg, 0), ENC(srcdst, reg, 2), |
ENC(src2, reg, 1), ENC(x, xpath, 1))) |
INSN(add, d, dx2op, 1cycle, C64XP, 0, |
FIX1(FIX(op, 0x0)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 1), ENC(srcdst, reg, 0), |
ENC(src2, reg, 1), ENC(srcdst, reg, 2))) |
INSNU(add, l, lsdx1, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(op, 0x5), FIX(unit, 0x0)), |
OP3(ORREG1, OHWCST1, OWREG1), |
ENC3(ENC(s, fu, 0), ENC(srcdst, reg, 0), ENC(srcdst, reg, 2))) |
INSNU(add, s, lsdx1, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(op, 0x5), FIX(unit, 0x1)), |
OP3(ORREG1, OHWCST1, OWREG1), |
ENC3(ENC(s, fu, 0), ENC(srcdst, reg, 0), ENC(srcdst, reg, 2))) |
INSNU(add, d, lsdx1, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(op, 0x5), FIX(unit, 0x2)), |
OP3(ORREG1, OHWCST1, OWREG1), |
ENC3(ENC(s, fu, 0), ENC(srcdst, reg, 0), ENC(srcdst, reg, 2))) |
/**/ |
INSNE(addab, d_si_si_si, d, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, |
FIX1(FIX(op, 0x30)), |
OP3(ORREG1, ORREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, reg, 1), |
ENC(dst, reg, 2))) |
INSNE(addab, d_si_u5_si, d, 1_or_2_src, 1cycle, C62X, |
TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_PREFER(1), |
FIX1(FIX(op, 0x32)), |
OP3(ORREG1, OACST, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, ucst, 1), |
ENC(dst, reg, 2))) |
INSN(addab, d, adda_long, 1cycle, C64XP, TIC6X_FLAG_PREFER(0), |
FIX1(FIX(op, 3)), |
OP3(ORAREG1, OLCST, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(y, areg, 0), ENC(offsetR, ulcst_dpr_byte, 1), |
ENC(dst, reg, 2))) |
INSNE(addad, d_si_si_si, d, 1_or_2_src, 1cycle, C64X_AND_C67X, |
TIC6X_FLAG_NO_CROSS, |
FIX1(FIX(op, 0x3c)), |
OP3(ORREG1, ORREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, reg, 1), |
ENC(dst, reg, 2))) |
INSNE(addad, d_si_u5_si, d, 1_or_2_src, 1cycle, C64X_AND_C67X, |
TIC6X_FLAG_NO_CROSS, |
FIX1(FIX(op, 0x3d)), |
OP3(ORREG1, OACST, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, ucst, 1), |
ENC(dst, reg, 2))) |
INSNE(addah, d_si_si_si, d, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, |
FIX1(FIX(op, 0x34)), |
OP3(ORREG1, ORREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, reg, 1), |
ENC(dst, reg, 2))) |
INSNE(addah, d_si_u5_si, d, 1_or_2_src, 1cycle, C62X, |
TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_PREFER(1), |
FIX1(FIX(op, 0x36)), |
OP3(ORREG1, OACST, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, ucst, 1), |
ENC(dst, reg, 2))) |
INSN(addah, d, adda_long, 1cycle, C64XP, TIC6X_FLAG_PREFER(0), |
FIX1(FIX(op, 5)), |
OP3(ORAREG1, OLCST, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(y, areg, 0), ENC(offsetR, ulcst_dpr_half, 1), |
ENC(dst, reg, 2))) |
INSNE(addaw, d_si_si_si, d, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, |
FIX1(FIX(op, 0x38)), |
OP3(ORREG1, ORREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, reg, 1), |
ENC(dst, reg, 2))) |
INSNE(addaw, d_si_u5_si, d, 1_or_2_src, 1cycle, C62X, |
TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_PREFER(1), |
FIX1(FIX(op, 0x3a)), |
OP3(ORREG1, OACST, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, ucst, 1), |
ENC(dst, reg, 2))) |
INSN(addaw, d, adda_long, 1cycle, C64XP, TIC6X_FLAG_PREFER(0), |
FIX1(FIX(op, 7)), |
OP3(ORAREG1, OLCST, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(y, areg, 0), ENC(offsetR, ulcst_dpr_word, 1), |
ENC(dst, reg, 2))) |
/* 16 bits insn */ |
INSN(addaw, d, dx5, 1cycle, C64XP, TIC6X_FLAG_INSN16_BSIDE, |
FIX0(), |
OP3(ORB15REG1, OACST, OWREG1), |
ENC3(ENC(s, fu, 0), ENC(cst, ucst, 1), ENC(dst, reg, 2))) |
INSN(addaw, d, dx5p, 1cycle, C64XP, TIC6X_FLAG_INSN16_BSIDE, |
FIX1(FIX(op, 0)), |
OP3(ORB15REG1, OACST, OWB15REG1), |
ENC2(ENC(s, fu, 0), ENC(cst, ucst, 1))) |
/**/ |
INSN(adddp, l, 1_or_2_src, addsubdp, C67X, 0, |
FIX1(FIX(op, 0x18)), |
OP3(ORREGD12, ORXREGD12, OWREGD67), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(adddp, s, l_1_or_2_src, addsubdp, C67XP, 0, |
FIX1(FIX(op, 0x72)), |
OP3(ORREGD12, ORXREGD12, OWREGD67), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(addk, s, addk, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, |
FIX0(), |
OP2(OLCST, OWREG1), |
ENC3(ENC(s, fu, 0), ENC(cst, scst, 0), ENC(dst, reg, 1))) |
/* 16 bits insn */ |
INSN(addk, s, sx5, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, |
FIX0(), |
OP2(OACST, OWREG1), |
ENC3(ENC(s, fu, 0), ENC(cst, ucst, 0), ENC(dst, reg, 1))) |
/**/ |
INSN(addkpc, s, addkpc, 1cycle, C64X, |
TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MCNOP|TIC6X_FLAG_SIDE_B_ONLY, |
FIX1(FIX(s, 1)), |
OP3(OLCST, OWREG1, OACST), |
ENC3(ENC(src1, pcrel, 0), ENC(dst, reg, 1), ENC(src2, ucst, 2))) |
INSN(addsp, l, 1_or_2_src, 4cycle, C67X, 0, |
FIX1(FIX(op, 0x10)), |
OP3(ORREG1, ORXREG1, OWREG4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(addsp, s, l_1_or_2_src, 4cycle, C67XP, 0, |
FIX1(FIX(op, 0x70)), |
OP3(ORREG1, ORXREG1, OWREG4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(addsub, l, 1_or_2_src_noncond, 1cycle, C64XP, 0, |
FIX1(FIX(op, 0xc)), |
OP3(ORREG1, ORXREG1, OWREGD1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(addsub2, l, 1_or_2_src_noncond, 1cycle, C64XP, 0, |
FIX1(FIX(op, 0xd)), |
OP3(ORREG1, ORXREG1, OWREGD1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(addu, l_ui_xui_ul, l, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x2b)), |
OP3(ORREG1, ORXREG1, OWREGL1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(addu, l_xui_ul_ul, l, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x29)), |
OP3(ORXREG1, ORREGL1, OWREGL1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(add2, s, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x1)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(add2, l, 1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x5)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(add2, d, ext_1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x4)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(add4, l, 1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x65)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(and, l_ui_xui_ui, l, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x7b)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(and, l_s5_xui_ui, l, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x7a)), |
OP3(OACST, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(and, s_ui_xui_ui, s, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x1f)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(and, s_s5_xui_ui, s, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x1e)), |
OP3(OACST, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(and, d_ui_xui_ui, d, ext_1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x6)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(and, d_s5_xui_ui, d, ext_1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x7)), |
OP3(OACST, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
/* 16 bits insn */ |
INSN(and, l, l2c, 1cycle, C64XP, 0, |
FIX1(FIX(op, 0)), |
OP3(ORREG1, ORXREG1, OWREG1NORS), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
/**/ |
INSN(andn, l, 1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x7c)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(andn, s, ext_1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x6)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(andn, d, ext_1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x0)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(avg2, m, compound, 1616_m, C64X, 0, |
FIX1(FIX(op, 0x13)), |
OP3(ORREG1, ORXREG1, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(avgu4, m, compound, 1616_m, C64X, 0, |
FIX1(FIX(op, 0x12)), |
OP3(ORREG1, ORXREG1, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(b, s, ext_branch_cond_imm, branch, C62X, TIC6X_FLAG_NO_CROSS, |
FIX0(), |
OP1(OLCST), |
ENC2(ENC(s, fu, 0), ENC(cst, pcrel, 0))) |
INSN(b, s, branch, branch, C62X, TIC6X_FLAG_SIDE_B_ONLY, |
FIX1(FIX(s, 1)), |
OP1(ORXREG1), |
ENC2(ENC(x, xpath, 0), ENC(src2, reg, 0))) |
INSN(b, s, b_irp, branch, C62X, TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_SIDE_B_ONLY, |
FIX3(FIX(s, 1), FIX(x, 0), FIX(dst, 0)), |
OP1(ORIRP1), |
ENC0()) |
INSN(b, s, b_nrp, branch, C62X, TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_SIDE_B_ONLY, |
FIX3(FIX(s, 1), FIX(x, 0), FIX(dst, 0)), |
OP1(ORNRP1), |
ENC0()) |
INSN(bdec, s, bdec, branch, C64X, TIC6X_FLAG_NO_CROSS, |
FIX0(), |
OP2(OLCST, ORWREG1), |
ENC3(ENC(s, fu, 0), ENC(src, pcrel, 0), ENC(dst, reg, 1))) |
INSN(bitc4, m, unary, 1616_m, C64X, 0, |
FIX1(FIX(op, 0x1e)), |
OP2(ORXREG1, OWREG2), |
ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(dst, reg, 1))) |
INSN(bitr, m, unary, 1616_m, C64X, 0, |
FIX1(FIX(op, 0x1f)), |
OP2(ORXREG1, OWREG2), |
ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(dst, reg, 1))) |
INSN(bnop, s, branch_nop_cst, branch, C64X, |
TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MCNOP, |
FIX0(), |
OP2(OLCST, OACST), |
ENC3(ENC(s, fu, 0), ENC(src2, pcrel_half, 0), ENC(src1, ucst, 1))) |
INSN(bnop, nfu, s_branch_nop_cst, branch, C64XP, |
TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MACRO|TIC6X_FLAG_MCNOP, |
FIX1(FIX(s, 0)), |
OP2(OLCST, OACST), |
ENC2(ENC(src2, pcrel, 0), ENC(src1, ucst, 1))) |
INSN(bnop, s, branch_nop_reg, branch, C64X, |
TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_MCNOP, |
FIX1(FIX(s, 1)), |
OP2(ORXREG1, OACST), |
ENC3(ENC(x, xpath, 0), ENC(src2, reg, 0), ENC(src1, ucst, 1))) |
/* 16 bits insn format */ |
INSN(bnop, s, sbu8, branch, C64XP, |
TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MCNOP, |
FIX0(), |
OP2(OLCST, OHWCST5), |
ENC2(ENC(s, fu, 0), ENC(cst, pcrel_half_unsigned, 0))) |
INSN(bnop, s, sbs7, branch, C64XP, |
TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MCNOP, |
FIX0(), |
OP2(OLCST, OACST), |
ENC3(ENC(s, fu, 0), ENC(cst, pcrel_half, 0), ENC(n, ucst, 1))) |
INSN(bnop, s, sbu8c, branch, C64XP, |
TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MCNOP|TIC6X_FLAG_INSN16_SPRED, |
FIX0(), |
OP2(OLCST, OHWCST5), |
ENC2(ENC(s, fu, 0), ENC(cst, pcrel_half_unsigned, 0))) |
INSN(bnop, s, sbs7c, branch, C64XP, |
TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MCNOP|TIC6X_FLAG_INSN16_SPRED, |
FIX0(), |
OP2(OLCST, OACST), |
ENC3(ENC(s, fu, 0), ENC(cst, pcrel_half, 0), ENC(n, ucst, 1))) |
INSN(bnop, s, sx1b, branch, C64XP, |
TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MCNOP, |
FIX0(), |
OP2(ORREG1BNORS, OACST), |
ENC3(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(n, ucst, 1))) |
/**/ |
INSN(bpos, s, bpos, branch, C64X, TIC6X_FLAG_NO_CROSS, |
FIX0(), |
OP2(OLCST, ORREG1), |
ENC3(ENC(s, fu, 0), ENC(src, pcrel, 0), ENC(dst, reg, 1))) |
INSN(call, s, ext_branch_cond_imm, branch, C62X, |
TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MACRO|TIC6X_FLAG_CALL, |
FIX0(), |
OP1(OLCST), |
ENC2(ENC(s, fu, 0), ENC(cst, pcrel, 0))) |
INSN(call, s, branch, branch, C62X, |
TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_MACRO|TIC6X_FLAG_CALL, |
FIX1(FIX(s, 1)), |
OP1(ORXREG1), |
ENC2(ENC(x, xpath, 0), ENC(src2, reg, 0))) |
INSN(call, s, b_irp, branch, C62X, |
TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_MACRO|TIC6X_FLAG_CALL, |
FIX3(FIX(s, 1), FIX(x, 0), FIX(dst, 0)), |
OP1(ORIRP1), |
ENC0()) |
INSN(call, s, b_nrp, branch, C62X, |
TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_MACRO|TIC6X_FLAG_CALL, |
FIX3(FIX(s, 1), FIX(x, 0), FIX(dst, 0)), |
OP1(ORNRP1), |
ENC0()) |
INSN(callnop, s, branch_nop_cst, branch, C64X, |
TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MACRO|TIC6X_FLAG_MCNOP|TIC6X_FLAG_CALL, |
FIX0(), |
OP2(OLCST, OACST), |
ENC3(ENC(s, fu, 0), ENC(src2, pcrel, 0), ENC(src1, ucst, 1))) |
INSN(callnop, nfu, s_branch_nop_cst, branch, C64XP, |
TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MACRO|TIC6X_FLAG_MCNOP|TIC6X_FLAG_CALL, |
FIX1(FIX(s, 0)), |
OP2(OLCST, OACST), |
ENC2(ENC(src2, pcrel, 0), ENC(src1, ucst, 1))) |
INSN(callnop, s, branch_nop_reg, branch, C64X, |
TIC6X_FLAG_MACRO|TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_MCNOP|TIC6X_FLAG_CALL, |
FIX1(FIX(s, 1)), |
OP2(ORXREG1, OACST), |
ENC3(ENC(x, xpath, 0), ENC(src2, reg, 0), ENC(src1, ucst, 1))) |
INSN(callp, s, call_imm_nop, branch, C64XP, |
TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MCNOP, |
FIX1(FIX(z, 1)), |
OP2(OLCST, OWRETREG1), |
ENC2(ENC(s, fu, 0), ENC(cst, pcrel, 0))) |
/* 16 bits insn format */ |
INSN(callp, s, scs10, branch, C64XP, |
TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MCNOP, |
FIX0(), |
OP2(OLCST, OWRETREG1), |
ENC2(ENC(s, fu, 0), ENC(cst, pcrel, 0))) |
/**/ |
INSN(callret, s, ext_branch_cond_imm, branch, C62X, |
TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MACRO|TIC6X_FLAG_CALL|TIC6X_FLAG_RETURN, |
FIX0(), |
OP1(OLCST), |
ENC2(ENC(s, fu, 0), ENC(cst, pcrel, 0))) |
INSN(callret, s, branch, branch, C62X, |
TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_MACRO|TIC6X_FLAG_CALL|TIC6X_FLAG_RETURN, |
FIX1(FIX(s, 1)), |
OP1(ORXREG1), |
ENC2(ENC(x, xpath, 0), ENC(src2, reg, 0))) |
INSN(callret, s, b_irp, branch, C62X, |
TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_MACRO|TIC6X_FLAG_CALL|TIC6X_FLAG_RETURN, |
FIX3(FIX(s, 1), FIX(x, 0), FIX(dst, 0)), |
OP1(ORIRP1), |
ENC0()) |
INSN(callret, s, b_nrp, branch, C62X, |
TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_MACRO|TIC6X_FLAG_CALL|TIC6X_FLAG_RETURN, |
FIX3(FIX(s, 1), FIX(x, 0), FIX(dst, 0)), |
OP1(ORNRP1), |
ENC0()) |
INSN(clr, s, field, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, |
FIX1(FIX(op, 0x3)), |
OP4(ORREG1, OACST, OACST, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(csta, ucst, 1), |
ENC(cstb, ucst, 2), ENC(dst, reg, 3))) |
INSN(clr, s, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x3f)), |
OP3(ORXREG1, ORREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(src1, reg, 1), ENC(dst, reg, 2))) |
/* 16 bits insn */ |
INSN(clr, s, sc5, 1cycle, C64XP, 0, |
FIX1(FIX(op, 2)), |
OP4(ORREG1, OACST, OACST, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(srcdst, reg, 0), ENC(cst, ucst, 1), |
ENC(cst, ucst, 2), ENC(srcdst, reg, 3))) |
/**/ |
INSNE(cmpeq, l_si_xsi_ui, l, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x53)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(cmpeq, l_s5_xsi_ui, l, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x52)), |
OP3(OACST, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(cmpeq, l_xsi_sl_ui, l, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x51)), |
OP3(ORXREG1, ORREGL1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(cmpeq, l_s5_sl_ui, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(op, 0x50), FIX(x, 0)), |
OP3(OACST, ORREGL1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(src1, scst, 0), ENC(src2, reg, 1), |
ENC(dst, reg, 2))) |
/* 16 bits insn */ |
INSN(cmpeq, l, lx3c, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, |
FIX0(), |
OP3(OACST, ORXREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(cst, ucst, 0), ENC(src2, reg, 1), |
ENC(dst, reg, 2))) |
INSN(cmpeq, l, l2c, 1cycle, C64XP, 0, |
FIX1(FIX(op, 3)), |
OP3(ORREG1, ORXREG1, OWREG1NORS), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
/**/ |
INSN(cmpeq2, s, 1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x1d)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(cmpeq4, s, 1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x1c)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(cmpeqdp, s, 1_or_2_src, dpcmp, C67X, 0, |
FIX1(FIX(op, 0x28)), |
OP3(ORREGD12, ORXREGD12, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(cmpeqsp, s, 1_or_2_src, 1cycle, C67X, 0, |
FIX1(FIX(op, 0x38)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(cmpgt, l_si_xsi_ui, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_PREFER(1), |
FIX1(FIX(op, 0x47)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(cmpgt, l_s5_xsi_ui, l, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x46)), |
OP3(OACST, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(cmpgt, l_xsi_sl_ui, l, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x45)), |
OP3(ORXREG1, ORREGL1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(cmpgt, l_s5_sl_ui, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(op, 0x44), FIX(x, 0)), |
OP3(OACST, ORREGL1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(src1, scst, 0), ENC(src2, reg, 1), |
ENC(dst, reg, 2))) |
INSNE(cmpgt, l_xsi_si_ui, l, 1_or_2_src, 1cycle, C62X, |
TIC6X_FLAG_MACRO|TIC6X_FLAG_PREFER(0), |
FIX1(FIX(op, 0x57)), |
OP3(ORXREG1, ORREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 1), |
ENC(src2, reg, 0), ENC(dst, reg, 2))) |
INSNE(cmpgt, l_xsi_s5_ui, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_MACRO, |
FIX1(FIX(op, 0x56)), |
OP3(ORXREG1, OACST, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 1), |
ENC(src2, reg, 0), ENC(dst, reg, 2))) |
INSNE(cmpgt, l_sl_xsi_ui, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_MACRO, |
FIX1(FIX(op, 0x55)), |
OP3(ORREGL1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 1), |
ENC(src2, reg, 0), ENC(dst, reg, 2))) |
INSNE(cmpgt, l_sl_s5_ui, l, 1_or_2_src, 1cycle, C62X, |
TIC6X_FLAG_MACRO|TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(op, 0x54), FIX(x, 0)), |
OP3(ORREGL1, OACST, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(src1, scst, 1), ENC(src2, reg, 0), |
ENC(dst, reg, 2))) |
/* 16 bits insn */ |
INSN(cmpgt, l, lx1c, 1cycle, C64XP, 0, |
FIX1(FIX(op, 1)), |
OP3(OACST, ORREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(cst, ucst, 0), ENC(src2, reg, 1), |
ENC(dst, reg, 2))) |
INSN(cmpgt, l, l2c, 1cycle, C64XP, 0, |
FIX1(FIX(op, 5)), |
OP3(ORREG1, ORXREG1, OWREG1NORS), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
/**/ |
INSN(cmpgt2, s, 1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x14)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(cmpgtdp, s, 1_or_2_src, dpcmp, C67X, 0, |
FIX1(FIX(op, 0x29)), |
OP3(ORREGD12, ORXREGD12, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(cmpgtsp, s, 1_or_2_src, 1cycle, C67X, 0, |
FIX1(FIX(op, 0x39)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(cmpgtu, l_ui_xui_ui, l, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x4f)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(cmpgtu, l_u4_xui_ui, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_PREFER(1), |
FIX2(FIX(op, 0x4e), RAN(src1, 0, 15)), |
OP3(OACST, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, ucst, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
/* Although not mentioned in SPRUFE8, CMPGTU and CMPLTU support a |
5-bit unsigned constant operand on C64X and above. */ |
INSNE(cmpgtu, l_u5_xui_ui, l, 1_or_2_src, 1cycle, C64X, 0, |
FIX2(FIX(op, 0x4e), RAN(src1, 16, 31)), |
OP3(OACST, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, ucst, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(cmpgtu, l_xui_ul_ui, l, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x4d)), |
OP3(ORXREG1, ORREGL1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(cmpgtu, l_u4_ul_ui, l, 1_or_2_src, 1cycle, C62X, |
TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_PREFER(1), |
FIX3(FIX(op, 0x4c), FIX(x, 0), RAN(src1, 0, 15)), |
OP3(OACST, ORREGL1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(src1, ucst, 0), ENC(src2, reg, 1), |
ENC(dst, reg, 2))) |
INSNE(cmpgtu, l_u5_ul_ui, l, 1_or_2_src, 1cycle, C64X, TIC6X_FLAG_NO_CROSS, |
FIX3(FIX(op, 0x4c), FIX(x, 0), RAN(src1, 16, 31)), |
OP3(OACST, ORREGL1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(src1, ucst, 0), ENC(src2, reg, 1), |
ENC(dst, reg, 2))) |
/* 16 bits insn */ |
INSN(cmpgtu, l, lx1c, 1cycle, C64XP, 0, |
FIX1(FIX(op, 3)), |
OP3(OACST, ORREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(cst, ucst, 0), ENC(src2, reg, 1), |
ENC(dst, reg, 2))) |
INSN(cmpgtu, l, l2c, 1cycle, C64XP, 0, |
FIX1(FIX(op, 7)), |
OP3(ORREG1, ORXREG1, OWREG1NORS), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
/**/ |
INSN(cmpgtu4, s, 1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x15)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(cmplt, l_si_xsi_ui, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_PREFER(1), |
FIX1(FIX(op, 0x57)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(cmplt, l_s5_xsi_ui, l, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x56)), |
OP3(OACST, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(cmplt, l_xsi_sl_ui, l, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x55)), |
OP3(ORXREG1, ORREGL1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(cmplt, l_s5_sl_ui, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(op, 0x54), FIX(x, 0)), |
OP3(OACST, ORREGL1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(src1, scst, 0), ENC(src2, reg, 1), |
ENC(dst, reg, 2))) |
INSNE(cmplt, l_xsi_si_ui, l, 1_or_2_src, 1cycle, C62X, |
TIC6X_FLAG_MACRO|TIC6X_FLAG_PREFER(0), |
FIX1(FIX(op, 0x47)), |
OP3(ORXREG1, ORREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 1), |
ENC(src2, reg, 0), ENC(dst, reg, 2))) |
INSNE(cmplt, l_xsi_s5_ui, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_MACRO, |
FIX1(FIX(op, 0x46)), |
OP3(ORXREG1, OACST, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 1), |
ENC(src2, reg, 0), ENC(dst, reg, 2))) |
INSNE(cmplt, l_sl_xsi_ui, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_MACRO, |
FIX1(FIX(op, 0x45)), |
OP3(ORREGL1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 1), |
ENC(src2, reg, 0), ENC(dst, reg, 2))) |
INSNE(cmplt, l_sl_s5_ui, l, 1_or_2_src, 1cycle, C62X, |
TIC6X_FLAG_MACRO|TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(op, 0x44), FIX(x, 0)), |
OP3(ORREGL1, OACST, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(src1, scst, 1), ENC(src2, reg, 0), |
ENC(dst, reg, 2))) |
/* 16 bits insn */ |
INSN(cmplt, l, lx1c, 1cycle, C64XP, 0, |
FIX1(FIX(op, 0)), |
OP3(OACST, ORREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(cst, ucst, 0), ENC(src2, reg, 1), |
ENC(dst, reg, 2))) |
INSN(cmplt, l, l2c, 1cycle, C64XP, 0, |
FIX1(FIX(op, 4)), |
OP3(ORREG1, ORXREG1, OWREG1NORS), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
/**/ |
INSN(cmplt2, s, 1_or_2_src, 1cycle, C64X, TIC6X_FLAG_MACRO, |
FIX1(FIX(op, 0x14)), |
OP3(ORXREG1, ORREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(src1, reg, 1), ENC(dst, reg, 2))) |
INSN(cmpltdp, s, 1_or_2_src, dpcmp, C67X, 0, |
FIX1(FIX(op, 0x2a)), |
OP3(ORREGD12, ORXREGD12, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(cmpltsp, s, 1_or_2_src, 1cycle, C67X, 0, |
FIX1(FIX(op, 0x3a)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(cmpltu, l_ui_xui_ui, l, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x5f)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(cmpltu, l_u4_xui_ui, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_PREFER(1), |
FIX2(FIX(op, 0x5e), RAN(src1, 0, 15)), |
OP3(OACST, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, ucst, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(cmpltu, l_u5_xui_ui, l, 1_or_2_src, 1cycle, C64X, 0, |
FIX2(FIX(op, 0x5e), RAN(src1, 16, 31)), |
OP3(OACST, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, ucst, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(cmpltu, l_xui_ul_ui, l, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x5d)), |
OP3(ORXREG1, ORREGL1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(cmpltu, l_u4_ul_ui, l, 1_or_2_src, 1cycle, C62X, |
TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_PREFER(1), |
FIX3(FIX(op, 0x5c), FIX(x, 0), RAN(src1, 0, 15)), |
OP3(OACST, ORREGL1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(src1, ucst, 0), ENC(src2, reg, 1), |
ENC(dst, reg, 2))) |
INSNE(cmpltu, l_u5_ul_ui, l, 1_or_2_src, 1cycle, C64X, TIC6X_FLAG_NO_CROSS, |
FIX3(FIX(op, 0x5c), FIX(x, 0), RAN(src1, 16, 31)), |
OP3(OACST, ORREGL1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(src1, ucst, 0), ENC(src2, reg, 1), |
ENC(dst, reg, 2))) |
/* 16 bits insn */ |
INSN(cmpltu, l, lx1c, 1cycle, C64XP, 0, |
FIX1(FIX(op, 2)), |
OP3(OACST, ORREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(cst, ucst, 0), ENC(src2, reg, 1), |
ENC(dst, reg, 2))) |
INSN(cmpltu, l, l2c, 1cycle, C64XP, 0, |
FIX1(FIX(op, 6)), |
OP3(ORREG1, ORXREG1, OWREG1NORS), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
/**/ |
INSN(cmpltu4, s, 1_or_2_src, 1cycle, C64X, TIC6X_FLAG_MACRO, |
FIX1(FIX(op, 0x15)), |
OP3(ORXREG1, ORREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(src1, reg, 1), ENC(dst, reg, 2))) |
INSN(cmpy, m, 1_or_2_src, 4cycle, C64XP, 0, |
FIX1(FIX(op, 0xa)), |
OP3(ORREG1, ORXREG1, OWREGD4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(cmpyr, m, 1_or_2_src, 4cycle, C64XP, 0, |
FIX1(FIX(op, 0xb)), |
OP3(ORREG1, ORXREG1, OWREG4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(cmpyr1, m, 1_or_2_src, 4cycle, C64XP, 0, |
FIX1(FIX(op, 0xc)), |
OP3(ORREG1, ORXREG1, OWREG4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(cmtl, d, 1_or_2_src, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_SIDE_T2_ONLY|TIC6X_FLAG_NO_CROSS, |
FIX3(FIX(s, 1), FIX(op, 0xe), FIX(src1, 0)), |
OP2(ORMEMDW, OWDREG5), |
ENC2(ENC(src2, reg, 0), ENC(dst, reg, 1))) |
INSN(ddotp4, m, 1_or_2_src, 4cycle, C64XP, 0, |
FIX1(FIX(op, 0x18)), |
OP3(ORREG1, ORXREG1, OWREGD4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(ddotph2, m, 1_or_2_src, 4cycle, C64XP, 0, |
FIX1(FIX(op, 0x17)), |
OP3(ORREGD1, ORXREG1, OWREGD4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(ddotph2r, m, 1_or_2_src, 4cycle, C64XP, 0, |
FIX1(FIX(op, 0x15)), |
OP3(ORREGD1, ORXREG1, OWREG4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(ddotpl2, m, 1_or_2_src, 4cycle, C64XP, 0, |
FIX1(FIX(op, 0x16)), |
OP3(ORREGD1, ORXREG1, OWREGD4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(ddotpl2r, m, 1_or_2_src, 4cycle, C64XP, 0, |
FIX1(FIX(op, 0x14)), |
OP3(ORREGD1, ORXREG1, OWREG4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(deal, m, unary, 1616_m, C64X, 0, |
FIX1(FIX(op, 0x1d)), |
OP2(ORXREG1, OWREG2), |
ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(dst, reg, 1))) |
INSN(dint, nfu, dint, 1cycle, C64XP, 0, |
FIX1(FIX(s, 0)), |
OP0(), |
ENC0()) |
INSN(dmv, s, ext_1_or_2_src, 1cycle, C64XP, 0, |
FIX1(FIX(op, 0xb)), |
OP3(ORREG1, ORXREG1, OWREGD1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(dotp2, m_s2_xs2_si, m, compound, 4cycle, C64X, 0, |
FIX1(FIX(op, 0xc)), |
OP3(ORREG1, ORXREG1, OWREG4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(dotp2, m_s2_xs2_sll, m, compound, 4cycle, C64X, 0, |
FIX1(FIX(op, 0xb)), |
OP3(ORREG1, ORXREG1, OWREGD4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(dotpn2, m, compound, 4cycle, C64X, 0, |
FIX1(FIX(op, 0x9)), |
OP3(ORREG1, ORXREG1, OWREG4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(dotpnrsu2, m, compound, 4cycle, C64X, 0, |
FIX1(FIX(op, 0x7)), |
OP3(ORREG1, ORXREG1, OWREG4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(dotpnrus2, m, compound, 4cycle, C64X, TIC6X_FLAG_MACRO, |
FIX1(FIX(op, 0x7)), |
OP3(ORXREG1, ORREG1, OWREG4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(src1, reg, 1), ENC(dst, reg, 2))) |
INSN(dotprsu2, m, compound, 4cycle, C64X, 0, |
FIX1(FIX(op, 0xd)), |
OP3(ORREG1, ORXREG1, OWREG4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(dotprus2, m, compound, 4cycle, C64X, TIC6X_FLAG_MACRO, |
FIX1(FIX(op, 0xd)), |
OP3(ORXREG1, ORREG1, OWREG4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(src1, reg, 1), ENC(dst, reg, 2))) |
INSN(dotpsu4, m, compound, 4cycle, C64X, 0, |
FIX1(FIX(op, 0x2)), |
OP3(ORREG1, ORXREG1, OWREG4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(dotpus4, m, compound, 4cycle, C64X, TIC6X_FLAG_MACRO, |
FIX1(FIX(op, 0x2)), |
OP3(ORXREG1, ORREG1, OWREG4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(src1, reg, 1), ENC(dst, reg, 2))) |
INSN(dotpu4, m, compound, 4cycle, C64X, 0, |
FIX1(FIX(op, 0x6)), |
OP3(ORREG1, ORXREG1, OWREG4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(dpack2, l, 1_or_2_src_noncond, 1cycle, C64XP, 0, |
FIX1(FIX(op, 0x34)), |
OP3(ORREG1, ORXREG1, OWREGD1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(dpackx2, l, 1_or_2_src_noncond, 1cycle, C64XP, 0, |
FIX1(FIX(op, 0x33)), |
OP3(ORREG1, ORXREG1, OWREGD1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(dpint, l, 1_or_2_src, 4cycle, C67X, TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(op, 0x8), FIX(x, 0)), |
OP2(ORREGD1, OWREG4), |
ENC4(ENC(s, fu, 0), ENC(src2, regpair_msb, 0), ENC(src1, regpair_lsb, 0), |
ENC(dst, reg, 1))) |
INSN(dpsp, l, 1_or_2_src, 4cycle, C67X, TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(op, 0x9), FIX(x, 0)), |
OP2(ORREGD1, OWREG4), |
ENC4(ENC(s, fu, 0), ENC(src2, regpair_msb, 0), ENC(src1, regpair_lsb, 0), |
ENC(dst, reg, 1))) |
INSN(dptrunc, l, 1_or_2_src, 4cycle, C67X, TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(op, 0x1), FIX(x, 0)), |
OP2(ORREGD1, OWREG4), |
ENC4(ENC(s, fu, 0), ENC(src2, regpair_msb, 0), ENC(src1, regpair_lsb, 0), |
ENC(dst, reg, 1))) |
INSN(ext, s, field, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, |
FIX1(FIX(op, 0x1)), |
OP4(ORREG1, OACST, OACST, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(csta, ucst, 1), |
ENC(cstb, ucst, 2), ENC(dst, reg, 3))) |
INSN(ext, s, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x2f)), |
OP3(ORXREG1, ORREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(src1, reg, 1), ENC(dst, reg, 2))) |
/* 16 bits insn */ |
INSNE(ext, hwcst16, s, s2ext, 1cycle, C64XP, 0, |
FIX1(FIX(op, 0x0)), |
OP4(ORREG1, OHWCST16, OHWCST16, OWREG1), |
ENC3(ENC(s, fu, 0), ENC(src, reg, 0), ENC(dst, reg, 3))) |
INSNE(ext, hwcst24, s, s2ext, 1cycle, C64XP, 0, |
FIX1(FIX(op, 0x1)), |
OP4(ORREG1, OHWCST24, OHWCST24, OWREG1), |
ENC3(ENC(s, fu, 0), ENC(src, reg, 0), ENC(dst, reg, 3))) |
/**/ |
INSN(extu, s, field, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, |
FIX1(FIX(op, 0x0)), |
OP4(ORREG1, OACST, OACST, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(csta, ucst, 1), |
ENC(cstb, ucst, 2), ENC(dst, reg, 3))) |
INSN(extu, s, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x2b)), |
OP3(ORXREG1, ORREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(src1, reg, 1), ENC(dst, reg, 2))) |
/* 16 bits insn */ |
INSNE(extu, hwcst16, s, s2ext, 1cycle, C64XP, 0, |
FIX1(FIX(op, 0x2)), |
OP4(ORREG1, OHWCST16, OHWCST16, OWREG1), |
ENC3(ENC(s, fu, 0), ENC(src, reg, 0), ENC(dst, reg, 3))) |
INSNE(extu, hwcst24, s, s2ext, 1cycle, C64XP, 0, |
FIX1(FIX(op, 0x3)), |
OP4(ORREG1, OHWCST24, OHWCST24, OWREG1), |
ENC3(ENC(s, fu, 0), ENC(src, reg, 0), ENC(dst, reg, 3))) |
INSN(extu, s, sc5, 1cycle, C64XP, 0, |
FIX1(FIX(op, 0)), |
OP4(ORREG1, OACST, OHWCST31, OWREG1Z), |
ENC3(ENC(s, fu, 0), ENC(srcdst, reg, 0), ENC(cst, ucst, 1))) |
/**/ |
INSN(gmpy, m, 1_or_2_src, 4cycle, C64XP, TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(op, 0x1f), FIX(x, 0)), |
OP3(ORREG1, ORREG1, OWREG4), |
ENC4(ENC(s, fu, 0), ENC(src1, reg, 0), ENC(src2, reg, 1), |
ENC(dst, reg, 2))) |
/* This instruction can be predicated as usual; SPRUFE8 is incorrect |
where it shows the "z" field as fixed to 1. */ |
INSN(gmpy4, m, compound, 4cycle, C64X, 0, |
FIX1(FIX(op, 0x11)), |
OP3(ORREG1, ORXREG1, OWREG4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(idle, nfu, nop_idle, nop, C62X, TIC6X_FLAG_MCNOP, |
FIX2(FIX(s, 0), FIX(op, 0xf)), |
OP0(), |
ENC0()) |
INSN(intdp, l, 1_or_2_src, intdp, C67X, 0, |
FIX2(FIX(op, 0x39), FIX(src1, 0)), |
OP2(ORXREG1, OWREGD45), |
ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(dst, reg, 1))) |
INSN(intdpu, l, 1_or_2_src, intdp, C67X, 0, |
FIX2(FIX(op, 0x3b), FIX(src1, 0)), |
OP2(ORXREG1, OWREGD45), |
ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(dst, reg, 1))) |
INSN(intsp, l, 1_or_2_src, 4cycle, C67X, 0, |
FIX2(FIX(op, 0x4a), FIX(src1, 0)), |
OP2(ORXREG1, OWREG4), |
ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(dst, reg, 1))) |
INSN(intspu, l, 1_or_2_src, 4cycle, C67X, 0, |
FIX2(FIX(op, 0x49), FIX(src1, 0)), |
OP2(ORXREG1, OWREG4), |
ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(dst, reg, 1))) |
INSN(ldb, d, load_store, load, C62X, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_PREFER(1), |
FIX2(FIX(op, 2), FIX(r, 0)), |
OP2(ORMEMSB, OWDREG5), |
ENC6(ENC(s, data_fu, 0), ENC(y, fu, 0), ENC(mode, mem_mode, 0), |
ENC(offsetR, mem_offset, 0), ENC(baseR, reg, 0), |
ENC(srcdst, reg, 1))) |
INSN(ldb, d, load_store_long, load, C62X, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_PREFER(0), |
FIX1(FIX(op, 2)), |
OP2(ORMEMLB, OWDREG5), |
ENC4(ENC(s, data_fu, 0), ENC(y, areg, 0), ENC(offsetR, ulcst_dpr_byte, 0), |
ENC(dst, reg, 1))) |
/* 16 bits insn */ |
INSN(ldb, d, doff4_dsz_x01, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE), |
FIX2(FIX(op, 1), FIX(sz, 1)), |
OP2(ORMEMSB, OWTREG5), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), |
ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset, 0))) |
INSN(ldb, d, dind_dsz_x01, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(REG_POSITIVE), |
FIX2(FIX(op, 1), FIX(sz, 1)), |
OP2(ORMEMSB, OWTREG5), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), |
ENC(ptr, reg_ptr, 0), ENC(src1, mem_offset, 0))) |
INSN(ldb, d, dinc_dsz_x01, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTINCR), |
FIX2(FIX(op, 1), FIX(sz, 1)), |
OP2(ORMEMSB, OWTREG5), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), |
ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset_minus_one, 0))) |
INSN(ldb, d, ddec_dsz_x01, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREDECR), |
FIX2(FIX(op, 1), FIX(sz, 1)), |
OP2(ORMEMSB, OWTREG5), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), |
ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset_minus_one, 0))) |
/**/ |
INSN(ldbu, d, load_store, load, C62X, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_PREFER(1), |
FIX2(FIX(op, 1), FIX(r, 0)), |
OP2(ORMEMSB, OWDREG5), |
ENC6(ENC(s, data_fu, 0), ENC(y, fu, 0), ENC(mode, mem_mode, 0), |
ENC(offsetR, mem_offset, 0), ENC(baseR, reg, 0), |
ENC(srcdst, reg, 1))) |
INSN(ldbu, d, load_store_long, load, C62X, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_PREFER(0), |
FIX1(FIX(op, 1)), |
OP2(ORMEMLB, OWDREG5), |
ENC4(ENC(s, data_fu, 0), ENC(y, areg, 0), ENC(offsetR, ulcst_dpr_byte, 0), |
ENC(dst, reg, 1))) |
/* 16 bits insn */ |
INSN(ldbu, d, dinc_dsz_000, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTINCR), |
FIX2(FIX(op, 1), FIX(sz, 1)), |
OP2(ORMEMSB, OWTREG5), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(cst, mem_offset_minus_one, 0), |
ENC(ptr, reg_ptr, 0), ENC(srcdst, reg, 1))) |
INSN(ldbu, d, dind_dsz_000, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(REG_POSITIVE), |
FIX2(FIX(op, 1), FIX(sz, 1)), |
OP2(ORMEMSB, OWTREG5), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(src1, mem_offset, 0), |
ENC(ptr, reg_ptr, 0), ENC(srcdst, reg, 1))) |
INSN(ldbu, d, doff4_dsz_000, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE), |
FIX2(FIX(op, 1), FIX(sz, 1)), |
OP2(ORMEMSB, OWTREG5), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(cst, mem_offset, 0), |
ENC(ptr, reg_ptr, 0), ENC(srcdst, reg, 1))) |
INSN(ldbu, d, ddec_dsz_000, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREDECR), |
FIX2(FIX(op, 1), FIX(sz, 1)), |
OP2(ORMEMSB, OWTREG5), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(cst, mem_offset_minus_one, 0), |
ENC(ptr, reg_ptr, 0), ENC(srcdst, reg, 1))) |
/**/ |
INSN(lddw, d, load_store, load, C64X_AND_C67X, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(op, 6), FIX(r, 1)), |
OP2(ORMEMSD, OWDREGD5), |
ENC6(ENC(s, data_fu, 0), ENC(y, fu, 0), ENC(mode, mem_mode, 0), |
ENC(offsetR, mem_offset, 0), ENC(baseR, reg, 0), |
ENC(srcdst, reg, 1))) |
/* 16 bits insn */ |
INSN(lddw, d, dpp, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREINCR)|TIC6X_FLAG_INSN16_B15PTR|TIC6X_FLAG_INSN16_NORS, |
FIX2(FIX(op, 1), FIX(dw, 1)), |
OP2(ORMEMSD, OWDREGD5), |
ENC4(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), |
ENC(cst, mem_offset_minus_one, 0))) |
INSN(lddw, d, ddecdw, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREDECR), |
FIX3(FIX(op, 1), FIX(na, 0), FIX(sz, 0)), |
OP2(ORMEMSD, OWTREGD5), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg_shift, 1), |
ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset_minus_one, 0))) |
INSN(lddw, d, dincdw, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTINCR), |
FIX3(FIX(op, 1), FIX(na, 0), FIX(sz, 0)), |
OP2(ORMEMSD, OWTREGD5), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg_shift, 1), |
ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset_minus_one, 0))) |
INSN(lddw, d, dinddw, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(REG_POSITIVE), |
FIX3(FIX(op, 1), FIX(na, 0), FIX(sz, 0)), |
OP2(ORMEMSD, OWTREGD5), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(src1, mem_offset, 0), |
ENC(ptr, reg_ptr, 0), ENC(srcdst, reg_shift, 1))) |
INSN(lddw, d, doff4dw, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE), |
FIX3(FIX(op, 1), FIX(na, 0), FIX(sz, 0)), |
OP2(ORMEMSD, OWTREGD5), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(cst, mem_offset, 0), |
ENC(ptr, reg_ptr, 0), ENC(srcdst, reg_shift, 1))) |
/**/ |
INSN(ldh, d, load_store, load, C62X, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_PREFER(1), |
FIX2(FIX(op, 4), FIX(r, 0)), |
OP2(ORMEMSH, OWDREG5), |
ENC6(ENC(s, data_fu, 0), ENC(y, fu, 0), ENC(mode, mem_mode, 0), |
ENC(offsetR, mem_offset, 0), ENC(baseR, reg, 0), |
ENC(srcdst, reg, 1))) |
INSN(ldh, d, load_store_long, load, C62X, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_PREFER(0), |
FIX1(FIX(op, 4)), |
OP2(ORMEMLH, OWDREG5), |
ENC4(ENC(s, data_fu, 0), ENC(y, areg, 0), ENC(offsetR, ulcst_dpr_half, 0), |
ENC(dst, reg, 1))) |
/* 16 bits insn */ |
INSN(ldh, d, doff4_dsz_x11, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE), |
FIX2(FIX(op, 1), FIX(sz, 1)), |
OP2(ORMEMSH, OWTREG5), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(cst, mem_offset, 0), |
ENC(ptr, reg_ptr, 0), ENC(srcdst, reg, 1))) |
INSN(ldh, d, dind_dsz_x11, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(REG_POSITIVE), |
FIX2(FIX(op, 1), FIX(sz, 1)), |
OP2(ORMEMSH, OWTREG5), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), |
ENC(ptr, reg_ptr, 0), ENC(src1, mem_offset, 0))) |
INSN(ldh, d, dinc_dsz_x11, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTINCR), |
FIX2(FIX(op, 1), FIX(sz, 1)), |
OP2(ORMEMSH, OWTREG5), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), |
ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset_minus_one, 0))) |
INSN(ldh, d, ddec_dsz_x11, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREDECR), |
FIX2(FIX(op, 1), FIX(sz, 1)), |
OP2(ORMEMSH, OWTREG5), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), |
ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset_minus_one, 0))) |
/**/ |
INSN(ldhu, d, load_store, load, C62X, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_PREFER(1), |
FIX2(FIX(op, 0), FIX(r, 0)), |
OP2(ORMEMSH, OWDREG5), |
ENC6(ENC(s, data_fu, 0), ENC(y, fu, 0), ENC(mode, mem_mode, 0), |
ENC(offsetR, mem_offset, 0), ENC(baseR, reg, 0), |
ENC(srcdst, reg, 1))) |
INSN(ldhu, d, load_store_long, load, C62X, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_PREFER(0), |
FIX1(FIX(op, 0)), |
OP2(ORMEMLH, OWDREG5), |
ENC4(ENC(s, data_fu, 0), ENC(y, areg, 0), ENC(offsetR, ulcst_dpr_half, 0), |
ENC(dst, reg, 1))) |
/* 16 bits insn */ |
INSN(ldhu, d, doff4_dsz_010, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE), |
FIX2(FIX(op, 1), FIX(sz, 1)), |
OP2(ORMEMSH, OWTREG5), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(cst, mem_offset, 0), |
ENC(ptr, reg_ptr, 0), ENC(srcdst, reg, 1))) |
INSN(ldhu, d, dind_dsz_010, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(REG_POSITIVE), |
FIX2(FIX(op, 1), FIX(sz, 1)), |
OP2(ORMEMSH, OWTREG5), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), |
ENC(ptr, reg_ptr, 0), ENC(src1, mem_offset, 0))) |
INSN(ldhu, d, dinc_dsz_010, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTINCR), |
FIX2(FIX(op, 1), FIX(sz, 1)), |
OP2(ORMEMSH, OWTREG5), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), |
ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset_minus_one, 0))) |
INSN(ldhu, d, ddec_dsz_010, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREDECR), |
FIX2(FIX(op, 1), FIX(sz, 1)), |
OP2(ORMEMSH, OWTREG5), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), |
ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset_minus_one, 0))) |
/**/ |
INSN(ldndw, d, load_nonaligned, load, C64X, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_UNALIGNED, |
FIX0(), |
OP2(ORMEMND, OWDREGD5), |
ENC7(ENC(s, data_fu, 0), ENC(y, fu, 0), ENC(mode, mem_mode, 0), |
ENC(offsetR, mem_offset_noscale, 0), ENC(baseR, reg, 0), |
ENC(sc, scaled, 0), ENC(dst, reg_shift, 1))) |
/* 16 bits insn */ |
INSN(ldndw, d, ddecdw, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREDECR), |
FIX3(FIX(op, 1), FIX(na, 1), FIX(sz, 0)), |
OP2(ORMEMND, OWTREGD5), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg_shift, 1), |
ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset_minus_one_noscale, 0))) |
INSN(ldndw, d, dincdw, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTINCR), |
FIX3(FIX(op, 1), FIX(na, 1), FIX(sz, 0)), |
OP2(ORMEMND, OWTREGD5), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg_shift, 1), |
ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset_minus_one_noscale, 0))) |
INSN(ldndw, d, dinddw, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_UNALIGNED|TIC6X_FLAG_INSN16_MEM_MODE(REG_POSITIVE), |
FIX3(FIX(op, 1), FIX(na, 1), FIX(sz, 0)), |
OP2(ORMEMND, OWTREGD5), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(src1, mem_offset_noscale, 0), |
ENC(ptr, reg_ptr, 0), ENC(srcdst, reg_shift, 1))) |
INSN(ldndw, d, doff4dw, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_UNALIGNED|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE), |
FIX3(FIX(op, 1), FIX(na, 1), FIX(sz, 0)), |
OP2(ORMEMND, OWTREGD5), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(cst, mem_offset_noscale, 0), |
ENC(ptr, reg_ptr, 0), ENC(srcdst, reg_shift, 1))) |
/**/ |
INSN(ldnw, d, load_store, load, C64X, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_UNALIGNED, |
FIX2(FIX(op, 3), FIX(r, 1)), |
OP2(ORMEMSW, OWDREG5), |
ENC6(ENC(s, data_fu, 0), ENC(y, fu, 0), ENC(mode, mem_mode, 0), |
ENC(offsetR, mem_offset, 0), ENC(baseR, reg, 0), |
ENC(srcdst, reg, 1))) |
/* 16 bits insn */ |
INSN(ldnw, d, doff4_dsz_110, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE), |
FIX2(FIX(op, 1), FIX(sz, 1)), |
OP2(ORMEMSW, OWTREG5), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), |
ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset, 0))) |
INSN(ldnw, d, dind_dsz_110, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(REG_POSITIVE), |
FIX2(FIX(op, 1), FIX(sz, 1)), |
OP2(ORMEMSW, OWTREG5), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), |
ENC(ptr, reg_ptr, 0), ENC(src1, mem_offset, 0))) |
INSN(ldnw, d, dinc_dsz_110, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTINCR), |
FIX2(FIX(op, 1), FIX(sz, 1)), |
OP2(ORMEMSW, OWTREG5), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), |
ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset_minus_one, 0))) |
INSN(ldnw, d, ddec_dsz_110, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREDECR), |
FIX2(FIX(op, 1), FIX(sz, 1)), |
OP2(ORMEMSW, OWTREG5), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), |
ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset_minus_one, 0))) |
/**/ |
INSN(ldw, d, load_store, load, C62X, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_PREFER(1), |
FIX2(FIX(op, 6), FIX(r, 0)), |
OP2(ORMEMSW, OWDREG5), |
ENC6(ENC(s, data_fu, 0), ENC(y, fu, 0), ENC(mode, mem_mode, 0), |
ENC(offsetR, mem_offset, 0), ENC(baseR, reg, 0), |
ENC(srcdst, reg, 1))) |
INSN(ldw, d, load_store_long, load, C62X, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_PREFER(0), |
FIX1(FIX(op, 6)), |
OP2(ORMEMLW, OWDREG5), |
ENC4(ENC(s, data_fu, 0), ENC(y, areg, 0), ENC(offsetR, ulcst_dpr_word, 0), |
ENC(dst, reg, 1))) |
/* 16 bits insn */ |
INSN(ldw, d, doff4_dsz_0xx, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE), |
FIX2(FIX(op, 1), FIX(sz, 0)), |
OP2(ORMEMSW, OWTREG5), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), |
ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset, 0))) |
INSN(ldw, d, doff4_dsz_100, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE), |
FIX2(FIX(op, 1), FIX(sz, 1)), |
OP2(ORMEMSW, OWTREG5), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), |
ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset, 0))) |
INSN(ldw, d, dind_dsz_0xx, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(REG_POSITIVE), |
FIX2(FIX(op, 1), FIX(sz, 0)), |
OP2(ORMEMSW, OWTREG5), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), |
ENC(ptr, reg_ptr, 0), ENC(src1, mem_offset, 0))) |
INSN(ldw, d, dind_dsz_100, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(REG_POSITIVE), |
FIX2(FIX(op, 1), FIX(sz, 1)), |
OP2(ORMEMSW, OWTREG5), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), |
ENC(ptr, reg_ptr, 0), ENC(src1, mem_offset, 0))) |
INSN(ldw, d, dinc_dsz_0xx, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTINCR), |
FIX2(FIX(op, 1), FIX(sz, 0)), |
OP2(ORMEMSW, OWTREG5), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), |
ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset_minus_one, 0))) |
INSN(ldw, d, dinc_dsz_100, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTINCR), |
FIX2(FIX(op, 1), FIX(sz, 1)), |
OP2(ORMEMSW, OWTREG5), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), |
ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset_minus_one, 0))) |
INSN(ldw, d, ddec_dsz_0xx, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREDECR), |
FIX2(FIX(op, 1), FIX(sz, 0)), |
OP2(ORMEMSW, OWTREG5), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), |
ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset_minus_one, 0))) |
INSN(ldw, d, ddec_dsz_100, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREDECR), |
FIX2(FIX(op, 1), FIX(sz, 1)), |
OP2(ORMEMSW, OWTREG5), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), |
ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset_minus_one, 0))) |
INSN(ldw, d, dpp, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREINCR)|TIC6X_FLAG_INSN16_B15PTR|TIC6X_FLAG_INSN16_NORS, |
FIX2(FIX(op, 1), FIX(dw, 0)), |
OP2(ORMEMSW, OWTREG5), |
ENC4(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), |
ENC(cst, mem_offset_minus_one, 0))) |
INSN(ldw, d, dstk, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE)|TIC6X_FLAG_INSN16_B15PTR, |
FIX2(FIX(op, 0x1), FIX(s, 1)), |
OP2(ORMEMSW, OWTREG5), |
ENC4(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), |
ENC(cst, mem_offset, 0))) |
/**/ |
INSN(ll, d, 1_or_2_src, load, C64XP, |
TIC6X_FLAG_LOAD|TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_SIDE_T2_ONLY|TIC6X_FLAG_NO_CROSS, |
FIX3(FIX(s, 1), FIX(op, 0xc), FIX(src1, 0)), |
OP2(ORMEMDW, OWDREG5), |
ENC2(ENC(src2, reg, 0), ENC(dst, reg, 1))) |
INSNE(lmbd, l_ui_xui_ui, l, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x6b)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(lmbd, l_s5_xui_ui, l, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x6a)), |
OP3(OACST, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(max2, l, 1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x42)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(max2, s, ext_1_or_2_src, 1cycle, C64XP, 0, |
FIX1(FIX(op, 0xd)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(maxu4, l, 1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x43)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(min2, l, 1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x41)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(min2, s, ext_1_or_2_src, 1cycle, C64XP, 0, |
FIX1(FIX(op, 0xc)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(minu4, l, 1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x48)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(mpy, m_sl16_xsl16_si, m, mpy, 1616_m, C62X, 0, |
FIX1(FIX(op, 0x19)), |
OP3(ORREG1, ORXREG1, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(mpy, m_s5_xsl16_si, m, mpy, 1616_m, C62X, 0, |
FIX1(FIX(op, 0x18)), |
OP3(OACST, ORXREG1, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
/* 16-bit insn. */ |
INSN(mpy, m, m3_sat_0, 1616_m, C67X, 0, |
FIX1(FIX(op, 0x0)), |
OP3(ORREG1, ORXREG1, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg_shift, 2))) |
INSN(mpydp, m, mpy, mpydp, C67X, 0, |
FIX1(FIX(op, 0x0e)), |
OP3(ORREGD1234, ORXREGD1324, OWREGD910), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(mpyh, m, mpy, 1616_m, C62X, 0, |
FIX1(FIX(op, 0x01)), |
OP3(ORREG1, ORXREG1, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
/* 16 bits insn */ |
INSN(mpyh, m, m3_sat_0, 1616_m, C67X, 0, |
FIX1(FIX(op, 0x1)), |
OP3(ORREG1, ORXREG1, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg_shift, 2))) |
/**/ |
INSN(mpyhi, m, compound, 4cycle, C64X, 0, |
FIX1(FIX(op, 0x14)), |
OP3(ORREG1, ORXREG1, OWREGD4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(mpyhir, m, compound, 4cycle, C64X, 0, |
FIX1(FIX(op, 0x10)), |
OP3(ORREG1, ORXREG1, OWREG4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(mpyhl, m, mpy, 1616_m, C62X, 0, |
FIX1(FIX(op, 0x09)), |
OP3(ORREG1, ORXREG1, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
/* 16 bits insn */ |
INSN(mpyhl, m, m3_sat_0, 1616_m, C67X, 0, |
FIX1(FIX(op, 0x3)), |
OP3(ORREG1, ORXREG1, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg_shift, 2))) |
/**/ |
INSN(mpyhlu, m, mpy, 1616_m, C62X, 0, |
FIX1(FIX(op, 0x0f)), |
OP3(ORREG1, ORXREG1, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(mpyhslu, m, mpy, 1616_m, C62X, 0, |
FIX1(FIX(op, 0x0b)), |
OP3(ORREG1, ORXREG1, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(mpyhsu, m, mpy, 1616_m, C62X, 0, |
FIX1(FIX(op, 0x03)), |
OP3(ORREG1, ORXREG1, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(mpyhu, m, mpy, 1616_m, C62X, 0, |
FIX1(FIX(op, 0x07)), |
OP3(ORREG1, ORXREG1, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(mpyhuls, m, mpy, 1616_m, C62X, 0, |
FIX1(FIX(op, 0x0d)), |
OP3(ORREG1, ORXREG1, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(mpyhus, m, mpy, 1616_m, C62X, 0, |
FIX1(FIX(op, 0x05)), |
OP3(ORREG1, ORXREG1, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(mpyi, m_si_xsi_si, m, mpy, mpyi, C67X, 0, |
FIX1(FIX(op, 0x04)), |
OP3(ORREG14, ORXREG14, OWREG9), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(mpyi, m_s5_xsi_si, m, mpy, mpyi, C67X, 0, |
FIX1(FIX(op, 0x06)), |
OP3(OACST, ORXREG14, OWREG9), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(mpyid, m_si_xsi_sll, m, mpy, mpyid, C67X, 0, |
FIX1(FIX(op, 0x08)), |
OP3(ORREG14, ORXREG14, OWREGD910), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(mpyid, m_s5_xsi_sll, m, mpy, mpyid, C67X, 0, |
FIX1(FIX(op, 0x0c)), |
OP3(OACST, ORXREG14, OWREGD910), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(mpyih, m, compound, 4cycle, C64X, TIC6X_FLAG_MACRO, |
FIX1(FIX(op, 0x14)), |
OP3(ORXREG1, ORREG1, OWREGD4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(src1, reg, 1), ENC(dst, reg, 2))) |
INSN(mpyihr, m, compound, 4cycle, C64X, TIC6X_FLAG_MACRO, |
FIX1(FIX(op, 0x10)), |
OP3(ORXREG1, ORREG1, OWREG4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(src1, reg, 1), ENC(dst, reg, 2))) |
INSN(mpyil, m, compound, 4cycle, C64X, TIC6X_FLAG_MACRO, |
FIX1(FIX(op, 0x15)), |
OP3(ORXREG1, ORREG1, OWREGD4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(src1, reg, 1), ENC(dst, reg, 2))) |
INSN(mpyilr, m, compound, 4cycle, C64X, TIC6X_FLAG_MACRO, |
FIX1(FIX(op, 0x0e)), |
OP3(ORXREG1, ORREG1, OWREG4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(src1, reg, 1), ENC(dst, reg, 2))) |
INSN(mpylh, m, mpy, 1616_m, C62X, 0, |
FIX1(FIX(op, 0x11)), |
OP3(ORREG1, ORXREG1, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
/* 16 bits insn */ |
INSN(mpylh, m, m3_sat_0, 1616_m, C67X, 0, |
FIX1(FIX(op, 0x2)), |
OP3(ORREG1, ORXREG1, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg_shift, 2))) |
/**/ |
INSN(mpylhu, m, mpy, 1616_m, C62X, 0, |
FIX1(FIX(op, 0x17)), |
OP3(ORREG1, ORXREG1, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(mpyli, m, compound, 4cycle, C64X, 0, |
FIX1(FIX(op, 0x15)), |
OP3(ORREG1, ORXREG1, OWREGD4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(mpylir, m, compound, 4cycle, C64X, 0, |
FIX1(FIX(op, 0x0e)), |
OP3(ORREG1, ORXREG1, OWREG4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(mpylshu, m, mpy, 1616_m, C62X, 0, |
FIX1(FIX(op, 0x13)), |
OP3(ORREG1, ORXREG1, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(mpyluhs, m, mpy, 1616_m, C62X, 0, |
FIX1(FIX(op, 0x15)), |
OP3(ORREG1, ORXREG1, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(mpysp, m, mpy, 4cycle, C67X, 0, |
FIX1(FIX(op, 0x1c)), |
OP3(ORREG1, ORXREG1, OWREG4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
/* Contrary to SPRU733A, MPYSPDP and MPYSP2DP are on both C67X and |
C67X+. */ |
INSN(mpyspdp, m, compound, mpyspdp, C67X, 0, |
FIX1(FIX(op, 0x16)), |
OP3(ORREG12, ORXREGD12, OWREGD67), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(mpysp2dp, m, compound, mpyspdp, C67X, 0, |
FIX1(FIX(op, 0x17)), |
OP3(ORREG1, ORXREG1, OWREGD45), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(mpysu, m_sl16_xul16_si, m, mpy, 1616_m, C62X, 0, |
FIX1(FIX(op, 0x1b)), |
OP3(ORREG1, ORXREG1, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(mpysu, m_s5_xul16_si, m, mpy, 1616_m, C62X, 0, |
FIX1(FIX(op, 0x1e)), |
OP3(OACST, ORXREG1, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(mpysu4, m, compound, 4cycle, C64X, 0, |
FIX1(FIX(op, 0x05)), |
OP3(ORREG1, ORXREG1, OWREGD4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(mpyu, m, mpy, 1616_m, C62X, 0, |
FIX1(FIX(op, 0x1f)), |
OP3(ORREG1, ORXREG1, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(mpyu4, m, compound, 4cycle, C64X, 0, |
FIX1(FIX(op, 0x04)), |
OP3(ORREG1, ORXREG1, OWREGD4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(mpyus, m, mpy, 1616_m, C62X, 0, |
FIX1(FIX(op, 0x1d)), |
OP3(ORREG1, ORXREG1, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(mpyus4, m, compound, 4cycle, C64X, TIC6X_FLAG_MACRO, |
FIX1(FIX(op, 0x05)), |
OP3(ORXREG1, ORREG1, OWREGD4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(src1, reg, 1), ENC(dst, reg, 2))) |
INSN(mpy2, m, compound, 4cycle, C64X, 0, |
FIX1(FIX(op, 0x00)), |
OP3(ORREG1, ORXREG1, OWREGD4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(mpy2ir, m, 1_or_2_src, 4cycle, C64XP, 0, |
FIX1(FIX(op, 0x0f)), |
OP3(ORREG1, ORXREG1, OWREGD4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(mpy32, 32_32_32, m, mpy, 4cycle, C64XP, 0, |
FIX1(FIX(op, 0x10)), |
OP3(ORREG1, ORXREG1, OWREG4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(mpy32, 32_32_64, m, mpy, 4cycle, C64XP, 0, |
FIX1(FIX(op, 0x14)), |
OP3(ORREG1, ORXREG1, OWREGD4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(mpy32su, m, mpy, 4cycle, C64XP, 0, |
FIX1(FIX(op, 0x16)), |
OP3(ORREG1, ORXREG1, OWREGD4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(mpy32u, m, compound, 4cycle, C64XP, 0, |
FIX1(FIX(op, 0x18)), |
OP3(ORREG1, ORXREG1, OWREGD4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(mpy32us, m, compound, 4cycle, C64XP, 0, |
FIX1(FIX(op, 0x19)), |
OP3(ORREG1, ORXREG1, OWREGD4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
/* "or" forms of "mv" are preferred over "add" forms when available |
because "or" uses less power. However, 40-bit moves are only |
available through "add", and before C64X D-unit moves are only |
available through "add" (without cross paths being available). */ |
INSNE(mv, l_xui_ui, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_MACRO, |
FIX2(FIX(op, 0x7e), FIX(src1, 0)), |
OP2(ORXREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(dst, reg, 1))) |
INSNE(mv, l_sl_sl, l, 1_or_2_src, 1cycle, C62X, |
TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MACRO, |
FIX3(FIX(op, 0x20), FIX(x, 0), FIX(src1, 0)), |
OP2(ORREGL1, OWREGL1), |
ENC3(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(dst, reg, 1))) |
INSNE(mv, s_xui_ui, s, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_MACRO, |
FIX2(FIX(op, 0x1a), FIX(src1, 0)), |
OP2(ORXREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(dst, reg, 1))) |
INSNE(mv, d_si_si, d, 1_or_2_src, 1cycle, C62X, |
TIC6X_FLAG_MACRO|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_PREFER(0), |
FIX2(FIX(op, 0x12), FIX(src1, 0)), |
OP2(ORREG1, OWREG1), |
ENC3(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(dst, reg, 1))) |
INSNE(mv, d_xui_ui, d, ext_1_or_2_src, 1cycle, C64X, |
TIC6X_FLAG_MACRO|TIC6X_FLAG_PREFER(1), |
FIX2(FIX(op, 0x3), FIX(src1, 0)), |
OP2(ORXREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(dst, reg, 1))) |
/* 16 bits insn */ |
INSNU(mv, l, lsdmvto, 1cycle, C64X, 0, |
FIX1(FIX(unit, 0x0)), |
OP2(ORXREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(x, xpath, 0), ENC(dst, reg, 1))) |
INSNU(mv, s, lsdmvto, 1cycle, C64X, 0, |
FIX1(FIX(unit, 0x1)), |
OP2(ORXREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(x, xpath, 0), ENC(dst, reg, 1))) |
INSNU(mv, d, lsdmvto, 1cycle, C64X, 0, |
FIX1(FIX(unit, 0x2)), |
OP2(ORXREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(x, xpath, 0), ENC(dst, reg, 1))) |
INSNU(mv, l, lsdmvfr, 1cycle, C64X, 0, |
FIX1(FIX(unit, 0x0)), |
OP2(ORXREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(x, xpath, 0), ENC(dst, reg, 1))) |
INSNU(mv, s, lsdmvfr, 1cycle, C64X, 0, |
FIX1(FIX(unit, 0x1)), |
OP2(ORXREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(x, xpath, 0), ENC(dst, reg, 1))) |
INSNU(mv, d, lsdmvfr, 1cycle, C64X, 0, |
FIX1(FIX(unit, 0x2)), |
OP2(ORXREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(x, xpath, 0), ENC(dst, reg, 1))) |
/**/ |
INSNE(mvc, from_cr, s, 1_or_2_src, 1cycle, C62X, |
TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_NO_CROSS, |
FIX3(FIX(s, 1), FIX(op, 0x0f), FIX(x, 0)), |
OP2(ORCREG1, OWREG1), |
ENC3(ENC(src1, crhi, 0), ENC(src2, crlo, 0), ENC(dst, reg, 1))) |
INSNE(mvc, to_cr, s, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_SIDE_B_ONLY, |
FIX2(FIX(s, 1), FIX(op, 0x0e)), |
OP2(ORXREG1, OWCREG1), |
ENC4(ENC(x, xpath, 0), ENC(src2, reg, 0), ENC(src1, crhi, 1), |
ENC(dst, crlo, 1))) |
/* 16 bits insn */ |
INSN(mvc, s, sx1, 1cycle, C64XP, |
TIC6X_FLAG_NO_CROSS, |
FIX1(FIX(op, 0x6)), |
OP2(ORREG1B, OWILC1), |
ENC2(ENC(s, fu, 0), ENC(srcdst, reg, 0))) |
/**/ |
INSN(mvd, m, unary, 4cycle, C64X, 0, |
FIX1(FIX(op, 0x1a)), |
OP2(ORXREG1, OWREG4), |
ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(dst, reg, 1))) |
INSN(mvk, s, mvk, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, |
FIX1(FIX(h, 0)), |
OP2(OLCST, OWREG1), |
ENC3(ENC(s, fu, 0), ENC(cst, scst, 0), ENC(dst, reg, 1))) |
INSN(mvk, l, unary, 1cycle, C64X, TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(x, 0), FIX(op, 0x05)), |
OP2(OACST, OWREG1), |
ENC3(ENC(s, fu, 0), ENC(src2, scst, 0), ENC(dst, reg, 1))) |
INSN(mvk, d, 1_or_2_src, 1cycle, C64X, TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(op, 0x00), FIX(src2, 0)), |
OP2(OACST, OWREG1), |
ENC3(ENC(s, fu, 0), ENC(src1, scst, 0), ENC(dst, reg, 1))) |
/* 16 bits insn */ |
INSN(mvk, l, lx5, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, |
FIX0(), |
OP2(OLCST, OWREG1), |
ENC3(ENC(s, fu, 0), ENC(cst, scst, 0), ENC(dst, reg, 1))) |
INSN(mvk, s, smvk8, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, |
FIX0(), |
OP2(OLCST, OWREG1), |
ENC3(ENC(s, fu, 0), ENC(cst, ucst, 0), ENC(dst, reg, 1))) |
INSNU(mvk, l, lsdx1c, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_SPRED, |
FIX1(FIX(unit, 0x0)), |
OP2(OACST, OWREG1), |
ENC3(ENC(s, fu, 0), ENC(cst, ucst, 0), ENC(dst, reg, 1))) |
INSNU(mvk, s, lsdx1c, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_SPRED, |
FIX1(FIX(unit, 0x1)), |
OP2(OACST, OWREG1), |
ENC3(ENC(s, fu, 0), ENC(cst, ucst, 0), ENC(dst, reg, 1))) |
INSNU(mvk, d, lsdx1c, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_SPRED, |
FIX1(FIX(unit, 0x2)), |
OP2(OACST, OWREG1), |
ENC3(ENC(s, fu, 0), ENC(cst, ucst, 0), ENC(dst, reg, 1))) |
INSNUE(mvk, zero, l, lsdx1, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(op, 0), FIX(unit, 0x0)), |
OP2(OHWCST0, OWREG1), |
ENC2(ENC(s, fu, 0), ENC(srcdst, reg, 1))) |
INSNUE(mvk, zero, s, lsdx1, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(op, 0), FIX(unit, 0x1)), |
OP2(OHWCST0, OWREG1), |
ENC2(ENC(s, fu, 0), ENC(srcdst, reg, 1))) |
INSNUE(mvk, zero, d, lsdx1, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(op, 0), FIX(unit, 0x2)), |
OP2(OHWCST0, OWREG1), |
ENC2(ENC(s, fu, 0), ENC(srcdst, reg, 1))) |
INSNUE(mvk, one, l, lsdx1, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(op, 1), FIX(unit, 0x0)), |
OP2(OHWCST1, OWREG1), |
ENC2(ENC(s, fu, 0), ENC(srcdst, reg, 1))) |
INSNUE(mvk, one, s, lsdx1, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(op, 1), FIX(unit, 0x1)), |
OP2(OHWCST1, OWREG1), |
ENC2(ENC(s, fu, 0), ENC(srcdst, reg, 1))) |
INSNUE(mvk, one, d, lsdx1, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(op, 1), FIX(unit, 0x2)), |
OP2(OHWCST1, OWREG1), |
ENC2(ENC(s, fu, 0), ENC(srcdst, reg, 1))) |
/**/ |
INSN(mvkh, s, mvk, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, |
FIX1(FIX(h, 1)), |
OP2(OLCST, OWREG1), |
ENC3(ENC(s, fu, 0), ENC(cst, lcst_high16, 0), ENC(dst, reg, 1))) |
INSN(mvklh, s, mvk, 1cycle, C62X, TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MACRO, |
FIX1(FIX(h, 1)), |
OP2(OLCST, OWREG1), |
ENC3(ENC(s, fu, 0), ENC(cst, lcst_low16, 0), ENC(dst, reg, 1))) |
INSN(mvkl, s, mvk, 1cycle, C62X, TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MACRO, |
FIX1(FIX(h, 0)), |
OP2(OLCST, OWREG1), |
ENC3(ENC(s, fu, 0), ENC(cst, lcst_low16, 0), ENC(dst, reg, 1))) |
INSNE(neg, s_xsi_si, s, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_MACRO, |
FIX2(FIX(op, 0x16), FIX(src1, 0)), |
OP2(ORXREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(dst, reg, 1))) |
INSNE(neg, l_xsi_si, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_MACRO, |
FIX2(FIX(op, 0x06), FIX(src1, 0)), |
OP2(ORXREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(dst, reg, 1))) |
INSNE(neg, l_sl_sl, l, 1_or_2_src, 1cycle, C62X, |
TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MACRO, |
FIX2(FIX(op, 0x24), FIX(src1, 0)), |
OP2(ORREGL1, OWREGL1), |
ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(dst, reg, 1))) |
INSN(nop, nfu, nop_idle, nop, C62X, 0, |
FIX2(FIX(s, 0), RAN(op, 0, 8)), |
OP1(OACST), |
ENC1(ENC(op, ucst_minus_one, 0))) |
INSNE(nop, 1, nfu, nop_idle, nop, C62X, TIC6X_FLAG_MACRO, |
FIX2(FIX(s, 0), FIX(op, 0)), |
OP0(), |
ENC0()) |
/* 16 bits insn */ |
/* contrary to sprufe8b.pdf p767, and accordingly to |
* dis6x.exe output, unop3 opcode is decoded as NOP N3 + 1 */ |
INSN(nop, nfu, unop, nop, C64XP, 0, |
FIX0(), |
OP1(OACST), |
ENC1(ENC(n, ucst_minus_one, 0))) |
/**/ |
INSNE(norm, l_xsi_ui, l, 1_or_2_src, 1cycle, C62X, 0, |
FIX2(FIX(op, 0x63), FIX(src1, 0)), |
OP2(ORXREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(dst, reg, 1))) |
INSNE(norm, l_sl_ui, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, |
FIX3(FIX(op, 0x60), FIX(x, 0), FIX(src1, 0)), |
OP2(ORREGL1, OWREG1), |
ENC3(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(dst, reg, 1))) |
INSN(not, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_MACRO, |
FIX2(FIX(op, 0x6e), FIX(src1, 0x1f)), |
OP2(ORXREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(dst, reg, 1))) |
INSN(not, s, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_MACRO, |
FIX2(FIX(op, 0x0a), FIX(src1, 0x1f)), |
OP2(ORXREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(dst, reg, 1))) |
INSN(not, d, ext_1_or_2_src, 1cycle, C64X, TIC6X_FLAG_MACRO, |
FIX2(FIX(op, 0xf), FIX(src1, 0x1f)), |
OP2(ORXREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(dst, reg, 1))) |
INSNE(or, d_ui_xui_ui, d, ext_1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x2)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(or, d_s5_xui_ui, d, ext_1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x3)), |
OP3(OACST, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(or, l_ui_xui_ui, l, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x7f)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(or, l_s5_xui_ui, l, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x7e)), |
OP3(OACST, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(or, s_ui_xui_ui, s, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x1b)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(or, s_s5_xui_ui, s, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x1a)), |
OP3(OACST, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
/* 16 bits insn */ |
INSN(or, l, l2c, 1cycle, C64XP, 0, |
FIX1(FIX(op, 1)), |
OP3(ORREG1, ORXREG1, OWREG1NORS), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
/**/ |
INSN(pack2, l, 1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x0)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(pack2, s, ext_1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0xf)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(packh2, l, 1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x1e)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(packh2, s, 1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x9)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(packh4, l, 1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x69)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(packhl2, l, 1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x1c)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(packhl2, s, 1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x8)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(packlh2, l, 1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x1b)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(packlh2, s, 1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x10)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(packl4, l, 1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x68)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(rcpdp, s, 1_or_2_src, 2cycle_dp, C67X, TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(op, 0x2d), FIX(x, 0)), |
OP2(ORREGD1, OWREGD12), |
ENC4(ENC(s, fu, 0), ENC(src2, regpair_msb, 0), ENC(src1, regpair_lsb, 0), |
ENC(dst, reg, 1))) |
INSN(rcpsp, s, 1_or_2_src, 1cycle, C67X, 0, |
FIX2(FIX(op, 0x3d), FIX(src1, 0)), |
OP2(ORXREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(dst, reg, 1))) |
INSN(ret, s, ext_branch_cond_imm, branch, C62X, |
TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MACRO|TIC6X_FLAG_RETURN, |
FIX0(), |
OP1(OLCST), |
ENC2(ENC(s, fu, 0), ENC(cst, pcrel, 0))) |
INSN(ret, s, branch, branch, C62X, |
TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_MACRO|TIC6X_FLAG_RETURN, |
FIX1(FIX(s, 1)), |
OP1(ORXREG1), |
ENC2(ENC(x, xpath, 0), ENC(src2, reg, 0))) |
INSN(ret, s, b_irp, branch, C62X, |
TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_MACRO|TIC6X_FLAG_RETURN, |
FIX3(FIX(s, 1), FIX(x, 0), FIX(dst, 0)), |
OP1(ORIRP1), |
ENC0()) |
INSN(ret, s, b_nrp, branch, C62X, |
TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_MACRO|TIC6X_FLAG_RETURN, |
FIX3(FIX(s, 1), FIX(x, 0), FIX(dst, 0)), |
OP1(ORNRP1), |
ENC0()) |
INSN(retp, s, call_imm_nop, branch, C64XP, |
TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MCNOP|TIC6X_FLAG_MACRO|TIC6X_FLAG_RETURN, |
FIX1(FIX(z, 1)), |
OP2(OLCST, OWRETREG1), |
ENC2(ENC(s, fu, 0), ENC(cst, pcrel, 0))) |
INSN(rint, nfu, rint, 1cycle, C64XP, 0, |
FIX1(FIX(s, 0)), |
OP0(), |
ENC0()) |
INSNE(rotl, m_ui_xui_ui, m, compound, 1616_m, C64X, 0, |
FIX1(FIX(op, 0x1d)), |
OP3(ORXREG1, ORREG1, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(src1, reg, 1), ENC(dst, reg, 2))) |
INSNE(rotl, m_u5_xui_ui, m, compound, 1616_m, C64X, 0, |
FIX1(FIX(op, 0x1e)), |
OP3(ORXREG1, OACST, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(src1, ucst, 1), ENC(dst, reg, 2))) |
INSN(rpack2, s, ext_1_or_2_src_noncond, 1cycle, C64XP, 0, |
FIX2(FIX(op, 0xb), FIX(z, 1)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(rsqrdp, s, 1_or_2_src, 2cycle_dp, C67X, TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(op, 0x2e), FIX(x, 0)), |
OP2(ORREGD1, OWREGD12), |
ENC4(ENC(s, fu, 0), ENC(src2, regpair_msb, 0), ENC(src1, regpair_lsb, 0), |
ENC(dst, reg, 1))) |
INSN(rsqrsp, s, 1_or_2_src, 1cycle, C67X, 0, |
FIX2(FIX(op, 0x3e), FIX(src1, 0)), |
OP2(ORXREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(dst, reg, 1))) |
INSNE(sadd, l_si_xsi_si, l, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x13)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(sadd, l_xsi_sl_sl, l, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x31)), |
OP3(ORXREG1, ORREGL1, OWREGL1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(sadd, l_s5_xsi_si, l, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x12)), |
OP3(OACST, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(sadd, l_s5_sl_sl, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, |
FIX1(FIX(op, 0x30)), |
OP3(OACST, ORREGL1, OWREGL1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(sadd, s_si_xsi_si, s, 1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x20)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
/* 16 bits insn */ |
INSN(sadd, l, l3_sat_1, 1cycle, C64XP, 0, |
FIX1(FIX(op, 0)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(sadd, s, s3_sat_1, 1cycle, C64XP,0, |
FIX1(FIX(op, 0x0)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
/**/ |
INSN(sadd2, s, ext_1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x0)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(saddsub, l, 1_or_2_src_noncond, 1cycle, C64XP, 0, |
FIX1(FIX(op, 0x0e)), |
OP3(ORREG1, ORXREG1, OWREGD1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(saddsub2, l, 1_or_2_src_noncond, 1cycle, C64XP, 0, |
FIX1(FIX(op, 0x0f)), |
OP3(ORREG1, ORXREG1, OWREGD1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(saddsu2, s, ext_1_or_2_src, 1cycle, C64X, TIC6X_FLAG_MACRO, |
FIX1(FIX(op, 0x1)), |
OP3(ORXREG1, ORREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(src1, reg, 1), ENC(dst, reg, 2))) |
INSN(saddus2, s, ext_1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x1)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(saddu4, s, ext_1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x3)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(sat, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, |
FIX3(FIX(op, 0x40), FIX(x, 0), FIX(src1, 0)), |
OP2(ORREGL1, OWREG1), |
ENC3(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(dst, reg, 1))) |
INSN(set, s, field, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, |
FIX1(FIX(op, 0x2)), |
OP4(ORREG1, OACST, OACST, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(csta, ucst, 1), |
ENC(cstb, ucst, 2), ENC(dst, reg, 3))) |
INSN(set, s, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x3b)), |
OP3(ORXREG1, ORREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(src1, reg, 1), ENC(dst, reg, 2))) |
/* 16 bits insn */ |
INSN(set, s, sc5, 1cycle, C64XP, 0, |
FIX1(FIX(op, 1)), |
OP4(ORREG1, OACST, OACST, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(srcdst, reg, 0), ENC(cst, ucst, 1), |
ENC(cst, ucst, 2), ENC(srcdst, reg, 3))) |
/**/ |
INSN(shfl, m, unary, 1616_m, C64X, 0, |
FIX1(FIX(op, 0x1c)), |
OP2(ORXREG1, OWREG2), |
ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(dst, reg, 1))) |
INSN(shfl3, l, 1_or_2_src_noncond, 1cycle, C64XP, 0, |
FIX1(FIX(op, 0x36)), |
OP3(ORREG1, ORXREG1, OWREGD1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(shl, s_xsi_ui_si, s, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x33)), |
OP3(ORXREG1, ORREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(src1, reg, 1), ENC(dst, reg, 2))) |
INSNE(shl, s_sl_ui_sl, s, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(op, 0x31), FIX(x, 0)), |
OP3(ORREGL1, ORREG1, OWREGL1), |
ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, reg, 1), |
ENC(dst, reg, 2))) |
INSNE(shl, s_xui_ui_ul, s, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x13)), |
OP3(ORXREG1, ORREG1, OWREGL1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(src1, reg, 1), ENC(dst, reg, 2))) |
INSNE(shl, s_xsi_u5_si, s, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x32)), |
OP3(ORXREG1, OACST, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(src1, ucst, 1), ENC(dst, reg, 2))) |
INSNE(shl, s_sl_u5_sl, s, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(op, 0x30), FIX(x, 0)), |
OP3(ORREGL1, OACST, OWREGL1), |
ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, ucst, 1), |
ENC(dst, reg, 2))) |
INSNE(shl, s_xui_u5_ul, s, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x12)), |
OP3(ORXREG1, OACST, OWREGL1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(src1, ucst, 1), ENC(dst, reg, 2))) |
/* 16bit insn */ |
INSN(shl, s, s3i, 1cycle, C64XP, 0, |
FIX1(FIX(op, 0x0)), |
OP3(ORXREG1, OACST, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(cst, cst_s3i, 1), ENC(dst, reg, 2))) |
INSN(shl, s, ssh5_sat_x, 1cycle, C64XP, |
TIC6X_FLAG_NO_CROSS, |
FIX1(FIX(op, 0x0)), |
OP3(ORREG1, OACST, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(srcdst, reg, 0), |
ENC(cst, ucst, 1), ENC(srcdst, reg, 2))) |
INSN(shl, s, s2sh, 1cycle, C64XP, 0, |
FIX1(FIX(op, 0x0)), |
OP3(ORREG1, ORREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(srcdst, reg, 0), ENC(src1, reg, 1), |
ENC(srcdst, reg, 2))) |
/**/ |
INSN(shlmb, l, 1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x61)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(shlmb, s, ext_1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x9)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(shr, s_xsi_ui_si, s, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x37)), |
OP3(ORXREG1, ORREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(src1, reg, 1), ENC(dst, reg, 2))) |
INSNE(shr, s_sl_ui_sl, s, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(op, 0x35), FIX(x, 0)), |
OP3(ORREGL1, ORREG1, OWREGL1), |
ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, reg, 1), |
ENC(dst, reg, 2))) |
INSNE(shr, s_xsi_u5_si, s, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x36)), |
OP3(ORXREG1, OACST, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(src1, ucst, 1), ENC(dst, reg, 2))) |
INSNE(shr, s_sl_u5_sl, s, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(op, 0x34), FIX(x, 0)), |
OP3(ORREGL1, OACST, OWREGL1), |
ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, ucst, 1), |
ENC(dst, reg, 2))) |
/* 16bit insn */ |
INSN(shr, s, s3i, 1cycle, C64XP, 0, |
FIX1(FIX(op, 0x1)), |
OP3(ORXREG1, OACST, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(cst, cst_s3i, 1), ENC(dst, reg, 2))) |
INSN(shr, s, ssh5_sat_x, 1cycle, C64XP, |
TIC6X_FLAG_NO_CROSS, |
FIX1(FIX(op, 0x1)), |
OP3(ORREG1, OACST, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(srcdst, reg, 0), |
ENC(cst, ucst, 1), ENC(srcdst, reg, 2))) |
INSN(shr, s, s2sh, 1cycle, C64XP, 0, |
FIX1(FIX(op, 0x1)), |
OP3(ORREG1, ORREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(srcdst, reg, 0), ENC(src1, reg, 1), |
ENC(srcdst, reg, 2))) |
/**/ |
INSNE(shr2, s_xs2_ui_s2, s, ext_1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x7)), |
OP3(ORXREG1, ORREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(src1, reg, 1), ENC(dst, reg, 2))) |
INSNE(shr2, s_xs2_u5_s2, s, 1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x18)), |
OP3(ORXREG1, OACST, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(src1, ucst, 1), ENC(dst, reg, 2))) |
INSN(shrmb, l, 1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x62)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(shrmb, s, ext_1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0xa)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(shru, s_xui_ui_ui, s, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x27)), |
OP3(ORXREG1, ORREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(src1, reg, 1), ENC(dst, reg, 2))) |
INSNE(shru, s_ul_ui_ul, s, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(op, 0x25), FIX(x, 0)), |
OP3(ORREGL1, ORREG1, OWREGL1), |
ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, reg, 1), |
ENC(dst, reg, 2))) |
INSNE(shru, s_xui_u5_ui, s, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x26)), |
OP3(ORXREG1, OACST, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(src1, ucst, 1), ENC(dst, reg, 2))) |
INSNE(shru, s_ul_u5_ul, s, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(op, 0x24), FIX(x, 0)), |
OP3(ORREGL1, OACST, OWREGL1), |
ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, ucst, 1), |
ENC(dst, reg, 2))) |
/* 16 bits insn */ |
INSN(shru, s, ssh5_sat_0, 1cycle, C64XP, |
TIC6X_FLAG_NO_CROSS, |
FIX1(FIX(op, 0x2)), |
OP3(ORREG1, OACST, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(srcdst, reg, 0), |
ENC(cst, ucst, 1), ENC(srcdst, reg, 2))) |
INSN(shru, s, s2sh, 1cycle, C64XP, 0, |
FIX1(FIX(op, 0x2)), |
OP3(ORREG1, ORREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(srcdst, reg, 0), ENC(src1, reg, 1), |
ENC(srcdst, reg, 2))) |
/**/ |
INSNE(shru2, s_xu2_ui_u2, s, ext_1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x8)), |
OP3(ORXREG1, ORREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(src1, reg, 1), ENC(dst, reg, 2))) |
INSNE(shru2, s_xu2_u5_u2, s, 1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x19)), |
OP3(ORXREG1, OACST, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(src1, ucst, 1), ENC(dst, reg, 2))) |
INSN(sl, d, 1_or_2_src, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_SIDE_T2_ONLY|TIC6X_FLAG_NO_CROSS, |
FIX3(FIX(s, 1), FIX(op, 0xd), FIX(src1, 0)), |
OP2(ORDREG1, OWMEMDW), |
ENC2(ENC(dst, reg, 0), ENC(src2, reg, 1))) |
INSN(smpy, m, mpy, 1616_m, C62X, 0, |
FIX1(FIX(op, 0x1a)), |
OP3(ORREG1, ORXREG1, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
/* 16 bits insn */ |
INSN(smpy, m, m3_sat_1, 1616_m, C67X, 0, |
FIX1(FIX(op, 0x0)), |
OP3(ORREG1, ORXREG1, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg_shift, 2))) |
/**/ |
INSN(smpyh, m, mpy, 1616_m, C62X, 0, |
FIX1(FIX(op, 0x02)), |
OP3(ORREG1, ORXREG1, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
/* 16 bits insn */ |
INSN(smpyh, m, m3_sat_1, 1616_m, C67X, 0, |
FIX1(FIX(op, 0x1)), |
OP3(ORREG1, ORXREG1, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg_shift, 2))) |
/**/ |
INSN(smpyhl, m, mpy, 1616_m, C62X, 0, |
FIX1(FIX(op, 0x0a)), |
OP3(ORREG1, ORXREG1, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
/* 16 bits insn */ |
INSN(smpyhl, m, m3_sat_1, 1616_m, C67X, 0, |
FIX1(FIX(op, 0x3)), |
OP3(ORREG1, ORXREG1, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg_shift, 2))) |
/**/ |
INSN(smpylh, m, mpy, 1616_m, C62X, 0, |
FIX1(FIX(op, 0x12)), |
OP3(ORREG1, ORXREG1, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
/* 16 bits insn */ |
INSN(smpylh, m, m3_sat_1, 1616_m, C67X, 0, |
FIX1(FIX(op, 0x2)), |
OP3(ORREG1, ORXREG1, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg_shift, 2))) |
/**/ |
INSN(smpy2, m, compound, 4cycle, C64X, 0, |
FIX1(FIX(op, 0x01)), |
OP3(ORREG1, ORXREG1, OWREGD4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
/* Contrary to SPRUFE8, this is the correct operand order for this |
instruction. */ |
INSN(smpy32, m, 1_or_2_src, 4cycle, C64XP, 0, |
FIX1(FIX(op, 0x19)), |
OP3(ORREG1, ORXREG1, OWREG4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(spack2, s, ext_1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x2)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(spacku4, s, ext_1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x4)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(spdp, s, 1_or_2_src, 2cycle_dp, C67X, 0, |
FIX2(FIX(op, 0x02), FIX(src1, 0)), |
OP2(ORXREG1, OWREGD12), |
ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(dst, reg, 1))) |
INSN(spint, l, 1_or_2_src, 4cycle, C67X, 0, |
FIX2(FIX(op, 0x0a), FIX(src1, 0)), |
OP2(ORXREG1, OWREG4), |
ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(dst, reg, 1))) |
INSNE(spkernel, nfu_2, nfu, spkernel, 1cycle, C64XP, |
TIC6X_FLAG_FIRST|TIC6X_FLAG_NO_MCNOP|TIC6X_FLAG_SPKERNEL, |
FIX1(FIX(s, 0)), |
OP2(OACST, OACST), |
ENC2(ENC(fstgfcyc, fstg, 0), ENC(fstgfcyc, fcyc, 1))) |
INSNE(spkernel, nfu_0, nfu, spkernel, 1cycle, C64XP, |
TIC6X_FLAG_FIRST|TIC6X_FLAG_NO_MCNOP|TIC6X_FLAG_SPKERNEL|TIC6X_FLAG_MACRO, |
FIX2(FIX(s, 0), FIX(fstgfcyc, 0)), |
OP0(), |
ENC0()) |
/* 16 bits insn */ |
INSN(spkernel, nfu, uspk, 1cycle, C64XP, |
TIC6X_FLAG_FIRST|TIC6X_FLAG_NO_MCNOP|TIC6X_FLAG_SPKERNEL, |
FIX0(), |
OP2(OACST, OACST), |
ENC2(ENC(fstgfcyc, fstg, 0), ENC(fstgfcyc, fcyc, 1))) |
/**/ |
INSN(spkernelr, nfu, spkernelr, 1cycle, C64XP, |
TIC6X_FLAG_FIRST|TIC6X_FLAG_NO_MCNOP|TIC6X_FLAG_SPKERNEL, |
FIX1(FIX(s, 0)), |
OP0(), |
ENC0()) |
INSN(sploop, nfu, loop_buffer, 1cycle, C64XP, |
TIC6X_FLAG_FIRST|TIC6X_FLAG_NO_MCNOP|TIC6X_FLAG_SPLOOP, |
FIX4(FIX(s, 0), FIX(op, 0xc), FIX(csta, 0), RAN(cstb, 0, 13)), |
OP1(OACST), |
ENC1(ENC(cstb, ucst_minus_one, 0))) |
INSN(sploopd, nfu, loop_buffer, 1cycle, C64XP, |
TIC6X_FLAG_FIRST|TIC6X_FLAG_NO_MCNOP|TIC6X_FLAG_SPLOOP, |
FIX4(FIX(s, 0), FIX(op, 0xd), FIX(csta, 0), RAN(cstb, 0, 13)), |
OP1(OACST), |
ENC1(ENC(cstb, ucst_minus_one, 0))) |
INSN(sploopw, nfu, loop_buffer, 1cycle, C64XP, |
TIC6X_FLAG_FIRST|TIC6X_FLAG_NO_MCNOP|TIC6X_FLAG_SPLOOP, |
FIX4(FIX(s, 0), FIX(op, 0xf), FIX(csta, 0), RAN(cstb, 0, 13)), |
OP1(OACST), |
ENC1(ENC(cstb, ucst_minus_one, 0))) |
/* 16 bits insn */ |
INSN(sploop, nfu, uspl, 1cycle, C64XP, |
TIC6X_FLAG_FIRST|TIC6X_FLAG_NO_MCNOP|TIC6X_FLAG_SPLOOP, |
FIX1(FIX(op, 0)), |
OP1(OACST), |
ENC1(ENC(ii, ucst_minus_one, 0))) |
INSN(sploopd, nfu, uspl, 1cycle, C64XP, |
TIC6X_FLAG_FIRST|TIC6X_FLAG_NO_MCNOP|TIC6X_FLAG_SPLOOP, |
FIX1(FIX(op, 1)), |
OP1(OACST), |
ENC1(ENC(ii, ucst_minus_one, 0))) |
INSN(sploopd, nfu, uspldr, 1cycle, C64XP, |
TIC6X_FLAG_FIRST|TIC6X_FLAG_NO_MCNOP|TIC6X_FLAG_SPLOOP|TIC6X_FLAG_INSN16_SPRED, |
FIX0(), |
OP1(OACST), |
ENC1(ENC(ii, ucst_minus_one, 0))) |
/**/ |
/* Contrary to SPRUFE8, this is the correct encoding for this |
instruction. */ |
INSN(spmask, nfu, spmask, 1cycle, C64XP, TIC6X_FLAG_FIRST|TIC6X_FLAG_SPMASK, |
FIX2(FIX(s, 0), FIX(op, 0x8)), |
OP1(OFULIST), |
ENC1(ENC(mask, spmask, 0))) |
/* 16 bits insn */ |
INSN(spmask, nfu, uspma, 1cycle, C64XP, TIC6X_FLAG_FIRST|TIC6X_FLAG_SPMASK, |
FIX0(), |
OP1(OFULIST), |
ENC1(ENC(mask, spmask, 0))) |
/**/ |
INSN(spmaskr, nfu, spmask, 1cycle, C64XP, TIC6X_FLAG_FIRST|TIC6X_FLAG_SPMASK, |
FIX2(FIX(s, 0), FIX(op, 0x9)), |
OP1(OFULIST), |
ENC1(ENC(mask, spmask, 0))) |
/* 16 bits insn */ |
INSN(spmaskr, nfu, uspmb, 1cycle, C64XP, TIC6X_FLAG_FIRST|TIC6X_FLAG_SPMASK, |
FIX0(), |
OP1(OFULIST), |
ENC1(ENC(mask, spmask, 0))) |
/**/ |
INSN(sptrunc, l, 1_or_2_src, 4cycle, C67X, 0, |
FIX2(FIX(op, 0x0b), FIX(src1, 0)), |
OP2(ORXREG1, OWREG4), |
ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(dst, reg, 1))) |
INSNE(sshl, s_xsi_ui_si, s, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x23)), |
OP3(ORXREG1, ORREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(src1, reg, 1), ENC(dst, reg, 2))) |
INSNE(sshl, s_xsi_u5_si, s, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x22)), |
OP3(ORXREG1, OACST, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(src1, ucst, 1), ENC(dst, reg, 2))) |
/* 16 bits insn */ |
INSN(sshl, s, ssh5_sat_1, 1cycle, C64XP, |
TIC6X_FLAG_NO_CROSS, |
FIX1(FIX(op, 0x2)), |
OP3(ORREG1, OACST, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(srcdst, reg, 0), |
ENC(cst, ucst, 1), ENC(srcdst, reg, 2))) |
INSN(sshl, s, s2sh, 1cycle, C64XP, 0, |
FIX1(FIX(op, 0x3)), |
OP3(ORREG1, ORREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(srcdst, reg, 0), ENC(src1, reg, 1), |
ENC(srcdst, reg, 2))) |
/**/ |
INSN(sshvl, m, compound, 1616_m, C64X, 0, |
FIX1(FIX(op, 0x1c)), |
OP3(ORXREG1, ORREG1, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(src1, reg, 1), ENC(dst, reg, 2))) |
/* Contrary to SPRUFE8, this is the correct encoding for this |
instruction. */ |
INSN(sshvr, m, compound, 1616_m, C64X, 0, |
FIX1(FIX(op, 0x1a)), |
OP3(ORXREG1, ORREG1, OWREG2), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(src1, reg, 1), ENC(dst, reg, 2))) |
INSNE(ssub, l_si_xsi_si, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_PREFER(1), |
FIX1(FIX(op, 0x0f)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(ssub, l_xsi_si_si, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_PREFER(0), |
FIX1(FIX(op, 0x1f)), |
OP3(ORXREG1, ORREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(ssub, l_s5_xsi_si, l, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x0e)), |
OP3(OACST, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(ssub, l_s5_sl_sl, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, |
FIX1(FIX(op, 0x2c)), |
OP3(OACST, ORREGL1, OWREGL1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
/* 16 bits insn */ |
INSN(ssub, l, l3_sat_1, 1cycle, C64XP, 0, |
FIX1(FIX(op, 1)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
/**/ |
INSN(ssub2, l, 1_or_2_src, 1cycle, C64XP, 0, |
FIX1(FIX(op, 0x64)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(stb, d, load_store, store, C62X, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_PREFER(1), |
FIX2(FIX(op, 3), FIX(r, 0)), |
OP2(ORDREG1, OWMEMSB), |
ENC6(ENC(s, data_fu, 0), ENC(y, fu, 0), ENC(mode, mem_mode, 1), |
ENC(offsetR, mem_offset, 1), ENC(baseR, reg, 1), |
ENC(srcdst, reg, 0))) |
INSN(stb, d, load_store_long, store, C62X, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_PREFER(0), |
FIX1(FIX(op, 3)), |
OP2(ORDREG1, OWMEMLB), |
ENC4(ENC(s, data_fu, 0), ENC(y, areg, 1), ENC(offsetR, ulcst_dpr_byte, 1), |
ENC(dst, reg, 0))) |
/* 16 bits insn */ |
INSN(stb, d, doff4_dsz_000, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE), |
FIX2(FIX(op, 0), FIX(sz, 1)), |
OP2(ORTREG1, OWMEMSB), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), |
ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset, 1))) |
INSN(stb, d, doff4_dsz_x01, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE), |
FIX2(FIX(op, 0), FIX(sz, 1)), |
OP2(ORTREG1, OWMEMSB), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), |
ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset, 1))) |
INSN(stb, d, dind_dsz_000, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(REG_POSITIVE), |
FIX2(FIX(op, 0), FIX(sz, 1)), |
OP2(ORTREG1, OWMEMSB), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(src1, mem_offset, 1), |
ENC(ptr, reg_ptr, 1), ENC(srcdst, reg, 0))) |
INSN(stb, d, dind_dsz_x01, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(REG_POSITIVE), |
FIX2(FIX(op, 0), FIX(sz, 1)), |
OP2(ORTREG1, OWMEMSB), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(src1, mem_offset, 1), |
ENC(ptr, reg_ptr, 1), ENC(srcdst, reg, 0))) |
INSN(stb, d, dinc_dsz_000, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTINCR), |
FIX2(FIX(op, 0), FIX(sz, 1)), |
OP2(ORTREG1, OWMEMSB), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), |
ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset_minus_one, 1))) |
INSN(stb, d, dinc_dsz_x01, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTINCR), |
FIX2(FIX(op, 0), FIX(sz, 1)), |
OP2(ORTREG1, OWMEMSB), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), |
ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset_minus_one, 1))) |
INSN(stb, d, ddec_dsz_000, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREDECR), |
FIX2(FIX(op, 0), FIX(sz, 1)), |
OP2(ORTREG1, OWMEMSB), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), |
ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset_minus_one, 1))) |
INSN(stb, d, ddec_dsz_x01, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREDECR), |
FIX2(FIX(op, 0), FIX(sz, 1)), |
OP2(ORTREG1, OWMEMSB), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), |
ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset_minus_one, 1))) |
/**/ |
INSN(stdw, d, load_store, store, C64X, TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(op, 4), FIX(r, 1)), |
OP2(ORDREGD1, OWMEMSD), |
ENC6(ENC(s, data_fu, 0), ENC(y, fu, 0), ENC(mode, mem_mode, 1), |
ENC(offsetR, mem_offset, 1), ENC(baseR, reg, 1), |
ENC(srcdst, reg, 0))) |
/* 16 bits insn */ |
INSN(stdw, d, dpp, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTDECR)|TIC6X_FLAG_INSN16_B15PTR|TIC6X_FLAG_INSN16_NORS, |
FIX3(FIX(op, 0), FIX(dw, 1), FIX(s, 1)), |
OP2(ORTREGD1, OWMEMSD), |
ENC4(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), |
ENC(cst, mem_offset_minus_one, 1))) |
INSN(stdw, d, ddecdw, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREDECR), |
FIX3(FIX(op, 0), FIX(na, 0), FIX(sz, 0)), |
OP2(ORTREGD1, OWMEMSD), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg_shift, 0), |
ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset_minus_one, 1))) |
INSN(stdw, d, dincdw, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTINCR), |
FIX3(FIX(op, 0), FIX(na, 0), FIX(sz, 0)), |
OP2(ORTREGD1, OWMEMSD), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg_shift, 0), |
ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset_minus_one, 1))) |
INSN(stdw, d, dinddw, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(REG_POSITIVE), |
FIX3(FIX(op, 0), FIX(na, 0), FIX(sz, 0)), |
OP2(ORTREGD1, OWMEMSD), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(src1, mem_offset, 1), |
ENC(ptr, reg_ptr, 1), ENC(srcdst, reg_shift, 0))) |
INSN(stdw, d, doff4dw, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE), |
FIX3(FIX(op, 0), FIX(na, 0), FIX(sz, 0)), |
OP2(ORTREGD1, OWMEMSD), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(cst, mem_offset, 1), |
ENC(ptr, reg_ptr, 1), ENC(srcdst, reg_shift, 0))) |
/**/ |
INSN(sth, d, load_store, store, C62X, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_PREFER(1), |
FIX2(FIX(op, 5), FIX(r, 0)), |
OP2(ORDREG1, OWMEMSH), |
ENC6(ENC(s, data_fu, 0), ENC(y, fu, 0), ENC(mode, mem_mode, 1), |
ENC(offsetR, mem_offset, 1), ENC(baseR, reg, 1), |
ENC(srcdst, reg, 0))) |
INSN(sth, d, load_store_long, store, C62X, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_PREFER(0), |
FIX1(FIX(op, 5)), |
OP2(ORDREG1, OWMEMLH), |
ENC4(ENC(s, data_fu, 0), ENC(y, areg, 1), ENC(offsetR, ulcst_dpr_half, 1), |
ENC(dst, reg, 0))) |
/* 16 bits insn */ |
INSN(sth, d, doff4_dsz_01x, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE), |
FIX2(FIX(op, 0), FIX(sz, 1)), |
OP2(ORTREG1, OWMEMSH), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), |
ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset, 1))) |
INSN(sth, d, doff4_dsz_111, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE), |
FIX2(FIX(op, 0), FIX(sz, 1)), |
OP2(ORTREG1, OWMEMSH), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), |
ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset, 1))) |
INSN(sth, d, dind_dsz_01x, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(REG_POSITIVE), |
FIX2(FIX(op, 0), FIX(sz, 1)), |
OP2(ORTREG1, OWMEMSH), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), |
ENC(ptr, reg_ptr, 1), ENC(src1, mem_offset, 1))) |
INSN(sth, d, dind_dsz_111, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(REG_POSITIVE), |
FIX2(FIX(op, 0), FIX(sz, 1)), |
OP2(ORTREG1, OWMEMSH), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), |
ENC(ptr, reg_ptr, 1), ENC(src1, mem_offset, 1))) |
INSN(sth, d, dinc_dsz_01x, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTINCR), |
FIX2(FIX(op, 0), FIX(sz, 1)), |
OP2(ORTREG1, OWMEMSH), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), |
ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset_minus_one, 1))) |
INSN(sth, d, dinc_dsz_111, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTINCR), |
FIX2(FIX(op, 0), FIX(sz, 1)), |
OP2(ORTREG1, OWMEMSH), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), |
ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset_minus_one, 1))) |
INSN(sth, d, ddec_dsz_01x, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREDECR), |
FIX2(FIX(op, 0), FIX(sz, 1)), |
OP2(ORTREG1, OWMEMSH), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), |
ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset_minus_one, 1))) |
INSN(sth, d, ddec_dsz_111, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREDECR), |
FIX2(FIX(op, 0), FIX(sz, 1)), |
OP2(ORTREG1, OWMEMSH), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), |
ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset_minus_one, 1))) |
/**/ |
INSN(stndw, d, store_nonaligned, store, C64X, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_UNALIGNED, |
FIX0(), |
OP2(ORDREGD1, OWMEMND), |
ENC7(ENC(s, data_fu, 0), ENC(y, fu, 0), ENC(mode, mem_mode, 1), |
ENC(offsetR, mem_offset_noscale, 1), ENC(baseR, reg, 1), |
ENC(sc, scaled, 1), ENC(src, reg_shift, 0))) |
/* 16 bits insn */ |
INSN(stndw, d, ddecdw, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_UNALIGNED|TIC6X_FLAG_INSN16_MEM_MODE(PREDECR), |
FIX3(FIX(op, 0), FIX(na, 1), FIX(sz, 0)), |
OP2(ORTREGD1, OWMEMND), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg_shift, 0), |
ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset_minus_one_noscale, 1))) |
INSN(stndw, d, dincdw, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_UNALIGNED|TIC6X_FLAG_INSN16_MEM_MODE(POSTINCR), |
FIX3(FIX(op, 0), FIX(na, 1), FIX(sz, 0)), |
OP2(ORTREGD1, OWMEMND), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg_shift, 0), |
ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset_minus_one_noscale, 1))) |
INSN(stndw, d, dinddw, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_UNALIGNED|TIC6X_FLAG_INSN16_MEM_MODE(REG_POSITIVE), |
FIX3(FIX(op, 0), FIX(na, 1), FIX(sz, 0)), |
OP2(ORTREGD1, OWMEMND), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(src1, mem_offset_noscale, 1), |
ENC(ptr, reg_ptr, 1), ENC(srcdst, reg_shift, 0))) |
INSN(stndw, d, doff4dw, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_UNALIGNED|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE), |
FIX3(FIX(op, 0), FIX(na, 1), FIX(sz, 0)), |
OP2(ORTREGD1, OWMEMND), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(cst, mem_offset_noscale, 1), |
ENC(ptr, reg_ptr, 1), ENC(srcdst, reg_shift, 0))) |
/**/ |
INSN(stnw, d, load_store, store, C64X, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_UNALIGNED, |
FIX2(FIX(op, 5), FIX(r, 1)), |
OP2(ORDREG1, OWMEMSW), |
ENC6(ENC(s, data_fu, 0), ENC(y, fu, 0), ENC(mode, mem_mode, 1), |
ENC(offsetR, mem_offset, 1), ENC(baseR, reg, 1), |
ENC(srcdst, reg, 0))) |
/* 16 bits insn */ |
INSN(stnw, d, doff4_dsz_110, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE), |
FIX2(FIX(op, 0), FIX(sz, 1)), |
OP2(ORTREG1, OWMEMSW), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), |
ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset, 1))) |
INSN(stnw, d, dind_dsz_110, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(REG_POSITIVE), |
FIX2(FIX(op, 0), FIX(sz, 1)), |
OP2(ORTREG1, OWMEMSW), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), |
ENC(ptr, reg_ptr, 1), ENC(src1, mem_offset, 1))) |
INSN(stnw, d, dinc_dsz_110, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTINCR), |
FIX2(FIX(op, 0), FIX(sz, 1)), |
OP2(ORTREG1, OWMEMSW), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), |
ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset_minus_one, 1))) |
INSN(stnw, d, ddec_dsz_110, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREDECR), |
FIX2(FIX(op, 0), FIX(sz, 1)), |
OP2(ORTREG1, OWMEMSW), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), |
ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset_minus_one, 1))) |
/**/ |
INSN(stw, d, load_store, store, C62X, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_PREFER(1), |
FIX2(FIX(op, 7), FIX(r, 0)), |
OP2(ORDREG1, OWMEMSW), |
ENC6(ENC(s, data_fu, 0), ENC(y, fu, 0), ENC(mode, mem_mode, 1), |
ENC(offsetR, mem_offset, 1), ENC(baseR, reg, 1), |
ENC(srcdst, reg, 0))) |
INSN(stw, d, load_store_long, store, C62X, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_PREFER(0), |
FIX1(FIX(op, 7)), |
OP2(ORDREG1, OWMEMLW), |
ENC4(ENC(s, data_fu, 0), ENC(y, areg, 1), ENC(offsetR, ulcst_dpr_word, 1), |
ENC(dst, reg, 0))) |
/* 16 bits insn */ |
INSN(stw, d, doff4_dsz_0xx, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE), |
FIX2(FIX(op, 0), FIX(sz, 0)), |
OP2(ORTREG1, OWMEMSW), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), |
ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset, 1))) |
INSN(stw, d, doff4_dsz_100, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE), |
FIX2(FIX(op, 0), FIX(sz, 1)), |
OP2(ORTREG1, OWMEMSW), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), |
ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset, 1))) |
INSN(stw, d, dind_dsz_0xx, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(REG_POSITIVE), |
FIX2(FIX(op, 0), FIX(sz, 0)), |
OP2(ORTREG1, OWMEMSW), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), |
ENC(ptr, reg_ptr, 1), ENC(src1, mem_offset, 1))) |
INSN(stw, d, dind_dsz_100, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(REG_POSITIVE), |
FIX2(FIX(op, 0), FIX(sz, 1)), |
OP2(ORTREG1, OWMEMSW), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), |
ENC(ptr, reg_ptr, 1), ENC(src1, mem_offset, 1))) |
INSN(stw, d, dinc_dsz_0xx, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTINCR), |
FIX2(FIX(op, 0), FIX(sz, 0)), |
OP2(ORTREG1, OWMEMSW), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), |
ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset_minus_one, 1))) |
INSN(stw, d, dinc_dsz_100, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTINCR), |
FIX2(FIX(op, 0), FIX(sz, 1)), |
OP2(ORTREG1, OWMEMSW), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), |
ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset_minus_one, 1))) |
INSN(stw, d, ddec_dsz_0xx, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREDECR), |
FIX2(FIX(op, 0), FIX(sz, 0)), |
OP2(ORTREG1, OWMEMSW), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), |
ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset_minus_one, 1))) |
INSN(stw, d, ddec_dsz_100, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREDECR), |
FIX2(FIX(op, 0), FIX(sz, 1)), |
OP2(ORTREG1, OWMEMSW), |
ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), |
ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset_minus_one, 1))) |
INSN(stw, d, dpp, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTDECR)|TIC6X_FLAG_INSN16_B15PTR|TIC6X_FLAG_INSN16_NORS, |
FIX2(FIX(op, 0), FIX(dw, 0)), |
OP2(ORTREG1, OWMEMSW), |
ENC4(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), |
ENC(cst, mem_offset_minus_one, 1))) |
INSN(stw, d, dstk, store, C64XP, |
TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE)|TIC6X_FLAG_INSN16_B15PTR, |
FIX2(FIX(op, 0x0), FIX(s, 1)), |
OP2(ORTREG1, OWMEMSW), |
ENC4(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), |
ENC(cst, mem_offset, 1))) |
/**/ |
INSNE(sub, l_si_xsi_si, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_PREFER(1), |
FIX1(FIX(op, 0x07)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(sub, l_xsi_si_si, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_PREFER(0), |
FIX1(FIX(op, 0x17)), |
OP3(ORXREG1, ORREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(sub, l_si_xsi_sl, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_PREFER(1), |
FIX1(FIX(op, 0x27)), |
OP3(ORREG1, ORXREG1, OWREGL1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(sub, l_xsi_si_sl, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_PREFER(0), |
FIX1(FIX(op, 0x37)), |
OP3(ORXREG1, ORREG1, OWREGL1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(sub, l_s5_xsi_si, l, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x06)), |
OP3(OACST, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(sub, l_s5_sl_sl, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, |
FIX1(FIX(op, 0x24)), |
OP3(OACST, ORREGL1, OWREGL1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(sub, l_xsi_s5_si, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_MACRO, |
FIX1(FIX(op, 0x2)), |
OP3(ORXREG1, OACST, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst_negate, 1), |
ENC(src2, reg, 0), ENC(dst, reg, 2))) |
INSNE(sub, l_sl_s5_sl, l, 1_or_2_src, 1cycle, C62X, |
TIC6X_FLAG_MACRO|TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(op, 0x20), FIX(x, 0)), |
OP3(ORREGL1, OACST, OWREGL1), |
ENC4(ENC(s, fu, 0), ENC(src1, scst_negate, 1), ENC(src2, reg, 0), |
ENC(dst, reg, 2))) |
INSNE(sub, s_si_xsi_si, s, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_PREFER(1), |
FIX1(FIX(op, 0x17)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(sub, s_s5_xsi_si, s, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x16)), |
OP3(OACST, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
/* Contrary to SPRUFE8, this is the correct encoding for this |
instruction; this instruction can be predicated. */ |
INSNE(sub, s_xsi_si_si, s, ext_1_or_2_src, 1cycle, C64X, TIC6X_FLAG_PREFER(0), |
FIX1(FIX(op, 0x5)), |
OP3(ORXREG1, ORREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(src1, reg, 1), ENC(dst, reg, 2))) |
INSNE(sub, s_xsi_s5_si, s, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_MACRO, |
FIX1(FIX(op, 0x6)), |
OP3(ORXREG1, OACST, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst_negate, 1), |
ENC(src2, reg, 0), ENC(dst, reg, 2))) |
INSNE(sub, d_si_si_si, d, 1_or_2_src, 1cycle, C62X, |
TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_PREFER(1), |
FIX1(FIX(op, 0x11)), |
OP3(ORREG1, ORREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, reg, 1), |
ENC(dst, reg, 2))) |
INSNE(sub, d_si_u5_si, d, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, |
FIX1(FIX(op, 0x13)), |
OP3(ORREG1, OACST, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, ucst, 1), |
ENC(dst, reg, 2))) |
INSNE(sub, d_si_xsi_si, d, ext_1_or_2_src, 1cycle, C64X, TIC6X_FLAG_PREFER(0), |
FIX1(FIX(op, 0xc)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
/* 16 bits insn */ |
INSN(sub, l, l3_sat_0, 1cycle, C64XP, 0, |
FIX1(FIX(op, 0x1)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(sub, l, lx1, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, |
FIX1(FIX(op, 0x2)), |
OP3(OHWCST0, ORREG1, OWREG1), |
ENC3(ENC(s, fu, 0), ENC(srcdst, reg, 1), ENC(srcdst, reg, 2))) |
INSN(sub, s, sx1, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, |
FIX1(FIX(op, 0x2)), |
OP3(OHWCST0, ORREG1, OWREG1), |
ENC3(ENC(s, fu, 0), ENC(srcdst, reg, 1), ENC(srcdst, reg, 2))) |
INSN(sub, s, sx2op, 1cycle, C64XP, 0, |
FIX1(FIX(op, 0x1)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(srcdst, reg, 0), ENC(srcdst, reg, 2), |
ENC(src2, reg, 1), ENC(x, xpath, 1))) |
INSN(sub, s, s3_sat_x, 1cycle, C64XP, 0, |
FIX1(FIX(op, 0x1)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(sub, d, dx1, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, |
FIX1(FIX(op, 0x3)), |
OP3(ORREG1, OHWCST1, OWREG1), |
ENC3(ENC(s, fu, 0), ENC(srcdst, reg, 0), ENC(srcdst, reg, 2))) |
INSN(sub, d, dx2op, 1cycle, C64XP, 0, |
FIX1(FIX(op, 0x1)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(srcdst, reg, 0), |
ENC(src2, reg, 1), ENC(srcdst, reg, 2))) |
/**/ |
INSNE(subab, d_si_si_si, d, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, |
FIX1(FIX(op, 0x31)), |
OP3(ORREG1, ORREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, reg, 1), |
ENC(dst, reg, 2))) |
INSNE(subab, d_si_u5_si, d, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, |
FIX1(FIX(op, 0x33)), |
OP3(ORREG1, OACST, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, ucst, 1), |
ENC(dst, reg, 2))) |
INSN(subabs4, l, 1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x5a)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(subah, d_si_si_si, d, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, |
FIX1(FIX(op, 0x35)), |
OP3(ORREG1, ORREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, reg, 1), |
ENC(dst, reg, 2))) |
INSNE(subah, d_si_u5_si, d, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, |
FIX1(FIX(op, 0x37)), |
OP3(ORREG1, OACST, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, ucst, 1), |
ENC(dst, reg, 2))) |
INSNE(subaw, d_si_si_si, d, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, |
FIX1(FIX(op, 0x39)), |
OP3(ORREG1, ORREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, reg, 1), |
ENC(dst, reg, 2))) |
INSNE(subaw, d_si_u5_si, d, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, |
FIX1(FIX(op, 0x3b)), |
OP3(ORREG1, OACST, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, ucst, 1), |
ENC(dst, reg, 2))) |
/* 16 bits insn */ |
INSN(subaw, d, dx5p, 1cycle, C64XP, 0, |
FIX1(FIX(op, 1)), |
OP3(ORB15REG1, OACST, OWB15REG1), |
ENC2(ENC(s, fu, 0), ENC(cst, ucst, 1))) |
/**/ |
INSN(subc, l, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x4b)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(subdp, l_dp_xdp_dp, l, 1_or_2_src, addsubdp, C67X, TIC6X_FLAG_PREFER(1), |
FIX1(FIX(op, 0x19)), |
OP3(ORREGD12, ORXREGD12, OWREGD67), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(subdp, l_xdp_dp_dp, l, 1_or_2_src, addsubdp, C67X, TIC6X_FLAG_PREFER(0), |
FIX1(FIX(op, 0x1d)), |
OP3(ORXREGD12, ORREGD12, OWREGD67), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(subdp, s_dp_xdp_dp, s, l_1_or_2_src, addsubdp, C67XP, |
TIC6X_FLAG_PREFER(1), |
FIX1(FIX(op, 0x73)), |
OP3(ORREGD12, ORXREGD12, OWREGD67), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(subdp, s_xdp_dp_dp, s, l_1_or_2_src, addsubdp, C67XP, |
TIC6X_FLAG_PREFER(0), |
FIX1(FIX(op, 0x77)), |
OP3(ORXREGD12, ORREGD12, OWREGD67), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(src1, reg, 1), ENC(dst, reg, 2))) |
INSNE(subsp, l_sp_xsp_sp, l, 1_or_2_src, 4cycle, C67X, TIC6X_FLAG_PREFER(1), |
FIX1(FIX(op, 0x11)), |
OP3(ORREG1, ORXREG1, OWREG4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(subsp, l_xsp_sp_sp, l, 1_or_2_src, 4cycle, C67X, TIC6X_FLAG_PREFER(0), |
FIX1(FIX(op, 0x15)), |
OP3(ORXREG1, ORREG1, OWREG4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(subsp, s_sp_xsp_sp, s, l_1_or_2_src, 4cycle, C67XP, |
TIC6X_FLAG_PREFER(1), |
FIX1(FIX(op, 0x71)), |
OP3(ORREG1, ORXREG1, OWREG4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(subsp, s_xsp_sp_sp, s, l_1_or_2_src, 4cycle, C67XP, |
TIC6X_FLAG_PREFER(0), |
FIX1(FIX(op, 0x75)), |
OP3(ORXREG1, ORREG1, OWREG4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(src1, reg, 1), ENC(dst, reg, 2))) |
INSNE(subu, l_ui_xui_ul, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_PREFER(1), |
FIX1(FIX(op, 0x2f)), |
OP3(ORREG1, ORXREG1, OWREGL1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(subu, l_xui_ui_ul, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_PREFER(0), |
FIX1(FIX(op, 0x3f)), |
OP3(ORXREG1, ORREG1, OWREGL1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(sub2, l, 1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x04)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(sub2, s, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x11)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(sub2, d, ext_1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x5)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(sub4, l, 1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x66)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(swap2, l, 1_or_2_src, 1cycle, C64X, TIC6X_FLAG_MACRO|TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(op, 0x1b), FIX(x, 0)), |
OP2(ORREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 0), ENC(dst, reg, 1))) |
INSN(swap2, s, 1_or_2_src, 1cycle, C64X, TIC6X_FLAG_MACRO|TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(op, 0x10), FIX(x, 0)), |
OP2(ORREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 0), ENC(dst, reg, 1))) |
/* Contrary to SPRUFE8, this is the correct encoding for this |
instruction. */ |
INSN(swap4, l, unary, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x1)), |
OP2(ORXREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(dst, reg, 1))) |
INSN(swe, nfu, swe, 1cycle, C64XP, 0, |
FIX1(FIX(s, 0)), |
OP0(), |
ENC0()) |
INSN(swenr, nfu, swenr, 1cycle, C64XP, 0, |
FIX1(FIX(s, 0)), |
OP0(), |
ENC0()) |
INSN(unpkhu4, l, unary, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x03)), |
OP2(ORXREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(dst, reg, 1))) |
INSN(unpkhu4, s, unary, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x03)), |
OP2(ORXREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(dst, reg, 1))) |
INSN(unpklu4, l, unary, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x02)), |
OP2(ORXREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(dst, reg, 1))) |
INSN(unpklu4, s, unary, 1cycle, C64X, 0, |
FIX1(FIX(op, 0x02)), |
OP2(ORXREG1, OWREG1), |
ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(dst, reg, 1))) |
INSNE(xor, l_ui_xui_ui, l, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x6f)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(xor, l_s5_xui_ui, l, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x6e)), |
OP3(OACST, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(xor, s_ui_xui_ui, s, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x0b)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(xor, s_s5_xui_ui, s, 1_or_2_src, 1cycle, C62X, 0, |
FIX1(FIX(op, 0x0a)), |
OP3(OACST, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(xor, d_ui_xui_ui, d, ext_1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0xe)), |
OP3(ORREG1, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNE(xor, d_s5_xui_ui, d, ext_1_or_2_src, 1cycle, C64X, 0, |
FIX1(FIX(op, 0xf)), |
OP3(OACST, ORXREG1, OWREG1), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
/* 16 bits insn */ |
INSN(xor, l, l2c, 1cycle, C64XP, 0, |
FIX1(FIX(op, 0x2)), |
OP3(ORREG1, ORXREG1, OWREG1NORS), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSNU(xor, l, lsdx1, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(op, 0x7), FIX(unit, 0x0)), |
OP3(ORREG1, OHWCST1, OWREG1), |
ENC3(ENC(s, fu, 0), ENC(srcdst, reg, 0), ENC(srcdst, reg, 2))) |
INSNU(xor, s, lsdx1, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(op, 0x7), FIX(unit, 0x1)), |
OP3(ORREG1, OHWCST1, OWREG1), |
ENC3(ENC(s, fu, 0), ENC(srcdst, reg, 0), ENC(srcdst, reg, 2))) |
INSNU(xor, d, lsdx1, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, |
FIX2(FIX(op, 0x7), FIX(unit, 0x2)), |
OP3(ORREG1, OHWCST1, OWREG1), |
ENC3(ENC(s, fu, 0), ENC(srcdst, reg, 0), ENC(srcdst, reg, 2))) |
/**/ |
INSN(xormpy, m, 1_or_2_src, 4cycle, C64XP, 0, |
FIX1(FIX(op, 0x1b)), |
OP3(ORREG1, ORXREG1, OWREG4), |
ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), |
ENC(src2, reg, 1), ENC(dst, reg, 2))) |
INSN(xpnd2, m, unary, 1616_m, C64X, 0, |
FIX1(FIX(op, 0x19)), |
OP2(ORXREG1, OWREG2), |
ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(dst, reg, 1))) |
INSN(xpnd4, m, unary, 1616_m, C64X, 0, |
FIX1(FIX(op, 0x18)), |
OP2(ORXREG1, OWREG2), |
ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), |
ENC(dst, reg, 1))) |
INSN(zero, s, mvk, 1cycle, C62X, TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MACRO, |
FIX2(FIX(h, 0), FIX(cst, 0)), |
OP1(OWREG1), |
ENC2(ENC(s, fu, 0), ENC(dst, reg, 0))) |
INSN(zero, l, unary, 1cycle, C64X, |
TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MACRO|TIC6X_FLAG_PREFER(1), |
FIX3(FIX(x, 0), FIX(op, 0x05), FIX(src2, 0)), |
OP1(OWREG1), |
ENC2(ENC(s, fu, 0), ENC(dst, reg, 0))) |
INSNE(zero, l_sub, l, 1_or_2_src, 1cycle, C62X, |
TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MACRO|TIC6X_FLAG_PREFER(0), |
FIX2(FIX(op, 0x07), FIX(x, 0)), |
OP1(OWREG1), |
ENC4(ENC(s, fu, 0), ENC(src1, reg_unused, 0), ENC(src2, reg_unused, 0), |
ENC(dst, reg, 0))) |
INSNE(zero, l_sub_sl, l, 1_or_2_src, 1cycle, C62X, |
TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MACRO, |
FIX2(FIX(op, 0x27), FIX(x, 0)), |
OP1(OWREGL1), |
ENC4(ENC(s, fu, 0), ENC(src1, reg_unused, 0), ENC(src2, reg_unused, 0), |
ENC(dst, reg, 0))) |
INSNE(zero, d_mvk, d, 1_or_2_src, 1cycle, C64X, |
TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MACRO|TIC6X_FLAG_PREFER(1), |
FIX3(FIX(op, 0x00), FIX(src1, 0), FIX(src2, 0)), |
OP1(OWREG1), |
ENC2(ENC(s, fu, 0), ENC(dst, reg, 0))) |
INSNE(zero, d_sub, d, 1_or_2_src, 1cycle, C62X, |
TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MACRO|TIC6X_FLAG_PREFER(0), |
FIX1(FIX(op, 0x11)), |
OP1(OWREG1), |
ENC4(ENC(s, fu, 0), ENC(src2, reg_unused, 0), ENC(src1, reg_unused, 0), |
ENC(dst, reg, 0))) |
#undef TIC6X_INSN_C64X_AND_C67X |
#undef tic6x_insn_format_nfu_s_branch_nop_cst |
#undef tic6x_insn_format_s_l_1_or_2_src |
#undef RAN |
#undef FIX |
#undef FIX0 |
#undef FIX1 |
#undef FIX2 |
#undef FIX3 |
#undef FIX4 |
#undef OP0 |
#undef OP1 |
#undef OP2 |
#undef OP3 |
#undef OP4 |
#undef OACST |
#undef OLCST |
#undef OHWCSTM1 |
#undef OHWCST0 |
#undef OHWCST1 |
#undef OHWCST5 |
#undef OHWCST16 |
#undef OHWCST24 |
#undef OHWCST31 |
#undef OFULIST |
#undef ORIRP1 |
#undef ORNRP1 |
#undef OWREG1 |
#undef OWRETREG1 |
#undef ORREG1 |
#undef ORDREG1 |
#undef ORWREG1 |
#undef ORAREG1 |
#undef ORXREG1 |
#undef ORREG12 |
#undef ORREG14 |
#undef ORXREG14 |
#undef OWREG2 |
#undef OWREG4 |
#undef OWREG9 |
#undef OWDREG5 |
#undef OWREGL1 |
#undef ORREGL1 |
#undef OWREGD1 |
#undef ORTREG1 |
#undef ORTREGD1 |
#undef OWTREG5 |
#undef OWTREGD5 |
#undef OWREGD12 |
#undef OWREGD4 |
#undef ORREGD1 |
#undef OWREGD45 |
#undef OWREGD67 |
#undef ORDREGD1 |
#undef OWDREGD5 |
#undef ORREGD12 |
#undef ORXREGD12 |
#undef ORXREGD1234 |
#undef ORREGD1324 |
#undef OWREGD910 |
#undef OWILC1 |
#undef ORCREG1 |
#undef OWCREG1 |
#undef OWREG1Z |
#undef ORB15REG1 |
#undef OWB15REG1 |
#undef ORMEMDW |
#undef OWMEMDW |
#undef ORMEMSB |
#undef OWMEMSB |
#undef ORMEMLB |
#undef OWMEMLB |
#undef ORMEMSH |
#undef OWMEMSH |
#undef ORMEMLH |
#undef OWMEMLH |
#undef ORMEMSW |
#undef OWMEMSW |
#undef ORMEMLW |
#undef OWMEMLW |
#undef ORMEMSD |
#undef OWMEMSD |
#undef ORMEMND |
#undef OWMEMND |
#undef ENC |
#undef ENC0 |
#undef ENC1 |
#undef ENC2 |
#undef ENC3 |
#undef ENC4 |
#undef ENC5 |
#undef ENC6 |
#undef ENC7 |
/contrib/toolchain/binutils/include/opcode/tic6x.h |
---|
0,0 → 1,718 |
/* TI C6X opcode information. |
Copyright 2010-2013 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef OPCODE_TIC6X_H |
#define OPCODE_TIC6X_H |
#include "bfd.h" |
#include "symcat.h" |
/* A field in an instruction format. The names are based on those |
used in the architecture manuals. */ |
typedef enum |
{ |
tic6x_field_baseR, |
tic6x_field_cc, |
tic6x_field_creg, |
tic6x_field_cst, |
tic6x_field_csta, |
tic6x_field_cstb, |
tic6x_field_dst, |
tic6x_field_dstms, |
tic6x_field_dw, |
tic6x_field_fstgfcyc, |
tic6x_field_h, |
tic6x_field_ii, |
tic6x_field_mask, |
tic6x_field_mode, |
tic6x_field_n, |
tic6x_field_na, |
tic6x_field_offsetR, |
tic6x_field_op, |
tic6x_field_p, |
tic6x_field_ptr, |
tic6x_field_r, |
tic6x_field_s, |
tic6x_field_sc, |
tic6x_field_src, |
tic6x_field_src1, |
tic6x_field_src2, |
tic6x_field_srcdst, |
tic6x_field_srcms, |
tic6x_field_sn, |
tic6x_field_sz, |
tic6x_field_unit, |
tic6x_field_t, |
tic6x_field_x, |
tic6x_field_y, |
tic6x_field_z |
} tic6x_insn_field_id; |
typedef struct |
{ |
/* The least-significant bit position in the field. */ |
unsigned short low_pos; |
/* The number of bits in the field. */ |
unsigned short width; |
/* The position of the bitfield in the field. */ |
unsigned short pos; |
} tic6x_bitfield; |
/* Maximum number of subfields in composite field. */ |
#define TIC6X_MAX_BITFIELDS 4 |
typedef struct |
{ |
/* The name used to reference the field. */ |
tic6x_insn_field_id field_id; |
unsigned int num_bitfields; |
tic6x_bitfield bitfields[TIC6X_MAX_BITFIELDS]; |
} tic6x_insn_field; |
/* Maximum number of variable fields in an instruction format. */ |
#define TIC6X_MAX_INSN_FIELDS 11 |
/* A particular instruction format. */ |
typedef struct |
{ |
/* How many bits in the instruction. */ |
unsigned int num_bits; |
/* Constant bits in the instruction. */ |
unsigned int cst_bits; |
/* Mask matching those bits. */ |
unsigned int mask; |
/* The number of instruction fields. */ |
unsigned int num_fields; |
/* Descriptions of instruction fields. */ |
tic6x_insn_field fields[TIC6X_MAX_INSN_FIELDS]; |
} tic6x_insn_format; |
/* An index into the table of instruction formats. */ |
typedef enum |
{ |
#define FMT(name, num_bits, cst_bits, mask, fields) \ |
CONCAT2(tic6x_insn_format_, name), |
#include "tic6x-insn-formats.h" |
#undef FMT |
tic6x_insn_format_max |
} tic6x_insn_format_id; |
/* The table itself. */ |
extern const tic6x_insn_format tic6x_insn_format_table[tic6x_insn_format_max]; |
/* If instruction format FMT has a field FIELD, return a pointer to |
the description of that field; otherwise return NULL. */ |
const tic6x_insn_field *tic6x_field_from_fmt (const tic6x_insn_format *fmt, |
tic6x_insn_field_id field); |
/* Description of a field (in an instruction format) whose value is |
fixed, or constrained to be in a particular range, in a particular |
opcode. */ |
typedef struct |
{ |
/* The name of the field. */ |
tic6x_insn_field_id field_id; |
/* The least value of the field in this instruction. */ |
unsigned int min_val; |
/* The greatest value of the field in this instruction. */ |
unsigned int max_val; |
} tic6x_fixed_field; |
/* Pseudo opcode fields position for compact instructions |
If 16 bits instruction detected, the opcode is enriched |
[DSZ/3][BR][SAT][opcode] */ |
#define TIC6X_COMPACT_SAT_POS 16 |
#define TIC6X_COMPACT_BR_POS 17 |
#define TIC6X_COMPACT_DSZ_POS 18 |
/* Bit-masks for defining instructions present on some subset of |
processors; each indicates an instruction present on that processor |
and those that are supersets of it. The options passed to the |
assembler determine a bit-mask ANDed with the bit-mask indicating |
when the instruction was added to determine whether the instruction |
is enabled. */ |
#define TIC6X_INSN_C62X 0x0001 |
#define TIC6X_INSN_C64X 0x0002 |
#define TIC6X_INSN_C64XP 0x0004 |
#define TIC6X_INSN_C67X 0x0008 |
#define TIC6X_INSN_C67XP 0x0010 |
#define TIC6X_INSN_C674X 0x0020 |
/* Flags with further information about an opcode table entry. */ |
/* Only used by the assembler, not the disassembler. */ |
#define TIC6X_FLAG_MACRO 0x0001 |
/* Must be first in its execute packet. */ |
#define TIC6X_FLAG_FIRST 0x0002 |
/* Multi-cycle NOP (not used for the NOP n instruction itself, which |
is only a multicycle NOP if n > 1). */ |
#define TIC6X_FLAG_MCNOP 0x0004 |
/* Cannot be in parallel with a multi-cycle NOP. */ |
#define TIC6X_FLAG_NO_MCNOP 0x0008 |
/* Load instruction. */ |
#define TIC6X_FLAG_LOAD 0x0010 |
/* Store instruction. */ |
#define TIC6X_FLAG_STORE 0x0020 |
/* Unaligned memory operation. */ |
#define TIC6X_FLAG_UNALIGNED 0x0040 |
/* Only on side B. */ |
#define TIC6X_FLAG_SIDE_B_ONLY 0x0080 |
/* Only on data path T2. */ |
#define TIC6X_FLAG_SIDE_T2_ONLY 0x0100 |
/* Does not support cross paths. */ |
#define TIC6X_FLAG_NO_CROSS 0x0200 |
/* Annotate this branch instruction as a call. */ |
#define TIC6X_FLAG_CALL 0x0400 |
/* Annotate this branch instruction as a return. */ |
#define TIC6X_FLAG_RETURN 0x0800 |
/* This instruction starts a software pipelined loop. */ |
#define TIC6X_FLAG_SPLOOP 0x1000 |
/* This instruction ends a software pipelined loop. */ |
#define TIC6X_FLAG_SPKERNEL 0x2000 |
/* This instruction takes a list of functional units as parameters; |
although described as having one parameter, the number may be 0 to |
8. */ |
#define TIC6X_FLAG_SPMASK 0x4000 |
/* When more than one opcode matches the assembly source, prefer the |
one with the highest value for this bit-field. If two opcode table |
entries can match the same syntactic form, they must have different |
values here. */ |
#define TIC6X_PREFER_VAL(n) (((n) & 0x8000) >> 15) |
#define TIC6X_FLAG_PREFER(n) ((n) << 15) |
/* 16 bits opcode is predicated by register a0 (s = 0) or b0 (s = 1) */ |
#define TIC6X_FLAG_INSN16_SPRED 0x00100000 |
/* 16 bits opcode ignores RS bit of fetch packet header */ |
#define TIC6X_FLAG_INSN16_NORS 0x00200000 |
/* 16 bits opcode only on side B */ |
#define TIC6X_FLAG_INSN16_BSIDE 0x00400000 |
/* 16 bits opcode ptr reg is b15 */ |
#define TIC6X_FLAG_INSN16_B15PTR 0x00800000 |
/* 16 bits opcode memory access modes */ |
#define TIC6X_INSN16_MEM_MODE(n) ((n) << 16) |
#define TIC6X_INSN16_MEM_MODE_VAL(n) (((n) & 0x000F0000) >> 16) |
#define TIC6X_MEM_MODE_NEGATIVE 0 |
#define TIC6X_MEM_MODE_POSITIVE 1 |
#define TIC6X_MEM_MODE_REG_NEGATIVE 4 |
#define TIC6X_MEM_MODE_REG_POSITIVE 5 |
#define TIC6X_MEM_MODE_PREDECR 8 |
#define TIC6X_MEM_MODE_PREINCR 9 |
#define TIC6X_MEM_MODE_POSTDECR 10 |
#define TIC6X_MEM_MODE_POSTINCR 11 |
#define TIC6X_FLAG_INSN16_MEM_MODE(mode) TIC6X_INSN16_MEM_MODE(TIC6X_MEM_MODE_##mode) |
#define TIC6X_NUM_PREFER 2 |
/* Maximum number of fixed fields for a particular opcode. */ |
#define TIC6X_MAX_FIXED_FIELDS 4 |
/* Maximum number of operands in the opcode table for a particular |
opcode. */ |
#define TIC6X_MAX_OPERANDS 4 |
/* Maximum number of operands in the source code for a particular |
opcode (different from the number in the opcode table for SPMASK |
and SPMASKR). */ |
#define TIC6X_MAX_SOURCE_OPERANDS 8 |
/* Maximum number of variable fields for a particular opcode. */ |
#define TIC6X_MAX_VAR_FIELDS 7 |
/* Which functional units an opcode uses. This only describes the |
basic choice of D, L, M, S or no functional unit; other fields are |
used to describe further restrictions (instructions only operating |
on one side), use of cross paths and load/store instructions using |
one side for the address and the other side for the source or |
destination register. */ |
typedef enum |
{ |
tic6x_func_unit_d, |
tic6x_func_unit_l, |
tic6x_func_unit_m, |
tic6x_func_unit_s, |
tic6x_func_unit_nfu |
} tic6x_func_unit_base; |
/* Possible forms of source operand. */ |
typedef enum |
{ |
/* An assembly-time constant. */ |
tic6x_operand_asm_const, |
/* A link-time constant. */ |
tic6x_operand_link_const, |
/* A register, from the same side as the functional unit |
selected. */ |
tic6x_operand_reg, |
/* A register, from the same side as the functional unit |
selected that ignore RS header bit */ |
tic6x_operand_reg_nors, |
/* A register, from the b side */ |
tic6x_operand_reg_bside, |
/* A register, from the b side and from the low register set */ |
tic6x_operand_reg_bside_nors, |
/* A register, that is from the other side if a cross path is |
used. */ |
tic6x_operand_xreg, |
/* A register, that is from the side of the data path |
selected. */ |
tic6x_operand_dreg, |
/* An address register usable with 15-bit offsets (B14 or B15). |
This is from the same side as the functional unit if a cross |
path is not used, and the other side if a cross path is |
used. */ |
tic6x_operand_areg, |
/* The B15 register */ |
tic6x_operand_b15reg, |
/* A register coded as an offset from either A16 or B16 depending |
on the value of the t bit. */ |
tic6x_operand_treg, |
/* A register (A0 or B0), from the same side as the |
functional unit selected. */ |
tic6x_operand_zreg, |
/* A return address register (A3 or B3), from the same side as the |
functional unit selected. */ |
tic6x_operand_retreg, |
/* A register pair, from the same side as the functional unit |
selected. */ |
tic6x_operand_regpair, |
/* A register pair, that is from the other side if a cross path is |
used. */ |
tic6x_operand_xregpair, |
/* A register pair, from the side of the data path selected. */ |
tic6x_operand_dregpair, |
/* A register pair coded as an offset from either A16 or B16 depending |
on the value of the t bit. */ |
tic6x_operand_tregpair, |
/* The literal string "irp" (case-insensitive). */ |
tic6x_operand_irp, |
/* The literal string "nrp" (case-insensitive). */ |
tic6x_operand_nrp, |
/* The literal string "ilc" (case-insensitive). */ |
tic6x_operand_ilc, |
/* A control register. */ |
tic6x_operand_ctrl, |
/* A memory reference (base and offset registers from the side of |
the functional unit selected), using either unsigned 5-bit |
constant or register offset, if any offset; register offsets |
cannot use unscaled () syntax. */ |
tic6x_operand_mem_short, |
/* A memory reference (base and offset registers from the side of |
the functional unit selected), using either unsigned 5-bit |
constant or register offset, if any offset; register offsets |
can use unscaled () syntax (for LDNDW and STNDW). */ |
tic6x_operand_mem_ndw, |
/* A memory reference using 15-bit link-time constant offset |
relative to B14 or B15. */ |
tic6x_operand_mem_long, |
/* A memory reference that only dereferences a register with no |
further adjustments (*REG), that register being from the side |
of the functional unit selected. */ |
tic6x_operand_mem_deref, |
/* A functional unit name or a list thereof (for SPMASK and |
SPMASKR). */ |
tic6x_operand_func_unit, |
/* Hardwired constant '5' in Sbu8 Scs10 and Sbu8c 16 bits |
instruction formats - spru732j.pdf Appendix F.4 */ |
tic6x_operand_hw_const_minus_1, |
tic6x_operand_hw_const_0, |
tic6x_operand_hw_const_1, |
tic6x_operand_hw_const_5, |
tic6x_operand_hw_const_16, |
tic6x_operand_hw_const_24, |
tic6x_operand_hw_const_31 |
} tic6x_operand_form; |
/* Whether something is, or can be, read or written. */ |
typedef enum |
{ |
tic6x_rw_none, |
tic6x_rw_read, |
tic6x_rw_write, |
tic6x_rw_read_write |
} tic6x_rw; |
/* Description of a source operand and how it is used. */ |
typedef struct |
{ |
/* The syntactic form of the operand. */ |
tic6x_operand_form form; |
/* For non-constant operands, the size in bytes (1, 2, 4, 5 or |
8). Ignored for constant operands. */ |
unsigned int size; |
/* Whether the operand is read, written or both. In addition to the |
operations described here, address registers are read on cycle 1 |
regardless of when the memory operand is read or written, and may |
be modified as described by the addressing mode, and control |
registers may be implicitly read by some instructions. There are |
also some special cases not fully described by this |
structure. |
- For mpydp, the low part of src2 is read on cycles 1 and 3 but |
not 2, and the high part on cycles 2 and 4 but not 3. |
- The swap2 pseudo-operation maps to packlh2, reading the first |
operand of swap2 twice. */ |
tic6x_rw rw; |
/* The first and last cycles (1 for E1, etc.) at which the operand, |
or the low part for two-register operands, is read or |
written. */ |
unsigned short low_first; |
unsigned short low_last; |
/* Likewise, for the high part. */ |
unsigned short high_first; |
unsigned short high_last; |
} tic6x_operand_info; |
/* Ways of converting an operand or functional unit specifier to a |
field value. */ |
typedef enum |
{ |
/* Store an unsigned assembly-time constant (which must fit) in |
the field. */ |
tic6x_coding_ucst, |
/* Store a signed constant (which must fit) in the field. This |
may be used both for assembly-time constants and for link-time |
constants. */ |
tic6x_coding_scst, |
/* Subtract one from an unsigned assembly-time constant (which |
must be strictly positive before the subtraction) and store the |
value (which must fit) in the field. */ |
tic6x_coding_ucst_minus_one, |
/* Negate a signed assembly-time constant, and store the result of |
negation (which must fit) in the field. Used only for |
pseudo-operations. */ |
tic6x_coding_scst_negate, |
/* Store an unsigned link-time constant, implicitly DP-relative |
and counting in bytes, in the field. For expression operands, |
assembly-time constants are encoded as-is. For memory |
reference operands, the offset is encoded as-is if [] syntax is |
used and shifted if () is used. */ |
tic6x_coding_ulcst_dpr_byte, |
/* Store an unsigned link-time constant, implicitly DP-relative |
and counting in half-words, in the field. For expression |
operands, assembly-time constants are encoded as-is. For |
memory reference operands, the offset is encoded as-is if [] |
syntax is used and shifted if () is used. */ |
tic6x_coding_ulcst_dpr_half, |
/* Store an unsigned link-time constant, implicitly DP-relative |
and counting in words, in the field. For expression operands, |
assembly-time constants are encoded as-is. For memory |
reference operands, the offset is encoded as-is if [] syntax is |
used and shifted if () is used. */ |
tic6x_coding_ulcst_dpr_word, |
/* Store the low 16 bits of a link-time constant in the field; |
considered unsigned for disassembly. */ |
tic6x_coding_lcst_low16, |
/* Store the high 16 bits of a link-time constant in the field; |
considered unsigned for disassembly. */ |
tic6x_coding_lcst_high16, |
/* Store a signed PC-relative value (address of label minus |
address of fetch packet containing the current instruction, |
counted in words) in the field. */ |
tic6x_coding_pcrel, |
/* Likewise, but counting in half-words if in a header-based fetch |
packet. */ |
tic6x_coding_pcrel_half, |
/* Store an unsigned PC-relative value used in compact insn */ |
tic6x_coding_pcrel_half_unsigned, |
/* Encode the register number (even number for a register pair) in |
the field. When applied to a memory reference, encode the base |
register. */ |
tic6x_coding_reg, |
/* Encode the register-pair's lsb (even register) for instructions |
that use src1 as port for loading lsb of double-precision |
operand value (absdp, dpint, dpsp, dptrunc, rcpdp, rsqrdp). */ |
tic6x_coding_regpair_lsb, |
/* Encode the register-pair's msb (odd register), see above. */ |
tic6x_coding_regpair_msb, |
/* Store 0 for register B14, 1 for register B15. When applied to |
a memory reference, encode the base register. */ |
tic6x_coding_areg, |
/* Compact instruction offset base register */ |
tic6x_coding_reg_ptr, |
/* Store the low part of a control register address. */ |
tic6x_coding_crlo, |
/* Store the high part of a control register address. */ |
tic6x_coding_crhi, |
/* Encode the even register number for a register pair, shifted |
right by one bit. */ |
tic6x_coding_reg_shift, |
/* Store either the offset register or the 5-bit unsigned offset |
for a memory reference. If an offset uses the unscaled () |
form, which is only permitted with constants, it is scaled |
according to the access size of the operand before being |
stored. */ |
tic6x_coding_mem_offset, |
/* Store either the offset register or the 5-bit unsigned offset |
for a memory reference, but with no scaling applied to the |
offset (for nonaligned doubleword operations). */ |
tic6x_coding_mem_offset_noscale, |
/* Store the addressing mode for a memory reference. */ |
tic6x_coding_mem_mode, |
/* Store whether a memory reference is scaled. */ |
tic6x_coding_scaled, |
/* Store the stage in an SPKERNEL instruction in the upper part of |
the field. */ |
tic6x_coding_fstg, |
/* Store the cycle in an SPKERNEL instruction in the lower part of |
the field. */ |
tic6x_coding_fcyc, |
/* Store the mask bits for functional units in the field in an |
SPMASK or SPMASKR instruction. */ |
tic6x_coding_spmask, |
/* Store the number of a register that is unused, or minimally |
used, in this execute packet. The number must be the same for |
all uses of this coding in a single instruction, but may be |
different for different instructions in the execute packet. |
This is for the "zero" pseudo-operation. This is not safe when |
reads may occur from instructions in previous execute packets; |
in such cases the programmer or compiler should use explicit |
"sub" instructions for those cases of "zero" that cannot be |
implemented as "mvk" for the processor specified. */ |
tic6x_coding_reg_unused, |
/* Store 1 if the functional unit used is on side B, 0 for side |
A. */ |
tic6x_coding_fu, |
/* Store 1 if the data path used (source register for store, |
destination for load) is on side B, 0 for side A. */ |
tic6x_coding_data_fu, |
/* Store 1 if the cross path is being used, 0 otherwise. */ |
tic6x_coding_xpath, |
/* L3i constant coding */ |
tic6x_coding_scst_l3i, |
/* S3i constant coding */ |
tic6x_coding_cst_s3i, |
/* mem offset minus 1 */ |
tic6x_coding_mem_offset_minus_one, |
/* non aligned mem offset minus 1 */ |
tic6x_coding_mem_offset_minus_one_noscale, |
tic6x_coding_rside |
} tic6x_coding_method; |
/* How to generate the value of a particular field. */ |
typedef struct |
{ |
/* The name of the field. */ |
tic6x_insn_field_id field_id; |
/* How it is encoded. */ |
tic6x_coding_method coding_method; |
/* Source operand number, if any. */ |
unsigned int operand_num; |
} tic6x_coding_field; |
/* Types of instruction for pipeline purposes. The type determines |
functional unit and cross path latency (when the same functional |
unit can be used by other instructions, when the same cross path |
can be used by other instructions). */ |
typedef enum |
{ |
tic6x_pipeline_nop, |
tic6x_pipeline_1cycle, |
tic6x_pipeline_1616_m, |
tic6x_pipeline_store, |
tic6x_pipeline_mul_ext, |
tic6x_pipeline_load, |
tic6x_pipeline_branch, |
tic6x_pipeline_2cycle_dp, |
tic6x_pipeline_4cycle, |
tic6x_pipeline_intdp, |
tic6x_pipeline_dpcmp, |
tic6x_pipeline_addsubdp, |
tic6x_pipeline_mpyi, |
tic6x_pipeline_mpyid, |
tic6x_pipeline_mpydp, |
tic6x_pipeline_mpyspdp, |
tic6x_pipeline_mpysp2dp |
} tic6x_pipeline_type; |
/* Description of a control register. */ |
typedef struct |
{ |
/* The name of the register. */ |
const char *name; |
/* Which ISA variants include this control register. */ |
unsigned short isa_variants; |
/* Whether it can be read, written or both (in supervisor mode). |
Some registers use the same address, but different names, for |
reading and writing. */ |
tic6x_rw rw; |
/* crlo value for this register. */ |
unsigned int crlo; |
/* Mask that, ANDed with the crhi value in the instruction, must be |
0. 0 is always generated when generating code. */ |
unsigned int crhi_mask; |
} tic6x_ctrl; |
/* An index into the table of control registers. */ |
typedef enum |
{ |
#define CTRL(name, isa, rw, crlo, crhi_mask) \ |
CONCAT2(tic6x_ctrl_,name), |
#include "tic6x-control-registers.h" |
#undef CTRL |
tic6x_ctrl_max |
} tic6x_ctrl_id; |
/* The table itself. */ |
extern const tic6x_ctrl tic6x_ctrl_table[tic6x_ctrl_max]; |
/* An entry in the opcode table. */ |
typedef struct |
{ |
/* The name of the instruction. */ |
const char *name; |
/* Functional unit used by this instruction (basic information). */ |
tic6x_func_unit_base func_unit; |
/* The format of this instruction. */ |
tic6x_insn_format_id format; |
/* The pipeline type of this instruction. */ |
tic6x_pipeline_type type; |
/* Which ISA variants include this instruction. */ |
unsigned short isa_variants; |
/* Flags for this instruction. */ |
unsigned int flags; |
/* Number of fixed fields, or fields with restricted value ranges, |
for this instruction. */ |
unsigned int num_fixed_fields; |
/* Values of fields fixed for this instruction. */ |
tic6x_fixed_field fixed_fields[TIC6X_MAX_FIXED_FIELDS]; |
/* The number of operands in the source form of this |
instruction. */ |
unsigned int num_operands; |
/* Information about individual operands. */ |
tic6x_operand_info operand_info[TIC6X_MAX_OPERANDS]; |
/* The number of variable fields for this instruction with encoding |
instructions explicitly given. */ |
unsigned int num_variable_fields; |
/* How fields (other than ones with fixed value) are computed from |
the source operands and functional unit specifiers. In addition |
to fields specified here: |
- creg, if present, is set from the predicate, along with z which |
must be present if creg is present. |
- p, if present (on all non-compact instructions), is set from |
the parallel bars. |
*/ |
tic6x_coding_field variable_fields[TIC6X_MAX_VAR_FIELDS]; |
} tic6x_opcode; |
/* An index into the table of opcodes. */ |
typedef enum |
{ |
#define INSN(name, func_unit, format, type, isa, flags, fixed, ops, var) \ |
CONCAT6(tic6x_opcode_,name,_,func_unit,_,format), |
#define INSNE(name, e, func_unit, format, type, isa, flags, fixed, ops, var) \ |
CONCAT4(tic6x_opcode_,name,_,e), |
#define INSNU(name, func_unit, format, type, isa, flags, fixed, ops, var) \ |
CONCAT6(tic6x_opcode_,name,_,func_unit,_,format), |
#define INSNUE(name, e, func_unit, format, type, isa, flags, fixed, ops, var) \ |
CONCAT6(tic6x_opcode_,name,_,func_unit,_,e), |
#include "tic6x-opcode-table.h" |
#undef INSN |
#undef INSNE |
#undef INSNU |
#undef INSNUE |
tic6x_opcode_max |
} tic6x_opcode_id; |
/* The table itself. */ |
extern const tic6x_opcode tic6x_opcode_table[tic6x_opcode_max]; |
/* A linked list of opcodes. */ |
typedef struct tic6x_opcode_list_tag |
{ |
tic6x_opcode_id id; |
struct tic6x_opcode_list_tag *next; |
} tic6x_opcode_list; |
/* The information from a fetch packet header. */ |
typedef struct |
{ |
/* The header itself. */ |
unsigned int header; |
/* Whether each word uses compact instructions. */ |
bfd_boolean word_compact[7]; |
/* Whether loads are protected. */ |
bfd_boolean prot; |
/* Whether instructions use the high register set. */ |
bfd_boolean rs; |
/* Data size. */ |
unsigned int dsz; |
/* Whether compact instructions in the S unit are decoded as |
branches. */ |
bfd_boolean br; |
/* Whether compact instructions saturate. */ |
bfd_boolean sat; |
/* P-bits. */ |
bfd_boolean p_bits[14]; |
} tic6x_fetch_packet_header; |
#endif /* OPCODE_TIC6X_H */ |
/contrib/toolchain/binutils/include/opcode/tic80.h |
---|
0,0 → 1,283 |
/* tic80.h -- Header file for TI TMS320C80 (MV) opcode table |
Copyright 1996, 1997, 2003, 2010 Free Software Foundation, Inc. |
Written by Fred Fish (fnf@cygnus.com), Cygnus Support |
This file is part of GDB, GAS, and the GNU binutils. |
GDB, GAS, and the GNU binutils are free software; you can redistribute |
them and/or modify them under the terms of the GNU General Public |
License as published by the Free Software Foundation; either version 3, |
or (at your option) any later version. |
GDB, GAS, and the GNU binutils are distributed in the hope that they |
will be useful, but WITHOUT ANY WARRANTY; without even the implied |
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See |
the GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this file; see the file COPYING3. If not, write to the Free |
Software Foundation, 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef TIC80_H |
#define TIC80_H |
/* The opcode table is an array of struct tic80_opcode. */ |
struct tic80_opcode |
{ |
/* The opcode name. */ |
const char *name; |
/* The opcode itself. Those bits which will be filled in with operands |
are zeroes. */ |
unsigned long opcode; |
/* The opcode mask. This is used by the disassembler. This is a mask |
containing ones indicating those bits which must match the opcode |
field, and zeroes indicating those bits which need not match (and are |
presumably filled in by operands). */ |
unsigned long mask; |
/* Special purpose flags for this opcode. */ |
unsigned char flags; |
/* An array of operand codes. Each code is an index into the operand |
table. They appear in the order which the operands must appear in |
assembly code, and are terminated by a zero. FIXME: Adjust size to |
match actual requirements when TIc80 support is complete */ |
unsigned char operands[8]; |
}; |
/* The table itself is sorted by major opcode number, and is otherwise in |
the order in which the disassembler should consider instructions. |
FIXME: This isn't currently true. */ |
extern const struct tic80_opcode tic80_opcodes[]; |
extern const int tic80_num_opcodes; |
/* The operands table is an array of struct tic80_operand. */ |
struct tic80_operand |
{ |
/* The number of bits in the operand. */ |
int bits; |
/* How far the operand is left shifted in the instruction. */ |
int shift; |
/* Insertion function. This is used by the assembler. To insert an |
operand value into an instruction, check this field. |
If it is NULL, execute |
i |= (op & ((1 << o->bits) - 1)) << o->shift; |
(i is the instruction which we are filling in, o is a pointer to |
this structure, and op is the opcode value; this assumes twos |
complement arithmetic). |
If this field is not NULL, then simply call it with the |
instruction and the operand value. It will return the new value |
of the instruction. If the ERRMSG argument is not NULL, then if |
the operand value is illegal, *ERRMSG will be set to a warning |
string (the operand will be inserted in any case). If the |
operand value is legal, *ERRMSG will be unchanged (most operands |
can accept any value). */ |
unsigned long (*insert) |
(unsigned long instruction, long op, const char **errmsg); |
/* Extraction function. This is used by the disassembler. To |
extract this operand type from an instruction, check this field. |
If it is NULL, compute |
op = ((i) >> o->shift) & ((1 << o->bits) - 1); |
if ((o->flags & TIC80_OPERAND_SIGNED) != 0 |
&& (op & (1 << (o->bits - 1))) != 0) |
op -= 1 << o->bits; |
(i is the instruction, o is a pointer to this structure, and op |
is the result; this assumes twos complement arithmetic). |
If this field is not NULL, then simply call it with the |
instruction value. It will return the value of the operand. If |
the INVALID argument is not NULL, *INVALID will be set to |
non-zero if this operand type can not actually be extracted from |
this operand (i.e., the instruction does not match). If the |
operand is valid, *INVALID will not be changed. */ |
long (*extract) (unsigned long instruction, int *invalid); |
/* One bit syntax flags. */ |
unsigned long flags; |
}; |
/* Elements in the table are retrieved by indexing with values from |
the operands field of the tic80_opcodes table. */ |
extern const struct tic80_operand tic80_operands[]; |
/* Values defined for the flags field of a struct tic80_operand. |
Note that flags for all predefined symbols, such as the general purpose |
registers (ex: r10), control registers (ex: FPST), condition codes (ex: |
eq0.b), bit numbers (ex: gt.b), etc are large enough that they can be |
or'd into an int where the lower bits contain the actual numeric value |
that correponds to this predefined symbol. This way a single int can |
contain both the value of the symbol and it's type. |
*/ |
/* This operand must be an even register number. Floating point numbers |
for example are stored in even/odd register pairs. */ |
#define TIC80_OPERAND_EVEN (1 << 0) |
/* This operand must be an odd register number and must be one greater than |
the register number of the previous operand. I.E. the second register in |
an even/odd register pair. */ |
#define TIC80_OPERAND_ODD (1 << 1) |
/* This operand takes signed values. */ |
#define TIC80_OPERAND_SIGNED (1 << 2) |
/* This operand may be either a predefined constant name or a numeric value. |
An example would be a condition code like "eq0.b" which has the numeric |
value 0x2. */ |
#define TIC80_OPERAND_NUM (1 << 3) |
/* This operand should be wrapped in parentheses rather than separated |
from the previous one by a comma. This is used for various |
instructions, like the load and store instructions, which want |
their operands to look like "displacement(reg)" */ |
#define TIC80_OPERAND_PARENS (1 << 4) |
/* This operand is a PC relative branch offset. The disassembler prints |
these symbolically if possible. Note that the offsets are taken as word |
offsets. */ |
#define TIC80_OPERAND_PCREL (1 << 5) |
/* This flag is a hint to the disassembler for using hex as the prefered |
printing format, even for small positive or negative immediate values. |
Normally values in the range -999 to 999 are printed as signed decimal |
values and other values are printed in hex. */ |
#define TIC80_OPERAND_BITFIELD (1 << 6) |
/* This operand may have a ":m" modifier specified by bit 17 in a short |
immediate form instruction. */ |
#define TIC80_OPERAND_M_SI (1 << 7) |
/* This operand may have a ":m" modifier specified by bit 15 in a long |
immediate or register form instruction. */ |
#define TIC80_OPERAND_M_LI (1 << 8) |
/* This operand may have a ":s" modifier specified in bit 11 in a long |
immediate or register form instruction. */ |
#define TIC80_OPERAND_SCALED (1 << 9) |
/* This operand is a floating point value */ |
#define TIC80_OPERAND_FLOAT (1 << 10) |
/* This operand is an byte offset from a base relocation. The lower |
two bits of the final relocated address are ignored when the value is |
written to the program counter. */ |
#define TIC80_OPERAND_BASEREL (1 << 11) |
/* This operand is an "endmask" field for a shift instruction. |
It is treated special in that it can have values of 0-32, |
where 0 and 32 result in the same instruction. The assembler |
must be able to accept both endmask values. This disassembler |
has no way of knowing from the instruction which value was |
given at assembly time, so it just uses '0'. */ |
#define TIC80_OPERAND_ENDMASK (1 << 12) |
/* This operand is one of the 32 general purpose registers. |
The disassembler prints these with a leading 'r'. */ |
#define TIC80_OPERAND_GPR (1 << 27) |
/* This operand is a floating point accumulator register. |
The disassembler prints these with a leading 'a'. */ |
#define TIC80_OPERAND_FPA ( 1 << 28) |
/* This operand is a control register number, either numeric or |
symbolic (like "EIF", "EPC", etc). |
The disassembler prints these symbolically. */ |
#define TIC80_OPERAND_CR (1 << 29) |
/* This operand is a condition code, either numeric or |
symbolic (like "eq0.b", "ne0.w", etc). |
The disassembler prints these symbolically. */ |
#define TIC80_OPERAND_CC (1 << 30) |
/* This operand is a bit number, either numeric or |
symbolic (like "eq.b", "or.f", etc). |
The disassembler prints these symbolically. |
Note that they appear in the instruction in 1's complement relative |
to the values given in the manual. */ |
#define TIC80_OPERAND_BITNUM (1 << 31) |
/* This mask is used to strip operand bits from an int that contains |
both operand bits and a numeric value in the lsbs. */ |
#define TIC80_OPERAND_MASK (TIC80_OPERAND_GPR | TIC80_OPERAND_FPA | TIC80_OPERAND_CR | TIC80_OPERAND_CC | TIC80_OPERAND_BITNUM) |
/* Flag bits for the struct tic80_opcode flags field. */ |
#define TIC80_VECTOR 01 /* Is a vector instruction */ |
#define TIC80_NO_R0_DEST 02 /* Register r0 cannot be a destination register */ |
/* The opcodes library contains a table that allows translation from predefined |
symbol names to numeric values, and vice versa. */ |
/* Structure to hold information about predefined symbols. */ |
struct predefined_symbol |
{ |
char *name; /* name to recognize */ |
int value; |
}; |
#define PDS_NAME(pdsp) ((pdsp) -> name) |
#define PDS_VALUE(pdsp) ((pdsp) -> value) |
/* Translation array. */ |
extern const struct predefined_symbol tic80_predefined_symbols[]; |
/* How many members in the array. */ |
extern const int tic80_num_predefined_symbols; |
/* Translate value to symbolic name. */ |
const char *tic80_value_to_symbol (int val, int class); |
/* Translate symbolic name to value. */ |
int tic80_symbol_to_value (char *name, int class); |
const struct predefined_symbol *tic80_next_predefined_symbol |
(const struct predefined_symbol *); |
#endif /* TIC80_H */ |
/contrib/toolchain/binutils/include/opcode/tilegx.h |
---|
0,0 → 1,1304 |
/* TILE-Gx opcode information. |
* |
* Copyright 2011 Free Software Foundation, Inc. |
* |
* This program is free software; you can redistribute it and/or modify |
* it under the terms of the GNU General Public License as published by |
* the Free Software Foundation; either version 3 of the License, or |
* (at your option) any later version. |
* |
* This program is distributed in the hope that it will be useful, |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
* GNU General Public License for more details. |
* |
* You should have received a copy of the GNU General Public License |
* along with this program; if not, write to the Free Software |
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
* MA 02110-1301, USA. |
*/ |
#ifndef opcode_tile_h |
#define opcode_tile_h |
typedef unsigned long long tilegx_bundle_bits; |
enum |
{ |
TILEGX_MAX_OPERANDS = 4 /* bfexts */ |
}; |
typedef enum |
{ |
TILEGX_OPC_BPT, |
TILEGX_OPC_INFO, |
TILEGX_OPC_INFOL, |
TILEGX_OPC_LD4S_TLS, |
TILEGX_OPC_LD_TLS, |
TILEGX_OPC_MOVE, |
TILEGX_OPC_MOVEI, |
TILEGX_OPC_MOVELI, |
TILEGX_OPC_PREFETCH, |
TILEGX_OPC_PREFETCH_ADD_L1, |
TILEGX_OPC_PREFETCH_ADD_L1_FAULT, |
TILEGX_OPC_PREFETCH_ADD_L2, |
TILEGX_OPC_PREFETCH_ADD_L2_FAULT, |
TILEGX_OPC_PREFETCH_ADD_L3, |
TILEGX_OPC_PREFETCH_ADD_L3_FAULT, |
TILEGX_OPC_PREFETCH_L1, |
TILEGX_OPC_PREFETCH_L1_FAULT, |
TILEGX_OPC_PREFETCH_L2, |
TILEGX_OPC_PREFETCH_L2_FAULT, |
TILEGX_OPC_PREFETCH_L3, |
TILEGX_OPC_PREFETCH_L3_FAULT, |
TILEGX_OPC_RAISE, |
TILEGX_OPC_ADD, |
TILEGX_OPC_ADDI, |
TILEGX_OPC_ADDLI, |
TILEGX_OPC_ADDX, |
TILEGX_OPC_ADDXI, |
TILEGX_OPC_ADDXLI, |
TILEGX_OPC_ADDXSC, |
TILEGX_OPC_AND, |
TILEGX_OPC_ANDI, |
TILEGX_OPC_BEQZ, |
TILEGX_OPC_BEQZT, |
TILEGX_OPC_BFEXTS, |
TILEGX_OPC_BFEXTU, |
TILEGX_OPC_BFINS, |
TILEGX_OPC_BGEZ, |
TILEGX_OPC_BGEZT, |
TILEGX_OPC_BGTZ, |
TILEGX_OPC_BGTZT, |
TILEGX_OPC_BLBC, |
TILEGX_OPC_BLBCT, |
TILEGX_OPC_BLBS, |
TILEGX_OPC_BLBST, |
TILEGX_OPC_BLEZ, |
TILEGX_OPC_BLEZT, |
TILEGX_OPC_BLTZ, |
TILEGX_OPC_BLTZT, |
TILEGX_OPC_BNEZ, |
TILEGX_OPC_BNEZT, |
TILEGX_OPC_CLZ, |
TILEGX_OPC_CMOVEQZ, |
TILEGX_OPC_CMOVNEZ, |
TILEGX_OPC_CMPEQ, |
TILEGX_OPC_CMPEQI, |
TILEGX_OPC_CMPEXCH, |
TILEGX_OPC_CMPEXCH4, |
TILEGX_OPC_CMPLES, |
TILEGX_OPC_CMPLEU, |
TILEGX_OPC_CMPLTS, |
TILEGX_OPC_CMPLTSI, |
TILEGX_OPC_CMPLTU, |
TILEGX_OPC_CMPLTUI, |
TILEGX_OPC_CMPNE, |
TILEGX_OPC_CMUL, |
TILEGX_OPC_CMULA, |
TILEGX_OPC_CMULAF, |
TILEGX_OPC_CMULF, |
TILEGX_OPC_CMULFR, |
TILEGX_OPC_CMULH, |
TILEGX_OPC_CMULHR, |
TILEGX_OPC_CRC32_32, |
TILEGX_OPC_CRC32_8, |
TILEGX_OPC_CTZ, |
TILEGX_OPC_DBLALIGN, |
TILEGX_OPC_DBLALIGN2, |
TILEGX_OPC_DBLALIGN4, |
TILEGX_OPC_DBLALIGN6, |
TILEGX_OPC_DRAIN, |
TILEGX_OPC_DTLBPR, |
TILEGX_OPC_EXCH, |
TILEGX_OPC_EXCH4, |
TILEGX_OPC_FDOUBLE_ADD_FLAGS, |
TILEGX_OPC_FDOUBLE_ADDSUB, |
TILEGX_OPC_FDOUBLE_MUL_FLAGS, |
TILEGX_OPC_FDOUBLE_PACK1, |
TILEGX_OPC_FDOUBLE_PACK2, |
TILEGX_OPC_FDOUBLE_SUB_FLAGS, |
TILEGX_OPC_FDOUBLE_UNPACK_MAX, |
TILEGX_OPC_FDOUBLE_UNPACK_MIN, |
TILEGX_OPC_FETCHADD, |
TILEGX_OPC_FETCHADD4, |
TILEGX_OPC_FETCHADDGEZ, |
TILEGX_OPC_FETCHADDGEZ4, |
TILEGX_OPC_FETCHAND, |
TILEGX_OPC_FETCHAND4, |
TILEGX_OPC_FETCHOR, |
TILEGX_OPC_FETCHOR4, |
TILEGX_OPC_FINV, |
TILEGX_OPC_FLUSH, |
TILEGX_OPC_FLUSHWB, |
TILEGX_OPC_FNOP, |
TILEGX_OPC_FSINGLE_ADD1, |
TILEGX_OPC_FSINGLE_ADDSUB2, |
TILEGX_OPC_FSINGLE_MUL1, |
TILEGX_OPC_FSINGLE_MUL2, |
TILEGX_OPC_FSINGLE_PACK1, |
TILEGX_OPC_FSINGLE_PACK2, |
TILEGX_OPC_FSINGLE_SUB1, |
TILEGX_OPC_ICOH, |
TILEGX_OPC_ILL, |
TILEGX_OPC_INV, |
TILEGX_OPC_IRET, |
TILEGX_OPC_J, |
TILEGX_OPC_JAL, |
TILEGX_OPC_JALR, |
TILEGX_OPC_JALRP, |
TILEGX_OPC_JR, |
TILEGX_OPC_JRP, |
TILEGX_OPC_LD, |
TILEGX_OPC_LD1S, |
TILEGX_OPC_LD1S_ADD, |
TILEGX_OPC_LD1U, |
TILEGX_OPC_LD1U_ADD, |
TILEGX_OPC_LD2S, |
TILEGX_OPC_LD2S_ADD, |
TILEGX_OPC_LD2U, |
TILEGX_OPC_LD2U_ADD, |
TILEGX_OPC_LD4S, |
TILEGX_OPC_LD4S_ADD, |
TILEGX_OPC_LD4U, |
TILEGX_OPC_LD4U_ADD, |
TILEGX_OPC_LD_ADD, |
TILEGX_OPC_LDNA, |
TILEGX_OPC_LDNA_ADD, |
TILEGX_OPC_LDNT, |
TILEGX_OPC_LDNT1S, |
TILEGX_OPC_LDNT1S_ADD, |
TILEGX_OPC_LDNT1U, |
TILEGX_OPC_LDNT1U_ADD, |
TILEGX_OPC_LDNT2S, |
TILEGX_OPC_LDNT2S_ADD, |
TILEGX_OPC_LDNT2U, |
TILEGX_OPC_LDNT2U_ADD, |
TILEGX_OPC_LDNT4S, |
TILEGX_OPC_LDNT4S_ADD, |
TILEGX_OPC_LDNT4U, |
TILEGX_OPC_LDNT4U_ADD, |
TILEGX_OPC_LDNT_ADD, |
TILEGX_OPC_LNK, |
TILEGX_OPC_MF, |
TILEGX_OPC_MFSPR, |
TILEGX_OPC_MM, |
TILEGX_OPC_MNZ, |
TILEGX_OPC_MTSPR, |
TILEGX_OPC_MUL_HS_HS, |
TILEGX_OPC_MUL_HS_HU, |
TILEGX_OPC_MUL_HS_LS, |
TILEGX_OPC_MUL_HS_LU, |
TILEGX_OPC_MUL_HU_HU, |
TILEGX_OPC_MUL_HU_LS, |
TILEGX_OPC_MUL_HU_LU, |
TILEGX_OPC_MUL_LS_LS, |
TILEGX_OPC_MUL_LS_LU, |
TILEGX_OPC_MUL_LU_LU, |
TILEGX_OPC_MULA_HS_HS, |
TILEGX_OPC_MULA_HS_HU, |
TILEGX_OPC_MULA_HS_LS, |
TILEGX_OPC_MULA_HS_LU, |
TILEGX_OPC_MULA_HU_HU, |
TILEGX_OPC_MULA_HU_LS, |
TILEGX_OPC_MULA_HU_LU, |
TILEGX_OPC_MULA_LS_LS, |
TILEGX_OPC_MULA_LS_LU, |
TILEGX_OPC_MULA_LU_LU, |
TILEGX_OPC_MULAX, |
TILEGX_OPC_MULX, |
TILEGX_OPC_MZ, |
TILEGX_OPC_NAP, |
TILEGX_OPC_NOP, |
TILEGX_OPC_NOR, |
TILEGX_OPC_OR, |
TILEGX_OPC_ORI, |
TILEGX_OPC_PCNT, |
TILEGX_OPC_REVBITS, |
TILEGX_OPC_REVBYTES, |
TILEGX_OPC_ROTL, |
TILEGX_OPC_ROTLI, |
TILEGX_OPC_SHL, |
TILEGX_OPC_SHL16INSLI, |
TILEGX_OPC_SHL1ADD, |
TILEGX_OPC_SHL1ADDX, |
TILEGX_OPC_SHL2ADD, |
TILEGX_OPC_SHL2ADDX, |
TILEGX_OPC_SHL3ADD, |
TILEGX_OPC_SHL3ADDX, |
TILEGX_OPC_SHLI, |
TILEGX_OPC_SHLX, |
TILEGX_OPC_SHLXI, |
TILEGX_OPC_SHRS, |
TILEGX_OPC_SHRSI, |
TILEGX_OPC_SHRU, |
TILEGX_OPC_SHRUI, |
TILEGX_OPC_SHRUX, |
TILEGX_OPC_SHRUXI, |
TILEGX_OPC_SHUFFLEBYTES, |
TILEGX_OPC_ST, |
TILEGX_OPC_ST1, |
TILEGX_OPC_ST1_ADD, |
TILEGX_OPC_ST2, |
TILEGX_OPC_ST2_ADD, |
TILEGX_OPC_ST4, |
TILEGX_OPC_ST4_ADD, |
TILEGX_OPC_ST_ADD, |
TILEGX_OPC_STNT, |
TILEGX_OPC_STNT1, |
TILEGX_OPC_STNT1_ADD, |
TILEGX_OPC_STNT2, |
TILEGX_OPC_STNT2_ADD, |
TILEGX_OPC_STNT4, |
TILEGX_OPC_STNT4_ADD, |
TILEGX_OPC_STNT_ADD, |
TILEGX_OPC_SUB, |
TILEGX_OPC_SUBX, |
TILEGX_OPC_SUBXSC, |
TILEGX_OPC_SWINT0, |
TILEGX_OPC_SWINT1, |
TILEGX_OPC_SWINT2, |
TILEGX_OPC_SWINT3, |
TILEGX_OPC_TBLIDXB0, |
TILEGX_OPC_TBLIDXB1, |
TILEGX_OPC_TBLIDXB2, |
TILEGX_OPC_TBLIDXB3, |
TILEGX_OPC_V1ADD, |
TILEGX_OPC_V1ADDI, |
TILEGX_OPC_V1ADDUC, |
TILEGX_OPC_V1ADIFFU, |
TILEGX_OPC_V1AVGU, |
TILEGX_OPC_V1CMPEQ, |
TILEGX_OPC_V1CMPEQI, |
TILEGX_OPC_V1CMPLES, |
TILEGX_OPC_V1CMPLEU, |
TILEGX_OPC_V1CMPLTS, |
TILEGX_OPC_V1CMPLTSI, |
TILEGX_OPC_V1CMPLTU, |
TILEGX_OPC_V1CMPLTUI, |
TILEGX_OPC_V1CMPNE, |
TILEGX_OPC_V1DDOTPU, |
TILEGX_OPC_V1DDOTPUA, |
TILEGX_OPC_V1DDOTPUS, |
TILEGX_OPC_V1DDOTPUSA, |
TILEGX_OPC_V1DOTP, |
TILEGX_OPC_V1DOTPA, |
TILEGX_OPC_V1DOTPU, |
TILEGX_OPC_V1DOTPUA, |
TILEGX_OPC_V1DOTPUS, |
TILEGX_OPC_V1DOTPUSA, |
TILEGX_OPC_V1INT_H, |
TILEGX_OPC_V1INT_L, |
TILEGX_OPC_V1MAXU, |
TILEGX_OPC_V1MAXUI, |
TILEGX_OPC_V1MINU, |
TILEGX_OPC_V1MINUI, |
TILEGX_OPC_V1MNZ, |
TILEGX_OPC_V1MULTU, |
TILEGX_OPC_V1MULU, |
TILEGX_OPC_V1MULUS, |
TILEGX_OPC_V1MZ, |
TILEGX_OPC_V1SADAU, |
TILEGX_OPC_V1SADU, |
TILEGX_OPC_V1SHL, |
TILEGX_OPC_V1SHLI, |
TILEGX_OPC_V1SHRS, |
TILEGX_OPC_V1SHRSI, |
TILEGX_OPC_V1SHRU, |
TILEGX_OPC_V1SHRUI, |
TILEGX_OPC_V1SUB, |
TILEGX_OPC_V1SUBUC, |
TILEGX_OPC_V2ADD, |
TILEGX_OPC_V2ADDI, |
TILEGX_OPC_V2ADDSC, |
TILEGX_OPC_V2ADIFFS, |
TILEGX_OPC_V2AVGS, |
TILEGX_OPC_V2CMPEQ, |
TILEGX_OPC_V2CMPEQI, |
TILEGX_OPC_V2CMPLES, |
TILEGX_OPC_V2CMPLEU, |
TILEGX_OPC_V2CMPLTS, |
TILEGX_OPC_V2CMPLTSI, |
TILEGX_OPC_V2CMPLTU, |
TILEGX_OPC_V2CMPLTUI, |
TILEGX_OPC_V2CMPNE, |
TILEGX_OPC_V2DOTP, |
TILEGX_OPC_V2DOTPA, |
TILEGX_OPC_V2INT_H, |
TILEGX_OPC_V2INT_L, |
TILEGX_OPC_V2MAXS, |
TILEGX_OPC_V2MAXSI, |
TILEGX_OPC_V2MINS, |
TILEGX_OPC_V2MINSI, |
TILEGX_OPC_V2MNZ, |
TILEGX_OPC_V2MULFSC, |
TILEGX_OPC_V2MULS, |
TILEGX_OPC_V2MULTS, |
TILEGX_OPC_V2MZ, |
TILEGX_OPC_V2PACKH, |
TILEGX_OPC_V2PACKL, |
TILEGX_OPC_V2PACKUC, |
TILEGX_OPC_V2SADAS, |
TILEGX_OPC_V2SADAU, |
TILEGX_OPC_V2SADS, |
TILEGX_OPC_V2SADU, |
TILEGX_OPC_V2SHL, |
TILEGX_OPC_V2SHLI, |
TILEGX_OPC_V2SHLSC, |
TILEGX_OPC_V2SHRS, |
TILEGX_OPC_V2SHRSI, |
TILEGX_OPC_V2SHRU, |
TILEGX_OPC_V2SHRUI, |
TILEGX_OPC_V2SUB, |
TILEGX_OPC_V2SUBSC, |
TILEGX_OPC_V4ADD, |
TILEGX_OPC_V4ADDSC, |
TILEGX_OPC_V4INT_H, |
TILEGX_OPC_V4INT_L, |
TILEGX_OPC_V4PACKSC, |
TILEGX_OPC_V4SHL, |
TILEGX_OPC_V4SHLSC, |
TILEGX_OPC_V4SHRS, |
TILEGX_OPC_V4SHRU, |
TILEGX_OPC_V4SUB, |
TILEGX_OPC_V4SUBSC, |
TILEGX_OPC_WH64, |
TILEGX_OPC_XOR, |
TILEGX_OPC_XORI, |
TILEGX_OPC_NONE |
} tilegx_mnemonic; |
/* 64-bit pattern for a { bpt ; nop } bundle. */ |
#define TILEGX_BPT_BUNDLE 0x286a44ae51485000ULL |
static __inline unsigned int |
get_BFEnd_X0(tilegx_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 12)) & 0x3f); |
} |
static __inline unsigned int |
get_BFOpcodeExtension_X0(tilegx_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 24)) & 0xf); |
} |
static __inline unsigned int |
get_BFStart_X0(tilegx_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 18)) & 0x3f); |
} |
static __inline unsigned int |
get_BrOff_X1(tilegx_bundle_bits n) |
{ |
return (((unsigned int)(n >> 31)) & 0x0000003f) | |
(((unsigned int)(n >> 37)) & 0x0001ffc0); |
} |
static __inline unsigned int |
get_BrType_X1(tilegx_bundle_bits n) |
{ |
return (((unsigned int)(n >> 54)) & 0x1f); |
} |
static __inline unsigned int |
get_Dest_Imm8_X1(tilegx_bundle_bits n) |
{ |
return (((unsigned int)(n >> 31)) & 0x0000003f) | |
(((unsigned int)(n >> 43)) & 0x000000c0); |
} |
static __inline unsigned int |
get_Dest_X0(tilegx_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 0)) & 0x3f); |
} |
static __inline unsigned int |
get_Dest_X1(tilegx_bundle_bits n) |
{ |
return (((unsigned int)(n >> 31)) & 0x3f); |
} |
static __inline unsigned int |
get_Dest_Y0(tilegx_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 0)) & 0x3f); |
} |
static __inline unsigned int |
get_Dest_Y1(tilegx_bundle_bits n) |
{ |
return (((unsigned int)(n >> 31)) & 0x3f); |
} |
static __inline unsigned int |
get_Imm16_X0(tilegx_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 12)) & 0xffff); |
} |
static __inline unsigned int |
get_Imm16_X1(tilegx_bundle_bits n) |
{ |
return (((unsigned int)(n >> 43)) & 0xffff); |
} |
static __inline unsigned int |
get_Imm8OpcodeExtension_X0(tilegx_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 20)) & 0xff); |
} |
static __inline unsigned int |
get_Imm8OpcodeExtension_X1(tilegx_bundle_bits n) |
{ |
return (((unsigned int)(n >> 51)) & 0xff); |
} |
static __inline unsigned int |
get_Imm8_X0(tilegx_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 12)) & 0xff); |
} |
static __inline unsigned int |
get_Imm8_X1(tilegx_bundle_bits n) |
{ |
return (((unsigned int)(n >> 43)) & 0xff); |
} |
static __inline unsigned int |
get_Imm8_Y0(tilegx_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 12)) & 0xff); |
} |
static __inline unsigned int |
get_Imm8_Y1(tilegx_bundle_bits n) |
{ |
return (((unsigned int)(n >> 43)) & 0xff); |
} |
static __inline unsigned int |
get_JumpOff_X1(tilegx_bundle_bits n) |
{ |
return (((unsigned int)(n >> 31)) & 0x7ffffff); |
} |
static __inline unsigned int |
get_JumpOpcodeExtension_X1(tilegx_bundle_bits n) |
{ |
return (((unsigned int)(n >> 58)) & 0x1); |
} |
static __inline unsigned int |
get_MF_Imm14_X1(tilegx_bundle_bits n) |
{ |
return (((unsigned int)(n >> 37)) & 0x3fff); |
} |
static __inline unsigned int |
get_MT_Imm14_X1(tilegx_bundle_bits n) |
{ |
return (((unsigned int)(n >> 31)) & 0x0000003f) | |
(((unsigned int)(n >> 37)) & 0x00003fc0); |
} |
static __inline unsigned int |
get_Mode(tilegx_bundle_bits n) |
{ |
return (((unsigned int)(n >> 62)) & 0x3); |
} |
static __inline unsigned int |
get_Opcode_X0(tilegx_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 28)) & 0x7); |
} |
static __inline unsigned int |
get_Opcode_X1(tilegx_bundle_bits n) |
{ |
return (((unsigned int)(n >> 59)) & 0x7); |
} |
static __inline unsigned int |
get_Opcode_Y0(tilegx_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 27)) & 0xf); |
} |
static __inline unsigned int |
get_Opcode_Y1(tilegx_bundle_bits n) |
{ |
return (((unsigned int)(n >> 58)) & 0xf); |
} |
static __inline unsigned int |
get_Opcode_Y2(tilegx_bundle_bits n) |
{ |
return (((n >> 26)) & 0x00000001) | |
(((unsigned int)(n >> 56)) & 0x00000002); |
} |
static __inline unsigned int |
get_RRROpcodeExtension_X0(tilegx_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 18)) & 0x3ff); |
} |
static __inline unsigned int |
get_RRROpcodeExtension_X1(tilegx_bundle_bits n) |
{ |
return (((unsigned int)(n >> 49)) & 0x3ff); |
} |
static __inline unsigned int |
get_RRROpcodeExtension_Y0(tilegx_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 18)) & 0x3); |
} |
static __inline unsigned int |
get_RRROpcodeExtension_Y1(tilegx_bundle_bits n) |
{ |
return (((unsigned int)(n >> 49)) & 0x3); |
} |
static __inline unsigned int |
get_ShAmt_X0(tilegx_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 12)) & 0x3f); |
} |
static __inline unsigned int |
get_ShAmt_X1(tilegx_bundle_bits n) |
{ |
return (((unsigned int)(n >> 43)) & 0x3f); |
} |
static __inline unsigned int |
get_ShAmt_Y0(tilegx_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 12)) & 0x3f); |
} |
static __inline unsigned int |
get_ShAmt_Y1(tilegx_bundle_bits n) |
{ |
return (((unsigned int)(n >> 43)) & 0x3f); |
} |
static __inline unsigned int |
get_ShiftOpcodeExtension_X0(tilegx_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 18)) & 0x3ff); |
} |
static __inline unsigned int |
get_ShiftOpcodeExtension_X1(tilegx_bundle_bits n) |
{ |
return (((unsigned int)(n >> 49)) & 0x3ff); |
} |
static __inline unsigned int |
get_ShiftOpcodeExtension_Y0(tilegx_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 18)) & 0x3); |
} |
static __inline unsigned int |
get_ShiftOpcodeExtension_Y1(tilegx_bundle_bits n) |
{ |
return (((unsigned int)(n >> 49)) & 0x3); |
} |
static __inline unsigned int |
get_SrcA_X0(tilegx_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 6)) & 0x3f); |
} |
static __inline unsigned int |
get_SrcA_X1(tilegx_bundle_bits n) |
{ |
return (((unsigned int)(n >> 37)) & 0x3f); |
} |
static __inline unsigned int |
get_SrcA_Y0(tilegx_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 6)) & 0x3f); |
} |
static __inline unsigned int |
get_SrcA_Y1(tilegx_bundle_bits n) |
{ |
return (((unsigned int)(n >> 37)) & 0x3f); |
} |
static __inline unsigned int |
get_SrcA_Y2(tilegx_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 20)) & 0x3f); |
} |
static __inline unsigned int |
get_SrcBDest_Y2(tilegx_bundle_bits n) |
{ |
return (((unsigned int)(n >> 51)) & 0x3f); |
} |
static __inline unsigned int |
get_SrcB_X0(tilegx_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 12)) & 0x3f); |
} |
static __inline unsigned int |
get_SrcB_X1(tilegx_bundle_bits n) |
{ |
return (((unsigned int)(n >> 43)) & 0x3f); |
} |
static __inline unsigned int |
get_SrcB_Y0(tilegx_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 12)) & 0x3f); |
} |
static __inline unsigned int |
get_SrcB_Y1(tilegx_bundle_bits n) |
{ |
return (((unsigned int)(n >> 43)) & 0x3f); |
} |
static __inline unsigned int |
get_UnaryOpcodeExtension_X0(tilegx_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 12)) & 0x3f); |
} |
static __inline unsigned int |
get_UnaryOpcodeExtension_X1(tilegx_bundle_bits n) |
{ |
return (((unsigned int)(n >> 43)) & 0x3f); |
} |
static __inline unsigned int |
get_UnaryOpcodeExtension_Y0(tilegx_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 12)) & 0x3f); |
} |
static __inline unsigned int |
get_UnaryOpcodeExtension_Y1(tilegx_bundle_bits n) |
{ |
return (((unsigned int)(n >> 43)) & 0x3f); |
} |
static __inline int |
sign_extend(int n, int num_bits) |
{ |
int shift = (int)(sizeof(int) * 8 - num_bits); |
return (n << shift) >> shift; |
} |
static __inline tilegx_bundle_bits |
create_BFEnd_X0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x3f) << 12); |
} |
static __inline tilegx_bundle_bits |
create_BFOpcodeExtension_X0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0xf) << 24); |
} |
static __inline tilegx_bundle_bits |
create_BFStart_X0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x3f) << 18); |
} |
static __inline tilegx_bundle_bits |
create_BrOff_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilegx_bundle_bits)(n & 0x0000003f)) << 31) | |
(((tilegx_bundle_bits)(n & 0x0001ffc0)) << 37); |
} |
static __inline tilegx_bundle_bits |
create_BrType_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilegx_bundle_bits)(n & 0x1f)) << 54); |
} |
static __inline tilegx_bundle_bits |
create_Dest_Imm8_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilegx_bundle_bits)(n & 0x0000003f)) << 31) | |
(((tilegx_bundle_bits)(n & 0x000000c0)) << 43); |
} |
static __inline tilegx_bundle_bits |
create_Dest_X0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x3f) << 0); |
} |
static __inline tilegx_bundle_bits |
create_Dest_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilegx_bundle_bits)(n & 0x3f)) << 31); |
} |
static __inline tilegx_bundle_bits |
create_Dest_Y0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x3f) << 0); |
} |
static __inline tilegx_bundle_bits |
create_Dest_Y1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilegx_bundle_bits)(n & 0x3f)) << 31); |
} |
static __inline tilegx_bundle_bits |
create_Imm16_X0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0xffff) << 12); |
} |
static __inline tilegx_bundle_bits |
create_Imm16_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilegx_bundle_bits)(n & 0xffff)) << 43); |
} |
static __inline tilegx_bundle_bits |
create_Imm8OpcodeExtension_X0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0xff) << 20); |
} |
static __inline tilegx_bundle_bits |
create_Imm8OpcodeExtension_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilegx_bundle_bits)(n & 0xff)) << 51); |
} |
static __inline tilegx_bundle_bits |
create_Imm8_X0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0xff) << 12); |
} |
static __inline tilegx_bundle_bits |
create_Imm8_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilegx_bundle_bits)(n & 0xff)) << 43); |
} |
static __inline tilegx_bundle_bits |
create_Imm8_Y0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0xff) << 12); |
} |
static __inline tilegx_bundle_bits |
create_Imm8_Y1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilegx_bundle_bits)(n & 0xff)) << 43); |
} |
static __inline tilegx_bundle_bits |
create_JumpOff_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilegx_bundle_bits)(n & 0x7ffffff)) << 31); |
} |
static __inline tilegx_bundle_bits |
create_JumpOpcodeExtension_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilegx_bundle_bits)(n & 0x1)) << 58); |
} |
static __inline tilegx_bundle_bits |
create_MF_Imm14_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilegx_bundle_bits)(n & 0x3fff)) << 37); |
} |
static __inline tilegx_bundle_bits |
create_MT_Imm14_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilegx_bundle_bits)(n & 0x0000003f)) << 31) | |
(((tilegx_bundle_bits)(n & 0x00003fc0)) << 37); |
} |
static __inline tilegx_bundle_bits |
create_Mode(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilegx_bundle_bits)(n & 0x3)) << 62); |
} |
static __inline tilegx_bundle_bits |
create_Opcode_X0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x7) << 28); |
} |
static __inline tilegx_bundle_bits |
create_Opcode_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilegx_bundle_bits)(n & 0x7)) << 59); |
} |
static __inline tilegx_bundle_bits |
create_Opcode_Y0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0xf) << 27); |
} |
static __inline tilegx_bundle_bits |
create_Opcode_Y1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilegx_bundle_bits)(n & 0xf)) << 58); |
} |
static __inline tilegx_bundle_bits |
create_Opcode_Y2(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x00000001) << 26) | |
(((tilegx_bundle_bits)(n & 0x00000002)) << 56); |
} |
static __inline tilegx_bundle_bits |
create_RRROpcodeExtension_X0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x3ff) << 18); |
} |
static __inline tilegx_bundle_bits |
create_RRROpcodeExtension_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilegx_bundle_bits)(n & 0x3ff)) << 49); |
} |
static __inline tilegx_bundle_bits |
create_RRROpcodeExtension_Y0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x3) << 18); |
} |
static __inline tilegx_bundle_bits |
create_RRROpcodeExtension_Y1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilegx_bundle_bits)(n & 0x3)) << 49); |
} |
static __inline tilegx_bundle_bits |
create_ShAmt_X0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x3f) << 12); |
} |
static __inline tilegx_bundle_bits |
create_ShAmt_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilegx_bundle_bits)(n & 0x3f)) << 43); |
} |
static __inline tilegx_bundle_bits |
create_ShAmt_Y0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x3f) << 12); |
} |
static __inline tilegx_bundle_bits |
create_ShAmt_Y1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilegx_bundle_bits)(n & 0x3f)) << 43); |
} |
static __inline tilegx_bundle_bits |
create_ShiftOpcodeExtension_X0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x3ff) << 18); |
} |
static __inline tilegx_bundle_bits |
create_ShiftOpcodeExtension_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilegx_bundle_bits)(n & 0x3ff)) << 49); |
} |
static __inline tilegx_bundle_bits |
create_ShiftOpcodeExtension_Y0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x3) << 18); |
} |
static __inline tilegx_bundle_bits |
create_ShiftOpcodeExtension_Y1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilegx_bundle_bits)(n & 0x3)) << 49); |
} |
static __inline tilegx_bundle_bits |
create_SrcA_X0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x3f) << 6); |
} |
static __inline tilegx_bundle_bits |
create_SrcA_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilegx_bundle_bits)(n & 0x3f)) << 37); |
} |
static __inline tilegx_bundle_bits |
create_SrcA_Y0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x3f) << 6); |
} |
static __inline tilegx_bundle_bits |
create_SrcA_Y1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilegx_bundle_bits)(n & 0x3f)) << 37); |
} |
static __inline tilegx_bundle_bits |
create_SrcA_Y2(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x3f) << 20); |
} |
static __inline tilegx_bundle_bits |
create_SrcBDest_Y2(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilegx_bundle_bits)(n & 0x3f)) << 51); |
} |
static __inline tilegx_bundle_bits |
create_SrcB_X0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x3f) << 12); |
} |
static __inline tilegx_bundle_bits |
create_SrcB_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilegx_bundle_bits)(n & 0x3f)) << 43); |
} |
static __inline tilegx_bundle_bits |
create_SrcB_Y0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x3f) << 12); |
} |
static __inline tilegx_bundle_bits |
create_SrcB_Y1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilegx_bundle_bits)(n & 0x3f)) << 43); |
} |
static __inline tilegx_bundle_bits |
create_UnaryOpcodeExtension_X0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x3f) << 12); |
} |
static __inline tilegx_bundle_bits |
create_UnaryOpcodeExtension_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilegx_bundle_bits)(n & 0x3f)) << 43); |
} |
static __inline tilegx_bundle_bits |
create_UnaryOpcodeExtension_Y0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x3f) << 12); |
} |
static __inline tilegx_bundle_bits |
create_UnaryOpcodeExtension_Y1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilegx_bundle_bits)(n & 0x3f)) << 43); |
} |
typedef enum |
{ |
TILEGX_PIPELINE_X0, |
TILEGX_PIPELINE_X1, |
TILEGX_PIPELINE_Y0, |
TILEGX_PIPELINE_Y1, |
TILEGX_PIPELINE_Y2, |
} tilegx_pipeline; |
#define tilegx_is_x_pipeline(p) ((int)(p) <= (int)TILEGX_PIPELINE_X1) |
typedef enum |
{ |
TILEGX_OP_TYPE_REGISTER, |
TILEGX_OP_TYPE_IMMEDIATE, |
TILEGX_OP_TYPE_ADDRESS, |
TILEGX_OP_TYPE_SPR |
} tilegx_operand_type; |
/* These are the bits that determine if a bundle is in the X encoding. */ |
#define TILEGX_BUNDLE_MODE_MASK ((tilegx_bundle_bits)3 << 62) |
enum |
{ |
/* Maximum number of instructions in a bundle (2 for X, 3 for Y). */ |
TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE = 3, |
/* How many different pipeline encodings are there? X0, X1, Y0, Y1, Y2. */ |
TILEGX_NUM_PIPELINE_ENCODINGS = 5, |
/* Log base 2 of TILEGX_BUNDLE_SIZE_IN_BYTES. */ |
TILEGX_LOG2_BUNDLE_SIZE_IN_BYTES = 3, |
/* Instructions take this many bytes. */ |
TILEGX_BUNDLE_SIZE_IN_BYTES = 1 << TILEGX_LOG2_BUNDLE_SIZE_IN_BYTES, |
/* Log base 2 of TILEGX_BUNDLE_ALIGNMENT_IN_BYTES. */ |
TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES = 3, |
/* Bundles should be aligned modulo this number of bytes. */ |
TILEGX_BUNDLE_ALIGNMENT_IN_BYTES = |
(1 << TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES), |
/* Number of registers (some are magic, such as network I/O). */ |
TILEGX_NUM_REGISTERS = 64, |
}; |
struct tilegx_operand |
{ |
/* Is this operand a register, immediate or address? */ |
tilegx_operand_type type; |
/* The default relocation type for this operand. */ |
signed int default_reloc : 16; |
/* How many bits is this value? (used for range checking) */ |
unsigned int num_bits : 5; |
/* Is the value signed? (used for range checking) */ |
unsigned int is_signed : 1; |
/* Is this operand a source register? */ |
unsigned int is_src_reg : 1; |
/* Is this operand written? (i.e. is it a destination register) */ |
unsigned int is_dest_reg : 1; |
/* Is this operand PC-relative? */ |
unsigned int is_pc_relative : 1; |
/* By how many bits do we right shift the value before inserting? */ |
unsigned int rightshift : 2; |
/* Return the bits for this operand to be ORed into an existing bundle. */ |
tilegx_bundle_bits (*insert) (int op); |
/* Extract this operand and return it. */ |
unsigned int (*extract) (tilegx_bundle_bits bundle); |
}; |
extern const struct tilegx_operand tilegx_operands[]; |
/* One finite-state machine per pipe for rapid instruction decoding. */ |
extern const unsigned short * const |
tilegx_bundle_decoder_fsms[TILEGX_NUM_PIPELINE_ENCODINGS]; |
struct tilegx_opcode |
{ |
/* The opcode mnemonic, e.g. "add" */ |
const char *name; |
/* The enum value for this mnemonic. */ |
tilegx_mnemonic mnemonic; |
/* A bit mask of which of the five pipes this instruction |
is compatible with: |
X0 0x01 |
X1 0x02 |
Y0 0x04 |
Y1 0x08 |
Y2 0x10 */ |
unsigned char pipes; |
/* How many operands are there? */ |
unsigned char num_operands; |
/* Which register does this write implicitly, or TREG_ZERO if none? */ |
unsigned char implicitly_written_register; |
/* Can this be bundled with other instructions (almost always true). */ |
unsigned char can_bundle; |
/* The description of the operands. Each of these is an |
* index into the tilegx_operands[] table. */ |
unsigned char operands[TILEGX_NUM_PIPELINE_ENCODINGS][TILEGX_MAX_OPERANDS]; |
#if !defined(__KERNEL__) && !defined(_LIBC) |
/* A mask of which bits have predefined values for each pipeline. |
* This is useful for disassembly. */ |
tilegx_bundle_bits fixed_bit_masks[TILEGX_NUM_PIPELINE_ENCODINGS]; |
/* For each bit set in fixed_bit_masks, what the value is for this |
* instruction. */ |
tilegx_bundle_bits fixed_bit_values[TILEGX_NUM_PIPELINE_ENCODINGS]; |
#endif |
}; |
extern const struct tilegx_opcode tilegx_opcodes[]; |
/* Used for non-textual disassembly into structs. */ |
struct tilegx_decoded_instruction |
{ |
const struct tilegx_opcode *opcode; |
const struct tilegx_operand *operands[TILEGX_MAX_OPERANDS]; |
long long operand_values[TILEGX_MAX_OPERANDS]; |
}; |
/* Disassemble a bundle into a struct for machine processing. */ |
extern int parse_insn_tilegx(tilegx_bundle_bits bits, |
unsigned long long pc, |
struct tilegx_decoded_instruction |
decoded[TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE]); |
#if !defined(__KERNEL__) && !defined(_LIBC) |
/* Canonical names of all the registers. */ |
/* ISSUE: This table lives in "tile-dis.c" */ |
extern const char * const tilegx_register_names[]; |
/* Descriptor for a special-purpose register. */ |
struct tilegx_spr |
{ |
/* The number */ |
int number; |
/* The name */ |
const char *name; |
}; |
/* List of all the SPRs; ordered by increasing number. */ |
extern const struct tilegx_spr tilegx_sprs[]; |
/* Number of special-purpose registers. */ |
extern const int tilegx_num_sprs; |
extern const char * |
get_tilegx_spr_name (int num); |
#endif /* !__KERNEL__ && !_LIBC */ |
/* Make a few "tile_" variables to simply common code between |
architectures. */ |
typedef tilegx_bundle_bits tile_bundle_bits; |
#define TILE_BUNDLE_SIZE_IN_BYTES TILEGX_BUNDLE_SIZE_IN_BYTES |
#define TILE_BUNDLE_ALIGNMENT_IN_BYTES TILEGX_BUNDLE_ALIGNMENT_IN_BYTES |
#define TILE_LOG2_BUNDLE_ALIGNMENT_IN_BYTES \ |
TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES |
#endif /* opcode_tilegx_h */ |
/contrib/toolchain/binutils/include/opcode/tilepro.h |
---|
0,0 → 1,1638 |
/* TILEPro opcode information. |
* |
* Copyright 2011 Free Software Foundation, Inc. |
* |
* This program is free software; you can redistribute it and/or modify |
* it under the terms of the GNU General Public License as published by |
* the Free Software Foundation; either version 3 of the License, or |
* (at your option) any later version. |
* |
* This program is distributed in the hope that it will be useful, |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
* GNU General Public License for more details. |
* |
* You should have received a copy of the GNU General Public License |
* along with this program; if not, write to the Free Software |
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
* MA 02110-1301, USA. |
*/ |
#ifndef opcode_tilepro_h |
#define opcode_tilepro_h |
typedef unsigned long long tilepro_bundle_bits; |
enum |
{ |
TILEPRO_MAX_OPERANDS = 5 /* mm */ |
}; |
typedef enum |
{ |
TILEPRO_OPC_BPT, |
TILEPRO_OPC_INFO, |
TILEPRO_OPC_INFOL, |
TILEPRO_OPC_J, |
TILEPRO_OPC_JAL, |
TILEPRO_OPC_LW_TLS, |
TILEPRO_OPC_LW_TLS_SN, |
TILEPRO_OPC_MOVE, |
TILEPRO_OPC_MOVE_SN, |
TILEPRO_OPC_MOVEI, |
TILEPRO_OPC_MOVEI_SN, |
TILEPRO_OPC_MOVELI, |
TILEPRO_OPC_MOVELI_SN, |
TILEPRO_OPC_MOVELIS, |
TILEPRO_OPC_PREFETCH, |
TILEPRO_OPC_RAISE, |
TILEPRO_OPC_ADD, |
TILEPRO_OPC_ADD_SN, |
TILEPRO_OPC_ADDB, |
TILEPRO_OPC_ADDB_SN, |
TILEPRO_OPC_ADDBS_U, |
TILEPRO_OPC_ADDBS_U_SN, |
TILEPRO_OPC_ADDH, |
TILEPRO_OPC_ADDH_SN, |
TILEPRO_OPC_ADDHS, |
TILEPRO_OPC_ADDHS_SN, |
TILEPRO_OPC_ADDI, |
TILEPRO_OPC_ADDI_SN, |
TILEPRO_OPC_ADDIB, |
TILEPRO_OPC_ADDIB_SN, |
TILEPRO_OPC_ADDIH, |
TILEPRO_OPC_ADDIH_SN, |
TILEPRO_OPC_ADDLI, |
TILEPRO_OPC_ADDLI_SN, |
TILEPRO_OPC_ADDLIS, |
TILEPRO_OPC_ADDS, |
TILEPRO_OPC_ADDS_SN, |
TILEPRO_OPC_ADIFFB_U, |
TILEPRO_OPC_ADIFFB_U_SN, |
TILEPRO_OPC_ADIFFH, |
TILEPRO_OPC_ADIFFH_SN, |
TILEPRO_OPC_AND, |
TILEPRO_OPC_AND_SN, |
TILEPRO_OPC_ANDI, |
TILEPRO_OPC_ANDI_SN, |
TILEPRO_OPC_AULI, |
TILEPRO_OPC_AVGB_U, |
TILEPRO_OPC_AVGB_U_SN, |
TILEPRO_OPC_AVGH, |
TILEPRO_OPC_AVGH_SN, |
TILEPRO_OPC_BBNS, |
TILEPRO_OPC_BBNS_SN, |
TILEPRO_OPC_BBNST, |
TILEPRO_OPC_BBNST_SN, |
TILEPRO_OPC_BBS, |
TILEPRO_OPC_BBS_SN, |
TILEPRO_OPC_BBST, |
TILEPRO_OPC_BBST_SN, |
TILEPRO_OPC_BGEZ, |
TILEPRO_OPC_BGEZ_SN, |
TILEPRO_OPC_BGEZT, |
TILEPRO_OPC_BGEZT_SN, |
TILEPRO_OPC_BGZ, |
TILEPRO_OPC_BGZ_SN, |
TILEPRO_OPC_BGZT, |
TILEPRO_OPC_BGZT_SN, |
TILEPRO_OPC_BITX, |
TILEPRO_OPC_BITX_SN, |
TILEPRO_OPC_BLEZ, |
TILEPRO_OPC_BLEZ_SN, |
TILEPRO_OPC_BLEZT, |
TILEPRO_OPC_BLEZT_SN, |
TILEPRO_OPC_BLZ, |
TILEPRO_OPC_BLZ_SN, |
TILEPRO_OPC_BLZT, |
TILEPRO_OPC_BLZT_SN, |
TILEPRO_OPC_BNZ, |
TILEPRO_OPC_BNZ_SN, |
TILEPRO_OPC_BNZT, |
TILEPRO_OPC_BNZT_SN, |
TILEPRO_OPC_BYTEX, |
TILEPRO_OPC_BYTEX_SN, |
TILEPRO_OPC_BZ, |
TILEPRO_OPC_BZ_SN, |
TILEPRO_OPC_BZT, |
TILEPRO_OPC_BZT_SN, |
TILEPRO_OPC_CLZ, |
TILEPRO_OPC_CLZ_SN, |
TILEPRO_OPC_CRC32_32, |
TILEPRO_OPC_CRC32_32_SN, |
TILEPRO_OPC_CRC32_8, |
TILEPRO_OPC_CRC32_8_SN, |
TILEPRO_OPC_CTZ, |
TILEPRO_OPC_CTZ_SN, |
TILEPRO_OPC_DRAIN, |
TILEPRO_OPC_DTLBPR, |
TILEPRO_OPC_DWORD_ALIGN, |
TILEPRO_OPC_DWORD_ALIGN_SN, |
TILEPRO_OPC_FINV, |
TILEPRO_OPC_FLUSH, |
TILEPRO_OPC_FNOP, |
TILEPRO_OPC_ICOH, |
TILEPRO_OPC_ILL, |
TILEPRO_OPC_INTHB, |
TILEPRO_OPC_INTHB_SN, |
TILEPRO_OPC_INTHH, |
TILEPRO_OPC_INTHH_SN, |
TILEPRO_OPC_INTLB, |
TILEPRO_OPC_INTLB_SN, |
TILEPRO_OPC_INTLH, |
TILEPRO_OPC_INTLH_SN, |
TILEPRO_OPC_INV, |
TILEPRO_OPC_IRET, |
TILEPRO_OPC_JALB, |
TILEPRO_OPC_JALF, |
TILEPRO_OPC_JALR, |
TILEPRO_OPC_JALRP, |
TILEPRO_OPC_JB, |
TILEPRO_OPC_JF, |
TILEPRO_OPC_JR, |
TILEPRO_OPC_JRP, |
TILEPRO_OPC_LB, |
TILEPRO_OPC_LB_SN, |
TILEPRO_OPC_LB_U, |
TILEPRO_OPC_LB_U_SN, |
TILEPRO_OPC_LBADD, |
TILEPRO_OPC_LBADD_SN, |
TILEPRO_OPC_LBADD_U, |
TILEPRO_OPC_LBADD_U_SN, |
TILEPRO_OPC_LH, |
TILEPRO_OPC_LH_SN, |
TILEPRO_OPC_LH_U, |
TILEPRO_OPC_LH_U_SN, |
TILEPRO_OPC_LHADD, |
TILEPRO_OPC_LHADD_SN, |
TILEPRO_OPC_LHADD_U, |
TILEPRO_OPC_LHADD_U_SN, |
TILEPRO_OPC_LNK, |
TILEPRO_OPC_LNK_SN, |
TILEPRO_OPC_LW, |
TILEPRO_OPC_LW_SN, |
TILEPRO_OPC_LW_NA, |
TILEPRO_OPC_LW_NA_SN, |
TILEPRO_OPC_LWADD, |
TILEPRO_OPC_LWADD_SN, |
TILEPRO_OPC_LWADD_NA, |
TILEPRO_OPC_LWADD_NA_SN, |
TILEPRO_OPC_MAXB_U, |
TILEPRO_OPC_MAXB_U_SN, |
TILEPRO_OPC_MAXH, |
TILEPRO_OPC_MAXH_SN, |
TILEPRO_OPC_MAXIB_U, |
TILEPRO_OPC_MAXIB_U_SN, |
TILEPRO_OPC_MAXIH, |
TILEPRO_OPC_MAXIH_SN, |
TILEPRO_OPC_MF, |
TILEPRO_OPC_MFSPR, |
TILEPRO_OPC_MINB_U, |
TILEPRO_OPC_MINB_U_SN, |
TILEPRO_OPC_MINH, |
TILEPRO_OPC_MINH_SN, |
TILEPRO_OPC_MINIB_U, |
TILEPRO_OPC_MINIB_U_SN, |
TILEPRO_OPC_MINIH, |
TILEPRO_OPC_MINIH_SN, |
TILEPRO_OPC_MM, |
TILEPRO_OPC_MNZ, |
TILEPRO_OPC_MNZ_SN, |
TILEPRO_OPC_MNZB, |
TILEPRO_OPC_MNZB_SN, |
TILEPRO_OPC_MNZH, |
TILEPRO_OPC_MNZH_SN, |
TILEPRO_OPC_MTSPR, |
TILEPRO_OPC_MULHH_SS, |
TILEPRO_OPC_MULHH_SS_SN, |
TILEPRO_OPC_MULHH_SU, |
TILEPRO_OPC_MULHH_SU_SN, |
TILEPRO_OPC_MULHH_UU, |
TILEPRO_OPC_MULHH_UU_SN, |
TILEPRO_OPC_MULHHA_SS, |
TILEPRO_OPC_MULHHA_SS_SN, |
TILEPRO_OPC_MULHHA_SU, |
TILEPRO_OPC_MULHHA_SU_SN, |
TILEPRO_OPC_MULHHA_UU, |
TILEPRO_OPC_MULHHA_UU_SN, |
TILEPRO_OPC_MULHHSA_UU, |
TILEPRO_OPC_MULHHSA_UU_SN, |
TILEPRO_OPC_MULHL_SS, |
TILEPRO_OPC_MULHL_SS_SN, |
TILEPRO_OPC_MULHL_SU, |
TILEPRO_OPC_MULHL_SU_SN, |
TILEPRO_OPC_MULHL_US, |
TILEPRO_OPC_MULHL_US_SN, |
TILEPRO_OPC_MULHL_UU, |
TILEPRO_OPC_MULHL_UU_SN, |
TILEPRO_OPC_MULHLA_SS, |
TILEPRO_OPC_MULHLA_SS_SN, |
TILEPRO_OPC_MULHLA_SU, |
TILEPRO_OPC_MULHLA_SU_SN, |
TILEPRO_OPC_MULHLA_US, |
TILEPRO_OPC_MULHLA_US_SN, |
TILEPRO_OPC_MULHLA_UU, |
TILEPRO_OPC_MULHLA_UU_SN, |
TILEPRO_OPC_MULHLSA_UU, |
TILEPRO_OPC_MULHLSA_UU_SN, |
TILEPRO_OPC_MULLL_SS, |
TILEPRO_OPC_MULLL_SS_SN, |
TILEPRO_OPC_MULLL_SU, |
TILEPRO_OPC_MULLL_SU_SN, |
TILEPRO_OPC_MULLL_UU, |
TILEPRO_OPC_MULLL_UU_SN, |
TILEPRO_OPC_MULLLA_SS, |
TILEPRO_OPC_MULLLA_SS_SN, |
TILEPRO_OPC_MULLLA_SU, |
TILEPRO_OPC_MULLLA_SU_SN, |
TILEPRO_OPC_MULLLA_UU, |
TILEPRO_OPC_MULLLA_UU_SN, |
TILEPRO_OPC_MULLLSA_UU, |
TILEPRO_OPC_MULLLSA_UU_SN, |
TILEPRO_OPC_MVNZ, |
TILEPRO_OPC_MVNZ_SN, |
TILEPRO_OPC_MVZ, |
TILEPRO_OPC_MVZ_SN, |
TILEPRO_OPC_MZ, |
TILEPRO_OPC_MZ_SN, |
TILEPRO_OPC_MZB, |
TILEPRO_OPC_MZB_SN, |
TILEPRO_OPC_MZH, |
TILEPRO_OPC_MZH_SN, |
TILEPRO_OPC_NAP, |
TILEPRO_OPC_NOP, |
TILEPRO_OPC_NOR, |
TILEPRO_OPC_NOR_SN, |
TILEPRO_OPC_OR, |
TILEPRO_OPC_OR_SN, |
TILEPRO_OPC_ORI, |
TILEPRO_OPC_ORI_SN, |
TILEPRO_OPC_PACKBS_U, |
TILEPRO_OPC_PACKBS_U_SN, |
TILEPRO_OPC_PACKHB, |
TILEPRO_OPC_PACKHB_SN, |
TILEPRO_OPC_PACKHS, |
TILEPRO_OPC_PACKHS_SN, |
TILEPRO_OPC_PACKLB, |
TILEPRO_OPC_PACKLB_SN, |
TILEPRO_OPC_PCNT, |
TILEPRO_OPC_PCNT_SN, |
TILEPRO_OPC_RL, |
TILEPRO_OPC_RL_SN, |
TILEPRO_OPC_RLI, |
TILEPRO_OPC_RLI_SN, |
TILEPRO_OPC_S1A, |
TILEPRO_OPC_S1A_SN, |
TILEPRO_OPC_S2A, |
TILEPRO_OPC_S2A_SN, |
TILEPRO_OPC_S3A, |
TILEPRO_OPC_S3A_SN, |
TILEPRO_OPC_SADAB_U, |
TILEPRO_OPC_SADAB_U_SN, |
TILEPRO_OPC_SADAH, |
TILEPRO_OPC_SADAH_SN, |
TILEPRO_OPC_SADAH_U, |
TILEPRO_OPC_SADAH_U_SN, |
TILEPRO_OPC_SADB_U, |
TILEPRO_OPC_SADB_U_SN, |
TILEPRO_OPC_SADH, |
TILEPRO_OPC_SADH_SN, |
TILEPRO_OPC_SADH_U, |
TILEPRO_OPC_SADH_U_SN, |
TILEPRO_OPC_SB, |
TILEPRO_OPC_SBADD, |
TILEPRO_OPC_SEQ, |
TILEPRO_OPC_SEQ_SN, |
TILEPRO_OPC_SEQB, |
TILEPRO_OPC_SEQB_SN, |
TILEPRO_OPC_SEQH, |
TILEPRO_OPC_SEQH_SN, |
TILEPRO_OPC_SEQI, |
TILEPRO_OPC_SEQI_SN, |
TILEPRO_OPC_SEQIB, |
TILEPRO_OPC_SEQIB_SN, |
TILEPRO_OPC_SEQIH, |
TILEPRO_OPC_SEQIH_SN, |
TILEPRO_OPC_SH, |
TILEPRO_OPC_SHADD, |
TILEPRO_OPC_SHL, |
TILEPRO_OPC_SHL_SN, |
TILEPRO_OPC_SHLB, |
TILEPRO_OPC_SHLB_SN, |
TILEPRO_OPC_SHLH, |
TILEPRO_OPC_SHLH_SN, |
TILEPRO_OPC_SHLI, |
TILEPRO_OPC_SHLI_SN, |
TILEPRO_OPC_SHLIB, |
TILEPRO_OPC_SHLIB_SN, |
TILEPRO_OPC_SHLIH, |
TILEPRO_OPC_SHLIH_SN, |
TILEPRO_OPC_SHR, |
TILEPRO_OPC_SHR_SN, |
TILEPRO_OPC_SHRB, |
TILEPRO_OPC_SHRB_SN, |
TILEPRO_OPC_SHRH, |
TILEPRO_OPC_SHRH_SN, |
TILEPRO_OPC_SHRI, |
TILEPRO_OPC_SHRI_SN, |
TILEPRO_OPC_SHRIB, |
TILEPRO_OPC_SHRIB_SN, |
TILEPRO_OPC_SHRIH, |
TILEPRO_OPC_SHRIH_SN, |
TILEPRO_OPC_SLT, |
TILEPRO_OPC_SLT_SN, |
TILEPRO_OPC_SLT_U, |
TILEPRO_OPC_SLT_U_SN, |
TILEPRO_OPC_SLTB, |
TILEPRO_OPC_SLTB_SN, |
TILEPRO_OPC_SLTB_U, |
TILEPRO_OPC_SLTB_U_SN, |
TILEPRO_OPC_SLTE, |
TILEPRO_OPC_SLTE_SN, |
TILEPRO_OPC_SLTE_U, |
TILEPRO_OPC_SLTE_U_SN, |
TILEPRO_OPC_SLTEB, |
TILEPRO_OPC_SLTEB_SN, |
TILEPRO_OPC_SLTEB_U, |
TILEPRO_OPC_SLTEB_U_SN, |
TILEPRO_OPC_SLTEH, |
TILEPRO_OPC_SLTEH_SN, |
TILEPRO_OPC_SLTEH_U, |
TILEPRO_OPC_SLTEH_U_SN, |
TILEPRO_OPC_SLTH, |
TILEPRO_OPC_SLTH_SN, |
TILEPRO_OPC_SLTH_U, |
TILEPRO_OPC_SLTH_U_SN, |
TILEPRO_OPC_SLTI, |
TILEPRO_OPC_SLTI_SN, |
TILEPRO_OPC_SLTI_U, |
TILEPRO_OPC_SLTI_U_SN, |
TILEPRO_OPC_SLTIB, |
TILEPRO_OPC_SLTIB_SN, |
TILEPRO_OPC_SLTIB_U, |
TILEPRO_OPC_SLTIB_U_SN, |
TILEPRO_OPC_SLTIH, |
TILEPRO_OPC_SLTIH_SN, |
TILEPRO_OPC_SLTIH_U, |
TILEPRO_OPC_SLTIH_U_SN, |
TILEPRO_OPC_SNE, |
TILEPRO_OPC_SNE_SN, |
TILEPRO_OPC_SNEB, |
TILEPRO_OPC_SNEB_SN, |
TILEPRO_OPC_SNEH, |
TILEPRO_OPC_SNEH_SN, |
TILEPRO_OPC_SRA, |
TILEPRO_OPC_SRA_SN, |
TILEPRO_OPC_SRAB, |
TILEPRO_OPC_SRAB_SN, |
TILEPRO_OPC_SRAH, |
TILEPRO_OPC_SRAH_SN, |
TILEPRO_OPC_SRAI, |
TILEPRO_OPC_SRAI_SN, |
TILEPRO_OPC_SRAIB, |
TILEPRO_OPC_SRAIB_SN, |
TILEPRO_OPC_SRAIH, |
TILEPRO_OPC_SRAIH_SN, |
TILEPRO_OPC_SUB, |
TILEPRO_OPC_SUB_SN, |
TILEPRO_OPC_SUBB, |
TILEPRO_OPC_SUBB_SN, |
TILEPRO_OPC_SUBBS_U, |
TILEPRO_OPC_SUBBS_U_SN, |
TILEPRO_OPC_SUBH, |
TILEPRO_OPC_SUBH_SN, |
TILEPRO_OPC_SUBHS, |
TILEPRO_OPC_SUBHS_SN, |
TILEPRO_OPC_SUBS, |
TILEPRO_OPC_SUBS_SN, |
TILEPRO_OPC_SW, |
TILEPRO_OPC_SWADD, |
TILEPRO_OPC_SWINT0, |
TILEPRO_OPC_SWINT1, |
TILEPRO_OPC_SWINT2, |
TILEPRO_OPC_SWINT3, |
TILEPRO_OPC_TBLIDXB0, |
TILEPRO_OPC_TBLIDXB0_SN, |
TILEPRO_OPC_TBLIDXB1, |
TILEPRO_OPC_TBLIDXB1_SN, |
TILEPRO_OPC_TBLIDXB2, |
TILEPRO_OPC_TBLIDXB2_SN, |
TILEPRO_OPC_TBLIDXB3, |
TILEPRO_OPC_TBLIDXB3_SN, |
TILEPRO_OPC_TNS, |
TILEPRO_OPC_TNS_SN, |
TILEPRO_OPC_WH64, |
TILEPRO_OPC_XOR, |
TILEPRO_OPC_XOR_SN, |
TILEPRO_OPC_XORI, |
TILEPRO_OPC_XORI_SN, |
TILEPRO_OPC_NONE |
} tilepro_mnemonic; |
/* 64-bit pattern for a { bpt ; nop } bundle. */ |
#define TILEPRO_BPT_BUNDLE 0x400b3cae70166000ULL |
#ifndef DISASM_ONLY |
enum |
{ |
TILEPRO_SN_MAX_OPERANDS = 6 /* route */ |
}; |
typedef enum |
{ |
TILEPRO_SN_OPC_BZ, |
TILEPRO_SN_OPC_BNZ, |
TILEPRO_SN_OPC_JRR, |
TILEPRO_SN_OPC_FNOP, |
TILEPRO_SN_OPC_BLZ, |
TILEPRO_SN_OPC_NOP, |
TILEPRO_SN_OPC_MOVEI, |
TILEPRO_SN_OPC_MOVE, |
TILEPRO_SN_OPC_BGEZ, |
TILEPRO_SN_OPC_JR, |
TILEPRO_SN_OPC_BLEZ, |
TILEPRO_SN_OPC_BBNS, |
TILEPRO_SN_OPC_JALRR, |
TILEPRO_SN_OPC_BPT, |
TILEPRO_SN_OPC_JALR, |
TILEPRO_SN_OPC_SHR1, |
TILEPRO_SN_OPC_BGZ, |
TILEPRO_SN_OPC_BBS, |
TILEPRO_SN_OPC_SHL8II, |
TILEPRO_SN_OPC_ADDI, |
TILEPRO_SN_OPC_HALT, |
TILEPRO_SN_OPC_ROUTE, |
TILEPRO_SN_OPC_NONE |
} tilepro_sn_mnemonic; |
extern const unsigned char tilepro_sn_route_encode[6 * 6 * 6]; |
extern const signed char tilepro_sn_route_decode[256][3]; |
extern const char tilepro_sn_direction_names[6][5]; |
extern const signed char tilepro_sn_dest_map[6][6]; |
#endif /* DISASM_ONLY */ |
static __inline unsigned int |
get_BrOff_SN(tilepro_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 0)) & 0x3ff); |
} |
static __inline unsigned int |
get_BrOff_X1(tilepro_bundle_bits n) |
{ |
return (((unsigned int)(n >> 43)) & 0x00007fff) | |
(((unsigned int)(n >> 20)) & 0x00018000); |
} |
static __inline unsigned int |
get_BrType_X1(tilepro_bundle_bits n) |
{ |
return (((unsigned int)(n >> 31)) & 0xf); |
} |
static __inline unsigned int |
get_Dest_Imm8_X1(tilepro_bundle_bits n) |
{ |
return (((unsigned int)(n >> 31)) & 0x0000003f) | |
(((unsigned int)(n >> 43)) & 0x000000c0); |
} |
static __inline unsigned int |
get_Dest_SN(tilepro_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 2)) & 0x3); |
} |
static __inline unsigned int |
get_Dest_X0(tilepro_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 0)) & 0x3f); |
} |
static __inline unsigned int |
get_Dest_X1(tilepro_bundle_bits n) |
{ |
return (((unsigned int)(n >> 31)) & 0x3f); |
} |
static __inline unsigned int |
get_Dest_Y0(tilepro_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 0)) & 0x3f); |
} |
static __inline unsigned int |
get_Dest_Y1(tilepro_bundle_bits n) |
{ |
return (((unsigned int)(n >> 31)) & 0x3f); |
} |
static __inline unsigned int |
get_Imm16_X0(tilepro_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 12)) & 0xffff); |
} |
static __inline unsigned int |
get_Imm16_X1(tilepro_bundle_bits n) |
{ |
return (((unsigned int)(n >> 43)) & 0xffff); |
} |
static __inline unsigned int |
get_Imm8_SN(tilepro_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 0)) & 0xff); |
} |
static __inline unsigned int |
get_Imm8_X0(tilepro_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 12)) & 0xff); |
} |
static __inline unsigned int |
get_Imm8_X1(tilepro_bundle_bits n) |
{ |
return (((unsigned int)(n >> 43)) & 0xff); |
} |
static __inline unsigned int |
get_Imm8_Y0(tilepro_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 12)) & 0xff); |
} |
static __inline unsigned int |
get_Imm8_Y1(tilepro_bundle_bits n) |
{ |
return (((unsigned int)(n >> 43)) & 0xff); |
} |
static __inline unsigned int |
get_ImmOpcodeExtension_X0(tilepro_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 20)) & 0x7f); |
} |
static __inline unsigned int |
get_ImmOpcodeExtension_X1(tilepro_bundle_bits n) |
{ |
return (((unsigned int)(n >> 51)) & 0x7f); |
} |
static __inline unsigned int |
get_ImmRROpcodeExtension_SN(tilepro_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 8)) & 0x3); |
} |
static __inline unsigned int |
get_JOffLong_X1(tilepro_bundle_bits n) |
{ |
return (((unsigned int)(n >> 43)) & 0x00007fff) | |
(((unsigned int)(n >> 20)) & 0x00018000) | |
(((unsigned int)(n >> 14)) & 0x001e0000) | |
(((unsigned int)(n >> 16)) & 0x07e00000) | |
(((unsigned int)(n >> 31)) & 0x18000000); |
} |
static __inline unsigned int |
get_JOff_X1(tilepro_bundle_bits n) |
{ |
return (((unsigned int)(n >> 43)) & 0x00007fff) | |
(((unsigned int)(n >> 20)) & 0x00018000) | |
(((unsigned int)(n >> 14)) & 0x001e0000) | |
(((unsigned int)(n >> 16)) & 0x07e00000) | |
(((unsigned int)(n >> 31)) & 0x08000000); |
} |
static __inline unsigned int |
get_MF_Imm15_X1(tilepro_bundle_bits n) |
{ |
return (((unsigned int)(n >> 37)) & 0x00003fff) | |
(((unsigned int)(n >> 44)) & 0x00004000); |
} |
static __inline unsigned int |
get_MMEnd_X0(tilepro_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 18)) & 0x1f); |
} |
static __inline unsigned int |
get_MMEnd_X1(tilepro_bundle_bits n) |
{ |
return (((unsigned int)(n >> 49)) & 0x1f); |
} |
static __inline unsigned int |
get_MMStart_X0(tilepro_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 23)) & 0x1f); |
} |
static __inline unsigned int |
get_MMStart_X1(tilepro_bundle_bits n) |
{ |
return (((unsigned int)(n >> 54)) & 0x1f); |
} |
static __inline unsigned int |
get_MT_Imm15_X1(tilepro_bundle_bits n) |
{ |
return (((unsigned int)(n >> 31)) & 0x0000003f) | |
(((unsigned int)(n >> 37)) & 0x00003fc0) | |
(((unsigned int)(n >> 44)) & 0x00004000); |
} |
static __inline unsigned int |
get_Mode(tilepro_bundle_bits n) |
{ |
return (((unsigned int)(n >> 63)) & 0x1); |
} |
static __inline unsigned int |
get_NoRegOpcodeExtension_SN(tilepro_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 0)) & 0xf); |
} |
static __inline unsigned int |
get_Opcode_SN(tilepro_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 10)) & 0x3f); |
} |
static __inline unsigned int |
get_Opcode_X0(tilepro_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 28)) & 0x7); |
} |
static __inline unsigned int |
get_Opcode_X1(tilepro_bundle_bits n) |
{ |
return (((unsigned int)(n >> 59)) & 0xf); |
} |
static __inline unsigned int |
get_Opcode_Y0(tilepro_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 27)) & 0xf); |
} |
static __inline unsigned int |
get_Opcode_Y1(tilepro_bundle_bits n) |
{ |
return (((unsigned int)(n >> 59)) & 0xf); |
} |
static __inline unsigned int |
get_Opcode_Y2(tilepro_bundle_bits n) |
{ |
return (((unsigned int)(n >> 56)) & 0x7); |
} |
static __inline unsigned int |
get_RROpcodeExtension_SN(tilepro_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 4)) & 0xf); |
} |
static __inline unsigned int |
get_RRROpcodeExtension_X0(tilepro_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 18)) & 0x1ff); |
} |
static __inline unsigned int |
get_RRROpcodeExtension_X1(tilepro_bundle_bits n) |
{ |
return (((unsigned int)(n >> 49)) & 0x1ff); |
} |
static __inline unsigned int |
get_RRROpcodeExtension_Y0(tilepro_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 18)) & 0x3); |
} |
static __inline unsigned int |
get_RRROpcodeExtension_Y1(tilepro_bundle_bits n) |
{ |
return (((unsigned int)(n >> 49)) & 0x3); |
} |
static __inline unsigned int |
get_RouteOpcodeExtension_SN(tilepro_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 0)) & 0x3ff); |
} |
static __inline unsigned int |
get_S_X0(tilepro_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 27)) & 0x1); |
} |
static __inline unsigned int |
get_S_X1(tilepro_bundle_bits n) |
{ |
return (((unsigned int)(n >> 58)) & 0x1); |
} |
static __inline unsigned int |
get_ShAmt_X0(tilepro_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 12)) & 0x1f); |
} |
static __inline unsigned int |
get_ShAmt_X1(tilepro_bundle_bits n) |
{ |
return (((unsigned int)(n >> 43)) & 0x1f); |
} |
static __inline unsigned int |
get_ShAmt_Y0(tilepro_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 12)) & 0x1f); |
} |
static __inline unsigned int |
get_ShAmt_Y1(tilepro_bundle_bits n) |
{ |
return (((unsigned int)(n >> 43)) & 0x1f); |
} |
static __inline unsigned int |
get_SrcA_X0(tilepro_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 6)) & 0x3f); |
} |
static __inline unsigned int |
get_SrcA_X1(tilepro_bundle_bits n) |
{ |
return (((unsigned int)(n >> 37)) & 0x3f); |
} |
static __inline unsigned int |
get_SrcA_Y0(tilepro_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 6)) & 0x3f); |
} |
static __inline unsigned int |
get_SrcA_Y1(tilepro_bundle_bits n) |
{ |
return (((unsigned int)(n >> 37)) & 0x3f); |
} |
static __inline unsigned int |
get_SrcA_Y2(tilepro_bundle_bits n) |
{ |
return (((n >> 26)) & 0x00000001) | |
(((unsigned int)(n >> 50)) & 0x0000003e); |
} |
static __inline unsigned int |
get_SrcBDest_Y2(tilepro_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 20)) & 0x3f); |
} |
static __inline unsigned int |
get_SrcB_X0(tilepro_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 12)) & 0x3f); |
} |
static __inline unsigned int |
get_SrcB_X1(tilepro_bundle_bits n) |
{ |
return (((unsigned int)(n >> 43)) & 0x3f); |
} |
static __inline unsigned int |
get_SrcB_Y0(tilepro_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 12)) & 0x3f); |
} |
static __inline unsigned int |
get_SrcB_Y1(tilepro_bundle_bits n) |
{ |
return (((unsigned int)(n >> 43)) & 0x3f); |
} |
static __inline unsigned int |
get_Src_SN(tilepro_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 0)) & 0x3); |
} |
static __inline unsigned int |
get_UnOpcodeExtension_X0(tilepro_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 12)) & 0x1f); |
} |
static __inline unsigned int |
get_UnOpcodeExtension_X1(tilepro_bundle_bits n) |
{ |
return (((unsigned int)(n >> 43)) & 0x1f); |
} |
static __inline unsigned int |
get_UnOpcodeExtension_Y0(tilepro_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 12)) & 0x1f); |
} |
static __inline unsigned int |
get_UnOpcodeExtension_Y1(tilepro_bundle_bits n) |
{ |
return (((unsigned int)(n >> 43)) & 0x1f); |
} |
static __inline unsigned int |
get_UnShOpcodeExtension_X0(tilepro_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 17)) & 0x3ff); |
} |
static __inline unsigned int |
get_UnShOpcodeExtension_X1(tilepro_bundle_bits n) |
{ |
return (((unsigned int)(n >> 48)) & 0x3ff); |
} |
static __inline unsigned int |
get_UnShOpcodeExtension_Y0(tilepro_bundle_bits num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((n >> 17)) & 0x7); |
} |
static __inline unsigned int |
get_UnShOpcodeExtension_Y1(tilepro_bundle_bits n) |
{ |
return (((unsigned int)(n >> 48)) & 0x7); |
} |
static __inline int |
sign_extend(int n, int num_bits) |
{ |
int shift = (int)(sizeof(int) * 8 - num_bits); |
return (n << shift) >> shift; |
} |
static __inline tilepro_bundle_bits |
create_BrOff_SN(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x3ff) << 0); |
} |
static __inline tilepro_bundle_bits |
create_BrOff_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilepro_bundle_bits)(n & 0x00007fff)) << 43) | |
(((tilepro_bundle_bits)(n & 0x00018000)) << 20); |
} |
static __inline tilepro_bundle_bits |
create_BrType_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilepro_bundle_bits)(n & 0xf)) << 31); |
} |
static __inline tilepro_bundle_bits |
create_Dest_Imm8_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilepro_bundle_bits)(n & 0x0000003f)) << 31) | |
(((tilepro_bundle_bits)(n & 0x000000c0)) << 43); |
} |
static __inline tilepro_bundle_bits |
create_Dest_SN(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x3) << 2); |
} |
static __inline tilepro_bundle_bits |
create_Dest_X0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x3f) << 0); |
} |
static __inline tilepro_bundle_bits |
create_Dest_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilepro_bundle_bits)(n & 0x3f)) << 31); |
} |
static __inline tilepro_bundle_bits |
create_Dest_Y0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x3f) << 0); |
} |
static __inline tilepro_bundle_bits |
create_Dest_Y1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilepro_bundle_bits)(n & 0x3f)) << 31); |
} |
static __inline tilepro_bundle_bits |
create_Imm16_X0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0xffff) << 12); |
} |
static __inline tilepro_bundle_bits |
create_Imm16_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilepro_bundle_bits)(n & 0xffff)) << 43); |
} |
static __inline tilepro_bundle_bits |
create_Imm8_SN(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0xff) << 0); |
} |
static __inline tilepro_bundle_bits |
create_Imm8_X0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0xff) << 12); |
} |
static __inline tilepro_bundle_bits |
create_Imm8_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilepro_bundle_bits)(n & 0xff)) << 43); |
} |
static __inline tilepro_bundle_bits |
create_Imm8_Y0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0xff) << 12); |
} |
static __inline tilepro_bundle_bits |
create_Imm8_Y1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilepro_bundle_bits)(n & 0xff)) << 43); |
} |
static __inline tilepro_bundle_bits |
create_ImmOpcodeExtension_X0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x7f) << 20); |
} |
static __inline tilepro_bundle_bits |
create_ImmOpcodeExtension_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilepro_bundle_bits)(n & 0x7f)) << 51); |
} |
static __inline tilepro_bundle_bits |
create_ImmRROpcodeExtension_SN(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x3) << 8); |
} |
static __inline tilepro_bundle_bits |
create_JOffLong_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilepro_bundle_bits)(n & 0x00007fff)) << 43) | |
(((tilepro_bundle_bits)(n & 0x00018000)) << 20) | |
(((tilepro_bundle_bits)(n & 0x001e0000)) << 14) | |
(((tilepro_bundle_bits)(n & 0x07e00000)) << 16) | |
(((tilepro_bundle_bits)(n & 0x18000000)) << 31); |
} |
static __inline tilepro_bundle_bits |
create_JOff_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilepro_bundle_bits)(n & 0x00007fff)) << 43) | |
(((tilepro_bundle_bits)(n & 0x00018000)) << 20) | |
(((tilepro_bundle_bits)(n & 0x001e0000)) << 14) | |
(((tilepro_bundle_bits)(n & 0x07e00000)) << 16) | |
(((tilepro_bundle_bits)(n & 0x08000000)) << 31); |
} |
static __inline tilepro_bundle_bits |
create_MF_Imm15_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilepro_bundle_bits)(n & 0x00003fff)) << 37) | |
(((tilepro_bundle_bits)(n & 0x00004000)) << 44); |
} |
static __inline tilepro_bundle_bits |
create_MMEnd_X0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x1f) << 18); |
} |
static __inline tilepro_bundle_bits |
create_MMEnd_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilepro_bundle_bits)(n & 0x1f)) << 49); |
} |
static __inline tilepro_bundle_bits |
create_MMStart_X0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x1f) << 23); |
} |
static __inline tilepro_bundle_bits |
create_MMStart_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilepro_bundle_bits)(n & 0x1f)) << 54); |
} |
static __inline tilepro_bundle_bits |
create_MT_Imm15_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilepro_bundle_bits)(n & 0x0000003f)) << 31) | |
(((tilepro_bundle_bits)(n & 0x00003fc0)) << 37) | |
(((tilepro_bundle_bits)(n & 0x00004000)) << 44); |
} |
static __inline tilepro_bundle_bits |
create_Mode(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilepro_bundle_bits)(n & 0x1)) << 63); |
} |
static __inline tilepro_bundle_bits |
create_NoRegOpcodeExtension_SN(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0xf) << 0); |
} |
static __inline tilepro_bundle_bits |
create_Opcode_SN(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x3f) << 10); |
} |
static __inline tilepro_bundle_bits |
create_Opcode_X0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x7) << 28); |
} |
static __inline tilepro_bundle_bits |
create_Opcode_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilepro_bundle_bits)(n & 0xf)) << 59); |
} |
static __inline tilepro_bundle_bits |
create_Opcode_Y0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0xf) << 27); |
} |
static __inline tilepro_bundle_bits |
create_Opcode_Y1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilepro_bundle_bits)(n & 0xf)) << 59); |
} |
static __inline tilepro_bundle_bits |
create_Opcode_Y2(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilepro_bundle_bits)(n & 0x7)) << 56); |
} |
static __inline tilepro_bundle_bits |
create_RROpcodeExtension_SN(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0xf) << 4); |
} |
static __inline tilepro_bundle_bits |
create_RRROpcodeExtension_X0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x1ff) << 18); |
} |
static __inline tilepro_bundle_bits |
create_RRROpcodeExtension_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilepro_bundle_bits)(n & 0x1ff)) << 49); |
} |
static __inline tilepro_bundle_bits |
create_RRROpcodeExtension_Y0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x3) << 18); |
} |
static __inline tilepro_bundle_bits |
create_RRROpcodeExtension_Y1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilepro_bundle_bits)(n & 0x3)) << 49); |
} |
static __inline tilepro_bundle_bits |
create_RouteOpcodeExtension_SN(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x3ff) << 0); |
} |
static __inline tilepro_bundle_bits |
create_S_X0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x1) << 27); |
} |
static __inline tilepro_bundle_bits |
create_S_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilepro_bundle_bits)(n & 0x1)) << 58); |
} |
static __inline tilepro_bundle_bits |
create_ShAmt_X0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x1f) << 12); |
} |
static __inline tilepro_bundle_bits |
create_ShAmt_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilepro_bundle_bits)(n & 0x1f)) << 43); |
} |
static __inline tilepro_bundle_bits |
create_ShAmt_Y0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x1f) << 12); |
} |
static __inline tilepro_bundle_bits |
create_ShAmt_Y1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilepro_bundle_bits)(n & 0x1f)) << 43); |
} |
static __inline tilepro_bundle_bits |
create_SrcA_X0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x3f) << 6); |
} |
static __inline tilepro_bundle_bits |
create_SrcA_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilepro_bundle_bits)(n & 0x3f)) << 37); |
} |
static __inline tilepro_bundle_bits |
create_SrcA_Y0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x3f) << 6); |
} |
static __inline tilepro_bundle_bits |
create_SrcA_Y1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilepro_bundle_bits)(n & 0x3f)) << 37); |
} |
static __inline tilepro_bundle_bits |
create_SrcA_Y2(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x00000001) << 26) | |
(((tilepro_bundle_bits)(n & 0x0000003e)) << 50); |
} |
static __inline tilepro_bundle_bits |
create_SrcBDest_Y2(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x3f) << 20); |
} |
static __inline tilepro_bundle_bits |
create_SrcB_X0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x3f) << 12); |
} |
static __inline tilepro_bundle_bits |
create_SrcB_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilepro_bundle_bits)(n & 0x3f)) << 43); |
} |
static __inline tilepro_bundle_bits |
create_SrcB_Y0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x3f) << 12); |
} |
static __inline tilepro_bundle_bits |
create_SrcB_Y1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilepro_bundle_bits)(n & 0x3f)) << 43); |
} |
static __inline tilepro_bundle_bits |
create_Src_SN(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x3) << 0); |
} |
static __inline tilepro_bundle_bits |
create_UnOpcodeExtension_X0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x1f) << 12); |
} |
static __inline tilepro_bundle_bits |
create_UnOpcodeExtension_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilepro_bundle_bits)(n & 0x1f)) << 43); |
} |
static __inline tilepro_bundle_bits |
create_UnOpcodeExtension_Y0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x1f) << 12); |
} |
static __inline tilepro_bundle_bits |
create_UnOpcodeExtension_Y1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilepro_bundle_bits)(n & 0x1f)) << 43); |
} |
static __inline tilepro_bundle_bits |
create_UnShOpcodeExtension_X0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x3ff) << 17); |
} |
static __inline tilepro_bundle_bits |
create_UnShOpcodeExtension_X1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilepro_bundle_bits)(n & 0x3ff)) << 48); |
} |
static __inline tilepro_bundle_bits |
create_UnShOpcodeExtension_Y0(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return ((n & 0x7) << 17); |
} |
static __inline tilepro_bundle_bits |
create_UnShOpcodeExtension_Y1(int num) |
{ |
const unsigned int n = (unsigned int)num; |
return (((tilepro_bundle_bits)(n & 0x7)) << 48); |
} |
typedef enum |
{ |
TILEPRO_PIPELINE_X0, |
TILEPRO_PIPELINE_X1, |
TILEPRO_PIPELINE_Y0, |
TILEPRO_PIPELINE_Y1, |
TILEPRO_PIPELINE_Y2, |
} tilepro_pipeline; |
#define tilepro_is_x_pipeline(p) ((int)(p) <= (int)TILEPRO_PIPELINE_X1) |
typedef enum |
{ |
TILEPRO_OP_TYPE_REGISTER, |
TILEPRO_OP_TYPE_IMMEDIATE, |
TILEPRO_OP_TYPE_ADDRESS, |
TILEPRO_OP_TYPE_SPR |
} tilepro_operand_type; |
/* This is the bit that determines if a bundle is in the Y encoding. */ |
#define TILEPRO_BUNDLE_Y_ENCODING_MASK ((tilepro_bundle_bits)1 << 63) |
enum |
{ |
/* Maximum number of instructions in a bundle (2 for X, 3 for Y). */ |
TILEPRO_MAX_INSTRUCTIONS_PER_BUNDLE = 3, |
/* How many different pipeline encodings are there? X0, X1, Y0, Y1, Y2. */ |
TILEPRO_NUM_PIPELINE_ENCODINGS = 5, |
/* Log base 2 of TILEPRO_BUNDLE_SIZE_IN_BYTES. */ |
TILEPRO_LOG2_BUNDLE_SIZE_IN_BYTES = 3, |
/* Instructions take this many bytes. */ |
TILEPRO_BUNDLE_SIZE_IN_BYTES = 1 << TILEPRO_LOG2_BUNDLE_SIZE_IN_BYTES, |
/* Log base 2 of TILEPRO_BUNDLE_ALIGNMENT_IN_BYTES. */ |
TILEPRO_LOG2_BUNDLE_ALIGNMENT_IN_BYTES = 3, |
/* Bundles should be aligned modulo this number of bytes. */ |
TILEPRO_BUNDLE_ALIGNMENT_IN_BYTES = |
(1 << TILEPRO_LOG2_BUNDLE_ALIGNMENT_IN_BYTES), |
/* Log base 2 of TILEPRO_SN_INSTRUCTION_SIZE_IN_BYTES. */ |
TILEPRO_LOG2_SN_INSTRUCTION_SIZE_IN_BYTES = 1, |
/* Static network instructions take this many bytes. */ |
TILEPRO_SN_INSTRUCTION_SIZE_IN_BYTES = |
(1 << TILEPRO_LOG2_SN_INSTRUCTION_SIZE_IN_BYTES), |
/* Number of registers (some are magic, such as network I/O). */ |
TILEPRO_NUM_REGISTERS = 64, |
/* Number of static network registers. */ |
TILEPRO_NUM_SN_REGISTERS = 4 |
}; |
struct tilepro_operand |
{ |
/* Is this operand a register, immediate or address? */ |
tilepro_operand_type type; |
/* The default relocation type for this operand. */ |
signed int default_reloc : 16; |
/* How many bits is this value? (used for range checking) */ |
unsigned int num_bits : 5; |
/* Is the value signed? (used for range checking) */ |
unsigned int is_signed : 1; |
/* Is this operand a source register? */ |
unsigned int is_src_reg : 1; |
/* Is this operand written? (i.e. is it a destination register) */ |
unsigned int is_dest_reg : 1; |
/* Is this operand PC-relative? */ |
unsigned int is_pc_relative : 1; |
/* By how many bits do we right shift the value before inserting? */ |
unsigned int rightshift : 2; |
/* Return the bits for this operand to be ORed into an existing bundle. */ |
tilepro_bundle_bits (*insert) (int op); |
/* Extract this operand and return it. */ |
unsigned int (*extract) (tilepro_bundle_bits bundle); |
}; |
extern const struct tilepro_operand tilepro_operands[]; |
/* One finite-state machine per pipe for rapid instruction decoding. */ |
extern const unsigned short * const |
tilepro_bundle_decoder_fsms[TILEPRO_NUM_PIPELINE_ENCODINGS]; |
struct tilepro_opcode |
{ |
/* The opcode mnemonic, e.g. "add" */ |
const char *name; |
/* The enum value for this mnemonic. */ |
tilepro_mnemonic mnemonic; |
/* A bit mask of which of the five pipes this instruction |
is compatible with: |
X0 0x01 |
X1 0x02 |
Y0 0x04 |
Y1 0x08 |
Y2 0x10 */ |
unsigned char pipes; |
/* How many operands are there? */ |
unsigned char num_operands; |
/* Which register does this write implicitly, or TREG_ZERO if none? */ |
unsigned char implicitly_written_register; |
/* Can this be bundled with other instructions (almost always true). */ |
unsigned char can_bundle; |
/* The description of the operands. Each of these is an |
* index into the tilepro_operands[] table. */ |
unsigned char operands[TILEPRO_NUM_PIPELINE_ENCODINGS][TILEPRO_MAX_OPERANDS]; |
#if !defined(__KERNEL__) && !defined(_LIBC) |
/* A mask of which bits have predefined values for each pipeline. |
* This is useful for disassembly. */ |
tilepro_bundle_bits fixed_bit_masks[TILEPRO_NUM_PIPELINE_ENCODINGS]; |
/* For each bit set in fixed_bit_masks, what the value is for this |
* instruction. */ |
tilepro_bundle_bits fixed_bit_values[TILEPRO_NUM_PIPELINE_ENCODINGS]; |
#endif |
}; |
extern const struct tilepro_opcode tilepro_opcodes[]; |
#if !defined(__KERNEL__) && !defined(_LIBC) |
typedef unsigned short tilepro_sn_instruction_bits; |
struct tilepro_sn_opcode |
{ |
/* The opcode mnemonic, e.g. "add" */ |
const char *name; |
/* The enum value for this mnemonic. */ |
tilepro_sn_mnemonic mnemonic; |
/* How many operands are there? */ |
unsigned char num_operands; |
/* The description of the operands. Each of these is an |
* index into the tilepro_operands[] table. */ |
unsigned char operands[TILEPRO_SN_MAX_OPERANDS]; |
/* A mask of which bits have predefined values. |
* This is useful for disassembly. */ |
tilepro_sn_instruction_bits fixed_bit_mask; |
/* For each bit set in fixed_bit_masks, what its value is. */ |
tilepro_sn_instruction_bits fixed_bit_values; |
}; |
extern const struct tilepro_sn_opcode tilepro_sn_opcodes[]; |
#endif /* !__KERNEL__ && !_LIBC */ |
/* Used for non-textual disassembly into structs. */ |
struct tilepro_decoded_instruction |
{ |
const struct tilepro_opcode *opcode; |
const struct tilepro_operand *operands[TILEPRO_MAX_OPERANDS]; |
int operand_values[TILEPRO_MAX_OPERANDS]; |
}; |
/* Disassemble a bundle into a struct for machine processing. */ |
extern int parse_insn_tilepro(tilepro_bundle_bits bits, |
unsigned int pc, |
struct tilepro_decoded_instruction |
decoded[TILEPRO_MAX_INSTRUCTIONS_PER_BUNDLE]); |
/* Given a set of bundle bits and a specific pipe, returns which |
* instruction the bundle contains in that pipe. |
*/ |
extern const struct tilepro_opcode * |
find_opcode(tilepro_bundle_bits bits, tilepro_pipeline pipe); |
#if !defined(__KERNEL__) && !defined(_LIBC) |
/* Canonical names of all the registers. */ |
/* ISSUE: This table lives in "tilepro-dis.c" */ |
extern const char * const tilepro_register_names[]; |
/* Descriptor for a special-purpose register. */ |
struct tilepro_spr |
{ |
/* The number */ |
int number; |
/* The name */ |
const char *name; |
}; |
/* List of all the SPRs; ordered by increasing number. */ |
extern const struct tilepro_spr tilepro_sprs[]; |
/* Number of special-purpose registers. */ |
extern const int tilepro_num_sprs; |
extern const char * |
get_tilepro_spr_name (int num); |
#endif /* !__KERNEL__ && !_LIBC */ |
/* Make a few "tile_" variables to simply common code between |
architectures. */ |
typedef tilepro_bundle_bits tile_bundle_bits; |
#define TILE_BUNDLE_SIZE_IN_BYTES TILEPRO_BUNDLE_SIZE_IN_BYTES |
#define TILE_BUNDLE_ALIGNMENT_IN_BYTES TILEPRO_BUNDLE_ALIGNMENT_IN_BYTES |
#define TILE_LOG2_BUNDLE_ALIGNMENT_IN_BYTES \ |
TILEPRO_LOG2_BUNDLE_ALIGNMENT_IN_BYTES |
#endif /* opcode_tilepro_h */ |
/contrib/toolchain/binutils/include/opcode/v850.h |
---|
0,0 → 1,240 |
/* v850.h -- Header file for NEC V850 opcode table |
Copyright 1996-2013 Free Software Foundation, Inc. |
Written by J.T. Conklin, Cygnus Support |
This file is part of GDB, GAS, and the GNU binutils. |
GDB, GAS, and the GNU binutils are free software; you can redistribute |
them and/or modify them under the terms of the GNU General Public |
License as published by the Free Software Foundation; either version 3, |
or (at your option) any later version. |
GDB, GAS, and the GNU binutils are distributed in the hope that they |
will be useful, but WITHOUT ANY WARRANTY; without even the implied |
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See |
the GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this file; see the file COPYING3. If not, write to the Free |
Software Foundation, 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef V850_H |
#define V850_H |
/* The opcode table is an array of struct v850_opcode. */ |
struct v850_opcode |
{ |
/* The opcode name. */ |
const char *name; |
/* The opcode itself. Those bits which will be filled in with |
operands are zeroes. */ |
unsigned long opcode; |
/* The opcode mask. This is used by the disassembler. This is a |
mask containing ones indicating those bits which must match the |
opcode field, and zeroes indicating those bits which need not |
match (and are presumably filled in by operands). */ |
unsigned long mask; |
/* An array of operand codes. Each code is an index into the |
operand table. They appear in the order which the operands must |
appear in assembly code, and are terminated by a zero. */ |
unsigned char operands[8]; |
/* Which (if any) operand is a memory operand. */ |
unsigned int memop; |
/* Target processor(s). A bit field of processors which support |
this instruction. Note a bit field is used as some instructions |
are available on multiple, different processor types, whereas |
other instructions are only available on one specific type. */ |
unsigned int processors; |
}; |
/* Values for architecture number. */ |
#define arch_V850 0 |
#define arch_V850E (arch_V850 + 1) |
#define arch_V850E1 (arch_V850E + 1) |
#define arch_V850E2 (arch_V850E1 + 1) |
#define arch_V850E2V3 (arch_V850E2 + 1) |
#define arch_V850E3V5 (arch_V850E2V3 + 1) |
#define arch_separator (arch_V850E3V5 + 1) |
#define opt_EXTENSION (arch_separator) |
#define opt_ALIAS (opt_EXTENSION + 1) |
/* Values for the processors field in the v850_opcode structure. */ |
#define PROCESSOR_V850 (1 << (arch_V850)) /* Just the V850. */ |
#define PROCESSOR_V850E (1 << (arch_V850E)) /* Just the V850E. */ |
#define PROCESSOR_V850E1 (1 << (arch_V850E1)) /* Just the V850E1. */ |
#define PROCESSOR_V850E2 (1 << (arch_V850E2)) /* Just the V850E2. */ |
#define PROCESSOR_V850E2V3 (1 << (arch_V850E2V3)) /* Just the V850E2V3. */ |
#define PROCESSOR_V850E3V5 (1 << (arch_V850E3V5)) /* Just the V850E3V5. */ |
/* UPPERS */ |
#define PROCESSOR_V850E3V5_UP (PROCESSOR_V850E3V5) |
#define PROCESSOR_V850E2V3_UP (PROCESSOR_V850E2V3 | PROCESSOR_V850E3V5_UP) |
#define PROCESSOR_V850E2_UP (PROCESSOR_V850E2 | PROCESSOR_V850E2V3_UP) |
#define PROCESSOR_V850E_UP (PROCESSOR_V850E | PROCESSOR_V850E1 | PROCESSOR_V850E2_UP) |
#define PROCESSOR_ALL (PROCESSOR_V850 | PROCESSOR_V850E_UP) |
#define PROCESSOR_MASK (PROCESSOR_ALL) |
#define PROCESSOR_NOT_V850 (PROCESSOR_ALL & (~ PROCESSOR_V850)) /* Any processor except the V850. */ |
#define PROCESSOR_UNKNOWN ~(PROCESSOR_MASK) |
/* OPTIONS */ |
#define PROCESSOR_OPTION_EXTENSION (1 << (opt_EXTENSION)) /* Enable extension opcodes. */ |
#define PROCESSOR_OPTION_ALIAS (1 << (opt_ALIAS)) /* Enable alias opcodes. */ |
#define SET_PROCESSOR_MASK(mask,set) ((mask) = ((mask) & ~PROCESSOR_MASK) | (set)) |
/* The table itself is sorted by major opcode number, and is otherwise |
in the order in which the disassembler should consider |
instructions. */ |
extern const struct v850_opcode v850_opcodes[]; |
extern const int v850_num_opcodes; |
/* The operands table is an array of struct v850_operand. */ |
struct v850_operand |
{ |
/* The number of bits in the operand. */ |
/* If this value is -1 then the operand's bits are in a discontinous |
distribution in the instruction. */ |
int bits; |
/* (bits >= 0): How far the operand is left shifted in the instruction. */ |
/* (bits == -1): Bit mask of the bits in the operand. */ |
int shift; |
/* Insertion function. This is used by the assembler. To insert an |
operand value into an instruction, check this field. |
If it is NULL, execute |
i |= (op & ((1 << o->bits) - 1)) << o->shift; |
(i is the instruction which we are filling in, o is a pointer to |
this structure, and op is the opcode value; this assumes twos |
complement arithmetic). |
If this field is not NULL, then simply call it with the |
instruction and the operand value. It will return the new value |
of the instruction. If the ERRMSG argument is not NULL, then if |
the operand value is illegal, *ERRMSG will be set to a warning |
string (the operand will be inserted in any case). If the |
operand value is legal, *ERRMSG will be unchanged (most operands |
can accept any value). */ |
unsigned long (* insert) |
(unsigned long instruction, long op, const char ** errmsg); |
/* Extraction function. This is used by the disassembler. To |
extract this operand type from an instruction, check this field. |
If it is NULL, compute |
op = o->bits == -1 ? ((i) & o->shift) : ((i) >> o->shift) & ((1 << o->bits) - 1); |
if (o->flags & V850_OPERAND_SIGNED) |
op = (op << (32 - o->bits)) >> (32 - o->bits); |
(i is the instruction, o is a pointer to this structure, and op |
is the result; this assumes twos complement arithmetic). |
If this field is not NULL, then simply call it with the |
instruction value. It will return the value of the operand. If |
the INVALID argument is not NULL, *INVALID will be set to |
non-zero if this operand type can not actually be extracted from |
this operand (i.e., the instruction does not match). If the |
operand is valid, *INVALID will not be changed. */ |
unsigned long (* extract) (unsigned long instruction, int * invalid); |
/* One bit syntax flags. */ |
int flags; |
int default_reloc; |
}; |
/* Elements in the table are retrieved by indexing with values from |
the operands field of the v850_opcodes table. */ |
extern const struct v850_operand v850_operands[]; |
/* Values defined for the flags field of a struct v850_operand. */ |
/* This operand names a general purpose register. */ |
#define V850_OPERAND_REG 0x01 |
/* This operand is the ep register. */ |
#define V850_OPERAND_EP 0x02 |
/* This operand names a system register. */ |
#define V850_OPERAND_SRG 0x04 |
/* Prologue eilogue type instruction, V850E specific. */ |
#define V850E_OPERAND_REG_LIST 0x08 |
/* This operand names a condition code used in the setf instruction. */ |
#define V850_OPERAND_CC 0x10 |
#define V850_OPERAND_FLOAT_CC 0x20 |
/* This operand names a vector purpose register. */ |
#define V850_OPERAND_VREG 0x40 |
/* 16 bit immediate follows instruction, V850E specific. */ |
#define V850E_IMMEDIATE16 0x80 |
/* hi16 bit immediate follows instruction, V850E specific. */ |
#define V850E_IMMEDIATE16HI 0x100 |
/* 23 bit immediate follows instruction, V850E specific. */ |
#define V850E_IMMEDIATE23 0x200 |
/* 32 bit immediate follows instruction, V850E specific. */ |
#define V850E_IMMEDIATE32 0x400 |
/* This is a relaxable operand. Only used for D9->D22 branch relaxing |
right now. We may need others in the future (or maybe handle them like |
promoted operands on the mn10300?). */ |
#define V850_OPERAND_RELAX 0x800 |
/* This operand takes signed values. */ |
#define V850_OPERAND_SIGNED 0x1000 |
/* This operand is a displacement. */ |
#define V850_OPERAND_DISP 0x2000 |
/* This operand is a PC displacement. */ |
#define V850_PCREL 0x4000 |
/* The register specified must be even number. */ |
#define V850_REG_EVEN 0x8000 |
/* The register specified must not be r0. */ |
#define V850_NOT_R0 0x20000 |
/* The register specified must not be 0. */ |
#define V850_NOT_IMM0 0x40000 |
/* The condition code must not be SA CONDITION. */ |
#define V850_NOT_SA 0x80000 |
/* The operand has '!' prefix. */ |
#define V850_OPERAND_BANG 0x100000 |
/* The operand has '%' prefix. */ |
#define V850_OPERAND_PERCENT 0x200000 |
/* This operand is a cache oparation. */ |
#define V850_OPERAND_CACHEOP 0x400000 |
/* This operand is a prefetch oparation. */ |
#define V850_OPERAND_PREFOP 0x800000 |
/* A PC-relative displacement where a positive value indicates a backwards displacement. */ |
#define V850_INVERSE_PCREL 0x1000000 |
extern int v850_msg_is_out_of_range (const char *); |
#endif /* V850_H */ |
/contrib/toolchain/binutils/include/opcode/vax.h |
---|
0,0 → 1,383 |
/* Vax opcde list. |
Copyright 1989, 1991, 1992, 1995, 2010 Free Software Foundation, Inc. |
This file is part of GDB and GAS. |
GDB and GAS are free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3, or (at your option) |
any later version. |
GDB and GAS are distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with GDB or GAS; see the file COPYING3. If not, write to |
the Free Software Foundation, 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
#ifndef vax_opcodeT |
#define vax_opcodeT int |
#endif /* no vax_opcodeT */ |
struct vot_wot /* vax opcode table: wot to do with this */ |
/* particular opcode */ |
{ |
const char *args; /* how to compile said opcode */ |
vax_opcodeT code; /* op-code (may be > 8 bits!) */ |
}; |
struct vot /* vax opcode text */ |
{ |
const char *name; /* opcode name: lowercase string [key] */ |
struct vot_wot detail; /* rest of opcode table [datum] */ |
}; |
#define vot_how args |
#define vot_code code |
#define vot_detail detail |
#define vot_name name |
static const struct vot |
votstrs[] = |
{ |
{ "halt", {"", 0x00 } }, |
{ "nop", {"", 0x01 } }, |
{ "rei", {"", 0x02 } }, |
{ "bpt", {"", 0x03 } }, |
{ "ret", {"", 0x04 } }, |
{ "rsb", {"", 0x05 } }, |
{ "ldpctx", {"", 0x06 } }, |
{ "svpctx", {"", 0x07 } }, |
{ "cvtps", {"rwabrwab", 0x08 } }, |
{ "cvtsp", {"rwabrwab", 0x09 } }, |
{ "index", {"rlrlrlrlrlwl", 0x0a } }, |
{ "crc", {"abrlrwab", 0x0b } }, |
{ "prober", {"rbrwab", 0x0c } }, |
{ "probew", {"rbrwab", 0x0d } }, |
{ "insque", {"abab", 0x0e } }, |
{ "remque", {"abwl", 0x0f } }, |
{ "bsbb", {"bb", 0x10 } }, |
{ "brb", {"bb", 0x11 } }, |
{ "bneq", {"bb", 0x12 } }, |
{ "bnequ", {"bb", 0x12 } }, |
{ "beql", {"bb", 0x13 } }, |
{ "beqlu", {"bb", 0x13 } }, |
{ "bgtr", {"bb", 0x14 } }, |
{ "bleq", {"bb", 0x15 } }, |
{ "jsb", {"ab", 0x16 } }, |
{ "jmp", {"ab", 0x17 } }, |
{ "bgeq", {"bb", 0x18 } }, |
{ "blss", {"bb", 0x19 } }, |
{ "bgtru", {"bb", 0x1a } }, |
{ "blequ", {"bb", 0x1b } }, |
{ "bvc", {"bb", 0x1c } }, |
{ "bvs", {"bb", 0x1d } }, |
{ "bcc", {"bb", 0x1e } }, |
{ "bgequ", {"bb", 0x1e } }, |
{ "blssu", {"bb", 0x1f } }, |
{ "bcs", {"bb", 0x1f } }, |
{ "addp4", {"rwabrwab", 0x20 } }, |
{ "addp6", {"rwabrwabrwab", 0x21 } }, |
{ "subp4", {"rwabrwab", 0x22 } }, |
{ "subp6", {"rwabrwabrwab", 0x23 } }, |
{ "cvtpt", {"rwababrwab", 0x24 } }, |
{ "mulp", {"rwabrwabrwab", 0x25 } }, |
{ "cvttp", {"rwababrwab", 0x26 } }, |
{ "divp", {"rwabrwabrwab", 0x27 } }, |
{ "movc3", {"rwabab", 0x28 } }, |
{ "cmpc3", {"rwabab", 0x29 } }, |
{ "scanc", {"rwababrb", 0x2a } }, |
{ "spanc", {"rwababrb", 0x2b } }, |
{ "movc5", {"rwabrbrwab", 0x2c } }, |
{ "cmpc5", {"rwabrbrwab", 0x2d } }, |
{ "movtc", {"rwabrbabrwab", 0x2e } }, |
{ "movtuc", {"rwabrbabrwab", 0x2f } }, |
{ "bsbw", {"bw", 0x30 } }, |
{ "brw", {"bw", 0x31 } }, |
{ "cvtwl", {"rwwl", 0x32 } }, |
{ "cvtwb", {"rwwb", 0x33 } }, |
{ "movp", {"rwabab", 0x34 } }, |
{ "cmpp3", {"rwabab", 0x35 } }, |
{ "cvtpl", {"rwabwl", 0x36 } }, |
{ "cmpp4", {"rwabrwab", 0x37 } }, |
{ "editpc", {"rwababab", 0x38 } }, |
{ "matchc", {"rwabrwab", 0x39 } }, |
{ "locc", {"rbrwab", 0x3a } }, |
{ "skpc", {"rbrwab", 0x3b } }, |
{ "movzwl", {"rwwl", 0x3c } }, |
{ "acbw", {"rwrwmwbw", 0x3d } }, |
{ "movaw", {"awwl", 0x3e } }, |
{ "pushaw", {"aw", 0x3f } }, |
{ "addf2", {"rfmf", 0x40 } }, |
{ "addf3", {"rfrfwf", 0x41 } }, |
{ "subf2", {"rfmf", 0x42 } }, |
{ "subf3", {"rfrfwf", 0x43 } }, |
{ "mulf2", {"rfmf", 0x44 } }, |
{ "mulf3", {"rfrfwf", 0x45 } }, |
{ "divf2", {"rfmf", 0x46 } }, |
{ "divf3", {"rfrfwf", 0x47 } }, |
{ "cvtfb", {"rfwb", 0x48 } }, |
{ "cvtfw", {"rfww", 0x49 } }, |
{ "cvtfl", {"rfwl", 0x4a } }, |
{ "cvtrfl", {"rfwl", 0x4b } }, |
{ "cvtbf", {"rbwf", 0x4c } }, |
{ "cvtwf", {"rwwf", 0x4d } }, |
{ "cvtlf", {"rlwf", 0x4e } }, |
{ "acbf", {"rfrfmfbw", 0x4f } }, |
{ "movf", {"rfwf", 0x50 } }, |
{ "cmpf", {"rfrf", 0x51 } }, |
{ "mnegf", {"rfwf", 0x52 } }, |
{ "tstf", {"rf", 0x53 } }, |
{ "emodf", {"rfrbrfwlwf", 0x54 } }, |
{ "polyf", {"rfrwab", 0x55 } }, |
{ "cvtfd", {"rfwd", 0x56 } }, |
/* opcode 57 is not defined yet */ |
{ "adawi", {"rwmw", 0x58 } }, |
/* opcode 59 is not defined yet */ |
/* opcode 5a is not defined yet */ |
/* opcode 5b is not defined yet */ |
{ "insqhi", {"abaq", 0x5c } }, |
{ "insqti", {"abaq", 0x5d } }, |
{ "remqhi", {"aqwl", 0x5e } }, |
{ "remqti", {"aqwl", 0x5f } }, |
{ "addd2", {"rdmd", 0x60 } }, |
{ "addd3", {"rdrdwd", 0x61 } }, |
{ "subd2", {"rdmd", 0x62 } }, |
{ "subd3", {"rdrdwd", 0x63 } }, |
{ "muld2", {"rdmd", 0x64 } }, |
{ "muld3", {"rdrdwd", 0x65 } }, |
{ "divd2", {"rdmd", 0x66 } }, |
{ "divd3", {"rdrdwd", 0x67 } }, |
{ "cvtdb", {"rdwb", 0x68 } }, |
{ "cvtdw", {"rdww", 0x69 } }, |
{ "cvtdl", {"rdwl", 0x6a } }, |
{ "cvtrdl", {"rdwl", 0x6b } }, |
{ "cvtbd", {"rbwd", 0x6c } }, |
{ "cvtwd", {"rwwd", 0x6d } }, |
{ "cvtld", {"rlwd", 0x6e } }, |
{ "acbd", {"rdrdmdbw", 0x6f } }, |
{ "movd", {"rdwd", 0x70 } }, |
{ "cmpd", {"rdrd", 0x71 } }, |
{ "mnegd", {"rdwd", 0x72 } }, |
{ "tstd", {"rd", 0x73 } }, |
{ "emodd", {"rdrbrdwlwd", 0x74 } }, |
{ "polyd", {"rdrwab", 0x75 } }, |
{ "cvtdf", {"rdwf", 0x76 } }, |
/* opcode 77 is not defined yet */ |
{ "ashl", {"rbrlwl", 0x78 } }, |
{ "ashq", {"rbrqwq", 0x79 } }, |
{ "emul", {"rlrlrlwq", 0x7a } }, |
{ "ediv", {"rlrqwlwl", 0x7b } }, |
{ "clrd", {"wd", 0x7c } }, |
{ "clrg", {"wg", 0x7c } }, |
{ "clrq", {"wd", 0x7c } }, |
{ "movq", {"rqwq", 0x7d } }, |
{ "movaq", {"aqwl", 0x7e } }, |
{ "movad", {"adwl", 0x7e } }, |
{ "pushaq", {"aq", 0x7f } }, |
{ "pushad", {"ad", 0x7f } }, |
{ "addb2", {"rbmb", 0x80 } }, |
{ "addb3", {"rbrbwb", 0x81 } }, |
{ "subb2", {"rbmb", 0x82 } }, |
{ "subb3", {"rbrbwb", 0x83 } }, |
{ "mulb2", {"rbmb", 0x84 } }, |
{ "mulb3", {"rbrbwb", 0x85 } }, |
{ "divb2", {"rbmb", 0x86 } }, |
{ "divb3", {"rbrbwb", 0x87 } }, |
{ "bisb2", {"rbmb", 0x88 } }, |
{ "bisb3", {"rbrbwb", 0x89 } }, |
{ "bicb2", {"rbmb", 0x8a } }, |
{ "bicb3", {"rbrbwb", 0x8b } }, |
{ "xorb2", {"rbmb", 0x8c } }, |
{ "xorb3", {"rbrbwb", 0x8d } }, |
{ "mnegb", {"rbwb", 0x8e } }, |
{ "caseb", {"rbrbrb", 0x8f } }, |
{ "movb", {"rbwb", 0x90 } }, |
{ "cmpb", {"rbrb", 0x91 } }, |
{ "mcomb", {"rbwb", 0x92 } }, |
{ "bitb", {"rbrb", 0x93 } }, |
{ "clrb", {"wb", 0x94 } }, |
{ "tstb", {"rb", 0x95 } }, |
{ "incb", {"mb", 0x96 } }, |
{ "decb", {"mb", 0x97 } }, |
{ "cvtbl", {"rbwl", 0x98 } }, |
{ "cvtbw", {"rbww", 0x99 } }, |
{ "movzbl", {"rbwl", 0x9a } }, |
{ "movzbw", {"rbww", 0x9b } }, |
{ "rotl", {"rbrlwl", 0x9c } }, |
{ "acbb", {"rbrbmbbw", 0x9d } }, |
{ "movab", {"abwl", 0x9e } }, |
{ "pushab", {"ab", 0x9f } }, |
{ "addw2", {"rwmw", 0xa0 } }, |
{ "addw3", {"rwrwww", 0xa1 } }, |
{ "subw2", {"rwmw", 0xa2 } }, |
{ "subw3", {"rwrwww", 0xa3 } }, |
{ "mulw2", {"rwmw", 0xa4 } }, |
{ "mulw3", {"rwrwww", 0xa5 } }, |
{ "divw2", {"rwmw", 0xa6 } }, |
{ "divw3", {"rwrwww", 0xa7 } }, |
{ "bisw2", {"rwmw", 0xa8 } }, |
{ "bisw3", {"rwrwww", 0xa9 } }, |
{ "bicw2", {"rwmw", 0xaa } }, |
{ "bicw3", {"rwrwww", 0xab } }, |
{ "xorw2", {"rwmw", 0xac } }, |
{ "xorw3", {"rwrwww", 0xad } }, |
{ "mnegw", {"rwww", 0xae } }, |
{ "casew", {"rwrwrw", 0xaf } }, |
{ "movw", {"rwww", 0xb0 } }, |
{ "cmpw", {"rwrw", 0xb1 } }, |
{ "mcomw", {"rwww", 0xb2 } }, |
{ "bitw", {"rwrw", 0xb3 } }, |
{ "clrw", {"ww", 0xb4 } }, |
{ "tstw", {"rw", 0xb5 } }, |
{ "incw", {"mw", 0xb6 } }, |
{ "decw", {"mw", 0xb7 } }, |
{ "bispsw", {"rw", 0xb8 } }, |
{ "bicpsw", {"rw", 0xb9 } }, |
{ "popr", {"rw", 0xba } }, |
{ "pushr", {"rw", 0xbb } }, |
{ "chmk", {"rw", 0xbc } }, |
{ "chme", {"rw", 0xbd } }, |
{ "chms", {"rw", 0xbe } }, |
{ "chmu", {"rw", 0xbf } }, |
{ "addl2", {"rlml", 0xc0 } }, |
{ "addl3", {"rlrlwl", 0xc1 } }, |
{ "subl2", {"rlml", 0xc2 } }, |
{ "subl3", {"rlrlwl", 0xc3 } }, |
{ "mull2", {"rlml", 0xc4 } }, |
{ "mull3", {"rlrlwl", 0xc5 } }, |
{ "divl2", {"rlml", 0xc6 } }, |
{ "divl3", {"rlrlwl", 0xc7 } }, |
{ "bisl2", {"rlml", 0xc8 } }, |
{ "bisl3", {"rlrlwl", 0xc9 } }, |
{ "bicl2", {"rlml", 0xca } }, |
{ "bicl3", {"rlrlwl", 0xcb } }, |
{ "xorl2", {"rlml", 0xcc } }, |
{ "xorl3", {"rlrlwl", 0xcd } }, |
{ "mnegl", {"rlwl", 0xce } }, |
{ "casel", {"rlrlrl", 0xcf } }, |
{ "movl", {"rlwl", 0xd0 } }, |
{ "cmpl", {"rlrl", 0xd1 } }, |
{ "mcoml", {"rlwl", 0xd2 } }, |
{ "bitl", {"rlrl", 0xd3 } }, |
{ "clrf", {"wf", 0xd4 } }, |
{ "clrl", {"wl", 0xd4 } }, |
{ "tstl", {"rl", 0xd5 } }, |
{ "incl", {"ml", 0xd6 } }, |
{ "decl", {"ml", 0xd7 } }, |
{ "adwc", {"rlml", 0xd8 } }, |
{ "sbwc", {"rlml", 0xd9 } }, |
{ "mtpr", {"rlrl", 0xda } }, |
{ "mfpr", {"rlwl", 0xdb } }, |
{ "movpsl", {"wl", 0xdc } }, |
{ "pushl", {"rl", 0xdd } }, |
{ "moval", {"alwl", 0xde } }, |
{ "movaf", {"afwl", 0xde } }, |
{ "pushal", {"al", 0xdf } }, |
{ "pushaf", {"af", 0xdf } }, |
{ "bbs", {"rlvbbb", 0xe0 } }, |
{ "bbc", {"rlvbbb", 0xe1 } }, |
{ "bbss", {"rlvbbb", 0xe2 } }, |
{ "bbcs", {"rlvbbb", 0xe3 } }, |
{ "bbsc", {"rlvbbb", 0xe4 } }, |
{ "bbcc", {"rlvbbb", 0xe5 } }, |
{ "bbssi", {"rlvbbb", 0xe6 } }, |
{ "bbcci", {"rlvbbb", 0xe7 } }, |
{ "blbs", {"rlbb", 0xe8 } }, |
{ "blbc", {"rlbb", 0xe9 } }, |
{ "ffs", {"rlrbvbwl", 0xea } }, |
{ "ffc", {"rlrbvbwl", 0xeb } }, |
{ "cmpv", {"rlrbvbrl", 0xec } }, |
{ "cmpzv", {"rlrbvbrl", 0xed } }, |
{ "extv", {"rlrbvbwl", 0xee } }, |
{ "extzv", {"rlrbvbwl", 0xef } }, |
{ "insv", {"rlrlrbvb", 0xf0 } }, |
{ "acbl", {"rlrlmlbw", 0xf1 } }, |
{ "aoblss", {"rlmlbb", 0xf2 } }, |
{ "aobleq", {"rlmlbb", 0xf3 } }, |
{ "sobgeq", {"mlbb", 0xf4 } }, |
{ "sobgtr", {"mlbb", 0xf5 } }, |
{ "cvtlb", {"rlwb", 0xf6 } }, |
{ "cvtlw", {"rlww", 0xf7 } }, |
{ "ashp", {"rbrwabrbrwab", 0xf8 } }, |
{ "cvtlp", {"rlrwab", 0xf9 } }, |
{ "callg", {"abab", 0xfa } }, |
{ "calls", {"rlab", 0xfb } }, |
{ "xfc", {"", 0xfc } }, |
/* undefined opcodes here */ |
{ "cvtdh", {"rdwh", 0x32fd } }, |
{ "cvtgf", {"rgwh", 0x33fd } }, |
{ "addg2", {"rgmg", 0x40fd } }, |
{ "addg3", {"rgrgwg", 0x41fd } }, |
{ "subg2", {"rgmg", 0x42fd } }, |
{ "subg3", {"rgrgwg", 0x43fd } }, |
{ "mulg2", {"rgmg", 0x44fd } }, |
{ "mulg3", {"rgrgwg", 0x45fd } }, |
{ "divg2", {"rgmg", 0x46fd } }, |
{ "divg3", {"rgrgwg", 0x47fd } }, |
{ "cvtgb", {"rgwb", 0x48fd } }, |
{ "cvtgw", {"rgww", 0x49fd } }, |
{ "cvtgl", {"rgwl", 0x4afd } }, |
{ "cvtrgl", {"rgwl", 0x4bfd } }, |
{ "cvtbg", {"rbwg", 0x4cfd } }, |
{ "cvtwg", {"rwwg", 0x4dfd } }, |
{ "cvtlg", {"rlwg", 0x4efd } }, |
{ "acbg", {"rgrgmgbw", 0x4ffd } }, |
{ "movg", {"rgwg", 0x50fd } }, |
{ "cmpg", {"rgrg", 0x51fd } }, |
{ "mnegg", {"rgwg", 0x52fd } }, |
{ "tstg", {"rg", 0x53fd } }, |
{ "emodg", {"rgrwrgwlwg", 0x54fd } }, |
{ "polyg", {"rgrwab", 0x55fd } }, |
{ "cvtgh", {"rgwh", 0x56fd } }, |
/* undefined opcodes here */ |
{ "addh2", {"rhmh", 0x60fd } }, |
{ "addh3", {"rhrhwh", 0x61fd } }, |
{ "subh2", {"rhmh", 0x62fd } }, |
{ "subh3", {"rhrhwh", 0x63fd } }, |
{ "mulh2", {"rhmh", 0x64fd } }, |
{ "mulh3", {"rhrhwh", 0x65fd } }, |
{ "divh2", {"rhmh", 0x66fd } }, |
{ "divh3", {"rhrhwh", 0x67fd } }, |
{ "cvthb", {"rhwb", 0x68fd } }, |
{ "cvthw", {"rhww", 0x69fd } }, |
{ "cvthl", {"rhwl", 0x6afd } }, |
{ "cvtrhl", {"rhwl", 0x6bfd } }, |
{ "cvtbh", {"rbwh", 0x6cfd } }, |
{ "cvtwh", {"rwwh", 0x6dfd } }, |
{ "cvtlh", {"rlwh", 0x6efd } }, |
{ "acbh", {"rhrhmhbw", 0x6ffd } }, |
{ "movh", {"rhwh", 0x70fd } }, |
{ "cmph", {"rhrh", 0x71fd } }, |
{ "mnegh", {"rhwh", 0x72fd } }, |
{ "tsth", {"rh", 0x73fd } }, |
{ "emodh", {"rhrwrhwlwh", 0x74fd } }, |
{ "polyh", {"rhrwab", 0x75fd } }, |
{ "cvthg", {"rhwg", 0x76fd } }, |
/* undefined opcodes here */ |
{ "clrh", {"wh", 0x7cfd } }, |
{ "clro", {"wo", 0x7cfd } }, |
{ "movo", {"rowo", 0x7dfd } }, |
{ "movah", {"ahwl", 0x7efd } }, |
{ "movao", {"aowl", 0x7efd } }, |
{ "pushah", {"ah", 0x7ffd } }, |
{ "pushao", {"ao", 0x7ffd } }, |
/* undefined opcodes here */ |
{ "cvtfh", {"rfwh", 0x98fd } }, |
{ "cvtfg", {"rfwg", 0x99fd } }, |
/* undefined opcodes here */ |
{ "cvthf", {"rhwf", 0xf6fd } }, |
{ "cvthd", {"rhwd", 0xf7fd } }, |
/* undefined opcodes here */ |
{ "bugl", {"rl", 0xfdff } }, |
{ "bugw", {"rw", 0xfeff } }, |
/* undefined opcodes here */ |
{ "", {"", 0} } /* empty is end sentinel */ |
}; /* votstrs */ |
/* end: vax.opcode.h */ |
/contrib/toolchain/binutils/include/opcode/xgate.h |
---|
0,0 → 1,120 |
/* xgate.h -- Freescale XGATE opcode list |
Copyright 2010, 2011, 2012 Free Software Foundation, Inc. |
Written by Sean Keys (skeys@ipdatasys.com) |
This file is part of the GNU opcodes library. |
This library is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3, or (at your option) |
any later version. |
It is distributed in the hope that it will be useful, but WITHOUT |
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY |
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public |
License for more details. |
You should have received a copy of the GNU General Public License |
along with this file; see the file COPYING. If not, write to the |
Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _OPCODE_XGATE_H |
#define _OPCODE_XGATE_H |
/* XGATE CCR flag definitions. */ |
#define XGATE_N_BIT 0x08 /* XGN - Sign Flag */ |
#define XGATE_Z_BIT 0x04 /* XGZ - Zero Flag */ |
#define XGATE_V_BIT 0x02 /* XGV - Overflow Flag */ |
#define XGATE_C_BIT 0x01 /* XGC - Carry Flag */ |
/* Access Detail Notation |
V — Vector fetch: always an aligned word read, lasts for at least one RISC core cycle |
P — Program word fetch: always an aligned word read, lasts for at least one RISC core cycle |
r — 8-bit data read: lasts for at least one RISC core cycle |
R — 16-bit data read: lasts for at least one RISC core cycle |
w — 8-bit data write: lasts for at least one RISC core cycle |
W — 16-bit data write: lasts for at least one RISC core cycle |
A — Alignment cycle: no read or write, lasts for zero or one RISC core cycles |
f — Free cycle: no read or write, lasts for one RISC core cycles. */ |
#define XGATE_CYCLE_V 0x01 |
#define XGATE_CYCLE_P 0x02 |
#define XGATE_CYCLE_r 0x04 |
#define XGATE_CYCLE_R 0x08 |
#define XGATE_CYCLE_w 0x10 |
#define XGATE_CYCLE_W 0x20 |
#define XGATE_CYCLE_A 0x40 |
#define XGATE_CYCLE_f 0x80 |
/* Opcode format abbreviations. */ |
#define XG_INH 0x0001 /* Inherent. */ |
#define XG_I 0x0002 /* 3-bit immediate address. */ |
#define XG_R_I 0x0004 /* Register followed by 4/8-bit immediate value. */ |
#define XG_R_R 0x0008 /* Register followed by a register. */ |
#define XG_R_R_R 0x0010 /* Register followed by two registers. */ |
#define XG_R 0x0020 /* Single register. */ |
#define XG_PC 0x0040 /* PC relative 10 or 11 bit. */ |
#define XG_R_C 0x0080 /* General register followed by ccr register. */ |
#define XG_C_R 0x0100 /* CCR register followed by a general register. */ |
#define XG_R_P 0x0200 /* General register followed by pc register. */ |
#define XG_R_R_I 0x0400 /* Two general registers followed by an immediate value. */ |
#define XG_PCREL 0x0800 /* Immediate value that is relative to the current pc. */ |
/* XGATE operand formats as stored in the XGATE_opcode table. |
They are only used by GAS to recognize operands. */ |
#define XGATE_OP_INH "" |
#define XGATE_OP_TRI "r,r,r" |
#define XGATE_OP_DYA "r,r" |
#define XGATE_OP_IMM16 "r,if" |
#define XGATE_OP_IMM8 "r,i8" |
#define XGATE_OP_IMM4 "r,i4" |
#define XGATE_OP_IMM3 "i3" |
#define XGATE_OP_MON "r" |
#define XGATE_OP_MON_R_C "r,c" |
#define XGATE_OP_MON_C_R "c,r" |
#define XGATE_OP_MON_R_P "r,p" |
#define XGATE_OP_IDR "r,r,+" |
#define XGATE_OP_IDO5 "r,r,i5" |
#define XGATE_OP_REL9 "b9" |
#define XGATE_OP_REL10 "ba" |
#define XGATE_OP_DYA_MON "=r" |
/* Macro definitions. */ |
#define XGATE_OP_IMM16mADD "r,if; addl addh" |
#define XGATE_OP_IMM16mAND "r,if; andl andh" |
#define XGATE_OP_IMM16mCPC "r,if; cmpl cpch" |
#define XGATE_OP_IMM16mSUB "r,if; subl subh" |
#define XGATE_OP_IMM16mLDW "r,if; ldl ldh" |
/* CPU variant identification. */ |
#define XGATE_V1 0x1 |
#define XGATE_V2 0x2 |
#define XGATE_V3 0x4 |
/* Max opcodes per opcode handle. */ |
#define MAX_OPCODES 0x05 |
#define MAX_DETECT_CHARS 0x10 |
/* The opcode table definitions. */ |
struct xgate_opcode |
{ |
char * name; /* Op-code name. */ |
char * constraints; /* Constraint chars. */ |
char * format; /* Bit definitions. */ |
unsigned int sh_format; /* Shorthand format mask. */ |
unsigned int size; /* Opcode size in bytes. */ |
unsigned int bin_opcode; /* Binary opcode with operands masked off. */ |
unsigned char cycles_min; /* Minimum cpu cycles needed. */ |
unsigned char cycles_max; /* Maximum cpu cycles needed. */ |
unsigned char set_flags_mask; /* CCR flags set. */ |
unsigned char clr_flags_mask; /* CCR flags cleared. */ |
unsigned char chg_flags_mask; /* CCR flags changed. */ |
unsigned char arch; /* CPU variant. */ |
}; |
/* The opcode table. The table contains all the opcodes (all pages). |
You can't rely on the order. */ |
extern const struct xgate_opcode xgate_opcodes[]; |
extern const int xgate_num_opcodes; |
#endif /* _OPCODE_XGATE_H */ |
/contrib/toolchain/binutils/include/os9k.h |
---|
0,0 → 1,181 |
/* os9k.h - OS-9000 i386 module header definitions |
Copyright 2000 Free Software Foundation, Inc. |
This file is part of GNU CC. |
GNU CC is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2, or (at your option) |
any later version. |
GNU CC is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with GNU CC; see the file COPYING. If not, write to |
the Free Software Foundation, 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
#if !defined(_MODULE_H) |
#define _MODULE_H |
#define _MPF386 |
/* Size of common header less parity field. */ |
#define N_M_PARITY (sizeof(mh_com)-sizeof(unisgned short)) |
#define OLD_M_PARITY 46 |
#define M_PARITY N_M_PARITY |
#ifdef _MPF68K |
#define MODSYNC 0x4afc /* Module header sync code for 680x0 processors. */ |
#endif |
#ifdef _MPF386 |
#define MODSYNC 0x4afc /* Module header sync code for 80386 processors. */ |
#endif |
#define MODREV 1 /* Module format revision 1. */ |
#define CRCCON 0x800063 /* CRC polynomial constant. */ |
/* Module access permission values. */ |
#define MP_OWNER_READ 0x0001 |
#define MP_OWNER_WRITE 0x0002 |
#define MP_OWNER_EXEC 0x0004 |
#define MP_GROUP_READ 0x0010 |
#define MP_GROUP_WRITE 0x0020 |
#define MP_GROUP_EXEC 0x0040 |
#define MP_WORLD_READ 0x0100 |
#define MP_WORLD_WRITE 0x0200 |
#define MP_WORLD_EXEC 0x0400 |
#define MP_WORLD_ACCESS 0x0777 |
#define MP_OWNER_MASK 0x000f |
#define MP_GROUP_MASK 0x00f0 |
#define MP_WORLD_MASK 0x0f00 |
#define MP_SYSTM_MASK 0xf000 |
/* Module Type/Language values. */ |
#define MT_ANY 0 |
#define MT_PROGRAM 0x0001 |
#define MT_SUBROUT 0x0002 |
#define MT_MULTI 0x0003 |
#define MT_DATA 0x0004 |
#define MT_TRAPLIB 0x000b |
#define MT_SYSTEM 0x000c |
#define MT_FILEMAN 0x000d |
#define MT_DEVDRVR 0x000e |
#define MT_DEVDESC 0x000f |
#define MT_MASK 0xff00 |
#define ML_ANY 0 |
#define ML_OBJECT 1 |
#define ML_ICODE 2 |
#define ML_PCODE 3 |
#define ML_CCODE 4 |
#define ML_CBLCODE 5 |
#define ML_FRTNCODE 6 |
#define ML_MASK 0x00ff |
#define mktypelang(type, lang) (((type) << 8) | (lang)) |
/* Module Attribute values. */ |
#define MA_REENT 0x80 |
#define MA_GHOST 0x40 |
#define MA_SUPER 0x20 |
#define MA_MASK 0xff00 |
#define MR_MASK 0x00ff |
#define mkattrevs(attr, revs) (((attr) << 8) | (revs)) |
#define m_user m_owner.grp_usr.usr |
#define m_group m_owner.grp_usr.grp |
#define m_group_user m_owner.group_user |
/* Macro definitions for accessing module header fields. */ |
#define MODNAME(mod) ((u_char*)((u_char*)mod + ((Mh_com)mod)->m_name)) |
#if 0 |
/* Appears not to be used, and the u_int32 typedef is gone (because it |
conflicted with a Mach header. */ |
#define MODSIZE(mod) ((u_int32)((Mh_com)mod)->m_size) |
#endif /* 0 */ |
#define MHCOM_BYTES_SIZE 80 |
#define N_BADMAG(a) (((a).a_info) != MODSYNC) |
typedef struct mh_com |
{ |
/* Sync bytes ($4afc). */ |
unsigned char m_sync[2]; |
unsigned char m_sysrev[2]; /* System revision check value. */ |
unsigned char m_size[4]; /* Module size. */ |
unsigned char m_owner[4]; /* Group/user id. */ |
unsigned char m_name[4]; /* Offset to module name. */ |
unsigned char m_access[2]; /* Access permissions. */ |
unsigned char m_tylan[2]; /* Type/lang. */ |
unsigned char m_attrev[2]; /* Rev/attr. */ |
unsigned char m_edit[2]; /* Edition. */ |
unsigned char m_needs[4]; /* Module hardware requirements flags. (reserved). */ |
unsigned char m_usage[4]; /* Comment string offset. */ |
unsigned char m_symbol[4]; /* Symbol table offset. */ |
unsigned char m_exec[4]; /* Offset to execution entry point. */ |
unsigned char m_excpt[4]; /* Offset to exception entry point. */ |
unsigned char m_data[4]; /* Data storage requirement. */ |
unsigned char m_stack[4]; /* Stack size. */ |
unsigned char m_idata[4]; /* Offset to initialized data. */ |
unsigned char m_idref[4]; /* Offset to data reference lists. */ |
unsigned char m_init[4]; /* Initialization routine offset. */ |
unsigned char m_term[4]; /* Termination routine offset. */ |
unsigned char m_ident[2]; /* Ident code for ident program. */ |
char m_spare[8]; /* Reserved bytes. */ |
unsigned char m_parity[2]; /* Header parity. */ |
} mh_com,*Mh_com; |
/* Executable memory module. */ |
typedef mh_com *Mh_exec,mh_exec; |
/* Data memory module. */ |
typedef mh_com *Mh_data,mh_data; |
/* File manager memory module. */ |
typedef mh_com *Mh_fman,mh_fman; |
/* Device driver module. */ |
typedef mh_com *Mh_drvr,mh_drvr; |
/* Trap handler module. */ |
typedef mh_com mh_trap, *Mh_trap; |
/* Device descriptor module. */ |
typedef mh_com *Mh_dev,mh_dev; |
/* Configuration module. */ |
typedef mh_com *Mh_config, mh_config; |
#if 0 |
#if !defined(_MODDIR_H) |
/* Go get _os_fmod (and others). */ |
#include <moddir.h> |
#endif |
error_code _os_crc (void *, u_int32, int *); |
error_code _os_datmod (char *, u_int32, u_int16 *, u_int16 *, u_int32, void **, mh_data **); |
error_code _os_get_moddir (void *, u_int32 *); |
error_code _os_initdata (mh_com *, void *); |
error_code _os_link (char **, mh_com **, void **, u_int16 *, u_int16 *); |
error_code _os_linkm (mh_com *, void **, u_int16 *, u_int16 *); |
error_code _os_load (char *, mh_com **, void **, u_int32, u_int16 *, u_int16 *, u_int32); |
error_code _os_mkmodule (char *, u_int32, u_int16 *, u_int16 *, u_int32, void **, mh_com **, u_int32); |
error_code _os_modaddr (void *, mh_com **); |
error_code _os_setcrc (mh_com *); |
error_code _os_slink (u_int32, char *, void **, void **, mh_com **); |
error_code _os_slinkm (u_int32, mh_com *, void **, void **); |
error_code _os_unlink (mh_com *); |
error_code _os_unload (char *, u_int32); |
error_code _os_tlink (u_int32, char *, void **, mh_trap **, void *, u_int32); |
error_code _os_tlinkm (u_int32, mh_com *, void **, void *, u_int32); |
error_code _os_iodel (mh_com *); |
error_code _os_vmodul (mh_com *, mh_com *, u_int32); |
#endif /* 0 */ |
#endif |
/contrib/toolchain/binutils/include/partition.h |
---|
0,0 → 1,82 |
/* List implementation of a partition of consecutive integers. |
Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. |
Contributed by CodeSourcery, LLC. |
This file is part of GCC. |
GCC is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2, or (at your option) |
any later version. |
GCC is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with GCC; see the file COPYING. If not, write to |
the Free Software Foundation, 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
/* This package implements a partition of consecutive integers. The |
elements are partitioned into classes. Each class is represented |
by one of its elements, the canonical element, which is chosen |
arbitrarily from elements in the class. The principal operations |
on a partition are FIND, which takes an element, determines its |
class, and returns the canonical element for that class, and UNION, |
which unites the two classes that contain two given elements into a |
single class. |
The list implementation used here provides constant-time finds. By |
storing the size of each class with the class's canonical element, |
it is able to perform unions over all the classes in the partition |
in O (N log N) time. */ |
#ifndef _PARTITION_H |
#define _PARTITION_H |
#ifdef __cplusplus |
extern "C" { |
#endif /* __cplusplus */ |
#include "ansidecl.h" |
#include <stdio.h> |
struct partition_elem |
{ |
/* The canonical element that represents the class containing this |
element. */ |
int class_element; |
/* The next element in this class. Elements in each class form a |
circular list. */ |
struct partition_elem* next; |
/* The number of elements in this class. Valid only if this is the |
canonical element for its class. */ |
unsigned class_count; |
}; |
typedef struct partition_def |
{ |
/* The number of elements in this partition. */ |
int num_elements; |
/* The elements in the partition. */ |
struct partition_elem elements[1]; |
} *partition; |
extern partition partition_new (int); |
extern void partition_delete (partition); |
extern int partition_union (partition, int, int); |
extern void partition_print (partition, FILE*); |
/* Returns the canonical element corresponding to the class containing |
ELEMENT__ in PARTITION__. */ |
#define partition_find(partition__, element__) \ |
((partition__)->elements[(element__)].class_element) |
#ifdef __cplusplus |
} |
#endif /* __cplusplus */ |
#endif /* _PARTITION_H */ |
/contrib/toolchain/binutils/include/plugin-api.h |
---|
0,0 → 1,432 |
/* plugin-api.h -- External linker plugin API. */ |
/* Copyright 2009, 2010 Free Software Foundation, Inc. |
Written by Cary Coutant <ccoutant@google.com>. |
This file is part of binutils. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* This file defines the interface for writing a linker plugin, which is |
described at < http://gcc.gnu.org/wiki/whopr/driver >. */ |
#ifndef PLUGIN_API_H |
#define PLUGIN_API_H |
#ifdef HAVE_STDINT_H |
#include <stdint.h> |
#elif defined(HAVE_INTTYPES_H) |
#include <inttypes.h> |
#endif |
#include <sys/types.h> |
#if !defined(HAVE_STDINT_H) && !defined(HAVE_INTTYPES_H) && \ |
!defined(UINT64_MAX) && !defined(uint64_t) |
#error can not find uint64_t type |
#endif |
#ifdef __cplusplus |
extern "C" |
{ |
#endif |
/* Status code returned by most API routines. */ |
enum ld_plugin_status |
{ |
LDPS_OK = 0, |
LDPS_NO_SYMS, /* Attempt to get symbols that haven't been added. */ |
LDPS_BAD_HANDLE, /* No claimed object associated with given handle. */ |
LDPS_ERR |
/* Additional Error codes TBD. */ |
}; |
/* The version of the API specification. */ |
enum ld_plugin_api_version |
{ |
LD_PLUGIN_API_VERSION = 1 |
}; |
/* The type of output file being generated by the linker. */ |
enum ld_plugin_output_file_type |
{ |
LDPO_REL, |
LDPO_EXEC, |
LDPO_DYN, |
LDPO_PIE |
}; |
/* An input file managed by the plugin library. */ |
struct ld_plugin_input_file |
{ |
const char *name; |
int fd; |
off_t offset; |
off_t filesize; |
void *handle; |
}; |
/* A symbol belonging to an input file managed by the plugin library. */ |
struct ld_plugin_symbol |
{ |
char *name; |
char *version; |
int def; |
int visibility; |
uint64_t size; |
char *comdat_key; |
int resolution; |
}; |
/* An object's section. */ |
struct ld_plugin_section |
{ |
const void* handle; |
unsigned int shndx; |
}; |
/* Whether the symbol is a definition, reference, or common, weak or not. */ |
enum ld_plugin_symbol_kind |
{ |
LDPK_DEF, |
LDPK_WEAKDEF, |
LDPK_UNDEF, |
LDPK_WEAKUNDEF, |
LDPK_COMMON |
}; |
/* The visibility of the symbol. */ |
enum ld_plugin_symbol_visibility |
{ |
LDPV_DEFAULT, |
LDPV_PROTECTED, |
LDPV_INTERNAL, |
LDPV_HIDDEN |
}; |
/* How a symbol is resolved. */ |
enum ld_plugin_symbol_resolution |
{ |
LDPR_UNKNOWN = 0, |
/* Symbol is still undefined at this point. */ |
LDPR_UNDEF, |
/* This is the prevailing definition of the symbol, with references from |
regular object code. */ |
LDPR_PREVAILING_DEF, |
/* This is the prevailing definition of the symbol, with no |
references from regular objects. It is only referenced from IR |
code. */ |
LDPR_PREVAILING_DEF_IRONLY, |
/* This definition was pre-empted by a definition in a regular |
object file. */ |
LDPR_PREEMPTED_REG, |
/* This definition was pre-empted by a definition in another IR file. */ |
LDPR_PREEMPTED_IR, |
/* This symbol was resolved by a definition in another IR file. */ |
LDPR_RESOLVED_IR, |
/* This symbol was resolved by a definition in a regular object |
linked into the main executable. */ |
LDPR_RESOLVED_EXEC, |
/* This symbol was resolved by a definition in a shared object. */ |
LDPR_RESOLVED_DYN, |
/* This is the prevailing definition of the symbol, with no |
references from regular objects. It is only referenced from IR |
code, but the symbol is exported and may be referenced from |
a dynamic object (not seen at link time). */ |
LDPR_PREVAILING_DEF_IRONLY_EXP |
}; |
/* The plugin library's "claim file" handler. */ |
typedef |
enum ld_plugin_status |
(*ld_plugin_claim_file_handler) ( |
const struct ld_plugin_input_file *file, int *claimed); |
/* The plugin library's "all symbols read" handler. */ |
typedef |
enum ld_plugin_status |
(*ld_plugin_all_symbols_read_handler) (void); |
/* The plugin library's cleanup handler. */ |
typedef |
enum ld_plugin_status |
(*ld_plugin_cleanup_handler) (void); |
/* The linker's interface for registering the "claim file" handler. */ |
typedef |
enum ld_plugin_status |
(*ld_plugin_register_claim_file) (ld_plugin_claim_file_handler handler); |
/* The linker's interface for registering the "all symbols read" handler. */ |
typedef |
enum ld_plugin_status |
(*ld_plugin_register_all_symbols_read) ( |
ld_plugin_all_symbols_read_handler handler); |
/* The linker's interface for registering the cleanup handler. */ |
typedef |
enum ld_plugin_status |
(*ld_plugin_register_cleanup) (ld_plugin_cleanup_handler handler); |
/* The linker's interface for adding symbols from a claimed input file. */ |
typedef |
enum ld_plugin_status |
(*ld_plugin_add_symbols) (void *handle, int nsyms, |
const struct ld_plugin_symbol *syms); |
/* The linker's interface for getting the input file information with |
an open (possibly re-opened) file descriptor. */ |
typedef |
enum ld_plugin_status |
(*ld_plugin_get_input_file) (const void *handle, |
struct ld_plugin_input_file *file); |
typedef |
enum ld_plugin_status |
(*ld_plugin_get_view) (const void *handle, const void **viewp); |
/* The linker's interface for releasing the input file. */ |
typedef |
enum ld_plugin_status |
(*ld_plugin_release_input_file) (const void *handle); |
/* The linker's interface for retrieving symbol resolution information. */ |
typedef |
enum ld_plugin_status |
(*ld_plugin_get_symbols) (const void *handle, int nsyms, |
struct ld_plugin_symbol *syms); |
/* The linker's interface for adding a compiled input file. */ |
typedef |
enum ld_plugin_status |
(*ld_plugin_add_input_file) (const char *pathname); |
/* The linker's interface for adding a library that should be searched. */ |
typedef |
enum ld_plugin_status |
(*ld_plugin_add_input_library) (const char *libname); |
/* The linker's interface for adding a library path that should be searched. */ |
typedef |
enum ld_plugin_status |
(*ld_plugin_set_extra_library_path) (const char *path); |
/* The linker's interface for issuing a warning or error message. */ |
typedef |
enum ld_plugin_status |
(*ld_plugin_message) (int level, const char *format, ...); |
/* The linker's interface for retrieving the number of sections in an object. |
The handle is obtained in the claim_file handler. This interface should |
only be invoked in the claim_file handler. This function sets *COUNT to |
the number of sections in the object. */ |
typedef |
enum ld_plugin_status |
(*ld_plugin_get_input_section_count) (const void* handle, unsigned int *count); |
/* The linker's interface for retrieving the section type of a specific |
section in an object. This interface should only be invoked in the |
claim_file handler. This function sets *TYPE to an ELF SHT_xxx value. */ |
typedef |
enum ld_plugin_status |
(*ld_plugin_get_input_section_type) (const struct ld_plugin_section section, |
unsigned int *type); |
/* The linker's interface for retrieving the name of a specific section in |
an object. This interface should only be invoked in the claim_file handler. |
This function sets *SECTION_NAME_PTR to a null-terminated buffer allocated |
by malloc. The plugin must free *SECTION_NAME_PTR. */ |
typedef |
enum ld_plugin_status |
(*ld_plugin_get_input_section_name) (const struct ld_plugin_section section, |
char **section_name_ptr); |
/* The linker's interface for retrieving the contents of a specific section |
in an object. This interface should only be invoked in the claim_file |
handler. This function sets *SECTION_CONTENTS to point to a buffer that is |
valid until clam_file handler returns. It sets *LEN to the size of the |
buffer. */ |
typedef |
enum ld_plugin_status |
(*ld_plugin_get_input_section_contents) (const struct ld_plugin_section section, |
const unsigned char **section_contents, |
size_t* len); |
/* The linker's interface for specifying the desired order of sections. |
The sections should be specifed using the array SECTION_LIST in the |
order in which they should appear in the final layout. NUM_SECTIONS |
specifies the number of entries in each array. This should be invoked |
in the all_symbols_read handler. */ |
typedef |
enum ld_plugin_status |
(*ld_plugin_update_section_order) (const struct ld_plugin_section *section_list, |
unsigned int num_sections); |
/* The linker's interface for specifying that reordering of sections is |
desired so that the linker can prepare for it. This should be invoked |
before update_section_order, preferably in the claim_file handler. */ |
typedef |
enum ld_plugin_status |
(*ld_plugin_allow_section_ordering) (void); |
/* The linker's interface for specifying that a subset of sections is |
to be mapped to a unique segment. If the plugin wants to call |
unique_segment_for_sections, it must call this function from a |
claim_file_handler or when it is first loaded. */ |
typedef |
enum ld_plugin_status |
(*ld_plugin_allow_unique_segment_for_sections) (void); |
/* The linker's interface for specifying that a specific set of sections |
must be mapped to a unique segment. ELF segments do not have names |
and the NAME is used as the name of the newly created output section |
that is then placed in the unique PT_LOAD segment. FLAGS is used to |
specify if any additional segment flags need to be set. For instance, |
a specific segment flag can be set to identify this segment. Unsetting |
segment flags that would be set by default is not possible. The |
parameter SEGMENT_ALIGNMENT when non-zero will override the default. */ |
typedef |
enum ld_plugin_status |
(*ld_plugin_unique_segment_for_sections) ( |
const char* segment_name, |
uint64_t segment_flags, |
uint64_t segment_alignment, |
const struct ld_plugin_section * section_list, |
unsigned int num_sections); |
enum ld_plugin_level |
{ |
LDPL_INFO, |
LDPL_WARNING, |
LDPL_ERROR, |
LDPL_FATAL |
}; |
/* Values for the tv_tag field of the transfer vector. */ |
enum ld_plugin_tag |
{ |
LDPT_NULL = 0, |
LDPT_API_VERSION = 1, |
LDPT_GOLD_VERSION = 2, |
LDPT_LINKER_OUTPUT = 3, |
LDPT_OPTION = 4, |
LDPT_REGISTER_CLAIM_FILE_HOOK = 5, |
LDPT_REGISTER_ALL_SYMBOLS_READ_HOOK = 6, |
LDPT_REGISTER_CLEANUP_HOOK = 7, |
LDPT_ADD_SYMBOLS = 8, |
LDPT_GET_SYMBOLS = 9, |
LDPT_ADD_INPUT_FILE = 10, |
LDPT_MESSAGE = 11, |
LDPT_GET_INPUT_FILE = 12, |
LDPT_RELEASE_INPUT_FILE = 13, |
LDPT_ADD_INPUT_LIBRARY = 14, |
LDPT_OUTPUT_NAME = 15, |
LDPT_SET_EXTRA_LIBRARY_PATH = 16, |
LDPT_GNU_LD_VERSION = 17, |
LDPT_GET_VIEW = 18, |
LDPT_GET_INPUT_SECTION_COUNT = 19, |
LDPT_GET_INPUT_SECTION_TYPE = 20, |
LDPT_GET_INPUT_SECTION_NAME = 21, |
LDPT_GET_INPUT_SECTION_CONTENTS = 22, |
LDPT_UPDATE_SECTION_ORDER = 23, |
LDPT_ALLOW_SECTION_ORDERING = 24, |
LDPT_GET_SYMBOLS_V2 = 25, |
LDPT_ALLOW_UNIQUE_SEGMENT_FOR_SECTIONS = 26, |
LDPT_UNIQUE_SEGMENT_FOR_SECTIONS = 27 |
}; |
/* The plugin transfer vector. */ |
struct ld_plugin_tv |
{ |
enum ld_plugin_tag tv_tag; |
union |
{ |
int tv_val; |
const char *tv_string; |
ld_plugin_register_claim_file tv_register_claim_file; |
ld_plugin_register_all_symbols_read tv_register_all_symbols_read; |
ld_plugin_register_cleanup tv_register_cleanup; |
ld_plugin_add_symbols tv_add_symbols; |
ld_plugin_get_symbols tv_get_symbols; |
ld_plugin_add_input_file tv_add_input_file; |
ld_plugin_message tv_message; |
ld_plugin_get_input_file tv_get_input_file; |
ld_plugin_get_view tv_get_view; |
ld_plugin_release_input_file tv_release_input_file; |
ld_plugin_add_input_library tv_add_input_library; |
ld_plugin_set_extra_library_path tv_set_extra_library_path; |
ld_plugin_get_input_section_count tv_get_input_section_count; |
ld_plugin_get_input_section_type tv_get_input_section_type; |
ld_plugin_get_input_section_name tv_get_input_section_name; |
ld_plugin_get_input_section_contents tv_get_input_section_contents; |
ld_plugin_update_section_order tv_update_section_order; |
ld_plugin_allow_section_ordering tv_allow_section_ordering; |
ld_plugin_allow_unique_segment_for_sections tv_allow_unique_segment_for_sections; |
ld_plugin_unique_segment_for_sections tv_unique_segment_for_sections; |
} tv_u; |
}; |
/* The plugin library's "onload" entry point. */ |
typedef |
enum ld_plugin_status |
(*ld_plugin_onload) (struct ld_plugin_tv *tv); |
#ifdef __cplusplus |
} |
#endif |
#endif /* !defined(PLUGIN_API_H) */ |
/contrib/toolchain/binutils/include/progress.h |
---|
0,0 → 1,38 |
/* Default definitions for progress macros. |
Copyright 1994, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
/* The default definitions below are intended to be replaced by real |
definitions, if building the tools for an interactive programming |
environment. */ |
#ifndef _PROGRESS_H |
#define _PROGRESS_H |
#ifndef START_PROGRESS |
#define START_PROGRESS(STR,N) |
#endif |
#ifndef PROGRESS |
#define PROGRESS(X) |
#endif |
#ifndef END_PROGRESS |
#define END_PROGRESS(STR) |
#endif |
#endif /* _PROGRESS_H */ |
/contrib/toolchain/binutils/include/safe-ctype.h |
---|
0,0 → 1,150 |
/* <ctype.h> replacement macros. |
Copyright (C) 2000, 2001 Free Software Foundation, Inc. |
Contributed by Zack Weinberg <zackw@stanford.edu>. |
This file is part of the libiberty library. |
Libiberty is free software; you can redistribute it and/or |
modify it under the terms of the GNU Library General Public |
License as published by the Free Software Foundation; either |
version 2 of the License, or (at your option) any later version. |
Libiberty is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
Library General Public License for more details. |
You should have received a copy of the GNU Library General Public |
License along with libiberty; see the file COPYING.LIB. If |
not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
/* This is a compatible replacement of the standard C library's <ctype.h> |
with the following properties: |
- Implements all isxxx() macros required by C99. |
- Also implements some character classes useful when |
parsing C-like languages. |
- Does not change behavior depending on the current locale. |
- Behaves properly for all values in the range of a signed or |
unsigned char. |
To avoid conflicts, this header defines the isxxx functions in upper |
case, e.g. ISALPHA not isalpha. */ |
#ifndef SAFE_CTYPE_H |
#define SAFE_CTYPE_H |
/* Determine host character set. */ |
#define HOST_CHARSET_UNKNOWN 0 |
#define HOST_CHARSET_ASCII 1 |
#define HOST_CHARSET_EBCDIC 2 |
#if '\n' == 0x0A && ' ' == 0x20 && '0' == 0x30 \ |
&& 'A' == 0x41 && 'a' == 0x61 && '!' == 0x21 |
# define HOST_CHARSET HOST_CHARSET_ASCII |
#else |
# if '\n' == 0x15 && ' ' == 0x40 && '0' == 0xF0 \ |
&& 'A' == 0xC1 && 'a' == 0x81 && '!' == 0x5A |
# define HOST_CHARSET HOST_CHARSET_EBCDIC |
# else |
# define HOST_CHARSET HOST_CHARSET_UNKNOWN |
# endif |
#endif |
/* Categories. */ |
enum { |
/* In C99 */ |
_sch_isblank = 0x0001, /* space \t */ |
_sch_iscntrl = 0x0002, /* nonprinting characters */ |
_sch_isdigit = 0x0004, /* 0-9 */ |
_sch_islower = 0x0008, /* a-z */ |
_sch_isprint = 0x0010, /* any printing character including ' ' */ |
_sch_ispunct = 0x0020, /* all punctuation */ |
_sch_isspace = 0x0040, /* space \t \n \r \f \v */ |
_sch_isupper = 0x0080, /* A-Z */ |
_sch_isxdigit = 0x0100, /* 0-9A-Fa-f */ |
/* Extra categories useful to cpplib. */ |
_sch_isidst = 0x0200, /* A-Za-z_ */ |
_sch_isvsp = 0x0400, /* \n \r */ |
_sch_isnvsp = 0x0800, /* space \t \f \v \0 */ |
/* Combinations of the above. */ |
_sch_isalpha = _sch_isupper|_sch_islower, /* A-Za-z */ |
_sch_isalnum = _sch_isalpha|_sch_isdigit, /* A-Za-z0-9 */ |
_sch_isidnum = _sch_isidst|_sch_isdigit, /* A-Za-z0-9_ */ |
_sch_isgraph = _sch_isalnum|_sch_ispunct, /* isprint and not space */ |
_sch_iscppsp = _sch_isvsp|_sch_isnvsp, /* isspace + \0 */ |
_sch_isbasic = _sch_isprint|_sch_iscppsp /* basic charset of ISO C |
(plus ` and @) */ |
}; |
/* Character classification. */ |
extern const unsigned short _sch_istable[256]; |
#define _sch_test(c, bit) (_sch_istable[(c) & 0xff] & (unsigned short)(bit)) |
#define ISALPHA(c) _sch_test(c, _sch_isalpha) |
#define ISALNUM(c) _sch_test(c, _sch_isalnum) |
#define ISBLANK(c) _sch_test(c, _sch_isblank) |
#define ISCNTRL(c) _sch_test(c, _sch_iscntrl) |
#define ISDIGIT(c) _sch_test(c, _sch_isdigit) |
#define ISGRAPH(c) _sch_test(c, _sch_isgraph) |
#define ISLOWER(c) _sch_test(c, _sch_islower) |
#define ISPRINT(c) _sch_test(c, _sch_isprint) |
#define ISPUNCT(c) _sch_test(c, _sch_ispunct) |
#define ISSPACE(c) _sch_test(c, _sch_isspace) |
#define ISUPPER(c) _sch_test(c, _sch_isupper) |
#define ISXDIGIT(c) _sch_test(c, _sch_isxdigit) |
#define ISIDNUM(c) _sch_test(c, _sch_isidnum) |
#define ISIDST(c) _sch_test(c, _sch_isidst) |
#define IS_ISOBASIC(c) _sch_test(c, _sch_isbasic) |
#define IS_VSPACE(c) _sch_test(c, _sch_isvsp) |
#define IS_NVSPACE(c) _sch_test(c, _sch_isnvsp) |
#define IS_SPACE_OR_NUL(c) _sch_test(c, _sch_iscppsp) |
/* Character transformation. */ |
extern const unsigned char _sch_toupper[256]; |
extern const unsigned char _sch_tolower[256]; |
#define TOUPPER(c) _sch_toupper[(c) & 0xff] |
#define TOLOWER(c) _sch_tolower[(c) & 0xff] |
/* Prevent the users of safe-ctype.h from accidently using the routines |
from ctype.h. Initially, the approach was to produce an error when |
detecting that ctype.h has been included. But this was causing |
trouble as ctype.h might get indirectly included as a result of |
including another system header (for instance gnulib's stdint.h). |
So we include ctype.h here and then immediately redefine its macros. */ |
#include <ctype.h> |
#undef isalpha |
#define isalpha(c) do_not_use_isalpha_with_safe_ctype |
#undef isalnum |
#define isalnum(c) do_not_use_isalnum_with_safe_ctype |
#undef iscntrl |
#define iscntrl(c) do_not_use_iscntrl_with_safe_ctype |
#undef isdigit |
#define isdigit(c) do_not_use_isdigit_with_safe_ctype |
#undef isgraph |
#define isgraph(c) do_not_use_isgraph_with_safe_ctype |
#undef islower |
#define islower(c) do_not_use_islower_with_safe_ctype |
#undef isprint |
#define isprint(c) do_not_use_isprint_with_safe_ctype |
#undef ispunct |
#define ispunct(c) do_not_use_ispunct_with_safe_ctype |
#undef isspace |
#define isspace(c) do_not_use_isspace_with_safe_ctype |
#undef isupper |
#define isupper(c) do_not_use_isupper_with_safe_ctype |
#undef isxdigit |
#define isxdigit(c) do_not_use_isxdigit_with_safe_ctype |
#undef toupper |
#define toupper(c) do_not_use_toupper_with_safe_ctype |
#undef tolower |
#define tolower(c) do_not_use_tolower_with_safe_ctype |
#endif /* SAFE_CTYPE_H */ |
/contrib/toolchain/binutils/include/sha1.h |
---|
0,0 → 1,146 |
/* Declarations of functions and data types used for SHA1 sum |
library functions. |
Copyright (C) 2000, 2001, 2003, 2005, 2006, 2008, 2010 |
Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify it |
under the terms of the GNU General Public License as published by the |
Free Software Foundation; either version 3, or (at your option) any |
later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef SHA1_H |
# define SHA1_H 1 |
#include <stdio.h> |
#if defined HAVE_LIMITS_H || _LIBC |
# include <limits.h> |
#endif |
#include "ansidecl.h" |
/* The following contortions are an attempt to use the C preprocessor |
to determine an unsigned integral type that is 32 bits wide. An |
alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but |
doing that would require that the configure script compile and *run* |
the resulting executable. Locally running cross-compiled executables |
is usually not possible. */ |
#ifdef _LIBC |
# include <sys/types.h> |
typedef u_int32_t sha1_uint32; |
typedef uintptr_t sha1_uintptr; |
#elif defined (HAVE_SYS_TYPES_H) && defined (HAVE_STDINT_H) |
#include <stdint.h> |
#include <sys/types.h> |
typedef uint32_t sha1_uint32; |
typedef uintptr_t sha1_uintptr; |
#else |
# define INT_MAX_32_BITS 2147483647 |
/* If UINT_MAX isn't defined, assume it's a 32-bit type. |
This should be valid for all systems GNU cares about because |
that doesn't include 16-bit systems, and only modern systems |
(that certainly have <limits.h>) have 64+-bit integral types. */ |
# ifndef INT_MAX |
# define INT_MAX INT_MAX_32_BITS |
# endif |
# if INT_MAX == INT_MAX_32_BITS |
typedef unsigned int sha1_uint32; |
# else |
# if SHRT_MAX == INT_MAX_32_BITS |
typedef unsigned short sha1_uint32; |
# else |
# if LONG_MAX == INT_MAX_32_BITS |
typedef unsigned long sha1_uint32; |
# else |
/* The following line is intended to evoke an error. |
Using #error is not portable enough. */ |
"Cannot determine unsigned 32-bit data type." |
# endif |
# endif |
# endif |
#endif |
#ifdef __cplusplus |
extern "C" { |
#endif |
/* Structure to save state of computation between the single steps. */ |
struct sha1_ctx |
{ |
sha1_uint32 A; |
sha1_uint32 B; |
sha1_uint32 C; |
sha1_uint32 D; |
sha1_uint32 E; |
sha1_uint32 total[2]; |
sha1_uint32 buflen; |
sha1_uint32 buffer[32]; |
}; |
/* Initialize structure containing state of computation. */ |
extern void sha1_init_ctx (struct sha1_ctx *ctx); |
/* Starting with the result of former calls of this function (or the |
initialization function update the context for the next LEN bytes |
starting at BUFFER. |
It is necessary that LEN is a multiple of 64!!! */ |
extern void sha1_process_block (const void *buffer, size_t len, |
struct sha1_ctx *ctx); |
/* Starting with the result of former calls of this function (or the |
initialization function update the context for the next LEN bytes |
starting at BUFFER. |
It is NOT required that LEN is a multiple of 64. */ |
extern void sha1_process_bytes (const void *buffer, size_t len, |
struct sha1_ctx *ctx); |
/* Process the remaining bytes in the buffer and put result from CTX |
in first 20 bytes following RESBUF. The result is always in little |
endian byte order, so that a byte-wise output yields to the wanted |
ASCII representation of the message digest. |
IMPORTANT: On some systems it is required that RESBUF be correctly |
aligned for a 32 bits value. */ |
extern void *sha1_finish_ctx (struct sha1_ctx *ctx, void *resbuf); |
/* Put result from CTX in first 20 bytes following RESBUF. The result is |
always in little endian byte order, so that a byte-wise output yields |
to the wanted ASCII representation of the message digest. |
IMPORTANT: On some systems it is required that RESBUF is correctly |
aligned for a 32 bits value. */ |
extern void *sha1_read_ctx (const struct sha1_ctx *ctx, void *resbuf); |
/* Compute SHA1 message digest for bytes read from STREAM. The |
resulting message digest number will be written into the 20 bytes |
beginning at RESBLOCK. */ |
extern int sha1_stream (FILE *stream, void *resblock); |
/* Compute SHA1 message digest for LEN bytes beginning at BUFFER. The |
result is always in little endian byte order, so that a byte-wise |
output yields to the wanted ASCII representation of the message |
digest. */ |
extern void *sha1_buffer (const char *buffer, size_t len, void *resblock); |
#ifdef __cplusplus |
} |
#endif |
#endif |
/contrib/toolchain/binutils/include/simple-object.h |
---|
0,0 → 1,204 |
/* simple-object.h -- simple routines to read and write object files |
Copyright 2010 Free Software Foundation, Inc. |
Written by Ian Lance Taylor, Google. |
This program is free software; you can redistribute it and/or modify it |
under the terms of the GNU General Public License as published by the |
Free Software Foundation; either version 2, or (at your option) any |
later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
#ifndef SIMPLE_OBJECT_H |
#define SIMPLE_OBJECT_H |
#include <stddef.h> |
#include <sys/types.h> |
#ifdef HAVE_UNISTD_H |
#include <unistd.h> |
#endif |
#ifdef __cplusplus |
extern "C" { |
#endif |
/* This header file provides four types with associated functions. |
They are used to read and write object files. This is a minimal |
interface, intended to support the needs of gcc without bringing in |
all the power and complexity of BFD. */ |
/* The type simple_object_read * is used to read an existing object |
file. */ |
typedef struct simple_object_read_struct simple_object_read; |
/* Create an simple_object_read given DESCRIPTOR, an open file |
descriptor, and OFFSET, an offset within the file. The offset is |
for use with archives, and should be 0 for an ordinary object file. |
The descriptor must remain open until done with the returned |
simple_object_read. SEGMENT_NAME is used on Mach-O and is required |
on that platform: it means to only look at sections within the |
segment with that name. It is ignored for other object file |
formats. On error, this function returns NULL, and sets *ERRMSG to |
an error string and sets *ERR to an errno value or 0 if there is no |
relevant errno. */ |
extern simple_object_read * |
simple_object_start_read (int descriptor, off_t offset, |
const char *segment_name, const char **errmsg, |
int *err); |
/* Call PFN for each section in SIMPLE_OBJECT, passing it the section |
name, offset within the file of the section contents, and length of |
the section contents. The offset within the file is relative to |
the offset passed to simple_object_start_read. The DATA argument |
to simple_object_find_sections is passed on to PFN. If PFN returns |
0, the loop is stopped and simple_object_find_sections returns. If |
PFN returns non-zero, the loop continues. On success this returns |
NULL. On error it returns an error string, and sets *ERR to an |
errno value or 0 if there is no relevant errno. */ |
extern const char * |
simple_object_find_sections (simple_object_read *simple_object, |
int (*pfn) (void *data, const char *, |
off_t offset, off_t length), |
void *data, |
int *err); |
/* Look for the section NAME in SIMPLE_OBJECT. This returns |
information for the first section NAME in SIMPLE_OBJECT. Note that |
calling this multiple times is inefficient; use |
simple_object_find_sections instead. |
If found, return 1 and set *OFFSET to the offset in the file of the |
section contents and set *LENGTH to the length of the section |
contents. *OFFSET will be relative to the offset passed to |
simple_object_start_read. |
If the section is not found, and no error occurs, return 0 and set |
*ERRMSG to NULL. |
If an error occurs, return 0, set *ERRMSG to an error message, and |
set *ERR to an errno value or 0 if there is no relevant errno. */ |
extern int |
simple_object_find_section (simple_object_read *simple_object, |
const char *name, off_t *offset, off_t *length, |
const char **errmsg, int *err); |
/* Release all resources associated with SIMPLE_OBJECT. This does not |
close the file descriptor. */ |
extern void |
simple_object_release_read (simple_object_read *); |
/* The type simple_object_attributes holds the attributes of an object |
file that matter for creating a file or ensuring that two files are |
compatible. This is a set of magic numbers. */ |
typedef struct simple_object_attributes_struct simple_object_attributes; |
/* Fetch the attributes of SIMPLE_OBJECT. This information will |
persist until simple_object_attributes_release is called, even if |
SIMPLE_OBJECT is closed. On error this returns NULL, sets *ERRMSG |
to an error message, and sets *ERR to an errno value or 0 if there |
isn't one. */ |
extern simple_object_attributes * |
simple_object_fetch_attributes (simple_object_read *simple_object, |
const char **errmsg, int *err); |
/* Merge the FROM attributes into TO. If two objects with these |
attributes could be linked together without error, returns NULL. |
Otherwise, returns an error message, and sets *ERR to an errno |
value or 0 if there isn't one. */ |
extern const char * |
simple_object_attributes_merge (simple_object_attributes *to, |
simple_object_attributes *from, |
int *err); |
/* Release all resources associated with ATTRS. */ |
extern void |
simple_object_release_attributes (simple_object_attributes *attrs); |
/* The type simple_object_write is used to create a new object file. */ |
typedef struct simple_object_write_struct simple_object_write; |
/* Start creating a new object file which is like ATTRS. You must |
fetch attribute information from an existing object file before you |
can create a new one. There is currently no support for creating |
an object file de novo. The segment name is only used on Mach-O, |
where it is required. It means that all sections are created |
within that segment. It is ignored for other object file formats. |
On error this function returns NULL, sets *ERRMSG to an error |
message, and sets *ERR to an errno value or 0 if there isn't |
one. */ |
extern simple_object_write * |
simple_object_start_write (simple_object_attributes *attrs, |
const char *segment_name, |
const char **errmsg, int *err); |
/* The type simple_object_write_section is a handle for a section |
which is being written. */ |
typedef struct simple_object_write_section_struct simple_object_write_section; |
/* Add a section to SIMPLE_OBJECT. NAME is the name of the new |
section. ALIGN is the required alignment expressed as the number |
of required low-order 0 bits (e.g., 2 for alignment to a 32-bit |
boundary). The section is created as containing data, readable, |
not writable, not executable, not loaded at runtime. On error this |
returns NULL, sets *ERRMSG to an error message, and sets *ERR to an |
errno value or 0 if there isn't one. */ |
extern simple_object_write_section * |
simple_object_write_create_section (simple_object_write *simple_object, |
const char *name, unsigned int align, |
const char **errmsg, int *err); |
/* Add data BUFFER/SIZE to SECTION in SIMPLE_OBJECT. If COPY is |
non-zero, the data will be copied into memory if necessary. If |
COPY is zero, BUFFER must persist until SIMPLE_OBJECT is released. |
On success this returns NULL. On error this returns an error |
message, and sets *ERR to an errno value or 0 if there isn't |
one. */ |
extern const char * |
simple_object_write_add_data (simple_object_write *simple_object, |
simple_object_write_section *section, |
const void *buffer, size_t size, |
int copy, int *err); |
/* Write the complete object file to DESCRIPTOR, an open file |
descriptor. This returns NULL on success. On error this returns |
an error message, and sets *ERR to an errno value or 0 if there |
isn't one. */ |
extern const char * |
simple_object_write_to_file (simple_object_write *simple_object, |
int descriptor, int *err); |
/* Release all resources associated with SIMPLE_OBJECT, including any |
simple_object_write_section's that may have been created. */ |
extern void |
simple_object_release_write (simple_object_write *); |
#ifdef __cplusplus |
} |
#endif |
#endif |
/contrib/toolchain/binutils/include/som/ChangeLog |
---|
0,0 → 1,20 |
2010-06-10 Tristan Gingold <gingold@adacore.com> |
* aout.h: New file. |
* clock.h: Likewise. |
* lst.h: Likewise. |
* reloc.h: Likewise. |
* internal.h: Likewise. |
Copyright (C) 2010-2012 Free Software Foundation, Inc. |
Copying and distribution of this file, with or without modification, |
are permitted in any medium without royalty provided the copyright |
notice and this notice are preserved. |
Local Variables: |
mode: change-log |
left-margin: 8 |
fill-column: 74 |
version-control: never |
End: |
/contrib/toolchain/binutils/include/som/aout.h |
---|
0,0 → 1,249 |
/* SOM a.out definitions for BFD. |
Copyright 2010 Free Software Foundation, Inc. |
Contributed by Tristan Gingold <gingold@adacore.com>, AdaCore. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _SOM_AOUT_H |
#define _SOM_AOUT_H |
#include "clock.h" |
/* Note: SOM uses bit-field in its structure. All you need to know is: |
- CPUs supported by SOM (hppa) are big-endian, |
- the MSB is numbered 0. */ |
struct som_external_header |
{ |
unsigned char system_id[2]; |
unsigned char a_magic[2]; |
unsigned char version_id[4]; |
struct som_external_clock file_time; |
unsigned char entry_space[4]; |
unsigned char entry_subspace[4]; |
unsigned char entry_offset[4]; |
unsigned char aux_header_location[4]; |
unsigned char aux_header_size[4]; |
unsigned char som_length[4]; |
unsigned char presumed_dp[4]; |
unsigned char space_location[4]; |
unsigned char space_total[4]; |
unsigned char subspace_location[4]; |
unsigned char subspace_total[4]; |
unsigned char loader_fixup_location[4]; |
unsigned char loader_fixup_total[4]; |
unsigned char space_strings_location[4]; |
unsigned char space_strings_size[4]; |
unsigned char init_array_location[4]; |
unsigned char init_array_total[4]; |
unsigned char compiler_location[4]; |
unsigned char compiler_total[4]; |
unsigned char symbol_location[4]; |
unsigned char symbol_total[4]; |
unsigned char fixup_request_location[4]; |
unsigned char fixup_request_total[4]; |
unsigned char symbol_strings_location[4]; |
unsigned char symbol_strings_size[4]; |
unsigned char unloadable_sp_location[4]; |
unsigned char unloadable_sp_size[4]; |
unsigned char checksum[4]; |
}; |
#define OLD_VERSION_ID 85082112 |
#define NEW_VERSION_ID 87102412 |
#define EXECLIBMAGIC 0x0104 |
#define RELOC_MAGIC 0x0106 |
#define EXEC_MAGIC 0x0107 |
#define SHARE_MAGIC 0x0108 |
#define SHMEM_MAGIC 0x0109 |
#define DEMAND_MAGIC 0x010b |
#define DL_MAGIC 0x010d |
#define SHL_MAGIC 0x010e |
struct som_external_aux_id |
{ |
unsigned char flags[4]; |
unsigned char length[4]; |
}; |
/* Aux id types. */ |
#define VERSION_AUX_ID 6 |
#define COPYRIGHT_AUX_ID 9 |
/* Aux id flags. */ |
#define SOM_AUX_ID_MANDATORY (1 << 31) |
#define SOM_AUX_ID_COPY (1 << 30) |
#define SOM_AUX_ID_APPEND (1 << 29) |
#define SOM_AUX_ID_IGNORE (1 << 28) |
#define SOM_AUX_ID_TYPE_SH 0 |
#define SOM_AUX_ID_TYPE_MASK 0xffff |
struct som_external_string_auxhdr |
{ |
struct som_external_aux_id header_id; |
/* Length of the string, without the NUL. */ |
unsigned char string_length[4]; |
/* The string. */ |
}; |
struct som_external_exec_auxhdr |
{ |
struct som_external_aux_id som_auxhdr; |
unsigned char exec_tsize[4]; |
unsigned char exec_tmem[4]; |
unsigned char exec_tfile[4]; |
unsigned char exec_dsize[4]; |
unsigned char exec_dmem[4]; |
unsigned char exec_dfile[4]; |
unsigned char exec_bsize[4]; |
unsigned char exec_entry[4]; |
unsigned char exec_flags[4]; |
unsigned char exec_bfill[4]; |
}; |
#define AUX_HDR_SIZE sizeof (struct som_external_exec_auxhdr) |
struct som_external_space_dictionary_record |
{ |
unsigned char name[4]; |
unsigned char flags[4]; |
unsigned char space_number[4]; |
unsigned char subspace_index[4]; |
unsigned char subspace_quantity[4]; |
unsigned char loader_fix_index[4]; |
unsigned char loader_fix_quantity[4]; |
unsigned char init_pointer_index[4]; |
unsigned char init_pointer_quantity[4]; |
}; |
#define SOM_SPACE_IS_LOADABLE (1 << 31) |
#define SOM_SPACE_IS_DEFINED (1 << 30) |
#define SOM_SPACE_IS_PRIVATE (1 << 29) |
#define SOM_SPACE_HAS_INTERMEDIATE_CODE (1 << 28) |
#define SOM_SPACE_IS_TSPECIFIC (1 << 27) |
#define SOM_SPACE_SORT_KEY_SH 8 |
#define SOM_SPACE_SORT_KEY_MASK 0xff |
struct som_external_subspace_dictionary_record |
{ |
unsigned char space_index[4]; |
unsigned char flags[4]; |
unsigned char file_loc_init_value[4]; |
unsigned char initialization_length[4]; |
unsigned char subspace_start[4]; |
unsigned char subspace_length[4]; |
unsigned char alignment[4]; |
unsigned char name[4]; |
unsigned char fixup_request_index[4]; |
unsigned char fixup_request_quantity[4]; |
}; |
#define SOM_SUBSPACE_ACCESS_CONTROL_BITS_SH 25 |
#define SOM_SUBSPACE_ACCESS_CONTROL_BITS_MASK 0x7f |
#define SOM_SUBSPACE_MEMORY_RESIDENT (1 << 24) |
#define SOM_SUBSPACE_DUP_COMMON (1 << 23) |
#define SOM_SUBSPACE_IS_COMMON (1 << 22) |
#define SOM_SUBSPACE_IS_LOADABLE (1 << 21) |
#define SOM_SUBSPACE_QUADRANT_SH 19 |
#define SOM_SUBSPACE_QUADRANT_MASK 0x3 |
#define SOM_SUBSPACE_INITIALLY_FROZEN (1 << 18) |
#define SOM_SUBSPACE_IS_FIRST (1 << 17) |
#define SOM_SUBSPACE_CODE_ONLY (1 << 16) |
#define SOM_SUBSPACE_SORT_KEY_SH 8 |
#define SOM_SUBSPACE_SORT_KEY_MASK 0xff |
#define SOM_SUBSPACE_REPLICATE_INIT (1 << 7) |
#define SOM_SUBSPACE_CONTINUATION (1 << 6) |
#define SOM_SUBSPACE_IS_TSPECIFIC (1 << 5) |
#define SOM_SUBSPACE_IS_COMDAT (1 << 4) |
struct som_external_compilation_unit |
{ |
unsigned char name[4]; |
unsigned char language_name[4]; |
unsigned char product_id[4]; |
unsigned char version_id[4]; |
unsigned char flags[4]; |
struct som_external_clock compile_time; |
struct som_external_clock source_time; |
}; |
struct som_external_symbol_dictionary_record |
{ |
unsigned char flags[4]; |
unsigned char name[4]; |
unsigned char qualifier_name[4]; |
unsigned char info[4]; |
unsigned char symbol_value[4]; |
}; |
/* Flags fields. */ |
#define SOM_SYMBOL_HIDDEN (1 << 31) |
#define SOM_SYMBOL_SECONDARY_DEF (1 << 30) |
#define SOM_SYMBOL_TYPE_SH 24 |
#define SOM_SYMBOL_TYPE_MASK 0x3f |
#define SOM_SYMBOL_SCOPE_SH 20 |
#define SOM_SYMBOL_SCOPE_MASK 0xf |
#define SOM_SYMBOL_CHECK_LEVEL_SH 17 |
#define SOM_SYMBOL_CHECK_LEVEL_MASK 0x7 |
#define SOM_SYMBOL_MUST_QUALIFY (1 << 16) |
#define SOM_SYMBOL_INITIALLY_FROZEN (1 << 15) |
#define SOM_SYMBOL_MEMORY_RESIDENT (1 << 14) |
#define SOM_SYMBOL_IS_COMMON (1 << 13) |
#define SOM_SYMBOL_DUP_COMMON (1 << 12) |
#define SOM_SYMBOL_XLEAST_SH 10 |
#define SOM_SYMBOL_XLEAT_MASK 0x3 |
#define SOM_SYMBOL_ARG_RELOC_SH 0 |
#define SOM_SYMBOL_ARG_RELOC_MASK 0x3ff |
/* Info fields. */ |
#define SOM_SYMBOL_HAS_LONG_RETURN (1 << 31) |
#define SOM_SYMBOL_NO_RELOCATION (1 << 30) |
#define SOM_SYMBOL_IS_COMDAT (1 << 29) |
#define SOM_SYMBOL_SYMBOL_INFO_SH 0 |
#define SOM_SYMBOL_SYMBOL_INFO_MASK 0xffffff |
/* Symbol type definition. */ |
#define ST_NULL 0 |
#define ST_ABSOLUTE 1 |
#define ST_DATA 2 |
#define ST_CODE 3 |
#define ST_PRI_PROG 4 |
#define ST_SEC_PROG 5 |
#define ST_ENTRY 6 |
#define ST_STORAGE 7 |
#define ST_STUB 8 |
#define ST_MODULE 9 |
#define ST_SYM_EXT 10 |
#define ST_ARG_EXT 11 |
#define ST_MILLICODE 12 |
#define ST_PLABEL 13 |
#define ST_OCT_DIS 14 |
#define ST_MILLI_EXT 15 |
#define ST_TSTORAGE 16 |
#define ST_COMDAT 17 |
/* Symbol scope. */ |
#define SS_UNSAT 0 |
#define SS_EXTERNAL 1 |
#define SS_LOCAL 2 |
#define SS_UNIVERSAL 3 |
#endif /* _SOM_AOUT_H */ |
/contrib/toolchain/binutils/include/som/clock.h |
---|
0,0 → 1,30 |
/* SOM clock definition for BFD. |
Copyright 2010 Free Software Foundation, Inc. |
Contributed by Tristan Gingold <gingold@adacore.com>, AdaCore. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _SOM_CLOCK_H |
#define _SOM_CLOCK_H |
struct som_external_clock |
{ |
unsigned char secs[4]; |
unsigned char nanosecs[4]; |
}; |
#endif /* _SOM_CLOCK_H */ |
/contrib/toolchain/binutils/include/som/internal.h |
---|
0,0 → 1,206 |
/* SOM internal definitions for BFD. |
Copyright 2010 Free Software Foundation, Inc. |
Contributed by Tristan Gingold <gingold@adacore.com>, AdaCore. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _SOM_INTERNAL_H |
#define _SOM_INTERNAL_H |
struct som_clock |
{ |
unsigned int secs; |
unsigned int nanosecs; |
}; |
struct som_header |
{ |
unsigned short system_id; |
unsigned short a_magic; |
unsigned int version_id; |
struct som_clock file_time; |
unsigned int entry_space; |
unsigned int entry_subspace; |
unsigned int entry_offset; |
unsigned int aux_header_location; |
unsigned int aux_header_size; |
unsigned int som_length; |
unsigned int presumed_dp; |
unsigned int space_location; |
unsigned int space_total; |
unsigned int subspace_location; |
unsigned int subspace_total; |
unsigned int loader_fixup_location; |
unsigned int loader_fixup_total; |
unsigned int space_strings_location; |
unsigned int space_strings_size; |
unsigned int init_array_location; |
unsigned int init_array_total; |
unsigned int compiler_location; |
unsigned int compiler_total; |
unsigned int symbol_location; |
unsigned int symbol_total; |
unsigned int fixup_request_location; |
unsigned int fixup_request_total; |
unsigned int symbol_strings_location; |
unsigned int symbol_strings_size; |
unsigned int unloadable_sp_location; |
unsigned int unloadable_sp_size; |
unsigned int checksum; |
}; |
struct som_aux_id |
{ |
unsigned int mandatory : 1; |
unsigned int copy : 1; |
unsigned int append : 1; |
unsigned int ignore : 1; |
unsigned int reserved : 12; |
/* Header type. */ |
unsigned int type : 16; |
/* Length of the header in bytes, without the two word identifier. */ |
unsigned int length; |
}; |
/* Generic auxiliary string header. */ |
struct som_string_auxhdr |
{ |
struct som_aux_id header_id; |
/* Length of the string, without the NUL. */ |
unsigned int string_length; |
/* The string. */ |
char string[1]; |
}; |
struct som_name_pt |
{ |
char *name; |
unsigned int strx; |
}; |
struct som_compilation_unit |
{ |
/* Source file that produced the SOM. */ |
struct som_name_pt name; |
/* Name of the language used when creating this SOM. */ |
struct som_name_pt language_name; |
/* Identificaton of the compiler. */ |
struct som_name_pt product_id; |
/* Version id of the compiler. */ |
struct som_name_pt version_id; |
unsigned int flags; |
struct som_clock compile_time; |
struct som_clock source_time; |
}; |
struct som_exec_auxhdr |
{ |
struct som_aux_id som_auxhdr; |
long exec_tsize; |
long exec_tmem; |
long exec_tfile; |
long exec_dsize; |
long exec_dmem; |
long exec_dfile; |
long exec_bsize; |
long exec_entry; |
long exec_flags; |
long exec_bfill; |
}; |
struct som_space_dictionary_record |
{ |
unsigned int name; |
unsigned int is_loadable : 1; |
unsigned int is_defined : 1; |
unsigned int is_private : 1; |
unsigned int has_intermediate_code : 1; |
unsigned int is_tspecific : 1; |
unsigned int reserved : 11; |
unsigned int sort_key : 8; |
unsigned int reserved2 : 8; |
int space_number; |
int subspace_index; |
unsigned int subspace_quantity; |
int loader_fix_index; |
unsigned int loader_fix_quantity; |
int init_pointer_index; |
unsigned int init_pointer_quantity; |
}; |
struct som_subspace_dictionary_record |
{ |
int space_index; |
unsigned int access_control_bits : 7; |
unsigned int memory_resident : 1; |
unsigned int dup_common : 1; |
unsigned int is_common : 1; |
unsigned int is_loadable : 1; |
unsigned int quadrant : 2; |
unsigned int initially_frozen : 1; |
unsigned int is_first : 1; |
unsigned int code_only : 1; |
unsigned int sort_key : 8; |
unsigned int replicate_init : 1; |
unsigned int continuation : 1; |
unsigned int is_tspecific : 1; |
unsigned int is_comdat : 1; |
unsigned int reserved : 4; |
int file_loc_init_value; |
unsigned int initialization_length; |
unsigned int subspace_start; |
unsigned int subspace_length; |
unsigned int reserved2 : 5; |
unsigned int alignment : 27; |
unsigned int name; |
int fixup_request_index; |
unsigned int fixup_request_quantity; |
}; |
struct som_lst_header |
{ |
unsigned short system_id; |
unsigned short a_magic; |
unsigned int version_id; |
struct som_clock file_time; |
unsigned int hash_loc; |
unsigned int hash_size; |
unsigned int module_count; |
unsigned int module_limit; |
unsigned int dir_loc; |
unsigned int export_loc; |
unsigned int export_count; |
unsigned int import_loc; |
unsigned int aux_loc; |
unsigned int aux_size; |
unsigned int string_loc; |
unsigned int string_size; |
unsigned int free_list; |
unsigned int file_end; |
unsigned int checksum; |
}; |
#endif /* _SOM_INTERNAL_H */ |
/contrib/toolchain/binutils/include/som/lst.h |
---|
0,0 → 1,93 |
/* SOM lst definitions for BFD. |
Copyright 2010 Free Software Foundation, Inc. |
Contributed by Tristan Gingold <gingold@adacore.com>, AdaCore. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _SOM_LST_H |
#define _SOM_LST_H |
#include "clock.h" |
/* See 4.2 Libraray Symbol Table Header Record. */ |
struct som_external_lst_header |
{ |
unsigned char system_id[2]; |
unsigned char a_magic[2]; |
unsigned char version_id[4]; |
struct som_external_clock file_time; |
unsigned char hash_loc[4]; |
unsigned char hash_size[4]; |
unsigned char module_count[4]; |
unsigned char module_limit[4]; |
unsigned char dir_loc[4]; |
unsigned char export_loc[4]; |
unsigned char export_count[4]; |
unsigned char import_loc[4]; |
unsigned char aux_loc[4]; |
unsigned char aux_size[4]; |
unsigned char string_loc[4]; |
unsigned char string_size[4]; |
unsigned char free_list[4]; |
unsigned char file_end[4]; |
unsigned char checksum[4]; |
}; |
#define VERSION_ID 85082112 |
#define LIBMAGIC 0x0619 |
#define LIBMAGIC_EXEC 0x0104 |
struct som_external_lst_symbol_record |
{ |
unsigned char flags[4]; |
unsigned char name[4]; |
unsigned char qualifier_name[4]; |
unsigned char symbol_info[4]; |
unsigned char symbol_value[4]; |
unsigned char symbol_descriptor[4]; |
unsigned char reserved; |
unsigned char max_num_args; |
unsigned char min_num_args; |
unsigned char num_args; |
unsigned char som_index[4]; |
unsigned char symbol_key[4]; |
unsigned char next_entry[4]; |
}; |
/* Fields of flags. */ |
#define LST_SYMBOL_HIDDEN (1 << 31) |
#define LST_SYMBOL_SECONDARY_DEF (1 << 30) |
#define LST_SYMBOL_SYMBOL_TYPE_SH 24 |
#define LST_SYMBOL_SYMBOL_SCOPE_SH 20 |
#define LST_SYMBOL_CHECK_LEVEL_SH 17 |
#define LST_SYMBOL_MUST_QUALIFY (1 << 16) |
#define LST_SYMBOL_INITIALY_FROZEN (1 << 15) |
#define LST_SYMBOL_MEMORY_RESIDENT (1 << 14) |
#define LST_SYMBOL_IS_COMMON (1 << 13) |
#define LST_SYMBOL_DUP_COMMON (1 << 12) |
#define LST_SYMBOL_XLEAST_SH 10 |
#define LST_SYMBOL_ARG_RELOC_SH 0 |
/* According to 4.3.2 SOM Directory. */ |
struct som_external_som_entry |
{ |
unsigned char location[4]; |
unsigned char length[4]; |
}; |
#endif /* _SOM_LST_H */ |
/contrib/toolchain/binutils/include/som/reloc.h |
---|
0,0 → 1,79 |
/* SOM relocation definitions for BFD. |
Copyright 2010 Free Software Foundation, Inc. |
Contributed by Tristan Gingold <gingold@adacore.com>, AdaCore. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef _SOM_RELOC_H |
#define _SOM_RELOC_H |
#define R_NO_RELOCATION 0 |
#define R_ZEROES 0x20 |
#define R_UNINIT 0x22 |
#define R_RELOCATION 0x24 |
#define R_DATA_ONE_SYMBOL 0x25 |
#define R_DATA_PLABEL 0x27 |
#define R_SPACE_REF 0x29 |
#define R_REPEATED_INIT 0x2a |
#define R_PCREL_CALL 0x30 |
#define R_SHORT_PCREL_MODE 0x3e |
#define R_LONG_PCREL_MODE 0x3f |
#define R_ABS_CALL 0x40 |
#define R_DP_RELATIVE 0x50 |
#define R_DATA_GPREL 0x72 |
#define R_INDIRECT_CALL 0x76 |
#define R_PLT_REL 0x77 |
#define R_DLT_REL 0x78 |
#define R_CODE_ONE_SYMBOL 0x80 |
#define R_MILLI_REL 0xae |
#define R_CODE_PLABEL 0xb0 |
#define R_BREAKPOINT 0xb2 |
#define R_ENTRY 0xb3 |
#define R_ALT_ENTRY 0xb5 |
#define R_EXIT 0xb6 |
#define R_BEGIN_TRY 0xb7 |
#define R_END_TRY 0xb8 |
#define R_BEGIN_BRTAB 0xbb |
#define R_END_BRTAB 0xbc |
#define R_STATEMENT 0xbd |
#define R_DATA_EXPR 0xc0 |
#define R_CODE_EXPR 0xc1 |
#define R_FSEL 0xc2 |
#define R_LSEL 0xc3 |
#define R_RSEL 0xc4 |
#define R_N_MODE 0xc5 |
#define R_S_MODE 0xc6 |
#define R_D_MODE 0xc7 |
#define R_R_MODE 0xc8 |
#define R_DATA_OVERRIDE 0xc9 |
#define R_TRANSLATED 0xce |
#define R_AUX_UNWIND 0xcf |
#define R_COMP1 0xd0 |
#define R_COMP2 0xd1 |
#define R_COMP3 0xd2 |
#define R_PREV_FIXUP 0xd3 |
#define R_SEC_STMT 0xd7 |
#define R_N0SEL 0xd8 |
#define R_N1SEL 0xd9 |
#define R_LINETAB 0xda |
#define R_LINETAB_ESC 0xdb |
#define R_LTP_OVERRIDE 0xdc |
#define R_COMMENT 0xdd |
#define R_TP_OVERRIDE 0xde |
#define R_RESERVED 0xdf |
#endif /* _SOM_RELOC_H */ |
/contrib/toolchain/binutils/include/sort.h |
---|
0,0 → 1,48 |
/* Sorting algorithms. |
Copyright (C) 2000, 2002 Free Software Foundation, Inc. |
Contributed by Mark Mitchell <mark@codesourcery.com>. |
This file is part of GCC. |
GCC is free software; you can redistribute it and/or modify it |
under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2, or (at your option) |
any later version. |
GCC is distributed in the hope that it will be useful, but |
WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with GCC; see the file COPYING. If not, write to |
the Free Software Foundation, 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
#ifndef SORT_H |
#define SORT_H |
#include <sys/types.h> /* For size_t */ |
#ifdef __STDC__ |
#include <stddef.h> |
#endif /* __STDC__ */ |
#ifdef __cplusplus |
extern "C" { |
#endif /* __cplusplus */ |
#include "ansidecl.h" |
/* Sort an array of pointers. */ |
extern void sort_pointers (size_t, void **, void **); |
#ifdef __cplusplus |
} |
#endif /* __cplusplus */ |
#endif /* SORT_H */ |
/contrib/toolchain/binutils/include/splay-tree.h |
---|
0,0 → 1,161 |
/* A splay-tree datatype. |
Copyright 1998, 1999, 2000, 2002, 2005, 2007, 2009, 2010 |
Free Software Foundation, Inc. |
Contributed by Mark Mitchell (mark@markmitchell.com). |
This file is part of GCC. |
GCC is free software; you can redistribute it and/or modify it |
under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2, or (at your option) |
any later version. |
GCC is distributed in the hope that it will be useful, but |
WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with GCC; see the file COPYING. If not, write to |
the Free Software Foundation, 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
/* For an easily readable description of splay-trees, see: |
Lewis, Harry R. and Denenberg, Larry. Data Structures and Their |
Algorithms. Harper-Collins, Inc. 1991. |
The major feature of splay trees is that all basic tree operations |
are amortized O(log n) time for a tree with n nodes. */ |
#ifndef _SPLAY_TREE_H |
#define _SPLAY_TREE_H |
#ifdef __cplusplus |
extern "C" { |
#endif /* __cplusplus */ |
#include "ansidecl.h" |
#ifdef HAVE_STDINT_H |
#include <stdint.h> |
#endif |
#ifdef HAVE_INTTYPES_H |
#include <inttypes.h> |
#endif |
#ifndef GTY |
#define GTY(X) |
#endif |
/* Use typedefs for the key and data types to facilitate changing |
these types, if necessary. These types should be sufficiently wide |
that any pointer or scalar can be cast to these types, and then |
cast back, without loss of precision. */ |
typedef uintptr_t splay_tree_key; |
typedef uintptr_t splay_tree_value; |
/* Forward declaration for a node in the tree. */ |
typedef struct splay_tree_node_s *splay_tree_node; |
/* The type of a function which compares two splay-tree keys. The |
function should return values as for qsort. */ |
typedef int (*splay_tree_compare_fn) (splay_tree_key, splay_tree_key); |
/* The type of a function used to deallocate any resources associated |
with the key. */ |
typedef void (*splay_tree_delete_key_fn) (splay_tree_key); |
/* The type of a function used to deallocate any resources associated |
with the value. */ |
typedef void (*splay_tree_delete_value_fn) (splay_tree_value); |
/* The type of a function used to iterate over the tree. */ |
typedef int (*splay_tree_foreach_fn) (splay_tree_node, void*); |
/* The type of a function used to allocate memory for tree root and |
node structures. The first argument is the number of bytes needed; |
the second is a data pointer the splay tree functions pass through |
to the allocator. This function must never return zero. */ |
typedef void *(*splay_tree_allocate_fn) (int, void *); |
/* The type of a function used to free memory allocated using the |
corresponding splay_tree_allocate_fn. The first argument is the |
memory to be freed; the latter is a data pointer the splay tree |
functions pass through to the freer. */ |
typedef void (*splay_tree_deallocate_fn) (void *, void *); |
/* The nodes in the splay tree. */ |
struct GTY(()) splay_tree_node_s { |
/* The key. */ |
splay_tree_key GTY ((use_param1)) key; |
/* The value. */ |
splay_tree_value GTY ((use_param2)) value; |
/* The left and right children, respectively. */ |
splay_tree_node GTY ((use_params)) left; |
splay_tree_node GTY ((use_params)) right; |
}; |
/* The splay tree itself. */ |
struct GTY(()) splay_tree_s { |
/* The root of the tree. */ |
splay_tree_node GTY ((use_params)) root; |
/* The comparision function. */ |
splay_tree_compare_fn comp; |
/* The deallocate-key function. NULL if no cleanup is necessary. */ |
splay_tree_delete_key_fn delete_key; |
/* The deallocate-value function. NULL if no cleanup is necessary. */ |
splay_tree_delete_value_fn delete_value; |
/* Node allocate function. Takes allocate_data as a parameter. */ |
splay_tree_allocate_fn allocate; |
/* Free function for nodes and trees. Takes allocate_data as a parameter. */ |
splay_tree_deallocate_fn deallocate; |
/* Parameter for allocate/free functions. */ |
void * GTY((skip)) allocate_data; |
}; |
typedef struct splay_tree_s *splay_tree; |
extern splay_tree splay_tree_new (splay_tree_compare_fn, |
splay_tree_delete_key_fn, |
splay_tree_delete_value_fn); |
extern splay_tree splay_tree_new_with_allocator (splay_tree_compare_fn, |
splay_tree_delete_key_fn, |
splay_tree_delete_value_fn, |
splay_tree_allocate_fn, |
splay_tree_deallocate_fn, |
void *); |
extern splay_tree splay_tree_new_typed_alloc (splay_tree_compare_fn, |
splay_tree_delete_key_fn, |
splay_tree_delete_value_fn, |
splay_tree_allocate_fn, |
splay_tree_allocate_fn, |
splay_tree_deallocate_fn, |
void *); |
extern void splay_tree_delete (splay_tree); |
extern splay_tree_node splay_tree_insert (splay_tree, |
splay_tree_key, |
splay_tree_value); |
extern void splay_tree_remove (splay_tree, splay_tree_key); |
extern splay_tree_node splay_tree_lookup (splay_tree, splay_tree_key); |
extern splay_tree_node splay_tree_predecessor (splay_tree, splay_tree_key); |
extern splay_tree_node splay_tree_successor (splay_tree, splay_tree_key); |
extern splay_tree_node splay_tree_max (splay_tree); |
extern splay_tree_node splay_tree_min (splay_tree); |
extern int splay_tree_foreach (splay_tree, splay_tree_foreach_fn, void*); |
extern int splay_tree_compare_ints (splay_tree_key, splay_tree_key); |
extern int splay_tree_compare_pointers (splay_tree_key, splay_tree_key); |
#ifdef __cplusplus |
} |
#endif /* __cplusplus */ |
#endif /* _SPLAY_TREE_H */ |
/contrib/toolchain/binutils/include/symcat.h |
---|
0,0 → 1,55 |
/* Symbol concatenation utilities. |
Copyright (C) 1998, 2000, 2010 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License along |
with this program; if not, write to the Free Software Foundation, Inc., |
51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef SYM_CAT_H |
#define SYM_CAT_H |
#if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE) |
#define CONCAT2(a,b) a##b |
#define CONCAT3(a,b,c) a##b##c |
#define CONCAT4(a,b,c,d) a##b##c##d |
#define CONCAT5(a,b,c,d,e) a##b##c##d##e |
#define CONCAT6(a,b,c,d,e,f) a##b##c##d##e##f |
#define STRINGX(s) #s |
#else |
/* Note one should never pass extra whitespace to the CONCATn macros, |
e.g. CONCAT2(foo, bar) because traditonal C will keep the space between |
the two labels instead of concatenating them. Instead, make sure to |
write CONCAT2(foo,bar). */ |
#define CONCAT2(a,b) a/**/b |
#define CONCAT3(a,b,c) a/**/b/**/c |
#define CONCAT4(a,b,c,d) a/**/b/**/c/**/d |
#define CONCAT5(a,b,c,d,e) a/**/b/**/c/**/d/**/e |
#define CONCAT6(a,b,c,d,e,f) a/**/b/**/c/**/d/**/e/**/f |
#define STRINGX(s) "s" |
#endif |
#define XCONCAT2(a,b) CONCAT2(a,b) |
#define XCONCAT3(a,b,c) CONCAT3(a,b,c) |
#define XCONCAT4(a,b,c,d) CONCAT4(a,b,c,d) |
#define XCONCAT5(a,b,c,d,e) CONCAT5(a,b,c,d,e) |
#define XCONCAT6(a,b,c,d,e,f) CONCAT6(a,b,c,d,e,f) |
/* Note the layer of indirection here is typically used to allow |
stringification of the expansion of macros. I.e. "#define foo |
bar", "XSTRING(foo)", to yield "bar". Be aware that this only |
works for __STDC__, not for traditional C which will still resolve |
to "foo". */ |
#define XSTRING(s) STRINGX(s) |
#endif /* SYM_CAT_H */ |
/contrib/toolchain/binutils/include/timeval-utils.h |
---|
0,0 → 1,40 |
/* Basic struct timeval utilities. |
Copyright (C) 2011 Free Software Foundation, Inc. |
This file is part of the libiberty library. |
Libiberty is free software; you can redistribute it and/or |
modify it under the terms of the GNU Library General Public |
License as published by the Free Software Foundation; either |
version 2 of the License, or (at your option) any later version. |
Libiberty is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
Library General Public License for more details. |
You should have received a copy of the GNU Library General Public |
License along with libiberty; see the file COPYING.LIB. If not, |
write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
#ifndef TIMEVAL_UTILS_H |
#define TIMEVAL_UTILS_H |
#ifdef __cplusplus |
extern "C" { |
#endif /* __cplusplus */ |
/* forward decl */ |
struct timeval; |
extern void timeval_add (struct timeval *result, |
const struct timeval *a, const struct timeval *b); |
extern void timeval_sub (struct timeval *result, |
const struct timeval *a, const struct timeval *b); |
#ifdef __cplusplus |
} |
#endif /* __cplusplus */ |
#endif /* TIMEVAL_UTILS_H */ |
/contrib/toolchain/binutils/include/vms/ChangeLog |
---|
0,0 → 1,87 |
2012-03-08 Tristan Gingold <gingold@adacore.com> |
* lbr.h (struct vms_lhd): Add comments. |
2010-05-27 Tristan Gingold <gingold@adacore.com> |
* lbr.h: Improve comments. |
2010-05-17 Tristan Gingold <gingold@adacore.com> |
* eidc.h: New file. |
* esgps.h: New file. |
2010-05-03 Tristan Gingold <gingold@adacore.com> |
* dmt.h: Improve comments. |
2010-04-30 Tristan Gingold <gingold@adacore.com> |
* lbr.h (struct vms_kbn): New structure. |
2010-04-30 Tristan Gingold <gingold@adacore.com> |
* lbr.h (LBR__C_TYP_ISHSTB): Added. |
(LHD_SANEID4): Renamed to ... |
(LHD_SANEID6): ... this. |
(LBR_MAJORID, LBR_ELFMAJORID): New macros. |
(struct vms_rfa): New structure. |
(struct vms_idxdef): Renamed to ... |
(struct vms_idx): ... this. |
(struct vms_idxdef2): Renamed to ... |
(struct vms_elfidx): ... this. |
(ELFIDX__WEAK, ELFIDX__GROUP, ELFIDX__LISTRFA, ELFIDX__SYMESC): New |
macros. |
(struct vms_lhs, struct vms_lns): New structures. |
(struct vms_mhd): Add missing fields. |
(MHD__C_MHDLEN): New macro. |
2010-03-31 Tristan Gingold <gingold@adacore.com> |
* dcx.h: New file. |
* dsc.h: New file. |
* esdfm.h: New file. |
* esdfv.h: New file. |
* internal.h: New file. |
* lbr.h: New file. |
* prt.h: New file. |
* shl.h (struct vms_shl): Add comments. |
* esrf.h (ESRF__B_NAMLNG): New macro. |
* esdf.h (ESDF__B_NAMLNG): New macro. |
* emh.h: Add macros for fields maximum value. |
* eisd.h (EISD__M_PROTECT): Fix typo in comment. |
Add macros for offsets, version, section type and match control. |
Merge vms_eisd_ext into vms_eisd. |
* eihvn.h (EIHVN__MULTI_PROCESSING_BIT, EIHVN__GALAXY_BIT): Added. |
* eihs.h: Remove blank line. |
* eihd.h (struct vms_eihd): Add comments, add image subtype names. |
* eiha.h (struct vms_eiha): Add inishr and inishr_h fields. |
* eiaf.h (struct vms_eiaf): Fix base_va size. |
* egsy.h: Add comments. |
* egsd.h: Remove blank line. |
* egps.h: Add flag names. |
* eeom.h (EEOM__M_WKTFR): Added. |
* dst.h (DST__K_CXX): Added, and reident languages. |
(DST__K_SRC_INCRLNUM_B): Added. |
Indent and order pcline commands. |
Add record begin/end, enumerations, type specification, value |
specification, label, discontinue range definitions. |
2010-02-17 Tristan Gingold <gingold@adacore.com> |
* dmt.h, dst.h, eeom.h, egps.h, egsd.h, egst.h, egsy.h: New Files. |
* eiaf.h, eicp.h, eiha.h, eihd.h, eihi.h, eihs.h, eihvn.h: Ditto. |
* eisd.h, emh.h, eobjrec.h, esdf.h, esrf.h, etir.h, shl.h: Ditto. |
Copyright (C) 2010-2012 Free Software Foundation, Inc. |
Copying and distribution of this file, with or without modification, |
are permitted in any medium without royalty provided the copyright |
notice and this notice are preserved. |
Local Variables: |
mode: change-log |
left-margin: 8 |
fill-column: 74 |
version-control: never |
End: |
/contrib/toolchain/binutils/include/vms/dcx.h |
---|
0,0 → 1,50 |
/* Alpha VMS external format for DeCompression. |
Copyright 2010 Free Software Foundation, Inc. |
Written by Tristan Gingold <gingold@adacore.com>, AdaCore. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _VMS_DCX_H |
#define _VMS_DCX_H |
struct vms_dcxmap |
{ |
unsigned char size[4]; |
unsigned char version[2]; |
unsigned char pad[2]; |
unsigned char sanity[4]; |
unsigned char flags[4]; |
unsigned char nsubs[2]; |
unsigned char sub0[2]; |
}; |
struct vms_dcxsbm |
{ |
unsigned char size[2]; |
unsigned char min_char; |
unsigned char max_char; |
unsigned char escape; |
unsigned char flags_bits; |
unsigned char flags[2]; |
unsigned char nodes[2]; |
unsigned char next[2]; |
}; |
#endif /* _VMS_DCX_H */ |
/contrib/toolchain/binutils/include/vms/dmt.h |
---|
0,0 → 1,48 |
/* Alpha VMS external format of Debug Module Table. |
Copyright 2010 Free Software Foundation, Inc. |
Written by Tristan Gingold <gingold@adacore.com>, AdaCore. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _VMS_DMT_H |
#define _VMS_DMT_H |
struct vms_dmt_header |
{ |
/* Offset in the DST of the module. */ |
unsigned char modbeg[4]; |
/* Size of the DST chunk for this module. */ |
unsigned char size[4]; |
/* Number of psect for this module. */ |
unsigned char psect_count[2]; |
unsigned char mbz[2]; |
}; |
struct vms_dmt_psect |
{ |
/* Address of the psect. */ |
unsigned char start[4]; |
/* Length of the psect. */ |
unsigned char length[4]; |
}; |
#endif /* _VMS_DMT_H */ |
/contrib/toolchain/binutils/include/vms/dsc.h |
---|
0,0 → 1,129 |
/* Alpha VMS external format of Descriptors. |
Copyright 2010 Free Software Foundation, Inc. |
Written by Tristan Gingold <gingold@adacore.com>, AdaCore. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _VMS_DSC_H |
#define _VMS_DSC_H |
/* Descriptors. */ |
#define DSC__K_DTYPE_Z 0 /* Unspecified. */ |
#define DSC__K_DTYPE_V 1 /* Bit. */ |
#define DSC__K_DTYPE_BU 2 /* Byte logical. */ |
#define DSC__K_DTYPE_WU 3 /* Word logical. */ |
#define DSC__K_DTYPE_LU 4 /* Longword logical. */ |
#define DSC__K_DTYPE_QU 5 /* Quadword logical. */ |
#define DSC__K_DTYPE_B 6 /* Byte integer. */ |
#define DSC__K_DTYPE_W 7 /* Word integer. */ |
#define DSC__K_DTYPE_L 8 /* Longword integer. */ |
#define DSC__K_DTYPE_Q 9 /* Quadword integer. */ |
#define DSC__K_DTYPE_F 10 /* Single-precision floating. */ |
#define DSC__K_DTYPE_D 11 /* Double-precision floating. */ |
#define DSC__K_DTYPE_FC 12 /* Complex. */ |
#define DSC__K_DTYPE_DC 13 /* Double-precision Complex. */ |
#define DSC__K_DTYPE_T 14 /* ASCII text string. */ |
#define DSC__K_DTYPE_NU 15 /* Numeric string, unsigned. */ |
#define DSC__K_DTYPE_NL 16 /* Numeric string, left separate sign. */ |
#define DSC__K_DTYPE_NLO 17 /* Numeric string, left overpunched sign. */ |
#define DSC__K_DTYPE_NR 18 /* Numeric string, right separate sign. */ |
#define DSC__K_DTYPE_NRO 19 /* Numeric string, right overpunched sign. */ |
#define DSC__K_DTYPE_NZ 20 /* Numeric string, zoned sign. */ |
#define DSC__K_DTYPE_P 21 /* Packed decimal string. */ |
#define DSC__K_DTYPE_ZI 22 /* Sequence of instructions. */ |
#define DSC__K_DTYPE_ZEM 23 /* Procedure entry mask. */ |
#define DSC__K_DTYPE_DSC 24 /* Descriptor, used for arrays of dyn strings. */ |
#define DSC__K_DTYPE_OU 25 /* Octaword logical. */ |
#define DSC__K_DTYPE_O 26 /* Octaword integer. */ |
#define DSC__K_DTYPE_G 27 /* Double precision G floating, 64 bit. */ |
#define DSC__K_DTYPE_H 28 /* Quadruple precision floating, 128 bit. */ |
#define DSC__K_DTYPE_GC 29 /* Double precision complex, G floating. */ |
#define DSC__K_DTYPE_HC 30 /* Quadruple precision complex, H floating. */ |
#define DSC__K_DTYPE_CIT 31 /* COBOL intermediate temporary. */ |
#define DSC__K_DTYPE_BPV 32 /* Bound Procedure Value. */ |
#define DSC__K_DTYPE_BLV 33 /* Bound Label Value. */ |
#define DSC__K_DTYPE_VU 34 /* Bit Unaligned. */ |
#define DSC__K_DTYPE_ADT 35 /* Absolute Date-Time. */ |
#define DSC__K_DTYPE_VT 37 /* Varying Text. */ |
#define DSC__K_DTYPE_T2 38 /* 16-bit char. */ |
#define DSC__K_DTYPE_VT2 39 /* 16-bit varying char. */ |
#define DSC__K_CLASS_S 1 /* Fixed-length scalar/string. */ |
#define DSC__K_CLASS_D 2 /* Dynamic string. */ |
#define DSC__K_CLASS_V 3 /* Reserved. */ |
#define DSC__K_CLASS_A 4 /* Contiguous array. */ |
#define DSC__K_CLASS_P 5 /* Procedure argument descriptor. */ |
#define DSC__K_CLASS_PI 6 /* Procedure incarnation descriptor. */ |
#define DSC__K_CLASS_J 7 /* Reserved. */ |
#define DSC__K_CLASS_JI 8 /* Obsolete. */ |
#define DSC__K_CLASS_SD 9 /* Decimal (scalar) string. */ |
#define DSC__K_CLASS_NCA 10 /* Non-contiguous array. */ |
#define DSC__K_CLASS_VS 11 /* Varying string. */ |
#define DSC__K_CLASS_VSA 12 /* Varying string array. */ |
#define DSC__K_CLASS_UBS 13 /* Unaligned bit string. */ |
#define DSC__K_CLASS_UBA 14 /* Unaligned bit array. */ |
#define DSC__K_CLASS_SB 15 /* String with bounds. */ |
#define DSC__K_CLASS_UBSB 16 /* Unaligned bit string with bounds. */ |
/* Common part. */ |
struct vms_dsc |
{ |
unsigned char length[2]; |
unsigned char dtype; |
unsigned char bclass; |
unsigned char pointer[4]; |
}; |
struct vms_dsc64 |
{ |
unsigned char mbo[2]; |
unsigned char dtype; |
unsigned char bclass; |
unsigned char mbmo[4]; |
unsigned char length[8]; |
unsigned char pointer[8]; |
}; |
struct vms_dsc_nca |
{ |
unsigned char length[2]; |
unsigned char dtype; |
unsigned char bclass; |
unsigned char pointer[4]; |
unsigned char scale; |
unsigned char digits; |
unsigned char aflags; |
unsigned char dimct; |
unsigned char arsize[4]; |
unsigned char a0[4]; |
}; |
struct vms_dsc_ubs |
{ |
unsigned char length[2]; |
unsigned char dtype; |
unsigned char bclass; |
unsigned char base[4]; |
unsigned char pos[4]; |
}; |
#endif /* _VMS_DSC_H */ |
/contrib/toolchain/binutils/include/vms/dst.h |
---|
0,0 → 1,274 |
/* Alpha VMS external format of Debug Symbol Table. |
Copyright 2010 Free Software Foundation, Inc. |
Written by Tristan Gingold <gingold@adacore.com>, AdaCore. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _VMS_DST_H |
#define _VMS_DST_H |
/* Also available in vms freeware v5.0 debug/alpha_dstrecrds.sdl. */ |
struct vms_dst_header |
{ |
/* Length. */ |
unsigned char length[2]; |
/* Type. */ |
unsigned char type[2]; |
}; |
/* Beginning of module. */ |
#define DST__K_MODBEG 188 |
/* Some well known languages. */ |
#define DST__K_MACRO 0 |
#define DST__K_BLISS 2 |
#define DST__K_C 7 |
#define DST__K_ADA 9 |
#define DST__K_CXX 15 |
struct vms_dst_modbeg |
{ |
unsigned char flags; |
unsigned char unused; |
unsigned char language[4]; |
unsigned char major[2]; |
unsigned char minor[2]; |
/* Module name ASCIC. */ |
/* Ident name ASCIC. */ |
}; |
/* Routine begin. */ |
#define DST__K_RTNBEG 190 |
struct vms_dst_rtnbeg |
{ |
unsigned char flags; |
/* Address of the code. */ |
unsigned char address[4]; |
/* Procedure descriptor address. */ |
unsigned char pd_address[4]; |
/* Name: ASCIC */ |
}; |
/* Line number. */ |
#define DST__K_LINE_NUM 185 |
struct vms_dst_pcline |
{ |
unsigned char pcline_command; |
unsigned char field[4]; |
}; |
#define DST__K_DELTA_PC_W 1 |
#define DST__K_INCR_LINUM 2 |
#define DST__K_INCR_LINUM_W 3 |
#define DST__K_SET_LINUM_INCR 4 |
#define DST__K_SET_LINUM_INCR_W 5 |
#define DST__K_RESET_LINUM_INCR 6 |
#define DST__K_BEG_STMT_MODE 7 |
#define DST__K_END_STMT_MODE 8 |
#define DST__K_SET_LINUM 9 |
#define DST__K_SET_PC 10 |
#define DST__K_SET_PC_W 11 |
#define DST__K_SET_PC_L 12 |
#define DST__K_SET_STMTNUM 13 |
#define DST__K_TERM 14 |
#define DST__K_TERM_W 15 |
#define DST__K_SET_ABS_PC 16 |
#define DST__K_DELTA_PC_L 17 |
#define DST__K_INCR_LINUM_L 18 |
#define DST__K_SET_LINUM_B 19 |
#define DST__K_SET_LINUM_L 20 |
#define DST__K_TERM_L 21 |
/* Routine end. */ |
#define DST__K_RTNEND 191 |
struct vms_dst_rtnend |
{ |
unsigned char unused; |
unsigned char size[4]; |
}; |
/* Prologue. */ |
#define DST__K_PROLOG 162 |
struct vms_dst_prolog |
{ |
unsigned char bkpt_addr[4]; |
}; |
/* Epilog. */ |
#define DST__K_EPILOG 127 |
struct vms_dst_epilog |
{ |
unsigned char flags; |
unsigned char count[4]; |
}; |
/* Module end. */ |
#define DST__K_MODEND 189 |
/* Block begin. */ |
#define DST__K_BLKBEG 176 |
struct vms_dst_blkbeg |
{ |
unsigned char unused; |
unsigned char address[4]; |
/* Name ASCIC. */ |
}; |
/* Block end. */ |
#define DST__K_BLKEND 177 |
struct vms_dst_blkend |
{ |
unsigned char unused; |
unsigned char size[4]; |
}; |
/* Source correlation. */ |
#define DST__K_SOURCE 155 |
#define DST__K_SRC_DECLFILE 1 |
#define DST__K_SRC_SETFILE 2 |
#define DST__K_SRC_SETREC_L 3 |
#define DST__K_SRC_SETREC_W 4 |
#define DST__K_SRC_SETLNUM_L 5 |
#define DST__K_SRC_SETLNUM_W 6 |
#define DST__K_SRC_INCRLNUM_B 7 |
#define DST__K_SRC_DEFLINES_W 10 |
#define DST__K_SRC_DEFLINES_B 11 |
#define DST__K_SRC_FORMFEED 16 |
struct vms_dst_src_decl_src |
{ |
unsigned char length; |
unsigned char flags; |
unsigned char fileid[2]; |
unsigned char rms_cdt[8]; |
unsigned char rms_ebk[4]; |
unsigned char rms_ffb[2]; |
unsigned char rms_rfo; |
/* Filename ASCIC. */ |
}; |
/* Record begin. */ |
#define DST__K_RECBEG 171 |
struct vms_dst_recbeg |
{ |
unsigned char vflags; |
unsigned char value[4]; |
/* Filename ASCIC. */ |
}; |
/* Record end. */ |
#define DST__K_RECEND 172 |
/* Enumeration begin. */ |
#define DST__K_ENUMBEG 165 |
/* Enumeration element. */ |
#define DST__K_ENUMELT 164 |
/* Enumeration end. */ |
#define DST__K_ENUMEND 166 |
/* Separate type specification. */ |
#define DST__K_SEPTYP 163 |
/* Type specification. */ |
#define DST__K_TYPSPEC 175 |
#define DST__K_TS_ATOM 1 /* Atomic. */ |
#define DST__K_TS_DSC 2 /* VMS Standard descriptor. */ |
#define DST__K_TS_IND 3 /* Indirect. */ |
#define DST__K_TS_TPTR 4 /* Typed pointer. */ |
#define DST__K_TS_PTR 5 /* Pointer. */ |
#define DST__K_TS_PIC 6 /* Pictured. */ |
#define DST__K_TS_ARRAY 7 |
#define DST__K_TS_SET 8 |
#define DST__K_TS_SUBRANGE 9 /* Subrange. */ |
#define DST__K_TS_ADA_DSC 10 /* Ada descriptor. */ |
#define DST__K_TS_FILE 11 |
#define DST__K_TS_AREA 12 /* Area (PL/I). */ |
#define DST__K_TS_OFFSET 13 /* Offset (PL/I). */ |
#define DST__K_TS_NOV_LENG 14 /* Novel Length. */ |
#define DST__K_TS_IND_TSPEC 15 /* Internal to debugger. */ |
#define DST__K_TS_SELF_REL_LABEL 16 /* Self-relative label (PL/I). */ |
#define DST__K_TS_RFA 17 /* (Basic). */ |
#define DST__K_TS_TASK 18 /* (Ada). */ |
#define DST__K_TS_ADA_ARRAY 19 |
#define DST__K_TS_XMOD_IND 20 /* Cross-module indirect type spec. */ |
#define DST__K_TS_CONSTRAINED 21 /* (Ada). */ |
#define DST__K_TS_MAYBE_CONSTR 22 /* Might-be-constrained (Ada). */ |
#define DST__K_TS_DYN_LOV_LENG 23 |
#define DST__K_TS_TPTR_D 24 /* Typed pointer to descriptor. */ |
#define DST__K_TS_SCAN_TREE 25 |
#define DST__K_TS_SCAN_TREEPTR 26 |
#define DST__K_TS_INCOMPLETE 27 |
#define DST__K_TS_BLISS_BLOCK 28 |
#define DST__K_TS_TPTR_64 29 |
#define DST__K_TS_PTR_64 30 |
#define DST__K_TS_REF 31 /* C++ referenced type. */ |
#define DST__K_TS_REF_64 32 |
/* Value Specification. */ |
#define DST__K_VFLAGS_NOVAL 128 /* No value. */ |
#define DST__K_VFLAGS_NOTACTIVE 248 /* Not active at current PC. */ |
#define DST__K_VFLAGS_UNALLOC 249 /* Not allocated. */ |
#define DST__K_VFLAGS_DSC 250 /* Descriptor format. */ |
#define DST__K_VFLAGS_TVS 251 /* Trailing value spec. */ |
#define DST__K_VS_FOLLOWS 253 /* Value specification follow. */ |
#define DST__K_VFLAGS_BITOFFS 255 /* Value is a bit offset. */ |
/* Vflags fields. */ |
#define DST__K_VALKIND_MASK 0x03 |
#define DST__K_INDIR 0x04 |
#define DST__K_DISP 0x08 |
#define DST__K_REGNUM_MASK 0xf0 |
#define DST__K_REGNUM_SHIFT 4 |
#define DST__K_VALKIND_LITERAL 0 |
#define DST__K_VALKIND_ADDR 1 |
#define DST__K_VALKIND_DESC 2 |
#define DST__K_VALKIND_REG 3 |
/* Label. */ |
#define DST__K_LABEL 187 |
struct vms_dst_label |
{ |
unsigned char unused; |
unsigned char value[4]; |
unsigned char name[1]; |
}; |
/* Discontiguous range. */ |
#define DST__K_DIS_RANGE 118 |
#endif /* _VMS_DST_H */ |
/contrib/toolchain/binutils/include/vms/eeom.h |
---|
0,0 → 1,62 |
/* Alpha VMS external format of Extended End Of Module. |
Copyright 2010 Free Software Foundation, Inc. |
Written by Tristan Gingold <gingold@adacore.com>, AdaCore. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _VMS_EEOM_H |
#define _VMS_EEOM_H |
/* Completion flags. */ |
#define EEOM__C_SUCCESS 0 |
#define EEOM__C_WARNING 1 |
#define EEOM__C_ERROR 2 |
#define EEOM__C_ABORT 3 |
struct vms_eeom |
{ |
/* Record type. */ |
unsigned char rectyp[2]; |
/* Record size. */ |
unsigned char size[2]; |
/* Number of conditional linkage pairs. */ |
unsigned char total_lps[4]; |
/* Completion code. */ |
unsigned char comcod[2]; |
/* Transfer address flags. */ |
unsigned char tfrflg; |
/* Pad for alignment. */ |
unsigned char temp; |
/* Psect of transfer address. */ |
unsigned char psindx[4]; |
/* Transfer address. */ |
unsigned char tfradr[8]; |
}; |
#define EEOM__M_WKTFR (1 << 0) /* Transfer address is weak. */ |
#endif /* _VMS_EEOM_H */ |
/contrib/toolchain/binutils/include/vms/egps.h |
---|
0,0 → 1,64 |
/* Alpha VMS external format of Extended Program Section Definition. |
Copyright 2010 Free Software Foundation, Inc. |
Written by Tristan Gingold <gingold@adacore.com>, AdaCore. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _VMS_EGPS_H |
#define _VMS_EGPS_H |
struct vms_egps |
{ |
/* Entry type. */ |
unsigned char gsdtyp[2]; |
/* Length of the entry. */ |
unsigned char gsdsiz[2]; |
/* Psect alignment. */ |
unsigned char align; |
/* Pad for alignment. */ |
unsigned char temp; |
unsigned char flags[2]; |
/* Length of this contribution. */ |
unsigned char alloc[4]; |
/* Name. */ |
unsigned char namlng; |
unsigned char name[31]; |
}; |
#define EGPS__V_PIC (1 << 0) /* Not meaningful. */ |
#define EGPS__V_LIB (1 << 1) /* Defined in a shareable image. */ |
#define EGPS__V_OVR (1 << 2) /* Overlaid contribution. */ |
#define EGPS__V_REL (1 << 3) /* Relocatable. */ |
#define EGPS__V_GBL (1 << 4) /* Global. */ |
#define EGPS__V_SHR (1 << 5) /* Shareable. */ |
#define EGPS__V_EXE (1 << 6) /* Executable. */ |
#define EGPS__V_RD (1 << 7) /* Readable. */ |
#define EGPS__V_WRT (1 << 8) /* Writable. */ |
#define EGPS__V_VEC (1 << 9) /* Change mode dispatch or message vectors. */ |
#define EGPS__V_NOMOD (1 << 10) /* Demand-zero. */ |
#define EGPS__V_COM (1 << 11) /* Conditional storage. */ |
#define EGPS__V_ALLOC_64BIT (1 << 12) /* Allocated in 64-bit space. */ |
#endif /* _VMS_EGPS_H */ |
/contrib/toolchain/binutils/include/vms/egsd.h |
---|
0,0 → 1,60 |
/* Alpha VMS external format of Extended Global Symbol Directory. |
Copyright 2010 Free Software Foundation, Inc. |
Written by Tristan Gingold <gingold@adacore.com>, AdaCore. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _VMS_EGSD_H |
#define _VMS_EGSD_H |
#define EGSD__K_ENTRIES 2 /* Offset to first entry in record. */ |
#define EGSD__C_ENTRIES 2 /* Offset to first entry in record. */ |
#define EGSD__C_PSC 0 /* Psect definition. */ |
#define EGSD__C_SYM 1 /* Symbol specification. */ |
#define EGSD__C_IDC 2 /* Random entity check. */ |
#define EGSD__C_SPSC 5 /* Shareable image psect definition. */ |
#define EGSD__C_SYMV 6 /* Vectored (dual-valued) versions of SYM. */ |
#define EGSD__C_SYMM 7 /* Masked versions of SYM. */ |
#define EGSD__C_SYMG 8 /* EGST - gst version of SYM. */ |
#define EGSD__C_MAXRECTYP 8 /* Maximum entry type defined. */ |
struct vms_egsd |
{ |
/* Record type. */ |
unsigned char rectyp[2]; |
/* Record size. */ |
unsigned char recsiz[2]; |
/* Padding for alignment. */ |
unsigned char alignlw[4]; |
/* Followed by egsd entries. */ |
}; |
struct vms_egsd_entry |
{ |
/* Entry type. */ |
unsigned char gsdtyp[2]; |
/* Length of the entry. */ |
unsigned char gsdsiz[2]; |
}; |
#endif /* _VMS_EGSD_H */ |
/contrib/toolchain/binutils/include/vms/egst.h |
---|
0,0 → 1,39 |
/* Alpha VMS external format of Extended Global Symbol Definition. |
Copyright 2010 Free Software Foundation, Inc. |
Written by Tristan Gingold <gingold@adacore.com>, AdaCore. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _VMS_EGST_H |
#define _VMS_EGST_H |
struct vms_egst |
{ |
struct vms_egsy header; |
unsigned char value[8]; |
unsigned char lp_1[8]; |
unsigned char lp_2[8]; |
unsigned char psindx[4]; |
unsigned char namlng; |
unsigned char name[31]; |
}; |
#endif /* _VMS_EGST_H */ |
/contrib/toolchain/binutils/include/vms/egsy.h |
---|
0,0 → 1,54 |
/* Alpha VMS external format of Extended Global Symbol. |
Copyright 2010 Free Software Foundation, Inc. |
Written by Tristan Gingold <gingold@adacore.com>, AdaCore. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _VMS_EGSY_H |
#define _VMS_EGSY_H |
#define EGSY__W_FLAGS 6 |
#define EGSY__V_WEAK 0x0001 /* Weak symbol definition. */ |
#define EGSY__V_DEF 0x0002 /* Symbol definition. */ |
#define EGSY__V_UNI 0x0004 /* Reserved. */ |
#define EGSY__V_REL 0x0008 /* Relocatable (vs absolute). */ |
#define EGSY__V_COMM 0x0010 /* Conditional symbol def. */ |
#define EGSY__V_VECEP 0x0020 /* Reserved. */ |
#define EGSY__V_NORM 0x0040 /* Normal procedure definition. */ |
#define EGSY__V_QUAD_VAL 0x0080 /* Value exceed 32 bits. */ |
struct vms_egsy |
{ |
/* Entry type. */ |
unsigned char gsdtyp[2]; |
/* Length of the entry. */ |
unsigned char gsdsiz[2]; |
/* Data type. */ |
unsigned char datyp; |
/* Pad for alignment. */ |
unsigned char temp; |
unsigned char flags[2]; |
}; |
#endif /* _VMS_EGSY_H */ |
/contrib/toolchain/binutils/include/vms/eiaf.h |
---|
0,0 → 1,80 |
/* Alpha VMS external format of Extended Image Activator Fixup section. |
Copyright 2010 Free Software Foundation, Inc. |
Written by Tristan Gingold <gingold@adacore.com>, AdaCore. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _VMS_EIAF_H |
#define _VMS_EIAF_H |
struct vms_eiaf |
{ |
/* Version. */ |
unsigned char majorid[4]; |
unsigned char minorid[4]; |
/* Link for image activator use. */ |
unsigned char iaflink[8]; |
/* Link for sharable image fixups. */ |
unsigned char fixuplnk[8]; |
/* Size of EIAF fixed part. */ |
unsigned char size[4]; |
/* Flags. */ |
unsigned char flags[4]; |
/* Offsets to quadword and longword relocation fixup data. */ |
unsigned char qrelfixoff[4]; |
unsigned char lrelfixoff[4]; |
/* Offsets to quardword and longword .address fixup data. */ |
unsigned char qdotadroff[4]; |
unsigned char ldotadroff[4]; |
/* Offset to code address fixup data. */ |
unsigned char codeadroff[4]; |
/* Offset to linkage part fixup data. */ |
unsigned char lpfixoff[4]; |
/* Offset to isect change protection data. */ |
unsigned char chgprtoff[4]; |
/* Offset to shareable image list. */ |
unsigned char shlstoff[4]; |
/* Number of shareable images. */ |
unsigned char shrimgcnt[4]; |
/* Number of extra shareable images allowed. */ |
unsigned char shlextra[4]; |
/* Permanent shareable image context. */ |
unsigned char permctx[4]; |
/* Base address of the image itself. */ |
unsigned char base_va[4]; |
/* Offset to linkage pair with procedure signature fixups. */ |
unsigned char lppsbfixoff[4]; |
}; |
#endif /* _VMS_EIAF_H */ |
/contrib/toolchain/binutils/include/vms/eicp.h |
---|
0,0 → 1,38 |
/* Alpha VMS external format of Extended Image section Change Protection. |
Copyright 2010 Free Software Foundation, Inc. |
Written by Tristan Gingold <gingold@adacore.com>, AdaCore. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _VMS_EICP_H |
#define _VMS_EICP_H |
struct vms_eicp |
{ |
/* Start of section. */ |
unsigned char baseva[8]; |
/* Size in bytes of the image section. */ |
unsigned char size[4]; |
/* New protections. */ |
unsigned char newprt[4]; |
}; |
#endif /* _VMS_EICP_H */ |
/contrib/toolchain/binutils/include/vms/eidc.h |
---|
0,0 → 1,49 |
/* Alpha VMS external format of Ident Consistency check. |
Copyright 2010 Free Software Foundation, Inc. |
Written by Tristan Gingold <gingold@adacore.com>, AdaCore. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _VMS_EIDC_H |
#define _VMS_EIDC_H |
struct vms_eidc |
{ |
/* Record type. */ |
unsigned char rectyp[2]; |
/* Record size. */ |
unsigned char recsiz[2]; |
unsigned char flags[4]; |
/* Entity name (ASCIC). */ |
/* Object name (ASCIC). */ |
/* Ident string (ASCIC or binary BINIDENT set). */ |
unsigned char name[1]; |
}; |
/* Fields of flags. */ |
#define EIDC__V_BINIDENT (1 << 0) /* Ident is a longword. */ |
#define EIDC__V_IDMATCH_SH 1 /* Ident match control. */ |
#define EIDC__V_IDMATCH_MASK 3 |
#define EIDC__V_ERRSEV_SH 3 /* Error severity. */ |
#define EIDC__V_ERRSEV_MASK 7 |
#endif /* _VMS_EIDC_H */ |
/contrib/toolchain/binutils/include/vms/eiha.h |
---|
0,0 → 1,54 |
/* Alpha VMS external format of Extended Image Activation. |
Copyright 2010 Free Software Foundation, Inc. |
Written by Tristan Gingold <gingold@adacore.com>, AdaCore. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _VMS_EIHA_H |
#define _VMS_EIHA_H |
struct vms_eiha |
{ |
/* Size of the struct. */ |
unsigned char size[4]; |
unsigned char spare[4]; |
/* First transfer address. */ |
unsigned char tfradr1[4]; |
unsigned char tfradr1_h[4]; |
/* Second. */ |
unsigned char tfradr2[4]; |
unsigned char tfradr2_h[4]; |
/* Third. */ |
unsigned char tfradr3[4]; |
unsigned char tfradr3_h[4]; |
/* Fourth (must be 0). */ |
unsigned char tfradr4[4]; |
unsigned char tfradr4_h[4]; |
/* Shared image initialization (only if EIHD__V_INISHR is set). */ |
unsigned char inishr[4]; |
unsigned char inishr_h[4]; |
}; |
#endif /* _VMS_EIHA_H */ |
/contrib/toolchain/binutils/include/vms/eihd.h |
---|
0,0 → 1,145 |
/* Alpha VMS external format of Extended Image Header. |
Copyright 2010 Free Software Foundation, Inc. |
Written by Tristan Gingold <gingold@adacore.com>, AdaCore. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _VMS_EIHD_H |
#define _VMS_EIHD_H |
/* Extended Image Header (eihd) structure. */ |
struct vms_eihd |
{ |
/* Version of this EIHD. */ |
unsigned char majorid[4]; |
unsigned char minorid[4]; |
/* Size in bytes of the header. */ |
unsigned char size[4]; |
/* Byte offset to ISD (Image Section Descriptors) list. */ |
unsigned char isdoff[4]; |
/* Byte offset to activation data (off=16). */ |
unsigned char activoff[4]; |
/* Byte offset to symbol table and debugging data. */ |
unsigned char symdbgoff[4]; |
/* Byte offset to image ident. */ |
unsigned char imgidoff[4]; |
/* Byte offset to patch data. */ |
unsigned char patchoff[4]; |
/* RVA of fixup info (off=32). */ |
unsigned char iafva[8]; |
/* RVA of symbol vector. */ |
unsigned char symvva[8]; |
/* Byte offset to version number array (off=48). */ |
unsigned char version_array_off[4]; |
/* Image type. */ |
unsigned char imgtype[4]; |
/* Image subtype. */ |
unsigned char subtype[4]; |
/* Size in bytes of image I/O section requested. */ |
unsigned char imgiocnt[4]; |
/* Nbr of channels requested (off=64). */ |
unsigned char iochancnt[4]; |
/* Requested privilege mask. */ |
unsigned char privreqs[8]; |
/* Number of header diskblocks. */ |
unsigned char hdrblkcnt[4]; |
/* Linker produced image flags. */ |
unsigned char lnkflags[4]; |
/* GBL SEC ident value for linkable image. */ |
unsigned char ident[4]; |
/* SYS$K_VERSION or 0 if not linked with exec. */ |
unsigned char sysver[4]; |
/* Linker match control. */ |
unsigned char matchctl; |
unsigned char fill_1[3]; |
/* Size of the symbol vector in bytes. */ |
unsigned char symvect_size[4]; |
/* Value of /BPAGE. */ |
unsigned char virt_mem_block_size[4]; |
/* Byte offset to extended fixup data. */ |
unsigned char ext_fixup_off[4]; |
/* Byte offset to no_optimize psect table. */ |
unsigned char noopt_psect_off[4]; |
unsigned char fill_2[398]; |
/* CODE identifies image type to MOM. */ |
unsigned char alias[2]; |
}; |
#define EIHD__K_MAJORID 3 /* Major id constant */ |
#define EIHD__K_MINORID 0 /* Minor id constant */ |
/* Image type. */ |
#define EIHD__K_EXE 1 /* Executable image */ |
#define EIHD__K_LIM 2 /* Linkable image. */ |
/* Image subtype. */ |
#define EIHD__C_NATIVE 0 /* Alpha native image. */ |
#define EIHD__C_CLI 1 /* Image is a CLI, run LOGINOUT. */ |
/* Linker image flags. */ |
#define EIHD__M_LNKDEBUG 0x0001 /* Full debugging requested. */ |
#define EIHD__M_LNKNOTFR 0x0002 /* No first transfer address. */ |
#define EIHD__M_NOP0BUFS 0x0004 /* No RMS use of P0 for image I/O. */ |
#define EIHD__M_PICIMG 0x0008 /* PIC image. */ |
#define EIHD__M_P0IMAGE 0x0010 /* P0 only image. */ |
#define EIHD__M_DBGDMT 0x0020 /* Image header has dmt fields. */ |
#define EIHD__M_INISHR 0x0040 /* Transfer array contains LNISHR. */ |
#define EIHD__M_XLATED 0x0080 /* Translated image. */ |
#define EIHD__M_BIND_CODE_SEC 0x0100 /* EXE sect can be put into S0. */ |
#define EIHD__M_BIND_DATA_SEC 0x0200 /* DATA sect can be put into S0. */ |
#define EIHD__M_MKTHREADS 0x0400 /* Multiple kernel threads. */ |
#define EIHD__M_UPCALLS 0x0800 /* Upcalls enabled. */ |
#define EIHD__M_OMV_READY 0x1000 /* Can be processed by OMV. */ |
#define EIHD__M_EXT_BIND_SECT 0x2000 /* May be moved, using ext fixups. */ |
/* Offsets of some fields. */ |
#define EIHD__L_SIZE 8 |
#define EIHD__L_ISDOFF 12 |
#define EIHD__L_SYMDBGOFF 20 |
#define EIHD__Q_SYMVVA 40 |
#define EIHD__L_IMGTYPE 52 |
#define EIHD__C_LENGTH 104 |
#endif /* _VMS_EIHD_H */ |
/contrib/toolchain/binutils/include/vms/eihi.h |
---|
0,0 → 1,50 |
/* Alpha VMS external format of Extended Image Identification. |
Copyright 2010 Free Software Foundation, Inc. |
Written by Tristan Gingold <gingold@adacore.com>, AdaCore. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _VMS_EIHI_H |
#define _VMS_EIHI_H |
#define EIHI__K_MAJORID 1 |
#define EIHI__K_MINORID 2 |
struct vms_eihi |
{ |
unsigned char majorid[4]; |
unsigned char minorid[4]; |
/* Time when this image was linked. */ |
unsigned char linktime[8]; |
/* Image name. */ |
unsigned char imgnam[40]; |
/* Image ident. */ |
unsigned char imgid[16]; |
/* Linker ident. */ |
unsigned char linkid[16]; |
/* Image build ident. */ |
unsigned char imgbid[16]; |
}; |
#endif /* _VMS_EIHI_H */ |
/contrib/toolchain/binutils/include/vms/eihs.h |
---|
0,0 → 1,62 |
/* Alpha VMS external format of Extended Image Symbols and debug table. |
Copyright 2010 Free Software Foundation, Inc. |
Written by Tristan Gingold <gingold@adacore.com>, AdaCore. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _VMS_EIHS_H |
#define _VMS_EIHS_H |
#define EIHS__K_MAJORID 1 |
#define EIHS__K_MINORID 1 |
struct vms_eihs |
{ |
unsigned char majorid[4]; |
unsigned char minorid[4]; |
/* Debug symbol table virtual block number (vbn). */ |
unsigned char dstvbn[4]; |
/* Debug symbol table size. */ |
unsigned char dstsize[4]; |
/* Global symbol table vbn. */ |
unsigned char gstvbn[4]; |
/* Global symtol table size. */ |
unsigned char gstsize[4]; |
/* Debug module table vbn. */ |
unsigned char dmtvbn[4]; |
/* Debug module table size. */ |
unsigned char dmtsize[4]; |
}; |
/* Various offsets. */ |
#define EIHS__L_DSTVBN 8 |
#define EIHS__L_DSTSIZE 12 |
#define EIHS__L_GSTVBN 16 |
#define EIHS__L_GSTSIZE 20 |
#define EIHS__L_DMTVBN 24 |
#define EIHS__L_DMTBYTES 28 |
#endif /* _VMS_EIHS_H */ |
/contrib/toolchain/binutils/include/vms/eihvn.h |
---|
0,0 → 1,58 |
/* Alpha VMS external format of Extended Image Header Version. |
Copyright 2010 Free Software Foundation, Inc. |
Written by Tristan Gingold <gingold@adacore.com>, AdaCore. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _VMS_EIHVN_H |
#define _VMS_EIHVN_H |
struct vms_eihvn |
{ |
unsigned char subsystem_mask[4]; |
}; |
struct vms_eihvn_subversion |
{ |
unsigned char minor[2]; |
unsigned char major[2]; |
}; |
#define EIHVN__BASE_IMAGE_BIT 0 |
#define EIHVN__MEMORY_MANAGEMENT_BIT 1 |
#define EIHVN__IO_BIT 2 |
#define EIHVN__FILES_VOLUMES_BIT 3 |
#define EIHVN__PROCESS_SCHED_BIT 4 |
#define EIHVN__SYSGEN_BIT 5 |
#define EIHVN__CLUSTERS_LOCKMGR_BIT 6 |
#define EIHVN__LOGICAL_NAMES_BIT 7 |
#define EIHVN__SECURITY_BIT 8 |
#define EIHVN__IMAGE_ACTIVATOR_BIT 9 |
#define EIHVN__NETWORKS_BIT 10 |
#define EIHVN__COUNTERS_BIT 11 |
#define EIHVN__STABLE_BIT 12 |
#define EIHVN__MISC_BIT 13 |
#define EIHVN__CPU_BIT 14 |
#define EIHVN__VOLATILE_BIT 15 |
#define EIHVN__SHELL_BIT 16 |
#define EIHVN__POSIX_BIT 17 |
#define EIHVN__MULTI_PROCESSING_BIT 18 |
#define EIHVN__GALAXY_BIT 19 |
#endif /* _VMS_EIHVN_H */ |
/contrib/toolchain/binutils/include/vms/eisd.h |
---|
0,0 → 1,118 |
/* Alpha VMS external format of Extended Image Section Descriptor. |
Copyright 2010 Free Software Foundation, Inc. |
Written by Tristan Gingold <gingold@adacore.com>, AdaCore. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _VMS_EISD_H |
#define _VMS_EISD_H |
/* Flags. */ |
#define EISD__M_GBL 0x0001 /* Global. */ |
#define EISD__M_CRF 0x0002 /* Copy on reference. */ |
#define EISD__M_DZRO 0x0004 /* Demand zero page. */ |
#define EISD__M_WRT 0x0008 /* Writable. */ |
#define EISD__M_INITALCODE 0x0010 /* Part of initialization code. */ |
#define EISD__M_BASED 0x0020 /* Isect is based. */ |
#define EISD__M_FIXUPVEC 0x0040 /* Isect is fixup section. */ |
#define EISD__M_RESIDENT 0x0080 /* Isect is memory resident. */ |
#define EISD__M_VECTOR 0x0100 /* Vector contained in isect. */ |
#define EISD__M_PROTECT 0x0200 /* Isect is protected. */ |
#define EISD__M_LASTCLU 0x0400 /* Last cluster. */ |
#define EISD__M_EXE 0x0800 /* Code isect. */ |
#define EISD__M_NONSHRADR 0x1000 /* Contains non-shareable data. */ |
#define EISD__M_QUAD_LENGTH 0x2000 /* Quad length field valid. */ |
#define EISD__M_ALLOC_64BIT 0x4000 /* Allocate 64-bit space. */ |
#define EISD__K_LEN 36 |
#define EISD__K_LENEND 12 /* For end marker or next block. */ |
#define EISD__K_MAXLENGLBL 84 |
#define EISD__K_GBLNAMLEN 44 /* Size of the field. */ |
struct vms_eisd |
{ |
unsigned char majorid[4]; |
unsigned char minorid[4]; |
/* Size (in bytes) of this eisd. */ |
unsigned char eisdsize[4]; |
/* Size (in bytes) of the section. */ |
unsigned char secsize[4]; |
/* Virtual address of the section. */ |
unsigned char virt_addr[8]; |
/* Flags. */ |
unsigned char flags[4]; |
/* Base virtual block number. */ |
unsigned char vbn[4]; |
/* Page fault cluster. */ |
unsigned char pfc; |
/* Linker match control. */ |
unsigned char matchctl; |
/* Section type. */ |
unsigned char type; |
unsigned char fill_1; |
/* End of structure for normal records. */ |
/* Ident for global section. */ |
unsigned char ident[4]; |
/* Global name ascic. First 8 bytes are quad length field. */ |
unsigned char gblnam[EISD__K_GBLNAMLEN]; |
}; |
/* Versions. */ |
#define EISD__K_MAJORID 1 |
#define EISD__K_MINORID 1 |
/* Match control. */ |
#define EISD__K_MATALL 0 /* Match always. */ |
#define EISD__K_MATEQU 1 /* Match if equal. */ |
#define EISD__K_MATLEQ 2 /* Match if less or equal. */ |
#define EISD__K_MATNEV 3 /* Match never. */ |
/* Section type. */ |
#define EISD__K_NORMAL 0 /* Normal program image section. */ |
#define EISD__K_SHRFXD 1 /* Shareable fixed section. */ |
#define EISD__K_PRVFXD 2 /* Private fixed section. */ |
#define EISD__K_SHRPIC 3 /* Shareable pic section. */ |
#define EISD__K_PRVPIC 4 /* Private PIC section. */ |
#define EISD__K_USRSTACK 253 /* User stack section. */ |
/* EISD offsets. */ |
#define EISD__L_EISDSIZE 8 |
#define EISD__L_SECSIZE 12 |
#define EISD__Q_VIR_ADDR 16 |
#define EISD__L_FLAGS 24 |
#define EISD__L_VBN 28 |
#define EISD__R_CONTROL 32 |
#define EISD__L_IDENT 36 |
#define EISD__T_GBLNAM 40 |
#endif /* _VMS_EISD_H */ |
/contrib/toolchain/binutils/include/vms/emh.h |
---|
0,0 → 1,79 |
/* Alpha VMS external format of Extended Module Header. |
Copyright 2010 Free Software Foundation, Inc. |
Written by Tristan Gingold <gingold@adacore.com>, AdaCore. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _VMS_EMH_H |
#define _VMS_EMH_H |
#define EMH__C_MHD 0 /* Main header record. */ |
#define EMH__C_LNM 1 /* Language name and version. */ |
#define EMH__C_SRC 2 /* Source file specification. */ |
#define EMH__C_TTL 3 /* Title text of module. */ |
#define EMH__C_CPR 4 /* Copyright notice. */ |
#define EMH__C_MTC 5 /* Maintenance status. */ |
#define EMH__C_GTX 6 /* General text. */ |
#define EMH__C_MAXHDRTYP 6 /* Maximum allowable type. */ |
struct vms_emh_common |
{ |
/* Record type. */ |
unsigned char rectyp[2]; |
/* Record size. */ |
unsigned char size[2]; |
/* Subtype. */ |
unsigned char subtyp[2]; |
}; |
struct vms_emh_mhd |
{ |
struct vms_emh_common common; |
unsigned char strlvl; |
unsigned char temp; |
unsigned char arch1[4]; |
unsigned char arch2[4]; |
unsigned char recsiz[4]; |
/* Module name: ASCIC. */ |
/* Module version: ASCIC. */ |
/* Compile data: ASCIC. */ |
}; |
#define EOBJ__C_MAXRECSIZ 8192 /* Maximum legal record size. */ |
#define EOBJ__C_STRLVL 2 /* Structure level. */ |
#define EOBJ__C_SYMSIZ 64 /* Maximum symbol length. */ |
#define EOBJ__C_SECSIZ 31 /* Maximum section name length. */ |
#define EOBJ__C_STOREPLIM -1 /* Maximum repeat count on store commands. */ |
#define EOBJ__C_PSCALILIM 16 /* Maximum p-sect alignment. */ |
struct vms_emh_lnm |
{ |
struct vms_emh_common common; |
/* Language processor name: ASCII. */ |
}; |
#endif /* _VMS_EMH_H */ |
/contrib/toolchain/binutils/include/vms/eobjrec.h |
---|
0,0 → 1,48 |
/* Alpha VMS external format of Extended Object Records. |
Copyright 2010 Free Software Foundation, Inc. |
Written by Tristan Gingold <gingold@adacore.com>, AdaCore. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _VMS_EOBJREC_H |
#define _VMS_EOBJREC_H |
#define EOBJ__C_EMH 8 /* EVAX mdule header record. */ |
#define EOBJ__C_EEOM 9 /* EVAX ed of module record. */ |
#define EOBJ__C_EGSD 10 /* EVAX gobal symbol definition record. */ |
#define EOBJ__C_ETIR 11 /* EVAX txt information record. */ |
#define EOBJ__C_EDBG 12 /* EVAX Dbugger information record. */ |
#define EOBJ__C_ETBT 13 /* EVAX Taceback information record. */ |
#define EOBJ__C_MAXRECTYP 13 /* EVAX Lst assigned record type. */ |
struct vms_eobjrec |
{ |
/* Record type. */ |
unsigned char rectyp[2]; |
/* Record size. */ |
unsigned char size[2]; |
#if 0 |
/* Record subtype. */ |
unsigned char subtyp[2]; |
#endif |
}; |
#endif /* _VMS_EOBJREC_H */ |
/contrib/toolchain/binutils/include/vms/esdf.h |
---|
0,0 → 1,41 |
/* Alpha VMS external format of Extended GSD Global Symbol Definition. |
Copyright 2010 Free Software Foundation, Inc. |
Written by Tristan Gingold <gingold@adacore.com>, AdaCore. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _VMS_ESDF_H |
#define _VMS_ESDF_H |
struct vms_esdf |
{ |
struct vms_egsy header; |
unsigned char value[8]; |
unsigned char code_address[8]; |
unsigned char ca_psindx[4]; |
unsigned char psindx[4]; |
unsigned char namlng; |
unsigned char name[31]; |
}; |
#define ESDF__B_NAMLNG 32 |
#endif /* _VMS_ESDF_H */ |
/contrib/toolchain/binutils/include/vms/esdfm.h |
---|
0,0 → 1,49 |
/* Alpha VMS external format of Extended Symbol Definition for version Mask. |
Copyright 2010 Free Software Foundation, Inc. |
Written by Tristan Gingold <gingold@adacore.com>, AdaCore. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _VMS_ESDFM_H |
#define _VMS_ESDFM_H |
struct vms_esdfm |
{ |
/* Entry type. */ |
unsigned char gsdtyp[2]; |
/* Length of the entry. */ |
unsigned char size[2]; |
/* Data type. */ |
unsigned char datyp; |
/* Pad for alignment. */ |
unsigned char temp; |
unsigned char flags[2]; |
unsigned char value[8]; |
unsigned char psindx[4]; |
unsigned char version_mask[4]; |
unsigned char namlng; |
unsigned char name[31]; |
}; |
#endif /* _VMS_ESDFM_H */ |
/contrib/toolchain/binutils/include/vms/esdfv.h |
---|
0,0 → 1,49 |
/* Alpha VMS external format of Extended Symbol Def for Vectored symbols. |
Copyright 2010 Free Software Foundation, Inc. |
Written by Tristan Gingold <gingold@adacore.com>, AdaCore. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _VMS_ESDFV_H |
#define _VMS_ESDFV_H |
struct vms_esdfv |
{ |
/* Entry type. */ |
unsigned char gsdtyp[2]; |
/* Length of the entry. */ |
unsigned char size[2]; |
/* Data type. */ |
unsigned char datyp; |
/* Pad for alignment. */ |
unsigned char temp; |
unsigned char flags[2]; |
unsigned char value[8]; |
unsigned char psindx[4]; |
unsigned char vector[4]; |
unsigned char namlng; |
unsigned char name[31]; |
}; |
#endif /* _VMS_ESDFV_H */ |
/contrib/toolchain/binutils/include/vms/esgps.h |
---|
0,0 → 1,72 |
/* Alpha VMS external format of Extended Shared Program Section Definition. |
Copyright 2010 Free Software Foundation, Inc. |
Written by Tristan Gingold <gingold@adacore.com>, AdaCore. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _VMS_ESGPS_H |
#define _VMS_ESGPS_H |
struct vms_esgps |
{ |
/* Entry type. */ |
unsigned char gsdtyp[2]; |
/* Length of the entry. */ |
unsigned char gsdsiz[2]; |
/* Psect alignment. */ |
unsigned char align; |
/* Pad for alignment. */ |
unsigned char temp; |
unsigned char flags[2]; |
/* Length of this contribution. */ |
unsigned char alloc[4]; |
/* Image offset of the psect. */ |
unsigned char base[4]; |
/* Symbol vector offset. */ |
unsigned char value[8]; |
/* Name. */ |
unsigned char namlng; |
unsigned char name[31]; |
}; |
/* These are the same as EGPS flags. */ |
#define ESGPS__V_PIC (1 << 0) /* Not meaningful. */ |
#define ESGPS__V_LIB (1 << 1) /* Defined in a shareable image. */ |
#define ESGPS__V_OVR (1 << 2) /* Overlaid contribution. */ |
#define ESGPS__V_REL (1 << 3) /* Relocatable. */ |
#define ESGPS__V_GBL (1 << 4) /* Global. */ |
#define ESGPS__V_SHR (1 << 5) /* Shareable. */ |
#define ESGPS__V_EXE (1 << 6) /* Executable. */ |
#define ESGPS__V_RD (1 << 7) /* Readable. */ |
#define ESGPS__V_WRT (1 << 8) /* Writable. */ |
#define ESGPS__V_VEC (1 << 9) /* Change mode dispatch or message vectors. */ |
#define ESGPS__V_NOMOD (1 << 10) /* Demand-zero. */ |
#define ESGPS__V_COM (1 << 11) /* Conditional storage. */ |
#define ESGPS__V_ALLOC_64BIT (1 << 12) /* Allocated in 64-bit space. */ |
#endif /* _VMS_ESGPS_H */ |
/contrib/toolchain/binutils/include/vms/esrf.h |
---|
0,0 → 1,36 |
/* Alpha VMS external format of Extended GSD Global Symbol Reference. |
Copyright 2010 Free Software Foundation, Inc. |
Written by Tristan Gingold <gingold@adacore.com>, AdaCore. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _VMS_ESRF_H |
#define _VMS_ESRF_H |
struct vms_esrf |
{ |
struct vms_egsy header; |
unsigned char namlng; |
unsigned char name[31]; |
}; |
#define ESRF__B_NAMLNG 8 |
#endif /* _VMS_ESRF_H */ |
/contrib/toolchain/binutils/include/vms/etir.h |
---|
0,0 → 1,114 |
/* Alpha VMS external format of Extended Text Information and Relocation. |
Copyright 2010 Free Software Foundation, Inc. |
Written by Tristan Gingold <gingold@adacore.com>, AdaCore. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _VMS_ETIR_H |
#define _VMS_ETIR_H |
#define ETIR__C_MINSTACOD 0 /* Minimum stack code. */ |
#define ETIR__C_STA_GBL 0 /* Stack global symbol value. */ |
#define ETIR__C_STA_LW 1 /* Stack longword. */ |
#define ETIR__C_STA_QW 2 /* Stack quadword. */ |
#define ETIR__C_STA_PQ 3 /* Stack psect base + quadword off. */ |
#define ETIR__C_STA_LI 4 /* Stack literal. */ |
#define ETIR__C_STA_MOD 5 /* Stack module. */ |
#define ETIR__C_STA_CKARG 6 /* Check Arguments. */ |
#define ETIR__C_MAXSTACOD 6 /* Maximum stack code. */ |
#define ETIR__C_MINSTOCOD 50 /* Minimum store code. */ |
#define ETIR__C_STO_B 50 /* Store byte. */ |
#define ETIR__C_STO_W 51 /* Store word. */ |
#define ETIR__C_STO_LW 52 /* Store longword. */ |
#define ETIR__C_STO_QW 53 /* Store quadword. */ |
#define ETIR__C_STO_IMMR 54 /* Store immediate Repeated. */ |
#define ETIR__C_STO_GBL 55 /* Store global. */ |
#define ETIR__C_STO_CA 56 /* Store code address. */ |
#define ETIR__C_STO_RB 57 /* Store relative branch. */ |
#define ETIR__C_STO_AB 58 /* Store absolute branch. */ |
#define ETIR__C_STO_OFF 59 /* Store offset within psect. */ |
#define ETIR__C_STO_IMM 61 /* Store immediate. */ |
#define ETIR__C_STO_GBL_LW 62 /* Store global Longword. */ |
#define ETIR__C_STO_LP_PSB 63 /* STO_LP_PSB not valid in level 2 use STC_LP_PSB. */ |
#define ETIR__C_STO_HINT_GBL 64 /* Store 14 bit HINT at global address. */ |
#define ETIR__C_STO_HINT_PS 65 /* Store 14 bit HINT at psect + offset */ |
#define ETIR__C_MAXSTOCOD 65 /* Maximum store code. */ |
/* Operate codes. */ |
#define ETIR__C_MINOPRCOD 100 /* Minimum operate code. */ |
#define ETIR__C_OPR_NOP 100 /* No-op. */ |
#define ETIR__C_OPR_ADD 101 /* Add. */ |
#define ETIR__C_OPR_SUB 102 /* Subtract. */ |
#define ETIR__C_OPR_MUL 103 /* Multiply. */ |
#define ETIR__C_OPR_DIV 104 /* Divide. */ |
#define ETIR__C_OPR_AND 105 /* Logical AND. */ |
#define ETIR__C_OPR_IOR 106 /* Logical inclusive OR. */ |
#define ETIR__C_OPR_EOR 107 /* Logical exclusive OR. */ |
#define ETIR__C_OPR_NEG 108 /* Negate. */ |
#define ETIR__C_OPR_COM 109 /* Complement. */ |
#define ETIR__C_OPR_INSV 110 /* Insert bit field. */ |
#define ETIR__C_OPR_ASH 111 /* Arithmetic shift. */ |
#define ETIR__C_OPR_USH 112 /* Unsigned shift. */ |
#define ETIR__C_OPR_ROT 113 /* Rotate. */ |
#define ETIR__C_OPR_SEL 114 /* Select one of 3 long on top of stack. */ |
#define ETIR__C_OPR_REDEF 115 /* Redefine this symbol after pass 2. */ |
#define ETIR__C_OPR_DFLIT 116 /* Define a literal. */ |
#define ETIR__C_MAXOPRCOD 116 /* Maximum operate code. */ |
/* Control codes. */ |
#define ETIR__C_MINCTLCOD 150 /* Minimum control code. */ |
#define ETIR__C_CTL_SETRB 150 /* Set relocation base. */ |
#define ETIR__C_CTL_AUGRB 151 /* Augment relocation base. */ |
#define ETIR__C_CTL_DFLOC 152 /* Define debug location. */ |
#define ETIR__C_CTL_STLOC 153 /* Set debug location. */ |
#define ETIR__C_CTL_STKDL 154 /* Stack debug location. */ |
#define ETIR__C_MAXCTLCOD 154 /* Maximum control code. */ |
/* Store-conditional (STC) codes. */ |
#define ETIR__C_MINSTCCOD 200 /* Minimum store-conditional code. */ |
#define ETIR__C_STC_LP 200 /* STC Linkage Pair. */ |
#define ETIR__C_STC_LP_PSB 201 /* STC Linkage Pair with Proc Signature. */ |
#define ETIR__C_STC_GBL 202 /* STC Address at global address. */ |
#define ETIR__C_STC_GCA 203 /* STC Code Address at global address. */ |
#define ETIR__C_STC_PS 204 /* STC Address at psect + offset. */ |
#define ETIR__C_STC_NOP_GBL 205 /* STC NOP at address of global. */ |
#define ETIR__C_STC_NOP_PS 206 /* STC NOP at pect + offset. */ |
#define ETIR__C_STC_BSR_GBL 207 /* STC BSR at global address. */ |
#define ETIR__C_STC_BSR_PS 208 /* STC BSR at pect + offset. */ |
#define ETIR__C_STC_LDA_GBL 209 /* STC LDA at global address. */ |
#define ETIR__C_STC_LDA_PS 210 /* STC LDA at psect + offset. */ |
#define ETIR__C_STC_BOH_GBL 211 /* STC BSR or Hint at global address. */ |
#define ETIR__C_STC_BOH_PS 212 /* STC BSR or Hint at pect + offset. */ |
#define ETIR__C_STC_NBH_GBL 213 /* STC NOP,BSR or HINT at global address. */ |
#define ETIR__C_STC_NBH_PS 214 /* STC NOP,BSR or HINT at psect + offset. */ |
#define ETIR__C_MAXSTCCOD 214 /* Maximum store-conditional code. */ |
#define ETIR__C_HEADER_SIZE 4 /* Size of the header of a command */ |
struct vms_etir |
{ |
/* Commands. See above. */ |
unsigned char rectyp[2]; |
/* Size (including this header). */ |
unsigned char size[2]; |
}; |
#endif /* _VMS_ETIR_H */ |
/contrib/toolchain/binutils/include/vms/internal.h |
---|
0,0 → 1,63 |
/* Alpha VMS internal format. |
Copyright 2010 Free Software Foundation, Inc. |
Written by Tristan Gingold <gingold@adacore.com>, AdaCore. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _VMS_INTERNAL_H |
#define _VMS_INTERNAL_H |
struct vms_internal_eisd |
{ |
unsigned int majorid; /* Version. */ |
unsigned int minorid; |
unsigned int eisdsize; /* Size (in bytes) of this eisd. */ |
unsigned int secsize; /* Size (in bytes) of the section. */ |
bfd_vma virt_addr; /* Virtual address of the section. */ |
unsigned int flags; /* Flags. */ |
unsigned int vbn; /* Base virtual block number. */ |
unsigned char pfc; /* Page fault cluster. */ |
unsigned char matchctl; /* Linker match control. */ |
unsigned char type; /* Section type. */ |
}; |
struct vms_internal_gbl_eisd |
{ |
struct vms_internal_eisd common; |
unsigned int ident; /* Ident for global section. */ |
unsigned char gblnam[44]; /* Global name ascic. */ |
}; |
struct vms_internal_eisd_map |
{ |
/* Next eisd in the list. */ |
struct vms_internal_eisd_map *next; |
/* Offset in output file. */ |
file_ptr file_pos; |
union |
{ |
struct vms_internal_eisd eisd; |
struct vms_internal_gbl_eisd gbl_eisd; |
} u; |
}; |
#endif /* _VMS_INTERNAL_H */ |
/contrib/toolchain/binutils/include/vms/lbr.h |
---|
0,0 → 1,332 |
/* Alpha VMS external format of Libraries. |
Copyright 2010 Free Software Foundation, Inc. |
Written by Tristan Gingold <gingold@adacore.com>, AdaCore. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _VMS_LBR_H |
#define _VMS_LBR_H |
/* Libray HeaDer. */ |
/* Magic numbers. Should match the major version. */ |
#define LHD_SANEID_DCX 319232342 |
#define LHD_SANEID3 233579905 |
#define LHD_SANEID6 233579911 |
/* Library type. */ |
#define LBR__C_TYP_UNK 0 /* Unknown / unspecified. */ |
#define LBR__C_TYP_OBJ 1 /* Vax object. */ |
#define LBR__C_TYP_MLB 2 /* Macro. */ |
#define LBR__C_TYP_HLP 3 /* Help. */ |
#define LBR__C_TYP_TXT 4 /* Text. */ |
#define LBR__C_TYP_SHSTB 5 /* Vax shareable image. */ |
#define LBR__C_TYP_NCS 6 /* NCS. */ |
#define LBR__C_TYP_EOBJ 7 /* Alpha object. */ |
#define LBR__C_TYP_ESHSTB 8 /* Alpha shareable image. */ |
#define LBR__C_TYP_IOBJ 9 /* IA-64 object. */ |
#define LBR__C_TYP_ISHSTB 10 /* IA-64 shareable image. */ |
struct vms_lhd |
{ |
/* Type of the library. See above. */ |
unsigned char type; |
/* Number of indexes. Generally 1, 2 for object libraries. */ |
unsigned char nindex; |
unsigned char fill_1[2]; |
/* Sanity Id. */ |
unsigned char sanity[4]; |
/* Version. */ |
unsigned char majorid[2]; |
unsigned char minorid[2]; |
/* Tool name. */ |
unsigned char lbrver[32]; |
/* Create time. */ |
unsigned char credat[8]; |
/* Update time. */ |
unsigned char updtim[8]; |
/* Size of the MHD. */ |
unsigned char mhdusz; |
unsigned char idxblkf[2]; /* Unused. */ |
unsigned char fill_2; |
unsigned char closerror[2]; |
unsigned char spareword[2]; |
/* First free block, and number of free blocks. */ |
unsigned char freevbn[4]; |
unsigned char freeblk[4]; |
unsigned char nextrfa[6]; |
unsigned char nextvbn[4]; |
/* Free pre-allocated index block. */ |
/* Number of free blocks. */ |
unsigned char freidxblk[4]; |
/* VBN of a simply linked list of free blocks. The list is terminated by a |
nul VBN. */ |
unsigned char freeidx[4]; |
/* Highest pre-allocated index block and in use. */ |
unsigned char hipreal[4]; |
unsigned char hiprusd[4]; |
/* Number of index blocks in use. */ |
unsigned char idxblks[4]; |
/* Number of index entries. */ |
unsigned char idxcnt[4]; |
/* Number of modules entries. */ |
unsigned char modcnt[4]; |
unsigned char fill_3[2]; |
/* Number of module headers. */ |
unsigned char modhdrs[4]; |
/* Overhead index pointers. */ |
unsigned char idxovh[4]; |
/* Update history records. */ |
unsigned char maxluhrec[2]; |
unsigned char numluhrec[2]; |
unsigned char begluhrfa[6]; |
unsigned char endluhrfa[6]; |
/* DCX map. */ |
unsigned char dcxmapvbn[4]; |
unsigned char fill_4[4 * 13]; |
}; |
/* Known major ids. */ |
#define LBR_MAJORID 3 /* Alpha libraries. */ |
#define LBR_ELFMAJORID 6 /* Elf libraries (new index, new data). */ |
/* Offset of the first IDD. */ |
#define LHD_IDXDESC 196 |
/* InDex Description. */ |
struct vms_idd |
{ |
unsigned char flags[2]; |
/* Max length of the key. */ |
unsigned char keylen[2]; |
/* First index block. */ |
unsigned char vbn[4]; |
}; |
/* IDD flags. */ |
#define IDD__FLAGS_ASCII 1 |
#define IDD__FLAGS_LOCKED 2 |
#define IDD__FLAGS_VARLENIDX 4 |
#define IDD__FLAGS_NOCASECMP 8 |
#define IDD__FLAGS_NOCASENTR 16 |
#define IDD__FLAGS_UPCASNTRY 32 |
#define IDD_LENGTH 8 |
/* Index block. */ |
#define INDEXDEF__LENGTH 512 |
#define INDEXDEF__BLKSIZ 500 |
struct vms_indexdef |
{ |
/* Number of bytes used. */ |
unsigned char used[2]; |
/* VBN of the parent. */ |
unsigned char parent[4]; |
unsigned char fill_1[6]; |
/* The key field contains vms_idx/vms_elfidx structures, which are |
simply a key (= a string) and a rfa. */ |
unsigned char keys[INDEXDEF__BLKSIZ]; |
}; |
/* An offset in a file. */ |
struct vms_rfa |
{ |
/* Logical block number, 1 based. |
0 means that the field is absent. Block size is 512. */ |
unsigned char vbn[4]; |
/* Offset within the block. */ |
unsigned char offset[2]; |
}; |
/* Index keys. For version 3. */ |
struct vms_idx |
{ |
/* Offset from the start of the vbn, so minimum should be |
DATA__DATA (ie 6). */ |
struct vms_rfa rfa; |
unsigned char keylen; |
/* The length of this field is in fact keylen. */ |
unsigned char keyname[256]; |
}; |
/* Index keys, for version 4 and later. */ |
struct vms_elfidx |
{ |
struct vms_rfa rfa; |
unsigned char keylen[2]; |
unsigned char flags; |
unsigned char keyname[256]; |
}; |
/* Flags of elfidx. */ |
#define ELFIDX__WEAK 0x01 /* Weak symbol. */ |
#define ELFIDX__GROUP 0x02 /* Group symbol. */ |
#define ELFIDX__LISTRFA 0x04 /* RFA field points to an LHS. */ |
#define ELFIDX__SYMESC 0x08 /* Long symbol. */ |
#define RFADEF__C_INDEX 0xffff |
/* List head structure. That's what is pointed by rfa when LISTRFA flag |
is set in elfidx. */ |
struct vms_lhs |
{ |
struct vms_rfa ng_g_rfa; /* Non-group global. */ |
struct vms_rfa ng_wk_rfa; /* Non-group weak. */ |
struct vms_rfa g_g_rfa; /* Group global. */ |
struct vms_rfa g_wk_rfa; /* Group weak. */ |
unsigned char flags; |
}; |
/* List node structure. Fields of LHS point to this structure. */ |
struct vms_lns |
{ |
/* Next node in the list. */ |
struct vms_rfa nxtrfa; |
/* Module associated with the key. */ |
struct vms_rfa modrfa; |
}; |
struct vms_datadef |
{ |
/* Number of records in this block. */ |
unsigned char recs; |
unsigned char fill_1; |
/* Next vbn. */ |
unsigned char link[4]; |
/* Data. The first word is the record length, followed by record |
data and a possible pad byte so that record length is always aligned. */ |
unsigned char data[506]; |
}; |
#define DATA__LENGTH 512 |
#define DATA__DATA 6 |
/* Key name block. This is used for keys longer than 128 bytes. */ |
struct vms_kbn |
{ |
/* Length of the key chunk. */ |
unsigned char keylen[2]; |
/* RFA of the next chunk. */ |
struct vms_rfa rfa; |
/* Followed by the key chunk. */ |
}; |
/* Module header. */ |
struct vms_mhd |
{ |
/* Fixed part. */ |
unsigned char lbrflag; |
unsigned char id; |
unsigned char fill_1[2]; |
unsigned char refcnt[4]; |
unsigned char datim[8]; |
unsigned char objstat; |
/* Ident or GSMATCH. */ |
unsigned char objidlng; |
unsigned char objid[31]; |
unsigned char pad1[3]; |
unsigned char otherefcnt[4]; |
unsigned char modsize[4]; |
unsigned char pad2[4]; |
}; |
#define MHD__C_MHDID 0xad /* Value for id. */ |
#define MHD__C_MHDLEN 16 /* Fixed part length. */ |
#define MHD__C_USRDAT 16 |
/* Flags for objstat. */ |
#define MHD__M_SELSRC 0x1 /* Selective search. */ |
#define MHD__M_OBJTIR 0x2 |
#define MHD__M_WKSYM 0x4 |
struct vms_luh |
{ |
unsigned char nxtluhblk[4]; |
unsigned char spare[2]; |
unsigned char data[506]; |
}; |
struct vms_luhdef |
{ |
unsigned char rechdr[2]; |
unsigned char reclen[2]; |
}; |
#define LUH__RECHDRLEN 4 |
#define LUH__RECHDRMRK 0xabba |
#define LUH__DATAFLDLEN 506 |
/* Entry in the history. */ |
struct vms_leh |
{ |
unsigned char date[8]; |
unsigned char nbr_units[2]; |
unsigned char action[2]; /* 1: delete, 2: insert, 3: replaced. */ |
unsigned char idlen; |
/* username |
modules... */ |
}; |
#endif /* _VMS_LBR_H */ |
/contrib/toolchain/binutils/include/vms/prt.h |
---|
0,0 → 1,43 |
/* Alpha VMS external format of Protection values. |
Copyright 2010 Free Software Foundation, Inc. |
Written by Tristan Gingold <gingold@adacore.com>, AdaCore. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _VMS_PRT_H |
#define _VMS_PRT_H |
#define PRT__C_NA 0 /* No access. */ |
#define PRT__C_RESERVED 1 |
#define PRT__C_KW 2 /* Kernel RW. */ |
#define PRT__C_KR 3 /* Kernel RO. */ |
#define PRT__C_UW 4 /* User RW. */ |
#define PRT__C_EW 5 /* Executive RW. */ |
#define PRT__C_ERKW 6 /* Executive RO, Kernel RW. */ |
#define PRT__C_ER 7 /* Executive RO. */ |
#define PRT__C_SW 8 /* Supervisor RW. */ |
#define PRT__C_SREW 9 /* Supervisor RO, Executive RW. */ |
#define PRT__C_SRKW 10 /* Supervisor RO, Kernel RW. */ |
#define PRT__C_SR 11 /* Supervisor RO. */ |
#define PRT__C_URSW 12 /* User RO, Supervisor RW. */ |
#define PRT__C_UREW 13 /* User RO, Executive RW. */ |
#define PRT__C_URKW 14 /* User RO, Kernel RW. */ |
#define PRT__C_UR 15 /* User RO. */ |
#endif /* _VMS_PRT_H */ |
/contrib/toolchain/binutils/include/vms/shl.h |
---|
0,0 → 1,55 |
/* Alpha VMS external format of Shareable image List. |
Copyright 2010 Free Software Foundation, Inc. |
Written by Tristan Gingold <gingold@adacore.com>, AdaCore. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
MA 02110-1301, USA. */ |
#ifndef _VMS_SHL_H |
#define _VMS_SHL_H |
struct vms_shl |
{ |
/* Base address of this shareable image. */ |
unsigned char baseva[4]; |
/* Point in SHL shareable image to SHL in executable image. */ |
unsigned char shlptr[4]; |
/* GSMATCH. */ |
unsigned char ident[4]; |
/* Permanent shareable image context. */ |
unsigned char permctx[4]; |
/* Size of this structure. */ |
unsigned char size; |
unsigned char fill_1[2]; |
/* Flags. */ |
unsigned char flags; |
/* Address of the image control block (in memory). */ |
unsigned char icb[4]; |
/* Image name. ASCIC. */ |
unsigned char imgnam[40]; |
}; |
#endif /* _VMS_SHL_H */ |
/contrib/toolchain/binutils/include/vtv-change-permission.h |
---|
0,0 → 1,55 |
/* Copyright (C) 2013 |
Free Software Foundation |
This file is part of GCC. |
modify it under the terms of the GNU Library General Public License |
as published by the Free Software Foundation; either version 2, or |
(at your option) any later version. |
In addition to the permissions in the GNU Library General Public |
License, the Free Software Foundation gives you unlimited |
permission to link the compiled version of this file into |
combinations with other programs, and to distribute those |
combinations without any restriction coming from the use of this |
file. (The Library Public License restrictions do apply in other |
respects; for example, they cover modification of the file, and |
distribution when not linked into a combined executable.) |
This program is distributed in the hope that it will be useful, but |
WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
Library General Public License for more details. |
You should have received a copy of the GNU Library General Public |
License along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA |
02110-1301, USA. */ |
#ifndef __VTV_H__ |
#define __VTV_H__ |
/* We could have used an enumeration here but it just makes it more |
difficult for the compiler to generate a call to this. These are |
used as arguments to the function __VLTChangePermission, declared |
below. */ |
#define __VLTP_READ_ONLY 0 |
#define __VLTP_READ_WRITE 1 |
#ifdef __cplusplus |
extern "C" void __VLTChangePermission (int); |
#else |
extern void __VLTChangePermission (int); |
#endif |
#ifdef BIG_PAGE_SIZE |
/* TODO - Replace '4096' below with correct big page size. */ |
#define VTV_PAGE_SIZE 4096 |
#else |
#define VTV_PAGE_SIZE 4096 |
#endif |
#endif /* __VTV_H__ */ |
/contrib/toolchain/binutils/include/xregex.h |
---|
0,0 → 1,29 |
/* This file redefines all regex external names before including |
a renamed copy of glibc's regex.h. */ |
#ifndef _XREGEX_H |
#define _XREGEX_H 1 |
# define regfree xregfree |
# define regexec xregexec |
# define regcomp xregcomp |
# define regerror xregerror |
# define regoff_t xregoff_t |
# define re_set_registers xre_set_registers |
# define re_match_2 xre_match_2 |
# define re_match xre_match |
# define re_search xre_search |
# define re_compile_pattern xre_compile_pattern |
# define re_set_syntax xre_set_syntax |
# define re_search_2 xre_search_2 |
# define re_compile_fastmap xre_compile_fastmap |
# define re_syntax_options xre_syntax_options |
# define re_max_failures xre_max_failures |
# define _REGEX_RE_COMP |
# define re_comp xre_comp |
# define re_exec xre_exec |
#include "xregex2.h" |
#endif /* xregex.h */ |
/contrib/toolchain/binutils/include/xregex2.h |
---|
0,0 → 1,565 |
/* Definitions for data structures and routines for the regular |
expression library, version 0.12. |
Copyright (C) 1985, 1989, 1990, 1991, 1992, 1993, 1995, 1996, 1997, |
1998, 2000, 2005 Free Software Foundation, Inc. |
This file is part of the GNU C Library. Its master source is NOT part of |
the C library, however. The master source lives in /gd/gnu/lib. |
The GNU C Library is free software; you can redistribute it and/or |
modify it under the terms of the GNU Lesser General Public |
License as published by the Free Software Foundation; either |
version 2.1 of the License, or (at your option) any later version. |
The GNU C Library is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
Lesser General Public License for more details. |
You should have received a copy of the GNU Lesser General Public |
License along with the GNU C Library; if not, write to the Free |
Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
02110-1301 USA. */ |
#ifndef _REGEX_H |
#define _REGEX_H 1 |
/* Allow the use in C++ code. */ |
#ifdef __cplusplus |
extern "C" { |
#endif |
/* POSIX says that <sys/types.h> must be included (by the caller) before |
<regex.h>. */ |
#if !defined _POSIX_C_SOURCE && !defined _POSIX_SOURCE && defined VMS |
/* VMS doesn't have `size_t' in <sys/types.h>, even though POSIX says it |
should be there. */ |
# include <stddef.h> |
#endif |
/* The following two types have to be signed and unsigned integer type |
wide enough to hold a value of a pointer. For most ANSI compilers |
ptrdiff_t and size_t should be likely OK. Still size of these two |
types is 2 for Microsoft C. Ugh... */ |
typedef long int s_reg_t; |
typedef unsigned long int active_reg_t; |
/* The following bits are used to determine the regexp syntax we |
recognize. The set/not-set meanings are chosen so that Emacs syntax |
remains the value 0. The bits are given in alphabetical order, and |
the definitions shifted by one from the previous bit; thus, when we |
add or remove a bit, only one other definition need change. */ |
typedef unsigned long int reg_syntax_t; |
/* If this bit is not set, then \ inside a bracket expression is literal. |
If set, then such a \ quotes the following character. */ |
#define RE_BACKSLASH_ESCAPE_IN_LISTS ((unsigned long int) 1) |
/* If this bit is not set, then + and ? are operators, and \+ and \? are |
literals. |
If set, then \+ and \? are operators and + and ? are literals. */ |
#define RE_BK_PLUS_QM (RE_BACKSLASH_ESCAPE_IN_LISTS << 1) |
/* If this bit is set, then character classes are supported. They are: |
[:alpha:], [:upper:], [:lower:], [:digit:], [:alnum:], [:xdigit:], |
[:space:], [:print:], [:punct:], [:graph:], and [:cntrl:]. |
If not set, then character classes are not supported. */ |
#define RE_CHAR_CLASSES (RE_BK_PLUS_QM << 1) |
/* If this bit is set, then ^ and $ are always anchors (outside bracket |
expressions, of course). |
If this bit is not set, then it depends: |
^ is an anchor if it is at the beginning of a regular |
expression or after an open-group or an alternation operator; |
$ is an anchor if it is at the end of a regular expression, or |
before a close-group or an alternation operator. |
This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, because |
POSIX draft 11.2 says that * etc. in leading positions is undefined. |
We already implemented a previous draft which made those constructs |
invalid, though, so we haven't changed the code back. */ |
#define RE_CONTEXT_INDEP_ANCHORS (RE_CHAR_CLASSES << 1) |
/* If this bit is set, then special characters are always special |
regardless of where they are in the pattern. |
If this bit is not set, then special characters are special only in |
some contexts; otherwise they are ordinary. Specifically, |
* + ? and intervals are only special when not after the beginning, |
open-group, or alternation operator. */ |
#define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1) |
/* If this bit is set, then *, +, ?, and { cannot be first in an re or |
immediately after an alternation or begin-group operator. */ |
#define RE_CONTEXT_INVALID_OPS (RE_CONTEXT_INDEP_OPS << 1) |
/* If this bit is set, then . matches newline. |
If not set, then it doesn't. */ |
#define RE_DOT_NEWLINE (RE_CONTEXT_INVALID_OPS << 1) |
/* If this bit is set, then . doesn't match NUL. |
If not set, then it does. */ |
#define RE_DOT_NOT_NULL (RE_DOT_NEWLINE << 1) |
/* If this bit is set, nonmatching lists [^...] do not match newline. |
If not set, they do. */ |
#define RE_HAT_LISTS_NOT_NEWLINE (RE_DOT_NOT_NULL << 1) |
/* If this bit is set, either \{...\} or {...} defines an |
interval, depending on RE_NO_BK_BRACES. |
If not set, \{, \}, {, and } are literals. */ |
#define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1) |
/* If this bit is set, +, ? and | aren't recognized as operators. |
If not set, they are. */ |
#define RE_LIMITED_OPS (RE_INTERVALS << 1) |
/* If this bit is set, newline is an alternation operator. |
If not set, newline is literal. */ |
#define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1) |
/* If this bit is set, then `{...}' defines an interval, and \{ and \} |
are literals. |
If not set, then `\{...\}' defines an interval. */ |
#define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1) |
/* If this bit is set, (...) defines a group, and \( and \) are literals. |
If not set, \(...\) defines a group, and ( and ) are literals. */ |
#define RE_NO_BK_PARENS (RE_NO_BK_BRACES << 1) |
/* If this bit is set, then \<digit> matches <digit>. |
If not set, then \<digit> is a back-reference. */ |
#define RE_NO_BK_REFS (RE_NO_BK_PARENS << 1) |
/* If this bit is set, then | is an alternation operator, and \| is literal. |
If not set, then \| is an alternation operator, and | is literal. */ |
#define RE_NO_BK_VBAR (RE_NO_BK_REFS << 1) |
/* If this bit is set, then an ending range point collating higher |
than the starting range point, as in [z-a], is invalid. |
If not set, then when ending range point collates higher than the |
starting range point, the range is ignored. */ |
#define RE_NO_EMPTY_RANGES (RE_NO_BK_VBAR << 1) |
/* If this bit is set, then an unmatched ) is ordinary. |
If not set, then an unmatched ) is invalid. */ |
#define RE_UNMATCHED_RIGHT_PAREN_ORD (RE_NO_EMPTY_RANGES << 1) |
/* If this bit is set, succeed as soon as we match the whole pattern, |
without further backtracking. */ |
#define RE_NO_POSIX_BACKTRACKING (RE_UNMATCHED_RIGHT_PAREN_ORD << 1) |
/* If this bit is set, do not process the GNU regex operators. |
If not set, then the GNU regex operators are recognized. */ |
#define RE_NO_GNU_OPS (RE_NO_POSIX_BACKTRACKING << 1) |
/* If this bit is set, turn on internal regex debugging. |
If not set, and debugging was on, turn it off. |
This only works if regex.c is compiled -DDEBUG. |
We define this bit always, so that all that's needed to turn on |
debugging is to recompile regex.c; the calling code can always have |
this bit set, and it won't affect anything in the normal case. */ |
#define RE_DEBUG (RE_NO_GNU_OPS << 1) |
/* If this bit is set, a syntactically invalid interval is treated as |
a string of ordinary characters. For example, the ERE 'a{1' is |
treated as 'a\{1'. */ |
#define RE_INVALID_INTERVAL_ORD (RE_DEBUG << 1) |
/* This global variable defines the particular regexp syntax to use (for |
some interfaces). When a regexp is compiled, the syntax used is |
stored in the pattern buffer, so changing this does not affect |
already-compiled regexps. */ |
extern reg_syntax_t re_syntax_options; |
/* Define combinations of the above bits for the standard possibilities. |
(The [[[ comments delimit what gets put into the Texinfo file, so |
don't delete them!) */ |
/* [[[begin syntaxes]]] */ |
#define RE_SYNTAX_EMACS 0 |
#define RE_SYNTAX_AWK \ |
(RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DOT_NOT_NULL \ |
| RE_NO_BK_PARENS | RE_NO_BK_REFS \ |
| RE_NO_BK_VBAR | RE_NO_EMPTY_RANGES \ |
| RE_DOT_NEWLINE | RE_CONTEXT_INDEP_ANCHORS \ |
| RE_UNMATCHED_RIGHT_PAREN_ORD | RE_NO_GNU_OPS) |
#define RE_SYNTAX_GNU_AWK \ |
((RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DEBUG) \ |
& ~(RE_DOT_NOT_NULL | RE_INTERVALS | RE_CONTEXT_INDEP_OPS)) |
#define RE_SYNTAX_POSIX_AWK \ |
(RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS \ |
| RE_INTERVALS | RE_NO_GNU_OPS) |
#define RE_SYNTAX_GREP \ |
(RE_BK_PLUS_QM | RE_CHAR_CLASSES \ |
| RE_HAT_LISTS_NOT_NEWLINE | RE_INTERVALS \ |
| RE_NEWLINE_ALT) |
#define RE_SYNTAX_EGREP \ |
(RE_CHAR_CLASSES | RE_CONTEXT_INDEP_ANCHORS \ |
| RE_CONTEXT_INDEP_OPS | RE_HAT_LISTS_NOT_NEWLINE \ |
| RE_NEWLINE_ALT | RE_NO_BK_PARENS \ |
| RE_NO_BK_VBAR) |
#define RE_SYNTAX_POSIX_EGREP \ |
(RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES \ |
| RE_INVALID_INTERVAL_ORD) |
/* P1003.2/D11.2, section 4.20.7.1, lines 5078ff. */ |
#define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC |
#define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC |
/* Syntax bits common to both basic and extended POSIX regex syntax. */ |
#define _RE_SYNTAX_POSIX_COMMON \ |
(RE_CHAR_CLASSES | RE_DOT_NEWLINE | RE_DOT_NOT_NULL \ |
| RE_INTERVALS | RE_NO_EMPTY_RANGES) |
#define RE_SYNTAX_POSIX_BASIC \ |
(_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM) |
/* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes |
RE_LIMITED_OPS, i.e., \? \+ \| are not recognized. Actually, this |
isn't minimal, since other operators, such as \`, aren't disabled. */ |
#define RE_SYNTAX_POSIX_MINIMAL_BASIC \ |
(_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS) |
#define RE_SYNTAX_POSIX_EXTENDED \ |
(_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \ |
| RE_CONTEXT_INDEP_OPS | RE_NO_BK_BRACES \ |
| RE_NO_BK_PARENS | RE_NO_BK_VBAR \ |
| RE_CONTEXT_INVALID_OPS | RE_UNMATCHED_RIGHT_PAREN_ORD) |
/* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INDEP_OPS is |
removed and RE_NO_BK_REFS is added. */ |
#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED \ |
(_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \ |
| RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES \ |
| RE_NO_BK_PARENS | RE_NO_BK_REFS \ |
| RE_NO_BK_VBAR | RE_UNMATCHED_RIGHT_PAREN_ORD) |
/* [[[end syntaxes]]] */ |
/* Maximum number of duplicates an interval can allow. Some systems |
(erroneously) define this in other header files, but we want our |
value, so remove any previous define. */ |
#ifdef RE_DUP_MAX |
# undef RE_DUP_MAX |
#endif |
/* If sizeof(int) == 2, then ((1 << 15) - 1) overflows. */ |
#define RE_DUP_MAX (0x7fff) |
/* POSIX `cflags' bits (i.e., information for `regcomp'). */ |
/* If this bit is set, then use extended regular expression syntax. |
If not set, then use basic regular expression syntax. */ |
#define REG_EXTENDED 1 |
/* If this bit is set, then ignore case when matching. |
If not set, then case is significant. */ |
#define REG_ICASE (REG_EXTENDED << 1) |
/* If this bit is set, then anchors do not match at newline |
characters in the string. |
If not set, then anchors do match at newlines. */ |
#define REG_NEWLINE (REG_ICASE << 1) |
/* If this bit is set, then report only success or fail in regexec. |
If not set, then returns differ between not matching and errors. */ |
#define REG_NOSUB (REG_NEWLINE << 1) |
/* POSIX `eflags' bits (i.e., information for regexec). */ |
/* If this bit is set, then the beginning-of-line operator doesn't match |
the beginning of the string (presumably because it's not the |
beginning of a line). |
If not set, then the beginning-of-line operator does match the |
beginning of the string. */ |
#define REG_NOTBOL 1 |
/* Like REG_NOTBOL, except for the end-of-line. */ |
#define REG_NOTEOL (1 << 1) |
/* If any error codes are removed, changed, or added, update the |
`re_error_msg' table in regex.c. */ |
typedef enum |
{ |
#ifdef _XOPEN_SOURCE |
REG_ENOSYS = -1, /* This will never happen for this implementation. */ |
#endif |
REG_NOERROR = 0, /* Success. */ |
REG_NOMATCH, /* Didn't find a match (for regexec). */ |
/* POSIX regcomp return error codes. (In the order listed in the |
standard.) */ |
REG_BADPAT, /* Invalid pattern. */ |
REG_ECOLLATE, /* Not implemented. */ |
REG_ECTYPE, /* Invalid character class name. */ |
REG_EESCAPE, /* Trailing backslash. */ |
REG_ESUBREG, /* Invalid back reference. */ |
REG_EBRACK, /* Unmatched left bracket. */ |
REG_EPAREN, /* Parenthesis imbalance. */ |
REG_EBRACE, /* Unmatched \{. */ |
REG_BADBR, /* Invalid contents of \{\}. */ |
REG_ERANGE, /* Invalid range end. */ |
REG_ESPACE, /* Ran out of memory. */ |
REG_BADRPT, /* No preceding re for repetition op. */ |
/* Error codes we've added. */ |
REG_EEND, /* Premature end. */ |
REG_ESIZE, /* Compiled pattern bigger than 2^16 bytes. */ |
REG_ERPAREN /* Unmatched ) or \); not returned from regcomp. */ |
} reg_errcode_t; |
/* This data structure represents a compiled pattern. Before calling |
the pattern compiler, the fields `buffer', `allocated', `fastmap', |
`translate', and `no_sub' can be set. After the pattern has been |
compiled, the `re_nsub' field is available. All other fields are |
private to the regex routines. */ |
#ifndef RE_TRANSLATE_TYPE |
# define RE_TRANSLATE_TYPE char * |
#endif |
struct re_pattern_buffer |
{ |
/* [[[begin pattern_buffer]]] */ |
/* Space that holds the compiled pattern. It is declared as |
`unsigned char *' because its elements are |
sometimes used as array indexes. */ |
unsigned char *buffer; |
/* Number of bytes to which `buffer' points. */ |
unsigned long int allocated; |
/* Number of bytes actually used in `buffer'. */ |
unsigned long int used; |
/* Syntax setting with which the pattern was compiled. */ |
reg_syntax_t syntax; |
/* Pointer to a fastmap, if any, otherwise zero. re_search uses |
the fastmap, if there is one, to skip over impossible |
starting points for matches. */ |
char *fastmap; |
/* Either a translate table to apply to all characters before |
comparing them, or zero for no translation. The translation |
is applied to a pattern when it is compiled and to a string |
when it is matched. */ |
RE_TRANSLATE_TYPE translate; |
/* Number of subexpressions found by the compiler. */ |
size_t re_nsub; |
/* Zero if this pattern cannot match the empty string, one else. |
Well, in truth it's used only in `re_search_2', to see |
whether or not we should use the fastmap, so we don't set |
this absolutely perfectly; see `re_compile_fastmap' (the |
`duplicate' case). */ |
unsigned can_be_null : 1; |
/* If REGS_UNALLOCATED, allocate space in the `regs' structure |
for `max (RE_NREGS, re_nsub + 1)' groups. |
If REGS_REALLOCATE, reallocate space if necessary. |
If REGS_FIXED, use what's there. */ |
#define REGS_UNALLOCATED 0 |
#define REGS_REALLOCATE 1 |
#define REGS_FIXED 2 |
unsigned regs_allocated : 2; |
/* Set to zero when `regex_compile' compiles a pattern; set to one |
by `re_compile_fastmap' if it updates the fastmap. */ |
unsigned fastmap_accurate : 1; |
/* If set, `re_match_2' does not return information about |
subexpressions. */ |
unsigned no_sub : 1; |
/* If set, a beginning-of-line anchor doesn't match at the |
beginning of the string. */ |
unsigned not_bol : 1; |
/* Similarly for an end-of-line anchor. */ |
unsigned not_eol : 1; |
/* If true, an anchor at a newline matches. */ |
unsigned newline_anchor : 1; |
/* [[[end pattern_buffer]]] */ |
}; |
typedef struct re_pattern_buffer regex_t; |
/* Type for byte offsets within the string. POSIX mandates this. */ |
typedef int regoff_t; |
/* This is the structure we store register match data in. See |
regex.texinfo for a full description of what registers match. */ |
struct re_registers |
{ |
unsigned num_regs; |
regoff_t *start; |
regoff_t *end; |
}; |
/* If `regs_allocated' is REGS_UNALLOCATED in the pattern buffer, |
`re_match_2' returns information about at least this many registers |
the first time a `regs' structure is passed. */ |
#ifndef RE_NREGS |
# define RE_NREGS 30 |
#endif |
/* POSIX specification for registers. Aside from the different names than |
`re_registers', POSIX uses an array of structures, instead of a |
structure of arrays. */ |
typedef struct |
{ |
regoff_t rm_so; /* Byte offset from string's start to substring's start. */ |
regoff_t rm_eo; /* Byte offset from string's start to substring's end. */ |
} regmatch_t; |
/* Declarations for routines. */ |
/* To avoid duplicating every routine declaration -- once with a |
prototype (if we are ANSI), and once without (if we aren't) -- we |
use the following macro to declare argument types. This |
unfortunately clutters up the declarations a bit, but I think it's |
worth it. */ |
/* Sets the current default syntax to SYNTAX, and return the old syntax. |
You can also simply assign to the `re_syntax_options' variable. */ |
extern reg_syntax_t re_set_syntax (reg_syntax_t syntax); |
/* Compile the regular expression PATTERN, with length LENGTH |
and syntax given by the global `re_syntax_options', into the buffer |
BUFFER. Return NULL if successful, and an error string if not. */ |
extern const char *re_compile_pattern (const char *pattern, size_t length, |
struct re_pattern_buffer *buffer); |
/* Compile a fastmap for the compiled pattern in BUFFER; used to |
accelerate searches. Return 0 if successful and -2 if was an |
internal error. */ |
extern int re_compile_fastmap (struct re_pattern_buffer *buffer); |
/* Search in the string STRING (with length LENGTH) for the pattern |
compiled into BUFFER. Start searching at position START, for RANGE |
characters. Return the starting position of the match, -1 for no |
match, or -2 for an internal error. Also return register |
information in REGS (if REGS and BUFFER->no_sub are nonzero). */ |
extern int re_search (struct re_pattern_buffer *buffer, const char *string, |
int length, int start, int range, |
struct re_registers *regs); |
/* Like `re_search', but search in the concatenation of STRING1 and |
STRING2. Also, stop searching at index START + STOP. */ |
extern int re_search_2 (struct re_pattern_buffer *buffer, const char *string1, |
int length1, const char *string2, int length2, |
int start, int range, struct re_registers *regs, |
int stop); |
/* Like `re_search', but return how many characters in STRING the regexp |
in BUFFER matched, starting at position START. */ |
extern int re_match (struct re_pattern_buffer *buffer, const char *string, |
int length, int start, struct re_registers *regs); |
/* Relates to `re_match' as `re_search_2' relates to `re_search'. */ |
extern int re_match_2 (struct re_pattern_buffer *buffer, const char *string1, |
int length1, const char *string2, int length2, |
int start, struct re_registers *regs, int stop); |
/* Set REGS to hold NUM_REGS registers, storing them in STARTS and |
ENDS. Subsequent matches using BUFFER and REGS will use this memory |
for recording register information. STARTS and ENDS must be |
allocated with malloc, and must each be at least `NUM_REGS * sizeof |
(regoff_t)' bytes long. |
If NUM_REGS == 0, then subsequent matches should allocate their own |
register data. |
Unless this function is called, the first search or match using |
PATTERN_BUFFER will allocate its own register data, without |
freeing the old data. */ |
extern void re_set_registers (struct re_pattern_buffer *buffer, |
struct re_registers *regs, |
unsigned num_regs, regoff_t *starts, |
regoff_t *ends); |
#if defined _REGEX_RE_COMP || defined _LIBC |
# ifndef _CRAY |
/* 4.2 bsd compatibility. */ |
extern char *re_comp (const char *); |
extern int re_exec (const char *); |
# endif |
#endif |
/* GCC 2.95 and later have "__restrict"; C99 compilers have |
"restrict", and "configure" may have defined "restrict". */ |
#ifndef __restrict |
# if ! (2 < __GNUC__ || (2 == __GNUC__ && 95 <= __GNUC_MINOR__)) |
# if defined restrict || 199901L <= __STDC_VERSION__ |
# define __restrict restrict |
# else |
# define __restrict |
# endif |
# endif |
#endif |
/* GCC 3.1 and later support declaring arrays as non-overlapping |
using the syntax array_name[restrict] */ |
#ifndef __restrict_arr |
# if ! (3 < __GNUC__ || (3 == __GNUC__ && 1 <= __GNUC_MINOR__)) || defined (__GNUG__) |
# define __restrict_arr |
# else |
# define __restrict_arr __restrict |
# endif |
#endif |
/* POSIX compatibility. */ |
extern int regcomp (regex_t *__restrict __preg, |
const char *__restrict __pattern, |
int __cflags); |
#if (__GNUC__) |
__extension__ |
#endif |
extern int regexec (const regex_t *__restrict __preg, |
const char *__restrict __string, size_t __nmatch, |
regmatch_t __pmatch[__restrict_arr], |
int __eflags); |
extern size_t regerror (int __errcode, const regex_t *__preg, |
char *__errbuf, size_t __errbuf_size); |
extern void regfree (regex_t *__preg); |
#ifdef __cplusplus |
} |
#endif /* C++ */ |
#endif /* regex.h */ |
/* |
Local variables: |
make-backup-files: t |
version-control: t |
trim-versions-without-asking: nil |
End: |
*/ |
/contrib/toolchain/binutils/include/xtensa-config.h |
---|
0,0 → 1,177 |
/* Xtensa configuration settings. |
Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010 |
Free Software Foundation, Inc. |
Contributed by Bob Wilson (bob.wilson@acm.org) at Tensilica. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2, or (at your option) |
any later version. |
This program is distributed in the hope that it will be useful, but |
WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifndef XTENSA_CONFIG_H |
#define XTENSA_CONFIG_H |
/* The macros defined here match those with the same names in the Xtensa |
compile-time HAL (Hardware Abstraction Layer). Please refer to the |
Xtensa System Software Reference Manual for documentation of these |
macros. */ |
#undef XCHAL_HAVE_BE |
#define XCHAL_HAVE_BE 1 |
#undef XCHAL_HAVE_DENSITY |
#define XCHAL_HAVE_DENSITY 1 |
#undef XCHAL_HAVE_CONST16 |
#define XCHAL_HAVE_CONST16 0 |
#undef XCHAL_HAVE_ABS |
#define XCHAL_HAVE_ABS 1 |
#undef XCHAL_HAVE_ADDX |
#define XCHAL_HAVE_ADDX 1 |
#undef XCHAL_HAVE_L32R |
#define XCHAL_HAVE_L32R 1 |
#undef XSHAL_USE_ABSOLUTE_LITERALS |
#define XSHAL_USE_ABSOLUTE_LITERALS 0 |
#undef XSHAL_HAVE_TEXT_SECTION_LITERALS |
#define XSHAL_HAVE_TEXT_SECTION_LITERALS 1 /* Set if there is some memory that allows both code and literals. */ |
#undef XCHAL_HAVE_MAC16 |
#define XCHAL_HAVE_MAC16 0 |
#undef XCHAL_HAVE_MUL16 |
#define XCHAL_HAVE_MUL16 1 |
#undef XCHAL_HAVE_MUL32 |
#define XCHAL_HAVE_MUL32 1 |
#undef XCHAL_HAVE_MUL32_HIGH |
#define XCHAL_HAVE_MUL32_HIGH 0 |
#undef XCHAL_HAVE_DIV32 |
#define XCHAL_HAVE_DIV32 1 |
#undef XCHAL_HAVE_NSA |
#define XCHAL_HAVE_NSA 1 |
#undef XCHAL_HAVE_MINMAX |
#define XCHAL_HAVE_MINMAX 1 |
#undef XCHAL_HAVE_SEXT |
#define XCHAL_HAVE_SEXT 1 |
#undef XCHAL_HAVE_LOOPS |
#define XCHAL_HAVE_LOOPS 1 |
#undef XCHAL_HAVE_THREADPTR |
#define XCHAL_HAVE_THREADPTR 1 |
#undef XCHAL_HAVE_RELEASE_SYNC |
#define XCHAL_HAVE_RELEASE_SYNC 1 |
#undef XCHAL_HAVE_S32C1I |
#define XCHAL_HAVE_S32C1I 1 |
#undef XCHAL_HAVE_BOOLEANS |
#define XCHAL_HAVE_BOOLEANS 0 |
#undef XCHAL_HAVE_FP |
#define XCHAL_HAVE_FP 0 |
#undef XCHAL_HAVE_FP_DIV |
#define XCHAL_HAVE_FP_DIV 0 |
#undef XCHAL_HAVE_FP_RECIP |
#define XCHAL_HAVE_FP_RECIP 0 |
#undef XCHAL_HAVE_FP_SQRT |
#define XCHAL_HAVE_FP_SQRT 0 |
#undef XCHAL_HAVE_FP_RSQRT |
#define XCHAL_HAVE_FP_RSQRT 0 |
#undef XCHAL_HAVE_DFP_accel |
#define XCHAL_HAVE_DFP_accel 0 |
#undef XCHAL_HAVE_WINDOWED |
#define XCHAL_HAVE_WINDOWED 1 |
#undef XCHAL_NUM_AREGS |
#define XCHAL_NUM_AREGS 32 |
#undef XCHAL_HAVE_WIDE_BRANCHES |
#define XCHAL_HAVE_WIDE_BRANCHES 0 |
#undef XCHAL_HAVE_PREDICTED_BRANCHES |
#define XCHAL_HAVE_PREDICTED_BRANCHES 0 |
#undef XCHAL_ICACHE_SIZE |
#define XCHAL_ICACHE_SIZE 16384 |
#undef XCHAL_DCACHE_SIZE |
#define XCHAL_DCACHE_SIZE 16384 |
#undef XCHAL_ICACHE_LINESIZE |
#define XCHAL_ICACHE_LINESIZE 32 |
#undef XCHAL_DCACHE_LINESIZE |
#define XCHAL_DCACHE_LINESIZE 32 |
#undef XCHAL_ICACHE_LINEWIDTH |
#define XCHAL_ICACHE_LINEWIDTH 5 |
#undef XCHAL_DCACHE_LINEWIDTH |
#define XCHAL_DCACHE_LINEWIDTH 5 |
#undef XCHAL_DCACHE_IS_WRITEBACK |
#define XCHAL_DCACHE_IS_WRITEBACK 1 |
#undef XCHAL_HAVE_MMU |
#define XCHAL_HAVE_MMU 1 |
#undef XCHAL_MMU_MIN_PTE_PAGE_SIZE |
#define XCHAL_MMU_MIN_PTE_PAGE_SIZE 12 |
#undef XCHAL_HAVE_DEBUG |
#define XCHAL_HAVE_DEBUG 1 |
#undef XCHAL_NUM_IBREAK |
#define XCHAL_NUM_IBREAK 2 |
#undef XCHAL_NUM_DBREAK |
#define XCHAL_NUM_DBREAK 2 |
#undef XCHAL_DEBUGLEVEL |
#define XCHAL_DEBUGLEVEL 6 |
#undef XCHAL_MAX_INSTRUCTION_SIZE |
#define XCHAL_MAX_INSTRUCTION_SIZE 3 |
#undef XCHAL_INST_FETCH_WIDTH |
#define XCHAL_INST_FETCH_WIDTH 4 |
#undef XSHAL_ABI |
#undef XTHAL_ABI_WINDOWED |
#undef XTHAL_ABI_CALL0 |
#define XSHAL_ABI XTHAL_ABI_WINDOWED |
#define XTHAL_ABI_WINDOWED 0 |
#define XTHAL_ABI_CALL0 1 |
#endif /* !XTENSA_CONFIG_H */ |
/contrib/toolchain/binutils/include/xtensa-isa-internal.h |
---|
0,0 → 1,234 |
/* Internal definitions for configurable Xtensa ISA support. |
Copyright 2003, 2004, 2005, 2008, 2010 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, |
USA. */ |
#ifndef XTENSA_ISA_INTERNAL_H |
#define XTENSA_ISA_INTERNAL_H |
/* Flags. */ |
#define XTENSA_OPERAND_IS_REGISTER 0x00000001 |
#define XTENSA_OPERAND_IS_PCRELATIVE 0x00000002 |
#define XTENSA_OPERAND_IS_INVISIBLE 0x00000004 |
#define XTENSA_OPERAND_IS_UNKNOWN 0x00000008 |
#define XTENSA_OPCODE_IS_BRANCH 0x00000001 |
#define XTENSA_OPCODE_IS_JUMP 0x00000002 |
#define XTENSA_OPCODE_IS_LOOP 0x00000004 |
#define XTENSA_OPCODE_IS_CALL 0x00000008 |
#define XTENSA_STATE_IS_EXPORTED 0x00000001 |
#define XTENSA_STATE_IS_SHARED_OR 0x00000002 |
#define XTENSA_INTERFACE_HAS_SIDE_EFFECT 0x00000001 |
/* Function pointer typedefs */ |
typedef void (*xtensa_format_encode_fn) (xtensa_insnbuf); |
typedef void (*xtensa_get_slot_fn) (const xtensa_insnbuf, xtensa_insnbuf); |
typedef void (*xtensa_set_slot_fn) (xtensa_insnbuf, const xtensa_insnbuf); |
typedef int (*xtensa_opcode_decode_fn) (const xtensa_insnbuf); |
typedef uint32 (*xtensa_get_field_fn) (const xtensa_insnbuf); |
typedef void (*xtensa_set_field_fn) (xtensa_insnbuf, uint32); |
typedef int (*xtensa_immed_decode_fn) (uint32 *); |
typedef int (*xtensa_immed_encode_fn) (uint32 *); |
typedef int (*xtensa_do_reloc_fn) (uint32 *, uint32); |
typedef int (*xtensa_undo_reloc_fn) (uint32 *, uint32); |
typedef void (*xtensa_opcode_encode_fn) (xtensa_insnbuf); |
typedef int (*xtensa_format_decode_fn) (const xtensa_insnbuf); |
typedef int (*xtensa_length_decode_fn) (const unsigned char *); |
typedef struct xtensa_format_internal_struct |
{ |
const char *name; /* Instruction format name. */ |
int length; /* Instruction length in bytes. */ |
xtensa_format_encode_fn encode_fn; |
int num_slots; |
int *slot_id; /* Array[num_slots] of slot IDs. */ |
} xtensa_format_internal; |
typedef struct xtensa_slot_internal_struct |
{ |
const char *name; /* Not necessarily unique. */ |
const char *format; |
int position; |
xtensa_get_slot_fn get_fn; |
xtensa_set_slot_fn set_fn; |
xtensa_get_field_fn *get_field_fns; /* Array[field_id]. */ |
xtensa_set_field_fn *set_field_fns; /* Array[field_id]. */ |
xtensa_opcode_decode_fn opcode_decode_fn; |
const char *nop_name; |
} xtensa_slot_internal; |
typedef struct xtensa_operand_internal_struct |
{ |
const char *name; |
int field_id; |
xtensa_regfile regfile; /* Register file. */ |
int num_regs; /* Usually 1; 2 for reg pairs, etc. */ |
uint32 flags; /* See XTENSA_OPERAND_* flags. */ |
xtensa_immed_encode_fn encode; /* Encode the operand value. */ |
xtensa_immed_decode_fn decode; /* Decode the value from the field. */ |
xtensa_do_reloc_fn do_reloc; /* Perform a PC-relative reloc. */ |
xtensa_undo_reloc_fn undo_reloc; /* Undo a PC-relative relocation. */ |
} xtensa_operand_internal; |
typedef struct xtensa_arg_internal_struct |
{ |
union { |
int operand_id; /* For normal operands. */ |
xtensa_state state; /* For stateOperands. */ |
} u; |
char inout; /* Direction: 'i', 'o', or 'm'. */ |
} xtensa_arg_internal; |
typedef struct xtensa_iclass_internal_struct |
{ |
int num_operands; /* Size of "operands" array. */ |
xtensa_arg_internal *operands; /* Array[num_operands]. */ |
int num_stateOperands; /* Size of "stateOperands" array. */ |
xtensa_arg_internal *stateOperands; /* Array[num_stateOperands]. */ |
int num_interfaceOperands; /* Size of "interfaceOperands". */ |
xtensa_interface *interfaceOperands; /* Array[num_interfaceOperands]. */ |
} xtensa_iclass_internal; |
typedef struct xtensa_opcode_internal_struct |
{ |
const char *name; /* Opcode mnemonic. */ |
int iclass_id; /* Iclass for this opcode. */ |
uint32 flags; /* See XTENSA_OPCODE_* flags. */ |
xtensa_opcode_encode_fn *encode_fns; /* Array[slot_id]. */ |
int num_funcUnit_uses; /* Number of funcUnit_use entries. */ |
xtensa_funcUnit_use *funcUnit_uses; /* Array[num_funcUnit_uses]. */ |
} xtensa_opcode_internal; |
typedef struct xtensa_regfile_internal_struct |
{ |
const char *name; /* Full name of the regfile. */ |
const char *shortname; /* Abbreviated name. */ |
xtensa_regfile parent; /* View parent (or identity). */ |
int num_bits; /* Width of the registers. */ |
int num_entries; /* Number of registers. */ |
} xtensa_regfile_internal; |
typedef struct xtensa_interface_internal_struct |
{ |
const char *name; /* Interface name. */ |
int num_bits; /* Width of the interface. */ |
uint32 flags; /* See XTENSA_INTERFACE_* flags. */ |
int class_id; /* Class of related interfaces. */ |
char inout; /* "i" or "o". */ |
} xtensa_interface_internal; |
typedef struct xtensa_funcUnit_internal_struct |
{ |
const char *name; /* Functional unit name. */ |
int num_copies; /* Number of instances. */ |
} xtensa_funcUnit_internal; |
typedef struct xtensa_state_internal_struct |
{ |
const char *name; /* State name. */ |
int num_bits; /* Number of state bits. */ |
uint32 flags; /* See XTENSA_STATE_* flags. */ |
} xtensa_state_internal; |
typedef struct xtensa_sysreg_internal_struct |
{ |
const char *name; /* Register name. */ |
int number; /* Register number. */ |
int is_user; /* Non-zero if a "user register". */ |
} xtensa_sysreg_internal; |
typedef struct xtensa_lookup_entry_struct |
{ |
const char *key; |
union |
{ |
xtensa_opcode opcode; /* Internal opcode number. */ |
xtensa_sysreg sysreg; /* Internal sysreg number. */ |
xtensa_state state; /* Internal state number. */ |
xtensa_interface intf; /* Internal interface number. */ |
xtensa_funcUnit fun; /* Internal funcUnit number. */ |
} u; |
} xtensa_lookup_entry; |
typedef struct xtensa_isa_internal_struct |
{ |
int is_big_endian; /* Endianness. */ |
int insn_size; /* Maximum length in bytes. */ |
int insnbuf_size; /* Number of insnbuf_words. */ |
int num_formats; |
xtensa_format_internal *formats; |
xtensa_format_decode_fn format_decode_fn; |
xtensa_length_decode_fn length_decode_fn; |
int num_slots; |
xtensa_slot_internal *slots; |
int num_fields; |
int num_operands; |
xtensa_operand_internal *operands; |
int num_iclasses; |
xtensa_iclass_internal *iclasses; |
int num_opcodes; |
xtensa_opcode_internal *opcodes; |
xtensa_lookup_entry *opname_lookup_table; |
int num_regfiles; |
xtensa_regfile_internal *regfiles; |
int num_states; |
xtensa_state_internal *states; |
xtensa_lookup_entry *state_lookup_table; |
int num_sysregs; |
xtensa_sysreg_internal *sysregs; |
xtensa_lookup_entry *sysreg_lookup_table; |
/* The current Xtensa ISA only supports 256 of each kind of sysreg so |
we can get away with implementing lookups with tables indexed by |
the register numbers. If we ever allow larger sysreg numbers, this |
may have to be reimplemented. The first entry in the following |
arrays corresponds to "special" registers and the second to "user" |
registers. */ |
int max_sysreg_num[2]; |
xtensa_sysreg *sysreg_table[2]; |
int num_interfaces; |
xtensa_interface_internal *interfaces; |
xtensa_lookup_entry *interface_lookup_table; |
int num_funcUnits; |
xtensa_funcUnit_internal *funcUnits; |
xtensa_lookup_entry *funcUnit_lookup_table; |
} xtensa_isa_internal; |
extern int xtensa_isa_name_compare (const void *, const void *); |
extern xtensa_isa_status xtisa_errno; |
extern char xtisa_error_msg[]; |
#endif /* !XTENSA_ISA_INTERNAL_H */ |
/contrib/toolchain/binutils/include/xtensa-isa.h |
---|
0,0 → 1,813 |
/* Interface definition for configurable Xtensa ISA support. |
Copyright 2003, 2004, 2005, 2006, 2008, 2010 Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 3 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, |
USA. */ |
#ifndef XTENSA_LIBISA_H |
#define XTENSA_LIBISA_H |
#ifdef __cplusplus |
extern "C" { |
#endif |
/* Version number: This is intended to help support code that works with |
versions of this library from multiple Xtensa releases. */ |
#define XTENSA_ISA_VERSION 7000 |
#ifndef uint32 |
#define uint32 unsigned int |
#endif |
/* This file defines the interface to the Xtensa ISA library. This |
library contains most of the ISA-specific information for a |
particular Xtensa processor. For example, the set of valid |
instructions, their opcode encodings and operand fields are all |
included here. |
This interface basically defines a number of abstract data types. |
. an instruction buffer - for holding the raw instruction bits |
. ISA info - information about the ISA as a whole |
. instruction formats - instruction size and slot structure |
. opcodes - information about individual instructions |
. operands - information about register and immediate instruction operands |
. stateOperands - information about processor state instruction operands |
. interfaceOperands - information about interface instruction operands |
. register files - register file information |
. processor states - internal processor state information |
. system registers - "special registers" and "user registers" |
. interfaces - TIE interfaces that are external to the processor |
. functional units - TIE shared functions |
The interface defines a set of functions to access each data type. |
With the exception of the instruction buffer, the internal |
representations of the data structures are hidden. All accesses must |
be made through the functions defined here. */ |
typedef struct xtensa_isa_opaque { int unused; } *xtensa_isa; |
/* Most of the Xtensa ISA entities (e.g., opcodes, regfiles, etc.) are |
represented here using sequential integers beginning with 0. The |
specific values are only fixed for a particular instantiation of an |
xtensa_isa structure, so these values should only be used |
internally. */ |
typedef int xtensa_opcode; |
typedef int xtensa_format; |
typedef int xtensa_regfile; |
typedef int xtensa_state; |
typedef int xtensa_sysreg; |
typedef int xtensa_interface; |
typedef int xtensa_funcUnit; |
/* Define a unique value for undefined items. */ |
#define XTENSA_UNDEFINED -1 |
/* Overview of using this interface to decode/encode instructions: |
Each Xtensa instruction is associated with a particular instruction |
format, where the format defines a fixed number of slots for |
operations. The formats for the core Xtensa ISA have only one slot, |
but FLIX instructions may have multiple slots. Within each slot, |
there is a single opcode and some number of associated operands. |
The encoding and decoding functions operate on instruction buffers, |
not on the raw bytes of the instructions. The same instruction |
buffer data structure is used for both entire instructions and |
individual slots in those instructions -- the contents of a slot need |
to be extracted from or inserted into the buffer for the instruction |
as a whole. |
Decoding an instruction involves first finding the format, which |
identifies the number of slots, and then decoding each slot |
separately. A slot is decoded by finding the opcode and then using |
the opcode to determine how many operands there are. For example: |
xtensa_insnbuf_from_chars |
xtensa_format_decode |
for each slot { |
xtensa_format_get_slot |
xtensa_opcode_decode |
for each operand { |
xtensa_operand_get_field |
xtensa_operand_decode |
} |
} |
Encoding an instruction is roughly the same procedure in reverse: |
xtensa_format_encode |
for each slot { |
xtensa_opcode_encode |
for each operand { |
xtensa_operand_encode |
xtensa_operand_set_field |
} |
xtensa_format_set_slot |
} |
xtensa_insnbuf_to_chars |
*/ |
/* Error handling. */ |
/* Error codes. The code for the most recent error condition can be |
retrieved with the "errno" function. For any result other than |
xtensa_isa_ok, an error message containing additional information |
about the problem can be retrieved using the "error_msg" function. |
The error messages are stored in an internal buffer, which should |
not be freed and may be overwritten by subsequent operations. */ |
typedef enum xtensa_isa_status_enum |
{ |
xtensa_isa_ok = 0, |
xtensa_isa_bad_format, |
xtensa_isa_bad_slot, |
xtensa_isa_bad_opcode, |
xtensa_isa_bad_operand, |
xtensa_isa_bad_field, |
xtensa_isa_bad_iclass, |
xtensa_isa_bad_regfile, |
xtensa_isa_bad_sysreg, |
xtensa_isa_bad_state, |
xtensa_isa_bad_interface, |
xtensa_isa_bad_funcUnit, |
xtensa_isa_wrong_slot, |
xtensa_isa_no_field, |
xtensa_isa_out_of_memory, |
xtensa_isa_buffer_overflow, |
xtensa_isa_internal_error, |
xtensa_isa_bad_value |
} xtensa_isa_status; |
extern xtensa_isa_status |
xtensa_isa_errno (xtensa_isa isa); |
extern char * |
xtensa_isa_error_msg (xtensa_isa isa); |
/* Instruction buffers. */ |
typedef uint32 xtensa_insnbuf_word; |
typedef xtensa_insnbuf_word *xtensa_insnbuf; |
/* Get the size in "insnbuf_words" of the xtensa_insnbuf array. */ |
extern int |
xtensa_insnbuf_size (xtensa_isa isa); |
/* Allocate an xtensa_insnbuf of the right size. */ |
extern xtensa_insnbuf |
xtensa_insnbuf_alloc (xtensa_isa isa); |
/* Release an xtensa_insnbuf. */ |
extern void |
xtensa_insnbuf_free (xtensa_isa isa, xtensa_insnbuf buf); |
/* Conversion between raw memory (char arrays) and our internal |
instruction representation. This is complicated by the Xtensa ISA's |
variable instruction lengths. When converting to chars, the buffer |
must contain a valid instruction so we know how many bytes to copy; |
thus, the "to_chars" function returns the number of bytes copied or |
XTENSA_UNDEFINED on error. The "from_chars" function first reads the |
minimal number of bytes required to decode the instruction length and |
then proceeds to copy the entire instruction into the buffer; if the |
memory does not contain a valid instruction, it copies the maximum |
number of bytes required for the longest Xtensa instruction. The |
"num_chars" argument may be used to limit the number of bytes that |
can be read or written. Otherwise, if "num_chars" is zero, the |
functions may read or write past the end of the code. */ |
extern int |
xtensa_insnbuf_to_chars (xtensa_isa isa, const xtensa_insnbuf insn, |
unsigned char *cp, int num_chars); |
extern void |
xtensa_insnbuf_from_chars (xtensa_isa isa, xtensa_insnbuf insn, |
const unsigned char *cp, int num_chars); |
/* ISA information. */ |
/* Initialize the ISA information. */ |
extern xtensa_isa |
xtensa_isa_init (xtensa_isa_status *errno_p, char **error_msg_p); |
/* Deallocate an xtensa_isa structure. */ |
extern void |
xtensa_isa_free (xtensa_isa isa); |
/* Get the maximum instruction size in bytes. */ |
extern int |
xtensa_isa_maxlength (xtensa_isa isa); |
/* Decode the length in bytes of an instruction in raw memory (not an |
insnbuf). This function reads only the minimal number of bytes |
required to decode the instruction length. Returns |
XTENSA_UNDEFINED on error. */ |
extern int |
xtensa_isa_length_from_chars (xtensa_isa isa, const unsigned char *cp); |
/* Get the number of stages in the processor's pipeline. The pipeline |
stage values returned by other functions in this library will range |
from 0 to N-1, where N is the value returned by this function. |
Note that the stage numbers used here may not correspond to the |
actual processor hardware, e.g., the hardware may have additional |
stages before stage 0. Returns XTENSA_UNDEFINED on error. */ |
extern int |
xtensa_isa_num_pipe_stages (xtensa_isa isa); |
/* Get the number of various entities that are defined for this processor. */ |
extern int |
xtensa_isa_num_formats (xtensa_isa isa); |
extern int |
xtensa_isa_num_opcodes (xtensa_isa isa); |
extern int |
xtensa_isa_num_regfiles (xtensa_isa isa); |
extern int |
xtensa_isa_num_states (xtensa_isa isa); |
extern int |
xtensa_isa_num_sysregs (xtensa_isa isa); |
extern int |
xtensa_isa_num_interfaces (xtensa_isa isa); |
extern int |
xtensa_isa_num_funcUnits (xtensa_isa isa); |
/* Instruction formats. */ |
/* Get the name of a format. Returns null on error. */ |
extern const char * |
xtensa_format_name (xtensa_isa isa, xtensa_format fmt); |
/* Given a format name, return the format number. Returns |
XTENSA_UNDEFINED if the name is not a valid format. */ |
extern xtensa_format |
xtensa_format_lookup (xtensa_isa isa, const char *fmtname); |
/* Decode the instruction format from a binary instruction buffer. |
Returns XTENSA_UNDEFINED if the format is not recognized. */ |
extern xtensa_format |
xtensa_format_decode (xtensa_isa isa, const xtensa_insnbuf insn); |
/* Set the instruction format field(s) in a binary instruction buffer. |
All the other fields are set to zero. Returns non-zero on error. */ |
extern int |
xtensa_format_encode (xtensa_isa isa, xtensa_format fmt, xtensa_insnbuf insn); |
/* Find the length (in bytes) of an instruction. Returns |
XTENSA_UNDEFINED on error. */ |
extern int |
xtensa_format_length (xtensa_isa isa, xtensa_format fmt); |
/* Get the number of slots in an instruction. Returns XTENSA_UNDEFINED |
on error. */ |
extern int |
xtensa_format_num_slots (xtensa_isa isa, xtensa_format fmt); |
/* Get the opcode for a no-op in a particular slot. |
Returns XTENSA_UNDEFINED on error. */ |
extern xtensa_opcode |
xtensa_format_slot_nop_opcode (xtensa_isa isa, xtensa_format fmt, int slot); |
/* Get the bits for a specified slot out of an insnbuf for the |
instruction as a whole and put them into an insnbuf for that one |
slot, and do the opposite to set a slot. Return non-zero on error. */ |
extern int |
xtensa_format_get_slot (xtensa_isa isa, xtensa_format fmt, int slot, |
const xtensa_insnbuf insn, xtensa_insnbuf slotbuf); |
extern int |
xtensa_format_set_slot (xtensa_isa isa, xtensa_format fmt, int slot, |
xtensa_insnbuf insn, const xtensa_insnbuf slotbuf); |
/* Opcode information. */ |
/* Translate a mnemonic name to an opcode. Returns XTENSA_UNDEFINED if |
the name is not a valid opcode mnemonic. */ |
extern xtensa_opcode |
xtensa_opcode_lookup (xtensa_isa isa, const char *opname); |
/* Decode the opcode for one instruction slot from a binary instruction |
buffer. Returns the opcode or XTENSA_UNDEFINED if the opcode is |
illegal. */ |
extern xtensa_opcode |
xtensa_opcode_decode (xtensa_isa isa, xtensa_format fmt, int slot, |
const xtensa_insnbuf slotbuf); |
/* Set the opcode field(s) for an instruction slot. All other fields |
in the slot are set to zero. Returns non-zero if the opcode cannot |
be encoded. */ |
extern int |
xtensa_opcode_encode (xtensa_isa isa, xtensa_format fmt, int slot, |
xtensa_insnbuf slotbuf, xtensa_opcode opc); |
/* Get the mnemonic name for an opcode. Returns null on error. */ |
extern const char * |
xtensa_opcode_name (xtensa_isa isa, xtensa_opcode opc); |
/* Check various properties of opcodes. These functions return 0 if |
the condition is false, 1 if the condition is true, and |
XTENSA_UNDEFINED on error. The instructions are classified as |
follows: |
branch: conditional branch; may fall through to next instruction (B*) |
jump: unconditional branch (J, JX, RET*, RF*) |
loop: zero-overhead loop (LOOP*) |
call: unconditional call; control returns to next instruction (CALL*) |
For the opcodes that affect control flow in some way, the branch |
target may be specified by an immediate operand or it may be an |
address stored in a register. You can distinguish these by |
checking if the instruction has a PC-relative immediate |
operand. */ |
extern int |
xtensa_opcode_is_branch (xtensa_isa isa, xtensa_opcode opc); |
extern int |
xtensa_opcode_is_jump (xtensa_isa isa, xtensa_opcode opc); |
extern int |
xtensa_opcode_is_loop (xtensa_isa isa, xtensa_opcode opc); |
extern int |
xtensa_opcode_is_call (xtensa_isa isa, xtensa_opcode opc); |
/* Find the number of ordinary operands, state operands, and interface |
operands for an instruction. These return XTENSA_UNDEFINED on |
error. */ |
extern int |
xtensa_opcode_num_operands (xtensa_isa isa, xtensa_opcode opc); |
extern int |
xtensa_opcode_num_stateOperands (xtensa_isa isa, xtensa_opcode opc); |
extern int |
xtensa_opcode_num_interfaceOperands (xtensa_isa isa, xtensa_opcode opc); |
/* Get functional unit usage requirements for an opcode. Each "use" |
is identified by a <functional unit, pipeline stage> pair. The |
"num_funcUnit_uses" function returns the number of these "uses" or |
XTENSA_UNDEFINED on error. The "funcUnit_use" function returns |
a pointer to a "use" pair or null on error. */ |
typedef struct xtensa_funcUnit_use_struct |
{ |
xtensa_funcUnit unit; |
int stage; |
} xtensa_funcUnit_use; |
extern int |
xtensa_opcode_num_funcUnit_uses (xtensa_isa isa, xtensa_opcode opc); |
extern xtensa_funcUnit_use * |
xtensa_opcode_funcUnit_use (xtensa_isa isa, xtensa_opcode opc, int u); |
/* Operand information. */ |
/* Get the name of an operand. Returns null on error. */ |
extern const char * |
xtensa_operand_name (xtensa_isa isa, xtensa_opcode opc, int opnd); |
/* Some operands are "invisible", i.e., not explicitly specified in |
assembly language. When assembling an instruction, you need not set |
the values of invisible operands, since they are either hardwired or |
derived from other field values. The values of invisible operands |
can be examined in the same way as other operands, but remember that |
an invisible operand may get its value from another visible one, so |
the entire instruction must be available before examining the |
invisible operand values. This function returns 1 if an operand is |
visible, 0 if it is invisible, or XTENSA_UNDEFINED on error. Note |
that whether an operand is visible is orthogonal to whether it is |
"implicit", i.e., whether it is encoded in a field in the |
instruction. */ |
extern int |
xtensa_operand_is_visible (xtensa_isa isa, xtensa_opcode opc, int opnd); |
/* Check if an operand is an input ('i'), output ('o'), or inout ('m') |
operand. Note: The output operand of a conditional assignment |
(e.g., movnez) appears here as an inout ('m') even if it is declared |
in the TIE code as an output ('o'); this allows the compiler to |
properly handle register allocation for conditional assignments. |
Returns 0 on error. */ |
extern char |
xtensa_operand_inout (xtensa_isa isa, xtensa_opcode opc, int opnd); |
/* Get and set the raw (encoded) value of the field for the specified |
operand. The "set" function does not check if the value fits in the |
field; that is done by the "encode" function below. Both of these |
functions return non-zero on error, e.g., if the field is not defined |
for the specified slot. */ |
extern int |
xtensa_operand_get_field (xtensa_isa isa, xtensa_opcode opc, int opnd, |
xtensa_format fmt, int slot, |
const xtensa_insnbuf slotbuf, uint32 *valp); |
extern int |
xtensa_operand_set_field (xtensa_isa isa, xtensa_opcode opc, int opnd, |
xtensa_format fmt, int slot, |
xtensa_insnbuf slotbuf, uint32 val); |
/* Encode and decode operands. The raw bits in the operand field may |
be encoded in a variety of different ways. These functions hide |
the details of that encoding. The result values are returned through |
the argument pointer. The return value is non-zero on error. */ |
extern int |
xtensa_operand_encode (xtensa_isa isa, xtensa_opcode opc, int opnd, |
uint32 *valp); |
extern int |
xtensa_operand_decode (xtensa_isa isa, xtensa_opcode opc, int opnd, |
uint32 *valp); |
/* An operand may be either a register operand or an immediate of some |
sort (e.g., PC-relative or not). The "is_register" function returns |
0 if the operand is an immediate, 1 if it is a register, and |
XTENSA_UNDEFINED on error. The "regfile" function returns the |
regfile for a register operand, or XTENSA_UNDEFINED on error. */ |
extern int |
xtensa_operand_is_register (xtensa_isa isa, xtensa_opcode opc, int opnd); |
extern xtensa_regfile |
xtensa_operand_regfile (xtensa_isa isa, xtensa_opcode opc, int opnd); |
/* Register operands may span multiple consecutive registers, e.g., a |
64-bit data type may occupy two 32-bit registers. Only the first |
register is encoded in the operand field. This function specifies |
the number of consecutive registers occupied by this operand. For |
non-register operands, the return value is undefined. Returns |
XTENSA_UNDEFINED on error. */ |
extern int |
xtensa_operand_num_regs (xtensa_isa isa, xtensa_opcode opc, int opnd); |
/* Some register operands do not completely identify the register being |
accessed. For example, the operand value may be added to an internal |
state value. By definition, this implies that the corresponding |
regfile is not allocatable. Unknown registers should generally be |
treated with worst-case assumptions. The function returns 0 if the |
register value is unknown, 1 if known, and XTENSA_UNDEFINED on |
error. */ |
extern int |
xtensa_operand_is_known_reg (xtensa_isa isa, xtensa_opcode opc, int opnd); |
/* Check if an immediate operand is PC-relative. Returns 0 for register |
operands and non-PC-relative immediates, 1 for PC-relative |
immediates, and XTENSA_UNDEFINED on error. */ |
extern int |
xtensa_operand_is_PCrelative (xtensa_isa isa, xtensa_opcode opc, int opnd); |
/* For PC-relative offset operands, the interpretation of the offset may |
vary between opcodes, e.g., is it relative to the current PC or that |
of the next instruction? The following functions are defined to |
perform PC-relative relocations and to undo them (as in the |
disassembler). The "do_reloc" function takes the desired address |
value and the PC of the current instruction and sets the value to the |
corresponding PC-relative offset (which can then be encoded and |
stored into the operand field). The "undo_reloc" function takes the |
unencoded offset value and the current PC and sets the value to the |
appropriate address. The return values are non-zero on error. Note |
that these functions do not replace the encode/decode functions; the |
operands must be encoded/decoded separately and the encode functions |
are responsible for detecting invalid operand values. */ |
extern int |
xtensa_operand_do_reloc (xtensa_isa isa, xtensa_opcode opc, int opnd, |
uint32 *valp, uint32 pc); |
extern int |
xtensa_operand_undo_reloc (xtensa_isa isa, xtensa_opcode opc, int opnd, |
uint32 *valp, uint32 pc); |
/* State Operands. */ |
/* Get the state accessed by a state operand. Returns XTENSA_UNDEFINED |
on error. */ |
extern xtensa_state |
xtensa_stateOperand_state (xtensa_isa isa, xtensa_opcode opc, int stOp); |
/* Check if a state operand is an input ('i'), output ('o'), or inout |
('m') operand. Returns 0 on error. */ |
extern char |
xtensa_stateOperand_inout (xtensa_isa isa, xtensa_opcode opc, int stOp); |
/* Interface Operands. */ |
/* Get the external interface accessed by an interface operand. |
Returns XTENSA_UNDEFINED on error. */ |
extern xtensa_interface |
xtensa_interfaceOperand_interface (xtensa_isa isa, xtensa_opcode opc, |
int ifOp); |
/* Register Files. */ |
/* Regfiles include both "real" regfiles and "views", where a view |
allows a group of adjacent registers in a real "parent" regfile to be |
viewed as a single register. A regfile view has all the same |
properties as its parent except for its (long) name, bit width, number |
of entries, and default ctype. You can use the parent function to |
distinguish these two classes. */ |
/* Look up a regfile by either its name or its abbreviated "short name". |
Returns XTENSA_UNDEFINED on error. The "lookup_shortname" function |
ignores "view" regfiles since they always have the same shortname as |
their parents. */ |
extern xtensa_regfile |
xtensa_regfile_lookup (xtensa_isa isa, const char *name); |
extern xtensa_regfile |
xtensa_regfile_lookup_shortname (xtensa_isa isa, const char *shortname); |
/* Get the name or abbreviated "short name" of a regfile. |
Returns null on error. */ |
extern const char * |
xtensa_regfile_name (xtensa_isa isa, xtensa_regfile rf); |
extern const char * |
xtensa_regfile_shortname (xtensa_isa isa, xtensa_regfile rf); |
/* Get the parent regfile of a "view" regfile. If the regfile is not a |
view, the result is the same as the input parameter. Returns |
XTENSA_UNDEFINED on error. */ |
extern xtensa_regfile |
xtensa_regfile_view_parent (xtensa_isa isa, xtensa_regfile rf); |
/* Get the bit width of a regfile or regfile view. |
Returns XTENSA_UNDEFINED on error. */ |
extern int |
xtensa_regfile_num_bits (xtensa_isa isa, xtensa_regfile rf); |
/* Get the number of regfile entries. Returns XTENSA_UNDEFINED on |
error. */ |
extern int |
xtensa_regfile_num_entries (xtensa_isa isa, xtensa_regfile rf); |
/* Processor States. */ |
/* Look up a state by name. Returns XTENSA_UNDEFINED on error. */ |
extern xtensa_state |
xtensa_state_lookup (xtensa_isa isa, const char *name); |
/* Get the name for a processor state. Returns null on error. */ |
extern const char * |
xtensa_state_name (xtensa_isa isa, xtensa_state st); |
/* Get the bit width for a processor state. |
Returns XTENSA_UNDEFINED on error. */ |
extern int |
xtensa_state_num_bits (xtensa_isa isa, xtensa_state st); |
/* Check if a state is exported from the processor core. Returns 0 if |
the condition is false, 1 if the condition is true, and |
XTENSA_UNDEFINED on error. */ |
extern int |
xtensa_state_is_exported (xtensa_isa isa, xtensa_state st); |
/* Check for a "shared_or" state. Returns 0 if the condition is false, |
1 if the condition is true, and XTENSA_UNDEFINED on error. */ |
extern int |
xtensa_state_is_shared_or (xtensa_isa isa, xtensa_state st); |
/* Sysregs ("special registers" and "user registers"). */ |
/* Look up a register by its number and whether it is a "user register" |
or a "special register". Returns XTENSA_UNDEFINED if the sysreg does |
not exist. */ |
extern xtensa_sysreg |
xtensa_sysreg_lookup (xtensa_isa isa, int num, int is_user); |
/* Check if there exists a sysreg with a given name. |
If not, this function returns XTENSA_UNDEFINED. */ |
extern xtensa_sysreg |
xtensa_sysreg_lookup_name (xtensa_isa isa, const char *name); |
/* Get the name of a sysreg. Returns null on error. */ |
extern const char * |
xtensa_sysreg_name (xtensa_isa isa, xtensa_sysreg sysreg); |
/* Get the register number. Returns XTENSA_UNDEFINED on error. */ |
extern int |
xtensa_sysreg_number (xtensa_isa isa, xtensa_sysreg sysreg); |
/* Check if a sysreg is a "special register" or a "user register". |
Returns 0 for special registers, 1 for user registers and |
XTENSA_UNDEFINED on error. */ |
extern int |
xtensa_sysreg_is_user (xtensa_isa isa, xtensa_sysreg sysreg); |
/* Interfaces. */ |
/* Find an interface by name. The return value is XTENSA_UNDEFINED if |
the specified interface is not found. */ |
extern xtensa_interface |
xtensa_interface_lookup (xtensa_isa isa, const char *ifname); |
/* Get the name of an interface. Returns null on error. */ |
extern const char * |
xtensa_interface_name (xtensa_isa isa, xtensa_interface intf); |
/* Get the bit width for an interface. |
Returns XTENSA_UNDEFINED on error. */ |
extern int |
xtensa_interface_num_bits (xtensa_isa isa, xtensa_interface intf); |
/* Check if an interface is an input ('i') or output ('o') with respect |
to the Xtensa processor core. Returns 0 on error. */ |
extern char |
xtensa_interface_inout (xtensa_isa isa, xtensa_interface intf); |
/* Check if accessing an interface has potential side effects. |
Currently "data" interfaces have side effects and "control" |
interfaces do not. Returns 1 if there are side effects, 0 if not, |
and XTENSA_UNDEFINED on error. */ |
extern int |
xtensa_interface_has_side_effect (xtensa_isa isa, xtensa_interface intf); |
/* Some interfaces may be related such that accessing one interface |
has side effects on a set of related interfaces. The interfaces |
are partitioned into equivalence classes of related interfaces, and |
each class is assigned a unique identifier number. This function |
returns the class identifier for an interface, or XTENSA_UNDEFINED |
on error. These identifiers can be compared to determine if two |
interfaces are related; the specific values of the identifiers have |
no particular meaning otherwise. */ |
extern int |
xtensa_interface_class_id (xtensa_isa isa, xtensa_interface intf); |
/* Functional Units. */ |
/* Find a functional unit by name. The return value is XTENSA_UNDEFINED if |
the specified unit is not found. */ |
extern xtensa_funcUnit |
xtensa_funcUnit_lookup (xtensa_isa isa, const char *fname); |
/* Get the name of a functional unit. Returns null on error. */ |
extern const char * |
xtensa_funcUnit_name (xtensa_isa isa, xtensa_funcUnit fun); |
/* Functional units may be replicated. See how many instances of a |
particular function unit exist. Returns XTENSA_UNDEFINED on error. */ |
extern int |
xtensa_funcUnit_num_copies (xtensa_isa isa, xtensa_funcUnit fun); |
#ifdef __cplusplus |
} |
#endif |
#endif /* XTENSA_LIBISA_H */ |
/contrib/toolchain/binutils/libiberty/Makefile |
---|
0,0 → 1,44 |
CFLAGS_OPT = -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32 -U_MSC_VER -O2 |
CFLAGS_OPT+= -fomit-frame-pointer -fno-ident -mno-ms-bitfields |
CFLAGS_OPT+= -W -Wall -Wwrite-strings -Wc++-compat -Wstrict-prototypes |
CFLAGS = -c $(CFLAGS_OPT) |
INCLUDES= -I. -I../include -I$(SDK_DIR)/sources/newlib/libc/include |
DEFINES= -DHAVE_CONFIG_H |
SRCS = \ |
alloca.c argv.c asprintf.c bcmp.c bcopy.c bzero.c \ |
choose-temp.c concat.c cp-demangle.c cp-demint.c \ |
cplus-dem.c crc32.c dwarfnames.c dyn-string.c fdmatch.c \ |
ffs.c fibheap.c filename_cmp.c floatformat.c fnmatch.c \ |
fopen_unlocked.c getopt.c getopt1.c getpwd.c \ |
getruntime.c hashtab.c hex.c index.c insque.c \ |
lbasename.c lrealpath.c make-relative-prefix.c \ |
make-temp-file.c md5.c memmem.c mempcpy.c mkstemps.c \ |
objalloc.c obstack.c partition.c physmem.c random.c \ |
regex.c rindex.c safe-ctype.c setenv.c setproctitle.c \ |
sha1.c sigsetmask.c simple-object.c simple-object-coff.c\ |
simple-object-elf.c simple-object-mach-o.c \ |
simple-object-xcoff.c sort.c spaces.c splay-tree.c \ |
stack-limit.c stpcpy.c stpncpy.c strcasecmp.c strerror.c\ |
strncasecmp.c strndup.c strnlen.c strverscmp.c \ |
timeval-utils.c unlink-if-ordinary.c vasprintf.c \ |
xatexit.c xexit.c xmalloc.c xmemdup.c xstrdup.c \ |
xstrerror.c xstrndup.c |
OBJS = $(patsubst %.cpp, %.o, $(patsubst %.c, %.o, $(SRCS))) |
# targets |
all: libiberty.a |
libiberty.a : $(OBJS) MAkefile |
$(AR) crs libiberty.a $(OBJS) |
# mv -f libiberty.a $(SDK_DIR)/lib |
%.o : %.c Makefile |
$(CC) $(CFLAGS) $(DEFINES) $(INCLUDES) -o $@ $< |
/contrib/toolchain/binutils/libiberty/alloca.c |
---|
0,0 → 1,483 |
/* alloca.c -- allocate automatically reclaimed memory |
(Mostly) portable public-domain implementation -- D A Gwyn |
This implementation of the PWB library alloca function, |
which is used to allocate space off the run-time stack so |
that it is automatically reclaimed upon procedure exit, |
was inspired by discussions with J. Q. Johnson of Cornell. |
J.Otto Tennant <jot@cray.com> contributed the Cray support. |
There are some preprocessor constants that can |
be defined when compiling for your specific system, for |
improved efficiency; however, the defaults should be okay. |
The general concept of this implementation is to keep |
track of all alloca-allocated blocks, and reclaim any |
that are found to be deeper in the stack than the current |
invocation. This heuristic does not reclaim storage as |
soon as it becomes invalid, but it will do so eventually. |
As a special case, alloca(0) reclaims storage without |
allocating any. It is a good idea to use alloca(0) in |
your main control loop, etc. to force garbage collection. */ |
/* |
@deftypefn Replacement void* alloca (size_t @var{size}) |
This function allocates memory which will be automatically reclaimed |
after the procedure exits. The @libib{} implementation does not free |
the memory immediately but will do so eventually during subsequent |
calls to this function. Memory is allocated using @code{xmalloc} under |
normal circumstances. |
The header file @file{alloca-conf.h} can be used in conjunction with the |
GNU Autoconf test @code{AC_FUNC_ALLOCA} to test for and properly make |
available this function. The @code{AC_FUNC_ALLOCA} test requires that |
client code use a block of preprocessor code to be safe (see the Autoconf |
manual for more); this header incorporates that logic and more, including |
the possibility of a GCC built-in function. |
@end deftypefn |
*/ |
#ifdef HAVE_CONFIG_H |
#include <config.h> |
#endif |
#include <libiberty.h> |
#ifdef HAVE_STRING_H |
#include <string.h> |
#endif |
#ifdef HAVE_STDLIB_H |
#include <stdlib.h> |
#endif |
/* These variables are used by the ASTRDUP implementation that relies |
on C_alloca. */ |
#ifdef __cplusplus |
extern "C" { |
#endif /* __cplusplus */ |
const char *libiberty_optr; |
char *libiberty_nptr; |
unsigned long libiberty_len; |
#ifdef __cplusplus |
} |
#endif /* __cplusplus */ |
/* If your stack is a linked list of frames, you have to |
provide an "address metric" ADDRESS_FUNCTION macro. */ |
#if defined (CRAY) && defined (CRAY_STACKSEG_END) |
static long i00afunc (); |
#define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg)) |
#else |
#define ADDRESS_FUNCTION(arg) &(arg) |
#endif |
#ifndef NULL |
#define NULL 0 |
#endif |
/* Define STACK_DIRECTION if you know the direction of stack |
growth for your system; otherwise it will be automatically |
deduced at run-time. |
STACK_DIRECTION > 0 => grows toward higher addresses |
STACK_DIRECTION < 0 => grows toward lower addresses |
STACK_DIRECTION = 0 => direction of growth unknown */ |
#ifndef STACK_DIRECTION |
#define STACK_DIRECTION 0 /* Direction unknown. */ |
#endif |
#if STACK_DIRECTION != 0 |
#define STACK_DIR STACK_DIRECTION /* Known at compile-time. */ |
#else /* STACK_DIRECTION == 0; need run-time code. */ |
static int stack_dir; /* 1 or -1 once known. */ |
#define STACK_DIR stack_dir |
static void |
find_stack_direction (void) |
{ |
static char *addr = NULL; /* Address of first `dummy', once known. */ |
auto char dummy; /* To get stack address. */ |
if (addr == NULL) |
{ /* Initial entry. */ |
addr = ADDRESS_FUNCTION (dummy); |
find_stack_direction (); /* Recurse once. */ |
} |
else |
{ |
/* Second entry. */ |
if (ADDRESS_FUNCTION (dummy) > addr) |
stack_dir = 1; /* Stack grew upward. */ |
else |
stack_dir = -1; /* Stack grew downward. */ |
} |
} |
#endif /* STACK_DIRECTION == 0 */ |
/* An "alloca header" is used to: |
(a) chain together all alloca'ed blocks; |
(b) keep track of stack depth. |
It is very important that sizeof(header) agree with malloc |
alignment chunk size. The following default should work okay. */ |
#ifndef ALIGN_SIZE |
#define ALIGN_SIZE sizeof(double) |
#endif |
typedef union hdr |
{ |
char align[ALIGN_SIZE]; /* To force sizeof(header). */ |
struct |
{ |
union hdr *next; /* For chaining headers. */ |
char *deep; /* For stack depth measure. */ |
} h; |
} header; |
static header *last_alloca_header = NULL; /* -> last alloca header. */ |
/* Return a pointer to at least SIZE bytes of storage, |
which will be automatically reclaimed upon exit from |
the procedure that called alloca. Originally, this space |
was supposed to be taken from the current stack frame of the |
caller, but that method cannot be made to work for some |
implementations of C, for example under Gould's UTX/32. */ |
/* @undocumented C_alloca */ |
PTR |
C_alloca (size_t size) |
{ |
auto char probe; /* Probes stack depth: */ |
register char *depth = ADDRESS_FUNCTION (probe); |
#if STACK_DIRECTION == 0 |
if (STACK_DIR == 0) /* Unknown growth direction. */ |
find_stack_direction (); |
#endif |
/* Reclaim garbage, defined as all alloca'd storage that |
was allocated from deeper in the stack than currently. */ |
{ |
register header *hp; /* Traverses linked list. */ |
for (hp = last_alloca_header; hp != NULL;) |
if ((STACK_DIR > 0 && hp->h.deep > depth) |
|| (STACK_DIR < 0 && hp->h.deep < depth)) |
{ |
register header *np = hp->h.next; |
free ((PTR) hp); /* Collect garbage. */ |
hp = np; /* -> next header. */ |
} |
else |
break; /* Rest are not deeper. */ |
last_alloca_header = hp; /* -> last valid storage. */ |
} |
if (size == 0) |
return NULL; /* No allocation required. */ |
/* Allocate combined header + user data storage. */ |
{ |
register void *new_storage = XNEWVEC (char, sizeof (header) + size); |
/* Address of header. */ |
if (new_storage == 0) |
abort(); |
((header *) new_storage)->h.next = last_alloca_header; |
((header *) new_storage)->h.deep = depth; |
last_alloca_header = (header *) new_storage; |
/* User storage begins just after header. */ |
return (PTR) ((char *) new_storage + sizeof (header)); |
} |
} |
#if defined (CRAY) && defined (CRAY_STACKSEG_END) |
#ifdef DEBUG_I00AFUNC |
#include <stdio.h> |
#endif |
#ifndef CRAY_STACK |
#define CRAY_STACK |
#ifndef CRAY2 |
/* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */ |
struct stack_control_header |
{ |
long shgrow:32; /* Number of times stack has grown. */ |
long shaseg:32; /* Size of increments to stack. */ |
long shhwm:32; /* High water mark of stack. */ |
long shsize:32; /* Current size of stack (all segments). */ |
}; |
/* The stack segment linkage control information occurs at |
the high-address end of a stack segment. (The stack |
grows from low addresses to high addresses.) The initial |
part of the stack segment linkage control information is |
0200 (octal) words. This provides for register storage |
for the routine which overflows the stack. */ |
struct stack_segment_linkage |
{ |
long ss[0200]; /* 0200 overflow words. */ |
long sssize:32; /* Number of words in this segment. */ |
long ssbase:32; /* Offset to stack base. */ |
long:32; |
long sspseg:32; /* Offset to linkage control of previous |
segment of stack. */ |
long:32; |
long sstcpt:32; /* Pointer to task common address block. */ |
long sscsnm; /* Private control structure number for |
microtasking. */ |
long ssusr1; /* Reserved for user. */ |
long ssusr2; /* Reserved for user. */ |
long sstpid; /* Process ID for pid based multi-tasking. */ |
long ssgvup; /* Pointer to multitasking thread giveup. */ |
long sscray[7]; /* Reserved for Cray Research. */ |
long ssa0; |
long ssa1; |
long ssa2; |
long ssa3; |
long ssa4; |
long ssa5; |
long ssa6; |
long ssa7; |
long sss0; |
long sss1; |
long sss2; |
long sss3; |
long sss4; |
long sss5; |
long sss6; |
long sss7; |
}; |
#else /* CRAY2 */ |
/* The following structure defines the vector of words |
returned by the STKSTAT library routine. */ |
struct stk_stat |
{ |
long now; /* Current total stack size. */ |
long maxc; /* Amount of contiguous space which would |
be required to satisfy the maximum |
stack demand to date. */ |
long high_water; /* Stack high-water mark. */ |
long overflows; /* Number of stack overflow ($STKOFEN) calls. */ |
long hits; /* Number of internal buffer hits. */ |
long extends; /* Number of block extensions. */ |
long stko_mallocs; /* Block allocations by $STKOFEN. */ |
long underflows; /* Number of stack underflow calls ($STKRETN). */ |
long stko_free; /* Number of deallocations by $STKRETN. */ |
long stkm_free; /* Number of deallocations by $STKMRET. */ |
long segments; /* Current number of stack segments. */ |
long maxs; /* Maximum number of stack segments so far. */ |
long pad_size; /* Stack pad size. */ |
long current_address; /* Current stack segment address. */ |
long current_size; /* Current stack segment size. This |
number is actually corrupted by STKSTAT to |
include the fifteen word trailer area. */ |
long initial_address; /* Address of initial segment. */ |
long initial_size; /* Size of initial segment. */ |
}; |
/* The following structure describes the data structure which trails |
any stack segment. I think that the description in 'asdef' is |
out of date. I only describe the parts that I am sure about. */ |
struct stk_trailer |
{ |
long this_address; /* Address of this block. */ |
long this_size; /* Size of this block (does not include |
this trailer). */ |
long unknown2; |
long unknown3; |
long link; /* Address of trailer block of previous |
segment. */ |
long unknown5; |
long unknown6; |
long unknown7; |
long unknown8; |
long unknown9; |
long unknown10; |
long unknown11; |
long unknown12; |
long unknown13; |
long unknown14; |
}; |
#endif /* CRAY2 */ |
#endif /* not CRAY_STACK */ |
#ifdef CRAY2 |
/* Determine a "stack measure" for an arbitrary ADDRESS. |
I doubt that "lint" will like this much. */ |
static long |
i00afunc (long *address) |
{ |
struct stk_stat status; |
struct stk_trailer *trailer; |
long *block, size; |
long result = 0; |
/* We want to iterate through all of the segments. The first |
step is to get the stack status structure. We could do this |
more quickly and more directly, perhaps, by referencing the |
$LM00 common block, but I know that this works. */ |
STKSTAT (&status); |
/* Set up the iteration. */ |
trailer = (struct stk_trailer *) (status.current_address |
+ status.current_size |
- 15); |
/* There must be at least one stack segment. Therefore it is |
a fatal error if "trailer" is null. */ |
if (trailer == 0) |
abort (); |
/* Discard segments that do not contain our argument address. */ |
while (trailer != 0) |
{ |
block = (long *) trailer->this_address; |
size = trailer->this_size; |
if (block == 0 || size == 0) |
abort (); |
trailer = (struct stk_trailer *) trailer->link; |
if ((block <= address) && (address < (block + size))) |
break; |
} |
/* Set the result to the offset in this segment and add the sizes |
of all predecessor segments. */ |
result = address - block; |
if (trailer == 0) |
{ |
return result; |
} |
do |
{ |
if (trailer->this_size <= 0) |
abort (); |
result += trailer->this_size; |
trailer = (struct stk_trailer *) trailer->link; |
} |
while (trailer != 0); |
/* We are done. Note that if you present a bogus address (one |
not in any segment), you will get a different number back, formed |
from subtracting the address of the first block. This is probably |
not what you want. */ |
return (result); |
} |
#else /* not CRAY2 */ |
/* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP. |
Determine the number of the cell within the stack, |
given the address of the cell. The purpose of this |
routine is to linearize, in some sense, stack addresses |
for alloca. */ |
static long |
i00afunc (long address) |
{ |
long stkl = 0; |
long size, pseg, this_segment, stack; |
long result = 0; |
struct stack_segment_linkage *ssptr; |
/* Register B67 contains the address of the end of the |
current stack segment. If you (as a subprogram) store |
your registers on the stack and find that you are past |
the contents of B67, you have overflowed the segment. |
B67 also points to the stack segment linkage control |
area, which is what we are really interested in. */ |
stkl = CRAY_STACKSEG_END (); |
ssptr = (struct stack_segment_linkage *) stkl; |
/* If one subtracts 'size' from the end of the segment, |
one has the address of the first word of the segment. |
If this is not the first segment, 'pseg' will be |
nonzero. */ |
pseg = ssptr->sspseg; |
size = ssptr->sssize; |
this_segment = stkl - size; |
/* It is possible that calling this routine itself caused |
a stack overflow. Discard stack segments which do not |
contain the target address. */ |
while (!(this_segment <= address && address <= stkl)) |
{ |
#ifdef DEBUG_I00AFUNC |
fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl); |
#endif |
if (pseg == 0) |
break; |
stkl = stkl - pseg; |
ssptr = (struct stack_segment_linkage *) stkl; |
size = ssptr->sssize; |
pseg = ssptr->sspseg; |
this_segment = stkl - size; |
} |
result = address - this_segment; |
/* If you subtract pseg from the current end of the stack, |
you get the address of the previous stack segment's end. |
This seems a little convoluted to me, but I'll bet you save |
a cycle somewhere. */ |
while (pseg != 0) |
{ |
#ifdef DEBUG_I00AFUNC |
fprintf (stderr, "%011o %011o\n", pseg, size); |
#endif |
stkl = stkl - pseg; |
ssptr = (struct stack_segment_linkage *) stkl; |
size = ssptr->sssize; |
pseg = ssptr->sspseg; |
result += size; |
} |
return (result); |
} |
#endif /* not CRAY2 */ |
#endif /* CRAY */ |
/contrib/toolchain/binutils/libiberty/argv.c |
---|
0,0 → 1,540 |
/* Create and destroy argument vectors (argv's) |
Copyright (C) 1992, 2001, 2010, 2012 Free Software Foundation, Inc. |
Written by Fred Fish @ Cygnus Support |
This file is part of the libiberty library. |
Libiberty is free software; you can redistribute it and/or |
modify it under the terms of the GNU Library General Public |
License as published by the Free Software Foundation; either |
version 2 of the License, or (at your option) any later version. |
Libiberty is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
Library General Public License for more details. |
You should have received a copy of the GNU Library General Public |
License along with libiberty; see the file COPYING.LIB. If |
not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
/* Create and destroy argument vectors. An argument vector is simply an |
array of string pointers, terminated by a NULL pointer. */ |
#ifdef HAVE_CONFIG_H |
#include "config.h" |
#endif |
#include "ansidecl.h" |
#include "libiberty.h" |
#include "safe-ctype.h" |
/* Routines imported from standard C runtime libraries. */ |
#include <stddef.h> |
#include <string.h> |
#include <stdlib.h> |
#include <stdio.h> |
#ifndef NULL |
#define NULL 0 |
#endif |
#ifndef EOS |
#define EOS '\0' |
#endif |
#define INITIAL_MAXARGC 8 /* Number of args + NULL in initial argv */ |
/* |
@deftypefn Extension char** dupargv (char **@var{vector}) |
Duplicate an argument vector. Simply scans through @var{vector}, |
duplicating each argument until the terminating @code{NULL} is found. |
Returns a pointer to the argument vector if successful. Returns |
@code{NULL} if there is insufficient memory to complete building the |
argument vector. |
@end deftypefn |
*/ |
char ** |
dupargv (char **argv) |
{ |
int argc; |
char **copy; |
if (argv == NULL) |
return NULL; |
/* the vector */ |
for (argc = 0; argv[argc] != NULL; argc++); |
copy = (char **) xmalloc ((argc + 1) * sizeof (char *)); |
/* the strings */ |
for (argc = 0; argv[argc] != NULL; argc++) |
{ |
int len = strlen (argv[argc]); |
copy[argc] = (char *) xmalloc (len + 1); |
strcpy (copy[argc], argv[argc]); |
} |
copy[argc] = NULL; |
return copy; |
} |
/* |
@deftypefn Extension void freeargv (char **@var{vector}) |
Free an argument vector that was built using @code{buildargv}. Simply |
scans through @var{vector}, freeing the memory for each argument until |
the terminating @code{NULL} is found, and then frees @var{vector} |
itself. |
@end deftypefn |
*/ |
void freeargv (char **vector) |
{ |
register char **scan; |
if (vector != NULL) |
{ |
for (scan = vector; *scan != NULL; scan++) |
{ |
free (*scan); |
} |
free (vector); |
} |
} |
static void |
consume_whitespace (const char **input) |
{ |
while (ISSPACE (**input)) |
{ |
(*input)++; |
} |
} |
static int |
only_whitespace (const char* input) |
{ |
while (*input != EOS && ISSPACE (*input)) |
input++; |
return (*input == EOS); |
} |
/* |
@deftypefn Extension char** buildargv (char *@var{sp}) |
Given a pointer to a string, parse the string extracting fields |
separated by whitespace and optionally enclosed within either single |
or double quotes (which are stripped off), and build a vector of |
pointers to copies of the string for each field. The input string |
remains unchanged. The last element of the vector is followed by a |
@code{NULL} element. |
All of the memory for the pointer array and copies of the string |
is obtained from @code{xmalloc}. All of the memory can be returned to the |
system with the single function call @code{freeargv}, which takes the |
returned result of @code{buildargv}, as it's argument. |
Returns a pointer to the argument vector if successful. Returns |
@code{NULL} if @var{sp} is @code{NULL} or if there is insufficient |
memory to complete building the argument vector. |
If the input is a null string (as opposed to a @code{NULL} pointer), |
then buildarg returns an argument vector that has one arg, a null |
string. |
@end deftypefn |
The memory for the argv array is dynamically expanded as necessary. |
In order to provide a working buffer for extracting arguments into, |
with appropriate stripping of quotes and translation of backslash |
sequences, we allocate a working buffer at least as long as the input |
string. This ensures that we always have enough space in which to |
work, since the extracted arg is never larger than the input string. |
The argument vector is always kept terminated with a @code{NULL} arg |
pointer, so it can be passed to @code{freeargv} at any time, or |
returned, as appropriate. |
*/ |
char **buildargv (const char *input) |
{ |
char *arg; |
char *copybuf; |
int squote = 0; |
int dquote = 0; |
int bsquote = 0; |
int argc = 0; |
int maxargc = 0; |
char **argv = NULL; |
char **nargv; |
if (input != NULL) |
{ |
copybuf = (char *) xmalloc (strlen (input) + 1); |
/* Is a do{}while to always execute the loop once. Always return an |
argv, even for null strings. See NOTES above, test case below. */ |
do |
{ |
/* Pick off argv[argc] */ |
consume_whitespace (&input); |
if ((maxargc == 0) || (argc >= (maxargc - 1))) |
{ |
/* argv needs initialization, or expansion */ |
if (argv == NULL) |
{ |
maxargc = INITIAL_MAXARGC; |
nargv = (char **) xmalloc (maxargc * sizeof (char *)); |
} |
else |
{ |
maxargc *= 2; |
nargv = (char **) xrealloc (argv, maxargc * sizeof (char *)); |
} |
argv = nargv; |
argv[argc] = NULL; |
} |
/* Begin scanning arg */ |
arg = copybuf; |
while (*input != EOS) |
{ |
if (ISSPACE (*input) && !squote && !dquote && !bsquote) |
{ |
break; |
} |
else |
{ |
if (bsquote) |
{ |
bsquote = 0; |
*arg++ = *input; |
} |
else if (*input == '\\') |
{ |
bsquote = 1; |
} |
else if (squote) |
{ |
if (*input == '\'') |
{ |
squote = 0; |
} |
else |
{ |
*arg++ = *input; |
} |
} |
else if (dquote) |
{ |
if (*input == '"') |
{ |
dquote = 0; |
} |
else |
{ |
*arg++ = *input; |
} |
} |
else |
{ |
if (*input == '\'') |
{ |
squote = 1; |
} |
else if (*input == '"') |
{ |
dquote = 1; |
} |
else |
{ |
*arg++ = *input; |
} |
} |
input++; |
} |
} |
*arg = EOS; |
argv[argc] = xstrdup (copybuf); |
argc++; |
argv[argc] = NULL; |
consume_whitespace (&input); |
} |
while (*input != EOS); |
free (copybuf); |
} |
return (argv); |
} |
/* |
@deftypefn Extension int writeargv (const char **@var{argv}, FILE *@var{file}) |
Write each member of ARGV, handling all necessary quoting, to the file |
named by FILE, separated by whitespace. Return 0 on success, non-zero |
if an error occurred while writing to FILE. |
@end deftypefn |
*/ |
int |
writeargv (char **argv, FILE *f) |
{ |
int status = 0; |
if (f == NULL) |
return 1; |
while (*argv != NULL) |
{ |
const char *arg = *argv; |
while (*arg != EOS) |
{ |
char c = *arg; |
if (ISSPACE(c) || c == '\\' || c == '\'' || c == '"') |
if (EOF == fputc ('\\', f)) |
{ |
status = 1; |
goto done; |
} |
if (EOF == fputc (c, f)) |
{ |
status = 1; |
goto done; |
} |
arg++; |
} |
if (EOF == fputc ('\n', f)) |
{ |
status = 1; |
goto done; |
} |
argv++; |
} |
done: |
return status; |
} |
/* |
@deftypefn Extension void expandargv (int *@var{argcp}, char ***@var{argvp}) |
The @var{argcp} and @code{argvp} arguments are pointers to the usual |
@code{argc} and @code{argv} arguments to @code{main}. This function |
looks for arguments that begin with the character @samp{@@}. Any such |
arguments are interpreted as ``response files''. The contents of the |
response file are interpreted as additional command line options. In |
particular, the file is separated into whitespace-separated strings; |
each such string is taken as a command-line option. The new options |
are inserted in place of the option naming the response file, and |
@code{*argcp} and @code{*argvp} will be updated. If the value of |
@code{*argvp} is modified by this function, then the new value has |
been dynamically allocated and can be deallocated by the caller with |
@code{freeargv}. However, most callers will simply call |
@code{expandargv} near the beginning of @code{main} and allow the |
operating system to free the memory when the program exits. |
@end deftypefn |
*/ |
void |
expandargv (int *argcp, char ***argvp) |
{ |
/* The argument we are currently processing. */ |
int i = 0; |
/* Non-zero if ***argvp has been dynamically allocated. */ |
int argv_dynamic = 0; |
/* Limit the number of response files that we parse in order |
to prevent infinite recursion. */ |
unsigned int iteration_limit = 2000; |
/* Loop over the arguments, handling response files. We always skip |
ARGVP[0], as that is the name of the program being run. */ |
while (++i < *argcp) |
{ |
/* The name of the response file. */ |
const char *filename; |
/* The response file. */ |
FILE *f; |
/* An upper bound on the number of characters in the response |
file. */ |
long pos; |
/* The number of characters in the response file, when actually |
read. */ |
size_t len; |
/* A dynamically allocated buffer used to hold options read from a |
response file. */ |
char *buffer; |
/* Dynamically allocated storage for the options read from the |
response file. */ |
char **file_argv; |
/* The number of options read from the response file, if any. */ |
size_t file_argc; |
/* We are only interested in options of the form "@file". */ |
filename = (*argvp)[i]; |
if (filename[0] != '@') |
continue; |
/* If we have iterated too many times then stop. */ |
if (-- iteration_limit == 0) |
{ |
fprintf (stderr, "%s: error: too many @-files encountered\n", (*argvp)[0]); |
xexit (1); |
} |
/* Read the contents of the file. */ |
f = fopen (++filename, "r"); |
if (!f) |
continue; |
if (fseek (f, 0L, SEEK_END) == -1) |
goto error; |
pos = ftell (f); |
if (pos == -1) |
goto error; |
if (fseek (f, 0L, SEEK_SET) == -1) |
goto error; |
buffer = (char *) xmalloc (pos * sizeof (char) + 1); |
len = fread (buffer, sizeof (char), pos, f); |
if (len != (size_t) pos |
/* On Windows, fread may return a value smaller than POS, |
due to CR/LF->CR translation when reading text files. |
That does not in-and-of itself indicate failure. */ |
&& ferror (f)) |
goto error; |
/* Add a NUL terminator. */ |
buffer[len] = '\0'; |
/* If the file is empty or contains only whitespace, buildargv would |
return a single empty argument. In this context we want no arguments, |
instead. */ |
if (only_whitespace (buffer)) |
{ |
file_argv = (char **) xmalloc (sizeof (char *)); |
file_argv[0] = NULL; |
} |
else |
/* Parse the string. */ |
file_argv = buildargv (buffer); |
/* If *ARGVP is not already dynamically allocated, copy it. */ |
if (!argv_dynamic) |
*argvp = dupargv (*argvp); |
/* Count the number of arguments. */ |
file_argc = 0; |
while (file_argv[file_argc]) |
++file_argc; |
/* Now, insert FILE_ARGV into ARGV. The "+1" below handles the |
NULL terminator at the end of ARGV. */ |
*argvp = ((char **) |
xrealloc (*argvp, |
(*argcp + file_argc + 1) * sizeof (char *))); |
memmove (*argvp + i + file_argc, *argvp + i + 1, |
(*argcp - i) * sizeof (char *)); |
memcpy (*argvp + i, file_argv, file_argc * sizeof (char *)); |
/* The original option has been replaced by all the new |
options. */ |
*argcp += file_argc - 1; |
/* Free up memory allocated to process the response file. We do |
not use freeargv because the individual options in FILE_ARGV |
are now in the main ARGV. */ |
free (file_argv); |
free (buffer); |
/* Rescan all of the arguments just read to support response |
files that include other response files. */ |
--i; |
error: |
/* We're all done with the file now. */ |
fclose (f); |
} |
} |
/* |
@deftypefn Extension int countargv (char **@var{argv}) |
Return the number of elements in @var{argv}. |
Returns zero if @var{argv} is NULL. |
@end deftypefn |
*/ |
int |
countargv (char **argv) |
{ |
int argc; |
if (argv == NULL) |
return 0; |
for (argc = 0; argv[argc] != NULL; argc++) |
continue; |
return argc; |
} |
#ifdef MAIN |
/* Simple little test driver. */ |
static const char *const tests[] = |
{ |
"a simple command line", |
"arg 'foo' is single quoted", |
"arg \"bar\" is double quoted", |
"arg \"foo bar\" has embedded whitespace", |
"arg 'Jack said \\'hi\\'' has single quotes", |
"arg 'Jack said \\\"hi\\\"' has double quotes", |
"a b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9", |
/* This should be expanded into only one argument. */ |
"trailing-whitespace ", |
"", |
NULL |
}; |
int |
main (void) |
{ |
char **argv; |
const char *const *test; |
char **targs; |
for (test = tests; *test != NULL; test++) |
{ |
printf ("buildargv(\"%s\")\n", *test); |
if ((argv = buildargv (*test)) == NULL) |
{ |
printf ("failed!\n\n"); |
} |
else |
{ |
for (targs = argv; *targs != NULL; targs++) |
{ |
printf ("\t\"%s\"\n", *targs); |
} |
printf ("\n"); |
} |
freeargv (argv); |
} |
return 0; |
} |
#endif /* MAIN */ |
/contrib/toolchain/binutils/libiberty/asprintf.c |
---|
0,0 → 1,56 |
/* Like sprintf but provides a pointer to malloc'd storage, which must |
be freed by the caller. |
Copyright (C) 1997, 2003 Free Software Foundation, Inc. |
Contributed by Cygnus Solutions. |
This file is part of the libiberty library. |
Libiberty is free software; you can redistribute it and/or |
modify it under the terms of the GNU Library General Public |
License as published by the Free Software Foundation; either |
version 2 of the License, or (at your option) any later version. |
Libiberty is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
Library General Public License for more details. |
You should have received a copy of the GNU Library General Public |
License along with libiberty; see the file COPYING.LIB. If |
not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
#ifdef HAVE_CONFIG_H |
#include "config.h" |
#endif |
#include "ansidecl.h" |
#include "libiberty.h" |
#include <stdarg.h> |
/* |
@deftypefn Extension int asprintf (char **@var{resptr}, const char *@var{format}, ...) |
Like @code{sprintf}, but instead of passing a pointer to a buffer, you |
pass a pointer to a pointer. This function will compute the size of |
the buffer needed, allocate memory with @code{malloc}, and store a |
pointer to the allocated memory in @code{*@var{resptr}}. The value |
returned is the same as @code{sprintf} would return. If memory could |
not be allocated, minus one is returned and @code{NULL} is stored in |
@code{*@var{resptr}}. |
@end deftypefn |
*/ |
int |
asprintf (char **buf, const char *fmt, ...) |
{ |
int status; |
VA_OPEN (ap, fmt); |
VA_FIXEDARG (ap, char **, buf); |
VA_FIXEDARG (ap, const char *, fmt); |
status = vasprintf (buf, fmt, ap); |
VA_CLOSE (ap); |
return status; |
} |
/contrib/toolchain/binutils/libiberty/bcmp.c |
---|
0,0 → 1,27 |
/* bcmp |
This function is in the public domain. */ |
/* |
@deftypefn Supplemental int bcmp (char *@var{x}, char *@var{y}, int @var{count}) |
Compares the first @var{count} bytes of two areas of memory. Returns |
zero if they are the same, nonzero otherwise. Returns zero if |
@var{count} is zero. A nonzero result only indicates a difference, |
it does not indicate any sorting order (say, by having a positive |
result mean @var{x} sorts before @var{y}). |
@end deftypefn |
*/ |
#include <stddef.h> |
extern int memcmp(const void *, const void *, size_t); |
int |
bcmp (const void *s1, const void *s2, size_t count) |
{ |
return memcmp (s1, s2, count); |
} |
/contrib/toolchain/binutils/libiberty/bcopy.c |
---|
0,0 → 1,31 |
/* bcopy -- copy memory regions of arbitary length |
@deftypefn Supplemental void bcopy (char *@var{in}, char *@var{out}, int @var{length}) |
Copies @var{length} bytes from memory region @var{in} to region |
@var{out}. The use of @code{bcopy} is deprecated in new programs. |
@end deftypefn |
*/ |
#include <stddef.h> |
void |
bcopy (const void *src, void *dest, size_t len) |
{ |
if (dest < src) |
{ |
const char *firsts = (const char *) src; |
char *firstd = (char *) dest; |
while (len--) |
*firstd++ = *firsts++; |
} |
else |
{ |
const char *lasts = (const char *)src + (len-1); |
char *lastd = (char *)dest + (len-1); |
while (len--) |
*lastd-- = *lasts--; |
} |
} |
/contrib/toolchain/binutils/libiberty/bzero.c |
---|
0,0 → 1,23 |
/* Portable version of bzero for systems without it. |
This function is in the public domain. */ |
/* |
@deftypefn Supplemental void bzero (char *@var{mem}, int @var{count}) |
Zeros @var{count} bytes starting at @var{mem}. Use of this function |
is deprecated in favor of @code{memset}. |
@end deftypefn |
*/ |
#include <stddef.h> |
extern void *memset(void *, int, size_t); |
void |
bzero (void *to, size_t count) |
{ |
memset (to, 0, count); |
} |
/contrib/toolchain/binutils/libiberty/choose-temp.c |
---|
0,0 → 1,75 |
/* Utility to pick a temporary filename prefix. |
Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. |
This file is part of the libiberty library. |
Libiberty is free software; you can redistribute it and/or |
modify it under the terms of the GNU Library General Public |
License as published by the Free Software Foundation; either |
version 2 of the License, or (at your option) any later version. |
Libiberty is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
Library General Public License for more details. |
You should have received a copy of the GNU Library General Public |
License along with libiberty; see the file COPYING.LIB. If not, |
write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
#ifdef HAVE_CONFIG_H |
#include "config.h" |
#endif |
#include <stdio.h> /* May get P_tmpdir. */ |
#include <sys/types.h> |
#ifdef HAVE_UNISTD_H |
#include <unistd.h> |
#endif |
#ifdef HAVE_STDLIB_H |
#include <stdlib.h> |
#endif |
#ifdef HAVE_STRING_H |
#include <string.h> |
#endif |
#include "libiberty.h" |
extern char *choose_tmpdir (void); |
/* Name of temporary file. |
mktemp requires 6 trailing X's. */ |
#define TEMP_FILE "ccXXXXXX" |
#define TEMP_FILE_LEN (sizeof(TEMP_FILE) - 1) |
/* |
@deftypefn Extension char* choose_temp_base (void) |
Return a prefix for temporary file names or @code{NULL} if unable to |
find one. The current directory is chosen if all else fails so the |
program is exited if a temporary directory can't be found (@code{mktemp} |
fails). The buffer for the result is obtained with @code{xmalloc}. |
This function is provided for backwards compatibility only. Its use is |
not recommended. |
@end deftypefn |
*/ |
char * |
choose_temp_base (void) |
{ |
const char *base = choose_tmpdir (); |
char *temp_filename; |
int len; |
len = strlen (base); |
temp_filename = XNEWVEC (char, len + TEMP_FILE_LEN + 1); |
strcpy (temp_filename, base); |
strcpy (temp_filename + len, TEMP_FILE); |
if (mktemp (temp_filename) == 0) |
abort (); |
return temp_filename; |
} |
/contrib/toolchain/binutils/libiberty/concat.c |
---|
0,0 → 1,234 |
/* Concatenate variable number of strings. |
Copyright (C) 1991, 1994, 2001, 2011 Free Software Foundation, Inc. |
Written by Fred Fish @ Cygnus Support |
This file is part of the libiberty library. |
Libiberty is free software; you can redistribute it and/or |
modify it under the terms of the GNU Library General Public |
License as published by the Free Software Foundation; either |
version 2 of the License, or (at your option) any later version. |
Libiberty is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
Library General Public License for more details. |
You should have received a copy of the GNU Library General Public |
License along with libiberty; see the file COPYING.LIB. If |
not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
/* |
@deftypefn Extension char* concat (const char *@var{s1}, const char *@var{s2}, @ |
@dots{}, @code{NULL}) |
Concatenate zero or more of strings and return the result in freshly |
@code{xmalloc}ed memory. Returns @code{NULL} if insufficient memory is |
available. The argument list is terminated by the first @code{NULL} |
pointer encountered. Pointers to empty strings are ignored. |
@end deftypefn |
NOTES |
This function uses xmalloc() which is expected to be a front end |
function to malloc() that deals with low memory situations. In |
typical use, if malloc() returns NULL then xmalloc() diverts to an |
error handler routine which never returns, and thus xmalloc will |
never return a NULL pointer. If the client application wishes to |
deal with low memory situations itself, it should supply an xmalloc |
that just directly invokes malloc and blindly returns whatever |
malloc returns. |
*/ |
#ifdef HAVE_CONFIG_H |
#include "config.h" |
#endif |
#include "ansidecl.h" |
#include "libiberty.h" |
#include <sys/types.h> /* size_t */ |
#include <stdarg.h> |
# if HAVE_STRING_H |
# include <string.h> |
# else |
# if HAVE_STRINGS_H |
# include <strings.h> |
# endif |
# endif |
#if HAVE_STDLIB_H |
#include <stdlib.h> |
#endif |
static inline unsigned long vconcat_length (const char *, va_list); |
static inline unsigned long |
vconcat_length (const char *first, va_list args) |
{ |
unsigned long length = 0; |
const char *arg; |
for (arg = first; arg ; arg = va_arg (args, const char *)) |
length += strlen (arg); |
return length; |
} |
static inline char * |
vconcat_copy (char *dst, const char *first, va_list args) |
{ |
char *end = dst; |
const char *arg; |
for (arg = first; arg ; arg = va_arg (args, const char *)) |
{ |
unsigned long length = strlen (arg); |
memcpy (end, arg, length); |
end += length; |
} |
*end = '\000'; |
return dst; |
} |
/* @undocumented concat_length */ |
unsigned long |
concat_length (const char *first, ...) |
{ |
unsigned long length; |
VA_OPEN (args, first); |
VA_FIXEDARG (args, const char *, first); |
length = vconcat_length (first, args); |
VA_CLOSE (args); |
return length; |
} |
/* @undocumented concat_copy */ |
char * |
concat_copy (char *dst, const char *first, ...) |
{ |
char *save_dst; |
VA_OPEN (args, first); |
VA_FIXEDARG (args, char *, dst); |
VA_FIXEDARG (args, const char *, first); |
vconcat_copy (dst, first, args); |
save_dst = dst; /* With K&R C, dst goes out of scope here. */ |
VA_CLOSE (args); |
return save_dst; |
} |
#ifdef __cplusplus |
extern "C" { |
#endif /* __cplusplus */ |
char *libiberty_concat_ptr; |
#ifdef __cplusplus |
} |
#endif /* __cplusplus */ |
/* @undocumented concat_copy2 */ |
char * |
concat_copy2 (const char *first, ...) |
{ |
VA_OPEN (args, first); |
VA_FIXEDARG (args, const char *, first); |
vconcat_copy (libiberty_concat_ptr, first, args); |
VA_CLOSE (args); |
return libiberty_concat_ptr; |
} |
char * |
concat (const char *first, ...) |
{ |
char *newstr; |
/* First compute the size of the result and get sufficient memory. */ |
VA_OPEN (args, first); |
VA_FIXEDARG (args, const char *, first); |
newstr = XNEWVEC (char, vconcat_length (first, args) + 1); |
VA_CLOSE (args); |
/* Now copy the individual pieces to the result string. */ |
VA_OPEN (args, first); |
VA_FIXEDARG (args, const char *, first); |
vconcat_copy (newstr, first, args); |
VA_CLOSE (args); |
return newstr; |
} |
/* |
@deftypefn Extension char* reconcat (char *@var{optr}, const char *@var{s1}, @ |
@dots{}, @code{NULL}) |
Same as @code{concat}, except that if @var{optr} is not @code{NULL} it |
is freed after the string is created. This is intended to be useful |
when you're extending an existing string or building up a string in a |
loop: |
@example |
str = reconcat (str, "pre-", str, NULL); |
@end example |
@end deftypefn |
*/ |
char * |
reconcat (char *optr, const char *first, ...) |
{ |
char *newstr; |
/* First compute the size of the result and get sufficient memory. */ |
VA_OPEN (args, first); |
VA_FIXEDARG (args, char *, optr); |
VA_FIXEDARG (args, const char *, first); |
newstr = XNEWVEC (char, vconcat_length (first, args) + 1); |
VA_CLOSE (args); |
/* Now copy the individual pieces to the result string. */ |
VA_OPEN (args, first); |
VA_FIXEDARG (args, char *, optr); |
VA_FIXEDARG (args, const char *, first); |
vconcat_copy (newstr, first, args); |
if (optr) /* Done before VA_CLOSE so optr stays in scope for K&R C. */ |
free (optr); |
VA_CLOSE (args); |
return newstr; |
} |
#ifdef MAIN |
#define NULLP (char *)0 |
/* Simple little test driver. */ |
#include <stdio.h> |
int |
main (void) |
{ |
printf ("\"\" = \"%s\"\n", concat (NULLP)); |
printf ("\"a\" = \"%s\"\n", concat ("a", NULLP)); |
printf ("\"ab\" = \"%s\"\n", concat ("a", "b", NULLP)); |
printf ("\"abc\" = \"%s\"\n", concat ("a", "b", "c", NULLP)); |
printf ("\"abcd\" = \"%s\"\n", concat ("ab", "cd", NULLP)); |
printf ("\"abcde\" = \"%s\"\n", concat ("ab", "c", "de", NULLP)); |
printf ("\"abcdef\" = \"%s\"\n", concat ("", "a", "", "bcd", "ef", NULLP)); |
return 0; |
} |
#endif |
/contrib/toolchain/binutils/libiberty/config.h |
---|
0,0 → 1,500 |
/* config.h. Generated from config.in by configure. */ |
/* config.in. Generated from configure.ac by autoheader. */ |
/* Define if building universal (internal helper macro) */ |
/* #undef AC_APPLE_UNIVERSAL_BUILD */ |
/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems. |
This function is required for alloca.c support on those systems. */ |
/* #undef CRAY_STACKSEG_END */ |
/* Define to 1 if you have the <alloca.h> header file. */ |
/* #undef HAVE_ALLOCA_H */ |
/* Define to 1 if you have the `asprintf' function. */ |
/* #undef HAVE_ASPRINTF */ |
/* Define to 1 if you have the `atexit' function. */ |
#define HAVE_ATEXIT 1 |
/* Define to 1 if you have the `basename' function. */ |
#define HAVE_BASENAME 1 |
/* Define to 1 if you have the `bcmp' function. */ |
/* #undef HAVE_BCMP */ |
/* Define to 1 if you have the `bcopy' function. */ |
/* #undef HAVE_BCOPY */ |
/* Define to 1 if you have the `bsearch' function. */ |
#define HAVE_BSEARCH 1 |
/* Define to 1 if you have the `bzero' function. */ |
/* #undef HAVE_BZERO */ |
/* Define to 1 if you have the `calloc' function. */ |
#define HAVE_CALLOC 1 |
/* Define to 1 if you have the `canonicalize_file_name' function. */ |
/* #undef HAVE_CANONICALIZE_FILE_NAME */ |
/* Define to 1 if you have the `clock' function. */ |
#define HAVE_CLOCK 1 |
/* Define to 1 if you have the declaration of `asprintf', and to 0 if you |
don't. */ |
#define HAVE_DECL_ASPRINTF 0 |
/* Define to 1 if you have the declaration of `basename(char *)', and to 0 if |
you don't. */ |
#define HAVE_DECL_BASENAME 0 |
/* Define to 1 if you have the declaration of `calloc', and to 0 if you don't. |
*/ |
#define HAVE_DECL_CALLOC 1 |
/* Define to 1 if you have the declaration of `ffs', and to 0 if you don't. */ |
#define HAVE_DECL_FFS 0 |
/* Define to 1 if you have the declaration of `getenv', and to 0 if you don't. |
*/ |
#define HAVE_DECL_GETENV 1 |
/* Define to 1 if you have the declaration of `getopt', and to 0 if you don't. |
*/ |
#define HAVE_DECL_GETOPT 1 |
/* Define to 1 if you have the declaration of `malloc', and to 0 if you don't. |
*/ |
#define HAVE_DECL_MALLOC 1 |
/* Define to 1 if you have the declaration of `realloc', and to 0 if you |
don't. */ |
#define HAVE_DECL_REALLOC 1 |
/* Define to 1 if you have the declaration of `sbrk', and to 0 if you don't. |
*/ |
#define HAVE_DECL_SBRK 0 |
/* Define to 1 if you have the declaration of `snprintf', and to 0 if you |
don't. */ |
#define HAVE_DECL_SNPRINTF 1 |
/* Define to 1 if you have the declaration of `strverscmp', and to 0 if you |
don't. */ |
#define HAVE_DECL_STRVERSCMP 0 |
/* Define to 1 if you have the declaration of `vasprintf', and to 0 if you |
don't. */ |
#define HAVE_DECL_VASPRINTF 0 |
/* Define to 1 if you have the declaration of `vsnprintf', and to 0 if you |
don't. */ |
#define HAVE_DECL_VSNPRINTF 1 |
/* Define to 1 if you have the `dup3' function. */ |
/* #undef HAVE_DUP3 */ |
/* Define to 1 if you have the <fcntl.h> header file. */ |
#define HAVE_FCNTL_H 1 |
/* Define to 1 if you have the `ffs' function. */ |
/* #undef HAVE_FFS */ |
/* Define to 1 if you have the `fork' function. */ |
/* #undef HAVE_FORK */ |
/* Define to 1 if you have the `getcwd' function. */ |
#define HAVE_GETCWD 1 |
/* Define to 1 if you have the `getpagesize' function. */ |
#define HAVE_GETPAGESIZE 1 |
/* Define to 1 if you have the `getrlimit' function. */ |
/* #undef HAVE_GETRLIMIT */ |
/* Define to 1 if you have the `getrusage' function. */ |
/* #undef HAVE_GETRUSAGE */ |
/* Define to 1 if you have the `getsysinfo' function. */ |
/* #undef HAVE_GETSYSINFO */ |
/* Define to 1 if you have the `gettimeofday' function. */ |
#define HAVE_GETTIMEOFDAY 1 |
/* Define to 1 if you have the `index' function. */ |
/* #undef HAVE_INDEX */ |
/* Define to 1 if you have the `insque' function. */ |
/* #undef HAVE_INSQUE */ |
/* Define to 1 if the system has the type `intptr_t'. */ |
#define HAVE_INTPTR_T 1 |
/* Define to 1 if you have the <inttypes.h> header file. */ |
#define HAVE_INTTYPES_H 1 |
/* Define to 1 if you have the <limits.h> header file. */ |
#define HAVE_LIMITS_H 1 |
/* Define to 1 if you have the <machine/hal_sysinfo.h> header file. */ |
/* #undef HAVE_MACHINE_HAL_SYSINFO_H */ |
/* Define to 1 if you have the <malloc.h> header file. */ |
#define HAVE_MALLOC_H 1 |
/* Define to 1 if you have the `memchr' function. */ |
#define HAVE_MEMCHR 1 |
/* Define to 1 if you have the `memcmp' function. */ |
#define HAVE_MEMCMP 1 |
/* Define to 1 if you have the `memcpy' function. */ |
#define HAVE_MEMCPY 1 |
/* Define to 1 if you have the `memmem' function. */ |
/* #undef HAVE_MEMMEM */ |
/* Define to 1 if you have the `memmove' function. */ |
#define HAVE_MEMMOVE 1 |
/* Define to 1 if you have the <memory.h> header file. */ |
#define HAVE_MEMORY_H 1 |
/* Define to 1 if you have the `memset' function. */ |
#define HAVE_MEMSET 1 |
/* Define to 1 if you have the `mkstemps' function. */ |
/* #undef HAVE_MKSTEMPS */ |
/* Define to 1 if you have a working `mmap' system call. */ |
/* #undef HAVE_MMAP */ |
/* Define to 1 if you have the `on_exit' function. */ |
/* #undef HAVE_ON_EXIT */ |
/* Define to 1 if you have the <process.h> header file. */ |
#define HAVE_PROCESS_H 1 |
/* Define to 1 if you have the `psignal' function. */ |
/* #undef HAVE_PSIGNAL */ |
/* Define to 1 if you have the `pstat_getdynamic' function. */ |
/* #undef HAVE_PSTAT_GETDYNAMIC */ |
/* Define to 1 if you have the `pstat_getstatic' function. */ |
/* #undef HAVE_PSTAT_GETSTATIC */ |
/* Define to 1 if you have the `putenv' function. */ |
#define HAVE_PUTENV 1 |
/* Define to 1 if you have the `random' function. */ |
/* #undef HAVE_RANDOM */ |
/* Define to 1 if you have the `realpath' function. */ |
/* #undef HAVE_REALPATH */ |
/* Define to 1 if you have the `rename' function. */ |
#define HAVE_RENAME 1 |
/* Define to 1 if you have the `rindex' function. */ |
/* #undef HAVE_RINDEX */ |
/* Define to 1 if you have the `sbrk' function. */ |
/* #undef HAVE_SBRK */ |
/* Define to 1 if you have the `setenv' function. */ |
/* #undef HAVE_SETENV */ |
/* Define to 1 if you have the `setproctitle' function. */ |
/* #undef HAVE_SETPROCTITLE */ |
/* Define to 1 if you have the `setrlimit' function. */ |
/* #undef HAVE_SETRLIMIT */ |
/* Define to 1 if you have the `sigsetmask' function. */ |
/* #undef HAVE_SIGSETMASK */ |
/* Define to 1 if you have the `snprintf' function. */ |
#define HAVE_SNPRINTF 1 |
/* Define to 1 if you have the `spawnve' function. */ |
#define HAVE_SPAWNVE 1 |
/* Define to 1 if you have the `spawnvpe' function. */ |
#define HAVE_SPAWNVPE 1 |
/* Define to 1 if you have the <stdint.h> header file. */ |
#define HAVE_STDINT_H 1 |
/* Define to 1 if you have the <stdio_ext.h> header file. */ |
/* #undef HAVE_STDIO_EXT_H */ |
/* Define to 1 if you have the <stdlib.h> header file. */ |
#define HAVE_STDLIB_H 1 |
/* Define to 1 if you have the `stpcpy' function. */ |
/* #undef HAVE_STPCPY */ |
/* Define to 1 if you have the `stpncpy' function. */ |
/* #undef HAVE_STPNCPY */ |
/* Define to 1 if you have the `strcasecmp' function. */ |
/* #undef HAVE_STRCASECMP */ |
/* Define to 1 if you have the `strchr' function. */ |
#define HAVE_STRCHR 1 |
/* Define to 1 if you have the `strdup' function. */ |
#define HAVE_STRDUP 1 |
/* Define to 1 if you have the `strerror' function. */ |
#define HAVE_STRERROR 1 |
/* Define to 1 if you have the <strings.h> header file. */ |
#define HAVE_STRINGS_H 1 |
/* Define to 1 if you have the <string.h> header file. */ |
#define HAVE_STRING_H 1 |
/* Define to 1 if you have the `strncasecmp' function. */ |
/* #undef HAVE_STRNCASECMP */ |
/* Define to 1 if you have the `strndup' function. */ |
/* #undef HAVE_STRNDUP */ |
/* Define to 1 if you have the `strnlen' function. */ |
/* #undef HAVE_STRNLEN */ |
/* Define to 1 if you have the `strrchr' function. */ |
#define HAVE_STRRCHR 1 |
/* Define to 1 if you have the `strsignal' function. */ |
/* #undef HAVE_STRSIGNAL */ |
/* Define to 1 if you have the `strstr' function. */ |
#define HAVE_STRSTR 1 |
/* Define to 1 if you have the `strtod' function. */ |
#define HAVE_STRTOD 1 |
/* Define to 1 if you have the `strtol' function. */ |
#define HAVE_STRTOL 1 |
/* Define to 1 if you have the `strtoul' function. */ |
#define HAVE_STRTOUL 1 |
/* Define to 1 if you have the `strverscmp' function. */ |
/* #undef HAVE_STRVERSCMP */ |
/* Define to 1 if you have the `sysconf' function. */ |
/* #undef HAVE_SYSCONF */ |
/* Define to 1 if you have the `sysctl' function. */ |
/* #undef HAVE_SYSCTL */ |
/* Define to 1 if you have the `sysmp' function. */ |
/* #undef HAVE_SYSMP */ |
/* Define if you have the sys_errlist variable. */ |
#define HAVE_SYS_ERRLIST 1 |
/* Define to 1 if you have the <sys/file.h> header file. */ |
#define HAVE_SYS_FILE_H 1 |
/* Define to 1 if you have the <sys/mman.h> header file. */ |
/* #undef HAVE_SYS_MMAN_H */ |
/* Define if you have the sys_nerr variable. */ |
#define HAVE_SYS_NERR 1 |
/* Define to 1 if you have the <sys/param.h> header file. */ |
#define HAVE_SYS_PARAM_H 1 |
/* Define to 1 if you have the <sys/prctl.h> header file. */ |
/* #undef HAVE_SYS_PRCTL_H */ |
/* Define to 1 if you have the <sys/pstat.h> header file. */ |
/* #undef HAVE_SYS_PSTAT_H */ |
/* Define to 1 if you have the <sys/resource.h> header file. */ |
/* #undef HAVE_SYS_RESOURCE_H */ |
/* Define if you have the sys_siglist variable. */ |
/* #undef HAVE_SYS_SIGLIST */ |
/* Define to 1 if you have the <sys/stat.h> header file. */ |
#define HAVE_SYS_STAT_H 1 |
/* Define to 1 if you have the <sys/sysctl.h> header file. */ |
/* #undef HAVE_SYS_SYSCTL_H */ |
/* Define to 1 if you have the <sys/sysinfo.h> header file. */ |
/* #undef HAVE_SYS_SYSINFO_H */ |
/* Define to 1 if you have the <sys/sysmp.h> header file. */ |
/* #undef HAVE_SYS_SYSMP_H */ |
/* Define to 1 if you have the <sys/systemcfg.h> header file. */ |
/* #undef HAVE_SYS_SYSTEMCFG_H */ |
/* Define to 1 if you have the <sys/table.h> header file. */ |
/* #undef HAVE_SYS_TABLE_H */ |
/* Define to 1 if you have the <sys/time.h> header file. */ |
#define HAVE_SYS_TIME_H 1 |
/* Define to 1 if you have the <sys/types.h> header file. */ |
#define HAVE_SYS_TYPES_H 1 |
/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */ |
/* #undef HAVE_SYS_WAIT_H */ |
/* Define to 1 if you have the `table' function. */ |
/* #undef HAVE_TABLE */ |
/* Define to 1 if you have the `times' function. */ |
/* #undef HAVE_TIMES */ |
/* Define to 1 if you have the <time.h> header file. */ |
#define HAVE_TIME_H 1 |
/* Define to 1 if you have the `tmpnam' function. */ |
#define HAVE_TMPNAM 1 |
/* Define if you have the \`uintptr_t' type. */ |
#define HAVE_UINTPTR_T 1 |
/* Define to 1 if you have the <unistd.h> header file. */ |
#define HAVE_UNISTD_H 1 |
/* Define to 1 if you have the `vasprintf' function. */ |
/* #undef HAVE_VASPRINTF */ |
/* Define to 1 if you have the `vfork' function. */ |
/* #undef HAVE_VFORK */ |
/* Define to 1 if you have the <vfork.h> header file. */ |
/* #undef HAVE_VFORK_H */ |
/* Define to 1 if you have the `vfprintf' function. */ |
#define HAVE_VFPRINTF 1 |
/* Define to 1 if you have the `vprintf' function. */ |
#define HAVE_VPRINTF 1 |
/* Define to 1 if you have the `vsprintf' function. */ |
#define HAVE_VSPRINTF 1 |
/* Define to 1 if you have the `wait3' function. */ |
/* #undef HAVE_WAIT3 */ |
/* Define to 1 if you have the `wait4' function. */ |
/* #undef HAVE_WAIT4 */ |
/* Define to 1 if you have the `waitpid' function. */ |
/* #undef HAVE_WAITPID */ |
/* Define to 1 if `fork' works. */ |
/* #undef HAVE_WORKING_FORK */ |
/* Define to 1 if `vfork' works. */ |
/* #undef HAVE_WORKING_VFORK */ |
/* Define to 1 if you have the `_doprnt' function. */ |
/* #undef HAVE__DOPRNT */ |
/* Define if you have the _system_configuration variable. */ |
/* #undef HAVE__SYSTEM_CONFIGURATION */ |
/* Define to 1 if you have the `__fsetlocking' function. */ |
/* #undef HAVE___FSETLOCKING */ |
/* Define if canonicalize_file_name is not declared in system header files. */ |
#define NEED_DECLARATION_CANONICALIZE_FILE_NAME 1 |
/* Define if errno must be declared even when <errno.h> is included. */ |
/* #undef NEED_DECLARATION_ERRNO */ |
/* Define to 1 if your C compiler doesn't accept -c and -o together. */ |
/* #undef NO_MINUS_C_MINUS_O */ |
/* Define to the address where bug reports for this package should be sent. */ |
#define PACKAGE_BUGREPORT "" |
/* Define to the full name of this package. */ |
#define PACKAGE_NAME "" |
/* Define to the full name and version of this package. */ |
#define PACKAGE_STRING "" |
/* Define to the one symbol short name of this package. */ |
#define PACKAGE_TARNAME "" |
/* Define to the home page for this package. */ |
#define PACKAGE_URL "" |
/* Define to the version of this package. */ |
#define PACKAGE_VERSION "" |
/* The size of `int', as computed by sizeof. */ |
#define SIZEOF_INT 4 |
/* Define if you know the direction of stack growth for your system; otherwise |
it will be automatically deduced at run-time. STACK_DIRECTION > 0 => grows |
toward higher addresses STACK_DIRECTION < 0 => grows toward lower addresses |
STACK_DIRECTION = 0 => direction of growth unknown */ |
#define STACK_DIRECTION -1 |
/* Define to 1 if you have the ANSI C header files. */ |
#define STDC_HEADERS 1 |
/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */ |
#define TIME_WITH_SYS_TIME 1 |
/* Define to an unsigned 64-bit type available in the compiler. */ |
#define UNSIGNED_64BIT_TYPE uint64_t |
/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most |
significant byte first (like Motorola and SPARC, unlike Intel). */ |
#if defined AC_APPLE_UNIVERSAL_BUILD |
# if defined __BIG_ENDIAN__ |
# define WORDS_BIGENDIAN 1 |
# endif |
#else |
# ifndef WORDS_BIGENDIAN |
/* # undef WORDS_BIGENDIAN */ |
# endif |
#endif |
/* Number of bits in a file offset, on hosts where this is settable. */ |
/* #undef _FILE_OFFSET_BITS */ |
/* Define for large files, on AIX-style hosts. */ |
/* #undef _LARGE_FILES */ |
/* Define to empty if `const' does not conform to ANSI C. */ |
/* #undef const */ |
/* Define to `__inline__' or `__inline' if that's what the C compiler |
calls it, or to nothing if 'inline' is not supported under any name. */ |
#ifndef __cplusplus |
/* #undef inline */ |
#endif |
/* Define to the type of a signed integer type wide enough to hold a pointer, |
if such a type exists, and if the system does not define it. */ |
/* #undef intptr_t */ |
/* Define to `int' if <sys/types.h> does not define. */ |
/* #undef pid_t */ |
/* Define to `int' if <sys/types.h> does not define. */ |
/* #undef ssize_t */ |
/* Define to the type of an unsigned integer type wide enough to hold a |
pointer, if such a type exists, and if the system does not define it. */ |
/* #undef uintptr_t */ |
/* Define as `fork' if `vfork' does not work. */ |
#define vfork fork |
/contrib/toolchain/binutils/libiberty/cp-demangle.c |
---|
0,0 → 1,5937 |
/* Demangler for g++ V3 ABI. |
Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 |
Free Software Foundation, Inc. |
Written by Ian Lance Taylor <ian@wasabisystems.com>. |
This file is part of the libiberty library, which is part of GCC. |
This file is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2 of the License, or |
(at your option) any later version. |
In addition to the permissions in the GNU General Public License, the |
Free Software Foundation gives you unlimited permission to link the |
compiled version of this file into combinations with other programs, |
and to distribute those combinations without any restriction coming |
from the use of this file. (The General Public License restrictions |
do apply in other respects; for example, they cover modification of |
the file, and distribution when not linked into a combined |
executable.) |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. |
*/ |
/* This code implements a demangler for the g++ V3 ABI. The ABI is |
described on this web page: |
http://www.codesourcery.com/cxx-abi/abi.html#mangling |
This code was written while looking at the demangler written by |
Alex Samuel <samuel@codesourcery.com>. |
This code first pulls the mangled name apart into a list of |
components, and then walks the list generating the demangled |
name. |
This file will normally define the following functions, q.v.: |
char *cplus_demangle_v3(const char *mangled, int options) |
char *java_demangle_v3(const char *mangled) |
int cplus_demangle_v3_callback(const char *mangled, int options, |
demangle_callbackref callback) |
int java_demangle_v3_callback(const char *mangled, |
demangle_callbackref callback) |
enum gnu_v3_ctor_kinds is_gnu_v3_mangled_ctor (const char *name) |
enum gnu_v3_dtor_kinds is_gnu_v3_mangled_dtor (const char *name) |
Also, the interface to the component list is public, and defined in |
demangle.h. The interface consists of these types, which are |
defined in demangle.h: |
enum demangle_component_type |
struct demangle_component |
demangle_callbackref |
and these functions defined in this file: |
cplus_demangle_fill_name |
cplus_demangle_fill_extended_operator |
cplus_demangle_fill_ctor |
cplus_demangle_fill_dtor |
cplus_demangle_print |
cplus_demangle_print_callback |
and other functions defined in the file cp-demint.c. |
This file also defines some other functions and variables which are |
only to be used by the file cp-demint.c. |
Preprocessor macros you can define while compiling this file: |
IN_LIBGCC2 |
If defined, this file defines the following functions, q.v.: |
char *__cxa_demangle (const char *mangled, char *buf, size_t *len, |
int *status) |
int __gcclibcxx_demangle_callback (const char *, |
void (*) |
(const char *, size_t, void *), |
void *) |
instead of cplus_demangle_v3[_callback]() and |
java_demangle_v3[_callback](). |
IN_GLIBCPP_V3 |
If defined, this file defines only __cxa_demangle() and |
__gcclibcxx_demangle_callback(), and no other publically visible |
functions or variables. |
STANDALONE_DEMANGLER |
If defined, this file defines a main() function which demangles |
any arguments, or, if none, demangles stdin. |
CP_DEMANGLE_DEBUG |
If defined, turns on debugging mode, which prints information on |
stdout about the mangled string. This is not generally useful. |
*/ |
#if defined (_AIX) && !defined (__GNUC__) |
#pragma alloca |
#endif |
#ifdef HAVE_CONFIG_H |
#include "config.h" |
#endif |
#include <stdio.h> |
#ifdef HAVE_STDLIB_H |
#include <stdlib.h> |
#endif |
#ifdef HAVE_STRING_H |
#include <string.h> |
#endif |
#ifdef HAVE_ALLOCA_H |
# include <alloca.h> |
#else |
# ifndef alloca |
# ifdef __GNUC__ |
# define alloca __builtin_alloca |
# else |
extern char *alloca (); |
# endif /* __GNUC__ */ |
# endif /* alloca */ |
#endif /* HAVE_ALLOCA_H */ |
#include "ansidecl.h" |
#include "libiberty.h" |
#include "demangle.h" |
#include "cp-demangle.h" |
/* If IN_GLIBCPP_V3 is defined, some functions are made static. We |
also rename them via #define to avoid compiler errors when the |
static definition conflicts with the extern declaration in a header |
file. */ |
#ifdef IN_GLIBCPP_V3 |
#define CP_STATIC_IF_GLIBCPP_V3 static |
#define cplus_demangle_fill_name d_fill_name |
static int d_fill_name (struct demangle_component *, const char *, int); |
#define cplus_demangle_fill_extended_operator d_fill_extended_operator |
static int |
d_fill_extended_operator (struct demangle_component *, int, |
struct demangle_component *); |
#define cplus_demangle_fill_ctor d_fill_ctor |
static int |
d_fill_ctor (struct demangle_component *, enum gnu_v3_ctor_kinds, |
struct demangle_component *); |
#define cplus_demangle_fill_dtor d_fill_dtor |
static int |
d_fill_dtor (struct demangle_component *, enum gnu_v3_dtor_kinds, |
struct demangle_component *); |
#define cplus_demangle_mangled_name d_mangled_name |
static struct demangle_component *d_mangled_name (struct d_info *, int); |
#define cplus_demangle_type d_type |
static struct demangle_component *d_type (struct d_info *); |
#define cplus_demangle_print d_print |
static char *d_print (int, const struct demangle_component *, int, size_t *); |
#define cplus_demangle_print_callback d_print_callback |
static int d_print_callback (int, const struct demangle_component *, |
demangle_callbackref, void *); |
#define cplus_demangle_init_info d_init_info |
static void d_init_info (const char *, int, size_t, struct d_info *); |
#else /* ! defined(IN_GLIBCPP_V3) */ |
#define CP_STATIC_IF_GLIBCPP_V3 |
#endif /* ! defined(IN_GLIBCPP_V3) */ |
/* See if the compiler supports dynamic arrays. */ |
#ifdef __GNUC__ |
#define CP_DYNAMIC_ARRAYS |
#else |
#ifdef __STDC__ |
#ifdef __STDC_VERSION__ |
#if __STDC_VERSION__ >= 199901L |
#define CP_DYNAMIC_ARRAYS |
#endif /* __STDC__VERSION >= 199901L */ |
#endif /* defined (__STDC_VERSION__) */ |
#endif /* defined (__STDC__) */ |
#endif /* ! defined (__GNUC__) */ |
/* We avoid pulling in the ctype tables, to prevent pulling in |
additional unresolved symbols when this code is used in a library. |
FIXME: Is this really a valid reason? This comes from the original |
V3 demangler code. |
As of this writing this file has the following undefined references |
when compiled with -DIN_GLIBCPP_V3: realloc, free, memcpy, strcpy, |
strcat, strlen. */ |
#define IS_DIGIT(c) ((c) >= '0' && (c) <= '9') |
#define IS_UPPER(c) ((c) >= 'A' && (c) <= 'Z') |
#define IS_LOWER(c) ((c) >= 'a' && (c) <= 'z') |
/* The prefix prepended by GCC to an identifier represnting the |
anonymous namespace. */ |
#define ANONYMOUS_NAMESPACE_PREFIX "_GLOBAL_" |
#define ANONYMOUS_NAMESPACE_PREFIX_LEN \ |
(sizeof (ANONYMOUS_NAMESPACE_PREFIX) - 1) |
/* Information we keep for the standard substitutions. */ |
struct d_standard_sub_info |
{ |
/* The code for this substitution. */ |
char code; |
/* The simple string it expands to. */ |
const char *simple_expansion; |
/* The length of the simple expansion. */ |
int simple_len; |
/* The results of a full, verbose, expansion. This is used when |
qualifying a constructor/destructor, or when in verbose mode. */ |
const char *full_expansion; |
/* The length of the full expansion. */ |
int full_len; |
/* What to set the last_name field of d_info to; NULL if we should |
not set it. This is only relevant when qualifying a |
constructor/destructor. */ |
const char *set_last_name; |
/* The length of set_last_name. */ |
int set_last_name_len; |
}; |
/* Accessors for subtrees of struct demangle_component. */ |
#define d_left(dc) ((dc)->u.s_binary.left) |
#define d_right(dc) ((dc)->u.s_binary.right) |
/* A list of templates. This is used while printing. */ |
struct d_print_template |
{ |
/* Next template on the list. */ |
struct d_print_template *next; |
/* This template. */ |
const struct demangle_component *template_decl; |
}; |
/* A list of type modifiers. This is used while printing. */ |
struct d_print_mod |
{ |
/* Next modifier on the list. These are in the reverse of the order |
in which they appeared in the mangled string. */ |
struct d_print_mod *next; |
/* The modifier. */ |
const struct demangle_component *mod; |
/* Whether this modifier was printed. */ |
int printed; |
/* The list of templates which applies to this modifier. */ |
struct d_print_template *templates; |
}; |
/* We use these structures to hold information during printing. */ |
struct d_growable_string |
{ |
/* Buffer holding the result. */ |
char *buf; |
/* Current length of data in buffer. */ |
size_t len; |
/* Allocated size of buffer. */ |
size_t alc; |
/* Set to 1 if we had a memory allocation failure. */ |
int allocation_failure; |
}; |
enum { D_PRINT_BUFFER_LENGTH = 256 }; |
struct d_print_info |
{ |
/* Fixed-length allocated buffer for demangled data, flushed to the |
callback with a NUL termination once full. */ |
char buf[D_PRINT_BUFFER_LENGTH]; |
/* Current length of data in buffer. */ |
size_t len; |
/* The last character printed, saved individually so that it survives |
any buffer flush. */ |
char last_char; |
/* Callback function to handle demangled buffer flush. */ |
demangle_callbackref callback; |
/* Opaque callback argument. */ |
void *opaque; |
/* The current list of templates, if any. */ |
struct d_print_template *templates; |
/* The current list of modifiers (e.g., pointer, reference, etc.), |
if any. */ |
struct d_print_mod *modifiers; |
/* Set to 1 if we saw a demangling error. */ |
int demangle_failure; |
/* The current index into any template argument packs we are using |
for printing. */ |
int pack_index; |
/* Number of d_print_flush calls so far. */ |
unsigned long int flush_count; |
}; |
#ifdef CP_DEMANGLE_DEBUG |
static void d_dump (struct demangle_component *, int); |
#endif |
static struct demangle_component * |
d_make_empty (struct d_info *); |
static struct demangle_component * |
d_make_comp (struct d_info *, enum demangle_component_type, |
struct demangle_component *, |
struct demangle_component *); |
static struct demangle_component * |
d_make_name (struct d_info *, const char *, int); |
static struct demangle_component * |
d_make_demangle_mangled_name (struct d_info *, const char *); |
static struct demangle_component * |
d_make_builtin_type (struct d_info *, |
const struct demangle_builtin_type_info *); |
static struct demangle_component * |
d_make_operator (struct d_info *, |
const struct demangle_operator_info *); |
static struct demangle_component * |
d_make_extended_operator (struct d_info *, int, |
struct demangle_component *); |
static struct demangle_component * |
d_make_ctor (struct d_info *, enum gnu_v3_ctor_kinds, |
struct demangle_component *); |
static struct demangle_component * |
d_make_dtor (struct d_info *, enum gnu_v3_dtor_kinds, |
struct demangle_component *); |
static struct demangle_component * |
d_make_template_param (struct d_info *, long); |
static struct demangle_component * |
d_make_sub (struct d_info *, const char *, int); |
static int |
has_return_type (struct demangle_component *); |
static int |
is_ctor_dtor_or_conversion (struct demangle_component *); |
static struct demangle_component *d_encoding (struct d_info *, int); |
static struct demangle_component *d_name (struct d_info *); |
static struct demangle_component *d_nested_name (struct d_info *); |
static struct demangle_component *d_prefix (struct d_info *); |
static struct demangle_component *d_unqualified_name (struct d_info *); |
static struct demangle_component *d_source_name (struct d_info *); |
static long d_number (struct d_info *); |
static struct demangle_component *d_identifier (struct d_info *, int); |
static struct demangle_component *d_operator_name (struct d_info *); |
static struct demangle_component *d_special_name (struct d_info *); |
static int d_call_offset (struct d_info *, int); |
static struct demangle_component *d_ctor_dtor_name (struct d_info *); |
static struct demangle_component ** |
d_cv_qualifiers (struct d_info *, struct demangle_component **, int); |
static struct demangle_component * |
d_ref_qualifier (struct d_info *, struct demangle_component *); |
static struct demangle_component * |
d_function_type (struct d_info *); |
static struct demangle_component * |
d_bare_function_type (struct d_info *, int); |
static struct demangle_component * |
d_class_enum_type (struct d_info *); |
static struct demangle_component *d_array_type (struct d_info *); |
static struct demangle_component *d_vector_type (struct d_info *); |
static struct demangle_component * |
d_pointer_to_member_type (struct d_info *); |
static struct demangle_component * |
d_template_param (struct d_info *); |
static struct demangle_component *d_template_args (struct d_info *); |
static struct demangle_component * |
d_template_arg (struct d_info *); |
static struct demangle_component *d_expression (struct d_info *); |
static struct demangle_component *d_expr_primary (struct d_info *); |
static struct demangle_component *d_local_name (struct d_info *); |
static int d_discriminator (struct d_info *); |
static struct demangle_component *d_lambda (struct d_info *); |
static struct demangle_component *d_unnamed_type (struct d_info *); |
static struct demangle_component * |
d_clone_suffix (struct d_info *, struct demangle_component *); |
static int |
d_add_substitution (struct d_info *, struct demangle_component *); |
static struct demangle_component *d_substitution (struct d_info *, int); |
static void d_growable_string_init (struct d_growable_string *, size_t); |
static inline void |
d_growable_string_resize (struct d_growable_string *, size_t); |
static inline void |
d_growable_string_append_buffer (struct d_growable_string *, |
const char *, size_t); |
static void |
d_growable_string_callback_adapter (const char *, size_t, void *); |
static void |
d_print_init (struct d_print_info *, demangle_callbackref, void *); |
static inline void d_print_error (struct d_print_info *); |
static inline int d_print_saw_error (struct d_print_info *); |
static inline void d_print_flush (struct d_print_info *); |
static inline void d_append_char (struct d_print_info *, char); |
static inline void d_append_buffer (struct d_print_info *, |
const char *, size_t); |
static inline void d_append_string (struct d_print_info *, const char *); |
static inline char d_last_char (struct d_print_info *); |
static void |
d_print_comp (struct d_print_info *, int, const struct demangle_component *); |
static void |
d_print_java_identifier (struct d_print_info *, const char *, int); |
static void |
d_print_mod_list (struct d_print_info *, int, struct d_print_mod *, int); |
static void |
d_print_mod (struct d_print_info *, int, const struct demangle_component *); |
static void |
d_print_function_type (struct d_print_info *, int, |
const struct demangle_component *, |
struct d_print_mod *); |
static void |
d_print_array_type (struct d_print_info *, int, |
const struct demangle_component *, |
struct d_print_mod *); |
static void |
d_print_expr_op (struct d_print_info *, int, const struct demangle_component *); |
static void |
d_print_cast (struct d_print_info *, int, const struct demangle_component *); |
static int d_demangle_callback (const char *, int, |
demangle_callbackref, void *); |
static char *d_demangle (const char *, int, size_t *); |
#ifdef CP_DEMANGLE_DEBUG |
static void |
d_dump (struct demangle_component *dc, int indent) |
{ |
int i; |
if (dc == NULL) |
{ |
if (indent == 0) |
printf ("failed demangling\n"); |
return; |
} |
for (i = 0; i < indent; ++i) |
putchar (' '); |
switch (dc->type) |
{ |
case DEMANGLE_COMPONENT_NAME: |
printf ("name '%.*s'\n", dc->u.s_name.len, dc->u.s_name.s); |
return; |
case DEMANGLE_COMPONENT_TAGGED_NAME: |
printf ("tagged name\n"); |
d_dump (dc->u.s_binary.left, indent + 2); |
d_dump (dc->u.s_binary.right, indent + 2); |
return; |
case DEMANGLE_COMPONENT_TEMPLATE_PARAM: |
printf ("template parameter %ld\n", dc->u.s_number.number); |
return; |
case DEMANGLE_COMPONENT_CTOR: |
printf ("constructor %d\n", (int) dc->u.s_ctor.kind); |
d_dump (dc->u.s_ctor.name, indent + 2); |
return; |
case DEMANGLE_COMPONENT_DTOR: |
printf ("destructor %d\n", (int) dc->u.s_dtor.kind); |
d_dump (dc->u.s_dtor.name, indent + 2); |
return; |
case DEMANGLE_COMPONENT_SUB_STD: |
printf ("standard substitution %s\n", dc->u.s_string.string); |
return; |
case DEMANGLE_COMPONENT_BUILTIN_TYPE: |
printf ("builtin type %s\n", dc->u.s_builtin.type->name); |
return; |
case DEMANGLE_COMPONENT_OPERATOR: |
printf ("operator %s\n", dc->u.s_operator.op->name); |
return; |
case DEMANGLE_COMPONENT_EXTENDED_OPERATOR: |
printf ("extended operator with %d args\n", |
dc->u.s_extended_operator.args); |
d_dump (dc->u.s_extended_operator.name, indent + 2); |
return; |
case DEMANGLE_COMPONENT_QUAL_NAME: |
printf ("qualified name\n"); |
break; |
case DEMANGLE_COMPONENT_LOCAL_NAME: |
printf ("local name\n"); |
break; |
case DEMANGLE_COMPONENT_TYPED_NAME: |
printf ("typed name\n"); |
break; |
case DEMANGLE_COMPONENT_TEMPLATE: |
printf ("template\n"); |
break; |
case DEMANGLE_COMPONENT_VTABLE: |
printf ("vtable\n"); |
break; |
case DEMANGLE_COMPONENT_VTT: |
printf ("VTT\n"); |
break; |
case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE: |
printf ("construction vtable\n"); |
break; |
case DEMANGLE_COMPONENT_TYPEINFO: |
printf ("typeinfo\n"); |
break; |
case DEMANGLE_COMPONENT_TYPEINFO_NAME: |
printf ("typeinfo name\n"); |
break; |
case DEMANGLE_COMPONENT_TYPEINFO_FN: |
printf ("typeinfo function\n"); |
break; |
case DEMANGLE_COMPONENT_THUNK: |
printf ("thunk\n"); |
break; |
case DEMANGLE_COMPONENT_VIRTUAL_THUNK: |
printf ("virtual thunk\n"); |
break; |
case DEMANGLE_COMPONENT_COVARIANT_THUNK: |
printf ("covariant thunk\n"); |
break; |
case DEMANGLE_COMPONENT_JAVA_CLASS: |
printf ("java class\n"); |
break; |
case DEMANGLE_COMPONENT_GUARD: |
printf ("guard\n"); |
break; |
case DEMANGLE_COMPONENT_REFTEMP: |
printf ("reference temporary\n"); |
break; |
case DEMANGLE_COMPONENT_HIDDEN_ALIAS: |
printf ("hidden alias\n"); |
break; |
case DEMANGLE_COMPONENT_TRANSACTION_CLONE: |
printf ("transaction clone\n"); |
break; |
case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE: |
printf ("non-transaction clone\n"); |
break; |
case DEMANGLE_COMPONENT_RESTRICT: |
printf ("restrict\n"); |
break; |
case DEMANGLE_COMPONENT_VOLATILE: |
printf ("volatile\n"); |
break; |
case DEMANGLE_COMPONENT_CONST: |
printf ("const\n"); |
break; |
case DEMANGLE_COMPONENT_RESTRICT_THIS: |
printf ("restrict this\n"); |
break; |
case DEMANGLE_COMPONENT_VOLATILE_THIS: |
printf ("volatile this\n"); |
break; |
case DEMANGLE_COMPONENT_CONST_THIS: |
printf ("const this\n"); |
break; |
case DEMANGLE_COMPONENT_REFERENCE_THIS: |
printf ("reference this\n"); |
break; |
case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS: |
printf ("rvalue reference this\n"); |
break; |
case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL: |
printf ("vendor type qualifier\n"); |
break; |
case DEMANGLE_COMPONENT_POINTER: |
printf ("pointer\n"); |
break; |
case DEMANGLE_COMPONENT_REFERENCE: |
printf ("reference\n"); |
break; |
case DEMANGLE_COMPONENT_RVALUE_REFERENCE: |
printf ("rvalue reference\n"); |
break; |
case DEMANGLE_COMPONENT_COMPLEX: |
printf ("complex\n"); |
break; |
case DEMANGLE_COMPONENT_IMAGINARY: |
printf ("imaginary\n"); |
break; |
case DEMANGLE_COMPONENT_VENDOR_TYPE: |
printf ("vendor type\n"); |
break; |
case DEMANGLE_COMPONENT_FUNCTION_TYPE: |
printf ("function type\n"); |
break; |
case DEMANGLE_COMPONENT_ARRAY_TYPE: |
printf ("array type\n"); |
break; |
case DEMANGLE_COMPONENT_PTRMEM_TYPE: |
printf ("pointer to member type\n"); |
break; |
case DEMANGLE_COMPONENT_FIXED_TYPE: |
printf ("fixed-point type\n"); |
break; |
case DEMANGLE_COMPONENT_ARGLIST: |
printf ("argument list\n"); |
break; |
case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST: |
printf ("template argument list\n"); |
break; |
case DEMANGLE_COMPONENT_INITIALIZER_LIST: |
printf ("initializer list\n"); |
break; |
case DEMANGLE_COMPONENT_CAST: |
printf ("cast\n"); |
break; |
case DEMANGLE_COMPONENT_NULLARY: |
printf ("nullary operator\n"); |
break; |
case DEMANGLE_COMPONENT_UNARY: |
printf ("unary operator\n"); |
break; |
case DEMANGLE_COMPONENT_BINARY: |
printf ("binary operator\n"); |
break; |
case DEMANGLE_COMPONENT_BINARY_ARGS: |
printf ("binary operator arguments\n"); |
break; |
case DEMANGLE_COMPONENT_TRINARY: |
printf ("trinary operator\n"); |
break; |
case DEMANGLE_COMPONENT_TRINARY_ARG1: |
printf ("trinary operator arguments 1\n"); |
break; |
case DEMANGLE_COMPONENT_TRINARY_ARG2: |
printf ("trinary operator arguments 1\n"); |
break; |
case DEMANGLE_COMPONENT_LITERAL: |
printf ("literal\n"); |
break; |
case DEMANGLE_COMPONENT_LITERAL_NEG: |
printf ("negative literal\n"); |
break; |
case DEMANGLE_COMPONENT_JAVA_RESOURCE: |
printf ("java resource\n"); |
break; |
case DEMANGLE_COMPONENT_COMPOUND_NAME: |
printf ("compound name\n"); |
break; |
case DEMANGLE_COMPONENT_CHARACTER: |
printf ("character '%c'\n", dc->u.s_character.character); |
return; |
case DEMANGLE_COMPONENT_DECLTYPE: |
printf ("decltype\n"); |
break; |
case DEMANGLE_COMPONENT_PACK_EXPANSION: |
printf ("pack expansion\n"); |
break; |
case DEMANGLE_COMPONENT_TLS_INIT: |
printf ("tls init function\n"); |
break; |
case DEMANGLE_COMPONENT_TLS_WRAPPER: |
printf ("tls wrapper function\n"); |
break; |
case DEMANGLE_COMPONENT_DEFAULT_ARG: |
printf ("default argument %d\n", dc->u.s_unary_num.num); |
d_dump (dc->u.s_unary_num.sub, indent+2); |
return; |
case DEMANGLE_COMPONENT_LAMBDA: |
printf ("lambda %d\n", dc->u.s_unary_num.num); |
d_dump (dc->u.s_unary_num.sub, indent+2); |
return; |
} |
d_dump (d_left (dc), indent + 2); |
d_dump (d_right (dc), indent + 2); |
} |
#endif /* CP_DEMANGLE_DEBUG */ |
/* Fill in a DEMANGLE_COMPONENT_NAME. */ |
CP_STATIC_IF_GLIBCPP_V3 |
int |
cplus_demangle_fill_name (struct demangle_component *p, const char *s, int len) |
{ |
if (p == NULL || s == NULL || len == 0) |
return 0; |
p->type = DEMANGLE_COMPONENT_NAME; |
p->u.s_name.s = s; |
p->u.s_name.len = len; |
return 1; |
} |
/* Fill in a DEMANGLE_COMPONENT_EXTENDED_OPERATOR. */ |
CP_STATIC_IF_GLIBCPP_V3 |
int |
cplus_demangle_fill_extended_operator (struct demangle_component *p, int args, |
struct demangle_component *name) |
{ |
if (p == NULL || args < 0 || name == NULL) |
return 0; |
p->type = DEMANGLE_COMPONENT_EXTENDED_OPERATOR; |
p->u.s_extended_operator.args = args; |
p->u.s_extended_operator.name = name; |
return 1; |
} |
/* Fill in a DEMANGLE_COMPONENT_CTOR. */ |
CP_STATIC_IF_GLIBCPP_V3 |
int |
cplus_demangle_fill_ctor (struct demangle_component *p, |
enum gnu_v3_ctor_kinds kind, |
struct demangle_component *name) |
{ |
if (p == NULL |
|| name == NULL |
|| (int) kind < gnu_v3_complete_object_ctor |
|| (int) kind > gnu_v3_object_ctor_group) |
return 0; |
p->type = DEMANGLE_COMPONENT_CTOR; |
p->u.s_ctor.kind = kind; |
p->u.s_ctor.name = name; |
return 1; |
} |
/* Fill in a DEMANGLE_COMPONENT_DTOR. */ |
CP_STATIC_IF_GLIBCPP_V3 |
int |
cplus_demangle_fill_dtor (struct demangle_component *p, |
enum gnu_v3_dtor_kinds kind, |
struct demangle_component *name) |
{ |
if (p == NULL |
|| name == NULL |
|| (int) kind < gnu_v3_deleting_dtor |
|| (int) kind > gnu_v3_object_dtor_group) |
return 0; |
p->type = DEMANGLE_COMPONENT_DTOR; |
p->u.s_dtor.kind = kind; |
p->u.s_dtor.name = name; |
return 1; |
} |
/* Add a new component. */ |
static struct demangle_component * |
d_make_empty (struct d_info *di) |
{ |
struct demangle_component *p; |
if (di->next_comp >= di->num_comps) |
return NULL; |
p = &di->comps[di->next_comp]; |
++di->next_comp; |
return p; |
} |
/* Add a new generic component. */ |
static struct demangle_component * |
d_make_comp (struct d_info *di, enum demangle_component_type type, |
struct demangle_component *left, |
struct demangle_component *right) |
{ |
struct demangle_component *p; |
/* We check for errors here. A typical error would be a NULL return |
from a subroutine. We catch those here, and return NULL |
upward. */ |
switch (type) |
{ |
/* These types require two parameters. */ |
case DEMANGLE_COMPONENT_QUAL_NAME: |
case DEMANGLE_COMPONENT_LOCAL_NAME: |
case DEMANGLE_COMPONENT_TYPED_NAME: |
case DEMANGLE_COMPONENT_TAGGED_NAME: |
case DEMANGLE_COMPONENT_TEMPLATE: |
case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE: |
case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL: |
case DEMANGLE_COMPONENT_PTRMEM_TYPE: |
case DEMANGLE_COMPONENT_UNARY: |
case DEMANGLE_COMPONENT_BINARY: |
case DEMANGLE_COMPONENT_BINARY_ARGS: |
case DEMANGLE_COMPONENT_TRINARY: |
case DEMANGLE_COMPONENT_TRINARY_ARG1: |
case DEMANGLE_COMPONENT_LITERAL: |
case DEMANGLE_COMPONENT_LITERAL_NEG: |
case DEMANGLE_COMPONENT_COMPOUND_NAME: |
case DEMANGLE_COMPONENT_VECTOR_TYPE: |
case DEMANGLE_COMPONENT_CLONE: |
if (left == NULL || right == NULL) |
return NULL; |
break; |
/* These types only require one parameter. */ |
case DEMANGLE_COMPONENT_VTABLE: |
case DEMANGLE_COMPONENT_VTT: |
case DEMANGLE_COMPONENT_TYPEINFO: |
case DEMANGLE_COMPONENT_TYPEINFO_NAME: |
case DEMANGLE_COMPONENT_TYPEINFO_FN: |
case DEMANGLE_COMPONENT_THUNK: |
case DEMANGLE_COMPONENT_VIRTUAL_THUNK: |
case DEMANGLE_COMPONENT_COVARIANT_THUNK: |
case DEMANGLE_COMPONENT_JAVA_CLASS: |
case DEMANGLE_COMPONENT_GUARD: |
case DEMANGLE_COMPONENT_TLS_INIT: |
case DEMANGLE_COMPONENT_TLS_WRAPPER: |
case DEMANGLE_COMPONENT_REFTEMP: |
case DEMANGLE_COMPONENT_HIDDEN_ALIAS: |
case DEMANGLE_COMPONENT_TRANSACTION_CLONE: |
case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE: |
case DEMANGLE_COMPONENT_POINTER: |
case DEMANGLE_COMPONENT_REFERENCE: |
case DEMANGLE_COMPONENT_RVALUE_REFERENCE: |
case DEMANGLE_COMPONENT_COMPLEX: |
case DEMANGLE_COMPONENT_IMAGINARY: |
case DEMANGLE_COMPONENT_VENDOR_TYPE: |
case DEMANGLE_COMPONENT_CAST: |
case DEMANGLE_COMPONENT_JAVA_RESOURCE: |
case DEMANGLE_COMPONENT_DECLTYPE: |
case DEMANGLE_COMPONENT_PACK_EXPANSION: |
case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS: |
case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS: |
case DEMANGLE_COMPONENT_NULLARY: |
case DEMANGLE_COMPONENT_TRINARY_ARG2: |
if (left == NULL) |
return NULL; |
break; |
/* This needs a right parameter, but the left parameter can be |
empty. */ |
case DEMANGLE_COMPONENT_ARRAY_TYPE: |
case DEMANGLE_COMPONENT_INITIALIZER_LIST: |
if (right == NULL) |
return NULL; |
break; |
/* These are allowed to have no parameters--in some cases they |
will be filled in later. */ |
case DEMANGLE_COMPONENT_FUNCTION_TYPE: |
case DEMANGLE_COMPONENT_RESTRICT: |
case DEMANGLE_COMPONENT_VOLATILE: |
case DEMANGLE_COMPONENT_CONST: |
case DEMANGLE_COMPONENT_RESTRICT_THIS: |
case DEMANGLE_COMPONENT_VOLATILE_THIS: |
case DEMANGLE_COMPONENT_CONST_THIS: |
case DEMANGLE_COMPONENT_REFERENCE_THIS: |
case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS: |
case DEMANGLE_COMPONENT_ARGLIST: |
case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST: |
break; |
/* Other types should not be seen here. */ |
default: |
return NULL; |
} |
p = d_make_empty (di); |
if (p != NULL) |
{ |
p->type = type; |
p->u.s_binary.left = left; |
p->u.s_binary.right = right; |
} |
return p; |
} |
/* Add a new demangle mangled name component. */ |
static struct demangle_component * |
d_make_demangle_mangled_name (struct d_info *di, const char *s) |
{ |
if (d_peek_char (di) != '_' || d_peek_next_char (di) != 'Z') |
return d_make_name (di, s, strlen (s)); |
d_advance (di, 2); |
return d_encoding (di, 0); |
} |
/* Add a new name component. */ |
static struct demangle_component * |
d_make_name (struct d_info *di, const char *s, int len) |
{ |
struct demangle_component *p; |
p = d_make_empty (di); |
if (! cplus_demangle_fill_name (p, s, len)) |
return NULL; |
return p; |
} |
/* Add a new builtin type component. */ |
static struct demangle_component * |
d_make_builtin_type (struct d_info *di, |
const struct demangle_builtin_type_info *type) |
{ |
struct demangle_component *p; |
if (type == NULL) |
return NULL; |
p = d_make_empty (di); |
if (p != NULL) |
{ |
p->type = DEMANGLE_COMPONENT_BUILTIN_TYPE; |
p->u.s_builtin.type = type; |
} |
return p; |
} |
/* Add a new operator component. */ |
static struct demangle_component * |
d_make_operator (struct d_info *di, const struct demangle_operator_info *op) |
{ |
struct demangle_component *p; |
p = d_make_empty (di); |
if (p != NULL) |
{ |
p->type = DEMANGLE_COMPONENT_OPERATOR; |
p->u.s_operator.op = op; |
} |
return p; |
} |
/* Add a new extended operator component. */ |
static struct demangle_component * |
d_make_extended_operator (struct d_info *di, int args, |
struct demangle_component *name) |
{ |
struct demangle_component *p; |
p = d_make_empty (di); |
if (! cplus_demangle_fill_extended_operator (p, args, name)) |
return NULL; |
return p; |
} |
static struct demangle_component * |
d_make_default_arg (struct d_info *di, int num, |
struct demangle_component *sub) |
{ |
struct demangle_component *p = d_make_empty (di); |
if (p) |
{ |
p->type = DEMANGLE_COMPONENT_DEFAULT_ARG; |
p->u.s_unary_num.num = num; |
p->u.s_unary_num.sub = sub; |
} |
return p; |
} |
/* Add a new constructor component. */ |
static struct demangle_component * |
d_make_ctor (struct d_info *di, enum gnu_v3_ctor_kinds kind, |
struct demangle_component *name) |
{ |
struct demangle_component *p; |
p = d_make_empty (di); |
if (! cplus_demangle_fill_ctor (p, kind, name)) |
return NULL; |
return p; |
} |
/* Add a new destructor component. */ |
static struct demangle_component * |
d_make_dtor (struct d_info *di, enum gnu_v3_dtor_kinds kind, |
struct demangle_component *name) |
{ |
struct demangle_component *p; |
p = d_make_empty (di); |
if (! cplus_demangle_fill_dtor (p, kind, name)) |
return NULL; |
return p; |
} |
/* Add a new template parameter. */ |
static struct demangle_component * |
d_make_template_param (struct d_info *di, long i) |
{ |
struct demangle_component *p; |
p = d_make_empty (di); |
if (p != NULL) |
{ |
p->type = DEMANGLE_COMPONENT_TEMPLATE_PARAM; |
p->u.s_number.number = i; |
} |
return p; |
} |
/* Add a new function parameter. */ |
static struct demangle_component * |
d_make_function_param (struct d_info *di, long i) |
{ |
struct demangle_component *p; |
p = d_make_empty (di); |
if (p != NULL) |
{ |
p->type = DEMANGLE_COMPONENT_FUNCTION_PARAM; |
p->u.s_number.number = i; |
} |
return p; |
} |
/* Add a new standard substitution component. */ |
static struct demangle_component * |
d_make_sub (struct d_info *di, const char *name, int len) |
{ |
struct demangle_component *p; |
p = d_make_empty (di); |
if (p != NULL) |
{ |
p->type = DEMANGLE_COMPONENT_SUB_STD; |
p->u.s_string.string = name; |
p->u.s_string.len = len; |
} |
return p; |
} |
/* <mangled-name> ::= _Z <encoding> [<clone-suffix>]* |
TOP_LEVEL is non-zero when called at the top level. */ |
CP_STATIC_IF_GLIBCPP_V3 |
struct demangle_component * |
cplus_demangle_mangled_name (struct d_info *di, int top_level) |
{ |
struct demangle_component *p; |
if (! d_check_char (di, '_') |
/* Allow missing _ if not at toplevel to work around a |
bug in G++ abi-version=2 mangling; see the comment in |
write_template_arg. */ |
&& top_level) |
return NULL; |
if (! d_check_char (di, 'Z')) |
return NULL; |
p = d_encoding (di, top_level); |
/* If at top level and parsing parameters, check for a clone |
suffix. */ |
if (top_level && (di->options & DMGL_PARAMS) != 0) |
while (d_peek_char (di) == '.' |
&& (IS_LOWER (d_peek_next_char (di)) |
|| d_peek_next_char (di) == '_' |
|| IS_DIGIT (d_peek_next_char (di)))) |
p = d_clone_suffix (di, p); |
return p; |
} |
/* Return whether a function should have a return type. The argument |
is the function name, which may be qualified in various ways. The |
rules are that template functions have return types with some |
exceptions, function types which are not part of a function name |
mangling have return types with some exceptions, and non-template |
function names do not have return types. The exceptions are that |
constructors, destructors, and conversion operators do not have |
return types. */ |
static int |
has_return_type (struct demangle_component *dc) |
{ |
if (dc == NULL) |
return 0; |
switch (dc->type) |
{ |
default: |
return 0; |
case DEMANGLE_COMPONENT_TEMPLATE: |
return ! is_ctor_dtor_or_conversion (d_left (dc)); |
case DEMANGLE_COMPONENT_RESTRICT_THIS: |
case DEMANGLE_COMPONENT_VOLATILE_THIS: |
case DEMANGLE_COMPONENT_CONST_THIS: |
case DEMANGLE_COMPONENT_REFERENCE_THIS: |
case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS: |
return has_return_type (d_left (dc)); |
} |
} |
/* Return whether a name is a constructor, a destructor, or a |
conversion operator. */ |
static int |
is_ctor_dtor_or_conversion (struct demangle_component *dc) |
{ |
if (dc == NULL) |
return 0; |
switch (dc->type) |
{ |
default: |
return 0; |
case DEMANGLE_COMPONENT_QUAL_NAME: |
case DEMANGLE_COMPONENT_LOCAL_NAME: |
return is_ctor_dtor_or_conversion (d_right (dc)); |
case DEMANGLE_COMPONENT_CTOR: |
case DEMANGLE_COMPONENT_DTOR: |
case DEMANGLE_COMPONENT_CAST: |
return 1; |
} |
} |
/* <encoding> ::= <(function) name> <bare-function-type> |
::= <(data) name> |
::= <special-name> |
TOP_LEVEL is non-zero when called at the top level, in which case |
if DMGL_PARAMS is not set we do not demangle the function |
parameters. We only set this at the top level, because otherwise |
we would not correctly demangle names in local scopes. */ |
static struct demangle_component * |
d_encoding (struct d_info *di, int top_level) |
{ |
char peek = d_peek_char (di); |
if (peek == 'G' || peek == 'T') |
return d_special_name (di); |
else |
{ |
struct demangle_component *dc; |
dc = d_name (di); |
if (dc != NULL && top_level && (di->options & DMGL_PARAMS) == 0) |
{ |
/* Strip off any initial CV-qualifiers, as they really apply |
to the `this' parameter, and they were not output by the |
v2 demangler without DMGL_PARAMS. */ |
while (dc->type == DEMANGLE_COMPONENT_RESTRICT_THIS |
|| dc->type == DEMANGLE_COMPONENT_VOLATILE_THIS |
|| dc->type == DEMANGLE_COMPONENT_CONST_THIS |
|| dc->type == DEMANGLE_COMPONENT_REFERENCE_THIS |
|| dc->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS) |
dc = d_left (dc); |
/* If the top level is a DEMANGLE_COMPONENT_LOCAL_NAME, then |
there may be CV-qualifiers on its right argument which |
really apply here; this happens when parsing a class |
which is local to a function. */ |
if (dc->type == DEMANGLE_COMPONENT_LOCAL_NAME) |
{ |
struct demangle_component *dcr; |
dcr = d_right (dc); |
while (dcr->type == DEMANGLE_COMPONENT_RESTRICT_THIS |
|| dcr->type == DEMANGLE_COMPONENT_VOLATILE_THIS |
|| dcr->type == DEMANGLE_COMPONENT_CONST_THIS |
|| dcr->type == DEMANGLE_COMPONENT_REFERENCE_THIS |
|| dcr->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS) |
dcr = d_left (dcr); |
dc->u.s_binary.right = dcr; |
} |
return dc; |
} |
peek = d_peek_char (di); |
if (dc == NULL || peek == '\0' || peek == 'E') |
return dc; |
return d_make_comp (di, DEMANGLE_COMPONENT_TYPED_NAME, dc, |
d_bare_function_type (di, has_return_type (dc))); |
} |
} |
/* <tagged-name> ::= <name> B <source-name> */ |
static struct demangle_component * |
d_abi_tags (struct d_info *di, struct demangle_component *dc) |
{ |
char peek; |
while (peek = d_peek_char (di), |
peek == 'B') |
{ |
struct demangle_component *tag; |
d_advance (di, 1); |
tag = d_source_name (di); |
dc = d_make_comp (di, DEMANGLE_COMPONENT_TAGGED_NAME, dc, tag); |
} |
return dc; |
} |
/* <name> ::= <nested-name> |
::= <unscoped-name> |
::= <unscoped-template-name> <template-args> |
::= <local-name> |
<unscoped-name> ::= <unqualified-name> |
::= St <unqualified-name> |
<unscoped-template-name> ::= <unscoped-name> |
::= <substitution> |
*/ |
static struct demangle_component * |
d_name (struct d_info *di) |
{ |
char peek = d_peek_char (di); |
struct demangle_component *dc; |
switch (peek) |
{ |
case 'N': |
return d_nested_name (di); |
case 'Z': |
return d_local_name (di); |
case 'L': |
case 'U': |
return d_unqualified_name (di); |
case 'S': |
{ |
int subst; |
if (d_peek_next_char (di) != 't') |
{ |
dc = d_substitution (di, 0); |
subst = 1; |
} |
else |
{ |
d_advance (di, 2); |
dc = d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, |
d_make_name (di, "std", 3), |
d_unqualified_name (di)); |
di->expansion += 3; |
subst = 0; |
} |
if (d_peek_char (di) != 'I') |
{ |
/* The grammar does not permit this case to occur if we |
called d_substitution() above (i.e., subst == 1). We |
don't bother to check. */ |
} |
else |
{ |
/* This is <template-args>, which means that we just saw |
<unscoped-template-name>, which is a substitution |
candidate if we didn't just get it from a |
substitution. */ |
if (! subst) |
{ |
if (! d_add_substitution (di, dc)) |
return NULL; |
} |
dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc, |
d_template_args (di)); |
} |
return dc; |
} |
default: |
dc = d_unqualified_name (di); |
if (d_peek_char (di) == 'I') |
{ |
/* This is <template-args>, which means that we just saw |
<unscoped-template-name>, which is a substitution |
candidate. */ |
if (! d_add_substitution (di, dc)) |
return NULL; |
dc = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, dc, |
d_template_args (di)); |
} |
return dc; |
} |
} |
/* <nested-name> ::= N [<CV-qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E |
::= N [<CV-qualifiers>] [<ref-qualifier>] <template-prefix> <template-args> E |
*/ |
static struct demangle_component * |
d_nested_name (struct d_info *di) |
{ |
struct demangle_component *ret; |
struct demangle_component **pret; |
struct demangle_component *rqual; |
if (! d_check_char (di, 'N')) |
return NULL; |
pret = d_cv_qualifiers (di, &ret, 1); |
if (pret == NULL) |
return NULL; |
/* Parse the ref-qualifier now and then attach it |
once we have something to attach it to. */ |
rqual = d_ref_qualifier (di, NULL); |
*pret = d_prefix (di); |
if (*pret == NULL) |
return NULL; |
if (rqual) |
{ |
d_left (rqual) = ret; |
ret = rqual; |
} |
if (! d_check_char (di, 'E')) |
return NULL; |
return ret; |
} |
/* <prefix> ::= <prefix> <unqualified-name> |
::= <template-prefix> <template-args> |
::= <template-param> |
::= <decltype> |
::= |
::= <substitution> |
<template-prefix> ::= <prefix> <(template) unqualified-name> |
::= <template-param> |
::= <substitution> |
*/ |
static struct demangle_component * |
d_prefix (struct d_info *di) |
{ |
struct demangle_component *ret = NULL; |
while (1) |
{ |
char peek; |
enum demangle_component_type comb_type; |
struct demangle_component *dc; |
peek = d_peek_char (di); |
if (peek == '\0') |
return NULL; |
/* The older code accepts a <local-name> here, but I don't see |
that in the grammar. The older code does not accept a |
<template-param> here. */ |
comb_type = DEMANGLE_COMPONENT_QUAL_NAME; |
if (peek == 'D') |
{ |
char peek2 = d_peek_next_char (di); |
if (peek2 == 'T' || peek2 == 't') |
/* Decltype. */ |
dc = cplus_demangle_type (di); |
else |
/* Destructor name. */ |
dc = d_unqualified_name (di); |
} |
else if (IS_DIGIT (peek) |
|| IS_LOWER (peek) |
|| peek == 'C' |
|| peek == 'U' |
|| peek == 'L') |
dc = d_unqualified_name (di); |
else if (peek == 'S') |
dc = d_substitution (di, 1); |
else if (peek == 'I') |
{ |
if (ret == NULL) |
return NULL; |
comb_type = DEMANGLE_COMPONENT_TEMPLATE; |
dc = d_template_args (di); |
} |
else if (peek == 'T') |
dc = d_template_param (di); |
else if (peek == 'E') |
return ret; |
else if (peek == 'M') |
{ |
/* Initializer scope for a lambda. We don't need to represent |
this; the normal code will just treat the variable as a type |
scope, which gives appropriate output. */ |
if (ret == NULL) |
return NULL; |
d_advance (di, 1); |
continue; |
} |
else |
return NULL; |
if (ret == NULL) |
ret = dc; |
else |
ret = d_make_comp (di, comb_type, ret, dc); |
if (peek != 'S' && d_peek_char (di) != 'E') |
{ |
if (! d_add_substitution (di, ret)) |
return NULL; |
} |
} |
} |
/* <unqualified-name> ::= <operator-name> |
::= <ctor-dtor-name> |
::= <source-name> |
::= <local-source-name> |
<local-source-name> ::= L <source-name> <discriminator> |
*/ |
static struct demangle_component * |
d_unqualified_name (struct d_info *di) |
{ |
struct demangle_component *ret; |
char peek; |
peek = d_peek_char (di); |
if (IS_DIGIT (peek)) |
ret = d_source_name (di); |
else if (IS_LOWER (peek)) |
{ |
ret = d_operator_name (di); |
if (ret != NULL && ret->type == DEMANGLE_COMPONENT_OPERATOR) |
{ |
di->expansion += sizeof "operator" + ret->u.s_operator.op->len - 2; |
if (!strcmp (ret->u.s_operator.op->code, "li")) |
ret = d_make_comp (di, DEMANGLE_COMPONENT_UNARY, ret, |
d_source_name (di)); |
} |
} |
else if (peek == 'C' || peek == 'D') |
ret = d_ctor_dtor_name (di); |
else if (peek == 'L') |
{ |
d_advance (di, 1); |
ret = d_source_name (di); |
if (ret == NULL) |
return NULL; |
if (! d_discriminator (di)) |
return NULL; |
} |
else if (peek == 'U') |
{ |
switch (d_peek_next_char (di)) |
{ |
case 'l': |
ret = d_lambda (di); |
break; |
case 't': |
ret = d_unnamed_type (di); |
break; |
default: |
return NULL; |
} |
} |
else |
return NULL; |
if (d_peek_char (di) == 'B') |
ret = d_abi_tags (di, ret); |
return ret; |
} |
/* <source-name> ::= <(positive length) number> <identifier> */ |
static struct demangle_component * |
d_source_name (struct d_info *di) |
{ |
long len; |
struct demangle_component *ret; |
len = d_number (di); |
if (len <= 0) |
return NULL; |
ret = d_identifier (di, len); |
di->last_name = ret; |
return ret; |
} |
/* number ::= [n] <(non-negative decimal integer)> */ |
static long |
d_number (struct d_info *di) |
{ |
int negative; |
char peek; |
long ret; |
negative = 0; |
peek = d_peek_char (di); |
if (peek == 'n') |
{ |
negative = 1; |
d_advance (di, 1); |
peek = d_peek_char (di); |
} |
ret = 0; |
while (1) |
{ |
if (! IS_DIGIT (peek)) |
{ |
if (negative) |
ret = - ret; |
return ret; |
} |
ret = ret * 10 + peek - '0'; |
d_advance (di, 1); |
peek = d_peek_char (di); |
} |
} |
/* Like d_number, but returns a demangle_component. */ |
static struct demangle_component * |
d_number_component (struct d_info *di) |
{ |
struct demangle_component *ret = d_make_empty (di); |
if (ret) |
{ |
ret->type = DEMANGLE_COMPONENT_NUMBER; |
ret->u.s_number.number = d_number (di); |
} |
return ret; |
} |
/* identifier ::= <(unqualified source code identifier)> */ |
static struct demangle_component * |
d_identifier (struct d_info *di, int len) |
{ |
const char *name; |
name = d_str (di); |
if (di->send - name < len) |
return NULL; |
d_advance (di, len); |
/* A Java mangled name may have a trailing '$' if it is a C++ |
keyword. This '$' is not included in the length count. We just |
ignore the '$'. */ |
if ((di->options & DMGL_JAVA) != 0 |
&& d_peek_char (di) == '$') |
d_advance (di, 1); |
/* Look for something which looks like a gcc encoding of an |
anonymous namespace, and replace it with a more user friendly |
name. */ |
if (len >= (int) ANONYMOUS_NAMESPACE_PREFIX_LEN + 2 |
&& memcmp (name, ANONYMOUS_NAMESPACE_PREFIX, |
ANONYMOUS_NAMESPACE_PREFIX_LEN) == 0) |
{ |
const char *s; |
s = name + ANONYMOUS_NAMESPACE_PREFIX_LEN; |
if ((*s == '.' || *s == '_' || *s == '$') |
&& s[1] == 'N') |
{ |
di->expansion -= len - sizeof "(anonymous namespace)"; |
return d_make_name (di, "(anonymous namespace)", |
sizeof "(anonymous namespace)" - 1); |
} |
} |
return d_make_name (di, name, len); |
} |
/* operator_name ::= many different two character encodings. |
::= cv <type> |
::= v <digit> <source-name> |
This list is sorted for binary search. */ |
#define NL(s) s, (sizeof s) - 1 |
CP_STATIC_IF_GLIBCPP_V3 |
const struct demangle_operator_info cplus_demangle_operators[] = |
{ |
{ "aN", NL ("&="), 2 }, |
{ "aS", NL ("="), 2 }, |
{ "aa", NL ("&&"), 2 }, |
{ "ad", NL ("&"), 1 }, |
{ "an", NL ("&"), 2 }, |
{ "at", NL ("alignof "), 1 }, |
{ "az", NL ("alignof "), 1 }, |
{ "cc", NL ("const_cast"), 2 }, |
{ "cl", NL ("()"), 2 }, |
{ "cm", NL (","), 2 }, |
{ "co", NL ("~"), 1 }, |
{ "dV", NL ("/="), 2 }, |
{ "da", NL ("delete[] "), 1 }, |
{ "dc", NL ("dynamic_cast"), 2 }, |
{ "de", NL ("*"), 1 }, |
{ "dl", NL ("delete "), 1 }, |
{ "ds", NL (".*"), 2 }, |
{ "dt", NL ("."), 2 }, |
{ "dv", NL ("/"), 2 }, |
{ "eO", NL ("^="), 2 }, |
{ "eo", NL ("^"), 2 }, |
{ "eq", NL ("=="), 2 }, |
{ "ge", NL (">="), 2 }, |
{ "gs", NL ("::"), 1 }, |
{ "gt", NL (">"), 2 }, |
{ "ix", NL ("[]"), 2 }, |
{ "lS", NL ("<<="), 2 }, |
{ "le", NL ("<="), 2 }, |
{ "li", NL ("operator\"\" "), 1 }, |
{ "ls", NL ("<<"), 2 }, |
{ "lt", NL ("<"), 2 }, |
{ "mI", NL ("-="), 2 }, |
{ "mL", NL ("*="), 2 }, |
{ "mi", NL ("-"), 2 }, |
{ "ml", NL ("*"), 2 }, |
{ "mm", NL ("--"), 1 }, |
{ "na", NL ("new[]"), 3 }, |
{ "ne", NL ("!="), 2 }, |
{ "ng", NL ("-"), 1 }, |
{ "nt", NL ("!"), 1 }, |
{ "nw", NL ("new"), 3 }, |
{ "oR", NL ("|="), 2 }, |
{ "oo", NL ("||"), 2 }, |
{ "or", NL ("|"), 2 }, |
{ "pL", NL ("+="), 2 }, |
{ "pl", NL ("+"), 2 }, |
{ "pm", NL ("->*"), 2 }, |
{ "pp", NL ("++"), 1 }, |
{ "ps", NL ("+"), 1 }, |
{ "pt", NL ("->"), 2 }, |
{ "qu", NL ("?"), 3 }, |
{ "rM", NL ("%="), 2 }, |
{ "rS", NL (">>="), 2 }, |
{ "rc", NL ("reinterpret_cast"), 2 }, |
{ "rm", NL ("%"), 2 }, |
{ "rs", NL (">>"), 2 }, |
{ "sc", NL ("static_cast"), 2 }, |
{ "st", NL ("sizeof "), 1 }, |
{ "sz", NL ("sizeof "), 1 }, |
{ "tr", NL ("throw"), 0 }, |
{ "tw", NL ("throw "), 1 }, |
{ NULL, NULL, 0, 0 } |
}; |
static struct demangle_component * |
d_operator_name (struct d_info *di) |
{ |
char c1; |
char c2; |
c1 = d_next_char (di); |
c2 = d_next_char (di); |
if (c1 == 'v' && IS_DIGIT (c2)) |
return d_make_extended_operator (di, c2 - '0', d_source_name (di)); |
else if (c1 == 'c' && c2 == 'v') |
return d_make_comp (di, DEMANGLE_COMPONENT_CAST, |
cplus_demangle_type (di), NULL); |
else |
{ |
/* LOW is the inclusive lower bound. */ |
int low = 0; |
/* HIGH is the exclusive upper bound. We subtract one to ignore |
the sentinel at the end of the array. */ |
int high = ((sizeof (cplus_demangle_operators) |
/ sizeof (cplus_demangle_operators[0])) |
- 1); |
while (1) |
{ |
int i; |
const struct demangle_operator_info *p; |
i = low + (high - low) / 2; |
p = cplus_demangle_operators + i; |
if (c1 == p->code[0] && c2 == p->code[1]) |
return d_make_operator (di, p); |
if (c1 < p->code[0] || (c1 == p->code[0] && c2 < p->code[1])) |
high = i; |
else |
low = i + 1; |
if (low == high) |
return NULL; |
} |
} |
} |
static struct demangle_component * |
d_make_character (struct d_info *di, int c) |
{ |
struct demangle_component *p; |
p = d_make_empty (di); |
if (p != NULL) |
{ |
p->type = DEMANGLE_COMPONENT_CHARACTER; |
p->u.s_character.character = c; |
} |
return p; |
} |
static struct demangle_component * |
d_java_resource (struct d_info *di) |
{ |
struct demangle_component *p = NULL; |
struct demangle_component *next = NULL; |
long len, i; |
char c; |
const char *str; |
len = d_number (di); |
if (len <= 1) |
return NULL; |
/* Eat the leading '_'. */ |
if (d_next_char (di) != '_') |
return NULL; |
len--; |
str = d_str (di); |
i = 0; |
while (len > 0) |
{ |
c = str[i]; |
if (!c) |
return NULL; |
/* Each chunk is either a '$' escape... */ |
if (c == '$') |
{ |
i++; |
switch (str[i++]) |
{ |
case 'S': |
c = '/'; |
break; |
case '_': |
c = '.'; |
break; |
case '$': |
c = '$'; |
break; |
default: |
return NULL; |
} |
next = d_make_character (di, c); |
d_advance (di, i); |
str = d_str (di); |
len -= i; |
i = 0; |
if (next == NULL) |
return NULL; |
} |
/* ... or a sequence of characters. */ |
else |
{ |
while (i < len && str[i] && str[i] != '$') |
i++; |
next = d_make_name (di, str, i); |
d_advance (di, i); |
str = d_str (di); |
len -= i; |
i = 0; |
if (next == NULL) |
return NULL; |
} |
if (p == NULL) |
p = next; |
else |
{ |
p = d_make_comp (di, DEMANGLE_COMPONENT_COMPOUND_NAME, p, next); |
if (p == NULL) |
return NULL; |
} |
} |
p = d_make_comp (di, DEMANGLE_COMPONENT_JAVA_RESOURCE, p, NULL); |
return p; |
} |
/* <special-name> ::= TV <type> |
::= TT <type> |
::= TI <type> |
::= TS <type> |
::= GV <(object) name> |
::= T <call-offset> <(base) encoding> |
::= Tc <call-offset> <call-offset> <(base) encoding> |
Also g++ extensions: |
::= TC <type> <(offset) number> _ <(base) type> |
::= TF <type> |
::= TJ <type> |
::= GR <name> |
::= GA <encoding> |
::= Gr <resource name> |
::= GTt <encoding> |
::= GTn <encoding> |
*/ |
static struct demangle_component * |
d_special_name (struct d_info *di) |
{ |
di->expansion += 20; |
if (d_check_char (di, 'T')) |
{ |
switch (d_next_char (di)) |
{ |
case 'V': |
di->expansion -= 5; |
return d_make_comp (di, DEMANGLE_COMPONENT_VTABLE, |
cplus_demangle_type (di), NULL); |
case 'T': |
di->expansion -= 10; |
return d_make_comp (di, DEMANGLE_COMPONENT_VTT, |
cplus_demangle_type (di), NULL); |
case 'I': |
return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO, |
cplus_demangle_type (di), NULL); |
case 'S': |
return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_NAME, |
cplus_demangle_type (di), NULL); |
case 'h': |
if (! d_call_offset (di, 'h')) |
return NULL; |
return d_make_comp (di, DEMANGLE_COMPONENT_THUNK, |
d_encoding (di, 0), NULL); |
case 'v': |
if (! d_call_offset (di, 'v')) |
return NULL; |
return d_make_comp (di, DEMANGLE_COMPONENT_VIRTUAL_THUNK, |
d_encoding (di, 0), NULL); |
case 'c': |
if (! d_call_offset (di, '\0')) |
return NULL; |
if (! d_call_offset (di, '\0')) |
return NULL; |
return d_make_comp (di, DEMANGLE_COMPONENT_COVARIANT_THUNK, |
d_encoding (di, 0), NULL); |
case 'C': |
{ |
struct demangle_component *derived_type; |
long offset; |
struct demangle_component *base_type; |
derived_type = cplus_demangle_type (di); |
offset = d_number (di); |
if (offset < 0) |
return NULL; |
if (! d_check_char (di, '_')) |
return NULL; |
base_type = cplus_demangle_type (di); |
/* We don't display the offset. FIXME: We should display |
it in verbose mode. */ |
di->expansion += 5; |
return d_make_comp (di, DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE, |
base_type, derived_type); |
} |
case 'F': |
return d_make_comp (di, DEMANGLE_COMPONENT_TYPEINFO_FN, |
cplus_demangle_type (di), NULL); |
case 'J': |
return d_make_comp (di, DEMANGLE_COMPONENT_JAVA_CLASS, |
cplus_demangle_type (di), NULL); |
case 'H': |
return d_make_comp (di, DEMANGLE_COMPONENT_TLS_INIT, |
d_name (di), NULL); |
case 'W': |
return d_make_comp (di, DEMANGLE_COMPONENT_TLS_WRAPPER, |
d_name (di), NULL); |
default: |
return NULL; |
} |
} |
else if (d_check_char (di, 'G')) |
{ |
switch (d_next_char (di)) |
{ |
case 'V': |
return d_make_comp (di, DEMANGLE_COMPONENT_GUARD, d_name (di), NULL); |
case 'R': |
{ |
struct demangle_component *name = d_name (di); |
return d_make_comp (di, DEMANGLE_COMPONENT_REFTEMP, name, |
d_number_component (di)); |
} |
case 'A': |
return d_make_comp (di, DEMANGLE_COMPONENT_HIDDEN_ALIAS, |
d_encoding (di, 0), NULL); |
case 'T': |
switch (d_next_char (di)) |
{ |
case 'n': |
return d_make_comp (di, DEMANGLE_COMPONENT_NONTRANSACTION_CLONE, |
d_encoding (di, 0), NULL); |
default: |
/* ??? The proposal is that other letters (such as 'h') stand |
for different variants of transaction cloning, such as |
compiling directly for hardware transaction support. But |
they still should all be transactional clones of some sort |
so go ahead and call them that. */ |
case 't': |
return d_make_comp (di, DEMANGLE_COMPONENT_TRANSACTION_CLONE, |
d_encoding (di, 0), NULL); |
} |
case 'r': |
return d_java_resource (di); |
default: |
return NULL; |
} |
} |
else |
return NULL; |
} |
/* <call-offset> ::= h <nv-offset> _ |
::= v <v-offset> _ |
<nv-offset> ::= <(offset) number> |
<v-offset> ::= <(offset) number> _ <(virtual offset) number> |
The C parameter, if not '\0', is a character we just read which is |
the start of the <call-offset>. |
We don't display the offset information anywhere. FIXME: We should |
display it in verbose mode. */ |
static int |
d_call_offset (struct d_info *di, int c) |
{ |
if (c == '\0') |
c = d_next_char (di); |
if (c == 'h') |
d_number (di); |
else if (c == 'v') |
{ |
d_number (di); |
if (! d_check_char (di, '_')) |
return 0; |
d_number (di); |
} |
else |
return 0; |
if (! d_check_char (di, '_')) |
return 0; |
return 1; |
} |
/* <ctor-dtor-name> ::= C1 |
::= C2 |
::= C3 |
::= D0 |
::= D1 |
::= D2 |
*/ |
static struct demangle_component * |
d_ctor_dtor_name (struct d_info *di) |
{ |
if (di->last_name != NULL) |
{ |
if (di->last_name->type == DEMANGLE_COMPONENT_NAME) |
di->expansion += di->last_name->u.s_name.len; |
else if (di->last_name->type == DEMANGLE_COMPONENT_SUB_STD) |
di->expansion += di->last_name->u.s_string.len; |
} |
switch (d_peek_char (di)) |
{ |
case 'C': |
{ |
enum gnu_v3_ctor_kinds kind; |
switch (d_peek_next_char (di)) |
{ |
case '1': |
kind = gnu_v3_complete_object_ctor; |
break; |
case '2': |
kind = gnu_v3_base_object_ctor; |
break; |
case '3': |
kind = gnu_v3_complete_object_allocating_ctor; |
break; |
case '5': |
kind = gnu_v3_object_ctor_group; |
break; |
default: |
return NULL; |
} |
d_advance (di, 2); |
return d_make_ctor (di, kind, di->last_name); |
} |
case 'D': |
{ |
enum gnu_v3_dtor_kinds kind; |
switch (d_peek_next_char (di)) |
{ |
case '0': |
kind = gnu_v3_deleting_dtor; |
break; |
case '1': |
kind = gnu_v3_complete_object_dtor; |
break; |
case '2': |
kind = gnu_v3_base_object_dtor; |
break; |
case '5': |
kind = gnu_v3_object_dtor_group; |
break; |
default: |
return NULL; |
} |
d_advance (di, 2); |
return d_make_dtor (di, kind, di->last_name); |
} |
default: |
return NULL; |
} |
} |
/* <type> ::= <builtin-type> |
::= <function-type> |
::= <class-enum-type> |
::= <array-type> |
::= <pointer-to-member-type> |
::= <template-param> |
::= <template-template-param> <template-args> |
::= <substitution> |
::= <CV-qualifiers> <type> |
::= P <type> |
::= R <type> |
::= O <type> (C++0x) |
::= C <type> |
::= G <type> |
::= U <source-name> <type> |
<builtin-type> ::= various one letter codes |
::= u <source-name> |
*/ |
CP_STATIC_IF_GLIBCPP_V3 |
const struct demangle_builtin_type_info |
cplus_demangle_builtin_types[D_BUILTIN_TYPE_COUNT] = |
{ |
/* a */ { NL ("signed char"), NL ("signed char"), D_PRINT_DEFAULT }, |
/* b */ { NL ("bool"), NL ("boolean"), D_PRINT_BOOL }, |
/* c */ { NL ("char"), NL ("byte"), D_PRINT_DEFAULT }, |
/* d */ { NL ("double"), NL ("double"), D_PRINT_FLOAT }, |
/* e */ { NL ("long double"), NL ("long double"), D_PRINT_FLOAT }, |
/* f */ { NL ("float"), NL ("float"), D_PRINT_FLOAT }, |
/* g */ { NL ("__float128"), NL ("__float128"), D_PRINT_FLOAT }, |
/* h */ { NL ("unsigned char"), NL ("unsigned char"), D_PRINT_DEFAULT }, |
/* i */ { NL ("int"), NL ("int"), D_PRINT_INT }, |
/* j */ { NL ("unsigned int"), NL ("unsigned"), D_PRINT_UNSIGNED }, |
/* k */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT }, |
/* l */ { NL ("long"), NL ("long"), D_PRINT_LONG }, |
/* m */ { NL ("unsigned long"), NL ("unsigned long"), D_PRINT_UNSIGNED_LONG }, |
/* n */ { NL ("__int128"), NL ("__int128"), D_PRINT_DEFAULT }, |
/* o */ { NL ("unsigned __int128"), NL ("unsigned __int128"), |
D_PRINT_DEFAULT }, |
/* p */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT }, |
/* q */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT }, |
/* r */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT }, |
/* s */ { NL ("short"), NL ("short"), D_PRINT_DEFAULT }, |
/* t */ { NL ("unsigned short"), NL ("unsigned short"), D_PRINT_DEFAULT }, |
/* u */ { NULL, 0, NULL, 0, D_PRINT_DEFAULT }, |
/* v */ { NL ("void"), NL ("void"), D_PRINT_VOID }, |
/* w */ { NL ("wchar_t"), NL ("char"), D_PRINT_DEFAULT }, |
/* x */ { NL ("long long"), NL ("long"), D_PRINT_LONG_LONG }, |
/* y */ { NL ("unsigned long long"), NL ("unsigned long long"), |
D_PRINT_UNSIGNED_LONG_LONG }, |
/* z */ { NL ("..."), NL ("..."), D_PRINT_DEFAULT }, |
/* 26 */ { NL ("decimal32"), NL ("decimal32"), D_PRINT_DEFAULT }, |
/* 27 */ { NL ("decimal64"), NL ("decimal64"), D_PRINT_DEFAULT }, |
/* 28 */ { NL ("decimal128"), NL ("decimal128"), D_PRINT_DEFAULT }, |
/* 29 */ { NL ("half"), NL ("half"), D_PRINT_FLOAT }, |
/* 30 */ { NL ("char16_t"), NL ("char16_t"), D_PRINT_DEFAULT }, |
/* 31 */ { NL ("char32_t"), NL ("char32_t"), D_PRINT_DEFAULT }, |
/* 32 */ { NL ("decltype(nullptr)"), NL ("decltype(nullptr)"), |
D_PRINT_DEFAULT }, |
}; |
CP_STATIC_IF_GLIBCPP_V3 |
struct demangle_component * |
cplus_demangle_type (struct d_info *di) |
{ |
char peek; |
struct demangle_component *ret; |
int can_subst; |
/* The ABI specifies that when CV-qualifiers are used, the base type |
is substitutable, and the fully qualified type is substitutable, |
but the base type with a strict subset of the CV-qualifiers is |
not substitutable. The natural recursive implementation of the |
CV-qualifiers would cause subsets to be substitutable, so instead |
we pull them all off now. |
FIXME: The ABI says that order-insensitive vendor qualifiers |
should be handled in the same way, but we have no way to tell |
which vendor qualifiers are order-insensitive and which are |
order-sensitive. So we just assume that they are all |
order-sensitive. g++ 3.4 supports only one vendor qualifier, |
__vector, and it treats it as order-sensitive when mangling |
names. */ |
peek = d_peek_char (di); |
if (peek == 'r' || peek == 'V' || peek == 'K') |
{ |
struct demangle_component **pret; |
pret = d_cv_qualifiers (di, &ret, 0); |
if (pret == NULL) |
return NULL; |
if (d_peek_char (di) == 'F') |
{ |
/* cv-qualifiers before a function type apply to 'this', |
so avoid adding the unqualified function type to |
the substitution list. */ |
*pret = d_function_type (di); |
} |
else |
*pret = cplus_demangle_type (di); |
if (!*pret) |
return NULL; |
if ((*pret)->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS |
|| (*pret)->type == DEMANGLE_COMPONENT_REFERENCE_THIS) |
{ |
/* Move the ref-qualifier outside the cv-qualifiers so that |
they are printed in the right order. */ |
struct demangle_component *fn = d_left (*pret); |
d_left (*pret) = ret; |
ret = *pret; |
*pret = fn; |
} |
if (! d_add_substitution (di, ret)) |
return NULL; |
return ret; |
} |
can_subst = 1; |
switch (peek) |
{ |
case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': |
case 'h': case 'i': case 'j': case 'l': case 'm': case 'n': |
case 'o': case 's': case 't': |
case 'v': case 'w': case 'x': case 'y': case 'z': |
ret = d_make_builtin_type (di, |
&cplus_demangle_builtin_types[peek - 'a']); |
di->expansion += ret->u.s_builtin.type->len; |
can_subst = 0; |
d_advance (di, 1); |
break; |
case 'u': |
d_advance (di, 1); |
ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE, |
d_source_name (di), NULL); |
break; |
case 'F': |
ret = d_function_type (di); |
break; |
case '0': case '1': case '2': case '3': case '4': |
case '5': case '6': case '7': case '8': case '9': |
case 'N': |
case 'Z': |
ret = d_class_enum_type (di); |
break; |
case 'A': |
ret = d_array_type (di); |
break; |
case 'M': |
ret = d_pointer_to_member_type (di); |
break; |
case 'T': |
ret = d_template_param (di); |
if (d_peek_char (di) == 'I') |
{ |
/* This is <template-template-param> <template-args>. The |
<template-template-param> part is a substitution |
candidate. */ |
if (! d_add_substitution (di, ret)) |
return NULL; |
ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret, |
d_template_args (di)); |
} |
break; |
case 'S': |
/* If this is a special substitution, then it is the start of |
<class-enum-type>. */ |
{ |
char peek_next; |
peek_next = d_peek_next_char (di); |
if (IS_DIGIT (peek_next) |
|| peek_next == '_' |
|| IS_UPPER (peek_next)) |
{ |
ret = d_substitution (di, 0); |
/* The substituted name may have been a template name and |
may be followed by tepmlate args. */ |
if (d_peek_char (di) == 'I') |
ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret, |
d_template_args (di)); |
else |
can_subst = 0; |
} |
else |
{ |
ret = d_class_enum_type (di); |
/* If the substitution was a complete type, then it is not |
a new substitution candidate. However, if the |
substitution was followed by template arguments, then |
the whole thing is a substitution candidate. */ |
if (ret != NULL && ret->type == DEMANGLE_COMPONENT_SUB_STD) |
can_subst = 0; |
} |
} |
break; |
case 'O': |
d_advance (di, 1); |
ret = d_make_comp (di, DEMANGLE_COMPONENT_RVALUE_REFERENCE, |
cplus_demangle_type (di), NULL); |
break; |
case 'P': |
d_advance (di, 1); |
ret = d_make_comp (di, DEMANGLE_COMPONENT_POINTER, |
cplus_demangle_type (di), NULL); |
break; |
case 'R': |
d_advance (di, 1); |
ret = d_make_comp (di, DEMANGLE_COMPONENT_REFERENCE, |
cplus_demangle_type (di), NULL); |
break; |
case 'C': |
d_advance (di, 1); |
ret = d_make_comp (di, DEMANGLE_COMPONENT_COMPLEX, |
cplus_demangle_type (di), NULL); |
break; |
case 'G': |
d_advance (di, 1); |
ret = d_make_comp (di, DEMANGLE_COMPONENT_IMAGINARY, |
cplus_demangle_type (di), NULL); |
break; |
case 'U': |
d_advance (di, 1); |
ret = d_source_name (di); |
ret = d_make_comp (di, DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL, |
cplus_demangle_type (di), ret); |
break; |
case 'D': |
can_subst = 0; |
d_advance (di, 1); |
peek = d_next_char (di); |
switch (peek) |
{ |
case 'T': |
case 't': |
/* decltype (expression) */ |
ret = d_make_comp (di, DEMANGLE_COMPONENT_DECLTYPE, |
d_expression (di), NULL); |
if (ret && d_next_char (di) != 'E') |
ret = NULL; |
can_subst = 1; |
break; |
case 'p': |
/* Pack expansion. */ |
ret = d_make_comp (di, DEMANGLE_COMPONENT_PACK_EXPANSION, |
cplus_demangle_type (di), NULL); |
can_subst = 1; |
break; |
case 'a': |
/* auto */ |
ret = d_make_name (di, "auto", 4); |
break; |
case 'f': |
/* 32-bit decimal floating point */ |
ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[26]); |
di->expansion += ret->u.s_builtin.type->len; |
break; |
case 'd': |
/* 64-bit DFP */ |
ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[27]); |
di->expansion += ret->u.s_builtin.type->len; |
break; |
case 'e': |
/* 128-bit DFP */ |
ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[28]); |
di->expansion += ret->u.s_builtin.type->len; |
break; |
case 'h': |
/* 16-bit half-precision FP */ |
ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[29]); |
di->expansion += ret->u.s_builtin.type->len; |
break; |
case 's': |
/* char16_t */ |
ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[30]); |
di->expansion += ret->u.s_builtin.type->len; |
break; |
case 'i': |
/* char32_t */ |
ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[31]); |
di->expansion += ret->u.s_builtin.type->len; |
break; |
case 'F': |
/* Fixed point types. DF<int bits><length><fract bits><sat> */ |
ret = d_make_empty (di); |
ret->type = DEMANGLE_COMPONENT_FIXED_TYPE; |
if ((ret->u.s_fixed.accum = IS_DIGIT (d_peek_char (di)))) |
/* For demangling we don't care about the bits. */ |
d_number (di); |
ret->u.s_fixed.length = cplus_demangle_type (di); |
if (ret->u.s_fixed.length == NULL) |
return NULL; |
d_number (di); |
peek = d_next_char (di); |
ret->u.s_fixed.sat = (peek == 's'); |
break; |
case 'v': |
ret = d_vector_type (di); |
can_subst = 1; |
break; |
case 'n': |
/* decltype(nullptr) */ |
ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[32]); |
di->expansion += ret->u.s_builtin.type->len; |
break; |
default: |
return NULL; |
} |
break; |
default: |
return NULL; |
} |
if (can_subst) |
{ |
if (! d_add_substitution (di, ret)) |
return NULL; |
} |
return ret; |
} |
/* <CV-qualifiers> ::= [r] [V] [K] */ |
static struct demangle_component ** |
d_cv_qualifiers (struct d_info *di, |
struct demangle_component **pret, int member_fn) |
{ |
struct demangle_component **pstart; |
char peek; |
pstart = pret; |
peek = d_peek_char (di); |
while (peek == 'r' || peek == 'V' || peek == 'K') |
{ |
enum demangle_component_type t; |
d_advance (di, 1); |
if (peek == 'r') |
{ |
t = (member_fn |
? DEMANGLE_COMPONENT_RESTRICT_THIS |
: DEMANGLE_COMPONENT_RESTRICT); |
di->expansion += sizeof "restrict"; |
} |
else if (peek == 'V') |
{ |
t = (member_fn |
? DEMANGLE_COMPONENT_VOLATILE_THIS |
: DEMANGLE_COMPONENT_VOLATILE); |
di->expansion += sizeof "volatile"; |
} |
else |
{ |
t = (member_fn |
? DEMANGLE_COMPONENT_CONST_THIS |
: DEMANGLE_COMPONENT_CONST); |
di->expansion += sizeof "const"; |
} |
*pret = d_make_comp (di, t, NULL, NULL); |
if (*pret == NULL) |
return NULL; |
pret = &d_left (*pret); |
peek = d_peek_char (di); |
} |
if (!member_fn && peek == 'F') |
{ |
while (pstart != pret) |
{ |
switch ((*pstart)->type) |
{ |
case DEMANGLE_COMPONENT_RESTRICT: |
(*pstart)->type = DEMANGLE_COMPONENT_RESTRICT_THIS; |
break; |
case DEMANGLE_COMPONENT_VOLATILE: |
(*pstart)->type = DEMANGLE_COMPONENT_VOLATILE_THIS; |
break; |
case DEMANGLE_COMPONENT_CONST: |
(*pstart)->type = DEMANGLE_COMPONENT_CONST_THIS; |
break; |
default: |
break; |
} |
pstart = &d_left (*pstart); |
} |
} |
return pret; |
} |
/* <ref-qualifier> ::= R |
::= O */ |
static struct demangle_component * |
d_ref_qualifier (struct d_info *di, struct demangle_component *sub) |
{ |
struct demangle_component *ret = sub; |
char peek; |
peek = d_peek_char (di); |
if (peek == 'R' || peek == 'O') |
{ |
enum demangle_component_type t; |
if (peek == 'R') |
{ |
t = DEMANGLE_COMPONENT_REFERENCE_THIS; |
di->expansion += sizeof "&"; |
} |
else |
{ |
t = DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS; |
di->expansion += sizeof "&&"; |
} |
d_advance (di, 1); |
ret = d_make_comp (di, t, ret, NULL); |
} |
return ret; |
} |
/* <function-type> ::= F [Y] <bare-function-type> [<ref-qualifier>] E */ |
static struct demangle_component * |
d_function_type (struct d_info *di) |
{ |
struct demangle_component *ret; |
if (! d_check_char (di, 'F')) |
return NULL; |
if (d_peek_char (di) == 'Y') |
{ |
/* Function has C linkage. We don't print this information. |
FIXME: We should print it in verbose mode. */ |
d_advance (di, 1); |
} |
ret = d_bare_function_type (di, 1); |
ret = d_ref_qualifier (di, ret); |
if (! d_check_char (di, 'E')) |
return NULL; |
return ret; |
} |
/* <type>+ */ |
static struct demangle_component * |
d_parmlist (struct d_info *di) |
{ |
struct demangle_component *tl; |
struct demangle_component **ptl; |
tl = NULL; |
ptl = &tl; |
while (1) |
{ |
struct demangle_component *type; |
char peek = d_peek_char (di); |
if (peek == '\0' || peek == 'E' || peek == '.') |
break; |
if ((peek == 'R' || peek == 'O') |
&& d_peek_next_char (di) == 'E') |
/* Function ref-qualifier, not a ref prefix for a parameter type. */ |
break; |
type = cplus_demangle_type (di); |
if (type == NULL) |
return NULL; |
*ptl = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, type, NULL); |
if (*ptl == NULL) |
return NULL; |
ptl = &d_right (*ptl); |
} |
/* There should be at least one parameter type besides the optional |
return type. A function which takes no arguments will have a |
single parameter type void. */ |
if (tl == NULL) |
return NULL; |
/* If we have a single parameter type void, omit it. */ |
if (d_right (tl) == NULL |
&& d_left (tl)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE |
&& d_left (tl)->u.s_builtin.type->print == D_PRINT_VOID) |
{ |
di->expansion -= d_left (tl)->u.s_builtin.type->len; |
d_left (tl) = NULL; |
} |
return tl; |
} |
/* <bare-function-type> ::= [J]<type>+ */ |
static struct demangle_component * |
d_bare_function_type (struct d_info *di, int has_return_type) |
{ |
struct demangle_component *return_type; |
struct demangle_component *tl; |
char peek; |
/* Detect special qualifier indicating that the first argument |
is the return type. */ |
peek = d_peek_char (di); |
if (peek == 'J') |
{ |
d_advance (di, 1); |
has_return_type = 1; |
} |
if (has_return_type) |
{ |
return_type = cplus_demangle_type (di); |
if (return_type == NULL) |
return NULL; |
} |
else |
return_type = NULL; |
tl = d_parmlist (di); |
if (tl == NULL) |
return NULL; |
return d_make_comp (di, DEMANGLE_COMPONENT_FUNCTION_TYPE, |
return_type, tl); |
} |
/* <class-enum-type> ::= <name> */ |
static struct demangle_component * |
d_class_enum_type (struct d_info *di) |
{ |
return d_name (di); |
} |
/* <array-type> ::= A <(positive dimension) number> _ <(element) type> |
::= A [<(dimension) expression>] _ <(element) type> |
*/ |
static struct demangle_component * |
d_array_type (struct d_info *di) |
{ |
char peek; |
struct demangle_component *dim; |
if (! d_check_char (di, 'A')) |
return NULL; |
peek = d_peek_char (di); |
if (peek == '_') |
dim = NULL; |
else if (IS_DIGIT (peek)) |
{ |
const char *s; |
s = d_str (di); |
do |
{ |
d_advance (di, 1); |
peek = d_peek_char (di); |
} |
while (IS_DIGIT (peek)); |
dim = d_make_name (di, s, d_str (di) - s); |
if (dim == NULL) |
return NULL; |
} |
else |
{ |
dim = d_expression (di); |
if (dim == NULL) |
return NULL; |
} |
if (! d_check_char (di, '_')) |
return NULL; |
return d_make_comp (di, DEMANGLE_COMPONENT_ARRAY_TYPE, dim, |
cplus_demangle_type (di)); |
} |
/* <vector-type> ::= Dv <number> _ <type> |
::= Dv _ <expression> _ <type> */ |
static struct demangle_component * |
d_vector_type (struct d_info *di) |
{ |
char peek; |
struct demangle_component *dim; |
peek = d_peek_char (di); |
if (peek == '_') |
{ |
d_advance (di, 1); |
dim = d_expression (di); |
} |
else |
dim = d_number_component (di); |
if (dim == NULL) |
return NULL; |
if (! d_check_char (di, '_')) |
return NULL; |
return d_make_comp (di, DEMANGLE_COMPONENT_VECTOR_TYPE, dim, |
cplus_demangle_type (di)); |
} |
/* <pointer-to-member-type> ::= M <(class) type> <(member) type> */ |
static struct demangle_component * |
d_pointer_to_member_type (struct d_info *di) |
{ |
struct demangle_component *cl; |
struct demangle_component *mem; |
if (! d_check_char (di, 'M')) |
return NULL; |
cl = cplus_demangle_type (di); |
if (cl == NULL) |
return NULL; |
/* The ABI says, "The type of a non-static member function is considered |
to be different, for the purposes of substitution, from the type of a |
namespace-scope or static member function whose type appears |
similar. The types of two non-static member functions are considered |
to be different, for the purposes of substitution, if the functions |
are members of different classes. In other words, for the purposes of |
substitution, the class of which the function is a member is |
considered part of the type of function." |
For a pointer to member function, this call to cplus_demangle_type |
will end up adding a (possibly qualified) non-member function type to |
the substitution table, which is not correct; however, the member |
function type will never be used in a substitution, so putting the |
wrong type in the substitution table is harmless. */ |
mem = cplus_demangle_type (di); |
if (mem == NULL) |
return NULL; |
return d_make_comp (di, DEMANGLE_COMPONENT_PTRMEM_TYPE, cl, mem); |
} |
/* <non-negative number> _ */ |
static long |
d_compact_number (struct d_info *di) |
{ |
long num; |
if (d_peek_char (di) == '_') |
num = 0; |
else if (d_peek_char (di) == 'n') |
return -1; |
else |
num = d_number (di) + 1; |
if (! d_check_char (di, '_')) |
return -1; |
return num; |
} |
/* <template-param> ::= T_ |
::= T <(parameter-2 non-negative) number> _ |
*/ |
static struct demangle_component * |
d_template_param (struct d_info *di) |
{ |
long param; |
if (! d_check_char (di, 'T')) |
return NULL; |
param = d_compact_number (di); |
if (param < 0) |
return NULL; |
++di->did_subs; |
return d_make_template_param (di, param); |
} |
/* <template-args> ::= I <template-arg>+ E */ |
static struct demangle_component * |
d_template_args (struct d_info *di) |
{ |
struct demangle_component *hold_last_name; |
struct demangle_component *al; |
struct demangle_component **pal; |
/* Preserve the last name we saw--don't let the template arguments |
clobber it, as that would give us the wrong name for a subsequent |
constructor or destructor. */ |
hold_last_name = di->last_name; |
if (d_peek_char (di) != 'I' |
&& d_peek_char (di) != 'J') |
return NULL; |
d_advance (di, 1); |
if (d_peek_char (di) == 'E') |
{ |
/* An argument pack can be empty. */ |
d_advance (di, 1); |
return d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, NULL, NULL); |
} |
al = NULL; |
pal = &al; |
while (1) |
{ |
struct demangle_component *a; |
a = d_template_arg (di); |
if (a == NULL) |
return NULL; |
*pal = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, a, NULL); |
if (*pal == NULL) |
return NULL; |
pal = &d_right (*pal); |
if (d_peek_char (di) == 'E') |
{ |
d_advance (di, 1); |
break; |
} |
} |
di->last_name = hold_last_name; |
return al; |
} |
/* <template-arg> ::= <type> |
::= X <expression> E |
::= <expr-primary> |
*/ |
static struct demangle_component * |
d_template_arg (struct d_info *di) |
{ |
struct demangle_component *ret; |
switch (d_peek_char (di)) |
{ |
case 'X': |
d_advance (di, 1); |
ret = d_expression (di); |
if (! d_check_char (di, 'E')) |
return NULL; |
return ret; |
case 'L': |
return d_expr_primary (di); |
case 'I': |
case 'J': |
/* An argument pack. */ |
return d_template_args (di); |
default: |
return cplus_demangle_type (di); |
} |
} |
/* Parse a sequence of expressions until we hit the terminator |
character. */ |
static struct demangle_component * |
d_exprlist (struct d_info *di, char terminator) |
{ |
struct demangle_component *list = NULL; |
struct demangle_component **p = &list; |
if (d_peek_char (di) == terminator) |
{ |
d_advance (di, 1); |
return d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, NULL, NULL); |
} |
while (1) |
{ |
struct demangle_component *arg = d_expression (di); |
if (arg == NULL) |
return NULL; |
*p = d_make_comp (di, DEMANGLE_COMPONENT_ARGLIST, arg, NULL); |
if (*p == NULL) |
return NULL; |
p = &d_right (*p); |
if (d_peek_char (di) == terminator) |
{ |
d_advance (di, 1); |
break; |
} |
} |
return list; |
} |
/* Returns nonzero iff OP is an operator for a C++ cast: const_cast, |
dynamic_cast, static_cast or reinterpret_cast. */ |
static int |
op_is_new_cast (struct demangle_component *op) |
{ |
const char *code = op->u.s_operator.op->code; |
return (code[1] == 'c' |
&& (code[0] == 's' || code[0] == 'd' |
|| code[0] == 'c' || code[0] == 'r')); |
} |
/* <expression> ::= <(unary) operator-name> <expression> |
::= <(binary) operator-name> <expression> <expression> |
::= <(trinary) operator-name> <expression> <expression> <expression> |
::= cl <expression>+ E |
::= st <type> |
::= <template-param> |
::= sr <type> <unqualified-name> |
::= sr <type> <unqualified-name> <template-args> |
::= <expr-primary> |
*/ |
static struct demangle_component * |
d_expression (struct d_info *di) |
{ |
char peek; |
peek = d_peek_char (di); |
if (peek == 'L') |
return d_expr_primary (di); |
else if (peek == 'T') |
return d_template_param (di); |
else if (peek == 's' && d_peek_next_char (di) == 'r') |
{ |
struct demangle_component *type; |
struct demangle_component *name; |
d_advance (di, 2); |
type = cplus_demangle_type (di); |
name = d_unqualified_name (di); |
if (d_peek_char (di) != 'I') |
return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type, name); |
else |
return d_make_comp (di, DEMANGLE_COMPONENT_QUAL_NAME, type, |
d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name, |
d_template_args (di))); |
} |
else if (peek == 's' && d_peek_next_char (di) == 'p') |
{ |
d_advance (di, 2); |
return d_make_comp (di, DEMANGLE_COMPONENT_PACK_EXPANSION, |
d_expression (di), NULL); |
} |
else if (peek == 'f' && d_peek_next_char (di) == 'p') |
{ |
/* Function parameter used in a late-specified return type. */ |
int index; |
d_advance (di, 2); |
if (d_peek_char (di) == 'T') |
{ |
/* 'this' parameter. */ |
d_advance (di, 1); |
index = 0; |
} |
else |
{ |
index = d_compact_number (di) + 1; |
if (index == 0) |
return NULL; |
} |
return d_make_function_param (di, index); |
} |
else if (IS_DIGIT (peek) |
|| (peek == 'o' && d_peek_next_char (di) == 'n')) |
{ |
/* We can get an unqualified name as an expression in the case of |
a dependent function call, i.e. decltype(f(t)). */ |
struct demangle_component *name; |
if (peek == 'o') |
/* operator-function-id, i.e. operator+(t). */ |
d_advance (di, 2); |
name = d_unqualified_name (di); |
if (name == NULL) |
return NULL; |
if (d_peek_char (di) == 'I') |
return d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name, |
d_template_args (di)); |
else |
return name; |
} |
else if ((peek == 'i' || peek == 't') |
&& d_peek_next_char (di) == 'l') |
{ |
/* Brace-enclosed initializer list, untyped or typed. */ |
struct demangle_component *type = NULL; |
if (peek == 't') |
type = cplus_demangle_type (di); |
d_advance (di, 2); |
return d_make_comp (di, DEMANGLE_COMPONENT_INITIALIZER_LIST, |
type, d_exprlist (di, 'E')); |
} |
else |
{ |
struct demangle_component *op; |
const char *code = NULL; |
int args; |
op = d_operator_name (di); |
if (op == NULL) |
return NULL; |
if (op->type == DEMANGLE_COMPONENT_OPERATOR) |
{ |
code = op->u.s_operator.op->code; |
di->expansion += op->u.s_operator.op->len - 2; |
if (strcmp (code, "st") == 0) |
return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op, |
cplus_demangle_type (di)); |
} |
switch (op->type) |
{ |
default: |
return NULL; |
case DEMANGLE_COMPONENT_OPERATOR: |
args = op->u.s_operator.op->args; |
break; |
case DEMANGLE_COMPONENT_EXTENDED_OPERATOR: |
args = op->u.s_extended_operator.args; |
break; |
case DEMANGLE_COMPONENT_CAST: |
args = 1; |
break; |
} |
switch (args) |
{ |
case 0: |
return d_make_comp (di, DEMANGLE_COMPONENT_NULLARY, op, NULL); |
case 1: |
{ |
struct demangle_component *operand; |
int suffix = 0; |
if (code && (code[0] == 'p' || code[0] == 'm') |
&& code[1] == code[0]) |
/* pp_ and mm_ are the prefix variants. */ |
suffix = !d_check_char (di, '_'); |
if (op->type == DEMANGLE_COMPONENT_CAST |
&& d_check_char (di, '_')) |
operand = d_exprlist (di, 'E'); |
else |
operand = d_expression (di); |
if (suffix) |
/* Indicate the suffix variant for d_print_comp. */ |
return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op, |
d_make_comp (di, |
DEMANGLE_COMPONENT_BINARY_ARGS, |
operand, operand)); |
else |
return d_make_comp (di, DEMANGLE_COMPONENT_UNARY, op, |
operand); |
} |
case 2: |
{ |
struct demangle_component *left; |
struct demangle_component *right; |
if (op_is_new_cast (op)) |
left = cplus_demangle_type (di); |
else |
left = d_expression (di); |
if (!strcmp (code, "cl")) |
right = d_exprlist (di, 'E'); |
else if (!strcmp (code, "dt") || !strcmp (code, "pt")) |
{ |
right = d_unqualified_name (di); |
if (d_peek_char (di) == 'I') |
right = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, |
right, d_template_args (di)); |
} |
else |
right = d_expression (di); |
return d_make_comp (di, DEMANGLE_COMPONENT_BINARY, op, |
d_make_comp (di, |
DEMANGLE_COMPONENT_BINARY_ARGS, |
left, right)); |
} |
case 3: |
{ |
struct demangle_component *first; |
struct demangle_component *second; |
struct demangle_component *third; |
if (!strcmp (code, "qu")) |
{ |
/* ?: expression. */ |
first = d_expression (di); |
second = d_expression (di); |
third = d_expression (di); |
} |
else if (code[0] == 'n') |
{ |
/* new-expression. */ |
if (code[1] != 'w' && code[1] != 'a') |
return NULL; |
first = d_exprlist (di, '_'); |
second = cplus_demangle_type (di); |
if (d_peek_char (di) == 'E') |
{ |
d_advance (di, 1); |
third = NULL; |
} |
else if (d_peek_char (di) == 'p' |
&& d_peek_next_char (di) == 'i') |
{ |
/* Parenthesized initializer. */ |
d_advance (di, 2); |
third = d_exprlist (di, 'E'); |
} |
else if (d_peek_char (di) == 'i' |
&& d_peek_next_char (di) == 'l') |
/* initializer-list. */ |
third = d_expression (di); |
else |
return NULL; |
} |
else |
return NULL; |
return d_make_comp (di, DEMANGLE_COMPONENT_TRINARY, op, |
d_make_comp (di, |
DEMANGLE_COMPONENT_TRINARY_ARG1, |
first, |
d_make_comp (di, |
DEMANGLE_COMPONENT_TRINARY_ARG2, |
second, third))); |
} |
default: |
return NULL; |
} |
} |
} |
/* <expr-primary> ::= L <type> <(value) number> E |
::= L <type> <(value) float> E |
::= L <mangled-name> E |
*/ |
static struct demangle_component * |
d_expr_primary (struct d_info *di) |
{ |
struct demangle_component *ret; |
if (! d_check_char (di, 'L')) |
return NULL; |
if (d_peek_char (di) == '_' |
/* Workaround for G++ bug; see comment in write_template_arg. */ |
|| d_peek_char (di) == 'Z') |
ret = cplus_demangle_mangled_name (di, 0); |
else |
{ |
struct demangle_component *type; |
enum demangle_component_type t; |
const char *s; |
type = cplus_demangle_type (di); |
if (type == NULL) |
return NULL; |
/* If we have a type we know how to print, we aren't going to |
print the type name itself. */ |
if (type->type == DEMANGLE_COMPONENT_BUILTIN_TYPE |
&& type->u.s_builtin.type->print != D_PRINT_DEFAULT) |
di->expansion -= type->u.s_builtin.type->len; |
/* Rather than try to interpret the literal value, we just |
collect it as a string. Note that it's possible to have a |
floating point literal here. The ABI specifies that the |
format of such literals is machine independent. That's fine, |
but what's not fine is that versions of g++ up to 3.2 with |
-fabi-version=1 used upper case letters in the hex constant, |
and dumped out gcc's internal representation. That makes it |
hard to tell where the constant ends, and hard to dump the |
constant in any readable form anyhow. We don't attempt to |
handle these cases. */ |
t = DEMANGLE_COMPONENT_LITERAL; |
if (d_peek_char (di) == 'n') |
{ |
t = DEMANGLE_COMPONENT_LITERAL_NEG; |
d_advance (di, 1); |
} |
s = d_str (di); |
while (d_peek_char (di) != 'E') |
{ |
if (d_peek_char (di) == '\0') |
return NULL; |
d_advance (di, 1); |
} |
ret = d_make_comp (di, t, type, d_make_name (di, s, d_str (di) - s)); |
} |
if (! d_check_char (di, 'E')) |
return NULL; |
return ret; |
} |
/* <local-name> ::= Z <(function) encoding> E <(entity) name> [<discriminator>] |
::= Z <(function) encoding> E s [<discriminator>] |
::= Z <(function) encoding> E d [<parameter> number>] _ <entity name> |
*/ |
static struct demangle_component * |
d_local_name (struct d_info *di) |
{ |
struct demangle_component *function; |
if (! d_check_char (di, 'Z')) |
return NULL; |
function = d_encoding (di, 0); |
if (! d_check_char (di, 'E')) |
return NULL; |
if (d_peek_char (di) == 's') |
{ |
d_advance (di, 1); |
if (! d_discriminator (di)) |
return NULL; |
return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function, |
d_make_name (di, "string literal", |
sizeof "string literal" - 1)); |
} |
else |
{ |
struct demangle_component *name; |
int num = -1; |
if (d_peek_char (di) == 'd') |
{ |
/* Default argument scope: d <number> _. */ |
d_advance (di, 1); |
num = d_compact_number (di); |
if (num < 0) |
return NULL; |
} |
name = d_name (di); |
if (name) |
switch (name->type) |
{ |
/* Lambdas and unnamed types have internal discriminators. */ |
case DEMANGLE_COMPONENT_LAMBDA: |
case DEMANGLE_COMPONENT_UNNAMED_TYPE: |
break; |
default: |
if (! d_discriminator (di)) |
return NULL; |
} |
if (num >= 0) |
name = d_make_default_arg (di, num, name); |
return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function, name); |
} |
} |
/* <discriminator> ::= _ <(non-negative) number> |
We demangle the discriminator, but we don't print it out. FIXME: |
We should print it out in verbose mode. */ |
static int |
d_discriminator (struct d_info *di) |
{ |
long discrim; |
if (d_peek_char (di) != '_') |
return 1; |
d_advance (di, 1); |
discrim = d_number (di); |
if (discrim < 0) |
return 0; |
return 1; |
} |
/* <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _ */ |
static struct demangle_component * |
d_lambda (struct d_info *di) |
{ |
struct demangle_component *tl; |
struct demangle_component *ret; |
int num; |
if (! d_check_char (di, 'U')) |
return NULL; |
if (! d_check_char (di, 'l')) |
return NULL; |
tl = d_parmlist (di); |
if (tl == NULL) |
return NULL; |
if (! d_check_char (di, 'E')) |
return NULL; |
num = d_compact_number (di); |
if (num < 0) |
return NULL; |
ret = d_make_empty (di); |
if (ret) |
{ |
ret->type = DEMANGLE_COMPONENT_LAMBDA; |
ret->u.s_unary_num.sub = tl; |
ret->u.s_unary_num.num = num; |
} |
if (! d_add_substitution (di, ret)) |
return NULL; |
return ret; |
} |
/* <unnamed-type-name> ::= Ut [ <nonnegative number> ] _ */ |
static struct demangle_component * |
d_unnamed_type (struct d_info *di) |
{ |
struct demangle_component *ret; |
long num; |
if (! d_check_char (di, 'U')) |
return NULL; |
if (! d_check_char (di, 't')) |
return NULL; |
num = d_compact_number (di); |
if (num < 0) |
return NULL; |
ret = d_make_empty (di); |
if (ret) |
{ |
ret->type = DEMANGLE_COMPONENT_UNNAMED_TYPE; |
ret->u.s_number.number = num; |
} |
if (! d_add_substitution (di, ret)) |
return NULL; |
return ret; |
} |
/* <clone-suffix> ::= [ . <clone-type-identifier> ] [ . <nonnegative number> ]* |
*/ |
static struct demangle_component * |
d_clone_suffix (struct d_info *di, struct demangle_component *encoding) |
{ |
const char *suffix = d_str (di); |
const char *pend = suffix; |
struct demangle_component *n; |
if (*pend == '.' && (IS_LOWER (pend[1]) || pend[1] == '_')) |
{ |
pend += 2; |
while (IS_LOWER (*pend) || *pend == '_') |
++pend; |
} |
while (*pend == '.' && IS_DIGIT (pend[1])) |
{ |
pend += 2; |
while (IS_DIGIT (*pend)) |
++pend; |
} |
d_advance (di, pend - suffix); |
n = d_make_name (di, suffix, pend - suffix); |
return d_make_comp (di, DEMANGLE_COMPONENT_CLONE, encoding, n); |
} |
/* Add a new substitution. */ |
static int |
d_add_substitution (struct d_info *di, struct demangle_component *dc) |
{ |
if (dc == NULL) |
return 0; |
if (di->next_sub >= di->num_subs) |
return 0; |
di->subs[di->next_sub] = dc; |
++di->next_sub; |
return 1; |
} |
/* <substitution> ::= S <seq-id> _ |
::= S_ |
::= St |
::= Sa |
::= Sb |
::= Ss |
::= Si |
::= So |
::= Sd |
If PREFIX is non-zero, then this type is being used as a prefix in |
a qualified name. In this case, for the standard substitutions, we |
need to check whether we are being used as a prefix for a |
constructor or destructor, and return a full template name. |
Otherwise we will get something like std::iostream::~iostream() |
which does not correspond particularly well to any function which |
actually appears in the source. |
*/ |
static const struct d_standard_sub_info standard_subs[] = |
{ |
{ 't', NL ("std"), |
NL ("std"), |
NULL, 0 }, |
{ 'a', NL ("std::allocator"), |
NL ("std::allocator"), |
NL ("allocator") }, |
{ 'b', NL ("std::basic_string"), |
NL ("std::basic_string"), |
NL ("basic_string") }, |
{ 's', NL ("std::string"), |
NL ("std::basic_string<char, std::char_traits<char>, std::allocator<char> >"), |
NL ("basic_string") }, |
{ 'i', NL ("std::istream"), |
NL ("std::basic_istream<char, std::char_traits<char> >"), |
NL ("basic_istream") }, |
{ 'o', NL ("std::ostream"), |
NL ("std::basic_ostream<char, std::char_traits<char> >"), |
NL ("basic_ostream") }, |
{ 'd', NL ("std::iostream"), |
NL ("std::basic_iostream<char, std::char_traits<char> >"), |
NL ("basic_iostream") } |
}; |
static struct demangle_component * |
d_substitution (struct d_info *di, int prefix) |
{ |
char c; |
if (! d_check_char (di, 'S')) |
return NULL; |
c = d_next_char (di); |
if (c == '_' || IS_DIGIT (c) || IS_UPPER (c)) |
{ |
unsigned int id; |
id = 0; |
if (c != '_') |
{ |
do |
{ |
unsigned int new_id; |
if (IS_DIGIT (c)) |
new_id = id * 36 + c - '0'; |
else if (IS_UPPER (c)) |
new_id = id * 36 + c - 'A' + 10; |
else |
return NULL; |
if (new_id < id) |
return NULL; |
id = new_id; |
c = d_next_char (di); |
} |
while (c != '_'); |
++id; |
} |
if (id >= (unsigned int) di->next_sub) |
return NULL; |
++di->did_subs; |
return di->subs[id]; |
} |
else |
{ |
int verbose; |
const struct d_standard_sub_info *p; |
const struct d_standard_sub_info *pend; |
verbose = (di->options & DMGL_VERBOSE) != 0; |
if (! verbose && prefix) |
{ |
char peek; |
peek = d_peek_char (di); |
if (peek == 'C' || peek == 'D') |
verbose = 1; |
} |
pend = (&standard_subs[0] |
+ sizeof standard_subs / sizeof standard_subs[0]); |
for (p = &standard_subs[0]; p < pend; ++p) |
{ |
if (c == p->code) |
{ |
const char *s; |
int len; |
if (p->set_last_name != NULL) |
di->last_name = d_make_sub (di, p->set_last_name, |
p->set_last_name_len); |
if (verbose) |
{ |
s = p->full_expansion; |
len = p->full_len; |
} |
else |
{ |
s = p->simple_expansion; |
len = p->simple_len; |
} |
di->expansion += len; |
return d_make_sub (di, s, len); |
} |
} |
return NULL; |
} |
} |
/* Initialize a growable string. */ |
static void |
d_growable_string_init (struct d_growable_string *dgs, size_t estimate) |
{ |
dgs->buf = NULL; |
dgs->len = 0; |
dgs->alc = 0; |
dgs->allocation_failure = 0; |
if (estimate > 0) |
d_growable_string_resize (dgs, estimate); |
} |
/* Grow a growable string to a given size. */ |
static inline void |
d_growable_string_resize (struct d_growable_string *dgs, size_t need) |
{ |
size_t newalc; |
char *newbuf; |
if (dgs->allocation_failure) |
return; |
/* Start allocation at two bytes to avoid any possibility of confusion |
with the special value of 1 used as a return in *palc to indicate |
allocation failures. */ |
newalc = dgs->alc > 0 ? dgs->alc : 2; |
while (newalc < need) |
newalc <<= 1; |
newbuf = (char *) realloc (dgs->buf, newalc); |
if (newbuf == NULL) |
{ |
free (dgs->buf); |
dgs->buf = NULL; |
dgs->len = 0; |
dgs->alc = 0; |
dgs->allocation_failure = 1; |
return; |
} |
dgs->buf = newbuf; |
dgs->alc = newalc; |
} |
/* Append a buffer to a growable string. */ |
static inline void |
d_growable_string_append_buffer (struct d_growable_string *dgs, |
const char *s, size_t l) |
{ |
size_t need; |
need = dgs->len + l + 1; |
if (need > dgs->alc) |
d_growable_string_resize (dgs, need); |
if (dgs->allocation_failure) |
return; |
memcpy (dgs->buf + dgs->len, s, l); |
dgs->buf[dgs->len + l] = '\0'; |
dgs->len += l; |
} |
/* Bridge growable strings to the callback mechanism. */ |
static void |
d_growable_string_callback_adapter (const char *s, size_t l, void *opaque) |
{ |
struct d_growable_string *dgs = (struct d_growable_string*) opaque; |
d_growable_string_append_buffer (dgs, s, l); |
} |
/* Initialize a print information structure. */ |
static void |
d_print_init (struct d_print_info *dpi, demangle_callbackref callback, |
void *opaque) |
{ |
dpi->len = 0; |
dpi->last_char = '\0'; |
dpi->templates = NULL; |
dpi->modifiers = NULL; |
dpi->pack_index = 0; |
dpi->flush_count = 0; |
dpi->callback = callback; |
dpi->opaque = opaque; |
dpi->demangle_failure = 0; |
} |
/* Indicate that an error occurred during printing, and test for error. */ |
static inline void |
d_print_error (struct d_print_info *dpi) |
{ |
dpi->demangle_failure = 1; |
} |
static inline int |
d_print_saw_error (struct d_print_info *dpi) |
{ |
return dpi->demangle_failure != 0; |
} |
/* Flush buffered characters to the callback. */ |
static inline void |
d_print_flush (struct d_print_info *dpi) |
{ |
dpi->buf[dpi->len] = '\0'; |
dpi->callback (dpi->buf, dpi->len, dpi->opaque); |
dpi->len = 0; |
dpi->flush_count++; |
} |
/* Append characters and buffers for printing. */ |
static inline void |
d_append_char (struct d_print_info *dpi, char c) |
{ |
if (dpi->len == sizeof (dpi->buf) - 1) |
d_print_flush (dpi); |
dpi->buf[dpi->len++] = c; |
dpi->last_char = c; |
} |
static inline void |
d_append_buffer (struct d_print_info *dpi, const char *s, size_t l) |
{ |
size_t i; |
for (i = 0; i < l; i++) |
d_append_char (dpi, s[i]); |
} |
static inline void |
d_append_string (struct d_print_info *dpi, const char *s) |
{ |
d_append_buffer (dpi, s, strlen (s)); |
} |
static inline void |
d_append_num (struct d_print_info *dpi, long l) |
{ |
char buf[25]; |
sprintf (buf,"%ld", l); |
d_append_string (dpi, buf); |
} |
static inline char |
d_last_char (struct d_print_info *dpi) |
{ |
return dpi->last_char; |
} |
/* Turn components into a human readable string. OPTIONS is the |
options bits passed to the demangler. DC is the tree to print. |
CALLBACK is a function to call to flush demangled string segments |
as they fill the intermediate buffer, and OPAQUE is a generalized |
callback argument. On success, this returns 1. On failure, |
it returns 0, indicating a bad parse. It does not use heap |
memory to build an output string, so cannot encounter memory |
allocation failure. */ |
CP_STATIC_IF_GLIBCPP_V3 |
int |
cplus_demangle_print_callback (int options, |
const struct demangle_component *dc, |
demangle_callbackref callback, void *opaque) |
{ |
struct d_print_info dpi; |
d_print_init (&dpi, callback, opaque); |
d_print_comp (&dpi, options, dc); |
d_print_flush (&dpi); |
return ! d_print_saw_error (&dpi); |
} |
/* Turn components into a human readable string. OPTIONS is the |
options bits passed to the demangler. DC is the tree to print. |
ESTIMATE is a guess at the length of the result. This returns a |
string allocated by malloc, or NULL on error. On success, this |
sets *PALC to the size of the allocated buffer. On failure, this |
sets *PALC to 0 for a bad parse, or to 1 for a memory allocation |
failure. */ |
CP_STATIC_IF_GLIBCPP_V3 |
char * |
cplus_demangle_print (int options, const struct demangle_component *dc, |
int estimate, size_t *palc) |
{ |
struct d_growable_string dgs; |
d_growable_string_init (&dgs, estimate); |
if (! cplus_demangle_print_callback (options, dc, |
d_growable_string_callback_adapter, |
&dgs)) |
{ |
free (dgs.buf); |
*palc = 0; |
return NULL; |
} |
*palc = dgs.allocation_failure ? 1 : dgs.alc; |
return dgs.buf; |
} |
/* Returns the I'th element of the template arglist ARGS, or NULL on |
failure. */ |
static struct demangle_component * |
d_index_template_argument (struct demangle_component *args, int i) |
{ |
struct demangle_component *a; |
for (a = args; |
a != NULL; |
a = d_right (a)) |
{ |
if (a->type != DEMANGLE_COMPONENT_TEMPLATE_ARGLIST) |
return NULL; |
if (i <= 0) |
break; |
--i; |
} |
if (i != 0 || a == NULL) |
return NULL; |
return d_left (a); |
} |
/* Returns the template argument from the current context indicated by DC, |
which is a DEMANGLE_COMPONENT_TEMPLATE_PARAM, or NULL. */ |
static struct demangle_component * |
d_lookup_template_argument (struct d_print_info *dpi, |
const struct demangle_component *dc) |
{ |
if (dpi->templates == NULL) |
{ |
d_print_error (dpi); |
return NULL; |
} |
return d_index_template_argument |
(d_right (dpi->templates->template_decl), |
dc->u.s_number.number); |
} |
/* Returns a template argument pack used in DC (any will do), or NULL. */ |
static struct demangle_component * |
d_find_pack (struct d_print_info *dpi, |
const struct demangle_component *dc) |
{ |
struct demangle_component *a; |
if (dc == NULL) |
return NULL; |
switch (dc->type) |
{ |
case DEMANGLE_COMPONENT_TEMPLATE_PARAM: |
a = d_lookup_template_argument (dpi, dc); |
if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST) |
return a; |
return NULL; |
case DEMANGLE_COMPONENT_PACK_EXPANSION: |
return NULL; |
case DEMANGLE_COMPONENT_LAMBDA: |
case DEMANGLE_COMPONENT_NAME: |
case DEMANGLE_COMPONENT_TAGGED_NAME: |
case DEMANGLE_COMPONENT_OPERATOR: |
case DEMANGLE_COMPONENT_BUILTIN_TYPE: |
case DEMANGLE_COMPONENT_SUB_STD: |
case DEMANGLE_COMPONENT_CHARACTER: |
case DEMANGLE_COMPONENT_FUNCTION_PARAM: |
case DEMANGLE_COMPONENT_UNNAMED_TYPE: |
return NULL; |
case DEMANGLE_COMPONENT_EXTENDED_OPERATOR: |
return d_find_pack (dpi, dc->u.s_extended_operator.name); |
case DEMANGLE_COMPONENT_CTOR: |
return d_find_pack (dpi, dc->u.s_ctor.name); |
case DEMANGLE_COMPONENT_DTOR: |
return d_find_pack (dpi, dc->u.s_dtor.name); |
default: |
a = d_find_pack (dpi, d_left (dc)); |
if (a) |
return a; |
return d_find_pack (dpi, d_right (dc)); |
} |
} |
/* Returns the length of the template argument pack DC. */ |
static int |
d_pack_length (const struct demangle_component *dc) |
{ |
int count = 0; |
while (dc && dc->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST |
&& d_left (dc) != NULL) |
{ |
++count; |
dc = d_right (dc); |
} |
return count; |
} |
/* DC is a component of a mangled expression. Print it, wrapped in parens |
if needed. */ |
static void |
d_print_subexpr (struct d_print_info *dpi, int options, |
const struct demangle_component *dc) |
{ |
int simple = 0; |
if (dc->type == DEMANGLE_COMPONENT_NAME |
|| dc->type == DEMANGLE_COMPONENT_QUAL_NAME |
|| dc->type == DEMANGLE_COMPONENT_INITIALIZER_LIST |
|| dc->type == DEMANGLE_COMPONENT_FUNCTION_PARAM) |
simple = 1; |
if (!simple) |
d_append_char (dpi, '('); |
d_print_comp (dpi, options, dc); |
if (!simple) |
d_append_char (dpi, ')'); |
} |
/* Subroutine to handle components. */ |
static void |
d_print_comp (struct d_print_info *dpi, int options, |
const struct demangle_component *dc) |
{ |
/* Magic variable to let reference smashing skip over the next modifier |
without needing to modify *dc. */ |
const struct demangle_component *mod_inner = NULL; |
if (dc == NULL) |
{ |
d_print_error (dpi); |
return; |
} |
if (d_print_saw_error (dpi)) |
return; |
switch (dc->type) |
{ |
case DEMANGLE_COMPONENT_NAME: |
if ((options & DMGL_JAVA) == 0) |
d_append_buffer (dpi, dc->u.s_name.s, dc->u.s_name.len); |
else |
d_print_java_identifier (dpi, dc->u.s_name.s, dc->u.s_name.len); |
return; |
case DEMANGLE_COMPONENT_TAGGED_NAME: |
d_print_comp (dpi, options, d_left (dc)); |
d_append_string (dpi, "[abi:"); |
d_print_comp (dpi, options, d_right (dc)); |
d_append_char (dpi, ']'); |
return; |
case DEMANGLE_COMPONENT_QUAL_NAME: |
case DEMANGLE_COMPONENT_LOCAL_NAME: |
d_print_comp (dpi, options, d_left (dc)); |
if ((options & DMGL_JAVA) == 0) |
d_append_string (dpi, "::"); |
else |
d_append_char (dpi, '.'); |
{ |
struct demangle_component *local_name = d_right (dc); |
if (local_name->type == DEMANGLE_COMPONENT_DEFAULT_ARG) |
{ |
d_append_string (dpi, "{default arg#"); |
d_append_num (dpi, local_name->u.s_unary_num.num + 1); |
d_append_string (dpi, "}::"); |
local_name = local_name->u.s_unary_num.sub; |
} |
d_print_comp (dpi, options, local_name); |
} |
return; |
case DEMANGLE_COMPONENT_TYPED_NAME: |
{ |
struct d_print_mod *hold_modifiers; |
struct demangle_component *typed_name; |
struct d_print_mod adpm[4]; |
unsigned int i; |
struct d_print_template dpt; |
/* Pass the name down to the type so that it can be printed in |
the right place for the type. We also have to pass down |
any CV-qualifiers, which apply to the this parameter. */ |
hold_modifiers = dpi->modifiers; |
dpi->modifiers = 0; |
i = 0; |
typed_name = d_left (dc); |
while (typed_name != NULL) |
{ |
if (i >= sizeof adpm / sizeof adpm[0]) |
{ |
d_print_error (dpi); |
return; |
} |
adpm[i].next = dpi->modifiers; |
dpi->modifiers = &adpm[i]; |
adpm[i].mod = typed_name; |
adpm[i].printed = 0; |
adpm[i].templates = dpi->templates; |
++i; |
if (typed_name->type != DEMANGLE_COMPONENT_RESTRICT_THIS |
&& typed_name->type != DEMANGLE_COMPONENT_VOLATILE_THIS |
&& typed_name->type != DEMANGLE_COMPONENT_CONST_THIS |
&& typed_name->type != DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS |
&& typed_name->type != DEMANGLE_COMPONENT_REFERENCE_THIS) |
break; |
typed_name = d_left (typed_name); |
} |
if (typed_name == NULL) |
{ |
d_print_error (dpi); |
return; |
} |
/* If typed_name is a template, then it applies to the |
function type as well. */ |
if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE) |
{ |
dpt.next = dpi->templates; |
dpi->templates = &dpt; |
dpt.template_decl = typed_name; |
} |
/* If typed_name is a DEMANGLE_COMPONENT_LOCAL_NAME, then |
there may be CV-qualifiers on its right argument which |
really apply here; this happens when parsing a class which |
is local to a function. */ |
if (typed_name->type == DEMANGLE_COMPONENT_LOCAL_NAME) |
{ |
struct demangle_component *local_name; |
local_name = d_right (typed_name); |
if (local_name->type == DEMANGLE_COMPONENT_DEFAULT_ARG) |
local_name = local_name->u.s_unary_num.sub; |
while (local_name->type == DEMANGLE_COMPONENT_RESTRICT_THIS |
|| local_name->type == DEMANGLE_COMPONENT_VOLATILE_THIS |
|| local_name->type == DEMANGLE_COMPONENT_CONST_THIS |
|| local_name->type == DEMANGLE_COMPONENT_REFERENCE_THIS |
|| (local_name->type |
== DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS)) |
{ |
if (i >= sizeof adpm / sizeof adpm[0]) |
{ |
d_print_error (dpi); |
return; |
} |
adpm[i] = adpm[i - 1]; |
adpm[i].next = &adpm[i - 1]; |
dpi->modifiers = &adpm[i]; |
adpm[i - 1].mod = local_name; |
adpm[i - 1].printed = 0; |
adpm[i - 1].templates = dpi->templates; |
++i; |
local_name = d_left (local_name); |
} |
} |
d_print_comp (dpi, options, d_right (dc)); |
if (typed_name->type == DEMANGLE_COMPONENT_TEMPLATE) |
dpi->templates = dpt.next; |
/* If the modifiers didn't get printed by the type, print them |
now. */ |
while (i > 0) |
{ |
--i; |
if (! adpm[i].printed) |
{ |
d_append_char (dpi, ' '); |
d_print_mod (dpi, options, adpm[i].mod); |
} |
} |
dpi->modifiers = hold_modifiers; |
return; |
} |
case DEMANGLE_COMPONENT_TEMPLATE: |
{ |
struct d_print_mod *hold_dpm; |
struct demangle_component *dcl; |
/* Don't push modifiers into a template definition. Doing so |
could give the wrong definition for a template argument. |
Instead, treat the template essentially as a name. */ |
hold_dpm = dpi->modifiers; |
dpi->modifiers = NULL; |
dcl = d_left (dc); |
if ((options & DMGL_JAVA) != 0 |
&& dcl->type == DEMANGLE_COMPONENT_NAME |
&& dcl->u.s_name.len == 6 |
&& strncmp (dcl->u.s_name.s, "JArray", 6) == 0) |
{ |
/* Special-case Java arrays, so that JArray<TYPE> appears |
instead as TYPE[]. */ |
d_print_comp (dpi, options, d_right (dc)); |
d_append_string (dpi, "[]"); |
} |
else |
{ |
d_print_comp (dpi, options, dcl); |
if (d_last_char (dpi) == '<') |
d_append_char (dpi, ' '); |
d_append_char (dpi, '<'); |
d_print_comp (dpi, options, d_right (dc)); |
/* Avoid generating two consecutive '>' characters, to avoid |
the C++ syntactic ambiguity. */ |
if (d_last_char (dpi) == '>') |
d_append_char (dpi, ' '); |
d_append_char (dpi, '>'); |
} |
dpi->modifiers = hold_dpm; |
return; |
} |
case DEMANGLE_COMPONENT_TEMPLATE_PARAM: |
{ |
struct d_print_template *hold_dpt; |
struct demangle_component *a = d_lookup_template_argument (dpi, dc); |
if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST) |
a = d_index_template_argument (a, dpi->pack_index); |
if (a == NULL) |
{ |
d_print_error (dpi); |
return; |
} |
/* While processing this parameter, we need to pop the list of |
templates. This is because the template parameter may |
itself be a reference to a parameter of an outer |
template. */ |
hold_dpt = dpi->templates; |
dpi->templates = hold_dpt->next; |
d_print_comp (dpi, options, a); |
dpi->templates = hold_dpt; |
return; |
} |
case DEMANGLE_COMPONENT_CTOR: |
d_print_comp (dpi, options, dc->u.s_ctor.name); |
return; |
case DEMANGLE_COMPONENT_DTOR: |
d_append_char (dpi, '~'); |
d_print_comp (dpi, options, dc->u.s_dtor.name); |
return; |
case DEMANGLE_COMPONENT_VTABLE: |
d_append_string (dpi, "vtable for "); |
d_print_comp (dpi, options, d_left (dc)); |
return; |
case DEMANGLE_COMPONENT_VTT: |
d_append_string (dpi, "VTT for "); |
d_print_comp (dpi, options, d_left (dc)); |
return; |
case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE: |
d_append_string (dpi, "construction vtable for "); |
d_print_comp (dpi, options, d_left (dc)); |
d_append_string (dpi, "-in-"); |
d_print_comp (dpi, options, d_right (dc)); |
return; |
case DEMANGLE_COMPONENT_TYPEINFO: |
d_append_string (dpi, "typeinfo for "); |
d_print_comp (dpi, options, d_left (dc)); |
return; |
case DEMANGLE_COMPONENT_TYPEINFO_NAME: |
d_append_string (dpi, "typeinfo name for "); |
d_print_comp (dpi, options, d_left (dc)); |
return; |
case DEMANGLE_COMPONENT_TYPEINFO_FN: |
d_append_string (dpi, "typeinfo fn for "); |
d_print_comp (dpi, options, d_left (dc)); |
return; |
case DEMANGLE_COMPONENT_THUNK: |
d_append_string (dpi, "non-virtual thunk to "); |
d_print_comp (dpi, options, d_left (dc)); |
return; |
case DEMANGLE_COMPONENT_VIRTUAL_THUNK: |
d_append_string (dpi, "virtual thunk to "); |
d_print_comp (dpi, options, d_left (dc)); |
return; |
case DEMANGLE_COMPONENT_COVARIANT_THUNK: |
d_append_string (dpi, "covariant return thunk to "); |
d_print_comp (dpi, options, d_left (dc)); |
return; |
case DEMANGLE_COMPONENT_JAVA_CLASS: |
d_append_string (dpi, "java Class for "); |
d_print_comp (dpi, options, d_left (dc)); |
return; |
case DEMANGLE_COMPONENT_GUARD: |
d_append_string (dpi, "guard variable for "); |
d_print_comp (dpi, options, d_left (dc)); |
return; |
case DEMANGLE_COMPONENT_TLS_INIT: |
d_append_string (dpi, "TLS init function for "); |
d_print_comp (dpi, options, d_left (dc)); |
return; |
case DEMANGLE_COMPONENT_TLS_WRAPPER: |
d_append_string (dpi, "TLS wrapper function for "); |
d_print_comp (dpi, options, d_left (dc)); |
return; |
case DEMANGLE_COMPONENT_REFTEMP: |
d_append_string (dpi, "reference temporary #"); |
d_print_comp (dpi, options, d_right (dc)); |
d_append_string (dpi, " for "); |
d_print_comp (dpi, options, d_left (dc)); |
return; |
case DEMANGLE_COMPONENT_HIDDEN_ALIAS: |
d_append_string (dpi, "hidden alias for "); |
d_print_comp (dpi, options, d_left (dc)); |
return; |
case DEMANGLE_COMPONENT_TRANSACTION_CLONE: |
d_append_string (dpi, "transaction clone for "); |
d_print_comp (dpi, options, d_left (dc)); |
return; |
case DEMANGLE_COMPONENT_NONTRANSACTION_CLONE: |
d_append_string (dpi, "non-transaction clone for "); |
d_print_comp (dpi, options, d_left (dc)); |
return; |
case DEMANGLE_COMPONENT_SUB_STD: |
d_append_buffer (dpi, dc->u.s_string.string, dc->u.s_string.len); |
return; |
case DEMANGLE_COMPONENT_RESTRICT: |
case DEMANGLE_COMPONENT_VOLATILE: |
case DEMANGLE_COMPONENT_CONST: |
{ |
struct d_print_mod *pdpm; |
/* When printing arrays, it's possible to have cases where the |
same CV-qualifier gets pushed on the stack multiple times. |
We only need to print it once. */ |
for (pdpm = dpi->modifiers; pdpm != NULL; pdpm = pdpm->next) |
{ |
if (! pdpm->printed) |
{ |
if (pdpm->mod->type != DEMANGLE_COMPONENT_RESTRICT |
&& pdpm->mod->type != DEMANGLE_COMPONENT_VOLATILE |
&& pdpm->mod->type != DEMANGLE_COMPONENT_CONST) |
break; |
if (pdpm->mod->type == dc->type) |
{ |
d_print_comp (dpi, options, d_left (dc)); |
return; |
} |
} |
} |
} |
goto modifier; |
case DEMANGLE_COMPONENT_REFERENCE: |
case DEMANGLE_COMPONENT_RVALUE_REFERENCE: |
{ |
/* Handle reference smashing: & + && = &. */ |
const struct demangle_component *sub = d_left (dc); |
if (sub->type == DEMANGLE_COMPONENT_TEMPLATE_PARAM) |
{ |
struct demangle_component *a = d_lookup_template_argument (dpi, sub); |
if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST) |
a = d_index_template_argument (a, dpi->pack_index); |
if (a == NULL) |
{ |
d_print_error (dpi); |
return; |
} |
sub = a; |
} |
if (sub->type == DEMANGLE_COMPONENT_REFERENCE |
|| sub->type == dc->type) |
dc = sub; |
else if (sub->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE) |
mod_inner = d_left (sub); |
} |
/* Fall through. */ |
case DEMANGLE_COMPONENT_RESTRICT_THIS: |
case DEMANGLE_COMPONENT_VOLATILE_THIS: |
case DEMANGLE_COMPONENT_CONST_THIS: |
case DEMANGLE_COMPONENT_REFERENCE_THIS: |
case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS: |
case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL: |
case DEMANGLE_COMPONENT_POINTER: |
case DEMANGLE_COMPONENT_COMPLEX: |
case DEMANGLE_COMPONENT_IMAGINARY: |
modifier: |
{ |
/* We keep a list of modifiers on the stack. */ |
struct d_print_mod dpm; |
dpm.next = dpi->modifiers; |
dpi->modifiers = &dpm; |
dpm.mod = dc; |
dpm.printed = 0; |
dpm.templates = dpi->templates; |
if (!mod_inner) |
mod_inner = d_left (dc); |
d_print_comp (dpi, options, mod_inner); |
/* If the modifier didn't get printed by the type, print it |
now. */ |
if (! dpm.printed) |
d_print_mod (dpi, options, dc); |
dpi->modifiers = dpm.next; |
return; |
} |
case DEMANGLE_COMPONENT_BUILTIN_TYPE: |
if ((options & DMGL_JAVA) == 0) |
d_append_buffer (dpi, dc->u.s_builtin.type->name, |
dc->u.s_builtin.type->len); |
else |
d_append_buffer (dpi, dc->u.s_builtin.type->java_name, |
dc->u.s_builtin.type->java_len); |
return; |
case DEMANGLE_COMPONENT_VENDOR_TYPE: |
d_print_comp (dpi, options, d_left (dc)); |
return; |
case DEMANGLE_COMPONENT_FUNCTION_TYPE: |
{ |
if ((options & DMGL_RET_POSTFIX) != 0) |
d_print_function_type (dpi, |
options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP), |
dc, dpi->modifiers); |
/* Print return type if present */ |
if (d_left (dc) != NULL && (options & DMGL_RET_POSTFIX) != 0) |
d_print_comp (dpi, options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP), |
d_left (dc)); |
else if (d_left (dc) != NULL && (options & DMGL_RET_DROP) == 0) |
{ |
struct d_print_mod dpm; |
/* We must pass this type down as a modifier in order to |
print it in the right location. */ |
dpm.next = dpi->modifiers; |
dpi->modifiers = &dpm; |
dpm.mod = dc; |
dpm.printed = 0; |
dpm.templates = dpi->templates; |
d_print_comp (dpi, options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP), |
d_left (dc)); |
dpi->modifiers = dpm.next; |
if (dpm.printed) |
return; |
/* In standard prefix notation, there is a space between the |
return type and the function signature. */ |
if ((options & DMGL_RET_POSTFIX) == 0) |
d_append_char (dpi, ' '); |
} |
if ((options & DMGL_RET_POSTFIX) == 0) |
d_print_function_type (dpi, |
options & ~(DMGL_RET_POSTFIX | DMGL_RET_DROP), |
dc, dpi->modifiers); |
return; |
} |
case DEMANGLE_COMPONENT_ARRAY_TYPE: |
{ |
struct d_print_mod *hold_modifiers; |
struct d_print_mod adpm[4]; |
unsigned int i; |
struct d_print_mod *pdpm; |
/* We must pass this type down as a modifier in order to print |
multi-dimensional arrays correctly. If the array itself is |
CV-qualified, we act as though the element type were |
CV-qualified. We do this by copying the modifiers down |
rather than fiddling pointers, so that we don't wind up |
with a d_print_mod higher on the stack pointing into our |
stack frame after we return. */ |
hold_modifiers = dpi->modifiers; |
adpm[0].next = hold_modifiers; |
dpi->modifiers = &adpm[0]; |
adpm[0].mod = dc; |
adpm[0].printed = 0; |
adpm[0].templates = dpi->templates; |
i = 1; |
pdpm = hold_modifiers; |
while (pdpm != NULL |
&& (pdpm->mod->type == DEMANGLE_COMPONENT_RESTRICT |
|| pdpm->mod->type == DEMANGLE_COMPONENT_VOLATILE |
|| pdpm->mod->type == DEMANGLE_COMPONENT_CONST)) |
{ |
if (! pdpm->printed) |
{ |
if (i >= sizeof adpm / sizeof adpm[0]) |
{ |
d_print_error (dpi); |
return; |
} |
adpm[i] = *pdpm; |
adpm[i].next = dpi->modifiers; |
dpi->modifiers = &adpm[i]; |
pdpm->printed = 1; |
++i; |
} |
pdpm = pdpm->next; |
} |
d_print_comp (dpi, options, d_right (dc)); |
dpi->modifiers = hold_modifiers; |
if (adpm[0].printed) |
return; |
while (i > 1) |
{ |
--i; |
d_print_mod (dpi, options, adpm[i].mod); |
} |
d_print_array_type (dpi, options, dc, dpi->modifiers); |
return; |
} |
case DEMANGLE_COMPONENT_PTRMEM_TYPE: |
case DEMANGLE_COMPONENT_VECTOR_TYPE: |
{ |
struct d_print_mod dpm; |
dpm.next = dpi->modifiers; |
dpi->modifiers = &dpm; |
dpm.mod = dc; |
dpm.printed = 0; |
dpm.templates = dpi->templates; |
d_print_comp (dpi, options, d_right (dc)); |
/* If the modifier didn't get printed by the type, print it |
now. */ |
if (! dpm.printed) |
d_print_mod (dpi, options, dc); |
dpi->modifiers = dpm.next; |
return; |
} |
case DEMANGLE_COMPONENT_FIXED_TYPE: |
if (dc->u.s_fixed.sat) |
d_append_string (dpi, "_Sat "); |
/* Don't print "int _Accum". */ |
if (dc->u.s_fixed.length->u.s_builtin.type |
!= &cplus_demangle_builtin_types['i'-'a']) |
{ |
d_print_comp (dpi, options, dc->u.s_fixed.length); |
d_append_char (dpi, ' '); |
} |
if (dc->u.s_fixed.accum) |
d_append_string (dpi, "_Accum"); |
else |
d_append_string (dpi, "_Fract"); |
return; |
case DEMANGLE_COMPONENT_ARGLIST: |
case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST: |
if (d_left (dc) != NULL) |
d_print_comp (dpi, options, d_left (dc)); |
if (d_right (dc) != NULL) |
{ |
size_t len; |
unsigned long int flush_count; |
/* Make sure ", " isn't flushed by d_append_string, otherwise |
dpi->len -= 2 wouldn't work. */ |
if (dpi->len >= sizeof (dpi->buf) - 2) |
d_print_flush (dpi); |
d_append_string (dpi, ", "); |
len = dpi->len; |
flush_count = dpi->flush_count; |
d_print_comp (dpi, options, d_right (dc)); |
/* If that didn't print anything (which can happen with empty |
template argument packs), remove the comma and space. */ |
if (dpi->flush_count == flush_count && dpi->len == len) |
dpi->len -= 2; |
} |
return; |
case DEMANGLE_COMPONENT_INITIALIZER_LIST: |
{ |
struct demangle_component *type = d_left (dc); |
struct demangle_component *list = d_right (dc); |
if (type) |
d_print_comp (dpi, options, type); |
d_append_char (dpi, '{'); |
d_print_comp (dpi, options, list); |
d_append_char (dpi, '}'); |
} |
return; |
case DEMANGLE_COMPONENT_OPERATOR: |
{ |
const struct demangle_operator_info *op = dc->u.s_operator.op; |
int len = op->len; |
d_append_string (dpi, "operator"); |
/* Add a space before new/delete. */ |
if (IS_LOWER (op->name[0])) |
d_append_char (dpi, ' '); |
/* Omit a trailing space. */ |
if (op->name[len-1] == ' ') |
--len; |
d_append_buffer (dpi, op->name, len); |
return; |
} |
case DEMANGLE_COMPONENT_EXTENDED_OPERATOR: |
d_append_string (dpi, "operator "); |
d_print_comp (dpi, options, dc->u.s_extended_operator.name); |
return; |
case DEMANGLE_COMPONENT_CAST: |
d_append_string (dpi, "operator "); |
d_print_cast (dpi, options, dc); |
return; |
case DEMANGLE_COMPONENT_NULLARY: |
d_print_expr_op (dpi, options, d_left (dc)); |
return; |
case DEMANGLE_COMPONENT_UNARY: |
{ |
struct demangle_component *op = d_left (dc); |
struct demangle_component *operand = d_right (dc); |
const char *code = NULL; |
if (op->type == DEMANGLE_COMPONENT_OPERATOR) |
{ |
code = op->u.s_operator.op->code; |
if (!strcmp (code, "ad")) |
{ |
/* Don't print the argument list for the address of a |
function. */ |
if (operand->type == DEMANGLE_COMPONENT_TYPED_NAME |
&& d_left (operand)->type == DEMANGLE_COMPONENT_QUAL_NAME |
&& d_right (operand)->type == DEMANGLE_COMPONENT_FUNCTION_TYPE) |
operand = d_left (operand); |
} |
if (operand->type == DEMANGLE_COMPONENT_BINARY_ARGS) |
{ |
/* This indicates a suffix operator. */ |
operand = d_left (operand); |
d_print_subexpr (dpi, options, operand); |
d_print_expr_op (dpi, options, op); |
return; |
} |
} |
if (op->type != DEMANGLE_COMPONENT_CAST) |
d_print_expr_op (dpi, options, op); |
else |
{ |
d_append_char (dpi, '('); |
d_print_cast (dpi, options, op); |
d_append_char (dpi, ')'); |
} |
if (code && !strcmp (code, "gs")) |
/* Avoid parens after '::'. */ |
d_print_comp (dpi, options, operand); |
else if (code && !strcmp (code, "st")) |
/* Always print parens for sizeof (type). */ |
{ |
d_append_char (dpi, '('); |
d_print_comp (dpi, options, operand); |
d_append_char (dpi, ')'); |
} |
else |
d_print_subexpr (dpi, options, operand); |
} |
return; |
case DEMANGLE_COMPONENT_BINARY: |
if (d_right (dc)->type != DEMANGLE_COMPONENT_BINARY_ARGS) |
{ |
d_print_error (dpi); |
return; |
} |
if (op_is_new_cast (d_left (dc))) |
{ |
d_print_expr_op (dpi, options, d_left (dc)); |
d_append_char (dpi, '<'); |
d_print_comp (dpi, options, d_left (d_right (dc))); |
d_append_string (dpi, ">("); |
d_print_comp (dpi, options, d_right (d_right (dc))); |
d_append_char (dpi, ')'); |
return; |
} |
/* We wrap an expression which uses the greater-than operator in |
an extra layer of parens so that it does not get confused |
with the '>' which ends the template parameters. */ |
if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR |
&& d_left (dc)->u.s_operator.op->len == 1 |
&& d_left (dc)->u.s_operator.op->name[0] == '>') |
d_append_char (dpi, '('); |
if (strcmp (d_left (dc)->u.s_operator.op->code, "cl") == 0 |
&& d_left (d_right (dc))->type == DEMANGLE_COMPONENT_TYPED_NAME) |
{ |
/* Function call used in an expression should not have printed types |
of the function arguments. Values of the function arguments still |
get printed below. */ |
const struct demangle_component *func = d_left (d_right (dc)); |
if (d_right (func)->type != DEMANGLE_COMPONENT_FUNCTION_TYPE) |
d_print_error (dpi); |
d_print_subexpr (dpi, options, d_left (func)); |
} |
else |
d_print_subexpr (dpi, options, d_left (d_right (dc))); |
if (strcmp (d_left (dc)->u.s_operator.op->code, "ix") == 0) |
{ |
d_append_char (dpi, '['); |
d_print_comp (dpi, options, d_right (d_right (dc))); |
d_append_char (dpi, ']'); |
} |
else |
{ |
if (strcmp (d_left (dc)->u.s_operator.op->code, "cl") != 0) |
d_print_expr_op (dpi, options, d_left (dc)); |
d_print_subexpr (dpi, options, d_right (d_right (dc))); |
} |
if (d_left (dc)->type == DEMANGLE_COMPONENT_OPERATOR |
&& d_left (dc)->u.s_operator.op->len == 1 |
&& d_left (dc)->u.s_operator.op->name[0] == '>') |
d_append_char (dpi, ')'); |
return; |
case DEMANGLE_COMPONENT_BINARY_ARGS: |
/* We should only see this as part of DEMANGLE_COMPONENT_BINARY. */ |
d_print_error (dpi); |
return; |
case DEMANGLE_COMPONENT_TRINARY: |
if (d_right (dc)->type != DEMANGLE_COMPONENT_TRINARY_ARG1 |
|| d_right (d_right (dc))->type != DEMANGLE_COMPONENT_TRINARY_ARG2) |
{ |
d_print_error (dpi); |
return; |
} |
{ |
struct demangle_component *op = d_left (dc); |
struct demangle_component *first = d_left (d_right (dc)); |
struct demangle_component *second = d_left (d_right (d_right (dc))); |
struct demangle_component *third = d_right (d_right (d_right (dc))); |
if (!strcmp (op->u.s_operator.op->code, "qu")) |
{ |
d_print_subexpr (dpi, options, first); |
d_print_expr_op (dpi, options, op); |
d_print_subexpr (dpi, options, second); |
d_append_string (dpi, " : "); |
d_print_subexpr (dpi, options, third); |
} |
else |
{ |
d_append_string (dpi, "new "); |
if (d_left (first) != NULL) |
{ |
d_print_subexpr (dpi, options, first); |
d_append_char (dpi, ' '); |
} |
d_print_comp (dpi, options, second); |
if (third) |
d_print_subexpr (dpi, options, third); |
} |
} |
return; |
case DEMANGLE_COMPONENT_TRINARY_ARG1: |
case DEMANGLE_COMPONENT_TRINARY_ARG2: |
/* We should only see these are part of DEMANGLE_COMPONENT_TRINARY. */ |
d_print_error (dpi); |
return; |
case DEMANGLE_COMPONENT_LITERAL: |
case DEMANGLE_COMPONENT_LITERAL_NEG: |
{ |
enum d_builtin_type_print tp; |
/* For some builtin types, produce simpler output. */ |
tp = D_PRINT_DEFAULT; |
if (d_left (dc)->type == DEMANGLE_COMPONENT_BUILTIN_TYPE) |
{ |
tp = d_left (dc)->u.s_builtin.type->print; |
switch (tp) |
{ |
case D_PRINT_INT: |
case D_PRINT_UNSIGNED: |
case D_PRINT_LONG: |
case D_PRINT_UNSIGNED_LONG: |
case D_PRINT_LONG_LONG: |
case D_PRINT_UNSIGNED_LONG_LONG: |
if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME) |
{ |
if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG) |
d_append_char (dpi, '-'); |
d_print_comp (dpi, options, d_right (dc)); |
switch (tp) |
{ |
default: |
break; |
case D_PRINT_UNSIGNED: |
d_append_char (dpi, 'u'); |
break; |
case D_PRINT_LONG: |
d_append_char (dpi, 'l'); |
break; |
case D_PRINT_UNSIGNED_LONG: |
d_append_string (dpi, "ul"); |
break; |
case D_PRINT_LONG_LONG: |
d_append_string (dpi, "ll"); |
break; |
case D_PRINT_UNSIGNED_LONG_LONG: |
d_append_string (dpi, "ull"); |
break; |
} |
return; |
} |
break; |
case D_PRINT_BOOL: |
if (d_right (dc)->type == DEMANGLE_COMPONENT_NAME |
&& d_right (dc)->u.s_name.len == 1 |
&& dc->type == DEMANGLE_COMPONENT_LITERAL) |
{ |
switch (d_right (dc)->u.s_name.s[0]) |
{ |
case '0': |
d_append_string (dpi, "false"); |
return; |
case '1': |
d_append_string (dpi, "true"); |
return; |
default: |
break; |
} |
} |
break; |
default: |
break; |
} |
} |
d_append_char (dpi, '('); |
d_print_comp (dpi, options, d_left (dc)); |
d_append_char (dpi, ')'); |
if (dc->type == DEMANGLE_COMPONENT_LITERAL_NEG) |
d_append_char (dpi, '-'); |
if (tp == D_PRINT_FLOAT) |
d_append_char (dpi, '['); |
d_print_comp (dpi, options, d_right (dc)); |
if (tp == D_PRINT_FLOAT) |
d_append_char (dpi, ']'); |
} |
return; |
case DEMANGLE_COMPONENT_NUMBER: |
d_append_num (dpi, dc->u.s_number.number); |
return; |
case DEMANGLE_COMPONENT_JAVA_RESOURCE: |
d_append_string (dpi, "java resource "); |
d_print_comp (dpi, options, d_left (dc)); |
return; |
case DEMANGLE_COMPONENT_COMPOUND_NAME: |
d_print_comp (dpi, options, d_left (dc)); |
d_print_comp (dpi, options, d_right (dc)); |
return; |
case DEMANGLE_COMPONENT_CHARACTER: |
d_append_char (dpi, dc->u.s_character.character); |
return; |
case DEMANGLE_COMPONENT_DECLTYPE: |
d_append_string (dpi, "decltype ("); |
d_print_comp (dpi, options, d_left (dc)); |
d_append_char (dpi, ')'); |
return; |
case DEMANGLE_COMPONENT_PACK_EXPANSION: |
{ |
int len; |
int i; |
struct demangle_component *a = d_find_pack (dpi, d_left (dc)); |
if (a == NULL) |
{ |
/* d_find_pack won't find anything if the only packs involved |
in this expansion are function parameter packs; in that |
case, just print the pattern and "...". */ |
d_print_subexpr (dpi, options, d_left (dc)); |
d_append_string (dpi, "..."); |
return; |
} |
len = d_pack_length (a); |
dc = d_left (dc); |
for (i = 0; i < len; ++i) |
{ |
dpi->pack_index = i; |
d_print_comp (dpi, options, dc); |
if (i < len-1) |
d_append_string (dpi, ", "); |
} |
} |
return; |
case DEMANGLE_COMPONENT_FUNCTION_PARAM: |
{ |
long num = dc->u.s_number.number; |
if (num == 0) |
d_append_string (dpi, "this"); |
else |
{ |
d_append_string (dpi, "{parm#"); |
d_append_num (dpi, num); |
d_append_char (dpi, '}'); |
} |
} |
return; |
case DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS: |
d_append_string (dpi, "global constructors keyed to "); |
d_print_comp (dpi, options, dc->u.s_binary.left); |
return; |
case DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS: |
d_append_string (dpi, "global destructors keyed to "); |
d_print_comp (dpi, options, dc->u.s_binary.left); |
return; |
case DEMANGLE_COMPONENT_LAMBDA: |
d_append_string (dpi, "{lambda("); |
d_print_comp (dpi, options, dc->u.s_unary_num.sub); |
d_append_string (dpi, ")#"); |
d_append_num (dpi, dc->u.s_unary_num.num + 1); |
d_append_char (dpi, '}'); |
return; |
case DEMANGLE_COMPONENT_UNNAMED_TYPE: |
d_append_string (dpi, "{unnamed type#"); |
d_append_num (dpi, dc->u.s_number.number + 1); |
d_append_char (dpi, '}'); |
return; |
case DEMANGLE_COMPONENT_CLONE: |
d_print_comp (dpi, options, d_left (dc)); |
d_append_string (dpi, " [clone "); |
d_print_comp (dpi, options, d_right (dc)); |
d_append_char (dpi, ']'); |
return; |
default: |
d_print_error (dpi); |
return; |
} |
} |
/* Print a Java dentifier. For Java we try to handle encoded extended |
Unicode characters. The C++ ABI doesn't mention Unicode encoding, |
so we don't it for C++. Characters are encoded as |
__U<hex-char>+_. */ |
static void |
d_print_java_identifier (struct d_print_info *dpi, const char *name, int len) |
{ |
const char *p; |
const char *end; |
end = name + len; |
for (p = name; p < end; ++p) |
{ |
if (end - p > 3 |
&& p[0] == '_' |
&& p[1] == '_' |
&& p[2] == 'U') |
{ |
unsigned long c; |
const char *q; |
c = 0; |
for (q = p + 3; q < end; ++q) |
{ |
int dig; |
if (IS_DIGIT (*q)) |
dig = *q - '0'; |
else if (*q >= 'A' && *q <= 'F') |
dig = *q - 'A' + 10; |
else if (*q >= 'a' && *q <= 'f') |
dig = *q - 'a' + 10; |
else |
break; |
c = c * 16 + dig; |
} |
/* If the Unicode character is larger than 256, we don't try |
to deal with it here. FIXME. */ |
if (q < end && *q == '_' && c < 256) |
{ |
d_append_char (dpi, c); |
p = q; |
continue; |
} |
} |
d_append_char (dpi, *p); |
} |
} |
/* Print a list of modifiers. SUFFIX is 1 if we are printing |
qualifiers on this after printing a function. */ |
static void |
d_print_mod_list (struct d_print_info *dpi, int options, |
struct d_print_mod *mods, int suffix) |
{ |
struct d_print_template *hold_dpt; |
if (mods == NULL || d_print_saw_error (dpi)) |
return; |
if (mods->printed |
|| (! suffix |
&& (mods->mod->type == DEMANGLE_COMPONENT_RESTRICT_THIS |
|| mods->mod->type == DEMANGLE_COMPONENT_VOLATILE_THIS |
|| mods->mod->type == DEMANGLE_COMPONENT_CONST_THIS |
|| mods->mod->type == DEMANGLE_COMPONENT_REFERENCE_THIS |
|| (mods->mod->type |
== DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS)))) |
{ |
d_print_mod_list (dpi, options, mods->next, suffix); |
return; |
} |
mods->printed = 1; |
hold_dpt = dpi->templates; |
dpi->templates = mods->templates; |
if (mods->mod->type == DEMANGLE_COMPONENT_FUNCTION_TYPE) |
{ |
d_print_function_type (dpi, options, mods->mod, mods->next); |
dpi->templates = hold_dpt; |
return; |
} |
else if (mods->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE) |
{ |
d_print_array_type (dpi, options, mods->mod, mods->next); |
dpi->templates = hold_dpt; |
return; |
} |
else if (mods->mod->type == DEMANGLE_COMPONENT_LOCAL_NAME) |
{ |
struct d_print_mod *hold_modifiers; |
struct demangle_component *dc; |
/* When this is on the modifier stack, we have pulled any |
qualifiers off the right argument already. Otherwise, we |
print it as usual, but don't let the left argument see any |
modifiers. */ |
hold_modifiers = dpi->modifiers; |
dpi->modifiers = NULL; |
d_print_comp (dpi, options, d_left (mods->mod)); |
dpi->modifiers = hold_modifiers; |
if ((options & DMGL_JAVA) == 0) |
d_append_string (dpi, "::"); |
else |
d_append_char (dpi, '.'); |
dc = d_right (mods->mod); |
if (dc->type == DEMANGLE_COMPONENT_DEFAULT_ARG) |
{ |
d_append_string (dpi, "{default arg#"); |
d_append_num (dpi, dc->u.s_unary_num.num + 1); |
d_append_string (dpi, "}::"); |
dc = dc->u.s_unary_num.sub; |
} |
while (dc->type == DEMANGLE_COMPONENT_RESTRICT_THIS |
|| dc->type == DEMANGLE_COMPONENT_VOLATILE_THIS |
|| dc->type == DEMANGLE_COMPONENT_CONST_THIS |
|| dc->type == DEMANGLE_COMPONENT_REFERENCE_THIS |
|| dc->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS) |
dc = d_left (dc); |
d_print_comp (dpi, options, dc); |
dpi->templates = hold_dpt; |
return; |
} |
d_print_mod (dpi, options, mods->mod); |
dpi->templates = hold_dpt; |
d_print_mod_list (dpi, options, mods->next, suffix); |
} |
/* Print a modifier. */ |
static void |
d_print_mod (struct d_print_info *dpi, int options, |
const struct demangle_component *mod) |
{ |
switch (mod->type) |
{ |
case DEMANGLE_COMPONENT_RESTRICT: |
case DEMANGLE_COMPONENT_RESTRICT_THIS: |
d_append_string (dpi, " restrict"); |
return; |
case DEMANGLE_COMPONENT_VOLATILE: |
case DEMANGLE_COMPONENT_VOLATILE_THIS: |
d_append_string (dpi, " volatile"); |
return; |
case DEMANGLE_COMPONENT_CONST: |
case DEMANGLE_COMPONENT_CONST_THIS: |
d_append_string (dpi, " const"); |
return; |
case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL: |
d_append_char (dpi, ' '); |
d_print_comp (dpi, options, d_right (mod)); |
return; |
case DEMANGLE_COMPONENT_POINTER: |
/* There is no pointer symbol in Java. */ |
if ((options & DMGL_JAVA) == 0) |
d_append_char (dpi, '*'); |
return; |
case DEMANGLE_COMPONENT_REFERENCE_THIS: |
/* For the ref-qualifier, put a space before the &. */ |
d_append_char (dpi, ' '); |
case DEMANGLE_COMPONENT_REFERENCE: |
d_append_char (dpi, '&'); |
return; |
case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS: |
d_append_char (dpi, ' '); |
case DEMANGLE_COMPONENT_RVALUE_REFERENCE: |
d_append_string (dpi, "&&"); |
return; |
case DEMANGLE_COMPONENT_COMPLEX: |
d_append_string (dpi, "complex "); |
return; |
case DEMANGLE_COMPONENT_IMAGINARY: |
d_append_string (dpi, "imaginary "); |
return; |
case DEMANGLE_COMPONENT_PTRMEM_TYPE: |
if (d_last_char (dpi) != '(') |
d_append_char (dpi, ' '); |
d_print_comp (dpi, options, d_left (mod)); |
d_append_string (dpi, "::*"); |
return; |
case DEMANGLE_COMPONENT_TYPED_NAME: |
d_print_comp (dpi, options, d_left (mod)); |
return; |
case DEMANGLE_COMPONENT_VECTOR_TYPE: |
d_append_string (dpi, " __vector("); |
d_print_comp (dpi, options, d_left (mod)); |
d_append_char (dpi, ')'); |
return; |
default: |
/* Otherwise, we have something that won't go back on the |
modifier stack, so we can just print it. */ |
d_print_comp (dpi, options, mod); |
return; |
} |
} |
/* Print a function type, except for the return type. */ |
static void |
d_print_function_type (struct d_print_info *dpi, int options, |
const struct demangle_component *dc, |
struct d_print_mod *mods) |
{ |
int need_paren; |
int need_space; |
struct d_print_mod *p; |
struct d_print_mod *hold_modifiers; |
need_paren = 0; |
need_space = 0; |
for (p = mods; p != NULL; p = p->next) |
{ |
if (p->printed) |
break; |
switch (p->mod->type) |
{ |
case DEMANGLE_COMPONENT_POINTER: |
case DEMANGLE_COMPONENT_REFERENCE: |
case DEMANGLE_COMPONENT_RVALUE_REFERENCE: |
need_paren = 1; |
break; |
case DEMANGLE_COMPONENT_RESTRICT: |
case DEMANGLE_COMPONENT_VOLATILE: |
case DEMANGLE_COMPONENT_CONST: |
case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL: |
case DEMANGLE_COMPONENT_COMPLEX: |
case DEMANGLE_COMPONENT_IMAGINARY: |
case DEMANGLE_COMPONENT_PTRMEM_TYPE: |
need_space = 1; |
need_paren = 1; |
break; |
case DEMANGLE_COMPONENT_RESTRICT_THIS: |
case DEMANGLE_COMPONENT_VOLATILE_THIS: |
case DEMANGLE_COMPONENT_CONST_THIS: |
case DEMANGLE_COMPONENT_REFERENCE_THIS: |
case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS: |
break; |
default: |
break; |
} |
if (need_paren) |
break; |
} |
if (need_paren) |
{ |
if (! need_space) |
{ |
if (d_last_char (dpi) != '(' |
&& d_last_char (dpi) != '*') |
need_space = 1; |
} |
if (need_space && d_last_char (dpi) != ' ') |
d_append_char (dpi, ' '); |
d_append_char (dpi, '('); |
} |
hold_modifiers = dpi->modifiers; |
dpi->modifiers = NULL; |
d_print_mod_list (dpi, options, mods, 0); |
if (need_paren) |
d_append_char (dpi, ')'); |
d_append_char (dpi, '('); |
if (d_right (dc) != NULL) |
d_print_comp (dpi, options, d_right (dc)); |
d_append_char (dpi, ')'); |
d_print_mod_list (dpi, options, mods, 1); |
dpi->modifiers = hold_modifiers; |
} |
/* Print an array type, except for the element type. */ |
static void |
d_print_array_type (struct d_print_info *dpi, int options, |
const struct demangle_component *dc, |
struct d_print_mod *mods) |
{ |
int need_space; |
need_space = 1; |
if (mods != NULL) |
{ |
int need_paren; |
struct d_print_mod *p; |
need_paren = 0; |
for (p = mods; p != NULL; p = p->next) |
{ |
if (! p->printed) |
{ |
if (p->mod->type == DEMANGLE_COMPONENT_ARRAY_TYPE) |
{ |
need_space = 0; |
break; |
} |
else |
{ |
need_paren = 1; |
need_space = 1; |
break; |
} |
} |
} |
if (need_paren) |
d_append_string (dpi, " ("); |
d_print_mod_list (dpi, options, mods, 0); |
if (need_paren) |
d_append_char (dpi, ')'); |
} |
if (need_space) |
d_append_char (dpi, ' '); |
d_append_char (dpi, '['); |
if (d_left (dc) != NULL) |
d_print_comp (dpi, options, d_left (dc)); |
d_append_char (dpi, ']'); |
} |
/* Print an operator in an expression. */ |
static void |
d_print_expr_op (struct d_print_info *dpi, int options, |
const struct demangle_component *dc) |
{ |
if (dc->type == DEMANGLE_COMPONENT_OPERATOR) |
d_append_buffer (dpi, dc->u.s_operator.op->name, |
dc->u.s_operator.op->len); |
else |
d_print_comp (dpi, options, dc); |
} |
/* Print a cast. */ |
static void |
d_print_cast (struct d_print_info *dpi, int options, |
const struct demangle_component *dc) |
{ |
if (d_left (dc)->type != DEMANGLE_COMPONENT_TEMPLATE) |
d_print_comp (dpi, options, d_left (dc)); |
else |
{ |
struct d_print_mod *hold_dpm; |
struct d_print_template dpt; |
/* It appears that for a templated cast operator, we need to put |
the template parameters in scope for the operator name, but |
not for the parameters. The effect is that we need to handle |
the template printing here. */ |
hold_dpm = dpi->modifiers; |
dpi->modifiers = NULL; |
dpt.next = dpi->templates; |
dpi->templates = &dpt; |
dpt.template_decl = d_left (dc); |
d_print_comp (dpi, options, d_left (d_left (dc))); |
dpi->templates = dpt.next; |
if (d_last_char (dpi) == '<') |
d_append_char (dpi, ' '); |
d_append_char (dpi, '<'); |
d_print_comp (dpi, options, d_right (d_left (dc))); |
/* Avoid generating two consecutive '>' characters, to avoid |
the C++ syntactic ambiguity. */ |
if (d_last_char (dpi) == '>') |
d_append_char (dpi, ' '); |
d_append_char (dpi, '>'); |
dpi->modifiers = hold_dpm; |
} |
} |
/* Initialize the information structure we use to pass around |
information. */ |
CP_STATIC_IF_GLIBCPP_V3 |
void |
cplus_demangle_init_info (const char *mangled, int options, size_t len, |
struct d_info *di) |
{ |
di->s = mangled; |
di->send = mangled + len; |
di->options = options; |
di->n = mangled; |
/* We can not need more components than twice the number of chars in |
the mangled string. Most components correspond directly to |
chars, but the ARGLIST types are exceptions. */ |
di->num_comps = 2 * len; |
di->next_comp = 0; |
/* Similarly, we can not need more substitutions than there are |
chars in the mangled string. */ |
di->num_subs = len; |
di->next_sub = 0; |
di->did_subs = 0; |
di->last_name = NULL; |
di->expansion = 0; |
} |
/* Internal implementation for the demangler. If MANGLED is a g++ v3 ABI |
mangled name, return strings in repeated callback giving the demangled |
name. OPTIONS is the usual libiberty demangler options. On success, |
this returns 1. On failure, returns 0. */ |
static int |
d_demangle_callback (const char *mangled, int options, |
demangle_callbackref callback, void *opaque) |
{ |
enum |
{ |
DCT_TYPE, |
DCT_MANGLED, |
DCT_GLOBAL_CTORS, |
DCT_GLOBAL_DTORS |
} |
type; |
struct d_info di; |
struct demangle_component *dc; |
int status; |
if (mangled[0] == '_' && mangled[1] == 'Z') |
type = DCT_MANGLED; |
else if (strncmp (mangled, "_GLOBAL_", 8) == 0 |
&& (mangled[8] == '.' || mangled[8] == '_' || mangled[8] == '$') |
&& (mangled[9] == 'D' || mangled[9] == 'I') |
&& mangled[10] == '_') |
type = mangled[9] == 'I' ? DCT_GLOBAL_CTORS : DCT_GLOBAL_DTORS; |
else |
{ |
if ((options & DMGL_TYPES) == 0) |
return 0; |
type = DCT_TYPE; |
} |
cplus_demangle_init_info (mangled, options, strlen (mangled), &di); |
{ |
#ifdef CP_DYNAMIC_ARRAYS |
__extension__ struct demangle_component comps[di.num_comps]; |
__extension__ struct demangle_component *subs[di.num_subs]; |
di.comps = comps; |
di.subs = subs; |
#else |
di.comps = alloca (di.num_comps * sizeof (*di.comps)); |
di.subs = alloca (di.num_subs * sizeof (*di.subs)); |
#endif |
switch (type) |
{ |
case DCT_TYPE: |
dc = cplus_demangle_type (&di); |
break; |
case DCT_MANGLED: |
dc = cplus_demangle_mangled_name (&di, 1); |
break; |
case DCT_GLOBAL_CTORS: |
case DCT_GLOBAL_DTORS: |
d_advance (&di, 11); |
dc = d_make_comp (&di, |
(type == DCT_GLOBAL_CTORS |
? DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS |
: DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS), |
d_make_demangle_mangled_name (&di, d_str (&di)), |
NULL); |
d_advance (&di, strlen (d_str (&di))); |
break; |
} |
/* If DMGL_PARAMS is set, then if we didn't consume the entire |
mangled string, then we didn't successfully demangle it. If |
DMGL_PARAMS is not set, we didn't look at the trailing |
parameters. */ |
if (((options & DMGL_PARAMS) != 0) && d_peek_char (&di) != '\0') |
dc = NULL; |
#ifdef CP_DEMANGLE_DEBUG |
d_dump (dc, 0); |
#endif |
status = (dc != NULL) |
? cplus_demangle_print_callback (options, dc, callback, opaque) |
: 0; |
} |
return status; |
} |
/* Entry point for the demangler. If MANGLED is a g++ v3 ABI mangled |
name, return a buffer allocated with malloc holding the demangled |
name. OPTIONS is the usual libiberty demangler options. On |
success, this sets *PALC to the allocated size of the returned |
buffer. On failure, this sets *PALC to 0 for a bad name, or 1 for |
a memory allocation failure, and returns NULL. */ |
static char * |
d_demangle (const char *mangled, int options, size_t *palc) |
{ |
struct d_growable_string dgs; |
int status; |
d_growable_string_init (&dgs, 0); |
status = d_demangle_callback (mangled, options, |
d_growable_string_callback_adapter, &dgs); |
if (status == 0) |
{ |
free (dgs.buf); |
*palc = 0; |
return NULL; |
} |
*palc = dgs.allocation_failure ? 1 : dgs.alc; |
return dgs.buf; |
} |
#if defined(IN_LIBGCC2) || defined(IN_GLIBCPP_V3) |
extern char *__cxa_demangle (const char *, char *, size_t *, int *); |
/* ia64 ABI-mandated entry point in the C++ runtime library for |
performing demangling. MANGLED_NAME is a NUL-terminated character |
string containing the name to be demangled. |
OUTPUT_BUFFER is a region of memory, allocated with malloc, of |
*LENGTH bytes, into which the demangled name is stored. If |
OUTPUT_BUFFER is not long enough, it is expanded using realloc. |
OUTPUT_BUFFER may instead be NULL; in that case, the demangled name |
is placed in a region of memory allocated with malloc. |
If LENGTH is non-NULL, the length of the buffer containing the |
demangled name, is placed in *LENGTH. |
The return value is a pointer to the start of the NUL-terminated |
demangled name, or NULL if the demangling fails. The caller is |
responsible for deallocating this memory using free. |
*STATUS is set to one of the following values: |
0: The demangling operation succeeded. |
-1: A memory allocation failure occurred. |
-2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules. |
-3: One of the arguments is invalid. |
The demangling is performed using the C++ ABI mangling rules, with |
GNU extensions. */ |
char * |
__cxa_demangle (const char *mangled_name, char *output_buffer, |
size_t *length, int *status) |
{ |
char *demangled; |
size_t alc; |
if (mangled_name == NULL) |
{ |
if (status != NULL) |
*status = -3; |
return NULL; |
} |
if (output_buffer != NULL && length == NULL) |
{ |
if (status != NULL) |
*status = -3; |
return NULL; |
} |
demangled = d_demangle (mangled_name, DMGL_PARAMS | DMGL_TYPES, &alc); |
if (demangled == NULL) |
{ |
if (status != NULL) |
{ |
if (alc == 1) |
*status = -1; |
else |
*status = -2; |
} |
return NULL; |
} |
if (output_buffer == NULL) |
{ |
if (length != NULL) |
*length = alc; |
} |
else |
{ |
if (strlen (demangled) < *length) |
{ |
strcpy (output_buffer, demangled); |
free (demangled); |
demangled = output_buffer; |
} |
else |
{ |
free (output_buffer); |
*length = alc; |
} |
} |
if (status != NULL) |
*status = 0; |
return demangled; |
} |
extern int __gcclibcxx_demangle_callback (const char *, |
void (*) |
(const char *, size_t, void *), |
void *); |
/* Alternative, allocationless entry point in the C++ runtime library |
for performing demangling. MANGLED_NAME is a NUL-terminated character |
string containing the name to be demangled. |
CALLBACK is a callback function, called with demangled string |
segments as demangling progresses; it is called at least once, |
but may be called more than once. OPAQUE is a generalized pointer |
used as a callback argument. |
The return code is one of the following values, equivalent to |
the STATUS values of __cxa_demangle() (excluding -1, since this |
function performs no memory allocations): |
0: The demangling operation succeeded. |
-2: MANGLED_NAME is not a valid name under the C++ ABI mangling rules. |
-3: One of the arguments is invalid. |
The demangling is performed using the C++ ABI mangling rules, with |
GNU extensions. */ |
int |
__gcclibcxx_demangle_callback (const char *mangled_name, |
void (*callback) (const char *, size_t, void *), |
void *opaque) |
{ |
int status; |
if (mangled_name == NULL || callback == NULL) |
return -3; |
status = d_demangle_callback (mangled_name, DMGL_PARAMS | DMGL_TYPES, |
callback, opaque); |
if (status == 0) |
return -2; |
return 0; |
} |
#else /* ! (IN_LIBGCC2 || IN_GLIBCPP_V3) */ |
/* Entry point for libiberty demangler. If MANGLED is a g++ v3 ABI |
mangled name, return a buffer allocated with malloc holding the |
demangled name. Otherwise, return NULL. */ |
char * |
cplus_demangle_v3 (const char *mangled, int options) |
{ |
size_t alc; |
return d_demangle (mangled, options, &alc); |
} |
int |
cplus_demangle_v3_callback (const char *mangled, int options, |
demangle_callbackref callback, void *opaque) |
{ |
return d_demangle_callback (mangled, options, callback, opaque); |
} |
/* Demangle a Java symbol. Java uses a subset of the V3 ABI C++ mangling |
conventions, but the output formatting is a little different. |
This instructs the C++ demangler not to emit pointer characters ("*"), to |
use Java's namespace separator symbol ("." instead of "::"), and to output |
JArray<TYPE> as TYPE[]. */ |
char * |
java_demangle_v3 (const char *mangled) |
{ |
size_t alc; |
return d_demangle (mangled, DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX, &alc); |
} |
int |
java_demangle_v3_callback (const char *mangled, |
demangle_callbackref callback, void *opaque) |
{ |
return d_demangle_callback (mangled, |
DMGL_JAVA | DMGL_PARAMS | DMGL_RET_POSTFIX, |
callback, opaque); |
} |
#endif /* IN_LIBGCC2 || IN_GLIBCPP_V3 */ |
#ifndef IN_GLIBCPP_V3 |
/* Demangle a string in order to find out whether it is a constructor |
or destructor. Return non-zero on success. Set *CTOR_KIND and |
*DTOR_KIND appropriately. */ |
static int |
is_ctor_or_dtor (const char *mangled, |
enum gnu_v3_ctor_kinds *ctor_kind, |
enum gnu_v3_dtor_kinds *dtor_kind) |
{ |
struct d_info di; |
struct demangle_component *dc; |
int ret; |
*ctor_kind = (enum gnu_v3_ctor_kinds) 0; |
*dtor_kind = (enum gnu_v3_dtor_kinds) 0; |
cplus_demangle_init_info (mangled, DMGL_GNU_V3, strlen (mangled), &di); |
{ |
#ifdef CP_DYNAMIC_ARRAYS |
__extension__ struct demangle_component comps[di.num_comps]; |
__extension__ struct demangle_component *subs[di.num_subs]; |
di.comps = comps; |
di.subs = subs; |
#else |
di.comps = alloca (di.num_comps * sizeof (*di.comps)); |
di.subs = alloca (di.num_subs * sizeof (*di.subs)); |
#endif |
dc = cplus_demangle_mangled_name (&di, 1); |
/* Note that because we did not pass DMGL_PARAMS, we don't expect |
to demangle the entire string. */ |
ret = 0; |
while (dc != NULL) |
{ |
switch (dc->type) |
{ |
/* These cannot appear on a constructor or destructor. */ |
case DEMANGLE_COMPONENT_RESTRICT_THIS: |
case DEMANGLE_COMPONENT_VOLATILE_THIS: |
case DEMANGLE_COMPONENT_CONST_THIS: |
case DEMANGLE_COMPONENT_REFERENCE_THIS: |
case DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS: |
default: |
dc = NULL; |
break; |
case DEMANGLE_COMPONENT_TYPED_NAME: |
case DEMANGLE_COMPONENT_TEMPLATE: |
dc = d_left (dc); |
break; |
case DEMANGLE_COMPONENT_QUAL_NAME: |
case DEMANGLE_COMPONENT_LOCAL_NAME: |
dc = d_right (dc); |
break; |
case DEMANGLE_COMPONENT_CTOR: |
*ctor_kind = dc->u.s_ctor.kind; |
ret = 1; |
dc = NULL; |
break; |
case DEMANGLE_COMPONENT_DTOR: |
*dtor_kind = dc->u.s_dtor.kind; |
ret = 1; |
dc = NULL; |
break; |
} |
} |
} |
return ret; |
} |
/* Return whether NAME is the mangled form of a g++ V3 ABI constructor |
name. A non-zero return indicates the type of constructor. */ |
enum gnu_v3_ctor_kinds |
is_gnu_v3_mangled_ctor (const char *name) |
{ |
enum gnu_v3_ctor_kinds ctor_kind; |
enum gnu_v3_dtor_kinds dtor_kind; |
if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind)) |
return (enum gnu_v3_ctor_kinds) 0; |
return ctor_kind; |
} |
/* Return whether NAME is the mangled form of a g++ V3 ABI destructor |
name. A non-zero return indicates the type of destructor. */ |
enum gnu_v3_dtor_kinds |
is_gnu_v3_mangled_dtor (const char *name) |
{ |
enum gnu_v3_ctor_kinds ctor_kind; |
enum gnu_v3_dtor_kinds dtor_kind; |
if (! is_ctor_or_dtor (name, &ctor_kind, &dtor_kind)) |
return (enum gnu_v3_dtor_kinds) 0; |
return dtor_kind; |
} |
#endif /* IN_GLIBCPP_V3 */ |
#ifdef STANDALONE_DEMANGLER |
#include "getopt.h" |
#include "dyn-string.h" |
static void print_usage (FILE* fp, int exit_value); |
#define IS_ALPHA(CHAR) \ |
(((CHAR) >= 'a' && (CHAR) <= 'z') \ |
|| ((CHAR) >= 'A' && (CHAR) <= 'Z')) |
/* Non-zero if CHAR is a character than can occur in a mangled name. */ |
#define is_mangled_char(CHAR) \ |
(IS_ALPHA (CHAR) || IS_DIGIT (CHAR) \ |
|| (CHAR) == '_' || (CHAR) == '.' || (CHAR) == '$') |
/* The name of this program, as invoked. */ |
const char* program_name; |
/* Prints usage summary to FP and then exits with EXIT_VALUE. */ |
static void |
print_usage (FILE* fp, int exit_value) |
{ |
fprintf (fp, "Usage: %s [options] [names ...]\n", program_name); |
fprintf (fp, "Options:\n"); |
fprintf (fp, " -h,--help Display this message.\n"); |
fprintf (fp, " -p,--no-params Don't display function parameters\n"); |
fprintf (fp, " -v,--verbose Produce verbose demanglings.\n"); |
fprintf (fp, "If names are provided, they are demangled. Otherwise filters standard input.\n"); |
exit (exit_value); |
} |
/* Option specification for getopt_long. */ |
static const struct option long_options[] = |
{ |
{ "help", no_argument, NULL, 'h' }, |
{ "no-params", no_argument, NULL, 'p' }, |
{ "verbose", no_argument, NULL, 'v' }, |
{ NULL, no_argument, NULL, 0 }, |
}; |
/* Main entry for a demangling filter executable. It will demangle |
its command line arguments, if any. If none are provided, it will |
filter stdin to stdout, replacing any recognized mangled C++ names |
with their demangled equivalents. */ |
int |
main (int argc, char *argv[]) |
{ |
int i; |
int opt_char; |
int options = DMGL_PARAMS | DMGL_ANSI | DMGL_TYPES; |
/* Use the program name of this program, as invoked. */ |
program_name = argv[0]; |
/* Parse options. */ |
do |
{ |
opt_char = getopt_long (argc, argv, "hpv", long_options, NULL); |
switch (opt_char) |
{ |
case '?': /* Unrecognized option. */ |
print_usage (stderr, 1); |
break; |
case 'h': |
print_usage (stdout, 0); |
break; |
case 'p': |
options &= ~ DMGL_PARAMS; |
break; |
case 'v': |
options |= DMGL_VERBOSE; |
break; |
} |
} |
while (opt_char != -1); |
if (optind == argc) |
/* No command line arguments were provided. Filter stdin. */ |
{ |
dyn_string_t mangled = dyn_string_new (3); |
char *s; |
/* Read all of input. */ |
while (!feof (stdin)) |
{ |
char c; |
/* Pile characters into mangled until we hit one that can't |
occur in a mangled name. */ |
c = getchar (); |
while (!feof (stdin) && is_mangled_char (c)) |
{ |
dyn_string_append_char (mangled, c); |
if (feof (stdin)) |
break; |
c = getchar (); |
} |
if (dyn_string_length (mangled) > 0) |
{ |
#ifdef IN_GLIBCPP_V3 |
s = __cxa_demangle (dyn_string_buf (mangled), NULL, NULL, NULL); |
#else |
s = cplus_demangle_v3 (dyn_string_buf (mangled), options); |
#endif |
if (s != NULL) |
{ |
fputs (s, stdout); |
free (s); |
} |
else |
{ |
/* It might not have been a mangled name. Print the |
original text. */ |
fputs (dyn_string_buf (mangled), stdout); |
} |
dyn_string_clear (mangled); |
} |
/* If we haven't hit EOF yet, we've read one character that |
can't occur in a mangled name, so print it out. */ |
if (!feof (stdin)) |
putchar (c); |
} |
dyn_string_delete (mangled); |
} |
else |
/* Demangle command line arguments. */ |
{ |
/* Loop over command line arguments. */ |
for (i = optind; i < argc; ++i) |
{ |
char *s; |
#ifdef IN_GLIBCPP_V3 |
int status; |
#endif |
/* Attempt to demangle. */ |
#ifdef IN_GLIBCPP_V3 |
s = __cxa_demangle (argv[i], NULL, NULL, &status); |
#else |
s = cplus_demangle_v3 (argv[i], options); |
#endif |
/* If it worked, print the demangled name. */ |
if (s != NULL) |
{ |
printf ("%s\n", s); |
free (s); |
} |
else |
{ |
#ifdef IN_GLIBCPP_V3 |
fprintf (stderr, "Failed: %s (status %d)\n", argv[i], status); |
#else |
fprintf (stderr, "Failed: %s\n", argv[i]); |
#endif |
} |
} |
} |
return 0; |
} |
#endif /* STANDALONE_DEMANGLER */ |
/contrib/toolchain/binutils/libiberty/cp-demangle.h |
---|
0,0 → 1,169 |
/* Internal demangler interface for g++ V3 ABI. |
Copyright (C) 2003, 2004, 2005, 2006, 2007, 2010 |
Free Software Foundation, Inc. |
Written by Ian Lance Taylor <ian@wasabisystems.com>. |
This file is part of the libiberty library, which is part of GCC. |
This file is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2 of the License, or |
(at your option) any later version. |
In addition to the permissions in the GNU General Public License, the |
Free Software Foundation gives you unlimited permission to link the |
compiled version of this file into combinations with other programs, |
and to distribute those combinations without any restriction coming |
from the use of this file. (The General Public License restrictions |
do apply in other respects; for example, they cover modification of |
the file, and distribution when not linked into a combined |
executable.) |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. |
*/ |
/* This file provides some definitions shared by cp-demangle.c and |
cp-demint.c. It should not be included by any other files. */ |
/* Information we keep for operators. */ |
struct demangle_operator_info |
{ |
/* Mangled name. */ |
const char *code; |
/* Real name. */ |
const char *name; |
/* Length of real name. */ |
int len; |
/* Number of arguments. */ |
int args; |
}; |
/* How to print the value of a builtin type. */ |
enum d_builtin_type_print |
{ |
/* Print as (type)val. */ |
D_PRINT_DEFAULT, |
/* Print as integer. */ |
D_PRINT_INT, |
/* Print as unsigned integer, with trailing "u". */ |
D_PRINT_UNSIGNED, |
/* Print as long, with trailing "l". */ |
D_PRINT_LONG, |
/* Print as unsigned long, with trailing "ul". */ |
D_PRINT_UNSIGNED_LONG, |
/* Print as long long, with trailing "ll". */ |
D_PRINT_LONG_LONG, |
/* Print as unsigned long long, with trailing "ull". */ |
D_PRINT_UNSIGNED_LONG_LONG, |
/* Print as bool. */ |
D_PRINT_BOOL, |
/* Print as float--put value in square brackets. */ |
D_PRINT_FLOAT, |
/* Print in usual way, but here to detect void. */ |
D_PRINT_VOID |
}; |
/* Information we keep for a builtin type. */ |
struct demangle_builtin_type_info |
{ |
/* Type name. */ |
const char *name; |
/* Length of type name. */ |
int len; |
/* Type name when using Java. */ |
const char *java_name; |
/* Length of java name. */ |
int java_len; |
/* How to print a value of this type. */ |
enum d_builtin_type_print print; |
}; |
/* The information structure we pass around. */ |
struct d_info |
{ |
/* The string we are demangling. */ |
const char *s; |
/* The end of the string we are demangling. */ |
const char *send; |
/* The options passed to the demangler. */ |
int options; |
/* The next character in the string to consider. */ |
const char *n; |
/* The array of components. */ |
struct demangle_component *comps; |
/* The index of the next available component. */ |
int next_comp; |
/* The number of available component structures. */ |
int num_comps; |
/* The array of substitutions. */ |
struct demangle_component **subs; |
/* The index of the next substitution. */ |
int next_sub; |
/* The number of available entries in the subs array. */ |
int num_subs; |
/* The number of substitutions which we actually made from the subs |
array, plus the number of template parameter references we |
saw. */ |
int did_subs; |
/* The last name we saw, for constructors and destructors. */ |
struct demangle_component *last_name; |
/* A running total of the length of large expansions from the |
mangled name to the demangled name, such as standard |
substitutions and builtin types. */ |
int expansion; |
}; |
/* To avoid running past the ending '\0', don't: |
- call d_peek_next_char if d_peek_char returned '\0' |
- call d_advance with an 'i' that is too large |
- call d_check_char(di, '\0') |
Everything else is safe. */ |
#define d_peek_char(di) (*((di)->n)) |
#define d_peek_next_char(di) ((di)->n[1]) |
#define d_advance(di, i) ((di)->n += (i)) |
#define d_check_char(di, c) (d_peek_char(di) == c ? ((di)->n++, 1) : 0) |
#define d_next_char(di) (d_peek_char(di) == '\0' ? '\0' : *((di)->n++)) |
#define d_str(di) ((di)->n) |
/* Functions and arrays in cp-demangle.c which are referenced by |
functions in cp-demint.c. */ |
#ifdef IN_GLIBCPP_V3 |
#define CP_STATIC_IF_GLIBCPP_V3 static |
#else |
#define CP_STATIC_IF_GLIBCPP_V3 extern |
#endif |
#ifndef IN_GLIBCPP_V3 |
extern const struct demangle_operator_info cplus_demangle_operators[]; |
#endif |
#define D_BUILTIN_TYPE_COUNT (33) |
CP_STATIC_IF_GLIBCPP_V3 |
const struct demangle_builtin_type_info |
cplus_demangle_builtin_types[D_BUILTIN_TYPE_COUNT]; |
CP_STATIC_IF_GLIBCPP_V3 |
struct demangle_component * |
cplus_demangle_mangled_name (struct d_info *, int); |
CP_STATIC_IF_GLIBCPP_V3 |
struct demangle_component * |
cplus_demangle_type (struct d_info *); |
extern void |
cplus_demangle_init_info (const char *, int, size_t, struct d_info *); |
/* cp-demangle.c needs to define this a little differently */ |
#undef CP_STATIC_IF_GLIBCPP_V3 |
/contrib/toolchain/binutils/libiberty/cp-demint.c |
---|
0,0 → 1,232 |
/* Demangler component interface functions. |
Copyright (C) 2004 Free Software Foundation, Inc. |
Written by Ian Lance Taylor <ian@wasabisystems.com>. |
This file is part of the libiberty library, which is part of GCC. |
This file is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2 of the License, or |
(at your option) any later version. |
In addition to the permissions in the GNU General Public License, the |
Free Software Foundation gives you unlimited permission to link the |
compiled version of this file into combinations with other programs, |
and to distribute those combinations without any restriction coming |
from the use of this file. (The General Public License restrictions |
do apply in other respects; for example, they cover modification of |
the file, and distribution when not linked into a combined |
executable.) |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. |
*/ |
/* This file implements a few interface functions which are provided |
for use with struct demangle_component trees. These functions are |
declared in demangle.h. These functions are closely tied to the |
demangler code in cp-demangle.c, and other interface functions can |
be found in that file. We put these functions in a separate file |
because they are not needed by the demangler, and so we avoid |
having them pulled in by programs which only need the |
demangler. */ |
#ifdef HAVE_CONFIG_H |
#include "config.h" |
#endif |
#ifdef HAVE_STDLIB_H |
#include <stdlib.h> |
#endif |
#ifdef HAVE_STRING_H |
#include <string.h> |
#endif |
#include "ansidecl.h" |
#include "libiberty.h" |
#include "demangle.h" |
#include "cp-demangle.h" |
/* Fill in most component types. */ |
int |
cplus_demangle_fill_component (struct demangle_component *p, |
enum demangle_component_type type, |
struct demangle_component *left, |
struct demangle_component *right) |
{ |
if (p == NULL) |
return 0; |
switch (type) |
{ |
case DEMANGLE_COMPONENT_QUAL_NAME: |
case DEMANGLE_COMPONENT_LOCAL_NAME: |
case DEMANGLE_COMPONENT_TYPED_NAME: |
case DEMANGLE_COMPONENT_TEMPLATE: |
case DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE: |
case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL: |
case DEMANGLE_COMPONENT_FUNCTION_TYPE: |
case DEMANGLE_COMPONENT_ARRAY_TYPE: |
case DEMANGLE_COMPONENT_PTRMEM_TYPE: |
case DEMANGLE_COMPONENT_ARGLIST: |
case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST: |
case DEMANGLE_COMPONENT_UNARY: |
case DEMANGLE_COMPONENT_BINARY: |
case DEMANGLE_COMPONENT_BINARY_ARGS: |
case DEMANGLE_COMPONENT_TRINARY: |
case DEMANGLE_COMPONENT_TRINARY_ARG1: |
case DEMANGLE_COMPONENT_TRINARY_ARG2: |
case DEMANGLE_COMPONENT_LITERAL: |
case DEMANGLE_COMPONENT_LITERAL_NEG: |
break; |
/* These component types only have one subtree. */ |
case DEMANGLE_COMPONENT_VTABLE: |
case DEMANGLE_COMPONENT_VTT: |
case DEMANGLE_COMPONENT_TYPEINFO: |
case DEMANGLE_COMPONENT_TYPEINFO_NAME: |
case DEMANGLE_COMPONENT_TYPEINFO_FN: |
case DEMANGLE_COMPONENT_THUNK: |
case DEMANGLE_COMPONENT_VIRTUAL_THUNK: |
case DEMANGLE_COMPONENT_COVARIANT_THUNK: |
case DEMANGLE_COMPONENT_JAVA_CLASS: |
case DEMANGLE_COMPONENT_GUARD: |
case DEMANGLE_COMPONENT_REFTEMP: |
case DEMANGLE_COMPONENT_RESTRICT: |
case DEMANGLE_COMPONENT_VOLATILE: |
case DEMANGLE_COMPONENT_CONST: |
case DEMANGLE_COMPONENT_RESTRICT_THIS: |
case DEMANGLE_COMPONENT_VOLATILE_THIS: |
case DEMANGLE_COMPONENT_CONST_THIS: |
case DEMANGLE_COMPONENT_POINTER: |
case DEMANGLE_COMPONENT_REFERENCE: |
case DEMANGLE_COMPONENT_COMPLEX: |
case DEMANGLE_COMPONENT_IMAGINARY: |
case DEMANGLE_COMPONENT_VENDOR_TYPE: |
case DEMANGLE_COMPONENT_CAST: |
if (right != NULL) |
return 0; |
break; |
default: |
/* Other types do not use subtrees. */ |
return 0; |
} |
p->type = type; |
p->u.s_binary.left = left; |
p->u.s_binary.right = right; |
return 1; |
} |
/* Fill in a DEMANGLE_COMPONENT_BUILTIN_TYPE. */ |
int |
cplus_demangle_fill_builtin_type (struct demangle_component *p, |
const char *type_name) |
{ |
int len; |
unsigned int i; |
if (p == NULL || type_name == NULL) |
return 0; |
len = strlen (type_name); |
for (i = 0; i < D_BUILTIN_TYPE_COUNT; ++i) |
{ |
if (len == cplus_demangle_builtin_types[i].len |
&& strcmp (type_name, cplus_demangle_builtin_types[i].name) == 0) |
{ |
p->type = DEMANGLE_COMPONENT_BUILTIN_TYPE; |
p->u.s_builtin.type = &cplus_demangle_builtin_types[i]; |
return 1; |
} |
} |
return 0; |
} |
/* Fill in a DEMANGLE_COMPONENT_OPERATOR. */ |
int |
cplus_demangle_fill_operator (struct demangle_component *p, |
const char *opname, int args) |
{ |
int len; |
unsigned int i; |
if (p == NULL || opname == NULL) |
return 0; |
len = strlen (opname); |
for (i = 0; cplus_demangle_operators[i].name != NULL; ++i) |
{ |
if (len == cplus_demangle_operators[i].len |
&& args == cplus_demangle_operators[i].args |
&& strcmp (opname, cplus_demangle_operators[i].name) == 0) |
{ |
p->type = DEMANGLE_COMPONENT_OPERATOR; |
p->u.s_operator.op = &cplus_demangle_operators[i]; |
return 1; |
} |
} |
return 0; |
} |
/* Translate a mangled name into components. */ |
struct demangle_component * |
cplus_demangle_v3_components (const char *mangled, int options, void **mem) |
{ |
size_t len; |
int type; |
struct d_info di; |
struct demangle_component *dc; |
len = strlen (mangled); |
if (mangled[0] == '_' && mangled[1] == 'Z') |
type = 0; |
else |
{ |
if ((options & DMGL_TYPES) == 0) |
return NULL; |
type = 1; |
} |
cplus_demangle_init_info (mangled, options, len, &di); |
di.comps = ((struct demangle_component *) |
malloc (di.num_comps * sizeof (struct demangle_component))); |
di.subs = ((struct demangle_component **) |
malloc (di.num_subs * sizeof (struct demangle_component *))); |
if (di.comps == NULL || di.subs == NULL) |
{ |
free (di.comps); |
free (di.subs); |
return NULL; |
} |
if (! type) |
dc = cplus_demangle_mangled_name (&di, 1); |
else |
dc = cplus_demangle_type (&di); |
/* If DMGL_PARAMS is set, then if we didn't consume the entire |
mangled string, then we didn't successfully demangle it. */ |
if ((options & DMGL_PARAMS) != 0 && d_peek_char (&di) != '\0') |
dc = NULL; |
free (di.subs); |
if (dc != NULL) |
*mem = di.comps; |
else |
free (di.comps); |
return dc; |
} |
/contrib/toolchain/binutils/libiberty/cplus-dem.c |
---|
0,0 → 1,4862 |
/* Demangler for GNU C++ |
Copyright 1989, 1991, 1994, 1995, 1996, 1997, 1998, 1999, |
2000, 2001, 2002, 2003, 2004, 2010 Free Software Foundation, Inc. |
Written by James Clark (jjc@jclark.uucp) |
Rewritten by Fred Fish (fnf@cygnus.com) for ARM and Lucid demangling |
Modified by Satish Pai (pai@apollo.hp.com) for HP demangling |
This file is part of the libiberty library. |
Libiberty is free software; you can redistribute it and/or |
modify it under the terms of the GNU Library General Public |
License as published by the Free Software Foundation; either |
version 2 of the License, or (at your option) any later version. |
In addition to the permissions in the GNU Library General Public |
License, the Free Software Foundation gives you unlimited permission |
to link the compiled version of this file into combinations with other |
programs, and to distribute those combinations without any restriction |
coming from the use of this file. (The Library Public License |
restrictions do apply in other respects; for example, they cover |
modification of the file, and distribution when not linked into a |
combined executable.) |
Libiberty is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
Library General Public License for more details. |
You should have received a copy of the GNU Library General Public |
License along with libiberty; see the file COPYING.LIB. If |
not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
/* This file exports two functions; cplus_mangle_opname and cplus_demangle. |
This file imports xmalloc and xrealloc, which are like malloc and |
realloc except that they generate a fatal error if there is no |
available memory. */ |
/* This file lives in both GCC and libiberty. When making changes, please |
try not to break either. */ |
#ifdef HAVE_CONFIG_H |
#include "config.h" |
#endif |
#include "safe-ctype.h" |
#include <sys/types.h> |
#include <string.h> |
#include <stdio.h> |
#ifdef HAVE_STDLIB_H |
#include <stdlib.h> |
#else |
void * malloc (); |
void * realloc (); |
#endif |
#include <demangle.h> |
#undef CURRENT_DEMANGLING_STYLE |
#define CURRENT_DEMANGLING_STYLE work->options |
#include "libiberty.h" |
#define min(X,Y) (((X) < (Y)) ? (X) : (Y)) |
/* A value at least one greater than the maximum number of characters |
that will be output when using the `%d' format with `printf'. */ |
#define INTBUF_SIZE 32 |
extern void fancy_abort (void) ATTRIBUTE_NORETURN; |
/* In order to allow a single demangler executable to demangle strings |
using various common values of CPLUS_MARKER, as well as any specific |
one set at compile time, we maintain a string containing all the |
commonly used ones, and check to see if the marker we are looking for |
is in that string. CPLUS_MARKER is usually '$' on systems where the |
assembler can deal with that. Where the assembler can't, it's usually |
'.' (but on many systems '.' is used for other things). We put the |
current defined CPLUS_MARKER first (which defaults to '$'), followed |
by the next most common value, followed by an explicit '$' in case |
the value of CPLUS_MARKER is not '$'. |
We could avoid this if we could just get g++ to tell us what the actual |
cplus marker character is as part of the debug information, perhaps by |
ensuring that it is the character that terminates the gcc<n>_compiled |
marker symbol (FIXME). */ |
#if !defined (CPLUS_MARKER) |
#define CPLUS_MARKER '$' |
#endif |
enum demangling_styles current_demangling_style = auto_demangling; |
static char cplus_markers[] = { CPLUS_MARKER, '.', '$', '\0' }; |
static char char_str[2] = { '\000', '\000' }; |
void |
set_cplus_marker_for_demangling (int ch) |
{ |
cplus_markers[0] = ch; |
} |
typedef struct string /* Beware: these aren't required to be */ |
{ /* '\0' terminated. */ |
char *b; /* pointer to start of string */ |
char *p; /* pointer after last character */ |
char *e; /* pointer after end of allocated space */ |
} string; |
/* Stuff that is shared between sub-routines. |
Using a shared structure allows cplus_demangle to be reentrant. */ |
struct work_stuff |
{ |
int options; |
char **typevec; |
char **ktypevec; |
char **btypevec; |
int numk; |
int numb; |
int ksize; |
int bsize; |
int ntypes; |
int typevec_size; |
int constructor; |
int destructor; |
int static_type; /* A static member function */ |
int temp_start; /* index in demangled to start of template args */ |
int type_quals; /* The type qualifiers. */ |
int dllimported; /* Symbol imported from a PE DLL */ |
char **tmpl_argvec; /* Template function arguments. */ |
int ntmpl_args; /* The number of template function arguments. */ |
int forgetting_types; /* Nonzero if we are not remembering the types |
we see. */ |
string* previous_argument; /* The last function argument demangled. */ |
int nrepeats; /* The number of times to repeat the previous |
argument. */ |
}; |
#define PRINT_ANSI_QUALIFIERS (work -> options & DMGL_ANSI) |
#define PRINT_ARG_TYPES (work -> options & DMGL_PARAMS) |
static const struct optable |
{ |
const char *const in; |
const char *const out; |
const int flags; |
} optable[] = { |
{"nw", " new", DMGL_ANSI}, /* new (1.92, ansi) */ |
{"dl", " delete", DMGL_ANSI}, /* new (1.92, ansi) */ |
{"new", " new", 0}, /* old (1.91, and 1.x) */ |
{"delete", " delete", 0}, /* old (1.91, and 1.x) */ |
{"vn", " new []", DMGL_ANSI}, /* GNU, pending ansi */ |
{"vd", " delete []", DMGL_ANSI}, /* GNU, pending ansi */ |
{"as", "=", DMGL_ANSI}, /* ansi */ |
{"ne", "!=", DMGL_ANSI}, /* old, ansi */ |
{"eq", "==", DMGL_ANSI}, /* old, ansi */ |
{"ge", ">=", DMGL_ANSI}, /* old, ansi */ |
{"gt", ">", DMGL_ANSI}, /* old, ansi */ |
{"le", "<=", DMGL_ANSI}, /* old, ansi */ |
{"lt", "<", DMGL_ANSI}, /* old, ansi */ |
{"plus", "+", 0}, /* old */ |
{"pl", "+", DMGL_ANSI}, /* ansi */ |
{"apl", "+=", DMGL_ANSI}, /* ansi */ |
{"minus", "-", 0}, /* old */ |
{"mi", "-", DMGL_ANSI}, /* ansi */ |
{"ami", "-=", DMGL_ANSI}, /* ansi */ |
{"mult", "*", 0}, /* old */ |
{"ml", "*", DMGL_ANSI}, /* ansi */ |
{"amu", "*=", DMGL_ANSI}, /* ansi (ARM/Lucid) */ |
{"aml", "*=", DMGL_ANSI}, /* ansi (GNU/g++) */ |
{"convert", "+", 0}, /* old (unary +) */ |
{"negate", "-", 0}, /* old (unary -) */ |
{"trunc_mod", "%", 0}, /* old */ |
{"md", "%", DMGL_ANSI}, /* ansi */ |
{"amd", "%=", DMGL_ANSI}, /* ansi */ |
{"trunc_div", "/", 0}, /* old */ |
{"dv", "/", DMGL_ANSI}, /* ansi */ |
{"adv", "/=", DMGL_ANSI}, /* ansi */ |
{"truth_andif", "&&", 0}, /* old */ |
{"aa", "&&", DMGL_ANSI}, /* ansi */ |
{"truth_orif", "||", 0}, /* old */ |
{"oo", "||", DMGL_ANSI}, /* ansi */ |
{"truth_not", "!", 0}, /* old */ |
{"nt", "!", DMGL_ANSI}, /* ansi */ |
{"postincrement","++", 0}, /* old */ |
{"pp", "++", DMGL_ANSI}, /* ansi */ |
{"postdecrement","--", 0}, /* old */ |
{"mm", "--", DMGL_ANSI}, /* ansi */ |
{"bit_ior", "|", 0}, /* old */ |
{"or", "|", DMGL_ANSI}, /* ansi */ |
{"aor", "|=", DMGL_ANSI}, /* ansi */ |
{"bit_xor", "^", 0}, /* old */ |
{"er", "^", DMGL_ANSI}, /* ansi */ |
{"aer", "^=", DMGL_ANSI}, /* ansi */ |
{"bit_and", "&", 0}, /* old */ |
{"ad", "&", DMGL_ANSI}, /* ansi */ |
{"aad", "&=", DMGL_ANSI}, /* ansi */ |
{"bit_not", "~", 0}, /* old */ |
{"co", "~", DMGL_ANSI}, /* ansi */ |
{"call", "()", 0}, /* old */ |
{"cl", "()", DMGL_ANSI}, /* ansi */ |
{"alshift", "<<", 0}, /* old */ |
{"ls", "<<", DMGL_ANSI}, /* ansi */ |
{"als", "<<=", DMGL_ANSI}, /* ansi */ |
{"arshift", ">>", 0}, /* old */ |
{"rs", ">>", DMGL_ANSI}, /* ansi */ |
{"ars", ">>=", DMGL_ANSI}, /* ansi */ |
{"component", "->", 0}, /* old */ |
{"pt", "->", DMGL_ANSI}, /* ansi; Lucid C++ form */ |
{"rf", "->", DMGL_ANSI}, /* ansi; ARM/GNU form */ |
{"indirect", "*", 0}, /* old */ |
{"method_call", "->()", 0}, /* old */ |
{"addr", "&", 0}, /* old (unary &) */ |
{"array", "[]", 0}, /* old */ |
{"vc", "[]", DMGL_ANSI}, /* ansi */ |
{"compound", ", ", 0}, /* old */ |
{"cm", ", ", DMGL_ANSI}, /* ansi */ |
{"cond", "?:", 0}, /* old */ |
{"cn", "?:", DMGL_ANSI}, /* pseudo-ansi */ |
{"max", ">?", 0}, /* old */ |
{"mx", ">?", DMGL_ANSI}, /* pseudo-ansi */ |
{"min", "<?", 0}, /* old */ |
{"mn", "<?", DMGL_ANSI}, /* pseudo-ansi */ |
{"nop", "", 0}, /* old (for operator=) */ |
{"rm", "->*", DMGL_ANSI}, /* ansi */ |
{"sz", "sizeof ", DMGL_ANSI} /* pseudo-ansi */ |
}; |
/* These values are used to indicate the various type varieties. |
They are all non-zero so that they can be used as `success' |
values. */ |
typedef enum type_kind_t |
{ |
tk_none, |
tk_pointer, |
tk_reference, |
tk_integral, |
tk_bool, |
tk_char, |
tk_real |
} type_kind_t; |
const struct demangler_engine libiberty_demanglers[] = |
{ |
{ |
NO_DEMANGLING_STYLE_STRING, |
no_demangling, |
"Demangling disabled" |
} |
, |
{ |
AUTO_DEMANGLING_STYLE_STRING, |
auto_demangling, |
"Automatic selection based on executable" |
} |
, |
{ |
GNU_DEMANGLING_STYLE_STRING, |
gnu_demangling, |
"GNU (g++) style demangling" |
} |
, |
{ |
LUCID_DEMANGLING_STYLE_STRING, |
lucid_demangling, |
"Lucid (lcc) style demangling" |
} |
, |
{ |
ARM_DEMANGLING_STYLE_STRING, |
arm_demangling, |
"ARM style demangling" |
} |
, |
{ |
HP_DEMANGLING_STYLE_STRING, |
hp_demangling, |
"HP (aCC) style demangling" |
} |
, |
{ |
EDG_DEMANGLING_STYLE_STRING, |
edg_demangling, |
"EDG style demangling" |
} |
, |
{ |
GNU_V3_DEMANGLING_STYLE_STRING, |
gnu_v3_demangling, |
"GNU (g++) V3 ABI-style demangling" |
} |
, |
{ |
JAVA_DEMANGLING_STYLE_STRING, |
java_demangling, |
"Java style demangling" |
} |
, |
{ |
GNAT_DEMANGLING_STYLE_STRING, |
gnat_demangling, |
"GNAT style demangling" |
} |
, |
{ |
NULL, unknown_demangling, NULL |
} |
}; |
#define STRING_EMPTY(str) ((str) -> b == (str) -> p) |
#define APPEND_BLANK(str) {if (!STRING_EMPTY(str)) \ |
string_append(str, " ");} |
#define LEN_STRING(str) ( (STRING_EMPTY(str))?0:((str)->p - (str)->b)) |
/* The scope separator appropriate for the language being demangled. */ |
#define SCOPE_STRING(work) ((work->options & DMGL_JAVA) ? "." : "::") |
#define ARM_VTABLE_STRING "__vtbl__" /* Lucid/ARM virtual table prefix */ |
#define ARM_VTABLE_STRLEN 8 /* strlen (ARM_VTABLE_STRING) */ |
/* Prototypes for local functions */ |
static void delete_work_stuff (struct work_stuff *); |
static void delete_non_B_K_work_stuff (struct work_stuff *); |
static char *mop_up (struct work_stuff *, string *, int); |
static void squangle_mop_up (struct work_stuff *); |
static void work_stuff_copy_to_from (struct work_stuff *, struct work_stuff *); |
#if 0 |
static int |
demangle_method_args (struct work_stuff *, const char **, string *); |
#endif |
static char * |
internal_cplus_demangle (struct work_stuff *, const char *); |
static int |
demangle_template_template_parm (struct work_stuff *work, |
const char **, string *); |
static int |
demangle_template (struct work_stuff *work, const char **, string *, |
string *, int, int); |
static int |
arm_pt (struct work_stuff *, const char *, int, const char **, |
const char **); |
static int |
demangle_class_name (struct work_stuff *, const char **, string *); |
static int |
demangle_qualified (struct work_stuff *, const char **, string *, |
int, int); |
static int demangle_class (struct work_stuff *, const char **, string *); |
static int demangle_fund_type (struct work_stuff *, const char **, string *); |
static int demangle_signature (struct work_stuff *, const char **, string *); |
static int demangle_prefix (struct work_stuff *, const char **, string *); |
static int gnu_special (struct work_stuff *, const char **, string *); |
static int arm_special (const char **, string *); |
static void string_need (string *, int); |
static void string_delete (string *); |
static void |
string_init (string *); |
static void string_clear (string *); |
#if 0 |
static int string_empty (string *); |
#endif |
static void string_append (string *, const char *); |
static void string_appends (string *, string *); |
static void string_appendn (string *, const char *, int); |
static void string_prepend (string *, const char *); |
static void string_prependn (string *, const char *, int); |
static void string_append_template_idx (string *, int); |
static int get_count (const char **, int *); |
static int consume_count (const char **); |
static int consume_count_with_underscores (const char**); |
static int demangle_args (struct work_stuff *, const char **, string *); |
static int demangle_nested_args (struct work_stuff*, const char**, string*); |
static int do_type (struct work_stuff *, const char **, string *); |
static int do_arg (struct work_stuff *, const char **, string *); |
static int |
demangle_function_name (struct work_stuff *, const char **, string *, |
const char *); |
static int |
iterate_demangle_function (struct work_stuff *, |
const char **, string *, const char *); |
static void remember_type (struct work_stuff *, const char *, int); |
static void remember_Btype (struct work_stuff *, const char *, int, int); |
static int register_Btype (struct work_stuff *); |
static void remember_Ktype (struct work_stuff *, const char *, int); |
static void forget_types (struct work_stuff *); |
static void forget_B_and_K_types (struct work_stuff *); |
static void string_prepends (string *, string *); |
static int |
demangle_template_value_parm (struct work_stuff*, const char**, |
string*, type_kind_t); |
static int |
do_hpacc_template_const_value (struct work_stuff *, const char **, string *); |
static int |
do_hpacc_template_literal (struct work_stuff *, const char **, string *); |
static int snarf_numeric_literal (const char **, string *); |
/* There is a TYPE_QUAL value for each type qualifier. They can be |
combined by bitwise-or to form the complete set of qualifiers for a |
type. */ |
#define TYPE_UNQUALIFIED 0x0 |
#define TYPE_QUAL_CONST 0x1 |
#define TYPE_QUAL_VOLATILE 0x2 |
#define TYPE_QUAL_RESTRICT 0x4 |
static int code_for_qualifier (int); |
static const char* qualifier_string (int); |
static const char* demangle_qualifier (int); |
static int demangle_expression (struct work_stuff *, const char **, string *, |
type_kind_t); |
static int |
demangle_integral_value (struct work_stuff *, const char **, string *); |
static int |
demangle_real_value (struct work_stuff *, const char **, string *); |
static void |
demangle_arm_hp_template (struct work_stuff *, const char **, int, string *); |
static void |
recursively_demangle (struct work_stuff *, const char **, string *, int); |
/* Translate count to integer, consuming tokens in the process. |
Conversion terminates on the first non-digit character. |
Trying to consume something that isn't a count results in no |
consumption of input and a return of -1. |
Overflow consumes the rest of the digits, and returns -1. */ |
static int |
consume_count (const char **type) |
{ |
int count = 0; |
if (! ISDIGIT ((unsigned char)**type)) |
return -1; |
while (ISDIGIT ((unsigned char)**type)) |
{ |
count *= 10; |
/* Check for overflow. |
We assume that count is represented using two's-complement; |
no power of two is divisible by ten, so if an overflow occurs |
when multiplying by ten, the result will not be a multiple of |
ten. */ |
if ((count % 10) != 0) |
{ |
while (ISDIGIT ((unsigned char) **type)) |
(*type)++; |
return -1; |
} |
count += **type - '0'; |
(*type)++; |
} |
if (count < 0) |
count = -1; |
return (count); |
} |
/* Like consume_count, but for counts that are preceded and followed |
by '_' if they are greater than 10. Also, -1 is returned for |
failure, since 0 can be a valid value. */ |
static int |
consume_count_with_underscores (const char **mangled) |
{ |
int idx; |
if (**mangled == '_') |
{ |
(*mangled)++; |
if (!ISDIGIT ((unsigned char)**mangled)) |
return -1; |
idx = consume_count (mangled); |
if (**mangled != '_') |
/* The trailing underscore was missing. */ |
return -1; |
(*mangled)++; |
} |
else |
{ |
if (**mangled < '0' || **mangled > '9') |
return -1; |
idx = **mangled - '0'; |
(*mangled)++; |
} |
return idx; |
} |
/* C is the code for a type-qualifier. Return the TYPE_QUAL |
corresponding to this qualifier. */ |
static int |
code_for_qualifier (int c) |
{ |
switch (c) |
{ |
case 'C': |
return TYPE_QUAL_CONST; |
case 'V': |
return TYPE_QUAL_VOLATILE; |
case 'u': |
return TYPE_QUAL_RESTRICT; |
default: |
break; |
} |
/* C was an invalid qualifier. */ |
abort (); |
} |
/* Return the string corresponding to the qualifiers given by |
TYPE_QUALS. */ |
static const char* |
qualifier_string (int type_quals) |
{ |
switch (type_quals) |
{ |
case TYPE_UNQUALIFIED: |
return ""; |
case TYPE_QUAL_CONST: |
return "const"; |
case TYPE_QUAL_VOLATILE: |
return "volatile"; |
case TYPE_QUAL_RESTRICT: |
return "__restrict"; |
case TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE: |
return "const volatile"; |
case TYPE_QUAL_CONST | TYPE_QUAL_RESTRICT: |
return "const __restrict"; |
case TYPE_QUAL_VOLATILE | TYPE_QUAL_RESTRICT: |
return "volatile __restrict"; |
case TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE | TYPE_QUAL_RESTRICT: |
return "const volatile __restrict"; |
default: |
break; |
} |
/* TYPE_QUALS was an invalid qualifier set. */ |
abort (); |
} |
/* C is the code for a type-qualifier. Return the string |
corresponding to this qualifier. This function should only be |
called with a valid qualifier code. */ |
static const char* |
demangle_qualifier (int c) |
{ |
return qualifier_string (code_for_qualifier (c)); |
} |
int |
cplus_demangle_opname (const char *opname, char *result, int options) |
{ |
int len, len1, ret; |
string type; |
struct work_stuff work[1]; |
const char *tem; |
len = strlen(opname); |
result[0] = '\0'; |
ret = 0; |
memset ((char *) work, 0, sizeof (work)); |
work->options = options; |
if (opname[0] == '_' && opname[1] == '_' |
&& opname[2] == 'o' && opname[3] == 'p') |
{ |
/* ANSI. */ |
/* type conversion operator. */ |
tem = opname + 4; |
if (do_type (work, &tem, &type)) |
{ |
strcat (result, "operator "); |
strncat (result, type.b, type.p - type.b); |
string_delete (&type); |
ret = 1; |
} |
} |
else if (opname[0] == '_' && opname[1] == '_' |
&& ISLOWER((unsigned char)opname[2]) |
&& ISLOWER((unsigned char)opname[3])) |
{ |
if (opname[4] == '\0') |
{ |
/* Operator. */ |
size_t i; |
for (i = 0; i < ARRAY_SIZE (optable); i++) |
{ |
if (strlen (optable[i].in) == 2 |
&& memcmp (optable[i].in, opname + 2, 2) == 0) |
{ |
strcat (result, "operator"); |
strcat (result, optable[i].out); |
ret = 1; |
break; |
} |
} |
} |
else |
{ |
if (opname[2] == 'a' && opname[5] == '\0') |
{ |
/* Assignment. */ |
size_t i; |
for (i = 0; i < ARRAY_SIZE (optable); i++) |
{ |
if (strlen (optable[i].in) == 3 |
&& memcmp (optable[i].in, opname + 2, 3) == 0) |
{ |
strcat (result, "operator"); |
strcat (result, optable[i].out); |
ret = 1; |
break; |
} |
} |
} |
} |
} |
else if (len >= 3 |
&& opname[0] == 'o' |
&& opname[1] == 'p' |
&& strchr (cplus_markers, opname[2]) != NULL) |
{ |
/* see if it's an assignment expression */ |
if (len >= 10 /* op$assign_ */ |
&& memcmp (opname + 3, "assign_", 7) == 0) |
{ |
size_t i; |
for (i = 0; i < ARRAY_SIZE (optable); i++) |
{ |
len1 = len - 10; |
if ((int) strlen (optable[i].in) == len1 |
&& memcmp (optable[i].in, opname + 10, len1) == 0) |
{ |
strcat (result, "operator"); |
strcat (result, optable[i].out); |
strcat (result, "="); |
ret = 1; |
break; |
} |
} |
} |
else |
{ |
size_t i; |
for (i = 0; i < ARRAY_SIZE (optable); i++) |
{ |
len1 = len - 3; |
if ((int) strlen (optable[i].in) == len1 |
&& memcmp (optable[i].in, opname + 3, len1) == 0) |
{ |
strcat (result, "operator"); |
strcat (result, optable[i].out); |
ret = 1; |
break; |
} |
} |
} |
} |
else if (len >= 5 && memcmp (opname, "type", 4) == 0 |
&& strchr (cplus_markers, opname[4]) != NULL) |
{ |
/* type conversion operator */ |
tem = opname + 5; |
if (do_type (work, &tem, &type)) |
{ |
strcat (result, "operator "); |
strncat (result, type.b, type.p - type.b); |
string_delete (&type); |
ret = 1; |
} |
} |
squangle_mop_up (work); |
return ret; |
} |
/* Takes operator name as e.g. "++" and returns mangled |
operator name (e.g. "postincrement_expr"), or NULL if not found. |
If OPTIONS & DMGL_ANSI == 1, return the ANSI name; |
if OPTIONS & DMGL_ANSI == 0, return the old GNU name. */ |
const char * |
cplus_mangle_opname (const char *opname, int options) |
{ |
size_t i; |
int len; |
len = strlen (opname); |
for (i = 0; i < ARRAY_SIZE (optable); i++) |
{ |
if ((int) strlen (optable[i].out) == len |
&& (options & DMGL_ANSI) == (optable[i].flags & DMGL_ANSI) |
&& memcmp (optable[i].out, opname, len) == 0) |
return optable[i].in; |
} |
return (0); |
} |
/* Add a routine to set the demangling style to be sure it is valid and |
allow for any demangler initialization that maybe necessary. */ |
enum demangling_styles |
cplus_demangle_set_style (enum demangling_styles style) |
{ |
const struct demangler_engine *demangler = libiberty_demanglers; |
for (; demangler->demangling_style != unknown_demangling; ++demangler) |
if (style == demangler->demangling_style) |
{ |
current_demangling_style = style; |
return current_demangling_style; |
} |
return unknown_demangling; |
} |
/* Do string name to style translation */ |
enum demangling_styles |
cplus_demangle_name_to_style (const char *name) |
{ |
const struct demangler_engine *demangler = libiberty_demanglers; |
for (; demangler->demangling_style != unknown_demangling; ++demangler) |
if (strcmp (name, demangler->demangling_style_name) == 0) |
return demangler->demangling_style; |
return unknown_demangling; |
} |
/* char *cplus_demangle (const char *mangled, int options) |
If MANGLED is a mangled function name produced by GNU C++, then |
a pointer to a @code{malloc}ed string giving a C++ representation |
of the name will be returned; otherwise NULL will be returned. |
It is the caller's responsibility to free the string which |
is returned. |
The OPTIONS arg may contain one or more of the following bits: |
DMGL_ANSI ANSI qualifiers such as `const' and `void' are |
included. |
DMGL_PARAMS Function parameters are included. |
For example, |
cplus_demangle ("foo__1Ai", DMGL_PARAMS) => "A::foo(int)" |
cplus_demangle ("foo__1Ai", DMGL_PARAMS | DMGL_ANSI) => "A::foo(int)" |
cplus_demangle ("foo__1Ai", 0) => "A::foo" |
cplus_demangle ("foo__1Afe", DMGL_PARAMS) => "A::foo(float,...)" |
cplus_demangle ("foo__1Afe", DMGL_PARAMS | DMGL_ANSI)=> "A::foo(float,...)" |
cplus_demangle ("foo__1Afe", 0) => "A::foo" |
Note that any leading underscores, or other such characters prepended by |
the compilation system, are presumed to have already been stripped from |
MANGLED. */ |
char * |
cplus_demangle (const char *mangled, int options) |
{ |
char *ret; |
struct work_stuff work[1]; |
if (current_demangling_style == no_demangling) |
return xstrdup (mangled); |
memset ((char *) work, 0, sizeof (work)); |
work->options = options; |
if ((work->options & DMGL_STYLE_MASK) == 0) |
work->options |= (int) current_demangling_style & DMGL_STYLE_MASK; |
/* The V3 ABI demangling is implemented elsewhere. */ |
if (GNU_V3_DEMANGLING || AUTO_DEMANGLING) |
{ |
ret = cplus_demangle_v3 (mangled, work->options); |
if (ret || GNU_V3_DEMANGLING) |
return ret; |
} |
if (JAVA_DEMANGLING) |
{ |
ret = java_demangle_v3 (mangled); |
if (ret) |
return ret; |
} |
if (GNAT_DEMANGLING) |
return ada_demangle (mangled, options); |
ret = internal_cplus_demangle (work, mangled); |
squangle_mop_up (work); |
return (ret); |
} |
/* Demangle ada names. The encoding is documented in gcc/ada/exp_dbug.ads. */ |
char * |
ada_demangle (const char *mangled, int option ATTRIBUTE_UNUSED) |
{ |
int len0; |
const char* p; |
char *d; |
char *demangled; |
/* Discard leading _ada_, which is used for library level subprograms. */ |
if (strncmp (mangled, "_ada_", 5) == 0) |
mangled += 5; |
/* All ada unit names are lower-case. */ |
if (!ISLOWER (mangled[0])) |
goto unknown; |
/* Most of the demangling will trivially remove chars. Operator names |
may add one char but because they are always preceeded by '__' which is |
replaced by '.', they eventually never expand the size. |
A few special names such as '___elabs' add a few chars (at most 7), but |
they occur only once. */ |
len0 = strlen (mangled) + 7 + 1; |
demangled = XNEWVEC (char, len0); |
d = demangled; |
p = mangled; |
while (1) |
{ |
/* An entity names is expected. */ |
if (ISLOWER (*p)) |
{ |
/* An identifier, which is always lower case. */ |
do |
*d++ = *p++; |
while (ISLOWER(*p) || ISDIGIT (*p) |
|| (p[0] == '_' && (ISLOWER (p[1]) || ISDIGIT (p[1])))); |
} |
else if (p[0] == 'O') |
{ |
/* An operator name. */ |
static const char * const operators[][2] = |
{{"Oabs", "abs"}, {"Oand", "and"}, {"Omod", "mod"}, |
{"Onot", "not"}, {"Oor", "or"}, {"Orem", "rem"}, |
{"Oxor", "xor"}, {"Oeq", "="}, {"One", "/="}, |
{"Olt", "<"}, {"Ole", "<="}, {"Ogt", ">"}, |
{"Oge", ">="}, {"Oadd", "+"}, {"Osubtract", "-"}, |
{"Oconcat", "&"}, {"Omultiply", "*"}, {"Odivide", "/"}, |
{"Oexpon", "**"}, {NULL, NULL}}; |
int k; |
for (k = 0; operators[k][0] != NULL; k++) |
{ |
size_t slen = strlen (operators[k][0]); |
if (strncmp (p, operators[k][0], slen) == 0) |
{ |
p += slen; |
slen = strlen (operators[k][1]); |
*d++ = '"'; |
memcpy (d, operators[k][1], slen); |
d += slen; |
*d++ = '"'; |
break; |
} |
} |
/* Operator not found. */ |
if (operators[k][0] == NULL) |
goto unknown; |
} |
else |
{ |
/* Not a GNAT encoding. */ |
goto unknown; |
} |
/* The name can be directly followed by some uppercase letters. */ |
if (p[0] == 'T' && p[1] == 'K') |
{ |
/* Task stuff. */ |
if (p[2] == 'B' && p[3] == 0) |
{ |
/* Subprogram for task body. */ |
break; |
} |
else if (p[2] == '_' && p[3] == '_') |
{ |
/* Inner declarations in a task. */ |
p += 4; |
*d++ = '.'; |
continue; |
} |
else |
goto unknown; |
} |
if (p[0] == 'E' && p[1] == 0) |
{ |
/* Exception name. */ |
goto unknown; |
} |
if ((p[0] == 'P' || p[0] == 'N') && p[1] == 0) |
{ |
/* Protected type subprogram. */ |
break; |
} |
if ((*p == 'N' || *p == 'S') && p[1] == 0) |
{ |
/* Enumerated type name table. */ |
goto unknown; |
} |
if (p[0] == 'X') |
{ |
/* Body nested. */ |
p++; |
while (p[0] == 'n' || p[0] == 'b') |
p++; |
} |
if (p[0] == 'S' && p[1] != 0 && (p[2] == '_' || p[2] == 0)) |
{ |
/* Stream operations. */ |
const char *name; |
switch (p[1]) |
{ |
case 'R': |
name = "'Read"; |
break; |
case 'W': |
name = "'Write"; |
break; |
case 'I': |
name = "'Input"; |
break; |
case 'O': |
name = "'Output"; |
break; |
default: |
goto unknown; |
} |
p += 2; |
strcpy (d, name); |
d += strlen (name); |
} |
else if (p[0] == 'D') |
{ |
/* Controlled type operation. */ |
const char *name; |
switch (p[1]) |
{ |
case 'F': |
name = ".Finalize"; |
break; |
case 'A': |
name = ".Adjust"; |
break; |
default: |
goto unknown; |
} |
strcpy (d, name); |
d += strlen (name); |
break; |
} |
if (p[0] == '_') |
{ |
/* Separator. */ |
if (p[1] == '_') |
{ |
/* Standard separator. Handled first. */ |
p += 2; |
if (ISDIGIT (*p)) |
{ |
/* Overloading number. */ |
do |
p++; |
while (ISDIGIT (*p) || (p[0] == '_' && ISDIGIT (p[1]))); |
if (*p == 'X') |
{ |
p++; |
while (p[0] == 'n' || p[0] == 'b') |
p++; |
} |
} |
else if (p[0] == '_' && p[1] != '_') |
{ |
/* Special names. */ |
static const char * const special[][2] = { |
{ "_elabb", "'Elab_Body" }, |
{ "_elabs", "'Elab_Spec" }, |
{ "_size", "'Size" }, |
{ "_alignment", "'Alignment" }, |
{ "_assign", ".\":=\"" }, |
{ NULL, NULL } |
}; |
int k; |
for (k = 0; special[k][0] != NULL; k++) |
{ |
size_t slen = strlen (special[k][0]); |
if (strncmp (p, special[k][0], slen) == 0) |
{ |
p += slen; |
slen = strlen (special[k][1]); |
memcpy (d, special[k][1], slen); |
d += slen; |
break; |
} |
} |
if (special[k][0] != NULL) |
break; |
else |
goto unknown; |
} |
else |
{ |
*d++ = '.'; |
continue; |
} |
} |
else if (p[1] == 'B' || p[1] == 'E') |
{ |
/* Entry Body or barrier Evaluation. */ |
p += 2; |
while (ISDIGIT (*p)) |
p++; |
if (p[0] == 's' && p[1] == 0) |
break; |
else |
goto unknown; |
} |
else |
goto unknown; |
} |
if (p[0] == '.' && ISDIGIT (p[1])) |
{ |
/* Nested subprogram. */ |
p += 2; |
while (ISDIGIT (*p)) |
p++; |
} |
if (*p == 0) |
{ |
/* End of mangled name. */ |
break; |
} |
else |
goto unknown; |
} |
*d = 0; |
return demangled; |
unknown: |
len0 = strlen (mangled); |
demangled = XNEWVEC (char, len0 + 3); |
if (mangled[0] == '<') |
strcpy (demangled, mangled); |
else |
sprintf (demangled, "<%s>", mangled); |
return demangled; |
} |
/* This function performs most of what cplus_demangle use to do, but |
to be able to demangle a name with a B, K or n code, we need to |
have a longer term memory of what types have been seen. The original |
now initializes and cleans up the squangle code info, while internal |
calls go directly to this routine to avoid resetting that info. */ |
static char * |
internal_cplus_demangle (struct work_stuff *work, const char *mangled) |
{ |
string decl; |
int success = 0; |
char *demangled = NULL; |
int s1, s2, s3, s4; |
s1 = work->constructor; |
s2 = work->destructor; |
s3 = work->static_type; |
s4 = work->type_quals; |
work->constructor = work->destructor = 0; |
work->type_quals = TYPE_UNQUALIFIED; |
work->dllimported = 0; |
if ((mangled != NULL) && (*mangled != '\0')) |
{ |
string_init (&decl); |
/* First check to see if gnu style demangling is active and if the |
string to be demangled contains a CPLUS_MARKER. If so, attempt to |
recognize one of the gnu special forms rather than looking for a |
standard prefix. In particular, don't worry about whether there |
is a "__" string in the mangled string. Consider "_$_5__foo" for |
example. */ |
if ((AUTO_DEMANGLING || GNU_DEMANGLING)) |
{ |
success = gnu_special (work, &mangled, &decl); |
} |
if (!success) |
{ |
success = demangle_prefix (work, &mangled, &decl); |
} |
if (success && (*mangled != '\0')) |
{ |
success = demangle_signature (work, &mangled, &decl); |
} |
if (work->constructor == 2) |
{ |
string_prepend (&decl, "global constructors keyed to "); |
work->constructor = 0; |
} |
else if (work->destructor == 2) |
{ |
string_prepend (&decl, "global destructors keyed to "); |
work->destructor = 0; |
} |
else if (work->dllimported == 1) |
{ |
string_prepend (&decl, "import stub for "); |
work->dllimported = 0; |
} |
demangled = mop_up (work, &decl, success); |
} |
work->constructor = s1; |
work->destructor = s2; |
work->static_type = s3; |
work->type_quals = s4; |
return demangled; |
} |
/* Clear out and squangling related storage */ |
static void |
squangle_mop_up (struct work_stuff *work) |
{ |
/* clean up the B and K type mangling types. */ |
forget_B_and_K_types (work); |
if (work -> btypevec != NULL) |
{ |
free ((char *) work -> btypevec); |
} |
if (work -> ktypevec != NULL) |
{ |
free ((char *) work -> ktypevec); |
} |
} |
/* Copy the work state and storage. */ |
static void |
work_stuff_copy_to_from (struct work_stuff *to, struct work_stuff *from) |
{ |
int i; |
delete_work_stuff (to); |
/* Shallow-copy scalars. */ |
memcpy (to, from, sizeof (*to)); |
/* Deep-copy dynamic storage. */ |
if (from->typevec_size) |
to->typevec = XNEWVEC (char *, from->typevec_size); |
for (i = 0; i < from->ntypes; i++) |
{ |
int len = strlen (from->typevec[i]) + 1; |
to->typevec[i] = XNEWVEC (char, len); |
memcpy (to->typevec[i], from->typevec[i], len); |
} |
if (from->ksize) |
to->ktypevec = XNEWVEC (char *, from->ksize); |
for (i = 0; i < from->numk; i++) |
{ |
int len = strlen (from->ktypevec[i]) + 1; |
to->ktypevec[i] = XNEWVEC (char, len); |
memcpy (to->ktypevec[i], from->ktypevec[i], len); |
} |
if (from->bsize) |
to->btypevec = XNEWVEC (char *, from->bsize); |
for (i = 0; i < from->numb; i++) |
{ |
int len = strlen (from->btypevec[i]) + 1; |
to->btypevec[i] = XNEWVEC (char , len); |
memcpy (to->btypevec[i], from->btypevec[i], len); |
} |
if (from->ntmpl_args) |
to->tmpl_argvec = XNEWVEC (char *, from->ntmpl_args); |
for (i = 0; i < from->ntmpl_args; i++) |
{ |
int len = strlen (from->tmpl_argvec[i]) + 1; |
to->tmpl_argvec[i] = XNEWVEC (char, len); |
memcpy (to->tmpl_argvec[i], from->tmpl_argvec[i], len); |
} |
if (from->previous_argument) |
{ |
to->previous_argument = XNEW (string); |
string_init (to->previous_argument); |
string_appends (to->previous_argument, from->previous_argument); |
} |
} |
/* Delete dynamic stuff in work_stuff that is not to be re-used. */ |
static void |
delete_non_B_K_work_stuff (struct work_stuff *work) |
{ |
/* Discard the remembered types, if any. */ |
forget_types (work); |
if (work -> typevec != NULL) |
{ |
free ((char *) work -> typevec); |
work -> typevec = NULL; |
work -> typevec_size = 0; |
} |
if (work->tmpl_argvec) |
{ |
int i; |
for (i = 0; i < work->ntmpl_args; i++) |
free ((char*) work->tmpl_argvec[i]); |
free ((char*) work->tmpl_argvec); |
work->tmpl_argvec = NULL; |
} |
if (work->previous_argument) |
{ |
string_delete (work->previous_argument); |
free ((char*) work->previous_argument); |
work->previous_argument = NULL; |
} |
} |
/* Delete all dynamic storage in work_stuff. */ |
static void |
delete_work_stuff (struct work_stuff *work) |
{ |
delete_non_B_K_work_stuff (work); |
squangle_mop_up (work); |
} |
/* Clear out any mangled storage */ |
static char * |
mop_up (struct work_stuff *work, string *declp, int success) |
{ |
char *demangled = NULL; |
delete_non_B_K_work_stuff (work); |
/* If demangling was successful, ensure that the demangled string is null |
terminated and return it. Otherwise, free the demangling decl. */ |
if (!success) |
{ |
string_delete (declp); |
} |
else |
{ |
string_appendn (declp, "", 1); |
demangled = declp->b; |
} |
return (demangled); |
} |
/* |
LOCAL FUNCTION |
demangle_signature -- demangle the signature part of a mangled name |
SYNOPSIS |
static int |
demangle_signature (struct work_stuff *work, const char **mangled, |
string *declp); |
DESCRIPTION |
Consume and demangle the signature portion of the mangled name. |
DECLP is the string where demangled output is being built. At |
entry it contains the demangled root name from the mangled name |
prefix. I.E. either a demangled operator name or the root function |
name. In some special cases, it may contain nothing. |
*MANGLED points to the current unconsumed location in the mangled |
name. As tokens are consumed and demangling is performed, the |
pointer is updated to continuously point at the next token to |
be consumed. |
Demangling GNU style mangled names is nasty because there is no |
explicit token that marks the start of the outermost function |
argument list. */ |
static int |
demangle_signature (struct work_stuff *work, |
const char **mangled, string *declp) |
{ |
int success = 1; |
int func_done = 0; |
int expect_func = 0; |
int expect_return_type = 0; |
const char *oldmangled = NULL; |
string trawname; |
string tname; |
while (success && (**mangled != '\0')) |
{ |
switch (**mangled) |
{ |
case 'Q': |
oldmangled = *mangled; |
success = demangle_qualified (work, mangled, declp, 1, 0); |
if (success) |
remember_type (work, oldmangled, *mangled - oldmangled); |
if (AUTO_DEMANGLING || GNU_DEMANGLING) |
expect_func = 1; |
oldmangled = NULL; |
break; |
case 'K': |
oldmangled = *mangled; |
success = demangle_qualified (work, mangled, declp, 1, 0); |
if (AUTO_DEMANGLING || GNU_DEMANGLING) |
{ |
expect_func = 1; |
} |
oldmangled = NULL; |
break; |
case 'S': |
/* Static member function */ |
if (oldmangled == NULL) |
{ |
oldmangled = *mangled; |
} |
(*mangled)++; |
work -> static_type = 1; |
break; |
case 'C': |
case 'V': |
case 'u': |
work->type_quals |= code_for_qualifier (**mangled); |
/* a qualified member function */ |
if (oldmangled == NULL) |
oldmangled = *mangled; |
(*mangled)++; |
break; |
case 'L': |
/* Local class name follows after "Lnnn_" */ |
if (HP_DEMANGLING) |
{ |
while (**mangled && (**mangled != '_')) |
(*mangled)++; |
if (!**mangled) |
success = 0; |
else |
(*mangled)++; |
} |
else |
success = 0; |
break; |
case '0': case '1': case '2': case '3': case '4': |
case '5': case '6': case '7': case '8': case '9': |
if (oldmangled == NULL) |
{ |
oldmangled = *mangled; |
} |
work->temp_start = -1; /* uppermost call to demangle_class */ |
success = demangle_class (work, mangled, declp); |
if (success) |
{ |
remember_type (work, oldmangled, *mangled - oldmangled); |
} |
if (AUTO_DEMANGLING || GNU_DEMANGLING || EDG_DEMANGLING) |
{ |
/* EDG and others will have the "F", so we let the loop cycle |
if we are looking at one. */ |
if (**mangled != 'F') |
expect_func = 1; |
} |
oldmangled = NULL; |
break; |
case 'B': |
{ |
string s; |
success = do_type (work, mangled, &s); |
if (success) |
{ |
string_append (&s, SCOPE_STRING (work)); |
string_prepends (declp, &s); |
string_delete (&s); |
} |
oldmangled = NULL; |
expect_func = 1; |
} |
break; |
case 'F': |
/* Function */ |
/* ARM/HP style demangling includes a specific 'F' character after |
the class name. For GNU style, it is just implied. So we can |
safely just consume any 'F' at this point and be compatible |
with either style. */ |
oldmangled = NULL; |
func_done = 1; |
(*mangled)++; |
/* For lucid/ARM/HP style we have to forget any types we might |
have remembered up to this point, since they were not argument |
types. GNU style considers all types seen as available for |
back references. See comment in demangle_args() */ |
if (LUCID_DEMANGLING || ARM_DEMANGLING || HP_DEMANGLING || EDG_DEMANGLING) |
{ |
forget_types (work); |
} |
success = demangle_args (work, mangled, declp); |
/* After picking off the function args, we expect to either |
find the function return type (preceded by an '_') or the |
end of the string. */ |
if (success && (AUTO_DEMANGLING || EDG_DEMANGLING) && **mangled == '_') |
{ |
++(*mangled); |
/* At this level, we do not care about the return type. */ |
success = do_type (work, mangled, &tname); |
string_delete (&tname); |
} |
break; |
case 't': |
/* G++ Template */ |
string_init(&trawname); |
string_init(&tname); |
if (oldmangled == NULL) |
{ |
oldmangled = *mangled; |
} |
success = demangle_template (work, mangled, &tname, |
&trawname, 1, 1); |
if (success) |
{ |
remember_type (work, oldmangled, *mangled - oldmangled); |
} |
string_append (&tname, SCOPE_STRING (work)); |
string_prepends(declp, &tname); |
if (work -> destructor & 1) |
{ |
string_prepend (&trawname, "~"); |
string_appends (declp, &trawname); |
work->destructor -= 1; |
} |
if ((work->constructor & 1) || (work->destructor & 1)) |
{ |
string_appends (declp, &trawname); |
work->constructor -= 1; |
} |
string_delete(&trawname); |
string_delete(&tname); |
oldmangled = NULL; |
expect_func = 1; |
break; |
case '_': |
if ((AUTO_DEMANGLING || GNU_DEMANGLING) && expect_return_type) |
{ |
/* Read the return type. */ |
string return_type; |
(*mangled)++; |
success = do_type (work, mangled, &return_type); |
APPEND_BLANK (&return_type); |
string_prepends (declp, &return_type); |
string_delete (&return_type); |
break; |
} |
else |
/* At the outermost level, we cannot have a return type specified, |
so if we run into another '_' at this point we are dealing with |
a mangled name that is either bogus, or has been mangled by |
some algorithm we don't know how to deal with. So just |
reject the entire demangling. */ |
/* However, "_nnn" is an expected suffix for alternate entry point |
numbered nnn for a function, with HP aCC, so skip over that |
without reporting failure. pai/1997-09-04 */ |
if (HP_DEMANGLING) |
{ |
(*mangled)++; |
while (**mangled && ISDIGIT ((unsigned char)**mangled)) |
(*mangled)++; |
} |
else |
success = 0; |
break; |
case 'H': |
if (AUTO_DEMANGLING || GNU_DEMANGLING) |
{ |
/* A G++ template function. Read the template arguments. */ |
success = demangle_template (work, mangled, declp, 0, 0, |
0); |
if (!(work->constructor & 1)) |
expect_return_type = 1; |
(*mangled)++; |
break; |
} |
else |
/* fall through */ |
{;} |
default: |
if (AUTO_DEMANGLING || GNU_DEMANGLING) |
{ |
/* Assume we have stumbled onto the first outermost function |
argument token, and start processing args. */ |
func_done = 1; |
success = demangle_args (work, mangled, declp); |
} |
else |
{ |
/* Non-GNU demanglers use a specific token to mark the start |
of the outermost function argument tokens. Typically 'F', |
for ARM/HP-demangling, for example. So if we find something |
we are not prepared for, it must be an error. */ |
success = 0; |
} |
break; |
} |
/* |
if (AUTO_DEMANGLING || GNU_DEMANGLING) |
*/ |
{ |
if (success && expect_func) |
{ |
func_done = 1; |
if (LUCID_DEMANGLING || ARM_DEMANGLING || EDG_DEMANGLING) |
{ |
forget_types (work); |
} |
success = demangle_args (work, mangled, declp); |
/* Since template include the mangling of their return types, |
we must set expect_func to 0 so that we don't try do |
demangle more arguments the next time we get here. */ |
expect_func = 0; |
} |
} |
} |
if (success && !func_done) |
{ |
if (AUTO_DEMANGLING || GNU_DEMANGLING) |
{ |
/* With GNU style demangling, bar__3foo is 'foo::bar(void)', and |
bar__3fooi is 'foo::bar(int)'. We get here when we find the |
first case, and need to ensure that the '(void)' gets added to |
the current declp. Note that with ARM/HP, the first case |
represents the name of a static data member 'foo::bar', |
which is in the current declp, so we leave it alone. */ |
success = demangle_args (work, mangled, declp); |
} |
} |
if (success && PRINT_ARG_TYPES) |
{ |
if (work->static_type) |
string_append (declp, " static"); |
if (work->type_quals != TYPE_UNQUALIFIED) |
{ |
APPEND_BLANK (declp); |
string_append (declp, qualifier_string (work->type_quals)); |
} |
} |
return (success); |
} |
#if 0 |
static int |
demangle_method_args (struct work_stuff *work, const char **mangled, |
string *declp) |
{ |
int success = 0; |
if (work -> static_type) |
{ |
string_append (declp, *mangled + 1); |
*mangled += strlen (*mangled); |
success = 1; |
} |
else |
{ |
success = demangle_args (work, mangled, declp); |
} |
return (success); |
} |
#endif |
static int |
demangle_template_template_parm (struct work_stuff *work, |
const char **mangled, string *tname) |
{ |
int i; |
int r; |
int need_comma = 0; |
int success = 1; |
string temp; |
string_append (tname, "template <"); |
/* get size of template parameter list */ |
if (get_count (mangled, &r)) |
{ |
for (i = 0; i < r; i++) |
{ |
if (need_comma) |
{ |
string_append (tname, ", "); |
} |
/* Z for type parameters */ |
if (**mangled == 'Z') |
{ |
(*mangled)++; |
string_append (tname, "class"); |
} |
/* z for template parameters */ |
else if (**mangled == 'z') |
{ |
(*mangled)++; |
success = |
demangle_template_template_parm (work, mangled, tname); |
if (!success) |
{ |
break; |
} |
} |
else |
{ |
/* temp is initialized in do_type */ |
success = do_type (work, mangled, &temp); |
if (success) |
{ |
string_appends (tname, &temp); |
} |
string_delete(&temp); |
if (!success) |
{ |
break; |
} |
} |
need_comma = 1; |
} |
} |
if (tname->p[-1] == '>') |
string_append (tname, " "); |
string_append (tname, "> class"); |
return (success); |
} |
static int |
demangle_expression (struct work_stuff *work, const char **mangled, |
string *s, type_kind_t tk) |
{ |
int need_operator = 0; |
int success; |
success = 1; |
string_appendn (s, "(", 1); |
(*mangled)++; |
while (success && **mangled != 'W' && **mangled != '\0') |
{ |
if (need_operator) |
{ |
size_t i; |
size_t len; |
success = 0; |
len = strlen (*mangled); |
for (i = 0; i < ARRAY_SIZE (optable); ++i) |
{ |
size_t l = strlen (optable[i].in); |
if (l <= len |
&& memcmp (optable[i].in, *mangled, l) == 0) |
{ |
string_appendn (s, " ", 1); |
string_append (s, optable[i].out); |
string_appendn (s, " ", 1); |
success = 1; |
(*mangled) += l; |
break; |
} |
} |
if (!success) |
break; |
} |
else |
need_operator = 1; |
success = demangle_template_value_parm (work, mangled, s, tk); |
} |
if (**mangled != 'W') |
success = 0; |
else |
{ |
string_appendn (s, ")", 1); |
(*mangled)++; |
} |
return success; |
} |
static int |
demangle_integral_value (struct work_stuff *work, |
const char **mangled, string *s) |
{ |
int success; |
if (**mangled == 'E') |
success = demangle_expression (work, mangled, s, tk_integral); |
else if (**mangled == 'Q' || **mangled == 'K') |
success = demangle_qualified (work, mangled, s, 0, 1); |
else |
{ |
int value; |
/* By default, we let the number decide whether we shall consume an |
underscore. */ |
int multidigit_without_leading_underscore = 0; |
int leave_following_underscore = 0; |
success = 0; |
if (**mangled == '_') |
{ |
if (mangled[0][1] == 'm') |
{ |
/* Since consume_count_with_underscores does not handle the |
`m'-prefix we must do it here, using consume_count and |
adjusting underscores: we have to consume the underscore |
matching the prepended one. */ |
multidigit_without_leading_underscore = 1; |
string_appendn (s, "-", 1); |
(*mangled) += 2; |
} |
else |
{ |
/* Do not consume a following underscore; |
consume_count_with_underscores will consume what |
should be consumed. */ |
leave_following_underscore = 1; |
} |
} |
else |
{ |
/* Negative numbers are indicated with a leading `m'. */ |
if (**mangled == 'm') |
{ |
string_appendn (s, "-", 1); |
(*mangled)++; |
} |
/* Since consume_count_with_underscores does not handle |
multi-digit numbers that do not start with an underscore, |
and this number can be an integer template parameter, |
we have to call consume_count. */ |
multidigit_without_leading_underscore = 1; |
/* These multi-digit numbers never end on an underscore, |
so if there is one then don't eat it. */ |
leave_following_underscore = 1; |
} |
/* We must call consume_count if we expect to remove a trailing |
underscore, since consume_count_with_underscores expects |
the leading underscore (that we consumed) if it is to handle |
multi-digit numbers. */ |
if (multidigit_without_leading_underscore) |
value = consume_count (mangled); |
else |
value = consume_count_with_underscores (mangled); |
if (value != -1) |
{ |
char buf[INTBUF_SIZE]; |
sprintf (buf, "%d", value); |
string_append (s, buf); |
/* Numbers not otherwise delimited, might have an underscore |
appended as a delimeter, which we should skip. |
??? This used to always remove a following underscore, which |
is wrong. If other (arbitrary) cases are followed by an |
underscore, we need to do something more radical. */ |
if ((value > 9 || multidigit_without_leading_underscore) |
&& ! leave_following_underscore |
&& **mangled == '_') |
(*mangled)++; |
/* All is well. */ |
success = 1; |
} |
} |
return success; |
} |
/* Demangle the real value in MANGLED. */ |
static int |
demangle_real_value (struct work_stuff *work, |
const char **mangled, string *s) |
{ |
if (**mangled == 'E') |
return demangle_expression (work, mangled, s, tk_real); |
if (**mangled == 'm') |
{ |
string_appendn (s, "-", 1); |
(*mangled)++; |
} |
while (ISDIGIT ((unsigned char)**mangled)) |
{ |
string_appendn (s, *mangled, 1); |
(*mangled)++; |
} |
if (**mangled == '.') /* fraction */ |
{ |
string_appendn (s, ".", 1); |
(*mangled)++; |
while (ISDIGIT ((unsigned char)**mangled)) |
{ |
string_appendn (s, *mangled, 1); |
(*mangled)++; |
} |
} |
if (**mangled == 'e') /* exponent */ |
{ |
string_appendn (s, "e", 1); |
(*mangled)++; |
while (ISDIGIT ((unsigned char)**mangled)) |
{ |
string_appendn (s, *mangled, 1); |
(*mangled)++; |
} |
} |
return 1; |
} |
static int |
demangle_template_value_parm (struct work_stuff *work, const char **mangled, |
string *s, type_kind_t tk) |
{ |
int success = 1; |
if (**mangled == 'Y') |
{ |
/* The next argument is a template parameter. */ |
int idx; |
(*mangled)++; |
idx = consume_count_with_underscores (mangled); |
if (idx == -1 |
|| (work->tmpl_argvec && idx >= work->ntmpl_args) |
|| consume_count_with_underscores (mangled) == -1) |
return -1; |
if (work->tmpl_argvec) |
string_append (s, work->tmpl_argvec[idx]); |
else |
string_append_template_idx (s, idx); |
} |
else if (tk == tk_integral) |
success = demangle_integral_value (work, mangled, s); |
else if (tk == tk_char) |
{ |
char tmp[2]; |
int val; |
if (**mangled == 'm') |
{ |
string_appendn (s, "-", 1); |
(*mangled)++; |
} |
string_appendn (s, "'", 1); |
val = consume_count(mangled); |
if (val <= 0) |
success = 0; |
else |
{ |
tmp[0] = (char)val; |
tmp[1] = '\0'; |
string_appendn (s, &tmp[0], 1); |
string_appendn (s, "'", 1); |
} |
} |
else if (tk == tk_bool) |
{ |
int val = consume_count (mangled); |
if (val == 0) |
string_appendn (s, "false", 5); |
else if (val == 1) |
string_appendn (s, "true", 4); |
else |
success = 0; |
} |
else if (tk == tk_real) |
success = demangle_real_value (work, mangled, s); |
else if (tk == tk_pointer || tk == tk_reference) |
{ |
if (**mangled == 'Q') |
success = demangle_qualified (work, mangled, s, |
/*isfuncname=*/0, |
/*append=*/1); |
else |
{ |
int symbol_len = consume_count (mangled); |
if (symbol_len == -1) |
return -1; |
if (symbol_len == 0) |
string_appendn (s, "0", 1); |
else |
{ |
char *p = XNEWVEC (char, symbol_len + 1), *q; |
strncpy (p, *mangled, symbol_len); |
p [symbol_len] = '\0'; |
/* We use cplus_demangle here, rather than |
internal_cplus_demangle, because the name of the entity |
mangled here does not make use of any of the squangling |
or type-code information we have built up thus far; it is |
mangled independently. */ |
q = cplus_demangle (p, work->options); |
if (tk == tk_pointer) |
string_appendn (s, "&", 1); |
/* FIXME: Pointer-to-member constants should get a |
qualifying class name here. */ |
if (q) |
{ |
string_append (s, q); |
free (q); |
} |
else |
string_append (s, p); |
free (p); |
} |
*mangled += symbol_len; |
} |
} |
return success; |
} |
/* Demangle the template name in MANGLED. The full name of the |
template (e.g., S<int>) is placed in TNAME. The name without the |
template parameters (e.g. S) is placed in TRAWNAME if TRAWNAME is |
non-NULL. If IS_TYPE is nonzero, this template is a type template, |
not a function template. If both IS_TYPE and REMEMBER are nonzero, |
the template is remembered in the list of back-referenceable |
types. */ |
static int |
demangle_template (struct work_stuff *work, const char **mangled, |
string *tname, string *trawname, |
int is_type, int remember) |
{ |
int i; |
int r; |
int need_comma = 0; |
int success = 0; |
int is_java_array = 0; |
string temp; |
(*mangled)++; |
if (is_type) |
{ |
/* get template name */ |
if (**mangled == 'z') |
{ |
int idx; |
(*mangled)++; |
(*mangled)++; |
idx = consume_count_with_underscores (mangled); |
if (idx == -1 |
|| (work->tmpl_argvec && idx >= work->ntmpl_args) |
|| consume_count_with_underscores (mangled) == -1) |
return (0); |
if (work->tmpl_argvec) |
{ |
string_append (tname, work->tmpl_argvec[idx]); |
if (trawname) |
string_append (trawname, work->tmpl_argvec[idx]); |
} |
else |
{ |
string_append_template_idx (tname, idx); |
if (trawname) |
string_append_template_idx (trawname, idx); |
} |
} |
else |
{ |
if ((r = consume_count (mangled)) <= 0 |
|| (int) strlen (*mangled) < r) |
{ |
return (0); |
} |
is_java_array = (work -> options & DMGL_JAVA) |
&& strncmp (*mangled, "JArray1Z", 8) == 0; |
if (! is_java_array) |
{ |
string_appendn (tname, *mangled, r); |
} |
if (trawname) |
string_appendn (trawname, *mangled, r); |
*mangled += r; |
} |
} |
if (!is_java_array) |
string_append (tname, "<"); |
/* get size of template parameter list */ |
if (!get_count (mangled, &r)) |
{ |
return (0); |
} |
if (!is_type) |
{ |
/* Create an array for saving the template argument values. */ |
work->tmpl_argvec = XNEWVEC (char *, r); |
work->ntmpl_args = r; |
for (i = 0; i < r; i++) |
work->tmpl_argvec[i] = 0; |
} |
for (i = 0; i < r; i++) |
{ |
if (need_comma) |
{ |
string_append (tname, ", "); |
} |
/* Z for type parameters */ |
if (**mangled == 'Z') |
{ |
(*mangled)++; |
/* temp is initialized in do_type */ |
success = do_type (work, mangled, &temp); |
if (success) |
{ |
string_appends (tname, &temp); |
if (!is_type) |
{ |
/* Save the template argument. */ |
int len = temp.p - temp.b; |
work->tmpl_argvec[i] = XNEWVEC (char, len + 1); |
memcpy (work->tmpl_argvec[i], temp.b, len); |
work->tmpl_argvec[i][len] = '\0'; |
} |
} |
string_delete(&temp); |
if (!success) |
{ |
break; |
} |
} |
/* z for template parameters */ |
else if (**mangled == 'z') |
{ |
int r2; |
(*mangled)++; |
success = demangle_template_template_parm (work, mangled, tname); |
if (success |
&& (r2 = consume_count (mangled)) > 0 |
&& (int) strlen (*mangled) >= r2) |
{ |
string_append (tname, " "); |
string_appendn (tname, *mangled, r2); |
if (!is_type) |
{ |
/* Save the template argument. */ |
int len = r2; |
work->tmpl_argvec[i] = XNEWVEC (char, len + 1); |
memcpy (work->tmpl_argvec[i], *mangled, len); |
work->tmpl_argvec[i][len] = '\0'; |
} |
*mangled += r2; |
} |
if (!success) |
{ |
break; |
} |
} |
else |
{ |
string param; |
string* s; |
/* otherwise, value parameter */ |
/* temp is initialized in do_type */ |
success = do_type (work, mangled, &temp); |
string_delete(&temp); |
if (!success) |
break; |
if (!is_type) |
{ |
s = ¶m; |
string_init (s); |
} |
else |
s = tname; |
success = demangle_template_value_parm (work, mangled, s, |
(type_kind_t) success); |
if (!success) |
{ |
if (!is_type) |
string_delete (s); |
success = 0; |
break; |
} |
if (!is_type) |
{ |
int len = s->p - s->b; |
work->tmpl_argvec[i] = XNEWVEC (char, len + 1); |
memcpy (work->tmpl_argvec[i], s->b, len); |
work->tmpl_argvec[i][len] = '\0'; |
string_appends (tname, s); |
string_delete (s); |
} |
} |
need_comma = 1; |
} |
if (is_java_array) |
{ |
string_append (tname, "[]"); |
} |
else |
{ |
if (tname->p[-1] == '>') |
string_append (tname, " "); |
string_append (tname, ">"); |
} |
if (is_type && remember) |
{ |
const int bindex = register_Btype (work); |
remember_Btype (work, tname->b, LEN_STRING (tname), bindex); |
} |
/* |
if (work -> static_type) |
{ |
string_append (declp, *mangled + 1); |
*mangled += strlen (*mangled); |
success = 1; |
} |
else |
{ |
success = demangle_args (work, mangled, declp); |
} |
} |
*/ |
return (success); |
} |
static int |
arm_pt (struct work_stuff *work, const char *mangled, |
int n, const char **anchor, const char **args) |
{ |
/* Check if ARM template with "__pt__" in it ("parameterized type") */ |
/* Allow HP also here, because HP's cfront compiler follows ARM to some extent */ |
if ((ARM_DEMANGLING || HP_DEMANGLING) && (*anchor = strstr (mangled, "__pt__"))) |
{ |
int len; |
*args = *anchor + 6; |
len = consume_count (args); |
if (len == -1) |
return 0; |
if (*args + len == mangled + n && **args == '_') |
{ |
++*args; |
return 1; |
} |
} |
if (AUTO_DEMANGLING || EDG_DEMANGLING) |
{ |
if ((*anchor = strstr (mangled, "__tm__")) |
|| (*anchor = strstr (mangled, "__ps__")) |
|| (*anchor = strstr (mangled, "__pt__"))) |
{ |
int len; |
*args = *anchor + 6; |
len = consume_count (args); |
if (len == -1) |
return 0; |
if (*args + len == mangled + n && **args == '_') |
{ |
++*args; |
return 1; |
} |
} |
else if ((*anchor = strstr (mangled, "__S"))) |
{ |
int len; |
*args = *anchor + 3; |
len = consume_count (args); |
if (len == -1) |
return 0; |
if (*args + len == mangled + n && **args == '_') |
{ |
++*args; |
return 1; |
} |
} |
} |
return 0; |
} |
static void |
demangle_arm_hp_template (struct work_stuff *work, const char **mangled, |
int n, string *declp) |
{ |
const char *p; |
const char *args; |
const char *e = *mangled + n; |
string arg; |
/* Check for HP aCC template spec: classXt1t2 where t1, t2 are |
template args */ |
if (HP_DEMANGLING && ((*mangled)[n] == 'X')) |
{ |
char *start_spec_args = NULL; |
int hold_options; |
/* First check for and omit template specialization pseudo-arguments, |
such as in "Spec<#1,#1.*>" */ |
start_spec_args = strchr (*mangled, '<'); |
if (start_spec_args && (start_spec_args - *mangled < n)) |
string_appendn (declp, *mangled, start_spec_args - *mangled); |
else |
string_appendn (declp, *mangled, n); |
(*mangled) += n + 1; |
string_init (&arg); |
if (work->temp_start == -1) /* non-recursive call */ |
work->temp_start = declp->p - declp->b; |
/* We want to unconditionally demangle parameter types in |
template parameters. */ |
hold_options = work->options; |
work->options |= DMGL_PARAMS; |
string_append (declp, "<"); |
while (1) |
{ |
string_delete (&arg); |
switch (**mangled) |
{ |
case 'T': |
/* 'T' signals a type parameter */ |
(*mangled)++; |
if (!do_type (work, mangled, &arg)) |
goto hpacc_template_args_done; |
break; |
case 'U': |
case 'S': |
/* 'U' or 'S' signals an integral value */ |
if (!do_hpacc_template_const_value (work, mangled, &arg)) |
goto hpacc_template_args_done; |
break; |
case 'A': |
/* 'A' signals a named constant expression (literal) */ |
if (!do_hpacc_template_literal (work, mangled, &arg)) |
goto hpacc_template_args_done; |
break; |
default: |
/* Today, 1997-09-03, we have only the above types |
of template parameters */ |
/* FIXME: maybe this should fail and return null */ |
goto hpacc_template_args_done; |
} |
string_appends (declp, &arg); |
/* Check if we're at the end of template args. |
0 if at end of static member of template class, |
_ if done with template args for a function */ |
if ((**mangled == '\000') || (**mangled == '_')) |
break; |
else |
string_append (declp, ","); |
} |
hpacc_template_args_done: |
string_append (declp, ">"); |
string_delete (&arg); |
if (**mangled == '_') |
(*mangled)++; |
work->options = hold_options; |
return; |
} |
/* ARM template? (Also handles HP cfront extensions) */ |
else if (arm_pt (work, *mangled, n, &p, &args)) |
{ |
int hold_options; |
string type_str; |
string_init (&arg); |
string_appendn (declp, *mangled, p - *mangled); |
if (work->temp_start == -1) /* non-recursive call */ |
work->temp_start = declp->p - declp->b; |
/* We want to unconditionally demangle parameter types in |
template parameters. */ |
hold_options = work->options; |
work->options |= DMGL_PARAMS; |
string_append (declp, "<"); |
/* should do error checking here */ |
while (args < e) { |
string_delete (&arg); |
/* Check for type or literal here */ |
switch (*args) |
{ |
/* HP cfront extensions to ARM for template args */ |
/* spec: Xt1Lv1 where t1 is a type, v1 is a literal value */ |
/* FIXME: We handle only numeric literals for HP cfront */ |
case 'X': |
/* A typed constant value follows */ |
args++; |
if (!do_type (work, &args, &type_str)) |
goto cfront_template_args_done; |
string_append (&arg, "("); |
string_appends (&arg, &type_str); |
string_delete (&type_str); |
string_append (&arg, ")"); |
if (*args != 'L') |
goto cfront_template_args_done; |
args++; |
/* Now snarf a literal value following 'L' */ |
if (!snarf_numeric_literal (&args, &arg)) |
goto cfront_template_args_done; |
break; |
case 'L': |
/* Snarf a literal following 'L' */ |
args++; |
if (!snarf_numeric_literal (&args, &arg)) |
goto cfront_template_args_done; |
break; |
default: |
/* Not handling other HP cfront stuff */ |
{ |
const char* old_args = args; |
if (!do_type (work, &args, &arg)) |
goto cfront_template_args_done; |
/* Fail if we didn't make any progress: prevent infinite loop. */ |
if (args == old_args) |
{ |
work->options = hold_options; |
return; |
} |
} |
} |
string_appends (declp, &arg); |
string_append (declp, ","); |
} |
cfront_template_args_done: |
string_delete (&arg); |
if (args >= e) |
--declp->p; /* remove extra comma */ |
string_append (declp, ">"); |
work->options = hold_options; |
} |
else if (n>10 && strncmp (*mangled, "_GLOBAL_", 8) == 0 |
&& (*mangled)[9] == 'N' |
&& (*mangled)[8] == (*mangled)[10] |
&& strchr (cplus_markers, (*mangled)[8])) |
{ |
/* A member of the anonymous namespace. */ |
string_append (declp, "{anonymous}"); |
} |
else |
{ |
if (work->temp_start == -1) /* non-recursive call only */ |
work->temp_start = 0; /* disable in recursive calls */ |
string_appendn (declp, *mangled, n); |
} |
*mangled += n; |
} |
/* Extract a class name, possibly a template with arguments, from the |
mangled string; qualifiers, local class indicators, etc. have |
already been dealt with */ |
static int |
demangle_class_name (struct work_stuff *work, const char **mangled, |
string *declp) |
{ |
int n; |
int success = 0; |
n = consume_count (mangled); |
if (n == -1) |
return 0; |
if ((int) strlen (*mangled) >= n) |
{ |
demangle_arm_hp_template (work, mangled, n, declp); |
success = 1; |
} |
return (success); |
} |
/* |
LOCAL FUNCTION |
demangle_class -- demangle a mangled class sequence |
SYNOPSIS |
static int |
demangle_class (struct work_stuff *work, const char **mangled, |
strint *declp) |
DESCRIPTION |
DECLP points to the buffer into which demangling is being done. |
*MANGLED points to the current token to be demangled. On input, |
it points to a mangled class (I.E. "3foo", "13verylongclass", etc.) |
On exit, it points to the next token after the mangled class on |
success, or the first unconsumed token on failure. |
If the CONSTRUCTOR or DESTRUCTOR flags are set in WORK, then |
we are demangling a constructor or destructor. In this case |
we prepend "class::class" or "class::~class" to DECLP. |
Otherwise, we prepend "class::" to the current DECLP. |
Reset the constructor/destructor flags once they have been |
"consumed". This allows demangle_class to be called later during |
the same demangling, to do normal class demangling. |
Returns 1 if demangling is successful, 0 otherwise. |
*/ |
static int |
demangle_class (struct work_stuff *work, const char **mangled, string *declp) |
{ |
int success = 0; |
int btype; |
string class_name; |
char *save_class_name_end = 0; |
string_init (&class_name); |
btype = register_Btype (work); |
if (demangle_class_name (work, mangled, &class_name)) |
{ |
save_class_name_end = class_name.p; |
if ((work->constructor & 1) || (work->destructor & 1)) |
{ |
/* adjust so we don't include template args */ |
if (work->temp_start && (work->temp_start != -1)) |
{ |
class_name.p = class_name.b + work->temp_start; |
} |
string_prepends (declp, &class_name); |
if (work -> destructor & 1) |
{ |
string_prepend (declp, "~"); |
work -> destructor -= 1; |
} |
else |
{ |
work -> constructor -= 1; |
} |
} |
class_name.p = save_class_name_end; |
remember_Ktype (work, class_name.b, LEN_STRING(&class_name)); |
remember_Btype (work, class_name.b, LEN_STRING(&class_name), btype); |
string_prepend (declp, SCOPE_STRING (work)); |
string_prepends (declp, &class_name); |
success = 1; |
} |
string_delete (&class_name); |
return (success); |
} |
/* Called when there's a "__" in the mangled name, with `scan' pointing to |
the rightmost guess. |
Find the correct "__"-sequence where the function name ends and the |
signature starts, which is ambiguous with GNU mangling. |
Call demangle_signature here, so we can make sure we found the right |
one; *mangled will be consumed so caller will not make further calls to |
demangle_signature. */ |
static int |
iterate_demangle_function (struct work_stuff *work, const char **mangled, |
string *declp, const char *scan) |
{ |
const char *mangle_init = *mangled; |
int success = 0; |
string decl_init; |
struct work_stuff work_init; |
if (*(scan + 2) == '\0') |
return 0; |
/* Do not iterate for some demangling modes, or if there's only one |
"__"-sequence. This is the normal case. */ |
if (ARM_DEMANGLING || LUCID_DEMANGLING || HP_DEMANGLING || EDG_DEMANGLING |
|| strstr (scan + 2, "__") == NULL) |
return demangle_function_name (work, mangled, declp, scan); |
/* Save state so we can restart if the guess at the correct "__" was |
wrong. */ |
string_init (&decl_init); |
string_appends (&decl_init, declp); |
memset (&work_init, 0, sizeof work_init); |
work_stuff_copy_to_from (&work_init, work); |
/* Iterate over occurrences of __, allowing names and types to have a |
"__" sequence in them. We must start with the first (not the last) |
occurrence, since "__" most often occur between independent mangled |
parts, hence starting at the last occurence inside a signature |
might get us a "successful" demangling of the signature. */ |
while (scan[2]) |
{ |
if (demangle_function_name (work, mangled, declp, scan)) |
{ |
success = demangle_signature (work, mangled, declp); |
if (success) |
break; |
} |
/* Reset demangle state for the next round. */ |
*mangled = mangle_init; |
string_clear (declp); |
string_appends (declp, &decl_init); |
work_stuff_copy_to_from (work, &work_init); |
/* Leave this underscore-sequence. */ |
scan += 2; |
/* Scan for the next "__" sequence. */ |
while (*scan && (scan[0] != '_' || scan[1] != '_')) |
scan++; |
/* Move to last "__" in this sequence. */ |
while (*scan && *scan == '_') |
scan++; |
scan -= 2; |
} |
/* Delete saved state. */ |
delete_work_stuff (&work_init); |
string_delete (&decl_init); |
return success; |
} |
/* |
LOCAL FUNCTION |
demangle_prefix -- consume the mangled name prefix and find signature |
SYNOPSIS |
static int |
demangle_prefix (struct work_stuff *work, const char **mangled, |
string *declp); |
DESCRIPTION |
Consume and demangle the prefix of the mangled name. |
While processing the function name root, arrange to call |
demangle_signature if the root is ambiguous. |
DECLP points to the string buffer into which demangled output is |
placed. On entry, the buffer is empty. On exit it contains |
the root function name, the demangled operator name, or in some |
special cases either nothing or the completely demangled result. |
MANGLED points to the current pointer into the mangled name. As each |
token of the mangled name is consumed, it is updated. Upon entry |
the current mangled name pointer points to the first character of |
the mangled name. Upon exit, it should point to the first character |
of the signature if demangling was successful, or to the first |
unconsumed character if demangling of the prefix was unsuccessful. |
Returns 1 on success, 0 otherwise. |
*/ |
static int |
demangle_prefix (struct work_stuff *work, const char **mangled, |
string *declp) |
{ |
int success = 1; |
const char *scan; |
int i; |
if (strlen(*mangled) > 6 |
&& (strncmp(*mangled, "_imp__", 6) == 0 |
|| strncmp(*mangled, "__imp_", 6) == 0)) |
{ |
/* it's a symbol imported from a PE dynamic library. Check for both |
new style prefix _imp__ and legacy __imp_ used by older versions |
of dlltool. */ |
(*mangled) += 6; |
work->dllimported = 1; |
} |
else if (strlen(*mangled) >= 11 && strncmp(*mangled, "_GLOBAL_", 8) == 0) |
{ |
char *marker = strchr (cplus_markers, (*mangled)[8]); |
if (marker != NULL && *marker == (*mangled)[10]) |
{ |
if ((*mangled)[9] == 'D') |
{ |
/* it's a GNU global destructor to be executed at program exit */ |
(*mangled) += 11; |
work->destructor = 2; |
if (gnu_special (work, mangled, declp)) |
return success; |
} |
else if ((*mangled)[9] == 'I') |
{ |
/* it's a GNU global constructor to be executed at program init */ |
(*mangled) += 11; |
work->constructor = 2; |
if (gnu_special (work, mangled, declp)) |
return success; |
} |
} |
} |
else if ((ARM_DEMANGLING || HP_DEMANGLING || EDG_DEMANGLING) && strncmp(*mangled, "__std__", 7) == 0) |
{ |
/* it's a ARM global destructor to be executed at program exit */ |
(*mangled) += 7; |
work->destructor = 2; |
} |
else if ((ARM_DEMANGLING || HP_DEMANGLING || EDG_DEMANGLING) && strncmp(*mangled, "__sti__", 7) == 0) |
{ |
/* it's a ARM global constructor to be executed at program initial */ |
(*mangled) += 7; |
work->constructor = 2; |
} |
/* This block of code is a reduction in strength time optimization |
of: |
scan = strstr (*mangled, "__"); */ |
{ |
scan = *mangled; |
do { |
scan = strchr (scan, '_'); |
} while (scan != NULL && *++scan != '_'); |
if (scan != NULL) --scan; |
} |
if (scan != NULL) |
{ |
/* We found a sequence of two or more '_', ensure that we start at |
the last pair in the sequence. */ |
i = strspn (scan, "_"); |
if (i > 2) |
{ |
scan += (i - 2); |
} |
} |
if (scan == NULL) |
{ |
success = 0; |
} |
else if (work -> static_type) |
{ |
if (!ISDIGIT ((unsigned char)scan[0]) && (scan[0] != 't')) |
{ |
success = 0; |
} |
} |
else if ((scan == *mangled) |
&& (ISDIGIT ((unsigned char)scan[2]) || (scan[2] == 'Q') |
|| (scan[2] == 't') || (scan[2] == 'K') || (scan[2] == 'H'))) |
{ |
/* The ARM says nothing about the mangling of local variables. |
But cfront mangles local variables by prepending __<nesting_level> |
to them. As an extension to ARM demangling we handle this case. */ |
if ((LUCID_DEMANGLING || ARM_DEMANGLING || HP_DEMANGLING) |
&& ISDIGIT ((unsigned char)scan[2])) |
{ |
*mangled = scan + 2; |
consume_count (mangled); |
string_append (declp, *mangled); |
*mangled += strlen (*mangled); |
success = 1; |
} |
else |
{ |
/* A GNU style constructor starts with __[0-9Qt]. But cfront uses |
names like __Q2_3foo3bar for nested type names. So don't accept |
this style of constructor for cfront demangling. A GNU |
style member-template constructor starts with 'H'. */ |
if (!(LUCID_DEMANGLING || ARM_DEMANGLING || HP_DEMANGLING || EDG_DEMANGLING)) |
work -> constructor += 1; |
*mangled = scan + 2; |
} |
} |
else if (ARM_DEMANGLING && scan[2] == 'p' && scan[3] == 't') |
{ |
/* Cfront-style parameterized type. Handled later as a signature. */ |
success = 1; |
/* ARM template? */ |
demangle_arm_hp_template (work, mangled, strlen (*mangled), declp); |
} |
else if (EDG_DEMANGLING && ((scan[2] == 't' && scan[3] == 'm') |
|| (scan[2] == 'p' && scan[3] == 's') |
|| (scan[2] == 'p' && scan[3] == 't'))) |
{ |
/* EDG-style parameterized type. Handled later as a signature. */ |
success = 1; |
/* EDG template? */ |
demangle_arm_hp_template (work, mangled, strlen (*mangled), declp); |
} |
else if ((scan == *mangled) && !ISDIGIT ((unsigned char)scan[2]) |
&& (scan[2] != 't')) |
{ |
/* Mangled name starts with "__". Skip over any leading '_' characters, |
then find the next "__" that separates the prefix from the signature. |
*/ |
if (!(ARM_DEMANGLING || LUCID_DEMANGLING || HP_DEMANGLING || EDG_DEMANGLING) |
|| (arm_special (mangled, declp) == 0)) |
{ |
while (*scan == '_') |
{ |
scan++; |
} |
if ((scan = strstr (scan, "__")) == NULL || (*(scan + 2) == '\0')) |
{ |
/* No separator (I.E. "__not_mangled"), or empty signature |
(I.E. "__not_mangled_either__") */ |
success = 0; |
} |
else |
return iterate_demangle_function (work, mangled, declp, scan); |
} |
} |
else if (*(scan + 2) != '\0') |
{ |
/* Mangled name does not start with "__" but does have one somewhere |
in there with non empty stuff after it. Looks like a global |
function name. Iterate over all "__":s until the right |
one is found. */ |
return iterate_demangle_function (work, mangled, declp, scan); |
} |
else |
{ |
/* Doesn't look like a mangled name */ |
success = 0; |
} |
if (!success && (work->constructor == 2 || work->destructor == 2)) |
{ |
string_append (declp, *mangled); |
*mangled += strlen (*mangled); |
success = 1; |
} |
return (success); |
} |
/* |
LOCAL FUNCTION |
gnu_special -- special handling of gnu mangled strings |
SYNOPSIS |
static int |
gnu_special (struct work_stuff *work, const char **mangled, |
string *declp); |
DESCRIPTION |
Process some special GNU style mangling forms that don't fit |
the normal pattern. For example: |
_$_3foo (destructor for class foo) |
_vt$foo (foo virtual table) |
_vt$foo$bar (foo::bar virtual table) |
__vt_foo (foo virtual table, new style with thunks) |
_3foo$varname (static data member) |
_Q22rs2tu$vw (static data member) |
__t6vector1Zii (constructor with template) |
__thunk_4__$_7ostream (virtual function thunk) |
*/ |
static int |
gnu_special (struct work_stuff *work, const char **mangled, string *declp) |
{ |
int n; |
int success = 1; |
const char *p; |
if ((*mangled)[0] == '_' |
&& strchr (cplus_markers, (*mangled)[1]) != NULL |
&& (*mangled)[2] == '_') |
{ |
/* Found a GNU style destructor, get past "_<CPLUS_MARKER>_" */ |
(*mangled) += 3; |
work -> destructor += 1; |
} |
else if ((*mangled)[0] == '_' |
&& (((*mangled)[1] == '_' |
&& (*mangled)[2] == 'v' |
&& (*mangled)[3] == 't' |
&& (*mangled)[4] == '_') |
|| ((*mangled)[1] == 'v' |
&& (*mangled)[2] == 't' |
&& strchr (cplus_markers, (*mangled)[3]) != NULL))) |
{ |
/* Found a GNU style virtual table, get past "_vt<CPLUS_MARKER>" |
and create the decl. Note that we consume the entire mangled |
input string, which means that demangle_signature has no work |
to do. */ |
if ((*mangled)[2] == 'v') |
(*mangled) += 5; /* New style, with thunks: "__vt_" */ |
else |
(*mangled) += 4; /* Old style, no thunks: "_vt<CPLUS_MARKER>" */ |
while (**mangled != '\0') |
{ |
switch (**mangled) |
{ |
case 'Q': |
case 'K': |
success = demangle_qualified (work, mangled, declp, 0, 1); |
break; |
case 't': |
success = demangle_template (work, mangled, declp, 0, 1, |
1); |
break; |
default: |
if (ISDIGIT((unsigned char)*mangled[0])) |
{ |
n = consume_count(mangled); |
/* We may be seeing a too-large size, or else a |
".<digits>" indicating a static local symbol. In |
any case, declare victory and move on; *don't* try |
to use n to allocate. */ |
if (n > (int) strlen (*mangled)) |
{ |
success = 1; |
break; |
} |
} |
else |
{ |
n = strcspn (*mangled, cplus_markers); |
} |
string_appendn (declp, *mangled, n); |
(*mangled) += n; |
} |
p = strpbrk (*mangled, cplus_markers); |
if (success && ((p == NULL) || (p == *mangled))) |
{ |
if (p != NULL) |
{ |
string_append (declp, SCOPE_STRING (work)); |
(*mangled)++; |
} |
} |
else |
{ |
success = 0; |
break; |
} |
} |
if (success) |
string_append (declp, " virtual table"); |
} |
else if ((*mangled)[0] == '_' |
&& (strchr("0123456789Qt", (*mangled)[1]) != NULL) |
&& (p = strpbrk (*mangled, cplus_markers)) != NULL) |
{ |
/* static data member, "_3foo$varname" for example */ |
(*mangled)++; |
switch (**mangled) |
{ |
case 'Q': |
case 'K': |
success = demangle_qualified (work, mangled, declp, 0, 1); |
break; |
case 't': |
success = demangle_template (work, mangled, declp, 0, 1, 1); |
break; |
default: |
n = consume_count (mangled); |
if (n < 0 || n > (long) strlen (*mangled)) |
{ |
success = 0; |
break; |
} |
if (n > 10 && strncmp (*mangled, "_GLOBAL_", 8) == 0 |
&& (*mangled)[9] == 'N' |
&& (*mangled)[8] == (*mangled)[10] |
&& strchr (cplus_markers, (*mangled)[8])) |
{ |
/* A member of the anonymous namespace. There's information |
about what identifier or filename it was keyed to, but |
it's just there to make the mangled name unique; we just |
step over it. */ |
string_append (declp, "{anonymous}"); |
(*mangled) += n; |
/* Now p points to the marker before the N, so we need to |
update it to the first marker after what we consumed. */ |
p = strpbrk (*mangled, cplus_markers); |
break; |
} |
string_appendn (declp, *mangled, n); |
(*mangled) += n; |
} |
if (success && (p == *mangled)) |
{ |
/* Consumed everything up to the cplus_marker, append the |
variable name. */ |
(*mangled)++; |
string_append (declp, SCOPE_STRING (work)); |
n = strlen (*mangled); |
string_appendn (declp, *mangled, n); |
(*mangled) += n; |
} |
else |
{ |
success = 0; |
} |
} |
else if (strncmp (*mangled, "__thunk_", 8) == 0) |
{ |
int delta; |
(*mangled) += 8; |
delta = consume_count (mangled); |
if (delta == -1) |
success = 0; |
else |
{ |
char *method = internal_cplus_demangle (work, ++*mangled); |
if (method) |
{ |
char buf[50]; |
sprintf (buf, "virtual function thunk (delta:%d) for ", -delta); |
string_append (declp, buf); |
string_append (declp, method); |
free (method); |
n = strlen (*mangled); |
(*mangled) += n; |
} |
else |
{ |
success = 0; |
} |
} |
} |
else if (strncmp (*mangled, "__t", 3) == 0 |
&& ((*mangled)[3] == 'i' || (*mangled)[3] == 'f')) |
{ |
p = (*mangled)[3] == 'i' ? " type_info node" : " type_info function"; |
(*mangled) += 4; |
switch (**mangled) |
{ |
case 'Q': |
case 'K': |
success = demangle_qualified (work, mangled, declp, 0, 1); |
break; |
case 't': |
success = demangle_template (work, mangled, declp, 0, 1, 1); |
break; |
default: |
success = do_type (work, mangled, declp); |
break; |
} |
if (success && **mangled != '\0') |
success = 0; |
if (success) |
string_append (declp, p); |
} |
else |
{ |
success = 0; |
} |
return (success); |
} |
static void |
recursively_demangle(struct work_stuff *work, const char **mangled, |
string *result, int namelength) |
{ |
char * recurse = (char *)NULL; |
char * recurse_dem = (char *)NULL; |
recurse = XNEWVEC (char, namelength + 1); |
memcpy (recurse, *mangled, namelength); |
recurse[namelength] = '\000'; |
recurse_dem = cplus_demangle (recurse, work->options); |
if (recurse_dem) |
{ |
string_append (result, recurse_dem); |
free (recurse_dem); |
} |
else |
{ |
string_appendn (result, *mangled, namelength); |
} |
free (recurse); |
*mangled += namelength; |
} |
/* |
LOCAL FUNCTION |
arm_special -- special handling of ARM/lucid mangled strings |
SYNOPSIS |
static int |
arm_special (const char **mangled, |
string *declp); |
DESCRIPTION |
Process some special ARM style mangling forms that don't fit |
the normal pattern. For example: |
__vtbl__3foo (foo virtual table) |
__vtbl__3foo__3bar (bar::foo virtual table) |
*/ |
static int |
arm_special (const char **mangled, string *declp) |
{ |
int n; |
int success = 1; |
const char *scan; |
if (strncmp (*mangled, ARM_VTABLE_STRING, ARM_VTABLE_STRLEN) == 0) |
{ |
/* Found a ARM style virtual table, get past ARM_VTABLE_STRING |
and create the decl. Note that we consume the entire mangled |
input string, which means that demangle_signature has no work |
to do. */ |
scan = *mangled + ARM_VTABLE_STRLEN; |
while (*scan != '\0') /* first check it can be demangled */ |
{ |
n = consume_count (&scan); |
if (n == -1) |
{ |
return (0); /* no good */ |
} |
scan += n; |
if (scan[0] == '_' && scan[1] == '_') |
{ |
scan += 2; |
} |
} |
(*mangled) += ARM_VTABLE_STRLEN; |
while (**mangled != '\0') |
{ |
n = consume_count (mangled); |
if (n == -1 |
|| n > (long) strlen (*mangled)) |
return 0; |
string_prependn (declp, *mangled, n); |
(*mangled) += n; |
if ((*mangled)[0] == '_' && (*mangled)[1] == '_') |
{ |
string_prepend (declp, "::"); |
(*mangled) += 2; |
} |
} |
string_append (declp, " virtual table"); |
} |
else |
{ |
success = 0; |
} |
return (success); |
} |
/* |
LOCAL FUNCTION |
demangle_qualified -- demangle 'Q' qualified name strings |
SYNOPSIS |
static int |
demangle_qualified (struct work_stuff *, const char *mangled, |
string *result, int isfuncname, int append); |
DESCRIPTION |
Demangle a qualified name, such as "Q25Outer5Inner" which is |
the mangled form of "Outer::Inner". The demangled output is |
prepended or appended to the result string according to the |
state of the append flag. |
If isfuncname is nonzero, then the qualified name we are building |
is going to be used as a member function name, so if it is a |
constructor or destructor function, append an appropriate |
constructor or destructor name. I.E. for the above example, |
the result for use as a constructor is "Outer::Inner::Inner" |
and the result for use as a destructor is "Outer::Inner::~Inner". |
BUGS |
Numeric conversion is ASCII dependent (FIXME). |
*/ |
static int |
demangle_qualified (struct work_stuff *work, const char **mangled, |
string *result, int isfuncname, int append) |
{ |
int qualifiers = 0; |
int success = 1; |
char num[2]; |
string temp; |
string last_name; |
int bindex = register_Btype (work); |
/* We only make use of ISFUNCNAME if the entity is a constructor or |
destructor. */ |
isfuncname = (isfuncname |
&& ((work->constructor & 1) || (work->destructor & 1))); |
string_init (&temp); |
string_init (&last_name); |
if ((*mangled)[0] == 'K') |
{ |
/* Squangling qualified name reuse */ |
int idx; |
(*mangled)++; |
idx = consume_count_with_underscores (mangled); |
if (idx == -1 || idx >= work -> numk) |
success = 0; |
else |
string_append (&temp, work -> ktypevec[idx]); |
} |
else |
switch ((*mangled)[1]) |
{ |
case '_': |
/* GNU mangled name with more than 9 classes. The count is preceded |
by an underscore (to distinguish it from the <= 9 case) and followed |
by an underscore. */ |
(*mangled)++; |
qualifiers = consume_count_with_underscores (mangled); |
if (qualifiers == -1) |
success = 0; |
break; |
case '1': |
case '2': |
case '3': |
case '4': |
case '5': |
case '6': |
case '7': |
case '8': |
case '9': |
/* The count is in a single digit. */ |
num[0] = (*mangled)[1]; |
num[1] = '\0'; |
qualifiers = atoi (num); |
/* If there is an underscore after the digit, skip it. This is |
said to be for ARM-qualified names, but the ARM makes no |
mention of such an underscore. Perhaps cfront uses one. */ |
if ((*mangled)[2] == '_') |
{ |
(*mangled)++; |
} |
(*mangled) += 2; |
break; |
case '0': |
default: |
success = 0; |
} |
if (!success) |
return success; |
/* Pick off the names and collect them in the temp buffer in the order |
in which they are found, separated by '::'. */ |
while (qualifiers-- > 0) |
{ |
int remember_K = 1; |
string_clear (&last_name); |
if (*mangled[0] == '_') |
(*mangled)++; |
if (*mangled[0] == 't') |
{ |
/* Here we always append to TEMP since we will want to use |
the template name without the template parameters as a |
constructor or destructor name. The appropriate |
(parameter-less) value is returned by demangle_template |
in LAST_NAME. We do not remember the template type here, |
in order to match the G++ mangling algorithm. */ |
success = demangle_template(work, mangled, &temp, |
&last_name, 1, 0); |
if (!success) |
break; |
} |
else if (*mangled[0] == 'K') |
{ |
int idx; |
(*mangled)++; |
idx = consume_count_with_underscores (mangled); |
if (idx == -1 || idx >= work->numk) |
success = 0; |
else |
string_append (&temp, work->ktypevec[idx]); |
remember_K = 0; |
if (!success) break; |
} |
else |
{ |
if (EDG_DEMANGLING) |
{ |
int namelength; |
/* Now recursively demangle the qualifier |
* This is necessary to deal with templates in |
* mangling styles like EDG */ |
namelength = consume_count (mangled); |
if (namelength == -1) |
{ |
success = 0; |
break; |
} |
recursively_demangle(work, mangled, &temp, namelength); |
} |
else |
{ |
string_delete (&last_name); |
success = do_type (work, mangled, &last_name); |
if (!success) |
break; |
string_appends (&temp, &last_name); |
} |
} |
if (remember_K) |
remember_Ktype (work, temp.b, LEN_STRING (&temp)); |
if (qualifiers > 0) |
string_append (&temp, SCOPE_STRING (work)); |
} |
remember_Btype (work, temp.b, LEN_STRING (&temp), bindex); |
/* If we are using the result as a function name, we need to append |
the appropriate '::' separated constructor or destructor name. |
We do this here because this is the most convenient place, where |
we already have a pointer to the name and the length of the name. */ |
if (isfuncname) |
{ |
string_append (&temp, SCOPE_STRING (work)); |
if (work -> destructor & 1) |
string_append (&temp, "~"); |
string_appends (&temp, &last_name); |
} |
/* Now either prepend the temp buffer to the result, or append it, |
depending upon the state of the append flag. */ |
if (append) |
string_appends (result, &temp); |
else |
{ |
if (!STRING_EMPTY (result)) |
string_append (&temp, SCOPE_STRING (work)); |
string_prepends (result, &temp); |
} |
string_delete (&last_name); |
string_delete (&temp); |
return (success); |
} |
/* |
LOCAL FUNCTION |
get_count -- convert an ascii count to integer, consuming tokens |
SYNOPSIS |
static int |
get_count (const char **type, int *count) |
DESCRIPTION |
Assume that *type points at a count in a mangled name; set |
*count to its value, and set *type to the next character after |
the count. There are some weird rules in effect here. |
If *type does not point at a string of digits, return zero. |
If *type points at a string of digits followed by an |
underscore, set *count to their value as an integer, advance |
*type to point *after the underscore, and return 1. |
If *type points at a string of digits not followed by an |
underscore, consume only the first digit. Set *count to its |
value as an integer, leave *type pointing after that digit, |
and return 1. |
The excuse for this odd behavior: in the ARM and HP demangling |
styles, a type can be followed by a repeat count of the form |
`Nxy', where: |
`x' is a single digit specifying how many additional copies |
of the type to append to the argument list, and |
`y' is one or more digits, specifying the zero-based index of |
the first repeated argument in the list. Yes, as you're |
unmangling the name you can figure this out yourself, but |
it's there anyway. |
So, for example, in `bar__3fooFPiN51', the first argument is a |
pointer to an integer (`Pi'), and then the next five arguments |
are the same (`N5'), and the first repeat is the function's |
second argument (`1'). |
*/ |
static int |
get_count (const char **type, int *count) |
{ |
const char *p; |
int n; |
if (!ISDIGIT ((unsigned char)**type)) |
return (0); |
else |
{ |
*count = **type - '0'; |
(*type)++; |
if (ISDIGIT ((unsigned char)**type)) |
{ |
p = *type; |
n = *count; |
do |
{ |
n *= 10; |
n += *p - '0'; |
p++; |
} |
while (ISDIGIT ((unsigned char)*p)); |
if (*p == '_') |
{ |
*type = p + 1; |
*count = n; |
} |
} |
} |
return (1); |
} |
/* RESULT will be initialised here; it will be freed on failure. The |
value returned is really a type_kind_t. */ |
static int |
do_type (struct work_stuff *work, const char **mangled, string *result) |
{ |
int n; |
int done; |
int success; |
string decl; |
const char *remembered_type; |
int type_quals; |
type_kind_t tk = tk_none; |
string_init (&decl); |
string_init (result); |
done = 0; |
success = 1; |
while (success && !done) |
{ |
int member; |
switch (**mangled) |
{ |
/* A pointer type */ |
case 'P': |
case 'p': |
(*mangled)++; |
if (! (work -> options & DMGL_JAVA)) |
string_prepend (&decl, "*"); |
if (tk == tk_none) |
tk = tk_pointer; |
break; |
/* A reference type */ |
case 'R': |
(*mangled)++; |
string_prepend (&decl, "&"); |
if (tk == tk_none) |
tk = tk_reference; |
break; |
/* An array */ |
case 'A': |
{ |
++(*mangled); |
if (!STRING_EMPTY (&decl) |
&& (decl.b[0] == '*' || decl.b[0] == '&')) |
{ |
string_prepend (&decl, "("); |
string_append (&decl, ")"); |
} |
string_append (&decl, "["); |
if (**mangled != '_') |
success = demangle_template_value_parm (work, mangled, &decl, |
tk_integral); |
if (**mangled == '_') |
++(*mangled); |
string_append (&decl, "]"); |
break; |
} |
/* A back reference to a previously seen type */ |
case 'T': |
(*mangled)++; |
if (!get_count (mangled, &n) || n >= work -> ntypes) |
{ |
success = 0; |
} |
else |
{ |
remembered_type = work -> typevec[n]; |
mangled = &remembered_type; |
} |
break; |
/* A function */ |
case 'F': |
(*mangled)++; |
if (!STRING_EMPTY (&decl) |
&& (decl.b[0] == '*' || decl.b[0] == '&')) |
{ |
string_prepend (&decl, "("); |
string_append (&decl, ")"); |
} |
/* After picking off the function args, we expect to either find the |
function return type (preceded by an '_') or the end of the |
string. */ |
if (!demangle_nested_args (work, mangled, &decl) |
|| (**mangled != '_' && **mangled != '\0')) |
{ |
success = 0; |
break; |
} |
if (success && (**mangled == '_')) |
(*mangled)++; |
break; |
case 'M': |
case 'O': |
{ |
type_quals = TYPE_UNQUALIFIED; |
member = **mangled == 'M'; |
(*mangled)++; |
string_append (&decl, ")"); |
/* We don't need to prepend `::' for a qualified name; |
demangle_qualified will do that for us. */ |
if (**mangled != 'Q') |
string_prepend (&decl, SCOPE_STRING (work)); |
if (ISDIGIT ((unsigned char)**mangled)) |
{ |
n = consume_count (mangled); |
if (n == -1 |
|| (int) strlen (*mangled) < n) |
{ |
success = 0; |
break; |
} |
string_prependn (&decl, *mangled, n); |
*mangled += n; |
} |
else if (**mangled == 'X' || **mangled == 'Y') |
{ |
string temp; |
do_type (work, mangled, &temp); |
string_prepends (&decl, &temp); |
string_delete (&temp); |
} |
else if (**mangled == 't') |
{ |
string temp; |
string_init (&temp); |
success = demangle_template (work, mangled, &temp, |
NULL, 1, 1); |
if (success) |
{ |
string_prependn (&decl, temp.b, temp.p - temp.b); |
string_delete (&temp); |
} |
else |
break; |
} |
else if (**mangled == 'Q') |
{ |
success = demangle_qualified (work, mangled, &decl, |
/*isfuncnam=*/0, |
/*append=*/0); |
if (!success) |
break; |
} |
else |
{ |
success = 0; |
break; |
} |
string_prepend (&decl, "("); |
if (member) |
{ |
switch (**mangled) |
{ |
case 'C': |
case 'V': |
case 'u': |
type_quals |= code_for_qualifier (**mangled); |
(*mangled)++; |
break; |
default: |
break; |
} |
if (*(*mangled)++ != 'F') |
{ |
success = 0; |
break; |
} |
} |
if ((member && !demangle_nested_args (work, mangled, &decl)) |
|| **mangled != '_') |
{ |
success = 0; |
break; |
} |
(*mangled)++; |
if (! PRINT_ANSI_QUALIFIERS) |
{ |
break; |
} |
if (type_quals != TYPE_UNQUALIFIED) |
{ |
APPEND_BLANK (&decl); |
string_append (&decl, qualifier_string (type_quals)); |
} |
break; |
} |
case 'G': |
(*mangled)++; |
break; |
case 'C': |
case 'V': |
case 'u': |
if (PRINT_ANSI_QUALIFIERS) |
{ |
if (!STRING_EMPTY (&decl)) |
string_prepend (&decl, " "); |
string_prepend (&decl, demangle_qualifier (**mangled)); |
} |
(*mangled)++; |
break; |
/* |
} |
*/ |
/* fall through */ |
default: |
done = 1; |
break; |
} |
} |
if (success) switch (**mangled) |
{ |
/* A qualified name, such as "Outer::Inner". */ |
case 'Q': |
case 'K': |
{ |
success = demangle_qualified (work, mangled, result, 0, 1); |
break; |
} |
/* A back reference to a previously seen squangled type */ |
case 'B': |
(*mangled)++; |
if (!get_count (mangled, &n) || n >= work -> numb) |
success = 0; |
else |
string_append (result, work->btypevec[n]); |
break; |
case 'X': |
case 'Y': |
/* A template parm. We substitute the corresponding argument. */ |
{ |
int idx; |
(*mangled)++; |
idx = consume_count_with_underscores (mangled); |
if (idx == -1 |
|| (work->tmpl_argvec && idx >= work->ntmpl_args) |
|| consume_count_with_underscores (mangled) == -1) |
{ |
success = 0; |
break; |
} |
if (work->tmpl_argvec) |
string_append (result, work->tmpl_argvec[idx]); |
else |
string_append_template_idx (result, idx); |
success = 1; |
} |
break; |
default: |
success = demangle_fund_type (work, mangled, result); |
if (tk == tk_none) |
tk = (type_kind_t) success; |
break; |
} |
if (success) |
{ |
if (!STRING_EMPTY (&decl)) |
{ |
string_append (result, " "); |
string_appends (result, &decl); |
} |
} |
else |
string_delete (result); |
string_delete (&decl); |
if (success) |
/* Assume an integral type, if we're not sure. */ |
return (int) ((tk == tk_none) ? tk_integral : tk); |
else |
return 0; |
} |
/* Given a pointer to a type string that represents a fundamental type |
argument (int, long, unsigned int, etc) in TYPE, a pointer to the |
string in which the demangled output is being built in RESULT, and |
the WORK structure, decode the types and add them to the result. |
For example: |
"Ci" => "const int" |
"Sl" => "signed long" |
"CUs" => "const unsigned short" |
The value returned is really a type_kind_t. */ |
static int |
demangle_fund_type (struct work_stuff *work, |
const char **mangled, string *result) |
{ |
int done = 0; |
int success = 1; |
char buf[INTBUF_SIZE + 5 /* 'int%u_t' */]; |
unsigned int dec = 0; |
type_kind_t tk = tk_integral; |
/* First pick off any type qualifiers. There can be more than one. */ |
while (!done) |
{ |
switch (**mangled) |
{ |
case 'C': |
case 'V': |
case 'u': |
if (PRINT_ANSI_QUALIFIERS) |
{ |
if (!STRING_EMPTY (result)) |
string_prepend (result, " "); |
string_prepend (result, demangle_qualifier (**mangled)); |
} |
(*mangled)++; |
break; |
case 'U': |
(*mangled)++; |
APPEND_BLANK (result); |
string_append (result, "unsigned"); |
break; |
case 'S': /* signed char only */ |
(*mangled)++; |
APPEND_BLANK (result); |
string_append (result, "signed"); |
break; |
case 'J': |
(*mangled)++; |
APPEND_BLANK (result); |
string_append (result, "__complex"); |
break; |
default: |
done = 1; |
break; |
} |
} |
/* Now pick off the fundamental type. There can be only one. */ |
switch (**mangled) |
{ |
case '\0': |
case '_': |
break; |
case 'v': |
(*mangled)++; |
APPEND_BLANK (result); |
string_append (result, "void"); |
break; |
case 'x': |
(*mangled)++; |
APPEND_BLANK (result); |
string_append (result, "long long"); |
break; |
case 'l': |
(*mangled)++; |
APPEND_BLANK (result); |
string_append (result, "long"); |
break; |
case 'i': |
(*mangled)++; |
APPEND_BLANK (result); |
string_append (result, "int"); |
break; |
case 's': |
(*mangled)++; |
APPEND_BLANK (result); |
string_append (result, "short"); |
break; |
case 'b': |
(*mangled)++; |
APPEND_BLANK (result); |
string_append (result, "bool"); |
tk = tk_bool; |
break; |
case 'c': |
(*mangled)++; |
APPEND_BLANK (result); |
string_append (result, "char"); |
tk = tk_char; |
break; |
case 'w': |
(*mangled)++; |
APPEND_BLANK (result); |
string_append (result, "wchar_t"); |
tk = tk_char; |
break; |
case 'r': |
(*mangled)++; |
APPEND_BLANK (result); |
string_append (result, "long double"); |
tk = tk_real; |
break; |
case 'd': |
(*mangled)++; |
APPEND_BLANK (result); |
string_append (result, "double"); |
tk = tk_real; |
break; |
case 'f': |
(*mangled)++; |
APPEND_BLANK (result); |
string_append (result, "float"); |
tk = tk_real; |
break; |
case 'G': |
(*mangled)++; |
if (!ISDIGIT ((unsigned char)**mangled)) |
{ |
success = 0; |
break; |
} |
case 'I': |
(*mangled)++; |
if (**mangled == '_') |
{ |
int i; |
(*mangled)++; |
for (i = 0; |
i < (long) sizeof (buf) - 1 && **mangled && **mangled != '_'; |
(*mangled)++, i++) |
buf[i] = **mangled; |
if (**mangled != '_') |
{ |
success = 0; |
break; |
} |
buf[i] = '\0'; |
(*mangled)++; |
} |
else |
{ |
strncpy (buf, *mangled, 2); |
buf[2] = '\0'; |
*mangled += min (strlen (*mangled), 2); |
} |
sscanf (buf, "%x", &dec); |
sprintf (buf, "int%u_t", dec); |
APPEND_BLANK (result); |
string_append (result, buf); |
break; |
/* fall through */ |
/* An explicit type, such as "6mytype" or "7integer" */ |
case '0': |
case '1': |
case '2': |
case '3': |
case '4': |
case '5': |
case '6': |
case '7': |
case '8': |
case '9': |
{ |
int bindex = register_Btype (work); |
string btype; |
string_init (&btype); |
if (demangle_class_name (work, mangled, &btype)) { |
remember_Btype (work, btype.b, LEN_STRING (&btype), bindex); |
APPEND_BLANK (result); |
string_appends (result, &btype); |
} |
else |
success = 0; |
string_delete (&btype); |
break; |
} |
case 't': |
{ |
string btype; |
string_init (&btype); |
success = demangle_template (work, mangled, &btype, 0, 1, 1); |
string_appends (result, &btype); |
string_delete (&btype); |
break; |
} |
default: |
success = 0; |
break; |
} |
return success ? ((int) tk) : 0; |
} |
/* Handle a template's value parameter for HP aCC (extension from ARM) |
**mangled points to 'S' or 'U' */ |
static int |
do_hpacc_template_const_value (struct work_stuff *work ATTRIBUTE_UNUSED, |
const char **mangled, string *result) |
{ |
int unsigned_const; |
if (**mangled != 'U' && **mangled != 'S') |
return 0; |
unsigned_const = (**mangled == 'U'); |
(*mangled)++; |
switch (**mangled) |
{ |
case 'N': |
string_append (result, "-"); |
/* fall through */ |
case 'P': |
(*mangled)++; |
break; |
case 'M': |
/* special case for -2^31 */ |
string_append (result, "-2147483648"); |
(*mangled)++; |
return 1; |
default: |
return 0; |
} |
/* We have to be looking at an integer now */ |
if (!(ISDIGIT ((unsigned char)**mangled))) |
return 0; |
/* We only deal with integral values for template |
parameters -- so it's OK to look only for digits */ |
while (ISDIGIT ((unsigned char)**mangled)) |
{ |
char_str[0] = **mangled; |
string_append (result, char_str); |
(*mangled)++; |
} |
if (unsigned_const) |
string_append (result, "U"); |
/* FIXME? Some day we may have 64-bit (or larger :-) ) constants |
with L or LL suffixes. pai/1997-09-03 */ |
return 1; /* success */ |
} |
/* Handle a template's literal parameter for HP aCC (extension from ARM) |
**mangled is pointing to the 'A' */ |
static int |
do_hpacc_template_literal (struct work_stuff *work, const char **mangled, |
string *result) |
{ |
int literal_len = 0; |
char * recurse; |
char * recurse_dem; |
if (**mangled != 'A') |
return 0; |
(*mangled)++; |
literal_len = consume_count (mangled); |
if (literal_len <= 0) |
return 0; |
/* Literal parameters are names of arrays, functions, etc. and the |
canonical representation uses the address operator */ |
string_append (result, "&"); |
/* Now recursively demangle the literal name */ |
recurse = XNEWVEC (char, literal_len + 1); |
memcpy (recurse, *mangled, literal_len); |
recurse[literal_len] = '\000'; |
recurse_dem = cplus_demangle (recurse, work->options); |
if (recurse_dem) |
{ |
string_append (result, recurse_dem); |
free (recurse_dem); |
} |
else |
{ |
string_appendn (result, *mangled, literal_len); |
} |
(*mangled) += literal_len; |
free (recurse); |
return 1; |
} |
static int |
snarf_numeric_literal (const char **args, string *arg) |
{ |
if (**args == '-') |
{ |
char_str[0] = '-'; |
string_append (arg, char_str); |
(*args)++; |
} |
else if (**args == '+') |
(*args)++; |
if (!ISDIGIT ((unsigned char)**args)) |
return 0; |
while (ISDIGIT ((unsigned char)**args)) |
{ |
char_str[0] = **args; |
string_append (arg, char_str); |
(*args)++; |
} |
return 1; |
} |
/* Demangle the next argument, given by MANGLED into RESULT, which |
*should be an uninitialized* string. It will be initialized here, |
and free'd should anything go wrong. */ |
static int |
do_arg (struct work_stuff *work, const char **mangled, string *result) |
{ |
/* Remember where we started so that we can record the type, for |
non-squangling type remembering. */ |
const char *start = *mangled; |
string_init (result); |
if (work->nrepeats > 0) |
{ |
--work->nrepeats; |
if (work->previous_argument == 0) |
return 0; |
/* We want to reissue the previous type in this argument list. */ |
string_appends (result, work->previous_argument); |
return 1; |
} |
if (**mangled == 'n') |
{ |
/* A squangling-style repeat. */ |
(*mangled)++; |
work->nrepeats = consume_count(mangled); |
if (work->nrepeats <= 0) |
/* This was not a repeat count after all. */ |
return 0; |
if (work->nrepeats > 9) |
{ |
if (**mangled != '_') |
/* The repeat count should be followed by an '_' in this |
case. */ |
return 0; |
else |
(*mangled)++; |
} |
/* Now, the repeat is all set up. */ |
return do_arg (work, mangled, result); |
} |
/* Save the result in WORK->previous_argument so that we can find it |
if it's repeated. Note that saving START is not good enough: we |
do not want to add additional types to the back-referenceable |
type vector when processing a repeated type. */ |
if (work->previous_argument) |
string_delete (work->previous_argument); |
else |
work->previous_argument = XNEW (string); |
if (!do_type (work, mangled, work->previous_argument)) |
return 0; |
string_appends (result, work->previous_argument); |
remember_type (work, start, *mangled - start); |
return 1; |
} |
static void |
remember_type (struct work_stuff *work, const char *start, int len) |
{ |
char *tem; |
if (work->forgetting_types) |
return; |
if (work -> ntypes >= work -> typevec_size) |
{ |
if (work -> typevec_size == 0) |
{ |
work -> typevec_size = 3; |
work -> typevec = XNEWVEC (char *, work->typevec_size); |
} |
else |
{ |
work -> typevec_size *= 2; |
work -> typevec |
= XRESIZEVEC (char *, work->typevec, work->typevec_size); |
} |
} |
tem = XNEWVEC (char, len + 1); |
memcpy (tem, start, len); |
tem[len] = '\0'; |
work -> typevec[work -> ntypes++] = tem; |
} |
/* Remember a K type class qualifier. */ |
static void |
remember_Ktype (struct work_stuff *work, const char *start, int len) |
{ |
char *tem; |
if (work -> numk >= work -> ksize) |
{ |
if (work -> ksize == 0) |
{ |
work -> ksize = 5; |
work -> ktypevec = XNEWVEC (char *, work->ksize); |
} |
else |
{ |
work -> ksize *= 2; |
work -> ktypevec |
= XRESIZEVEC (char *, work->ktypevec, work->ksize); |
} |
} |
tem = XNEWVEC (char, len + 1); |
memcpy (tem, start, len); |
tem[len] = '\0'; |
work -> ktypevec[work -> numk++] = tem; |
} |
/* Register a B code, and get an index for it. B codes are registered |
as they are seen, rather than as they are completed, so map<temp<char> > |
registers map<temp<char> > as B0, and temp<char> as B1 */ |
static int |
register_Btype (struct work_stuff *work) |
{ |
int ret; |
if (work -> numb >= work -> bsize) |
{ |
if (work -> bsize == 0) |
{ |
work -> bsize = 5; |
work -> btypevec = XNEWVEC (char *, work->bsize); |
} |
else |
{ |
work -> bsize *= 2; |
work -> btypevec |
= XRESIZEVEC (char *, work->btypevec, work->bsize); |
} |
} |
ret = work -> numb++; |
work -> btypevec[ret] = NULL; |
return(ret); |
} |
/* Store a value into a previously registered B code type. */ |
static void |
remember_Btype (struct work_stuff *work, const char *start, |
int len, int index) |
{ |
char *tem; |
tem = XNEWVEC (char, len + 1); |
memcpy (tem, start, len); |
tem[len] = '\0'; |
work -> btypevec[index] = tem; |
} |
/* Lose all the info related to B and K type codes. */ |
static void |
forget_B_and_K_types (struct work_stuff *work) |
{ |
int i; |
while (work -> numk > 0) |
{ |
i = --(work -> numk); |
if (work -> ktypevec[i] != NULL) |
{ |
free (work -> ktypevec[i]); |
work -> ktypevec[i] = NULL; |
} |
} |
while (work -> numb > 0) |
{ |
i = --(work -> numb); |
if (work -> btypevec[i] != NULL) |
{ |
free (work -> btypevec[i]); |
work -> btypevec[i] = NULL; |
} |
} |
} |
/* Forget the remembered types, but not the type vector itself. */ |
static void |
forget_types (struct work_stuff *work) |
{ |
int i; |
while (work -> ntypes > 0) |
{ |
i = --(work -> ntypes); |
if (work -> typevec[i] != NULL) |
{ |
free (work -> typevec[i]); |
work -> typevec[i] = NULL; |
} |
} |
} |
/* Process the argument list part of the signature, after any class spec |
has been consumed, as well as the first 'F' character (if any). For |
example: |
"__als__3fooRT0" => process "RT0" |
"complexfunc5__FPFPc_PFl_i" => process "PFPc_PFl_i" |
DECLP must be already initialised, usually non-empty. It won't be freed |
on failure. |
Note that g++ differs significantly from ARM and lucid style mangling |
with regards to references to previously seen types. For example, given |
the source fragment: |
class foo { |
public: |
foo::foo (int, foo &ia, int, foo &ib, int, foo &ic); |
}; |
foo::foo (int, foo &ia, int, foo &ib, int, foo &ic) { ia = ib = ic; } |
void foo (int, foo &ia, int, foo &ib, int, foo &ic) { ia = ib = ic; } |
g++ produces the names: |
__3fooiRT0iT2iT2 |
foo__FiR3fooiT1iT1 |
while lcc (and presumably other ARM style compilers as well) produces: |
foo__FiR3fooT1T2T1T2 |
__ct__3fooFiR3fooT1T2T1T2 |
Note that g++ bases its type numbers starting at zero and counts all |
previously seen types, while lucid/ARM bases its type numbers starting |
at one and only considers types after it has seen the 'F' character |
indicating the start of the function args. For lucid/ARM style, we |
account for this difference by discarding any previously seen types when |
we see the 'F' character, and subtracting one from the type number |
reference. |
*/ |
static int |
demangle_args (struct work_stuff *work, const char **mangled, |
string *declp) |
{ |
string arg; |
int need_comma = 0; |
int r; |
int t; |
const char *tem; |
char temptype; |
if (PRINT_ARG_TYPES) |
{ |
string_append (declp, "("); |
if (**mangled == '\0') |
{ |
string_append (declp, "void"); |
} |
} |
while ((**mangled != '_' && **mangled != '\0' && **mangled != 'e') |
|| work->nrepeats > 0) |
{ |
if ((**mangled == 'N') || (**mangled == 'T')) |
{ |
temptype = *(*mangled)++; |
if (temptype == 'N') |
{ |
if (!get_count (mangled, &r)) |
{ |
return (0); |
} |
} |
else |
{ |
r = 1; |
} |
if ((HP_DEMANGLING || ARM_DEMANGLING || EDG_DEMANGLING) && work -> ntypes >= 10) |
{ |
/* If we have 10 or more types we might have more than a 1 digit |
index so we'll have to consume the whole count here. This |
will lose if the next thing is a type name preceded by a |
count but it's impossible to demangle that case properly |
anyway. Eg if we already have 12 types is T12Pc "(..., type1, |
Pc, ...)" or "(..., type12, char *, ...)" */ |
if ((t = consume_count(mangled)) <= 0) |
{ |
return (0); |
} |
} |
else |
{ |
if (!get_count (mangled, &t)) |
{ |
return (0); |
} |
} |
if (LUCID_DEMANGLING || ARM_DEMANGLING || HP_DEMANGLING || EDG_DEMANGLING) |
{ |
t--; |
} |
/* Validate the type index. Protect against illegal indices from |
malformed type strings. */ |
if ((t < 0) || (t >= work -> ntypes)) |
{ |
return (0); |
} |
while (work->nrepeats > 0 || --r >= 0) |
{ |
tem = work -> typevec[t]; |
if (need_comma && PRINT_ARG_TYPES) |
{ |
string_append (declp, ", "); |
} |
if (!do_arg (work, &tem, &arg)) |
{ |
return (0); |
} |
if (PRINT_ARG_TYPES) |
{ |
string_appends (declp, &arg); |
} |
string_delete (&arg); |
need_comma = 1; |
} |
} |
else |
{ |
if (need_comma && PRINT_ARG_TYPES) |
string_append (declp, ", "); |
if (!do_arg (work, mangled, &arg)) |
return (0); |
if (PRINT_ARG_TYPES) |
string_appends (declp, &arg); |
string_delete (&arg); |
need_comma = 1; |
} |
} |
if (**mangled == 'e') |
{ |
(*mangled)++; |
if (PRINT_ARG_TYPES) |
{ |
if (need_comma) |
{ |
string_append (declp, ","); |
} |
string_append (declp, "..."); |
} |
} |
if (PRINT_ARG_TYPES) |
{ |
string_append (declp, ")"); |
} |
return (1); |
} |
/* Like demangle_args, but for demangling the argument lists of function |
and method pointers or references, not top-level declarations. */ |
static int |
demangle_nested_args (struct work_stuff *work, const char **mangled, |
string *declp) |
{ |
string* saved_previous_argument; |
int result; |
int saved_nrepeats; |
/* The G++ name-mangling algorithm does not remember types on nested |
argument lists, unless -fsquangling is used, and in that case the |
type vector updated by remember_type is not used. So, we turn |
off remembering of types here. */ |
++work->forgetting_types; |
/* For the repeat codes used with -fsquangling, we must keep track of |
the last argument. */ |
saved_previous_argument = work->previous_argument; |
saved_nrepeats = work->nrepeats; |
work->previous_argument = 0; |
work->nrepeats = 0; |
/* Actually demangle the arguments. */ |
result = demangle_args (work, mangled, declp); |
/* Restore the previous_argument field. */ |
if (work->previous_argument) |
{ |
string_delete (work->previous_argument); |
free ((char *) work->previous_argument); |
} |
work->previous_argument = saved_previous_argument; |
--work->forgetting_types; |
work->nrepeats = saved_nrepeats; |
return result; |
} |
/* Returns 1 if a valid function name was found or 0 otherwise. */ |
static int |
demangle_function_name (struct work_stuff *work, const char **mangled, |
string *declp, const char *scan) |
{ |
size_t i; |
string type; |
const char *tem; |
string_appendn (declp, (*mangled), scan - (*mangled)); |
string_need (declp, 1); |
*(declp -> p) = '\0'; |
/* Consume the function name, including the "__" separating the name |
from the signature. We are guaranteed that SCAN points to the |
separator. */ |
(*mangled) = scan + 2; |
/* We may be looking at an instantiation of a template function: |
foo__Xt1t2_Ft3t4, where t1, t2, ... are template arguments and a |
following _F marks the start of the function arguments. Handle |
the template arguments first. */ |
if (HP_DEMANGLING && (**mangled == 'X')) |
{ |
demangle_arm_hp_template (work, mangled, 0, declp); |
/* This leaves MANGLED pointing to the 'F' marking func args */ |
} |
if (LUCID_DEMANGLING || ARM_DEMANGLING || HP_DEMANGLING || EDG_DEMANGLING) |
{ |
/* See if we have an ARM style constructor or destructor operator. |
If so, then just record it, clear the decl, and return. |
We can't build the actual constructor/destructor decl until later, |
when we recover the class name from the signature. */ |
if (strcmp (declp -> b, "__ct") == 0) |
{ |
work -> constructor += 1; |
string_clear (declp); |
return 1; |
} |
else if (strcmp (declp -> b, "__dt") == 0) |
{ |
work -> destructor += 1; |
string_clear (declp); |
return 1; |
} |
} |
if (declp->p - declp->b >= 3 |
&& declp->b[0] == 'o' |
&& declp->b[1] == 'p' |
&& strchr (cplus_markers, declp->b[2]) != NULL) |
{ |
/* see if it's an assignment expression */ |
if (declp->p - declp->b >= 10 /* op$assign_ */ |
&& memcmp (declp->b + 3, "assign_", 7) == 0) |
{ |
for (i = 0; i < ARRAY_SIZE (optable); i++) |
{ |
int len = declp->p - declp->b - 10; |
if ((int) strlen (optable[i].in) == len |
&& memcmp (optable[i].in, declp->b + 10, len) == 0) |
{ |
string_clear (declp); |
string_append (declp, "operator"); |
string_append (declp, optable[i].out); |
string_append (declp, "="); |
break; |
} |
} |
} |
else |
{ |
for (i = 0; i < ARRAY_SIZE (optable); i++) |
{ |
int len = declp->p - declp->b - 3; |
if ((int) strlen (optable[i].in) == len |
&& memcmp (optable[i].in, declp->b + 3, len) == 0) |
{ |
string_clear (declp); |
string_append (declp, "operator"); |
string_append (declp, optable[i].out); |
break; |
} |
} |
} |
} |
else if (declp->p - declp->b >= 5 && memcmp (declp->b, "type", 4) == 0 |
&& strchr (cplus_markers, declp->b[4]) != NULL) |
{ |
/* type conversion operator */ |
tem = declp->b + 5; |
if (do_type (work, &tem, &type)) |
{ |
string_clear (declp); |
string_append (declp, "operator "); |
string_appends (declp, &type); |
string_delete (&type); |
} |
} |
else if (declp->b[0] == '_' && declp->b[1] == '_' |
&& declp->b[2] == 'o' && declp->b[3] == 'p') |
{ |
/* ANSI. */ |
/* type conversion operator. */ |
tem = declp->b + 4; |
if (do_type (work, &tem, &type)) |
{ |
string_clear (declp); |
string_append (declp, "operator "); |
string_appends (declp, &type); |
string_delete (&type); |
} |
} |
else if (declp->b[0] == '_' && declp->b[1] == '_' |
&& ISLOWER((unsigned char)declp->b[2]) |
&& ISLOWER((unsigned char)declp->b[3])) |
{ |
if (declp->b[4] == '\0') |
{ |
/* Operator. */ |
for (i = 0; i < ARRAY_SIZE (optable); i++) |
{ |
if (strlen (optable[i].in) == 2 |
&& memcmp (optable[i].in, declp->b + 2, 2) == 0) |
{ |
string_clear (declp); |
string_append (declp, "operator"); |
string_append (declp, optable[i].out); |
break; |
} |
} |
} |
else |
{ |
if (declp->b[2] == 'a' && declp->b[5] == '\0') |
{ |
/* Assignment. */ |
for (i = 0; i < ARRAY_SIZE (optable); i++) |
{ |
if (strlen (optable[i].in) == 3 |
&& memcmp (optable[i].in, declp->b + 2, 3) == 0) |
{ |
string_clear (declp); |
string_append (declp, "operator"); |
string_append (declp, optable[i].out); |
break; |
} |
} |
} |
} |
} |
/* If a function name was obtained but it's not valid, we were not |
successful. */ |
if (LEN_STRING (declp) == 1 && declp->b[0] == '.') |
return 0; |
else |
return 1; |
} |
/* a mini string-handling package */ |
static void |
string_need (string *s, int n) |
{ |
int tem; |
if (s->b == NULL) |
{ |
if (n < 32) |
{ |
n = 32; |
} |
s->p = s->b = XNEWVEC (char, n); |
s->e = s->b + n; |
} |
else if (s->e - s->p < n) |
{ |
tem = s->p - s->b; |
n += tem; |
n *= 2; |
s->b = XRESIZEVEC (char, s->b, n); |
s->p = s->b + tem; |
s->e = s->b + n; |
} |
} |
static void |
string_delete (string *s) |
{ |
if (s->b != NULL) |
{ |
free (s->b); |
s->b = s->e = s->p = NULL; |
} |
} |
static void |
string_init (string *s) |
{ |
s->b = s->p = s->e = NULL; |
} |
static void |
string_clear (string *s) |
{ |
s->p = s->b; |
} |
#if 0 |
static int |
string_empty (string *s) |
{ |
return (s->b == s->p); |
} |
#endif |
static void |
string_append (string *p, const char *s) |
{ |
int n; |
if (s == NULL || *s == '\0') |
return; |
n = strlen (s); |
string_need (p, n); |
memcpy (p->p, s, n); |
p->p += n; |
} |
static void |
string_appends (string *p, string *s) |
{ |
int n; |
if (s->b != s->p) |
{ |
n = s->p - s->b; |
string_need (p, n); |
memcpy (p->p, s->b, n); |
p->p += n; |
} |
} |
static void |
string_appendn (string *p, const char *s, int n) |
{ |
if (n != 0) |
{ |
string_need (p, n); |
memcpy (p->p, s, n); |
p->p += n; |
} |
} |
static void |
string_prepend (string *p, const char *s) |
{ |
if (s != NULL && *s != '\0') |
{ |
string_prependn (p, s, strlen (s)); |
} |
} |
static void |
string_prepends (string *p, string *s) |
{ |
if (s->b != s->p) |
{ |
string_prependn (p, s->b, s->p - s->b); |
} |
} |
static void |
string_prependn (string *p, const char *s, int n) |
{ |
char *q; |
if (n != 0) |
{ |
string_need (p, n); |
for (q = p->p - 1; q >= p->b; q--) |
{ |
q[n] = q[0]; |
} |
memcpy (p->b, s, n); |
p->p += n; |
} |
} |
static void |
string_append_template_idx (string *s, int idx) |
{ |
char buf[INTBUF_SIZE + 1 /* 'T' */]; |
sprintf(buf, "T%d", idx); |
string_append (s, buf); |
} |
/contrib/toolchain/binutils/libiberty/crc32.c |
---|
0,0 → 1,181 |
/* crc32.c |
Copyright (C) 2009, 2011 Free Software Foundation, Inc. |
This file is part of the libiberty library. |
This file is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2 of the License, or |
(at your option) any later version. |
In addition to the permissions in the GNU General Public License, the |
Free Software Foundation gives you unlimited permission to link the |
compiled version of this file into combinations with other programs, |
and to distribute those combinations without any restriction coming |
from the use of this file. (The General Public License restrictions |
do apply in other respects; for example, they cover modification of |
the file, and distribution when not linked into a combined |
executable.) |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. |
*/ |
#ifdef HAVE_CONFIG_H |
#include "config.h" |
#endif |
#include "libiberty.h" |
/* This table was generated by the following program. This matches |
what gdb does. |
#include <stdio.h> |
int |
main () |
{ |
int i, j; |
unsigned int c; |
int table[256]; |
for (i = 0; i < 256; i++) |
{ |
for (c = i << 24, j = 8; j > 0; --j) |
c = c & 0x80000000 ? (c << 1) ^ 0x04c11db7 : (c << 1); |
table[i] = c; |
} |
printf ("static const unsigned int crc32_table[] =\n{\n"); |
for (i = 0; i < 256; i += 4) |
{ |
printf (" 0x%08x, 0x%08x, 0x%08x, 0x%08x", |
table[i + 0], table[i + 1], table[i + 2], table[i + 3]); |
if (i + 4 < 256) |
putchar (','); |
putchar ('\n'); |
} |
printf ("};\n"); |
return 0; |
} |
For more information on CRC, see, e.g., |
http://www.ross.net/crc/download/crc_v3.txt. */ |
static const unsigned int crc32_table[] = |
{ |
0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, |
0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005, |
0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, |
0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, |
0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, |
0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75, |
0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, |
0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd, |
0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, |
0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, |
0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81, |
0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d, |
0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, |
0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95, |
0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, |
0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, |
0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae, |
0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072, |
0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, |
0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca, |
0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, |
0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, |
0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066, |
0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba, |
0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, |
0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692, |
0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, |
0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, |
0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e, |
0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, |
0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, |
0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a, |
0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637, |
0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, |
0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, |
0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53, |
0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, |
0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b, |
0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, |
0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, |
0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, |
0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b, |
0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, |
0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3, |
0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, |
0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, |
0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f, |
0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3, |
0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, |
0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c, |
0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, |
0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, |
0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30, |
0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec, |
0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, |
0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654, |
0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, |
0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, |
0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18, |
0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, |
0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, |
0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c, |
0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668, |
0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4 |
}; |
/* |
@deftypefn Extension {unsigned int} crc32 (const unsigned char *@var{buf}, @ |
int @var{len}, unsigned int @var{init}) |
Compute the 32-bit CRC of @var{buf} which has length @var{len}. The |
starting value is @var{init}; this may be used to compute the CRC of |
data split across multiple buffers by passing the return value of each |
call as the @var{init} parameter of the next. |
This is intended to match the CRC used by the @command{gdb} remote |
protocol for the @samp{qCRC} command. In order to get the same |
results as gdb for a block of data, you must pass the first CRC |
parameter as @code{0xffffffff}. |
This CRC can be specified as: |
Width : 32 |
Poly : 0x04c11db7 |
Init : parameter, typically 0xffffffff |
RefIn : false |
RefOut : false |
XorOut : 0 |
This differs from the "standard" CRC-32 algorithm in that the values |
are not reflected, and there is no final XOR value. These differences |
make it easy to compose the values of multiple blocks. |
@end deftypefn |
*/ |
unsigned int |
xcrc32 (const unsigned char *buf, int len, unsigned int init) |
{ |
unsigned int crc = init; |
while (len--) |
{ |
crc = (crc << 8) ^ crc32_table[((crc >> 24) ^ *buf) & 255]; |
buf++; |
} |
return crc; |
} |
/contrib/toolchain/binutils/libiberty/dwarfnames.c |
---|
0,0 → 1,98 |
/* Names of various DWARF tags. |
Copyright (C) 2012 Free Software Foundation, Inc. |
This file is part of GNU CC. |
GNU CC is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2, or (at your option) |
any later version. |
In addition to the permissions in the GNU General Public License, the |
Free Software Foundation gives you unlimited permission to link the |
compiled version of this file into combinations with other programs, |
and to distribute those combinations without any restriction coming |
from the use of this file. (The General Public License restrictions |
do apply in other respects; for example, they cover modification of |
the file, and distribution when not linked into a combined |
executable.) |
GNU CC is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with GNU CC; see the file COPYING. If not, write to |
the Free Software Foundation, 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
#include "dwarf2.h" |
#define DW_FIRST_TAG(name, value) \ |
const char *get_DW_TAG_name (unsigned int tag) \ |
{ switch (tag) { \ |
DW_TAG (name, value) |
#define DW_END_TAG } return 0; } |
#define DW_FIRST_FORM(name, value) \ |
const char *get_DW_FORM_name (unsigned int form) \ |
{ switch (form) { \ |
DW_FORM (name, value) |
#define DW_END_FORM } return 0; } |
#define DW_FIRST_AT(name, value) \ |
const char *get_DW_AT_name (unsigned int attr) { \ |
switch (attr) { \ |
DW_AT (name, value) |
#define DW_END_AT } return 0; } |
#define DW_FIRST_OP(name, value) \ |
const char *get_DW_OP_name (unsigned int op) { \ |
switch (op) { \ |
DW_OP (name, value) |
#define DW_END_OP } return 0; } |
#define DW_FIRST_ATE(name, value) \ |
const char *get_DW_ATE_name (unsigned int enc) { \ |
switch (enc) { \ |
DW_ATE (name, value) |
#define DW_END_ATE } return 0; } |
#define DW_FIRST_CFA(name, value) \ |
const char *get_DW_CFA_name (unsigned int opc) { \ |
switch (opc) { \ |
DW_CFA (name, value) |
#define DW_END_CFA } return 0; } |
#define DW_TAG(name, value) case name: return # name ; |
#define DW_TAG_DUP(name, value) |
#define DW_FORM(name, value) case name: return # name ; |
#define DW_AT(name, value) case name: return # name ; |
#define DW_AT_DUP(name, value) |
#define DW_OP(name, value) case name: return # name ; |
#define DW_OP_DUP(name, value) |
#define DW_ATE(name, value) case name: return # name ; |
#define DW_ATE_DUP(name, value) |
#define DW_CFA(name, value) case name: return # name ; |
#include "dwarf2.def" |
#undef DW_FIRST_TAG |
#undef DW_END_TAG |
#undef DW_FIRST_FORM |
#undef DW_END_FORM |
#undef DW_FIRST_AT |
#undef DW_END_AT |
#undef DW_FIRST_OP |
#undef DW_END_OP |
#undef DW_FIRST_ATE |
#undef DW_END_ATE |
#undef DW_FIRST_CFA |
#undef DW_END_CFA |
#undef DW_TAG |
#undef DW_TAG_DUP |
#undef DW_FORM |
#undef DW_AT |
#undef DW_AT_DUP |
#undef DW_OP |
#undef DW_OP_DUP |
#undef DW_ATE |
#undef DW_ATE_DUP |
#undef DW_CFA |
/contrib/toolchain/binutils/libiberty/dyn-string.c |
---|
0,0 → 1,397 |
/* An abstract string datatype. |
Copyright (C) 1998, 1999, 2000, 2002, 2004 Free Software Foundation, Inc. |
Contributed by Mark Mitchell (mark@markmitchell.com). |
This file is part of GNU CC. |
GNU CC is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2, or (at your option) |
any later version. |
In addition to the permissions in the GNU General Public License, the |
Free Software Foundation gives you unlimited permission to link the |
compiled version of this file into combinations with other programs, |
and to distribute those combinations without any restriction coming |
from the use of this file. (The General Public License restrictions |
do apply in other respects; for example, they cover modification of |
the file, and distribution when not linked into a combined |
executable.) |
GNU CC is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with GNU CC; see the file COPYING. If not, write to |
the Free Software Foundation, 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
#ifdef HAVE_CONFIG_H |
#include "config.h" |
#endif |
#include <stdio.h> |
#ifdef HAVE_STRING_H |
#include <string.h> |
#endif |
#ifdef HAVE_STDLIB_H |
#include <stdlib.h> |
#endif |
#include "libiberty.h" |
#include "dyn-string.h" |
/* Performs in-place initialization of a dyn_string struct. This |
function can be used with a dyn_string struct on the stack or |
embedded in another object. The contents of of the string itself |
are still dynamically allocated. The string initially is capable |
of holding at least SPACE characeters, including the terminating |
NUL. If SPACE is 0, it will silently be increated to 1. |
If RETURN_ON_ALLOCATION_FAILURE is defined and memory allocation |
fails, returns 0. Otherwise returns 1. */ |
int |
dyn_string_init (struct dyn_string *ds_struct_ptr, int space) |
{ |
/* We need at least one byte in which to store the terminating NUL. */ |
if (space == 0) |
space = 1; |
#ifdef RETURN_ON_ALLOCATION_FAILURE |
ds_struct_ptr->s = (char *) malloc (space); |
if (ds_struct_ptr->s == NULL) |
return 0; |
#else |
ds_struct_ptr->s = XNEWVEC (char, space); |
#endif |
ds_struct_ptr->allocated = space; |
ds_struct_ptr->length = 0; |
ds_struct_ptr->s[0] = '\0'; |
return 1; |
} |
/* Create a new dynamic string capable of holding at least SPACE |
characters, including the terminating NUL. If SPACE is 0, it will |
be silently increased to 1. If RETURN_ON_ALLOCATION_FAILURE is |
defined and memory allocation fails, returns NULL. Otherwise |
returns the newly allocated string. */ |
dyn_string_t |
dyn_string_new (int space) |
{ |
dyn_string_t result; |
#ifdef RETURN_ON_ALLOCATION_FAILURE |
result = (dyn_string_t) malloc (sizeof (struct dyn_string)); |
if (result == NULL) |
return NULL; |
if (!dyn_string_init (result, space)) |
{ |
free (result); |
return NULL; |
} |
#else |
result = XNEW (struct dyn_string); |
dyn_string_init (result, space); |
#endif |
return result; |
} |
/* Free the memory used by DS. */ |
void |
dyn_string_delete (dyn_string_t ds) |
{ |
free (ds->s); |
free (ds); |
} |
/* Returns the contents of DS in a buffer allocated with malloc. It |
is the caller's responsibility to deallocate the buffer using free. |
DS is then set to the empty string. Deletes DS itself. */ |
char* |
dyn_string_release (dyn_string_t ds) |
{ |
/* Store the old buffer. */ |
char* result = ds->s; |
/* The buffer is no longer owned by DS. */ |
ds->s = NULL; |
/* Delete DS. */ |
free (ds); |
/* Return the old buffer. */ |
return result; |
} |
/* Increase the capacity of DS so it can hold at least SPACE |
characters, plus the terminating NUL. This function will not (at |
present) reduce the capacity of DS. Returns DS on success. |
If RETURN_ON_ALLOCATION_FAILURE is defined and a memory allocation |
operation fails, deletes DS and returns NULL. */ |
dyn_string_t |
dyn_string_resize (dyn_string_t ds, int space) |
{ |
int new_allocated = ds->allocated; |
/* Increase SPACE to hold the NUL termination. */ |
++space; |
/* Increase allocation by factors of two. */ |
while (space > new_allocated) |
new_allocated *= 2; |
if (new_allocated != ds->allocated) |
{ |
ds->allocated = new_allocated; |
/* We actually need more space. */ |
#ifdef RETURN_ON_ALLOCATION_FAILURE |
ds->s = (char *) realloc (ds->s, ds->allocated); |
if (ds->s == NULL) |
{ |
free (ds); |
return NULL; |
} |
#else |
ds->s = XRESIZEVEC (char, ds->s, ds->allocated); |
#endif |
} |
return ds; |
} |
/* Sets the contents of DS to the empty string. */ |
void |
dyn_string_clear (dyn_string_t ds) |
{ |
/* A dyn_string always has room for at least the NUL terminator. */ |
ds->s[0] = '\0'; |
ds->length = 0; |
} |
/* Makes the contents of DEST the same as the contents of SRC. DEST |
and SRC must be distinct. Returns 1 on success. On failure, if |
RETURN_ON_ALLOCATION_FAILURE, deletes DEST and returns 0. */ |
int |
dyn_string_copy (dyn_string_t dest, dyn_string_t src) |
{ |
if (dest == src) |
abort (); |
/* Make room in DEST. */ |
if (dyn_string_resize (dest, src->length) == NULL) |
return 0; |
/* Copy DEST into SRC. */ |
strcpy (dest->s, src->s); |
/* Update the size of DEST. */ |
dest->length = src->length; |
return 1; |
} |
/* Copies SRC, a NUL-terminated string, into DEST. Returns 1 on |
success. On failure, if RETURN_ON_ALLOCATION_FAILURE, deletes DEST |
and returns 0. */ |
int |
dyn_string_copy_cstr (dyn_string_t dest, const char *src) |
{ |
int length = strlen (src); |
/* Make room in DEST. */ |
if (dyn_string_resize (dest, length) == NULL) |
return 0; |
/* Copy DEST into SRC. */ |
strcpy (dest->s, src); |
/* Update the size of DEST. */ |
dest->length = length; |
return 1; |
} |
/* Inserts SRC at the beginning of DEST. DEST is expanded as |
necessary. SRC and DEST must be distinct. Returns 1 on success. |
On failure, if RETURN_ON_ALLOCATION_FAILURE, deletes DEST and |
returns 0. */ |
int |
dyn_string_prepend (dyn_string_t dest, dyn_string_t src) |
{ |
return dyn_string_insert (dest, 0, src); |
} |
/* Inserts SRC, a NUL-terminated string, at the beginning of DEST. |
DEST is expanded as necessary. Returns 1 on success. On failure, |
if RETURN_ON_ALLOCATION_FAILURE, deletes DEST and returns 0. */ |
int |
dyn_string_prepend_cstr (dyn_string_t dest, const char *src) |
{ |
return dyn_string_insert_cstr (dest, 0, src); |
} |
/* Inserts SRC into DEST starting at position POS. DEST is expanded |
as necessary. SRC and DEST must be distinct. Returns 1 on |
success. On failure, if RETURN_ON_ALLOCATION_FAILURE, deletes DEST |
and returns 0. */ |
int |
dyn_string_insert (dyn_string_t dest, int pos, dyn_string_t src) |
{ |
int i; |
if (src == dest) |
abort (); |
if (dyn_string_resize (dest, dest->length + src->length) == NULL) |
return 0; |
/* Make room for the insertion. Be sure to copy the NUL. */ |
for (i = dest->length; i >= pos; --i) |
dest->s[i + src->length] = dest->s[i]; |
/* Splice in the new stuff. */ |
strncpy (dest->s + pos, src->s, src->length); |
/* Compute the new length. */ |
dest->length += src->length; |
return 1; |
} |
/* Inserts SRC, a NUL-terminated string, into DEST starting at |
position POS. DEST is expanded as necessary. Returns 1 on |
success. On failure, RETURN_ON_ALLOCATION_FAILURE, deletes DEST |
and returns 0. */ |
int |
dyn_string_insert_cstr (dyn_string_t dest, int pos, const char *src) |
{ |
int i; |
int length = strlen (src); |
if (dyn_string_resize (dest, dest->length + length) == NULL) |
return 0; |
/* Make room for the insertion. Be sure to copy the NUL. */ |
for (i = dest->length; i >= pos; --i) |
dest->s[i + length] = dest->s[i]; |
/* Splice in the new stuff. */ |
strncpy (dest->s + pos, src, length); |
/* Compute the new length. */ |
dest->length += length; |
return 1; |
} |
/* Inserts character C into DEST starting at position POS. DEST is |
expanded as necessary. Returns 1 on success. On failure, |
RETURN_ON_ALLOCATION_FAILURE, deletes DEST and returns 0. */ |
int |
dyn_string_insert_char (dyn_string_t dest, int pos, int c) |
{ |
int i; |
if (dyn_string_resize (dest, dest->length + 1) == NULL) |
return 0; |
/* Make room for the insertion. Be sure to copy the NUL. */ |
for (i = dest->length; i >= pos; --i) |
dest->s[i + 1] = dest->s[i]; |
/* Add the new character. */ |
dest->s[pos] = c; |
/* Compute the new length. */ |
++dest->length; |
return 1; |
} |
/* Append S to DS, resizing DS if necessary. Returns 1 on success. |
On failure, if RETURN_ON_ALLOCATION_FAILURE, deletes DEST and |
returns 0. */ |
int |
dyn_string_append (dyn_string_t dest, dyn_string_t s) |
{ |
if (dyn_string_resize (dest, dest->length + s->length) == 0) |
return 0; |
strcpy (dest->s + dest->length, s->s); |
dest->length += s->length; |
return 1; |
} |
/* Append the NUL-terminated string S to DS, resizing DS if necessary. |
Returns 1 on success. On failure, if RETURN_ON_ALLOCATION_FAILURE, |
deletes DEST and returns 0. */ |
int |
dyn_string_append_cstr (dyn_string_t dest, const char *s) |
{ |
int len = strlen (s); |
/* The new length is the old length plus the size of our string, plus |
one for the null at the end. */ |
if (dyn_string_resize (dest, dest->length + len) == NULL) |
return 0; |
strcpy (dest->s + dest->length, s); |
dest->length += len; |
return 1; |
} |
/* Appends C to the end of DEST. Returns 1 on success. On failure, |
if RETURN_ON_ALLOCATION_FAILURE, deletes DEST and returns 0. */ |
int |
dyn_string_append_char (dyn_string_t dest, int c) |
{ |
/* Make room for the extra character. */ |
if (dyn_string_resize (dest, dest->length + 1) == NULL) |
return 0; |
/* Append the character; it will overwrite the old NUL. */ |
dest->s[dest->length] = c; |
/* Add a new NUL at the end. */ |
dest->s[dest->length + 1] = '\0'; |
/* Update the length. */ |
++(dest->length); |
return 1; |
} |
/* Sets the contents of DEST to the substring of SRC starting at START |
and ending before END. START must be less than or equal to END, |
and both must be between zero and the length of SRC, inclusive. |
Returns 1 on success. On failure, if RETURN_ON_ALLOCATION_FAILURE, |
deletes DEST and returns 0. */ |
int |
dyn_string_substring (dyn_string_t dest, dyn_string_t src, |
int start, int end) |
{ |
int i; |
int length = end - start; |
if (start > end || start > src->length || end > src->length) |
abort (); |
/* Make room for the substring. */ |
if (dyn_string_resize (dest, length) == NULL) |
return 0; |
/* Copy the characters in the substring, */ |
for (i = length; --i >= 0; ) |
dest->s[i] = src->s[start + i]; |
/* NUL-terimate the result. */ |
dest->s[length] = '\0'; |
/* Record the length of the substring. */ |
dest->length = length; |
return 1; |
} |
/* Returns non-zero if DS1 and DS2 have the same contents. */ |
int |
dyn_string_eq (dyn_string_t ds1, dyn_string_t ds2) |
{ |
/* If DS1 and DS2 have different lengths, they must not be the same. */ |
if (ds1->length != ds2->length) |
return 0; |
else |
return !strcmp (ds1->s, ds2->s); |
} |
/contrib/toolchain/binutils/libiberty/fdmatch.c |
---|
0,0 → 1,68 |
/* Compare two open file descriptors to see if they refer to the same file. |
Copyright (C) 1991 Free Software Foundation, Inc. |
This file is part of the libiberty library. |
Libiberty is free software; you can redistribute it and/or |
modify it under the terms of the GNU Library General Public |
License as published by the Free Software Foundation; either |
version 2 of the License, or (at your option) any later version. |
Libiberty is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
Library General Public License for more details. |
You should have received a copy of the GNU Library General Public |
License along with libiberty; see the file COPYING.LIB. If |
not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
/* |
@deftypefn Extension int fdmatch (int @var{fd1}, int @var{fd2}) |
Check to see if two open file descriptors refer to the same file. |
This is useful, for example, when we have an open file descriptor for |
an unnamed file, and the name of a file that we believe to correspond |
to that fd. This can happen when we are exec'd with an already open |
file (@code{stdout} for example) or from the SVR4 @file{/proc} calls |
that return open file descriptors for mapped address spaces. All we |
have to do is open the file by name and check the two file descriptors |
for a match, which is done by comparing major and minor device numbers |
and inode numbers. |
@end deftypefn |
BUGS |
(FIXME: does this work for networks?) |
It works for NFS, which assigns a device number to each mount. |
*/ |
#ifdef HAVE_CONFIG_H |
#include "config.h" |
#endif |
#include "ansidecl.h" |
#include "libiberty.h" |
#include <sys/types.h> |
#include <sys/stat.h> |
int fdmatch (int fd1, int fd2) |
{ |
struct stat sbuf1; |
struct stat sbuf2; |
if ((fstat (fd1, &sbuf1) == 0) && |
(fstat (fd2, &sbuf2) == 0) && |
(sbuf1.st_dev == sbuf2.st_dev) && |
(sbuf1.st_ino == sbuf2.st_ino)) |
{ |
return (1); |
} |
else |
{ |
return (0); |
} |
} |
/contrib/toolchain/binutils/libiberty/ffs.c |
---|
0,0 → 1,26 |
/* ffs -- Find the first bit set in the parameter |
@deftypefn Supplemental int ffs (int @var{valu}) |
Find the first (least significant) bit set in @var{valu}. Bits are |
numbered from right to left, starting with bit 1 (corresponding to the |
value 1). If @var{valu} is zero, zero is returned. |
@end deftypefn |
*/ |
int |
ffs (register int valu) |
{ |
register int bit; |
if (valu == 0) |
return 0; |
for (bit = 1; !(valu & 1); bit++) |
valu >>= 1; |
return bit; |
} |
/contrib/toolchain/binutils/libiberty/fibheap.c |
---|
0,0 → 1,486 |
/* A Fibonacci heap datatype. |
Copyright 1998, 1999, 2000, 2001 Free Software Foundation, Inc. |
Contributed by Daniel Berlin (dan@cgsoftware.com). |
This file is part of GNU CC. |
GNU CC is free software; you can redistribute it and/or modify it |
under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2, or (at your option) |
any later version. |
GNU CC is distributed in the hope that it will be useful, but |
WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with GNU CC; see the file COPYING. If not, write to |
the Free Software Foundation, 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
#ifdef HAVE_CONFIG_H |
#include "config.h" |
#endif |
#ifdef HAVE_LIMITS_H |
#include <limits.h> |
#endif |
#ifdef HAVE_STDLIB_H |
#include <stdlib.h> |
#endif |
#ifdef HAVE_STRING_H |
#include <string.h> |
#endif |
#include "libiberty.h" |
#include "fibheap.h" |
#define FIBHEAPKEY_MIN LONG_MIN |
static void fibheap_ins_root (fibheap_t, fibnode_t); |
static void fibheap_rem_root (fibheap_t, fibnode_t); |
static void fibheap_consolidate (fibheap_t); |
static void fibheap_link (fibheap_t, fibnode_t, fibnode_t); |
static void fibheap_cut (fibheap_t, fibnode_t, fibnode_t); |
static void fibheap_cascading_cut (fibheap_t, fibnode_t); |
static fibnode_t fibheap_extr_min_node (fibheap_t); |
static int fibheap_compare (fibheap_t, fibnode_t, fibnode_t); |
static int fibheap_comp_data (fibheap_t, fibheapkey_t, void *, fibnode_t); |
static fibnode_t fibnode_new (void); |
static void fibnode_insert_after (fibnode_t, fibnode_t); |
#define fibnode_insert_before(a, b) fibnode_insert_after (a->left, b) |
static fibnode_t fibnode_remove (fibnode_t); |
/* Create a new fibonacci heap. */ |
fibheap_t |
fibheap_new (void) |
{ |
return (fibheap_t) xcalloc (1, sizeof (struct fibheap)); |
} |
/* Create a new fibonacci heap node. */ |
static fibnode_t |
fibnode_new (void) |
{ |
fibnode_t node; |
node = (fibnode_t) xcalloc (1, sizeof *node); |
node->left = node; |
node->right = node; |
return node; |
} |
static inline int |
fibheap_compare (fibheap_t heap ATTRIBUTE_UNUSED, fibnode_t a, fibnode_t b) |
{ |
if (a->key < b->key) |
return -1; |
if (a->key > b->key) |
return 1; |
return 0; |
} |
static inline int |
fibheap_comp_data (fibheap_t heap, fibheapkey_t key, void *data, fibnode_t b) |
{ |
struct fibnode a; |
a.key = key; |
a.data = data; |
return fibheap_compare (heap, &a, b); |
} |
/* Insert DATA, with priority KEY, into HEAP. */ |
fibnode_t |
fibheap_insert (fibheap_t heap, fibheapkey_t key, void *data) |
{ |
fibnode_t node; |
/* Create the new node. */ |
node = fibnode_new (); |
/* Set the node's data. */ |
node->data = data; |
node->key = key; |
/* Insert it into the root list. */ |
fibheap_ins_root (heap, node); |
/* If their was no minimum, or this key is less than the min, |
it's the new min. */ |
if (heap->min == NULL || node->key < heap->min->key) |
heap->min = node; |
heap->nodes++; |
return node; |
} |
/* Return the data of the minimum node (if we know it). */ |
void * |
fibheap_min (fibheap_t heap) |
{ |
/* If there is no min, we can't easily return it. */ |
if (heap->min == NULL) |
return NULL; |
return heap->min->data; |
} |
/* Return the key of the minimum node (if we know it). */ |
fibheapkey_t |
fibheap_min_key (fibheap_t heap) |
{ |
/* If there is no min, we can't easily return it. */ |
if (heap->min == NULL) |
return 0; |
return heap->min->key; |
} |
/* Union HEAPA and HEAPB into a new heap. */ |
fibheap_t |
fibheap_union (fibheap_t heapa, fibheap_t heapb) |
{ |
fibnode_t a_root, b_root, temp; |
/* If one of the heaps is empty, the union is just the other heap. */ |
if ((a_root = heapa->root) == NULL) |
{ |
free (heapa); |
return heapb; |
} |
if ((b_root = heapb->root) == NULL) |
{ |
free (heapb); |
return heapa; |
} |
/* Merge them to the next nodes on the opposite chain. */ |
a_root->left->right = b_root; |
b_root->left->right = a_root; |
temp = a_root->left; |
a_root->left = b_root->left; |
b_root->left = temp; |
heapa->nodes += heapb->nodes; |
/* And set the new minimum, if it's changed. */ |
if (fibheap_compare (heapa, heapb->min, heapa->min) < 0) |
heapa->min = heapb->min; |
free (heapb); |
return heapa; |
} |
/* Extract the data of the minimum node from HEAP. */ |
void * |
fibheap_extract_min (fibheap_t heap) |
{ |
fibnode_t z; |
void *ret = NULL; |
/* If we don't have a min set, it means we have no nodes. */ |
if (heap->min != NULL) |
{ |
/* Otherwise, extract the min node, free the node, and return the |
node's data. */ |
z = fibheap_extr_min_node (heap); |
ret = z->data; |
free (z); |
} |
return ret; |
} |
/* Replace both the KEY and the DATA associated with NODE. */ |
void * |
fibheap_replace_key_data (fibheap_t heap, fibnode_t node, |
fibheapkey_t key, void *data) |
{ |
void *odata; |
fibheapkey_t okey; |
fibnode_t y; |
/* If we wanted to, we could actually do a real increase by redeleting and |
inserting. However, this would require O (log n) time. So just bail out |
for now. */ |
if (fibheap_comp_data (heap, key, data, node) > 0) |
return NULL; |
odata = node->data; |
okey = node->key; |
node->data = data; |
node->key = key; |
y = node->parent; |
/* Short-circuit if the key is the same, as we then don't have to |
do anything. Except if we're trying to force the new node to |
be the new minimum for delete. */ |
if (okey == key && okey != FIBHEAPKEY_MIN) |
return odata; |
/* These two compares are specifically <= 0 to make sure that in the case |
of equality, a node we replaced the data on, becomes the new min. This |
is needed so that delete's call to extractmin gets the right node. */ |
if (y != NULL && fibheap_compare (heap, node, y) <= 0) |
{ |
fibheap_cut (heap, node, y); |
fibheap_cascading_cut (heap, y); |
} |
if (fibheap_compare (heap, node, heap->min) <= 0) |
heap->min = node; |
return odata; |
} |
/* Replace the DATA associated with NODE. */ |
void * |
fibheap_replace_data (fibheap_t heap, fibnode_t node, void *data) |
{ |
return fibheap_replace_key_data (heap, node, node->key, data); |
} |
/* Replace the KEY associated with NODE. */ |
fibheapkey_t |
fibheap_replace_key (fibheap_t heap, fibnode_t node, fibheapkey_t key) |
{ |
int okey = node->key; |
fibheap_replace_key_data (heap, node, key, node->data); |
return okey; |
} |
/* Delete NODE from HEAP. */ |
void * |
fibheap_delete_node (fibheap_t heap, fibnode_t node) |
{ |
void *ret = node->data; |
/* To perform delete, we just make it the min key, and extract. */ |
fibheap_replace_key (heap, node, FIBHEAPKEY_MIN); |
if (node != heap->min) |
{ |
fprintf (stderr, "Can't force minimum on fibheap.\n"); |
abort (); |
} |
fibheap_extract_min (heap); |
return ret; |
} |
/* Delete HEAP. */ |
void |
fibheap_delete (fibheap_t heap) |
{ |
while (heap->min != NULL) |
free (fibheap_extr_min_node (heap)); |
free (heap); |
} |
/* Determine if HEAP is empty. */ |
int |
fibheap_empty (fibheap_t heap) |
{ |
return heap->nodes == 0; |
} |
/* Extract the minimum node of the heap. */ |
static fibnode_t |
fibheap_extr_min_node (fibheap_t heap) |
{ |
fibnode_t ret = heap->min; |
fibnode_t x, y, orig; |
/* Attach the child list of the minimum node to the root list of the heap. |
If there is no child list, we don't do squat. */ |
for (x = ret->child, orig = NULL; x != orig && x != NULL; x = y) |
{ |
if (orig == NULL) |
orig = x; |
y = x->right; |
x->parent = NULL; |
fibheap_ins_root (heap, x); |
} |
/* Remove the old root. */ |
fibheap_rem_root (heap, ret); |
heap->nodes--; |
/* If we are left with no nodes, then the min is NULL. */ |
if (heap->nodes == 0) |
heap->min = NULL; |
else |
{ |
/* Otherwise, consolidate to find new minimum, as well as do the reorg |
work that needs to be done. */ |
heap->min = ret->right; |
fibheap_consolidate (heap); |
} |
return ret; |
} |
/* Insert NODE into the root list of HEAP. */ |
static void |
fibheap_ins_root (fibheap_t heap, fibnode_t node) |
{ |
/* If the heap is currently empty, the new node becomes the singleton |
circular root list. */ |
if (heap->root == NULL) |
{ |
heap->root = node; |
node->left = node; |
node->right = node; |
return; |
} |
/* Otherwise, insert it in the circular root list between the root |
and it's right node. */ |
fibnode_insert_after (heap->root, node); |
} |
/* Remove NODE from the rootlist of HEAP. */ |
static void |
fibheap_rem_root (fibheap_t heap, fibnode_t node) |
{ |
if (node->left == node) |
heap->root = NULL; |
else |
heap->root = fibnode_remove (node); |
} |
/* Consolidate the heap. */ |
static void |
fibheap_consolidate (fibheap_t heap) |
{ |
fibnode_t a[1 + 8 * sizeof (long)]; |
fibnode_t w; |
fibnode_t y; |
fibnode_t x; |
int i; |
int d; |
int D; |
D = 1 + 8 * sizeof (long); |
memset (a, 0, sizeof (fibnode_t) * D); |
while ((w = heap->root) != NULL) |
{ |
x = w; |
fibheap_rem_root (heap, w); |
d = x->degree; |
while (a[d] != NULL) |
{ |
y = a[d]; |
if (fibheap_compare (heap, x, y) > 0) |
{ |
fibnode_t temp; |
temp = x; |
x = y; |
y = temp; |
} |
fibheap_link (heap, y, x); |
a[d] = NULL; |
d++; |
} |
a[d] = x; |
} |
heap->min = NULL; |
for (i = 0; i < D; i++) |
if (a[i] != NULL) |
{ |
fibheap_ins_root (heap, a[i]); |
if (heap->min == NULL || fibheap_compare (heap, a[i], heap->min) < 0) |
heap->min = a[i]; |
} |
} |
/* Make NODE a child of PARENT. */ |
static void |
fibheap_link (fibheap_t heap ATTRIBUTE_UNUSED, |
fibnode_t node, fibnode_t parent) |
{ |
if (parent->child == NULL) |
parent->child = node; |
else |
fibnode_insert_before (parent->child, node); |
node->parent = parent; |
parent->degree++; |
node->mark = 0; |
} |
/* Remove NODE from PARENT's child list. */ |
static void |
fibheap_cut (fibheap_t heap, fibnode_t node, fibnode_t parent) |
{ |
fibnode_remove (node); |
parent->degree--; |
fibheap_ins_root (heap, node); |
node->parent = NULL; |
node->mark = 0; |
} |
static void |
fibheap_cascading_cut (fibheap_t heap, fibnode_t y) |
{ |
fibnode_t z; |
while ((z = y->parent) != NULL) |
{ |
if (y->mark == 0) |
{ |
y->mark = 1; |
return; |
} |
else |
{ |
fibheap_cut (heap, y, z); |
y = z; |
} |
} |
} |
static void |
fibnode_insert_after (fibnode_t a, fibnode_t b) |
{ |
if (a == a->right) |
{ |
a->right = b; |
a->left = b; |
b->right = a; |
b->left = a; |
} |
else |
{ |
b->right = a->right; |
a->right->left = b; |
a->right = b; |
b->left = a; |
} |
} |
static fibnode_t |
fibnode_remove (fibnode_t node) |
{ |
fibnode_t ret; |
if (node == node->left) |
ret = NULL; |
else |
ret = node->left; |
if (node->parent != NULL && node->parent->child == node) |
node->parent->child = ret; |
node->right->left = node->left; |
node->left->right = node->right; |
node->parent = NULL; |
node->left = node; |
node->right = node; |
return ret; |
} |
/contrib/toolchain/binutils/libiberty/filename_cmp.c |
---|
0,0 → 1,192 |
/* File name comparison routine. |
Copyright (C) 2007 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2, or (at your option) |
any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
#ifdef HAVE_CONFIG_H |
#include "config.h" |
#endif |
#ifdef HAVE_STRING_H |
#include <string.h> |
#endif |
#include "filenames.h" |
#include "safe-ctype.h" |
/* |
@deftypefn Extension int filename_cmp (const char *@var{s1}, const char *@var{s2}) |
Return zero if the two file names @var{s1} and @var{s2} are equivalent. |
If not equivalent, the returned value is similar to what @code{strcmp} |
would return. In other words, it returns a negative value if @var{s1} |
is less than @var{s2}, or a positive value if @var{s2} is greater than |
@var{s2}. |
This function does not normalize file names. As a result, this function |
will treat filenames that are spelled differently as different even in |
the case when the two filenames point to the same underlying file. |
However, it does handle the fact that on DOS-like file systems, forward |
and backward slashes are equal. |
@end deftypefn |
*/ |
int |
filename_cmp (const char *s1, const char *s2) |
{ |
#if !defined(HAVE_DOS_BASED_FILE_SYSTEM) \ |
&& !defined(HAVE_CASE_INSENSITIVE_FILE_SYSTEM) |
return strcmp(s1, s2); |
#else |
for (;;) |
{ |
int c1 = *s1; |
int c2 = *s2; |
#if defined (HAVE_CASE_INSENSITIVE_FILE_SYSTEM) |
c1 = TOLOWER (c1); |
c2 = TOLOWER (c2); |
#endif |
#if defined (HAVE_DOS_BASED_FILE_SYSTEM) |
/* On DOS-based file systems, the '/' and the '\' are equivalent. */ |
if (c1 == '/') |
c1 = '\\'; |
if (c2 == '/') |
c2 = '\\'; |
#endif |
if (c1 != c2) |
return (c1 - c2); |
if (c1 == '\0') |
return 0; |
s1++; |
s2++; |
} |
#endif |
} |
/* |
@deftypefn Extension int filename_ncmp (const char *@var{s1}, const char *@var{s2}, size_t @var{n}) |
Return zero if the two file names @var{s1} and @var{s2} are equivalent |
in range @var{n}. |
If not equivalent, the returned value is similar to what @code{strncmp} |
would return. In other words, it returns a negative value if @var{s1} |
is less than @var{s2}, or a positive value if @var{s2} is greater than |
@var{s2}. |
This function does not normalize file names. As a result, this function |
will treat filenames that are spelled differently as different even in |
the case when the two filenames point to the same underlying file. |
However, it does handle the fact that on DOS-like file systems, forward |
and backward slashes are equal. |
@end deftypefn |
*/ |
int |
filename_ncmp (const char *s1, const char *s2, size_t n) |
{ |
#if !defined(HAVE_DOS_BASED_FILE_SYSTEM) \ |
&& !defined(HAVE_CASE_INSENSITIVE_FILE_SYSTEM) |
return strncmp(s1, s2, n); |
#else |
if (!n) |
return 0; |
for (; n > 0; --n) |
{ |
int c1 = *s1; |
int c2 = *s2; |
#if defined (HAVE_CASE_INSENSITIVE_FILE_SYSTEM) |
c1 = TOLOWER (c1); |
c2 = TOLOWER (c2); |
#endif |
#if defined (HAVE_DOS_BASED_FILE_SYSTEM) |
/* On DOS-based file systems, the '/' and the '\' are equivalent. */ |
if (c1 == '/') |
c1 = '\\'; |
if (c2 == '/') |
c2 = '\\'; |
#endif |
if (c1 == '\0' || c1 != c2) |
return (c1 - c2); |
s1++; |
s2++; |
} |
return 0; |
#endif |
} |
/* |
@deftypefn Extension hashval_t filename_hash (const void *@var{s}) |
Return the hash value for file name @var{s} that will be compared |
using filename_cmp. |
This function is for use with hashtab.c hash tables. |
@end deftypefn |
*/ |
hashval_t |
filename_hash (const void *s) |
{ |
/* The cast is for -Wc++-compat. */ |
const unsigned char *str = (const unsigned char *) s; |
hashval_t r = 0; |
unsigned char c; |
while ((c = *str++) != 0) |
{ |
if (c == '\\') |
c = '/'; |
c = TOLOWER (c); |
r = r * 67 + c - 113; |
} |
return r; |
} |
/* |
@deftypefn Extension int filename_eq (const void *@var{s1}, const void *@var{s2}) |
Return non-zero if file names @var{s1} and @var{s2} are equivalent. |
This function is for use with hashtab.c hash tables. |
@end deftypefn |
*/ |
int |
filename_eq (const void *s1, const void *s2) |
{ |
/* The casts are for -Wc++-compat. */ |
return filename_cmp ((const char *) s1, (const char *) s2) == 0; |
} |
/contrib/toolchain/binutils/libiberty/floatformat.c |
---|
0,0 → 1,774 |
/* IEEE floating point support routines, for GDB, the GNU Debugger. |
Copyright 1991, 1994, 1999, 2000, 2003, 2005, 2006, 2010, 2012 |
Free Software Foundation, Inc. |
This file is part of GDB. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
/* This is needed to pick up the NAN macro on some systems. */ |
#define _GNU_SOURCE |
#ifdef HAVE_CONFIG_H |
#include "config.h" |
#endif |
#include <math.h> |
#ifdef HAVE_STRING_H |
#include <string.h> |
#endif |
/* On some platforms, <float.h> provides DBL_QNAN. */ |
#ifdef STDC_HEADERS |
#include <float.h> |
#endif |
#include "ansidecl.h" |
#include "libiberty.h" |
#include "floatformat.h" |
#ifndef INFINITY |
#ifdef HUGE_VAL |
#define INFINITY HUGE_VAL |
#else |
#define INFINITY (1.0 / 0.0) |
#endif |
#endif |
#ifndef NAN |
#ifdef DBL_QNAN |
#define NAN DBL_QNAN |
#else |
#define NAN (0.0 / 0.0) |
#endif |
#endif |
static int mant_bits_set (const struct floatformat *, const unsigned char *); |
static unsigned long get_field (const unsigned char *, |
enum floatformat_byteorders, |
unsigned int, |
unsigned int, |
unsigned int); |
static int floatformat_always_valid (const struct floatformat *fmt, |
const void *from); |
static int |
floatformat_always_valid (const struct floatformat *fmt ATTRIBUTE_UNUSED, |
const void *from ATTRIBUTE_UNUSED) |
{ |
return 1; |
} |
/* The odds that CHAR_BIT will be anything but 8 are low enough that I'm not |
going to bother with trying to muck around with whether it is defined in |
a system header, what we do if not, etc. */ |
#define FLOATFORMAT_CHAR_BIT 8 |
/* floatformats for IEEE half, single and double, big and little endian. */ |
const struct floatformat floatformat_ieee_half_big = |
{ |
floatformat_big, 16, 0, 1, 5, 15, 31, 6, 10, |
floatformat_intbit_no, |
"floatformat_ieee_half_big", |
floatformat_always_valid, |
NULL |
}; |
const struct floatformat floatformat_ieee_half_little = |
{ |
floatformat_little, 16, 0, 1, 5, 15, 31, 6, 10, |
floatformat_intbit_no, |
"floatformat_ieee_half_little", |
floatformat_always_valid, |
NULL |
}; |
const struct floatformat floatformat_ieee_single_big = |
{ |
floatformat_big, 32, 0, 1, 8, 127, 255, 9, 23, |
floatformat_intbit_no, |
"floatformat_ieee_single_big", |
floatformat_always_valid, |
NULL |
}; |
const struct floatformat floatformat_ieee_single_little = |
{ |
floatformat_little, 32, 0, 1, 8, 127, 255, 9, 23, |
floatformat_intbit_no, |
"floatformat_ieee_single_little", |
floatformat_always_valid, |
NULL |
}; |
const struct floatformat floatformat_ieee_double_big = |
{ |
floatformat_big, 64, 0, 1, 11, 1023, 2047, 12, 52, |
floatformat_intbit_no, |
"floatformat_ieee_double_big", |
floatformat_always_valid, |
NULL |
}; |
const struct floatformat floatformat_ieee_double_little = |
{ |
floatformat_little, 64, 0, 1, 11, 1023, 2047, 12, 52, |
floatformat_intbit_no, |
"floatformat_ieee_double_little", |
floatformat_always_valid, |
NULL |
}; |
/* floatformat for IEEE double, little endian byte order, with big endian word |
ordering, as on the ARM. */ |
const struct floatformat floatformat_ieee_double_littlebyte_bigword = |
{ |
floatformat_littlebyte_bigword, 64, 0, 1, 11, 1023, 2047, 12, 52, |
floatformat_intbit_no, |
"floatformat_ieee_double_littlebyte_bigword", |
floatformat_always_valid, |
NULL |
}; |
/* floatformat for VAX. Not quite IEEE, but close enough. */ |
const struct floatformat floatformat_vax_f = |
{ |
floatformat_vax, 32, 0, 1, 8, 129, 0, 9, 23, |
floatformat_intbit_no, |
"floatformat_vax_f", |
floatformat_always_valid, |
NULL |
}; |
const struct floatformat floatformat_vax_d = |
{ |
floatformat_vax, 64, 0, 1, 8, 129, 0, 9, 55, |
floatformat_intbit_no, |
"floatformat_vax_d", |
floatformat_always_valid, |
NULL |
}; |
const struct floatformat floatformat_vax_g = |
{ |
floatformat_vax, 64, 0, 1, 11, 1025, 0, 12, 52, |
floatformat_intbit_no, |
"floatformat_vax_g", |
floatformat_always_valid, |
NULL |
}; |
static int floatformat_i387_ext_is_valid (const struct floatformat *fmt, |
const void *from); |
static int |
floatformat_i387_ext_is_valid (const struct floatformat *fmt, const void *from) |
{ |
/* In the i387 double-extended format, if the exponent is all ones, |
then the integer bit must be set. If the exponent is neither 0 |
nor ~0, the intbit must also be set. Only if the exponent is |
zero can it be zero, and then it must be zero. */ |
unsigned long exponent, int_bit; |
const unsigned char *ufrom = (const unsigned char *) from; |
exponent = get_field (ufrom, fmt->byteorder, fmt->totalsize, |
fmt->exp_start, fmt->exp_len); |
int_bit = get_field (ufrom, fmt->byteorder, fmt->totalsize, |
fmt->man_start, 1); |
if ((exponent == 0) != (int_bit == 0)) |
return 0; |
else |
return 1; |
} |
const struct floatformat floatformat_i387_ext = |
{ |
floatformat_little, 80, 0, 1, 15, 0x3fff, 0x7fff, 16, 64, |
floatformat_intbit_yes, |
"floatformat_i387_ext", |
floatformat_i387_ext_is_valid, |
NULL |
}; |
const struct floatformat floatformat_m68881_ext = |
{ |
/* Note that the bits from 16 to 31 are unused. */ |
floatformat_big, 96, 0, 1, 15, 0x3fff, 0x7fff, 32, 64, |
floatformat_intbit_yes, |
"floatformat_m68881_ext", |
floatformat_always_valid, |
NULL |
}; |
const struct floatformat floatformat_i960_ext = |
{ |
/* Note that the bits from 0 to 15 are unused. */ |
floatformat_little, 96, 16, 17, 15, 0x3fff, 0x7fff, 32, 64, |
floatformat_intbit_yes, |
"floatformat_i960_ext", |
floatformat_always_valid, |
NULL |
}; |
const struct floatformat floatformat_m88110_ext = |
{ |
floatformat_big, 80, 0, 1, 15, 0x3fff, 0x7fff, 16, 64, |
floatformat_intbit_yes, |
"floatformat_m88110_ext", |
floatformat_always_valid, |
NULL |
}; |
const struct floatformat floatformat_m88110_harris_ext = |
{ |
/* Harris uses raw format 128 bytes long, but the number is just an ieee |
double, and the last 64 bits are wasted. */ |
floatformat_big,128, 0, 1, 11, 0x3ff, 0x7ff, 12, 52, |
floatformat_intbit_no, |
"floatformat_m88110_ext_harris", |
floatformat_always_valid, |
NULL |
}; |
const struct floatformat floatformat_arm_ext_big = |
{ |
/* Bits 1 to 16 are unused. */ |
floatformat_big, 96, 0, 17, 15, 0x3fff, 0x7fff, 32, 64, |
floatformat_intbit_yes, |
"floatformat_arm_ext_big", |
floatformat_always_valid, |
NULL |
}; |
const struct floatformat floatformat_arm_ext_littlebyte_bigword = |
{ |
/* Bits 1 to 16 are unused. */ |
floatformat_littlebyte_bigword, 96, 0, 17, 15, 0x3fff, 0x7fff, 32, 64, |
floatformat_intbit_yes, |
"floatformat_arm_ext_littlebyte_bigword", |
floatformat_always_valid, |
NULL |
}; |
const struct floatformat floatformat_ia64_spill_big = |
{ |
floatformat_big, 128, 0, 1, 17, 65535, 0x1ffff, 18, 64, |
floatformat_intbit_yes, |
"floatformat_ia64_spill_big", |
floatformat_always_valid, |
NULL |
}; |
const struct floatformat floatformat_ia64_spill_little = |
{ |
floatformat_little, 128, 0, 1, 17, 65535, 0x1ffff, 18, 64, |
floatformat_intbit_yes, |
"floatformat_ia64_spill_little", |
floatformat_always_valid, |
NULL |
}; |
const struct floatformat floatformat_ia64_quad_big = |
{ |
floatformat_big, 128, 0, 1, 15, 16383, 0x7fff, 16, 112, |
floatformat_intbit_no, |
"floatformat_ia64_quad_big", |
floatformat_always_valid, |
NULL |
}; |
const struct floatformat floatformat_ia64_quad_little = |
{ |
floatformat_little, 128, 0, 1, 15, 16383, 0x7fff, 16, 112, |
floatformat_intbit_no, |
"floatformat_ia64_quad_little", |
floatformat_always_valid, |
NULL |
}; |
static int |
floatformat_ibm_long_double_is_valid (const struct floatformat *fmt, |
const void *from) |
{ |
const unsigned char *ufrom = (const unsigned char *) from; |
const struct floatformat *hfmt = fmt->split_half; |
long top_exp, bot_exp; |
int top_nan = 0; |
top_exp = get_field (ufrom, hfmt->byteorder, hfmt->totalsize, |
hfmt->exp_start, hfmt->exp_len); |
bot_exp = get_field (ufrom + 8, hfmt->byteorder, hfmt->totalsize, |
hfmt->exp_start, hfmt->exp_len); |
if ((unsigned long) top_exp == hfmt->exp_nan) |
top_nan = mant_bits_set (hfmt, ufrom); |
/* A NaN is valid with any low part. */ |
if (top_nan) |
return 1; |
/* An infinity, zero or denormal requires low part 0 (positive or |
negative). */ |
if ((unsigned long) top_exp == hfmt->exp_nan || top_exp == 0) |
{ |
if (bot_exp != 0) |
return 0; |
return !mant_bits_set (hfmt, ufrom + 8); |
} |
/* The top part is now a finite normal value. The long double value |
is the sum of the two parts, and the top part must equal the |
result of rounding the long double value to nearest double. Thus |
the bottom part must be <= 0.5ulp of the top part in absolute |
value, and if it is < 0.5ulp then the long double is definitely |
valid. */ |
if (bot_exp < top_exp - 53) |
return 1; |
if (bot_exp > top_exp - 53 && bot_exp != 0) |
return 0; |
if (bot_exp == 0) |
{ |
/* The bottom part is 0 or denormal. Determine which, and if |
denormal the first two set bits. */ |
int first_bit = -1, second_bit = -1, cur_bit; |
for (cur_bit = 0; (unsigned int) cur_bit < hfmt->man_len; cur_bit++) |
if (get_field (ufrom + 8, hfmt->byteorder, hfmt->totalsize, |
hfmt->man_start + cur_bit, 1)) |
{ |
if (first_bit == -1) |
first_bit = cur_bit; |
else |
{ |
second_bit = cur_bit; |
break; |
} |
} |
/* Bottom part 0 is OK. */ |
if (first_bit == -1) |
return 1; |
/* The real exponent of the bottom part is -first_bit. */ |
if (-first_bit < top_exp - 53) |
return 1; |
if (-first_bit > top_exp - 53) |
return 0; |
/* The bottom part is at least 0.5ulp of the top part. For this |
to be OK, the bottom part must be exactly 0.5ulp (i.e. no |
more bits set) and the top part must have last bit 0. */ |
if (second_bit != -1) |
return 0; |
return !get_field (ufrom, hfmt->byteorder, hfmt->totalsize, |
hfmt->man_start + hfmt->man_len - 1, 1); |
} |
else |
{ |
/* The bottom part is at least 0.5ulp of the top part. For this |
to be OK, it must be exactly 0.5ulp (i.e. no explicit bits |
set) and the top part must have last bit 0. */ |
if (get_field (ufrom, hfmt->byteorder, hfmt->totalsize, |
hfmt->man_start + hfmt->man_len - 1, 1)) |
return 0; |
return !mant_bits_set (hfmt, ufrom + 8); |
} |
} |
const struct floatformat floatformat_ibm_long_double_big = |
{ |
floatformat_big, 128, 0, 1, 11, 1023, 2047, 12, 52, |
floatformat_intbit_no, |
"floatformat_ibm_long_double_big", |
floatformat_ibm_long_double_is_valid, |
&floatformat_ieee_double_big |
}; |
const struct floatformat floatformat_ibm_long_double_little = |
{ |
floatformat_little, 128, 0, 1, 11, 1023, 2047, 12, 52, |
floatformat_intbit_no, |
"floatformat_ibm_long_double_little", |
floatformat_ibm_long_double_is_valid, |
&floatformat_ieee_double_little |
}; |
#ifndef min |
#define min(a, b) ((a) < (b) ? (a) : (b)) |
#endif |
/* Return 1 if any bits are explicitly set in the mantissa of UFROM, |
format FMT, 0 otherwise. */ |
static int |
mant_bits_set (const struct floatformat *fmt, const unsigned char *ufrom) |
{ |
unsigned int mant_bits, mant_off; |
int mant_bits_left; |
mant_off = fmt->man_start; |
mant_bits_left = fmt->man_len; |
while (mant_bits_left > 0) |
{ |
mant_bits = min (mant_bits_left, 32); |
if (get_field (ufrom, fmt->byteorder, fmt->totalsize, |
mant_off, mant_bits) != 0) |
return 1; |
mant_off += mant_bits; |
mant_bits_left -= mant_bits; |
} |
return 0; |
} |
/* Extract a field which starts at START and is LEN bits long. DATA and |
TOTAL_LEN are the thing we are extracting it from, in byteorder ORDER. */ |
static unsigned long |
get_field (const unsigned char *data, enum floatformat_byteorders order, |
unsigned int total_len, unsigned int start, unsigned int len) |
{ |
unsigned long result = 0; |
unsigned int cur_byte; |
int lo_bit, hi_bit, cur_bitshift = 0; |
int nextbyte = (order == floatformat_little) ? 1 : -1; |
/* Start is in big-endian bit order! Fix that first. */ |
start = total_len - (start + len); |
/* Start at the least significant part of the field. */ |
if (order == floatformat_little) |
cur_byte = start / FLOATFORMAT_CHAR_BIT; |
else |
cur_byte = (total_len - start - 1) / FLOATFORMAT_CHAR_BIT; |
lo_bit = start % FLOATFORMAT_CHAR_BIT; |
hi_bit = min (lo_bit + len, FLOATFORMAT_CHAR_BIT); |
do |
{ |
unsigned int shifted = *(data + cur_byte) >> lo_bit; |
unsigned int bits = hi_bit - lo_bit; |
unsigned int mask = (1 << bits) - 1; |
result |= (shifted & mask) << cur_bitshift; |
len -= bits; |
cur_bitshift += bits; |
cur_byte += nextbyte; |
lo_bit = 0; |
hi_bit = min (len, FLOATFORMAT_CHAR_BIT); |
} |
while (len != 0); |
return result; |
} |
/* Convert from FMT to a double. |
FROM is the address of the extended float. |
Store the double in *TO. */ |
void |
floatformat_to_double (const struct floatformat *fmt, |
const void *from, double *to) |
{ |
const unsigned char *ufrom = (const unsigned char *) from; |
double dto; |
long exponent; |
unsigned long mant; |
unsigned int mant_bits, mant_off; |
int mant_bits_left; |
/* Split values are not handled specially, since the top half has |
the correctly rounded double value (in the only supported case of |
split values). */ |
exponent = get_field (ufrom, fmt->byteorder, fmt->totalsize, |
fmt->exp_start, fmt->exp_len); |
/* If the exponent indicates a NaN, we don't have information to |
decide what to do. So we handle it like IEEE, except that we |
don't try to preserve the type of NaN. FIXME. */ |
if ((unsigned long) exponent == fmt->exp_nan) |
{ |
int nan = mant_bits_set (fmt, ufrom); |
/* On certain systems (such as GNU/Linux), the use of the |
INFINITY macro below may generate a warning that can not be |
silenced due to a bug in GCC (PR preprocessor/11931). The |
preprocessor fails to recognise the __extension__ keyword in |
conjunction with the GNU/C99 extension for hexadecimal |
floating point constants and will issue a warning when |
compiling with -pedantic. */ |
if (nan) |
dto = NAN; |
else |
dto = INFINITY; |
if (get_field (ufrom, fmt->byteorder, fmt->totalsize, fmt->sign_start, 1)) |
dto = -dto; |
*to = dto; |
return; |
} |
mant_bits_left = fmt->man_len; |
mant_off = fmt->man_start; |
dto = 0.0; |
/* Build the result algebraically. Might go infinite, underflow, etc; |
who cares. */ |
/* For denorms use minimum exponent. */ |
if (exponent == 0) |
exponent = 1 - fmt->exp_bias; |
else |
{ |
exponent -= fmt->exp_bias; |
/* If this format uses a hidden bit, explicitly add it in now. |
Otherwise, increment the exponent by one to account for the |
integer bit. */ |
if (fmt->intbit == floatformat_intbit_no) |
dto = ldexp (1.0, exponent); |
else |
exponent++; |
} |
while (mant_bits_left > 0) |
{ |
mant_bits = min (mant_bits_left, 32); |
mant = get_field (ufrom, fmt->byteorder, fmt->totalsize, |
mant_off, mant_bits); |
dto += ldexp ((double) mant, exponent - mant_bits); |
exponent -= mant_bits; |
mant_off += mant_bits; |
mant_bits_left -= mant_bits; |
} |
/* Negate it if negative. */ |
if (get_field (ufrom, fmt->byteorder, fmt->totalsize, fmt->sign_start, 1)) |
dto = -dto; |
*to = dto; |
} |
static void put_field (unsigned char *, enum floatformat_byteorders, |
unsigned int, |
unsigned int, |
unsigned int, |
unsigned long); |
/* Set a field which starts at START and is LEN bits long. DATA and |
TOTAL_LEN are the thing we are extracting it from, in byteorder ORDER. */ |
static void |
put_field (unsigned char *data, enum floatformat_byteorders order, |
unsigned int total_len, unsigned int start, unsigned int len, |
unsigned long stuff_to_put) |
{ |
unsigned int cur_byte; |
int lo_bit, hi_bit; |
int nextbyte = (order == floatformat_little) ? 1 : -1; |
/* Start is in big-endian bit order! Fix that first. */ |
start = total_len - (start + len); |
/* Start at the least significant part of the field. */ |
if (order == floatformat_little) |
cur_byte = start / FLOATFORMAT_CHAR_BIT; |
else |
cur_byte = (total_len - start - 1) / FLOATFORMAT_CHAR_BIT; |
lo_bit = start % FLOATFORMAT_CHAR_BIT; |
hi_bit = min (lo_bit + len, FLOATFORMAT_CHAR_BIT); |
do |
{ |
unsigned char *byte_ptr = data + cur_byte; |
unsigned int bits = hi_bit - lo_bit; |
unsigned int mask = ((1 << bits) - 1) << lo_bit; |
*byte_ptr = (*byte_ptr & ~mask) | ((stuff_to_put << lo_bit) & mask); |
stuff_to_put >>= bits; |
len -= bits; |
cur_byte += nextbyte; |
lo_bit = 0; |
hi_bit = min (len, FLOATFORMAT_CHAR_BIT); |
} |
while (len != 0); |
} |
/* The converse: convert the double *FROM to an extended float |
and store where TO points. Neither FROM nor TO have any alignment |
restrictions. */ |
void |
floatformat_from_double (const struct floatformat *fmt, |
const double *from, void *to) |
{ |
double dfrom; |
int exponent; |
double mant; |
unsigned int mant_bits, mant_off; |
int mant_bits_left; |
unsigned char *uto = (unsigned char *) to; |
dfrom = *from; |
memset (uto, 0, fmt->totalsize / FLOATFORMAT_CHAR_BIT); |
/* Split values are not handled specially, since a bottom half of |
zero is correct for any value representable as double (in the |
only supported case of split values). */ |
/* If negative, set the sign bit. */ |
if (dfrom < 0) |
{ |
put_field (uto, fmt->byteorder, fmt->totalsize, fmt->sign_start, 1, 1); |
dfrom = -dfrom; |
} |
if (dfrom == 0) |
{ |
/* 0.0. */ |
return; |
} |
if (dfrom != dfrom) |
{ |
/* NaN. */ |
put_field (uto, fmt->byteorder, fmt->totalsize, fmt->exp_start, |
fmt->exp_len, fmt->exp_nan); |
/* Be sure it's not infinity, but NaN value is irrelevant. */ |
put_field (uto, fmt->byteorder, fmt->totalsize, fmt->man_start, |
32, 1); |
return; |
} |
if (dfrom + dfrom == dfrom) |
{ |
/* This can only happen for an infinite value (or zero, which we |
already handled above). */ |
put_field (uto, fmt->byteorder, fmt->totalsize, fmt->exp_start, |
fmt->exp_len, fmt->exp_nan); |
return; |
} |
mant = frexp (dfrom, &exponent); |
if (exponent + fmt->exp_bias - 1 > 0) |
put_field (uto, fmt->byteorder, fmt->totalsize, fmt->exp_start, |
fmt->exp_len, exponent + fmt->exp_bias - 1); |
else |
{ |
/* Handle a denormalized number. FIXME: What should we do for |
non-IEEE formats? */ |
put_field (uto, fmt->byteorder, fmt->totalsize, fmt->exp_start, |
fmt->exp_len, 0); |
mant = ldexp (mant, exponent + fmt->exp_bias - 1); |
} |
mant_bits_left = fmt->man_len; |
mant_off = fmt->man_start; |
while (mant_bits_left > 0) |
{ |
unsigned long mant_long; |
mant_bits = mant_bits_left < 32 ? mant_bits_left : 32; |
mant *= 4294967296.0; |
mant_long = (unsigned long)mant; |
mant -= mant_long; |
/* If the integer bit is implicit, and we are not creating a |
denormalized number, then we need to discard it. */ |
if ((unsigned int) mant_bits_left == fmt->man_len |
&& fmt->intbit == floatformat_intbit_no |
&& exponent + fmt->exp_bias - 1 > 0) |
{ |
mant_long &= 0x7fffffff; |
mant_bits -= 1; |
} |
else if (mant_bits < 32) |
{ |
/* The bits we want are in the most significant MANT_BITS bits of |
mant_long. Move them to the least significant. */ |
mant_long >>= 32 - mant_bits; |
} |
put_field (uto, fmt->byteorder, fmt->totalsize, |
mant_off, mant_bits, mant_long); |
mant_off += mant_bits; |
mant_bits_left -= mant_bits; |
} |
} |
/* Return non-zero iff the data at FROM is a valid number in format FMT. */ |
int |
floatformat_is_valid (const struct floatformat *fmt, const void *from) |
{ |
return fmt->is_valid (fmt, from); |
} |
#ifdef IEEE_DEBUG |
#include <stdio.h> |
/* This is to be run on a host which uses IEEE floating point. */ |
void |
ieee_test (double n) |
{ |
double result; |
floatformat_to_double (&floatformat_ieee_double_little, &n, &result); |
if ((n != result && (! isnan (n) || ! isnan (result))) |
|| (n < 0 && result >= 0) |
|| (n >= 0 && result < 0)) |
printf ("Differ(to): %.20g -> %.20g\n", n, result); |
floatformat_from_double (&floatformat_ieee_double_little, &n, &result); |
if ((n != result && (! isnan (n) || ! isnan (result))) |
|| (n < 0 && result >= 0) |
|| (n >= 0 && result < 0)) |
printf ("Differ(from): %.20g -> %.20g\n", n, result); |
#if 0 |
{ |
char exten[16]; |
floatformat_from_double (&floatformat_m68881_ext, &n, exten); |
floatformat_to_double (&floatformat_m68881_ext, exten, &result); |
if (n != result) |
printf ("Differ(to+from): %.20g -> %.20g\n", n, result); |
} |
#endif |
#if IEEE_DEBUG > 1 |
/* This is to be run on a host which uses 68881 format. */ |
{ |
long double ex = *(long double *)exten; |
if (ex != n) |
printf ("Differ(from vs. extended): %.20g\n", n); |
} |
#endif |
} |
int |
main (void) |
{ |
ieee_test (0.0); |
ieee_test (0.5); |
ieee_test (1.1); |
ieee_test (256.0); |
ieee_test (0.12345); |
ieee_test (234235.78907234); |
ieee_test (-512.0); |
ieee_test (-0.004321); |
ieee_test (1.2E-70); |
ieee_test (1.2E-316); |
ieee_test (4.9406564584124654E-324); |
ieee_test (- 4.9406564584124654E-324); |
ieee_test (- 0.0); |
ieee_test (- INFINITY); |
ieee_test (- NAN); |
ieee_test (INFINITY); |
ieee_test (NAN); |
return 0; |
} |
#endif |
/contrib/toolchain/binutils/libiberty/fnmatch.c |
---|
0,0 → 1,220 |
/* Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc. |
NOTE: This source is derived from an old version taken from the GNU C |
Library (glibc). |
This program is free software; you can redistribute it and/or modify it |
under the terms of the GNU General Public License as published by the |
Free Software Foundation; either version 2, or (at your option) any |
later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
#ifdef HAVE_CONFIG_H |
#if defined (CONFIG_BROKETS) |
/* We use <config.h> instead of "config.h" so that a compilation |
using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h |
(which it would do because it found this file in $srcdir). */ |
#include <config.h> |
#else |
#include "config.h" |
#endif |
#endif |
#ifndef _GNU_SOURCE |
#define _GNU_SOURCE |
#endif |
/* This code to undef const added in libiberty. */ |
#ifndef __STDC__ |
/* This is a separate conditional since some stdc systems |
reject `defined (const)'. */ |
#ifndef const |
#define const |
#endif |
#endif |
#include <errno.h> |
#include <fnmatch.h> |
#include <safe-ctype.h> |
/* Comment out all this code if we are using the GNU C Library, and are not |
actually compiling the library itself. This code is part of the GNU C |
Library, but also included in many other GNU distributions. Compiling |
and linking in this code is a waste when using the GNU C library |
(especially if it is a shared library). Rather than having every GNU |
program understand `configure --with-gnu-libc' and omit the object files, |
it is simpler to just do this in the source for each such file. */ |
#if defined (_LIBC) || !defined (__GNU_LIBRARY__) |
#if !defined(__GNU_LIBRARY__) && !defined(STDC_HEADERS) |
extern int errno; |
#endif |
/* Match STRING against the filename pattern PATTERN, returning zero if |
it matches, nonzero if not. */ |
int |
fnmatch (const char *pattern, const char *string, int flags) |
{ |
register const char *p = pattern, *n = string; |
register unsigned char c; |
#define FOLD(c) ((flags & FNM_CASEFOLD) ? TOLOWER (c) : (c)) |
while ((c = *p++) != '\0') |
{ |
c = FOLD (c); |
switch (c) |
{ |
case '?': |
if (*n == '\0') |
return FNM_NOMATCH; |
else if ((flags & FNM_FILE_NAME) && *n == '/') |
return FNM_NOMATCH; |
else if ((flags & FNM_PERIOD) && *n == '.' && |
(n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/'))) |
return FNM_NOMATCH; |
break; |
case '\\': |
if (!(flags & FNM_NOESCAPE)) |
{ |
c = *p++; |
c = FOLD (c); |
} |
if (FOLD ((unsigned char)*n) != c) |
return FNM_NOMATCH; |
break; |
case '*': |
if ((flags & FNM_PERIOD) && *n == '.' && |
(n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/'))) |
return FNM_NOMATCH; |
for (c = *p++; c == '?' || c == '*'; c = *p++, ++n) |
if (((flags & FNM_FILE_NAME) && *n == '/') || |
(c == '?' && *n == '\0')) |
return FNM_NOMATCH; |
if (c == '\0') |
return 0; |
{ |
unsigned char c1 = (!(flags & FNM_NOESCAPE) && c == '\\') ? *p : c; |
c1 = FOLD (c1); |
for (--p; *n != '\0'; ++n) |
if ((c == '[' || FOLD ((unsigned char)*n) == c1) && |
fnmatch (p, n, flags & ~FNM_PERIOD) == 0) |
return 0; |
return FNM_NOMATCH; |
} |
case '[': |
{ |
/* Nonzero if the sense of the character class is inverted. */ |
register int negate; |
if (*n == '\0') |
return FNM_NOMATCH; |
if ((flags & FNM_PERIOD) && *n == '.' && |
(n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/'))) |
return FNM_NOMATCH; |
negate = (*p == '!' || *p == '^'); |
if (negate) |
++p; |
c = *p++; |
for (;;) |
{ |
register unsigned char cstart = c, cend = c; |
if (!(flags & FNM_NOESCAPE) && c == '\\') |
cstart = cend = *p++; |
cstart = cend = FOLD (cstart); |
if (c == '\0') |
/* [ (unterminated) loses. */ |
return FNM_NOMATCH; |
c = *p++; |
c = FOLD (c); |
if ((flags & FNM_FILE_NAME) && c == '/') |
/* [/] can never match. */ |
return FNM_NOMATCH; |
if (c == '-' && *p != ']') |
{ |
cend = *p++; |
if (!(flags & FNM_NOESCAPE) && cend == '\\') |
cend = *p++; |
if (cend == '\0') |
return FNM_NOMATCH; |
cend = FOLD (cend); |
c = *p++; |
} |
if (FOLD ((unsigned char)*n) >= cstart |
&& FOLD ((unsigned char)*n) <= cend) |
goto matched; |
if (c == ']') |
break; |
} |
if (!negate) |
return FNM_NOMATCH; |
break; |
matched:; |
/* Skip the rest of the [...] that already matched. */ |
while (c != ']') |
{ |
if (c == '\0') |
/* [... (unterminated) loses. */ |
return FNM_NOMATCH; |
c = *p++; |
if (!(flags & FNM_NOESCAPE) && c == '\\') |
/* XXX 1003.2d11 is unclear if this is right. */ |
++p; |
} |
if (negate) |
return FNM_NOMATCH; |
} |
break; |
default: |
if (c != FOLD ((unsigned char)*n)) |
return FNM_NOMATCH; |
} |
++n; |
} |
if (*n == '\0') |
return 0; |
if ((flags & FNM_LEADING_DIR) && *n == '/') |
/* The FNM_LEADING_DIR flag says that "foo*" matches "foobar/frobozz". */ |
return 0; |
return FNM_NOMATCH; |
} |
#endif /* _LIBC or not __GNU_LIBRARY__. */ |
/contrib/toolchain/binutils/libiberty/fopen_unlocked.c |
---|
0,0 → 1,129 |
/* Implement fopen_unlocked and related functions. |
Copyright (C) 2005, 2011 Free Software Foundation, Inc. |
Written by Kaveh R. Ghazi <ghazi@caip.rutgers.edu>. |
This file is part of the libiberty library. |
Libiberty is free software; you can redistribute it and/or |
modify it under the terms of the GNU Library General Public |
License as published by the Free Software Foundation; either |
version 2 of the License, or (at your option) any later version. |
Libiberty is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
Library General Public License for more details. |
You should have received a copy of the GNU Library General Public |
License along with libiberty; see the file COPYING.LIB. If |
not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
/* |
@deftypefn Extension void unlock_stream (FILE * @var{stream}) |
If the OS supports it, ensure that the supplied stream is setup to |
avoid any multi-threaded locking. Otherwise leave the @code{FILE} |
pointer unchanged. If the @var{stream} is @code{NULL} do nothing. |
@end deftypefn |
@deftypefn Extension void unlock_std_streams (void) |
If the OS supports it, ensure that the standard I/O streams, |
@code{stdin}, @code{stdout} and @code{stderr} are setup to avoid any |
multi-threaded locking. Otherwise do nothing. |
@end deftypefn |
@deftypefn Extension {FILE *} fopen_unlocked (const char *@var{path}, @ |
const char * @var{mode}) |
Opens and returns a @code{FILE} pointer via @code{fopen}. If the |
operating system supports it, ensure that the stream is setup to avoid |
any multi-threaded locking. Otherwise return the @code{FILE} pointer |
unchanged. |
@end deftypefn |
@deftypefn Extension {FILE *} fdopen_unlocked (int @var{fildes}, @ |
const char * @var{mode}) |
Opens and returns a @code{FILE} pointer via @code{fdopen}. If the |
operating system supports it, ensure that the stream is setup to avoid |
any multi-threaded locking. Otherwise return the @code{FILE} pointer |
unchanged. |
@end deftypefn |
@deftypefn Extension {FILE *} freopen_unlocked (const char * @var{path}, @ |
const char * @var{mode}, FILE * @var{stream}) |
Opens and returns a @code{FILE} pointer via @code{freopen}. If the |
operating system supports it, ensure that the stream is setup to avoid |
any multi-threaded locking. Otherwise return the @code{FILE} pointer |
unchanged. |
@end deftypefn |
*/ |
#ifdef HAVE_CONFIG_H |
#include "config.h" |
#endif |
#include <stdio.h> |
#ifdef HAVE_STDIO_EXT_H |
#include <stdio_ext.h> |
#endif |
#include "libiberty.h" |
/* This is an inline helper function to consolidate attempts to unlock |
a stream. */ |
static inline void |
unlock_1 (FILE *const fp ATTRIBUTE_UNUSED) |
{ |
#if defined(HAVE___FSETLOCKING) && defined(FSETLOCKING_BYCALLER) |
if (fp) |
__fsetlocking (fp, FSETLOCKING_BYCALLER); |
#endif |
} |
void |
unlock_stream (FILE *fp) |
{ |
unlock_1 (fp); |
} |
void |
unlock_std_streams (void) |
{ |
unlock_1 (stdin); |
unlock_1 (stdout); |
unlock_1 (stderr); |
} |
FILE * |
fopen_unlocked (const char *path, const char *mode) |
{ |
FILE *const fp = fopen (path, mode); |
unlock_1 (fp); |
return fp; |
} |
FILE * |
fdopen_unlocked (int fildes, const char *mode) |
{ |
FILE *const fp = fdopen (fildes, mode); |
unlock_1 (fp); |
return fp; |
} |
FILE * |
freopen_unlocked (const char *path, const char *mode, FILE *stream) |
{ |
FILE *const fp = freopen (path, mode, stream); |
unlock_1 (fp); |
return fp; |
} |
/contrib/toolchain/binutils/libiberty/getopt.c |
---|
0,0 → 1,1044 |
/* Getopt for GNU. |
NOTE: getopt is now part of the C library, so if you don't know what |
"Keep this file name-space clean" means, talk to drepper@gnu.org |
before changing it! |
Copyright (C) 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, |
1996, 1997, 1998, 2005 Free Software Foundation, Inc. |
NOTE: This source is derived from an old version taken from the GNU C |
Library (glibc). |
This program is free software; you can redistribute it and/or modify it |
under the terms of the GNU General Public License as published by the |
Free Software Foundation; either version 2, or (at your option) any |
later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, |
USA. */ |
/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>. |
Ditto for AIX 3.2 and <stdlib.h>. */ |
#ifndef _NO_PROTO |
# define _NO_PROTO |
#endif |
#ifdef HAVE_CONFIG_H |
# include <config.h> |
#endif |
#if !defined __STDC__ || !__STDC__ |
/* This is a separate conditional since some stdc systems |
reject `defined (const)'. */ |
# ifndef const |
# define const |
# endif |
#endif |
#include "ansidecl.h" |
#include <stdio.h> |
/* Comment out all this code if we are using the GNU C Library, and are not |
actually compiling the library itself. This code is part of the GNU C |
Library, but also included in many other GNU distributions. Compiling |
and linking in this code is a waste when using the GNU C library |
(especially if it is a shared library). Rather than having every GNU |
program understand `configure --with-gnu-libc' and omit the object files, |
it is simpler to just do this in the source for each such file. */ |
#define GETOPT_INTERFACE_VERSION 2 |
#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 |
# include <gnu-versions.h> |
# if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION |
# define ELIDE_CODE |
# endif |
#endif |
#ifndef ELIDE_CODE |
/* This needs to come after some library #include |
to get __GNU_LIBRARY__ defined. */ |
#ifdef __GNU_LIBRARY__ |
/* Don't include stdlib.h for non-GNU C libraries because some of them |
contain conflicting prototypes for getopt. */ |
# include <stdlib.h> |
# include <unistd.h> |
#endif /* GNU C library. */ |
#ifdef VMS |
# include <unixlib.h> |
# if HAVE_STRING_H - 0 |
# include <string.h> |
# endif |
#endif |
# define _(msgid) (msgid) |
/* This version of `getopt' appears to the caller like standard Unix `getopt' |
but it behaves differently for the user, since it allows the user |
to intersperse the options with the other arguments. |
As `getopt' works, it permutes the elements of ARGV so that, |
when it is done, all the options precede everything else. Thus |
all application programs are extended to handle flexible argument order. |
Setting the environment variable POSIXLY_CORRECT disables permutation. |
Then the behavior is completely standard. |
GNU application programs can use a third alternative mode in which |
they can distinguish the relative order of options and other arguments. */ |
#include "getopt.h" |
/* For communication from `getopt' to the caller. |
When `getopt' finds an option that takes an argument, |
the argument value is returned here. |
Also, when `ordering' is RETURN_IN_ORDER, |
each non-option ARGV-element is returned here. */ |
char *optarg = NULL; |
/* Index in ARGV of the next element to be scanned. |
This is used for communication to and from the caller |
and for communication between successive calls to `getopt'. |
On entry to `getopt', zero means this is the first call; initialize. |
When `getopt' returns -1, this is the index of the first of the |
non-option elements that the caller should itself scan. |
Otherwise, `optind' communicates from one call to the next |
how much of ARGV has been scanned so far. */ |
/* 1003.2 says this must be 1 before any call. */ |
int optind = 1; |
/* Formerly, initialization of getopt depended on optind==0, which |
causes problems with re-calling getopt as programs generally don't |
know that. */ |
int __getopt_initialized = 0; |
/* The next char to be scanned in the option-element |
in which the last option character we returned was found. |
This allows us to pick up the scan where we left off. |
If this is zero, or a null string, it means resume the scan |
by advancing to the next ARGV-element. */ |
static char *nextchar; |
/* Callers store zero here to inhibit the error message |
for unrecognized options. */ |
int opterr = 1; |
/* Set to an option character which was unrecognized. |
This must be initialized on some systems to avoid linking in the |
system's own getopt implementation. */ |
int optopt = '?'; |
/* Describe how to deal with options that follow non-option ARGV-elements. |
If the caller did not specify anything, |
the default is REQUIRE_ORDER if the environment variable |
POSIXLY_CORRECT is defined, PERMUTE otherwise. |
REQUIRE_ORDER means don't recognize them as options; |
stop option processing when the first non-option is seen. |
This is what Unix does. |
This mode of operation is selected by either setting the environment |
variable POSIXLY_CORRECT, or using `+' as the first character |
of the list of option characters. |
PERMUTE is the default. We permute the contents of ARGV as we scan, |
so that eventually all the non-options are at the end. This allows options |
to be given in any order, even with programs that were not written to |
expect this. |
RETURN_IN_ORDER is an option available to programs that were written |
to expect options and other ARGV-elements in any order and that care about |
the ordering of the two. We describe each non-option ARGV-element |
as if it were the argument of an option with character code 1. |
Using `-' as the first character of the list of option characters |
selects this mode of operation. |
The special argument `--' forces an end of option-scanning regardless |
of the value of `ordering'. In the case of RETURN_IN_ORDER, only |
`--' can cause `getopt' to return -1 with `optind' != ARGC. */ |
static enum |
{ |
REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER |
} ordering; |
/* Value of POSIXLY_CORRECT environment variable. */ |
static char *posixly_correct; |
#ifdef __GNU_LIBRARY__ |
/* We want to avoid inclusion of string.h with non-GNU libraries |
because there are many ways it can cause trouble. |
On some systems, it contains special magic macros that don't work |
in GCC. */ |
# include <string.h> |
# define my_index strchr |
#else |
# if HAVE_STRING_H |
# include <string.h> |
# else |
# if HAVE_STRINGS_H |
# include <strings.h> |
# endif |
# endif |
/* Avoid depending on library functions or files |
whose names are inconsistent. */ |
#if HAVE_STDLIB_H && HAVE_DECL_GETENV |
# include <stdlib.h> |
#elif !defined(getenv) |
# ifdef __cplusplus |
extern "C" { |
# endif /* __cplusplus */ |
extern char *getenv (const char *); |
# ifdef __cplusplus |
} |
# endif /* __cplusplus */ |
#endif |
static char * |
my_index (const char *str, int chr) |
{ |
while (*str) |
{ |
if (*str == chr) |
return (char *) str; |
str++; |
} |
return 0; |
} |
/* If using GCC, we can safely declare strlen this way. |
If not using GCC, it is ok not to declare it. */ |
#ifdef __GNUC__ |
/* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h. |
That was relevant to code that was here before. */ |
# if (!defined __STDC__ || !__STDC__) && !defined strlen |
/* gcc with -traditional declares the built-in strlen to return int, |
and has done so at least since version 2.4.5. -- rms. */ |
extern int strlen (const char *); |
# endif /* not __STDC__ */ |
#endif /* __GNUC__ */ |
#endif /* not __GNU_LIBRARY__ */ |
/* Handle permutation of arguments. */ |
/* Describe the part of ARGV that contains non-options that have |
been skipped. `first_nonopt' is the index in ARGV of the first of them; |
`last_nonopt' is the index after the last of them. */ |
static int first_nonopt; |
static int last_nonopt; |
#ifdef _LIBC |
/* Bash 2.0 gives us an environment variable containing flags |
indicating ARGV elements that should not be considered arguments. */ |
/* Defined in getopt_init.c */ |
extern char *__getopt_nonoption_flags; |
static int nonoption_flags_max_len; |
static int nonoption_flags_len; |
static int original_argc; |
static char *const *original_argv; |
/* Make sure the environment variable bash 2.0 puts in the environment |
is valid for the getopt call we must make sure that the ARGV passed |
to getopt is that one passed to the process. */ |
static void |
__attribute__ ((unused)) |
store_args_and_env (int argc, char *const *argv) |
{ |
/* XXX This is no good solution. We should rather copy the args so |
that we can compare them later. But we must not use malloc(3). */ |
original_argc = argc; |
original_argv = argv; |
} |
# ifdef text_set_element |
text_set_element (__libc_subinit, store_args_and_env); |
# endif /* text_set_element */ |
# define SWAP_FLAGS(ch1, ch2) \ |
if (nonoption_flags_len > 0) \ |
{ \ |
char __tmp = __getopt_nonoption_flags[ch1]; \ |
__getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ |
__getopt_nonoption_flags[ch2] = __tmp; \ |
} |
#else /* !_LIBC */ |
# define SWAP_FLAGS(ch1, ch2) |
#endif /* _LIBC */ |
/* Exchange two adjacent subsequences of ARGV. |
One subsequence is elements [first_nonopt,last_nonopt) |
which contains all the non-options that have been skipped so far. |
The other is elements [last_nonopt,optind), which contains all |
the options processed since those non-options were skipped. |
`first_nonopt' and `last_nonopt' are relocated so that they describe |
the new indices of the non-options in ARGV after they are moved. */ |
#if defined __STDC__ && __STDC__ |
static void exchange (char **); |
#endif |
static void |
exchange (char **argv) |
{ |
int bottom = first_nonopt; |
int middle = last_nonopt; |
int top = optind; |
char *tem; |
/* Exchange the shorter segment with the far end of the longer segment. |
That puts the shorter segment into the right place. |
It leaves the longer segment in the right place overall, |
but it consists of two parts that need to be swapped next. */ |
#ifdef _LIBC |
/* First make sure the handling of the `__getopt_nonoption_flags' |
string can work normally. Our top argument must be in the range |
of the string. */ |
if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len) |
{ |
/* We must extend the array. The user plays games with us and |
presents new arguments. */ |
char *new_str = (char *) malloc (top + 1); |
if (new_str == NULL) |
nonoption_flags_len = nonoption_flags_max_len = 0; |
else |
{ |
memset (mempcpy (new_str, __getopt_nonoption_flags, |
nonoption_flags_max_len), |
'\0', top + 1 - nonoption_flags_max_len); |
nonoption_flags_max_len = top + 1; |
__getopt_nonoption_flags = new_str; |
} |
} |
#endif |
while (top > middle && middle > bottom) |
{ |
if (top - middle > middle - bottom) |
{ |
/* Bottom segment is the short one. */ |
int len = middle - bottom; |
register int i; |
/* Swap it with the top part of the top segment. */ |
for (i = 0; i < len; i++) |
{ |
tem = argv[bottom + i]; |
argv[bottom + i] = argv[top - (middle - bottom) + i]; |
argv[top - (middle - bottom) + i] = tem; |
SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); |
} |
/* Exclude the moved bottom segment from further swapping. */ |
top -= len; |
} |
else |
{ |
/* Top segment is the short one. */ |
int len = top - middle; |
register int i; |
/* Swap it with the bottom part of the bottom segment. */ |
for (i = 0; i < len; i++) |
{ |
tem = argv[bottom + i]; |
argv[bottom + i] = argv[middle + i]; |
argv[middle + i] = tem; |
SWAP_FLAGS (bottom + i, middle + i); |
} |
/* Exclude the moved top segment from further swapping. */ |
bottom += len; |
} |
} |
/* Update records for the slots the non-options now occupy. */ |
first_nonopt += (optind - last_nonopt); |
last_nonopt = optind; |
} |
/* Initialize the internal data when the first call is made. */ |
#if defined __STDC__ && __STDC__ |
static const char *_getopt_initialize (int, char *const *, const char *); |
#endif |
static const char * |
_getopt_initialize (int argc ATTRIBUTE_UNUSED, |
char *const *argv ATTRIBUTE_UNUSED, |
const char *optstring) |
{ |
/* Start processing options with ARGV-element 1 (since ARGV-element 0 |
is the program name); the sequence of previously skipped |
non-option ARGV-elements is empty. */ |
first_nonopt = last_nonopt = optind; |
nextchar = NULL; |
posixly_correct = getenv ("POSIXLY_CORRECT"); |
/* Determine how to handle the ordering of options and nonoptions. */ |
if (optstring[0] == '-') |
{ |
ordering = RETURN_IN_ORDER; |
++optstring; |
} |
else if (optstring[0] == '+') |
{ |
ordering = REQUIRE_ORDER; |
++optstring; |
} |
else if (posixly_correct != NULL) |
ordering = REQUIRE_ORDER; |
else |
ordering = PERMUTE; |
#ifdef _LIBC |
if (posixly_correct == NULL |
&& argc == original_argc && argv == original_argv) |
{ |
if (nonoption_flags_max_len == 0) |
{ |
if (__getopt_nonoption_flags == NULL |
|| __getopt_nonoption_flags[0] == '\0') |
nonoption_flags_max_len = -1; |
else |
{ |
const char *orig_str = __getopt_nonoption_flags; |
int len = nonoption_flags_max_len = strlen (orig_str); |
if (nonoption_flags_max_len < argc) |
nonoption_flags_max_len = argc; |
__getopt_nonoption_flags = |
(char *) malloc (nonoption_flags_max_len); |
if (__getopt_nonoption_flags == NULL) |
nonoption_flags_max_len = -1; |
else |
memset (mempcpy (__getopt_nonoption_flags, orig_str, len), |
'\0', nonoption_flags_max_len - len); |
} |
} |
nonoption_flags_len = nonoption_flags_max_len; |
} |
else |
nonoption_flags_len = 0; |
#endif |
return optstring; |
} |
/* Scan elements of ARGV (whose length is ARGC) for option characters |
given in OPTSTRING. |
If an element of ARGV starts with '-', and is not exactly "-" or "--", |
then it is an option element. The characters of this element |
(aside from the initial '-') are option characters. If `getopt' |
is called repeatedly, it returns successively each of the option characters |
from each of the option elements. |
If `getopt' finds another option character, it returns that character, |
updating `optind' and `nextchar' so that the next call to `getopt' can |
resume the scan with the following option character or ARGV-element. |
If there are no more option characters, `getopt' returns -1. |
Then `optind' is the index in ARGV of the first ARGV-element |
that is not an option. (The ARGV-elements have been permuted |
so that those that are not options now come last.) |
OPTSTRING is a string containing the legitimate option characters. |
If an option character is seen that is not listed in OPTSTRING, |
return '?' after printing an error message. If you set `opterr' to |
zero, the error message is suppressed but we still return '?'. |
If a char in OPTSTRING is followed by a colon, that means it wants an arg, |
so the following text in the same ARGV-element, or the text of the following |
ARGV-element, is returned in `optarg'. Two colons mean an option that |
wants an optional arg; if there is text in the current ARGV-element, |
it is returned in `optarg', otherwise `optarg' is set to zero. |
If OPTSTRING starts with `-' or `+', it requests different methods of |
handling the non-option ARGV-elements. |
See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. |
Long-named options begin with `--' instead of `-'. |
Their names may be abbreviated as long as the abbreviation is unique |
or is an exact match for some defined option. If they have an |
argument, it follows the option name in the same ARGV-element, separated |
from the option name by a `=', or else the in next ARGV-element. |
When `getopt' finds a long-named option, it returns 0 if that option's |
`flag' field is nonzero, the value of the option's `val' field |
if the `flag' field is zero. |
The elements of ARGV aren't really const, because we permute them. |
But we pretend they're const in the prototype to be compatible |
with other systems. |
LONGOPTS is a vector of `struct option' terminated by an |
element containing a name which is zero. |
LONGIND returns the index in LONGOPT of the long-named option found. |
It is only valid when a long-named option has been found by the most |
recent call. |
If LONG_ONLY is nonzero, '-' as well as '--' can introduce |
long-named options. */ |
int |
_getopt_internal (int argc, char *const *argv, const char *optstring, |
const struct option *longopts, |
int *longind, int long_only) |
{ |
optarg = NULL; |
if (optind == 0 || !__getopt_initialized) |
{ |
if (optind == 0) |
optind = 1; /* Don't scan ARGV[0], the program name. */ |
optstring = _getopt_initialize (argc, argv, optstring); |
__getopt_initialized = 1; |
} |
/* Test whether ARGV[optind] points to a non-option argument. |
Either it does not have option syntax, or there is an environment flag |
from the shell indicating it is not an option. The later information |
is only used when the used in the GNU libc. */ |
#ifdef _LIBC |
# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \ |
|| (optind < nonoption_flags_len \ |
&& __getopt_nonoption_flags[optind] == '1')) |
#else |
# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0') |
#endif |
if (nextchar == NULL || *nextchar == '\0') |
{ |
/* Advance to the next ARGV-element. */ |
/* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been |
moved back by the user (who may also have changed the arguments). */ |
if (last_nonopt > optind) |
last_nonopt = optind; |
if (first_nonopt > optind) |
first_nonopt = optind; |
if (ordering == PERMUTE) |
{ |
/* If we have just processed some options following some non-options, |
exchange them so that the options come first. */ |
if (first_nonopt != last_nonopt && last_nonopt != optind) |
exchange ((char **) argv); |
else if (last_nonopt != optind) |
first_nonopt = optind; |
/* Skip any additional non-options |
and extend the range of non-options previously skipped. */ |
while (optind < argc && NONOPTION_P) |
optind++; |
last_nonopt = optind; |
} |
/* The special ARGV-element `--' means premature end of options. |
Skip it like a null option, |
then exchange with previous non-options as if it were an option, |
then skip everything else like a non-option. */ |
if (optind != argc && !strcmp (argv[optind], "--")) |
{ |
optind++; |
if (first_nonopt != last_nonopt && last_nonopt != optind) |
exchange ((char **) argv); |
else if (first_nonopt == last_nonopt) |
first_nonopt = optind; |
last_nonopt = argc; |
optind = argc; |
} |
/* If we have done all the ARGV-elements, stop the scan |
and back over any non-options that we skipped and permuted. */ |
if (optind == argc) |
{ |
/* Set the next-arg-index to point at the non-options |
that we previously skipped, so the caller will digest them. */ |
if (first_nonopt != last_nonopt) |
optind = first_nonopt; |
return -1; |
} |
/* If we have come to a non-option and did not permute it, |
either stop the scan or describe it to the caller and pass it by. */ |
if (NONOPTION_P) |
{ |
if (ordering == REQUIRE_ORDER) |
return -1; |
optarg = argv[optind++]; |
return 1; |
} |
/* We have found another option-ARGV-element. |
Skip the initial punctuation. */ |
nextchar = (argv[optind] + 1 |
+ (longopts != NULL && argv[optind][1] == '-')); |
} |
/* Decode the current option-ARGV-element. */ |
/* Check whether the ARGV-element is a long option. |
If long_only and the ARGV-element has the form "-f", where f is |
a valid short option, don't consider it an abbreviated form of |
a long option that starts with f. Otherwise there would be no |
way to give the -f short option. |
On the other hand, if there's a long option "fubar" and |
the ARGV-element is "-fu", do consider that an abbreviation of |
the long option, just like "--fu", and not "-f" with arg "u". |
This distinction seems to be the most useful approach. */ |
if (longopts != NULL |
&& (argv[optind][1] == '-' |
|| (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1]))))) |
{ |
char *nameend; |
const struct option *p; |
const struct option *pfound = NULL; |
int exact = 0; |
int ambig = 0; |
int indfound = -1; |
int option_index; |
for (nameend = nextchar; *nameend && *nameend != '='; nameend++) |
/* Do nothing. */ ; |
/* Test all long options for either exact match |
or abbreviated matches. */ |
for (p = longopts, option_index = 0; p->name; p++, option_index++) |
if (!strncmp (p->name, nextchar, nameend - nextchar)) |
{ |
if ((unsigned int) (nameend - nextchar) |
== (unsigned int) strlen (p->name)) |
{ |
/* Exact match found. */ |
pfound = p; |
indfound = option_index; |
exact = 1; |
break; |
} |
else if (pfound == NULL) |
{ |
/* First nonexact match found. */ |
pfound = p; |
indfound = option_index; |
} |
else |
/* Second or later nonexact match found. */ |
ambig = 1; |
} |
if (ambig && !exact) |
{ |
if (opterr) |
fprintf (stderr, _("%s: option `%s' is ambiguous\n"), |
argv[0], argv[optind]); |
nextchar += strlen (nextchar); |
optind++; |
optopt = 0; |
return '?'; |
} |
if (pfound != NULL) |
{ |
option_index = indfound; |
optind++; |
if (*nameend) |
{ |
/* Don't test has_arg with >, because some C compilers don't |
allow it to be used on enums. */ |
if (pfound->has_arg) |
optarg = nameend + 1; |
else |
{ |
if (opterr) |
{ |
if (argv[optind - 1][1] == '-') |
/* --option */ |
fprintf (stderr, |
_("%s: option `--%s' doesn't allow an argument\n"), |
argv[0], pfound->name); |
else |
/* +option or -option */ |
fprintf (stderr, |
_("%s: option `%c%s' doesn't allow an argument\n"), |
argv[0], argv[optind - 1][0], pfound->name); |
nextchar += strlen (nextchar); |
optopt = pfound->val; |
return '?'; |
} |
} |
} |
else if (pfound->has_arg == 1) |
{ |
if (optind < argc) |
optarg = argv[optind++]; |
else |
{ |
if (opterr) |
fprintf (stderr, |
_("%s: option `%s' requires an argument\n"), |
argv[0], argv[optind - 1]); |
nextchar += strlen (nextchar); |
optopt = pfound->val; |
return optstring[0] == ':' ? ':' : '?'; |
} |
} |
nextchar += strlen (nextchar); |
if (longind != NULL) |
*longind = option_index; |
if (pfound->flag) |
{ |
*(pfound->flag) = pfound->val; |
return 0; |
} |
return pfound->val; |
} |
/* Can't find it as a long option. If this is not getopt_long_only, |
or the option starts with '--' or is not a valid short |
option, then it's an error. |
Otherwise interpret it as a short option. */ |
if (!long_only || argv[optind][1] == '-' |
|| my_index (optstring, *nextchar) == NULL) |
{ |
if (opterr) |
{ |
if (argv[optind][1] == '-') |
/* --option */ |
fprintf (stderr, _("%s: unrecognized option `--%s'\n"), |
argv[0], nextchar); |
else |
/* +option or -option */ |
fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), |
argv[0], argv[optind][0], nextchar); |
} |
nextchar = (char *) ""; |
optind++; |
optopt = 0; |
return '?'; |
} |
} |
/* Look at and handle the next short option-character. */ |
{ |
char c = *nextchar++; |
char *temp = my_index (optstring, c); |
/* Increment `optind' when we start to process its last character. */ |
if (*nextchar == '\0') |
++optind; |
if (temp == NULL || c == ':') |
{ |
if (opterr) |
{ |
if (posixly_correct) |
/* 1003.2 specifies the format of this message. */ |
fprintf (stderr, _("%s: illegal option -- %c\n"), |
argv[0], c); |
else |
fprintf (stderr, _("%s: invalid option -- %c\n"), |
argv[0], c); |
} |
optopt = c; |
return '?'; |
} |
/* Convenience. Treat POSIX -W foo same as long option --foo */ |
if (temp[0] == 'W' && temp[1] == ';') |
{ |
char *nameend; |
const struct option *p; |
const struct option *pfound = NULL; |
int exact = 0; |
int ambig = 0; |
int indfound = 0; |
int option_index; |
/* This is an option that requires an argument. */ |
if (*nextchar != '\0') |
{ |
optarg = nextchar; |
/* If we end this ARGV-element by taking the rest as an arg, |
we must advance to the next element now. */ |
optind++; |
} |
else if (optind == argc) |
{ |
if (opterr) |
{ |
/* 1003.2 specifies the format of this message. */ |
fprintf (stderr, _("%s: option requires an argument -- %c\n"), |
argv[0], c); |
} |
optopt = c; |
if (optstring[0] == ':') |
c = ':'; |
else |
c = '?'; |
return c; |
} |
else |
/* We already incremented `optind' once; |
increment it again when taking next ARGV-elt as argument. */ |
optarg = argv[optind++]; |
/* optarg is now the argument, see if it's in the |
table of longopts. */ |
for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++) |
/* Do nothing. */ ; |
/* Test all long options for either exact match |
or abbreviated matches. */ |
for (p = longopts, option_index = 0; p->name; p++, option_index++) |
if (!strncmp (p->name, nextchar, nameend - nextchar)) |
{ |
if ((unsigned int) (nameend - nextchar) == strlen (p->name)) |
{ |
/* Exact match found. */ |
pfound = p; |
indfound = option_index; |
exact = 1; |
break; |
} |
else if (pfound == NULL) |
{ |
/* First nonexact match found. */ |
pfound = p; |
indfound = option_index; |
} |
else |
/* Second or later nonexact match found. */ |
ambig = 1; |
} |
if (ambig && !exact) |
{ |
if (opterr) |
fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), |
argv[0], argv[optind]); |
nextchar += strlen (nextchar); |
optind++; |
return '?'; |
} |
if (pfound != NULL) |
{ |
option_index = indfound; |
if (*nameend) |
{ |
/* Don't test has_arg with >, because some C compilers don't |
allow it to be used on enums. */ |
if (pfound->has_arg) |
optarg = nameend + 1; |
else |
{ |
if (opterr) |
fprintf (stderr, _("\ |
%s: option `-W %s' doesn't allow an argument\n"), |
argv[0], pfound->name); |
nextchar += strlen (nextchar); |
return '?'; |
} |
} |
else if (pfound->has_arg == 1) |
{ |
if (optind < argc) |
optarg = argv[optind++]; |
else |
{ |
if (opterr) |
fprintf (stderr, |
_("%s: option `%s' requires an argument\n"), |
argv[0], argv[optind - 1]); |
nextchar += strlen (nextchar); |
return optstring[0] == ':' ? ':' : '?'; |
} |
} |
nextchar += strlen (nextchar); |
if (longind != NULL) |
*longind = option_index; |
if (pfound->flag) |
{ |
*(pfound->flag) = pfound->val; |
return 0; |
} |
return pfound->val; |
} |
nextchar = NULL; |
return 'W'; /* Let the application handle it. */ |
} |
if (temp[1] == ':') |
{ |
if (temp[2] == ':') |
{ |
/* This is an option that accepts an argument optionally. */ |
if (*nextchar != '\0') |
{ |
optarg = nextchar; |
optind++; |
} |
else |
optarg = NULL; |
nextchar = NULL; |
} |
else |
{ |
/* This is an option that requires an argument. */ |
if (*nextchar != '\0') |
{ |
optarg = nextchar; |
/* If we end this ARGV-element by taking the rest as an arg, |
we must advance to the next element now. */ |
optind++; |
} |
else if (optind == argc) |
{ |
if (opterr) |
{ |
/* 1003.2 specifies the format of this message. */ |
fprintf (stderr, |
_("%s: option requires an argument -- %c\n"), |
argv[0], c); |
} |
optopt = c; |
if (optstring[0] == ':') |
c = ':'; |
else |
c = '?'; |
} |
else |
/* We already incremented `optind' once; |
increment it again when taking next ARGV-elt as argument. */ |
optarg = argv[optind++]; |
nextchar = NULL; |
} |
} |
return c; |
} |
} |
int |
getopt (int argc, char *const *argv, const char *optstring) |
{ |
return _getopt_internal (argc, argv, optstring, |
(const struct option *) 0, |
(int *) 0, |
0); |
} |
#endif /* Not ELIDE_CODE. */ |
#ifdef TEST |
/* Compile with -DTEST to make an executable for use in testing |
the above definition of `getopt'. */ |
int |
main (int argc, char **argv) |
{ |
int c; |
int digit_optind = 0; |
while (1) |
{ |
int this_option_optind = optind ? optind : 1; |
c = getopt (argc, argv, "abc:d:0123456789"); |
if (c == -1) |
break; |
switch (c) |
{ |
case '0': |
case '1': |
case '2': |
case '3': |
case '4': |
case '5': |
case '6': |
case '7': |
case '8': |
case '9': |
if (digit_optind != 0 && digit_optind != this_option_optind) |
printf ("digits occur in two different argv-elements.\n"); |
digit_optind = this_option_optind; |
printf ("option %c\n", c); |
break; |
case 'a': |
printf ("option a\n"); |
break; |
case 'b': |
printf ("option b\n"); |
break; |
case 'c': |
printf ("option c with value `%s'\n", optarg); |
break; |
case '?': |
break; |
default: |
printf ("?? getopt returned character code 0%o ??\n", c); |
} |
} |
if (optind < argc) |
{ |
printf ("non-option ARGV-elements: "); |
while (optind < argc) |
printf ("%s ", argv[optind++]); |
printf ("\n"); |
} |
exit (0); |
} |
#endif /* TEST */ |
/contrib/toolchain/binutils/libiberty/getopt1.c |
---|
0,0 → 1,180 |
/* getopt_long and getopt_long_only entry points for GNU getopt. |
Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98,2005 |
Free Software Foundation, Inc. |
NOTE: This source is derived from an old version taken from the GNU C |
Library (glibc). |
This program is free software; you can redistribute it and/or modify it |
under the terms of the GNU General Public License as published by the |
Free Software Foundation; either version 2, or (at your option) any |
later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, |
USA. */ |
#ifdef HAVE_CONFIG_H |
#include <config.h> |
#endif |
#if !defined __STDC__ || !__STDC__ |
/* This is a separate conditional since some stdc systems |
reject `defined (const)'. */ |
#ifndef const |
#define const |
#endif |
#endif |
#include <stdio.h> |
#include "getopt.h" |
/* Comment out all this code if we are using the GNU C Library, and are not |
actually compiling the library itself. This code is part of the GNU C |
Library, but also included in many other GNU distributions. Compiling |
and linking in this code is a waste when using the GNU C library |
(especially if it is a shared library). Rather than having every GNU |
program understand `configure --with-gnu-libc' and omit the object files, |
it is simpler to just do this in the source for each such file. */ |
#define GETOPT_INTERFACE_VERSION 2 |
#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 |
#include <gnu-versions.h> |
#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION |
#define ELIDE_CODE |
#endif |
#endif |
#ifndef ELIDE_CODE |
/* This needs to come after some library #include |
to get __GNU_LIBRARY__ defined. */ |
#ifdef __GNU_LIBRARY__ |
#include <stdlib.h> |
#endif |
#ifndef NULL |
#define NULL 0 |
#endif |
int |
getopt_long (int argc, char *const *argv, const char *options, |
const struct option *long_options, int *opt_index) |
{ |
return _getopt_internal (argc, argv, options, long_options, opt_index, 0); |
} |
/* Like getopt_long, but '-' as well as '--' can indicate a long option. |
If an option that starts with '-' (not '--') doesn't match a long option, |
but does match a short option, it is parsed as a short option |
instead. */ |
int |
getopt_long_only (int argc, char *const *argv, const char *options, |
const struct option *long_options, int *opt_index) |
{ |
return _getopt_internal (argc, argv, options, long_options, opt_index, 1); |
} |
#endif /* Not ELIDE_CODE. */ |
#ifdef TEST |
#include <stdio.h> |
int |
main (int argc, char **argv) |
{ |
int c; |
int digit_optind = 0; |
while (1) |
{ |
int this_option_optind = optind ? optind : 1; |
int option_index = 0; |
static struct option long_options[] = |
{ |
{"add", 1, 0, 0}, |
{"append", 0, 0, 0}, |
{"delete", 1, 0, 0}, |
{"verbose", 0, 0, 0}, |
{"create", 0, 0, 0}, |
{"file", 1, 0, 0}, |
{0, 0, 0, 0} |
}; |
c = getopt_long (argc, argv, "abc:d:0123456789", |
long_options, &option_index); |
if (c == -1) |
break; |
switch (c) |
{ |
case 0: |
printf ("option %s", long_options[option_index].name); |
if (optarg) |
printf (" with arg %s", optarg); |
printf ("\n"); |
break; |
case '0': |
case '1': |
case '2': |
case '3': |
case '4': |
case '5': |
case '6': |
case '7': |
case '8': |
case '9': |
if (digit_optind != 0 && digit_optind != this_option_optind) |
printf ("digits occur in two different argv-elements.\n"); |
digit_optind = this_option_optind; |
printf ("option %c\n", c); |
break; |
case 'a': |
printf ("option a\n"); |
break; |
case 'b': |
printf ("option b\n"); |
break; |
case 'c': |
printf ("option c with value `%s'\n", optarg); |
break; |
case 'd': |
printf ("option d with value `%s'\n", optarg); |
break; |
case '?': |
break; |
default: |
printf ("?? getopt returned character code 0%o ??\n", c); |
} |
} |
if (optind < argc) |
{ |
printf ("non-option ARGV-elements: "); |
while (optind < argc) |
printf ("%s ", argv[optind++]); |
printf ("\n"); |
} |
exit (0); |
} |
#endif /* TEST */ |
/contrib/toolchain/binutils/libiberty/getpwd.c |
---|
0,0 → 1,128 |
/* getpwd.c - get the working directory */ |
/* |
@deftypefn Supplemental char* getpwd (void) |
Returns the current working directory. This implementation caches the |
result on the assumption that the process will not call @code{chdir} |
between calls to @code{getpwd}. |
@end deftypefn |
*/ |
#ifdef HAVE_CONFIG_H |
#include "config.h" |
#endif |
#include <sys/types.h> |
#include <errno.h> |
#ifndef errno |
extern int errno; |
#endif |
#ifdef HAVE_STDLIB_H |
#include <stdlib.h> |
#endif |
#ifdef HAVE_UNISTD_H |
#include <unistd.h> |
#endif |
#ifdef HAVE_SYS_PARAM_H |
#include <sys/param.h> |
#endif |
#if HAVE_SYS_STAT_H |
#include <sys/stat.h> |
#endif |
#if HAVE_LIMITS_H |
#include <limits.h> |
#endif |
#include "libiberty.h" |
/* Virtually every UN*X system now in common use (except for pre-4.3-tahoe |
BSD systems) now provides getcwd as called for by POSIX. Allow for |
the few exceptions to the general rule here. */ |
#if !defined(HAVE_GETCWD) && defined(HAVE_GETWD) |
/* Prototype in case the system headers doesn't provide it. */ |
extern char *getwd (); |
#define getcwd(buf,len) getwd(buf) |
#endif |
#ifdef MAXPATHLEN |
#define GUESSPATHLEN (MAXPATHLEN + 1) |
#else |
#define GUESSPATHLEN 100 |
#endif |
#if !(defined (VMS) || (defined(_WIN32) && !defined(__CYGWIN__))) |
/* Get the working directory. Use the PWD environment variable if it's |
set correctly, since this is faster and gives more uniform answers |
to the user. Yield the working directory if successful; otherwise, |
yield 0 and set errno. */ |
char * |
getpwd (void) |
{ |
static char *pwd; |
static int failure_errno; |
char *p = pwd; |
size_t s; |
struct stat dotstat, pwdstat; |
if (!p && !(errno = failure_errno)) |
{ |
if (! ((p = getenv ("PWD")) != 0 |
&& *p == '/' |
&& stat (p, &pwdstat) == 0 |
&& stat (".", &dotstat) == 0 |
&& dotstat.st_ino == pwdstat.st_ino |
&& dotstat.st_dev == pwdstat.st_dev)) |
/* The shortcut didn't work. Try the slow, ``sure'' way. */ |
for (s = GUESSPATHLEN; !getcwd (p = XNEWVEC (char, s), s); s *= 2) |
{ |
int e = errno; |
free (p); |
#ifdef ERANGE |
if (e != ERANGE) |
#endif |
{ |
errno = failure_errno = e; |
p = 0; |
break; |
} |
} |
/* Cache the result. This assumes that the program does |
not invoke chdir between calls to getpwd. */ |
pwd = p; |
} |
return p; |
} |
#else /* VMS || _WIN32 && !__CYGWIN__ */ |
#ifndef MAXPATHLEN |
#define MAXPATHLEN 255 |
#endif |
char * |
getpwd (void) |
{ |
static char *pwd = 0; |
if (!pwd) |
pwd = getcwd (XNEWVEC (char, MAXPATHLEN + 1), MAXPATHLEN + 1 |
#ifdef VMS |
, 0 |
#endif |
); |
return pwd; |
} |
#endif /* VMS || _WIN32 && !__CYGWIN__ */ |
/contrib/toolchain/binutils/libiberty/getruntime.c |
---|
0,0 → 1,116 |
/* Return time used so far, in microseconds. |
Copyright (C) 1994, 1999, 2002 Free Software Foundation, Inc. |
This file is part of the libiberty library. |
Libiberty is free software; you can redistribute it and/or |
modify it under the terms of the GNU Library General Public |
License as published by the Free Software Foundation; either |
version 2 of the License, or (at your option) any later version. |
Libiberty is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
Library General Public License for more details. |
You should have received a copy of the GNU Library General Public |
License along with libiberty; see the file COPYING.LIB. If |
not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
#include "config.h" |
#include "ansidecl.h" |
#include "libiberty.h" |
/* On some systems (such as WindISS), you must include <sys/types.h> |
to get the definition of "time_t" before you include <time.h>. */ |
#include <sys/types.h> |
/* There are several ways to get elapsed execution time; unfortunately no |
single way is available for all host systems, nor are there reliable |
ways to find out which way is correct for a given host. */ |
#ifdef TIME_WITH_SYS_TIME |
# include <sys/time.h> |
# include <time.h> |
#else |
# if HAVE_SYS_TIME_H |
# include <sys/time.h> |
# else |
# ifdef HAVE_TIME_H |
# include <time.h> |
# endif |
# endif |
#endif |
#if defined (HAVE_GETRUSAGE) && defined (HAVE_SYS_RESOURCE_H) |
#include <sys/resource.h> |
#endif |
#ifdef HAVE_TIMES |
#ifdef HAVE_SYS_PARAM_H |
#include <sys/param.h> |
#endif |
#include <sys/times.h> |
#endif |
#ifdef HAVE_UNISTD_H |
#include <unistd.h> |
#endif |
/* This is a fallback; if wrong, it will likely make obviously wrong |
results. */ |
#ifndef CLOCKS_PER_SEC |
#define CLOCKS_PER_SEC 1 |
#endif |
#ifdef _SC_CLK_TCK |
#define GNU_HZ sysconf(_SC_CLK_TCK) |
#else |
#ifdef HZ |
#define GNU_HZ HZ |
#else |
#ifdef CLOCKS_PER_SEC |
#define GNU_HZ CLOCKS_PER_SEC |
#endif |
#endif |
#endif |
/* |
@deftypefn Replacement long get_run_time (void) |
Returns the time used so far, in microseconds. If possible, this is |
the time used by this process, else it is the elapsed time since the |
process started. |
@end deftypefn |
*/ |
long |
get_run_time (void) |
{ |
#if defined (HAVE_GETRUSAGE) && defined (HAVE_SYS_RESOURCE_H) |
struct rusage rusage; |
getrusage (0, &rusage); |
return (rusage.ru_utime.tv_sec * 1000000 + rusage.ru_utime.tv_usec |
+ rusage.ru_stime.tv_sec * 1000000 + rusage.ru_stime.tv_usec); |
#else /* ! HAVE_GETRUSAGE */ |
#ifdef HAVE_TIMES |
struct tms tms; |
times (&tms); |
return (tms.tms_utime + tms.tms_stime) * (1000000 / GNU_HZ); |
#else /* ! HAVE_TIMES */ |
/* Fall back on clock and hope it's correctly implemented. */ |
const long clocks_per_sec = CLOCKS_PER_SEC; |
if (clocks_per_sec <= 1000000) |
return clock () * (1000000 / clocks_per_sec); |
else |
return clock () / clocks_per_sec; |
#endif /* HAVE_TIMES */ |
#endif /* HAVE_GETRUSAGE */ |
} |
/contrib/toolchain/binutils/libiberty/hashtab.c |
---|
0,0 → 1,998 |
/* An expandable hash tables datatype. |
Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2009, 2010 |
Free Software Foundation, Inc. |
Contributed by Vladimir Makarov (vmakarov@cygnus.com). |
This file is part of the libiberty library. |
Libiberty is free software; you can redistribute it and/or |
modify it under the terms of the GNU Library General Public |
License as published by the Free Software Foundation; either |
version 2 of the License, or (at your option) any later version. |
Libiberty is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
Library General Public License for more details. |
You should have received a copy of the GNU Library General Public |
License along with libiberty; see the file COPYING.LIB. If |
not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
/* This package implements basic hash table functionality. It is possible |
to search for an entry, create an entry and destroy an entry. |
Elements in the table are generic pointers. |
The size of the table is not fixed; if the occupancy of the table |
grows too high the hash table will be expanded. |
The abstract data implementation is based on generalized Algorithm D |
from Knuth's book "The art of computer programming". Hash table is |
expanded by creation of new hash table and transferring elements from |
the old table to the new table. */ |
#ifdef HAVE_CONFIG_H |
#include "config.h" |
#endif |
#include <sys/types.h> |
#ifdef HAVE_STDLIB_H |
#include <stdlib.h> |
#endif |
#ifdef HAVE_STRING_H |
#include <string.h> |
#endif |
#ifdef HAVE_MALLOC_H |
#include <malloc.h> |
#endif |
#ifdef HAVE_LIMITS_H |
#include <limits.h> |
#endif |
#ifdef HAVE_INTTYPES_H |
#include <inttypes.h> |
#endif |
#ifdef HAVE_STDINT_H |
#include <stdint.h> |
#endif |
#include <stdio.h> |
#include "libiberty.h" |
#include "ansidecl.h" |
#include "hashtab.h" |
#ifndef CHAR_BIT |
#define CHAR_BIT 8 |
#endif |
static unsigned int higher_prime_index (unsigned long); |
static hashval_t htab_mod_1 (hashval_t, hashval_t, hashval_t, int); |
static hashval_t htab_mod (hashval_t, htab_t); |
static hashval_t htab_mod_m2 (hashval_t, htab_t); |
static hashval_t hash_pointer (const void *); |
static int eq_pointer (const void *, const void *); |
static int htab_expand (htab_t); |
static PTR *find_empty_slot_for_expand (htab_t, hashval_t); |
/* At some point, we could make these be NULL, and modify the |
hash-table routines to handle NULL specially; that would avoid |
function-call overhead for the common case of hashing pointers. */ |
htab_hash htab_hash_pointer = hash_pointer; |
htab_eq htab_eq_pointer = eq_pointer; |
/* Table of primes and multiplicative inverses. |
Note that these are not minimally reduced inverses. Unlike when generating |
code to divide by a constant, we want to be able to use the same algorithm |
all the time. All of these inverses (are implied to) have bit 32 set. |
For the record, here's the function that computed the table; it's a |
vastly simplified version of the function of the same name from gcc. */ |
#if 0 |
unsigned int |
ceil_log2 (unsigned int x) |
{ |
int i; |
for (i = 31; i >= 0 ; --i) |
if (x > (1u << i)) |
return i+1; |
abort (); |
} |
unsigned int |
choose_multiplier (unsigned int d, unsigned int *mlp, unsigned char *shiftp) |
{ |
unsigned long long mhigh; |
double nx; |
int lgup, post_shift; |
int pow, pow2; |
int n = 32, precision = 32; |
lgup = ceil_log2 (d); |
pow = n + lgup; |
pow2 = n + lgup - precision; |
nx = ldexp (1.0, pow) + ldexp (1.0, pow2); |
mhigh = nx / d; |
*shiftp = lgup - 1; |
*mlp = mhigh; |
return mhigh >> 32; |
} |
#endif |
struct prime_ent |
{ |
hashval_t prime; |
hashval_t inv; |
hashval_t inv_m2; /* inverse of prime-2 */ |
hashval_t shift; |
}; |
static struct prime_ent const prime_tab[] = { |
{ 7, 0x24924925, 0x9999999b, 2 }, |
{ 13, 0x3b13b13c, 0x745d1747, 3 }, |
{ 31, 0x08421085, 0x1a7b9612, 4 }, |
{ 61, 0x0c9714fc, 0x15b1e5f8, 5 }, |
{ 127, 0x02040811, 0x0624dd30, 6 }, |
{ 251, 0x05197f7e, 0x073260a5, 7 }, |
{ 509, 0x01824366, 0x02864fc8, 8 }, |
{ 1021, 0x00c0906d, 0x014191f7, 9 }, |
{ 2039, 0x0121456f, 0x0161e69e, 10 }, |
{ 4093, 0x00300902, 0x00501908, 11 }, |
{ 8191, 0x00080041, 0x00180241, 12 }, |
{ 16381, 0x000c0091, 0x00140191, 13 }, |
{ 32749, 0x002605a5, 0x002a06e6, 14 }, |
{ 65521, 0x000f00e2, 0x00110122, 15 }, |
{ 131071, 0x00008001, 0x00018003, 16 }, |
{ 262139, 0x00014002, 0x0001c004, 17 }, |
{ 524287, 0x00002001, 0x00006001, 18 }, |
{ 1048573, 0x00003001, 0x00005001, 19 }, |
{ 2097143, 0x00004801, 0x00005801, 20 }, |
{ 4194301, 0x00000c01, 0x00001401, 21 }, |
{ 8388593, 0x00001e01, 0x00002201, 22 }, |
{ 16777213, 0x00000301, 0x00000501, 23 }, |
{ 33554393, 0x00001381, 0x00001481, 24 }, |
{ 67108859, 0x00000141, 0x000001c1, 25 }, |
{ 134217689, 0x000004e1, 0x00000521, 26 }, |
{ 268435399, 0x00000391, 0x000003b1, 27 }, |
{ 536870909, 0x00000019, 0x00000029, 28 }, |
{ 1073741789, 0x0000008d, 0x00000095, 29 }, |
{ 2147483647, 0x00000003, 0x00000007, 30 }, |
/* Avoid "decimal constant so large it is unsigned" for 4294967291. */ |
{ 0xfffffffb, 0x00000006, 0x00000008, 31 } |
}; |
/* The following function returns an index into the above table of the |
nearest prime number which is greater than N, and near a power of two. */ |
static unsigned int |
higher_prime_index (unsigned long n) |
{ |
unsigned int low = 0; |
unsigned int high = sizeof(prime_tab) / sizeof(prime_tab[0]); |
while (low != high) |
{ |
unsigned int mid = low + (high - low) / 2; |
if (n > prime_tab[mid].prime) |
low = mid + 1; |
else |
high = mid; |
} |
/* If we've run out of primes, abort. */ |
if (n > prime_tab[low].prime) |
{ |
fprintf (stderr, "Cannot find prime bigger than %lu\n", n); |
abort (); |
} |
return low; |
} |
/* Returns non-zero if P1 and P2 are equal. */ |
static int |
eq_pointer (const PTR p1, const PTR p2) |
{ |
return p1 == p2; |
} |
/* The parens around the function names in the next two definitions |
are essential in order to prevent macro expansions of the name. |
The bodies, however, are expanded as expected, so they are not |
recursive definitions. */ |
/* Return the current size of given hash table. */ |
#define htab_size(htab) ((htab)->size) |
size_t |
(htab_size) (htab_t htab) |
{ |
return htab_size (htab); |
} |
/* Return the current number of elements in given hash table. */ |
#define htab_elements(htab) ((htab)->n_elements - (htab)->n_deleted) |
size_t |
(htab_elements) (htab_t htab) |
{ |
return htab_elements (htab); |
} |
/* Return X % Y. */ |
static inline hashval_t |
htab_mod_1 (hashval_t x, hashval_t y, hashval_t inv, int shift) |
{ |
/* The multiplicative inverses computed above are for 32-bit types, and |
requires that we be able to compute a highpart multiply. */ |
#ifdef UNSIGNED_64BIT_TYPE |
__extension__ typedef UNSIGNED_64BIT_TYPE ull; |
if (sizeof (hashval_t) * CHAR_BIT <= 32) |
{ |
hashval_t t1, t2, t3, t4, q, r; |
t1 = ((ull)x * inv) >> 32; |
t2 = x - t1; |
t3 = t2 >> 1; |
t4 = t1 + t3; |
q = t4 >> shift; |
r = x - (q * y); |
return r; |
} |
#endif |
/* Otherwise just use the native division routines. */ |
return x % y; |
} |
/* Compute the primary hash for HASH given HTAB's current size. */ |
static inline hashval_t |
htab_mod (hashval_t hash, htab_t htab) |
{ |
const struct prime_ent *p = &prime_tab[htab->size_prime_index]; |
return htab_mod_1 (hash, p->prime, p->inv, p->shift); |
} |
/* Compute the secondary hash for HASH given HTAB's current size. */ |
static inline hashval_t |
htab_mod_m2 (hashval_t hash, htab_t htab) |
{ |
const struct prime_ent *p = &prime_tab[htab->size_prime_index]; |
return 1 + htab_mod_1 (hash, p->prime - 2, p->inv_m2, p->shift); |
} |
/* This function creates table with length slightly longer than given |
source length. Created hash table is initiated as empty (all the |
hash table entries are HTAB_EMPTY_ENTRY). The function returns the |
created hash table, or NULL if memory allocation fails. */ |
htab_t |
htab_create_alloc (size_t size, htab_hash hash_f, htab_eq eq_f, |
htab_del del_f, htab_alloc alloc_f, htab_free free_f) |
{ |
return htab_create_typed_alloc (size, hash_f, eq_f, del_f, alloc_f, alloc_f, |
free_f); |
} |
/* As above, but uses the variants of ALLOC_F and FREE_F which accept |
an extra argument. */ |
htab_t |
htab_create_alloc_ex (size_t size, htab_hash hash_f, htab_eq eq_f, |
htab_del del_f, void *alloc_arg, |
htab_alloc_with_arg alloc_f, |
htab_free_with_arg free_f) |
{ |
htab_t result; |
unsigned int size_prime_index; |
size_prime_index = higher_prime_index (size); |
size = prime_tab[size_prime_index].prime; |
result = (htab_t) (*alloc_f) (alloc_arg, 1, sizeof (struct htab)); |
if (result == NULL) |
return NULL; |
result->entries = (PTR *) (*alloc_f) (alloc_arg, size, sizeof (PTR)); |
if (result->entries == NULL) |
{ |
if (free_f != NULL) |
(*free_f) (alloc_arg, result); |
return NULL; |
} |
result->size = size; |
result->size_prime_index = size_prime_index; |
result->hash_f = hash_f; |
result->eq_f = eq_f; |
result->del_f = del_f; |
result->alloc_arg = alloc_arg; |
result->alloc_with_arg_f = alloc_f; |
result->free_with_arg_f = free_f; |
return result; |
} |
/* |
@deftypefn Supplemental htab_t htab_create_typed_alloc (size_t @var{size}, @ |
htab_hash @var{hash_f}, htab_eq @var{eq_f}, htab_del @var{del_f}, @ |
htab_alloc @var{alloc_tab_f}, htab_alloc @var{alloc_f}, @ |
htab_free @var{free_f}) |
This function creates a hash table that uses two different allocators |
@var{alloc_tab_f} and @var{alloc_f} to use for allocating the table itself |
and its entries respectively. This is useful when variables of different |
types need to be allocated with different allocators. |
The created hash table is slightly larger than @var{size} and it is |
initially empty (all the hash table entries are @code{HTAB_EMPTY_ENTRY}). |
The function returns the created hash table, or @code{NULL} if memory |
allocation fails. |
@end deftypefn |
*/ |
htab_t |
htab_create_typed_alloc (size_t size, htab_hash hash_f, htab_eq eq_f, |
htab_del del_f, htab_alloc alloc_tab_f, |
htab_alloc alloc_f, htab_free free_f) |
{ |
htab_t result; |
unsigned int size_prime_index; |
size_prime_index = higher_prime_index (size); |
size = prime_tab[size_prime_index].prime; |
result = (htab_t) (*alloc_tab_f) (1, sizeof (struct htab)); |
if (result == NULL) |
return NULL; |
result->entries = (PTR *) (*alloc_f) (size, sizeof (PTR)); |
if (result->entries == NULL) |
{ |
if (free_f != NULL) |
(*free_f) (result); |
return NULL; |
} |
result->size = size; |
result->size_prime_index = size_prime_index; |
result->hash_f = hash_f; |
result->eq_f = eq_f; |
result->del_f = del_f; |
result->alloc_f = alloc_f; |
result->free_f = free_f; |
return result; |
} |
/* Update the function pointers and allocation parameter in the htab_t. */ |
void |
htab_set_functions_ex (htab_t htab, htab_hash hash_f, htab_eq eq_f, |
htab_del del_f, PTR alloc_arg, |
htab_alloc_with_arg alloc_f, htab_free_with_arg free_f) |
{ |
htab->hash_f = hash_f; |
htab->eq_f = eq_f; |
htab->del_f = del_f; |
htab->alloc_arg = alloc_arg; |
htab->alloc_with_arg_f = alloc_f; |
htab->free_with_arg_f = free_f; |
} |
/* These functions exist solely for backward compatibility. */ |
#undef htab_create |
htab_t |
htab_create (size_t size, htab_hash hash_f, htab_eq eq_f, htab_del del_f) |
{ |
return htab_create_alloc (size, hash_f, eq_f, del_f, xcalloc, free); |
} |
htab_t |
htab_try_create (size_t size, htab_hash hash_f, htab_eq eq_f, htab_del del_f) |
{ |
return htab_create_alloc (size, hash_f, eq_f, del_f, calloc, free); |
} |
/* This function frees all memory allocated for given hash table. |
Naturally the hash table must already exist. */ |
void |
htab_delete (htab_t htab) |
{ |
size_t size = htab_size (htab); |
PTR *entries = htab->entries; |
int i; |
if (htab->del_f) |
for (i = size - 1; i >= 0; i--) |
if (entries[i] != HTAB_EMPTY_ENTRY && entries[i] != HTAB_DELETED_ENTRY) |
(*htab->del_f) (entries[i]); |
if (htab->free_f != NULL) |
{ |
(*htab->free_f) (entries); |
(*htab->free_f) (htab); |
} |
else if (htab->free_with_arg_f != NULL) |
{ |
(*htab->free_with_arg_f) (htab->alloc_arg, entries); |
(*htab->free_with_arg_f) (htab->alloc_arg, htab); |
} |
} |
/* This function clears all entries in the given hash table. */ |
void |
htab_empty (htab_t htab) |
{ |
size_t size = htab_size (htab); |
PTR *entries = htab->entries; |
int i; |
if (htab->del_f) |
for (i = size - 1; i >= 0; i--) |
if (entries[i] != HTAB_EMPTY_ENTRY && entries[i] != HTAB_DELETED_ENTRY) |
(*htab->del_f) (entries[i]); |
/* Instead of clearing megabyte, downsize the table. */ |
if (size > 1024*1024 / sizeof (PTR)) |
{ |
int nindex = higher_prime_index (1024 / sizeof (PTR)); |
int nsize = prime_tab[nindex].prime; |
if (htab->free_f != NULL) |
(*htab->free_f) (htab->entries); |
else if (htab->free_with_arg_f != NULL) |
(*htab->free_with_arg_f) (htab->alloc_arg, htab->entries); |
if (htab->alloc_with_arg_f != NULL) |
htab->entries = (PTR *) (*htab->alloc_with_arg_f) (htab->alloc_arg, nsize, |
sizeof (PTR *)); |
else |
htab->entries = (PTR *) (*htab->alloc_f) (nsize, sizeof (PTR *)); |
htab->size = nsize; |
htab->size_prime_index = nindex; |
} |
else |
memset (entries, 0, size * sizeof (PTR)); |
htab->n_deleted = 0; |
htab->n_elements = 0; |
} |
/* Similar to htab_find_slot, but without several unwanted side effects: |
- Does not call htab->eq_f when it finds an existing entry. |
- Does not change the count of elements/searches/collisions in the |
hash table. |
This function also assumes there are no deleted entries in the table. |
HASH is the hash value for the element to be inserted. */ |
static PTR * |
find_empty_slot_for_expand (htab_t htab, hashval_t hash) |
{ |
hashval_t index = htab_mod (hash, htab); |
size_t size = htab_size (htab); |
PTR *slot = htab->entries + index; |
hashval_t hash2; |
if (*slot == HTAB_EMPTY_ENTRY) |
return slot; |
else if (*slot == HTAB_DELETED_ENTRY) |
abort (); |
hash2 = htab_mod_m2 (hash, htab); |
for (;;) |
{ |
index += hash2; |
if (index >= size) |
index -= size; |
slot = htab->entries + index; |
if (*slot == HTAB_EMPTY_ENTRY) |
return slot; |
else if (*slot == HTAB_DELETED_ENTRY) |
abort (); |
} |
} |
/* The following function changes size of memory allocated for the |
entries and repeatedly inserts the table elements. The occupancy |
of the table after the call will be about 50%. Naturally the hash |
table must already exist. Remember also that the place of the |
table entries is changed. If memory allocation failures are allowed, |
this function will return zero, indicating that the table could not be |
expanded. If all goes well, it will return a non-zero value. */ |
static int |
htab_expand (htab_t htab) |
{ |
PTR *oentries; |
PTR *olimit; |
PTR *p; |
PTR *nentries; |
size_t nsize, osize, elts; |
unsigned int oindex, nindex; |
oentries = htab->entries; |
oindex = htab->size_prime_index; |
osize = htab->size; |
olimit = oentries + osize; |
elts = htab_elements (htab); |
/* Resize only when table after removal of unused elements is either |
too full or too empty. */ |
if (elts * 2 > osize || (elts * 8 < osize && osize > 32)) |
{ |
nindex = higher_prime_index (elts * 2); |
nsize = prime_tab[nindex].prime; |
} |
else |
{ |
nindex = oindex; |
nsize = osize; |
} |
if (htab->alloc_with_arg_f != NULL) |
nentries = (PTR *) (*htab->alloc_with_arg_f) (htab->alloc_arg, nsize, |
sizeof (PTR *)); |
else |
nentries = (PTR *) (*htab->alloc_f) (nsize, sizeof (PTR *)); |
if (nentries == NULL) |
return 0; |
htab->entries = nentries; |
htab->size = nsize; |
htab->size_prime_index = nindex; |
htab->n_elements -= htab->n_deleted; |
htab->n_deleted = 0; |
p = oentries; |
do |
{ |
PTR x = *p; |
if (x != HTAB_EMPTY_ENTRY && x != HTAB_DELETED_ENTRY) |
{ |
PTR *q = find_empty_slot_for_expand (htab, (*htab->hash_f) (x)); |
*q = x; |
} |
p++; |
} |
while (p < olimit); |
if (htab->free_f != NULL) |
(*htab->free_f) (oentries); |
else if (htab->free_with_arg_f != NULL) |
(*htab->free_with_arg_f) (htab->alloc_arg, oentries); |
return 1; |
} |
/* This function searches for a hash table entry equal to the given |
element. It cannot be used to insert or delete an element. */ |
PTR |
htab_find_with_hash (htab_t htab, const PTR element, hashval_t hash) |
{ |
hashval_t index, hash2; |
size_t size; |
PTR entry; |
htab->searches++; |
size = htab_size (htab); |
index = htab_mod (hash, htab); |
entry = htab->entries[index]; |
if (entry == HTAB_EMPTY_ENTRY |
|| (entry != HTAB_DELETED_ENTRY && (*htab->eq_f) (entry, element))) |
return entry; |
hash2 = htab_mod_m2 (hash, htab); |
for (;;) |
{ |
htab->collisions++; |
index += hash2; |
if (index >= size) |
index -= size; |
entry = htab->entries[index]; |
if (entry == HTAB_EMPTY_ENTRY |
|| (entry != HTAB_DELETED_ENTRY && (*htab->eq_f) (entry, element))) |
return entry; |
} |
} |
/* Like htab_find_slot_with_hash, but compute the hash value from the |
element. */ |
PTR |
htab_find (htab_t htab, const PTR element) |
{ |
return htab_find_with_hash (htab, element, (*htab->hash_f) (element)); |
} |
/* This function searches for a hash table slot containing an entry |
equal to the given element. To delete an entry, call this with |
insert=NO_INSERT, then call htab_clear_slot on the slot returned |
(possibly after doing some checks). To insert an entry, call this |
with insert=INSERT, then write the value you want into the returned |
slot. When inserting an entry, NULL may be returned if memory |
allocation fails. */ |
PTR * |
htab_find_slot_with_hash (htab_t htab, const PTR element, |
hashval_t hash, enum insert_option insert) |
{ |
PTR *first_deleted_slot; |
hashval_t index, hash2; |
size_t size; |
PTR entry; |
size = htab_size (htab); |
if (insert == INSERT && size * 3 <= htab->n_elements * 4) |
{ |
if (htab_expand (htab) == 0) |
return NULL; |
size = htab_size (htab); |
} |
index = htab_mod (hash, htab); |
htab->searches++; |
first_deleted_slot = NULL; |
entry = htab->entries[index]; |
if (entry == HTAB_EMPTY_ENTRY) |
goto empty_entry; |
else if (entry == HTAB_DELETED_ENTRY) |
first_deleted_slot = &htab->entries[index]; |
else if ((*htab->eq_f) (entry, element)) |
return &htab->entries[index]; |
hash2 = htab_mod_m2 (hash, htab); |
for (;;) |
{ |
htab->collisions++; |
index += hash2; |
if (index >= size) |
index -= size; |
entry = htab->entries[index]; |
if (entry == HTAB_EMPTY_ENTRY) |
goto empty_entry; |
else if (entry == HTAB_DELETED_ENTRY) |
{ |
if (!first_deleted_slot) |
first_deleted_slot = &htab->entries[index]; |
} |
else if ((*htab->eq_f) (entry, element)) |
return &htab->entries[index]; |
} |
empty_entry: |
if (insert == NO_INSERT) |
return NULL; |
if (first_deleted_slot) |
{ |
htab->n_deleted--; |
*first_deleted_slot = HTAB_EMPTY_ENTRY; |
return first_deleted_slot; |
} |
htab->n_elements++; |
return &htab->entries[index]; |
} |
/* Like htab_find_slot_with_hash, but compute the hash value from the |
element. */ |
PTR * |
htab_find_slot (htab_t htab, const PTR element, enum insert_option insert) |
{ |
return htab_find_slot_with_hash (htab, element, (*htab->hash_f) (element), |
insert); |
} |
/* This function deletes an element with the given value from hash |
table (the hash is computed from the element). If there is no matching |
element in the hash table, this function does nothing. */ |
void |
htab_remove_elt (htab_t htab, PTR element) |
{ |
htab_remove_elt_with_hash (htab, element, (*htab->hash_f) (element)); |
} |
/* This function deletes an element with the given value from hash |
table. If there is no matching element in the hash table, this |
function does nothing. */ |
void |
htab_remove_elt_with_hash (htab_t htab, PTR element, hashval_t hash) |
{ |
PTR *slot; |
slot = htab_find_slot_with_hash (htab, element, hash, NO_INSERT); |
if (*slot == HTAB_EMPTY_ENTRY) |
return; |
if (htab->del_f) |
(*htab->del_f) (*slot); |
*slot = HTAB_DELETED_ENTRY; |
htab->n_deleted++; |
} |
/* This function clears a specified slot in a hash table. It is |
useful when you've already done the lookup and don't want to do it |
again. */ |
void |
htab_clear_slot (htab_t htab, PTR *slot) |
{ |
if (slot < htab->entries || slot >= htab->entries + htab_size (htab) |
|| *slot == HTAB_EMPTY_ENTRY || *slot == HTAB_DELETED_ENTRY) |
abort (); |
if (htab->del_f) |
(*htab->del_f) (*slot); |
*slot = HTAB_DELETED_ENTRY; |
htab->n_deleted++; |
} |
/* This function scans over the entire hash table calling |
CALLBACK for each live entry. If CALLBACK returns false, |
the iteration stops. INFO is passed as CALLBACK's second |
argument. */ |
void |
htab_traverse_noresize (htab_t htab, htab_trav callback, PTR info) |
{ |
PTR *slot; |
PTR *limit; |
slot = htab->entries; |
limit = slot + htab_size (htab); |
do |
{ |
PTR x = *slot; |
if (x != HTAB_EMPTY_ENTRY && x != HTAB_DELETED_ENTRY) |
if (!(*callback) (slot, info)) |
break; |
} |
while (++slot < limit); |
} |
/* Like htab_traverse_noresize, but does resize the table when it is |
too empty to improve effectivity of subsequent calls. */ |
void |
htab_traverse (htab_t htab, htab_trav callback, PTR info) |
{ |
size_t size = htab_size (htab); |
if (htab_elements (htab) * 8 < size && size > 32) |
htab_expand (htab); |
htab_traverse_noresize (htab, callback, info); |
} |
/* Return the fraction of fixed collisions during all work with given |
hash table. */ |
double |
htab_collisions (htab_t htab) |
{ |
if (htab->searches == 0) |
return 0.0; |
return (double) htab->collisions / (double) htab->searches; |
} |
/* Hash P as a null-terminated string. |
Copied from gcc/hashtable.c. Zack had the following to say with respect |
to applicability, though note that unlike hashtable.c, this hash table |
implementation re-hashes rather than chain buckets. |
http://gcc.gnu.org/ml/gcc-patches/2001-08/msg01021.html |
From: Zack Weinberg <zackw@panix.com> |
Date: Fri, 17 Aug 2001 02:15:56 -0400 |
I got it by extracting all the identifiers from all the source code |
I had lying around in mid-1999, and testing many recurrences of |
the form "H_n = H_{n-1} * K + c_n * L + M" where K, L, M were either |
prime numbers or the appropriate identity. This was the best one. |
I don't remember exactly what constituted "best", except I was |
looking at bucket-length distributions mostly. |
So it should be very good at hashing identifiers, but might not be |
as good at arbitrary strings. |
I'll add that it thoroughly trounces the hash functions recommended |
for this use at http://burtleburtle.net/bob/hash/index.html, both |
on speed and bucket distribution. I haven't tried it against the |
function they just started using for Perl's hashes. */ |
hashval_t |
htab_hash_string (const PTR p) |
{ |
const unsigned char *str = (const unsigned char *) p; |
hashval_t r = 0; |
unsigned char c; |
while ((c = *str++) != 0) |
r = r * 67 + c - 113; |
return r; |
} |
/* DERIVED FROM: |
-------------------------------------------------------------------- |
lookup2.c, by Bob Jenkins, December 1996, Public Domain. |
hash(), hash2(), hash3, and mix() are externally useful functions. |
Routines to test the hash are included if SELF_TEST is defined. |
You can use this free for any purpose. It has no warranty. |
-------------------------------------------------------------------- |
*/ |
/* |
-------------------------------------------------------------------- |
mix -- mix 3 32-bit values reversibly. |
For every delta with one or two bit set, and the deltas of all three |
high bits or all three low bits, whether the original value of a,b,c |
is almost all zero or is uniformly distributed, |
* If mix() is run forward or backward, at least 32 bits in a,b,c |
have at least 1/4 probability of changing. |
* If mix() is run forward, every bit of c will change between 1/3 and |
2/3 of the time. (Well, 22/100 and 78/100 for some 2-bit deltas.) |
mix() was built out of 36 single-cycle latency instructions in a |
structure that could supported 2x parallelism, like so: |
a -= b; |
a -= c; x = (c>>13); |
b -= c; a ^= x; |
b -= a; x = (a<<8); |
c -= a; b ^= x; |
c -= b; x = (b>>13); |
... |
Unfortunately, superscalar Pentiums and Sparcs can't take advantage |
of that parallelism. They've also turned some of those single-cycle |
latency instructions into multi-cycle latency instructions. Still, |
this is the fastest good hash I could find. There were about 2^^68 |
to choose from. I only looked at a billion or so. |
-------------------------------------------------------------------- |
*/ |
/* same, but slower, works on systems that might have 8 byte hashval_t's */ |
#define mix(a,b,c) \ |
{ \ |
a -= b; a -= c; a ^= (c>>13); \ |
b -= c; b -= a; b ^= (a<< 8); \ |
c -= a; c -= b; c ^= ((b&0xffffffff)>>13); \ |
a -= b; a -= c; a ^= ((c&0xffffffff)>>12); \ |
b -= c; b -= a; b = (b ^ (a<<16)) & 0xffffffff; \ |
c -= a; c -= b; c = (c ^ (b>> 5)) & 0xffffffff; \ |
a -= b; a -= c; a = (a ^ (c>> 3)) & 0xffffffff; \ |
b -= c; b -= a; b = (b ^ (a<<10)) & 0xffffffff; \ |
c -= a; c -= b; c = (c ^ (b>>15)) & 0xffffffff; \ |
} |
/* |
-------------------------------------------------------------------- |
hash() -- hash a variable-length key into a 32-bit value |
k : the key (the unaligned variable-length array of bytes) |
len : the length of the key, counting by bytes |
level : can be any 4-byte value |
Returns a 32-bit value. Every bit of the key affects every bit of |
the return value. Every 1-bit and 2-bit delta achieves avalanche. |
About 36+6len instructions. |
The best hash table sizes are powers of 2. There is no need to do |
mod a prime (mod is sooo slow!). If you need less than 32 bits, |
use a bitmask. For example, if you need only 10 bits, do |
h = (h & hashmask(10)); |
In which case, the hash table should have hashsize(10) elements. |
If you are hashing n strings (ub1 **)k, do it like this: |
for (i=0, h=0; i<n; ++i) h = hash( k[i], len[i], h); |
By Bob Jenkins, 1996. bob_jenkins@burtleburtle.net. You may use this |
code any way you wish, private, educational, or commercial. It's free. |
See http://burtleburtle.net/bob/hash/evahash.html |
Use for hash table lookup, or anything where one collision in 2^32 is |
acceptable. Do NOT use for cryptographic purposes. |
-------------------------------------------------------------------- |
*/ |
hashval_t |
iterative_hash (const PTR k_in /* the key */, |
register size_t length /* the length of the key */, |
register hashval_t initval /* the previous hash, or |
an arbitrary value */) |
{ |
register const unsigned char *k = (const unsigned char *)k_in; |
register hashval_t a,b,c,len; |
/* Set up the internal state */ |
len = length; |
a = b = 0x9e3779b9; /* the golden ratio; an arbitrary value */ |
c = initval; /* the previous hash value */ |
/*---------------------------------------- handle most of the key */ |
#ifndef WORDS_BIGENDIAN |
/* On a little-endian machine, if the data is 4-byte aligned we can hash |
by word for better speed. This gives nondeterministic results on |
big-endian machines. */ |
if (sizeof (hashval_t) == 4 && (((size_t)k)&3) == 0) |
while (len >= 12) /* aligned */ |
{ |
a += *(hashval_t *)(k+0); |
b += *(hashval_t *)(k+4); |
c += *(hashval_t *)(k+8); |
mix(a,b,c); |
k += 12; len -= 12; |
} |
else /* unaligned */ |
#endif |
while (len >= 12) |
{ |
a += (k[0] +((hashval_t)k[1]<<8) +((hashval_t)k[2]<<16) +((hashval_t)k[3]<<24)); |
b += (k[4] +((hashval_t)k[5]<<8) +((hashval_t)k[6]<<16) +((hashval_t)k[7]<<24)); |
c += (k[8] +((hashval_t)k[9]<<8) +((hashval_t)k[10]<<16)+((hashval_t)k[11]<<24)); |
mix(a,b,c); |
k += 12; len -= 12; |
} |
/*------------------------------------- handle the last 11 bytes */ |
c += length; |
switch(len) /* all the case statements fall through */ |
{ |
case 11: c+=((hashval_t)k[10]<<24); |
case 10: c+=((hashval_t)k[9]<<16); |
case 9 : c+=((hashval_t)k[8]<<8); |
/* the first byte of c is reserved for the length */ |
case 8 : b+=((hashval_t)k[7]<<24); |
case 7 : b+=((hashval_t)k[6]<<16); |
case 6 : b+=((hashval_t)k[5]<<8); |
case 5 : b+=k[4]; |
case 4 : a+=((hashval_t)k[3]<<24); |
case 3 : a+=((hashval_t)k[2]<<16); |
case 2 : a+=((hashval_t)k[1]<<8); |
case 1 : a+=k[0]; |
/* case 0: nothing left to add */ |
} |
mix(a,b,c); |
/*-------------------------------------------- report the result */ |
return c; |
} |
/* Returns a hash code for pointer P. Simplified version of evahash */ |
static hashval_t |
hash_pointer (const PTR p) |
{ |
intptr_t v = (intptr_t) p; |
unsigned a, b, c; |
a = b = 0x9e3779b9; |
a += v >> (sizeof (intptr_t) * CHAR_BIT / 2); |
b += v & (((intptr_t) 1 << (sizeof (intptr_t) * CHAR_BIT / 2)) - 1); |
c = 0x42135234; |
mix (a, b, c); |
return c; |
} |
/contrib/toolchain/binutils/libiberty/hex.c |
---|
0,0 → 1,192 |
/* Hex character manipulation support. |
Copyright (C) 1995, 2001 Free Software Foundation, Inc. |
This file is part of the libiberty library. |
Libiberty is free software; you can redistribute it and/or |
modify it under the terms of the GNU Library General Public |
License as published by the Free Software Foundation; either |
version 2 of the License, or (at your option) any later version. |
Libiberty is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
Library General Public License for more details. |
You should have received a copy of the GNU Library General Public |
License along with libiberty; see the file COPYING.LIB. If |
not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
#include <stdio.h> /* for EOF */ |
#ifdef HAVE_CONFIG_H |
#include "config.h" |
#endif |
#include "libiberty.h" |
#include "safe-ctype.h" /* for HOST_CHARSET_ASCII */ |
#if EOF != -1 |
#error "hex.c requires EOF == -1" |
#endif |
/* |
@deftypefn Extension void hex_init (void) |
Initializes the array mapping the current character set to |
corresponding hex values. This function must be called before any |
call to @code{hex_p} or @code{hex_value}. If you fail to call it, a |
default ASCII-based table will normally be used on ASCII systems. |
@end deftypefn |
@deftypefn Extension int hex_p (int @var{c}) |
Evaluates to non-zero if the given character is a valid hex character, |
or zero if it is not. Note that the value you pass will be cast to |
@code{unsigned char} within the macro. |
@end deftypefn |
@deftypefn Extension {unsigned int} hex_value (int @var{c}) |
Returns the numeric equivalent of the given character when interpreted |
as a hexadecimal digit. The result is undefined if you pass an |
invalid hex digit. Note that the value you pass will be cast to |
@code{unsigned char} within the macro. |
The @code{hex_value} macro returns @code{unsigned int}, rather than |
signed @code{int}, to make it easier to use in parsing addresses from |
hex dump files: a signed @code{int} would be sign-extended when |
converted to a wider unsigned type --- like @code{bfd_vma}, on some |
systems. |
@end deftypefn |
@undocumented _hex_array_size |
@undocumented _hex_bad |
@undocumented _hex_value |
*/ |
/* Are we ASCII? */ |
#if HOST_CHARSET == HOST_CHARSET_ASCII |
const unsigned char _hex_value[_hex_array_size] = |
{ |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, /* NUL SOH STX ETX */ |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, /* EOT ENQ ACK BEL */ |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, /* BS HT LF VT */ |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, /* FF CR SO SI */ |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, /* DLE DC1 DC2 DC3 */ |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, /* DC4 NAK SYN ETB */ |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, /* CAN EM SUB ESC */ |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, /* FS GS RS US */ |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, /* SP ! " # */ |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, /* $ % & ' */ |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, /* ( ) * + */ |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, /* , - . / */ |
0, 1, 2, 3, /* 0 1 2 3 */ |
4, 5, 6, 7, /* 4 5 6 7 */ |
8, 9, _hex_bad, _hex_bad, /* 8 9 : ; */ |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, /* < = > ? */ |
_hex_bad, 10, 11, 12, /* @ A B C */ |
13, 14, 15, _hex_bad, /* D E F G */ |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, /* H I J K */ |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, /* L M N O */ |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, /* P Q R S */ |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, /* T U V W */ |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, /* X Y Z [ */ |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, /* \ ] ^ _ */ |
_hex_bad, 10, 11, 12, /* ` a b c */ |
13, 14, 15, _hex_bad, /* d e f g */ |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, /* h i j k */ |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, /* l m n o */ |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, /* p q r s */ |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, /* t u v w */ |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, /* x y z { */ |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, /* | } ~ DEL */ |
/* The high half of unsigned char, all values are _hex_bad. */ |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, |
_hex_bad, _hex_bad, _hex_bad, _hex_bad, |
}; |
#define HEX_TABLE_INITIALIZED |
#else |
unsigned char _hex_value[_hex_array_size]; |
#endif /* not ASCII */ |
void |
hex_init (void) |
{ |
#ifndef HEX_TABLE_INITIALIZED |
int i; |
for (i=0; i<_hex_array_size; i++) |
{ |
switch (i) |
{ |
case '0': _hex_value[i] = 0; break; |
case '1': _hex_value[i] = 1; break; |
case '2': _hex_value[i] = 2; break; |
case '3': _hex_value[i] = 3; break; |
case '4': _hex_value[i] = 4; break; |
case '5': _hex_value[i] = 5; break; |
case '6': _hex_value[i] = 6; break; |
case '7': _hex_value[i] = 7; break; |
case '8': _hex_value[i] = 8; break; |
case '9': _hex_value[i] = 9; break; |
case 'a': case 'A': _hex_value[i] = 10; break; |
case 'b': case 'B': _hex_value[i] = 11; break; |
case 'c': case 'C': _hex_value[i] = 12; break; |
case 'd': case 'D': _hex_value[i] = 13; break; |
case 'e': case 'E': _hex_value[i] = 14; break; |
case 'f': case 'F': _hex_value[i] = 15; break; |
default: |
_hex_value[i] = _hex_bad; |
break; |
} |
} |
#endif |
} |
/contrib/toolchain/binutils/libiberty/index.c |
---|
0,0 → 1,21 |
/* Stub implementation of (obsolete) index(). */ |
/* |
@deftypefn Supplemental char* index (char *@var{s}, int @var{c}) |
Returns a pointer to the first occurrence of the character @var{c} in |
the string @var{s}, or @code{NULL} if not found. The use of @code{index} is |
deprecated in new programs in favor of @code{strchr}. |
@end deftypefn |
*/ |
extern char * strchr(const char *, int); |
char * |
index (const char *s, int c) |
{ |
return strchr (s, c); |
} |
/contrib/toolchain/binutils/libiberty/insque.c |
---|
0,0 → 1,51 |
/* insque(3C) routines |
This file is in the public domain. */ |
/* |
@deftypefn Supplemental void insque (struct qelem *@var{elem}, @ |
struct qelem *@var{pred}) |
@deftypefnx Supplemental void remque (struct qelem *@var{elem}) |
Routines to manipulate queues built from doubly linked lists. The |
@code{insque} routine inserts @var{elem} in the queue immediately |
after @var{pred}. The @code{remque} routine removes @var{elem} from |
its containing queue. These routines expect to be passed pointers to |
structures which have as their first members a forward pointer and a |
back pointer, like this prototype (although no prototype is provided): |
@example |
struct qelem @{ |
struct qelem *q_forw; |
struct qelem *q_back; |
char q_data[]; |
@}; |
@end example |
@end deftypefn |
*/ |
struct qelem { |
struct qelem *q_forw; |
struct qelem *q_back; |
}; |
void |
insque (struct qelem *elem, struct qelem *pred) |
{ |
elem -> q_forw = pred -> q_forw; |
pred -> q_forw -> q_back = elem; |
elem -> q_back = pred; |
pred -> q_forw = elem; |
} |
void |
remque (struct qelem *elem) |
{ |
elem -> q_forw -> q_back = elem -> q_back; |
elem -> q_back -> q_forw = elem -> q_forw; |
} |
/contrib/toolchain/binutils/libiberty/lbasename.c |
---|
0,0 → 1,84 |
/* Libiberty basename. Like basename, but is not overridden by the |
system C library. |
Copyright (C) 2001, 2002, 2010 Free Software Foundation, Inc. |
This file is part of the libiberty library. |
Libiberty is free software; you can redistribute it and/or |
modify it under the terms of the GNU Library General Public |
License as published by the Free Software Foundation; either |
version 2 of the License, or (at your option) any later version. |
Libiberty is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
Library General Public License for more details. |
You should have received a copy of the GNU Library General Public |
License along with libiberty; see the file COPYING.LIB. If |
not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
/* |
@deftypefn Replacement {const char*} lbasename (const char *@var{name}) |
Given a pointer to a string containing a typical pathname |
(@samp{/usr/src/cmd/ls/ls.c} for example), returns a pointer to the |
last component of the pathname (@samp{ls.c} in this case). The |
returned pointer is guaranteed to lie within the original |
string. This latter fact is not true of many vendor C |
libraries, which return special strings or modify the passed |
strings for particular input. |
In particular, the empty string returns the same empty string, |
and a path ending in @code{/} returns the empty string after it. |
@end deftypefn |
*/ |
#ifdef HAVE_CONFIG_H |
#include "config.h" |
#endif |
#include "ansidecl.h" |
#include "libiberty.h" |
#include "safe-ctype.h" |
#include "filenames.h" |
const char * |
unix_lbasename (const char *name) |
{ |
const char *base; |
for (base = name; *name; name++) |
if (IS_UNIX_DIR_SEPARATOR (*name)) |
base = name + 1; |
return base; |
} |
const char * |
dos_lbasename (const char *name) |
{ |
const char *base; |
/* Skip over a possible disk name. */ |
if (ISALPHA (name[0]) && name[1] == ':') |
name += 2; |
for (base = name; *name; name++) |
if (IS_DOS_DIR_SEPARATOR (*name)) |
base = name + 1; |
return base; |
} |
const char * |
lbasename (const char *name) |
{ |
#if defined (HAVE_DOS_BASED_FILE_SYSTEM) |
return dos_lbasename (name); |
#else |
return unix_lbasename (name); |
#endif |
} |
/contrib/toolchain/binutils/libiberty/lrealpath.c |
---|
0,0 → 1,157 |
/* Libiberty realpath. Like realpath, but more consistent behavior. |
Based on gdb_realpath from GDB. |
Copyright 2003 Free Software Foundation, Inc. |
This file is part of the libiberty library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
/* |
@deftypefn Replacement {const char*} lrealpath (const char *@var{name}) |
Given a pointer to a string containing a pathname, returns a canonical |
version of the filename. Symlinks will be resolved, and ``.'' and ``..'' |
components will be simplified. The returned value will be allocated using |
@code{malloc}, or @code{NULL} will be returned on a memory allocation error. |
@end deftypefn |
*/ |
#include "config.h" |
#include "ansidecl.h" |
#include "libiberty.h" |
#ifdef HAVE_LIMITS_H |
#include <limits.h> |
#endif |
#ifdef HAVE_STDLIB_H |
#include <stdlib.h> |
#endif |
#ifdef HAVE_UNISTD_H |
#include <unistd.h> |
#endif |
#ifdef HAVE_STRING_H |
#include <string.h> |
#endif |
/* On GNU libc systems the declaration is only visible with _GNU_SOURCE. */ |
#if defined(HAVE_CANONICALIZE_FILE_NAME) \ |
&& defined(NEED_DECLARATION_CANONICALIZE_FILE_NAME) |
extern char *canonicalize_file_name (const char *); |
#endif |
#if defined(HAVE_REALPATH) |
# if defined (PATH_MAX) |
# define REALPATH_LIMIT PATH_MAX |
# else |
# if defined (MAXPATHLEN) |
# define REALPATH_LIMIT MAXPATHLEN |
# endif |
# endif |
#else |
/* cygwin has realpath, so it won't get here. */ |
# if defined (_WIN32) |
# define WIN32_LEAN_AND_MEAN |
# include <windows.h> /* for GetFullPathName */ |
# endif |
#endif |
char * |
lrealpath (const char *filename) |
{ |
/* Method 1: The system has a compile time upper bound on a filename |
path. Use that and realpath() to canonicalize the name. This is |
the most common case. Note that, if there isn't a compile time |
upper bound, you want to avoid realpath() at all costs. */ |
#if defined(REALPATH_LIMIT) |
{ |
char buf[REALPATH_LIMIT]; |
const char *rp = realpath (filename, buf); |
if (rp == NULL) |
rp = filename; |
return strdup (rp); |
} |
#endif /* REALPATH_LIMIT */ |
/* Method 2: The host system (i.e., GNU) has the function |
canonicalize_file_name() which malloc's a chunk of memory and |
returns that, use that. */ |
#if defined(HAVE_CANONICALIZE_FILE_NAME) |
{ |
char *rp = canonicalize_file_name (filename); |
if (rp == NULL) |
return strdup (filename); |
else |
return rp; |
} |
#endif |
/* Method 3: Now we're getting desperate! The system doesn't have a |
compile time buffer size and no alternative function. Query the |
OS, using pathconf(), for the buffer limit. Care is needed |
though, some systems do not limit PATH_MAX (return -1 for |
pathconf()) making it impossible to pass a correctly sized buffer |
to realpath() (it could always overflow). On those systems, we |
skip this. */ |
#if defined (HAVE_REALPATH) && defined (HAVE_UNISTD_H) |
{ |
/* Find out the max path size. */ |
long path_max = pathconf ("/", _PC_PATH_MAX); |
if (path_max > 0) |
{ |
/* PATH_MAX is bounded. */ |
char *buf, *rp, *ret; |
buf = (char *) malloc (path_max); |
if (buf == NULL) |
return NULL; |
rp = realpath (filename, buf); |
ret = strdup (rp ? rp : filename); |
free (buf); |
return ret; |
} |
} |
#endif |
/* The MS Windows method. If we don't have realpath, we assume we |
don't have symlinks and just canonicalize to a Windows absolute |
path. GetFullPath converts ../ and ./ in relative paths to |
absolute paths, filling in current drive if one is not given |
or using the current directory of a specified drive (eg, "E:foo"). |
It also converts all forward slashes to back slashes. */ |
#if defined (_WIN32) |
{ |
char buf[MAX_PATH]; |
char* basename; |
DWORD len = GetFullPathName (filename, MAX_PATH, buf, &basename); |
if (len == 0 || len > MAX_PATH - 1) |
return strdup (filename); |
else |
{ |
/* The file system is case-preserving but case-insensitive, |
Canonicalize to lowercase, using the codepage associated |
with the process locale. */ |
CharLowerBuff (buf, len); |
return strdup (buf); |
} |
} |
#endif |
/* This system is a lost cause, just duplicate the filename. */ |
return strdup (filename); |
} |
/contrib/toolchain/binutils/libiberty/make-relative-prefix.c |
---|
0,0 → 1,427 |
/* Relative (relocatable) prefix support. |
Copyright (C) 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, |
1999, 2000, 2001, 2002, 2006, 2012 Free Software Foundation, Inc. |
This file is part of libiberty. |
GCC is free software; you can redistribute it and/or modify it under |
the terms of the GNU General Public License as published by the Free |
Software Foundation; either version 2, or (at your option) any later |
version. |
GCC is distributed in the hope that it will be useful, but WITHOUT ANY |
WARRANTY; without even the implied warranty of MERCHANTABILITY or |
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
for more details. |
You should have received a copy of the GNU General Public License |
along with GCC; see the file COPYING. If not, write to the Free |
Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA |
02110-1301, USA. */ |
/* |
@deftypefn Extension {const char*} make_relative_prefix (const char *@var{progname}, @ |
const char *@var{bin_prefix}, const char *@var{prefix}) |
Given three paths @var{progname}, @var{bin_prefix}, @var{prefix}, |
return the path that is in the same position relative to |
@var{progname}'s directory as @var{prefix} is relative to |
@var{bin_prefix}. That is, a string starting with the directory |
portion of @var{progname}, followed by a relative pathname of the |
difference between @var{bin_prefix} and @var{prefix}. |
If @var{progname} does not contain any directory separators, |
@code{make_relative_prefix} will search @env{PATH} to find a program |
named @var{progname}. Also, if @var{progname} is a symbolic link, |
the symbolic link will be resolved. |
For example, if @var{bin_prefix} is @code{/alpha/beta/gamma/gcc/delta}, |
@var{prefix} is @code{/alpha/beta/gamma/omega/}, and @var{progname} is |
@code{/red/green/blue/gcc}, then this function will return |
@code{/red/green/blue/../../omega/}. |
The return value is normally allocated via @code{malloc}. If no |
relative prefix can be found, return @code{NULL}. |
@end deftypefn |
*/ |
#ifdef HAVE_CONFIG_H |
#include "config.h" |
#endif |
#ifdef HAVE_STDLIB_H |
#include <stdlib.h> |
#endif |
#ifdef HAVE_UNISTD_H |
#include <unistd.h> |
#endif |
#ifdef HAVE_SYS_STAT_H |
#include <sys/stat.h> |
#endif |
#include <string.h> |
#include "ansidecl.h" |
#include "libiberty.h" |
#ifndef R_OK |
#define R_OK 4 |
#define W_OK 2 |
#define X_OK 1 |
#endif |
#ifndef DIR_SEPARATOR |
# define DIR_SEPARATOR '/' |
#endif |
#if defined (_WIN32) || defined (__MSDOS__) \ |
|| defined (__DJGPP__) || defined (__OS2__) |
# define HAVE_DOS_BASED_FILE_SYSTEM |
# define HAVE_HOST_EXECUTABLE_SUFFIX |
# define HOST_EXECUTABLE_SUFFIX ".exe" |
# ifndef DIR_SEPARATOR_2 |
# define DIR_SEPARATOR_2 '\\' |
# endif |
# define PATH_SEPARATOR ';' |
#else |
# define PATH_SEPARATOR ':' |
#endif |
#ifndef DIR_SEPARATOR_2 |
# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) |
#else |
# define IS_DIR_SEPARATOR(ch) \ |
(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) |
#endif |
#define DIR_UP ".." |
static char *save_string (const char *, int); |
static char **split_directories (const char *, int *); |
static void free_split_directories (char **); |
static char * |
save_string (const char *s, int len) |
{ |
char *result = (char *) malloc (len + 1); |
memcpy (result, s, len); |
result[len] = 0; |
return result; |
} |
/* Split a filename into component directories. */ |
static char ** |
split_directories (const char *name, int *ptr_num_dirs) |
{ |
int num_dirs = 0; |
char **dirs; |
const char *p, *q; |
int ch; |
/* Count the number of directories. Special case MSDOS disk names as part |
of the initial directory. */ |
p = name; |
#ifdef HAVE_DOS_BASED_FILE_SYSTEM |
if (name[1] == ':' && IS_DIR_SEPARATOR (name[2])) |
{ |
p += 3; |
num_dirs++; |
} |
#endif /* HAVE_DOS_BASED_FILE_SYSTEM */ |
while ((ch = *p++) != '\0') |
{ |
if (IS_DIR_SEPARATOR (ch)) |
{ |
num_dirs++; |
while (IS_DIR_SEPARATOR (*p)) |
p++; |
} |
} |
dirs = (char **) malloc (sizeof (char *) * (num_dirs + 2)); |
if (dirs == NULL) |
return NULL; |
/* Now copy the directory parts. */ |
num_dirs = 0; |
p = name; |
#ifdef HAVE_DOS_BASED_FILE_SYSTEM |
if (name[1] == ':' && IS_DIR_SEPARATOR (name[2])) |
{ |
dirs[num_dirs++] = save_string (p, 3); |
if (dirs[num_dirs - 1] == NULL) |
{ |
free (dirs); |
return NULL; |
} |
p += 3; |
} |
#endif /* HAVE_DOS_BASED_FILE_SYSTEM */ |
q = p; |
while ((ch = *p++) != '\0') |
{ |
if (IS_DIR_SEPARATOR (ch)) |
{ |
while (IS_DIR_SEPARATOR (*p)) |
p++; |
dirs[num_dirs++] = save_string (q, p - q); |
if (dirs[num_dirs - 1] == NULL) |
{ |
dirs[num_dirs] = NULL; |
free_split_directories (dirs); |
return NULL; |
} |
q = p; |
} |
} |
if (p - 1 - q > 0) |
dirs[num_dirs++] = save_string (q, p - 1 - q); |
dirs[num_dirs] = NULL; |
if (dirs[num_dirs - 1] == NULL) |
{ |
free_split_directories (dirs); |
return NULL; |
} |
if (ptr_num_dirs) |
*ptr_num_dirs = num_dirs; |
return dirs; |
} |
/* Release storage held by split directories. */ |
static void |
free_split_directories (char **dirs) |
{ |
int i = 0; |
if (dirs != NULL) |
{ |
while (dirs[i] != NULL) |
free (dirs[i++]); |
free ((char *) dirs); |
} |
} |
/* Given three strings PROGNAME, BIN_PREFIX, PREFIX, return a string that gets |
to PREFIX starting with the directory portion of PROGNAME and a relative |
pathname of the difference between BIN_PREFIX and PREFIX. |
For example, if BIN_PREFIX is /alpha/beta/gamma/gcc/delta, PREFIX is |
/alpha/beta/gamma/omega/, and PROGNAME is /red/green/blue/gcc, then this |
function will return /red/green/blue/../../omega/. |
If no relative prefix can be found, return NULL. */ |
static char * |
make_relative_prefix_1 (const char *progname, const char *bin_prefix, |
const char *prefix, const int resolve_links) |
{ |
char **prog_dirs = NULL, **bin_dirs = NULL, **prefix_dirs = NULL; |
int prog_num, bin_num, prefix_num; |
int i, n, common; |
int needed_len; |
char *ret = NULL, *ptr, *full_progname; |
if (progname == NULL || bin_prefix == NULL || prefix == NULL) |
return NULL; |
/* If there is no full pathname, try to find the program by checking in each |
of the directories specified in the PATH environment variable. */ |
if (lbasename (progname) == progname) |
{ |
char *temp; |
temp = getenv ("PATH"); |
if (temp) |
{ |
char *startp, *endp, *nstore; |
size_t prefixlen = strlen (temp) + 1; |
size_t len; |
if (prefixlen < 2) |
prefixlen = 2; |
len = prefixlen + strlen (progname) + 1; |
#ifdef HAVE_HOST_EXECUTABLE_SUFFIX |
len += strlen (HOST_EXECUTABLE_SUFFIX); |
#endif |
nstore = (char *) alloca (len); |
startp = endp = temp; |
while (1) |
{ |
if (*endp == PATH_SEPARATOR || *endp == 0) |
{ |
if (endp == startp) |
{ |
nstore[0] = '.'; |
nstore[1] = DIR_SEPARATOR; |
nstore[2] = '\0'; |
} |
else |
{ |
memcpy (nstore, startp, endp - startp); |
if (! IS_DIR_SEPARATOR (endp[-1])) |
{ |
nstore[endp - startp] = DIR_SEPARATOR; |
nstore[endp - startp + 1] = 0; |
} |
else |
nstore[endp - startp] = 0; |
} |
strcat (nstore, progname); |
if (! access (nstore, X_OK) |
#ifdef HAVE_HOST_EXECUTABLE_SUFFIX |
|| ! access (strcat (nstore, HOST_EXECUTABLE_SUFFIX), X_OK) |
#endif |
) |
{ |
#if defined (HAVE_SYS_STAT_H) && defined (S_ISREG) |
struct stat st; |
if (stat (nstore, &st) >= 0 && S_ISREG (st.st_mode)) |
#endif |
{ |
progname = nstore; |
break; |
} |
} |
if (*endp == 0) |
break; |
endp = startp = endp + 1; |
} |
else |
endp++; |
} |
} |
} |
if (resolve_links) |
full_progname = lrealpath (progname); |
else |
full_progname = strdup (progname); |
if (full_progname == NULL) |
return NULL; |
prog_dirs = split_directories (full_progname, &prog_num); |
free (full_progname); |
if (prog_dirs == NULL) |
return NULL; |
bin_dirs = split_directories (bin_prefix, &bin_num); |
if (bin_dirs == NULL) |
goto bailout; |
/* Remove the program name from comparison of directory names. */ |
prog_num--; |
/* If we are still installed in the standard location, we don't need to |
specify relative directories. Also, if argv[0] still doesn't contain |
any directory specifiers after the search above, then there is not much |
we can do. */ |
if (prog_num == bin_num) |
{ |
for (i = 0; i < bin_num; i++) |
{ |
if (strcmp (prog_dirs[i], bin_dirs[i]) != 0) |
break; |
} |
if (prog_num <= 0 || i == bin_num) |
goto bailout; |
} |
prefix_dirs = split_directories (prefix, &prefix_num); |
if (prefix_dirs == NULL) |
goto bailout; |
/* Find how many directories are in common between bin_prefix & prefix. */ |
n = (prefix_num < bin_num) ? prefix_num : bin_num; |
for (common = 0; common < n; common++) |
{ |
if (strcmp (bin_dirs[common], prefix_dirs[common]) != 0) |
break; |
} |
/* If there are no common directories, there can be no relative prefix. */ |
if (common == 0) |
goto bailout; |
/* Two passes: first figure out the size of the result string, and |
then construct it. */ |
needed_len = 0; |
for (i = 0; i < prog_num; i++) |
needed_len += strlen (prog_dirs[i]); |
needed_len += sizeof (DIR_UP) * (bin_num - common); |
for (i = common; i < prefix_num; i++) |
needed_len += strlen (prefix_dirs[i]); |
needed_len += 1; /* Trailing NUL. */ |
ret = (char *) malloc (needed_len); |
if (ret == NULL) |
goto bailout; |
/* Build up the pathnames in argv[0]. */ |
*ret = '\0'; |
for (i = 0; i < prog_num; i++) |
strcat (ret, prog_dirs[i]); |
/* Now build up the ..'s. */ |
ptr = ret + strlen(ret); |
for (i = common; i < bin_num; i++) |
{ |
strcpy (ptr, DIR_UP); |
ptr += sizeof (DIR_UP) - 1; |
*(ptr++) = DIR_SEPARATOR; |
} |
*ptr = '\0'; |
/* Put in directories to move over to prefix. */ |
for (i = common; i < prefix_num; i++) |
strcat (ret, prefix_dirs[i]); |
bailout: |
free_split_directories (prog_dirs); |
free_split_directories (bin_dirs); |
free_split_directories (prefix_dirs); |
return ret; |
} |
/* Do the full job, including symlink resolution. |
This path will find files installed in the same place as the |
program even when a soft link has been made to the program |
from somwhere else. */ |
char * |
make_relative_prefix (const char *progname, const char *bin_prefix, |
const char *prefix) |
{ |
return make_relative_prefix_1 (progname, bin_prefix, prefix, 1); |
} |
/* Make the relative pathname without attempting to resolve any links. |
'..' etc may also be left in the pathname. |
This will find the files the user meant the program to find if the |
installation is patched together with soft links. */ |
char * |
make_relative_prefix_ignore_links (const char *progname, |
const char *bin_prefix, |
const char *prefix) |
{ |
return make_relative_prefix_1 (progname, bin_prefix, prefix, 0); |
} |
/contrib/toolchain/binutils/libiberty/make-temp-file.c |
---|
0,0 → 1,217 |
/* Utility to pick a temporary filename prefix. |
Copyright (C) 1996, 1997, 1998, 2001, 2009, 2010 |
Free Software Foundation, Inc. |
This file is part of the libiberty library. |
Libiberty is free software; you can redistribute it and/or |
modify it under the terms of the GNU Library General Public |
License as published by the Free Software Foundation; either |
version 2 of the License, or (at your option) any later version. |
Libiberty is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
Library General Public License for more details. |
You should have received a copy of the GNU Library General Public |
License along with libiberty; see the file COPYING.LIB. If not, |
write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
#ifdef HAVE_CONFIG_H |
#include "config.h" |
#endif |
#include <stdio.h> /* May get P_tmpdir. */ |
#include <sys/types.h> |
#include <errno.h> |
#ifdef HAVE_UNISTD_H |
#include <unistd.h> |
#endif |
#ifdef HAVE_STDLIB_H |
#include <stdlib.h> |
#endif |
#ifdef HAVE_STRING_H |
#include <string.h> |
#endif |
#ifdef HAVE_SYS_FILE_H |
#include <sys/file.h> /* May get R_OK, etc. on some systems. */ |
#endif |
#if defined(_WIN32) && !defined(__CYGWIN__) |
#include <windows.h> |
#endif |
#ifndef R_OK |
#define R_OK 4 |
#define W_OK 2 |
#define X_OK 1 |
#endif |
#include "libiberty.h" |
extern int mkstemps (char *, int); |
/* '/' works just fine on MS-DOS based systems. */ |
#ifndef DIR_SEPARATOR |
#define DIR_SEPARATOR '/' |
#endif |
/* Name of temporary file. |
mktemp requires 6 trailing X's. */ |
#define TEMP_FILE "ccXXXXXX" |
#define TEMP_FILE_LEN (sizeof(TEMP_FILE) - 1) |
#if !defined(_WIN32) || defined(__CYGWIN__) |
/* Subroutine of choose_tmpdir. |
If BASE is non-NULL, return it. |
Otherwise it checks if DIR is a usable directory. |
If success, DIR is returned. |
Otherwise NULL is returned. */ |
static inline const char *try_dir (const char *, const char *); |
static inline const char * |
try_dir (const char *dir, const char *base) |
{ |
if (base != 0) |
return base; |
if (dir != 0 |
&& access (dir, R_OK | W_OK | X_OK) == 0) |
return dir; |
return 0; |
} |
static const char tmp[] = { DIR_SEPARATOR, 't', 'm', 'p', 0 }; |
static const char usrtmp[] = |
{ DIR_SEPARATOR, 'u', 's', 'r', DIR_SEPARATOR, 't', 'm', 'p', 0 }; |
static const char vartmp[] = |
{ DIR_SEPARATOR, 'v', 'a', 'r', DIR_SEPARATOR, 't', 'm', 'p', 0 }; |
#endif |
static char *memoized_tmpdir; |
/* |
@deftypefn Replacement char* choose_tmpdir () |
Returns a pointer to a directory path suitable for creating temporary |
files in. |
@end deftypefn |
*/ |
char * |
choose_tmpdir (void) |
{ |
if (!memoized_tmpdir) |
{ |
#if !defined(_WIN32) || defined(__CYGWIN__) |
const char *base = 0; |
char *tmpdir; |
unsigned int len; |
#ifdef VMS |
/* Try VMS standard temp logical. */ |
base = try_dir ("/sys$scratch", base); |
#else |
base = try_dir (getenv ("TMPDIR"), base); |
base = try_dir (getenv ("TMP"), base); |
base = try_dir (getenv ("TEMP"), base); |
#endif |
#ifdef P_tmpdir |
/* We really want a directory name here as if concatenated with say \dir |
we do not end up with a double \\ which defines an UNC path. */ |
if (strcmp (P_tmpdir, "\\") == 0) |
base = try_dir ("\\.", base); |
else |
base = try_dir (P_tmpdir, base); |
#endif |
/* Try /var/tmp, /usr/tmp, then /tmp. */ |
base = try_dir (vartmp, base); |
base = try_dir (usrtmp, base); |
base = try_dir (tmp, base); |
/* If all else fails, use the current directory! */ |
if (base == 0) |
base = "."; |
/* Append DIR_SEPARATOR to the directory we've chosen |
and return it. */ |
len = strlen (base); |
tmpdir = XNEWVEC (char, len + 2); |
strcpy (tmpdir, base); |
tmpdir[len] = DIR_SEPARATOR; |
tmpdir[len+1] = '\0'; |
memoized_tmpdir = tmpdir; |
#else /* defined(_WIN32) && !defined(__CYGWIN__) */ |
DWORD len; |
/* Figure out how much space we need. */ |
len = GetTempPath(0, NULL); |
if (len) |
{ |
memoized_tmpdir = XNEWVEC (char, len); |
if (!GetTempPath(len, memoized_tmpdir)) |
{ |
XDELETEVEC (memoized_tmpdir); |
memoized_tmpdir = NULL; |
} |
} |
if (!memoized_tmpdir) |
/* If all else fails, use the current directory. */ |
memoized_tmpdir = xstrdup (".\\"); |
#endif /* defined(_WIN32) && !defined(__CYGWIN__) */ |
} |
return memoized_tmpdir; |
} |
/* |
@deftypefn Replacement char* make_temp_file (const char *@var{suffix}) |
Return a temporary file name (as a string) or @code{NULL} if unable to |
create one. @var{suffix} is a suffix to append to the file name. The |
string is @code{malloc}ed, and the temporary file has been created. |
@end deftypefn |
*/ |
char * |
make_temp_file (const char *suffix) |
{ |
const char *base = choose_tmpdir (); |
char *temp_filename; |
int base_len, suffix_len; |
int fd; |
if (suffix == 0) |
suffix = ""; |
base_len = strlen (base); |
suffix_len = strlen (suffix); |
temp_filename = XNEWVEC (char, base_len |
+ TEMP_FILE_LEN |
+ suffix_len + 1); |
strcpy (temp_filename, base); |
strcpy (temp_filename + base_len, TEMP_FILE); |
strcpy (temp_filename + base_len + TEMP_FILE_LEN, suffix); |
fd = mkstemps (temp_filename, suffix_len); |
/* Mkstemps failed. It may be EPERM, ENOSPC etc. */ |
if (fd == -1) |
{ |
fprintf (stderr, "Cannot create temporary file in %s: %s\n", |
base, strerror (errno)); |
abort (); |
} |
/* We abort on failed close out of sheer paranoia. */ |
if (close (fd)) |
abort (); |
return temp_filename; |
} |
/contrib/toolchain/binutils/libiberty/md5.c |
---|
0,0 → 1,440 |
/* md5.c - Functions to compute MD5 message digest of files or memory blocks |
according to the definition of MD5 in RFC 1321 from April 1992. |
Copyright (C) 1995, 1996, 2011 Free Software Foundation, Inc. |
NOTE: This source is derived from an old version taken from the GNU C |
Library (glibc). |
This program is free software; you can redistribute it and/or modify it |
under the terms of the GNU General Public License as published by the |
Free Software Foundation; either version 2, or (at your option) any |
later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
/* Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. */ |
#ifdef HAVE_CONFIG_H |
# include <config.h> |
#endif |
#include <sys/types.h> |
#if STDC_HEADERS || defined _LIBC |
# include <stdlib.h> |
# include <string.h> |
#else |
# ifndef HAVE_MEMCPY |
# define memcpy(d, s, n) bcopy ((s), (d), (n)) |
# endif |
#endif |
#include "ansidecl.h" |
#include "md5.h" |
#ifdef _LIBC |
# include <endian.h> |
# if __BYTE_ORDER == __BIG_ENDIAN |
# define WORDS_BIGENDIAN 1 |
# endif |
#endif |
#ifdef WORDS_BIGENDIAN |
# define SWAP(n) \ |
(((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24)) |
#else |
# define SWAP(n) (n) |
#endif |
/* This array contains the bytes used to pad the buffer to the next |
64-byte boundary. (RFC 1321, 3.1: Step 1) */ |
static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ }; |
/* Initialize structure containing state of computation. |
(RFC 1321, 3.3: Step 3) */ |
void |
md5_init_ctx (struct md5_ctx *ctx) |
{ |
ctx->A = (md5_uint32) 0x67452301; |
ctx->B = (md5_uint32) 0xefcdab89; |
ctx->C = (md5_uint32) 0x98badcfe; |
ctx->D = (md5_uint32) 0x10325476; |
ctx->total[0] = ctx->total[1] = 0; |
ctx->buflen = 0; |
} |
/* Put result from CTX in first 16 bytes following RESBUF. The result |
must be in little endian byte order. |
IMPORTANT: RESBUF may not be aligned as strongly as MD5_UNIT32 so we |
put things in a local (aligned) buffer first, then memcpy into RESBUF. */ |
void * |
md5_read_ctx (const struct md5_ctx *ctx, void *resbuf) |
{ |
md5_uint32 buffer[4]; |
buffer[0] = SWAP (ctx->A); |
buffer[1] = SWAP (ctx->B); |
buffer[2] = SWAP (ctx->C); |
buffer[3] = SWAP (ctx->D); |
memcpy (resbuf, buffer, 16); |
return resbuf; |
} |
/* Process the remaining bytes in the internal buffer and the usual |
prolog according to the standard and write the result to RESBUF. |
IMPORTANT: On some systems it is required that RESBUF is correctly |
aligned for a 32 bits value. */ |
void * |
md5_finish_ctx (struct md5_ctx *ctx, void *resbuf) |
{ |
/* Take yet unprocessed bytes into account. */ |
md5_uint32 bytes = ctx->buflen; |
md5_uint32 swap_bytes; |
size_t pad; |
/* Now count remaining bytes. */ |
ctx->total[0] += bytes; |
if (ctx->total[0] < bytes) |
++ctx->total[1]; |
pad = bytes >= 56 ? 64 + 56 - bytes : 56 - bytes; |
memcpy (&ctx->buffer[bytes], fillbuf, pad); |
/* Put the 64-bit file length in *bits* at the end of the buffer. |
Use memcpy to avoid aliasing problems. On most systems, this |
will be optimized away to the same code. */ |
swap_bytes = SWAP (ctx->total[0] << 3); |
memcpy (&ctx->buffer[bytes + pad], &swap_bytes, sizeof (swap_bytes)); |
swap_bytes = SWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 29)); |
memcpy (&ctx->buffer[bytes + pad + 4], &swap_bytes, sizeof (swap_bytes)); |
/* Process last bytes. */ |
md5_process_block (ctx->buffer, bytes + pad + 8, ctx); |
return md5_read_ctx (ctx, resbuf); |
} |
/* Compute MD5 message digest for bytes read from STREAM. The |
resulting message digest number will be written into the 16 bytes |
beginning at RESBLOCK. */ |
int |
md5_stream (FILE *stream, void *resblock) |
{ |
/* Important: BLOCKSIZE must be a multiple of 64. */ |
#define BLOCKSIZE 4096 |
struct md5_ctx ctx; |
char buffer[BLOCKSIZE + 72]; |
size_t sum; |
/* Initialize the computation context. */ |
md5_init_ctx (&ctx); |
/* Iterate over full file contents. */ |
while (1) |
{ |
/* We read the file in blocks of BLOCKSIZE bytes. One call of the |
computation function processes the whole buffer so that with the |
next round of the loop another block can be read. */ |
size_t n; |
sum = 0; |
/* Read block. Take care for partial reads. */ |
do |
{ |
n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream); |
sum += n; |
} |
while (sum < BLOCKSIZE && n != 0); |
if (n == 0 && ferror (stream)) |
return 1; |
/* If end of file is reached, end the loop. */ |
if (n == 0) |
break; |
/* Process buffer with BLOCKSIZE bytes. Note that |
BLOCKSIZE % 64 == 0 |
*/ |
md5_process_block (buffer, BLOCKSIZE, &ctx); |
} |
/* Add the last bytes if necessary. */ |
if (sum > 0) |
md5_process_bytes (buffer, sum, &ctx); |
/* Construct result in desired memory. */ |
md5_finish_ctx (&ctx, resblock); |
return 0; |
} |
/* Compute MD5 message digest for LEN bytes beginning at BUFFER. The |
result is always in little endian byte order, so that a byte-wise |
output yields to the wanted ASCII representation of the message |
digest. */ |
void * |
md5_buffer (const char *buffer, size_t len, void *resblock) |
{ |
struct md5_ctx ctx; |
/* Initialize the computation context. */ |
md5_init_ctx (&ctx); |
/* Process whole buffer but last len % 64 bytes. */ |
md5_process_bytes (buffer, len, &ctx); |
/* Put result in desired memory area. */ |
return md5_finish_ctx (&ctx, resblock); |
} |
void |
md5_process_bytes (const void *buffer, size_t len, struct md5_ctx *ctx) |
{ |
/* When we already have some bits in our internal buffer concatenate |
both inputs first. */ |
if (ctx->buflen != 0) |
{ |
size_t left_over = ctx->buflen; |
size_t add = 128 - left_over > len ? len : 128 - left_over; |
memcpy (&ctx->buffer[left_over], buffer, add); |
ctx->buflen += add; |
if (left_over + add > 64) |
{ |
md5_process_block (ctx->buffer, (left_over + add) & ~63, ctx); |
/* The regions in the following copy operation cannot overlap. */ |
memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~63], |
(left_over + add) & 63); |
ctx->buflen = (left_over + add) & 63; |
} |
buffer = (const void *) ((const char *) buffer + add); |
len -= add; |
} |
/* Process available complete blocks. */ |
if (len > 64) |
{ |
#if !_STRING_ARCH_unaligned |
/* To check alignment gcc has an appropriate operator. Other |
compilers don't. */ |
# if __GNUC__ >= 2 |
# define UNALIGNED_P(p) (((md5_uintptr) p) % __alignof__ (md5_uint32) != 0) |
# else |
# define UNALIGNED_P(p) (((md5_uintptr) p) % sizeof (md5_uint32) != 0) |
# endif |
if (UNALIGNED_P (buffer)) |
while (len > 64) |
{ |
memcpy (ctx->buffer, buffer, 64); |
md5_process_block (ctx->buffer, 64, ctx); |
buffer = (const char *) buffer + 64; |
len -= 64; |
} |
else |
#endif |
{ |
md5_process_block (buffer, len & ~63, ctx); |
buffer = (const void *) ((const char *) buffer + (len & ~63)); |
len &= 63; |
} |
} |
/* Move remaining bytes in internal buffer. */ |
if (len > 0) |
{ |
memcpy (ctx->buffer, buffer, len); |
ctx->buflen = len; |
} |
} |
/* These are the four functions used in the four steps of the MD5 algorithm |
and defined in the RFC 1321. The first function is a little bit optimized |
(as found in Colin Plumbs public domain implementation). */ |
/* #define FF(b, c, d) ((b & c) | (~b & d)) */ |
#define FF(b, c, d) (d ^ (b & (c ^ d))) |
#define FG(b, c, d) FF (d, b, c) |
#define FH(b, c, d) (b ^ c ^ d) |
#define FI(b, c, d) (c ^ (b | ~d)) |
/* Process LEN bytes of BUFFER, accumulating context into CTX. |
It is assumed that LEN % 64 == 0. */ |
void |
md5_process_block (const void *buffer, size_t len, struct md5_ctx *ctx) |
{ |
md5_uint32 correct_words[16]; |
const md5_uint32 *words = (const md5_uint32 *) buffer; |
size_t nwords = len / sizeof (md5_uint32); |
const md5_uint32 *endp = words + nwords; |
md5_uint32 A = ctx->A; |
md5_uint32 B = ctx->B; |
md5_uint32 C = ctx->C; |
md5_uint32 D = ctx->D; |
/* First increment the byte count. RFC 1321 specifies the possible |
length of the file up to 2^64 bits. Here we only compute the |
number of bytes. Do a double word increment. */ |
ctx->total[0] += len; |
ctx->total[1] += ((len >> 31) >> 1) + (ctx->total[0] < len); |
/* Process all bytes in the buffer with 64 bytes in each round of |
the loop. */ |
while (words < endp) |
{ |
md5_uint32 *cwp = correct_words; |
md5_uint32 A_save = A; |
md5_uint32 B_save = B; |
md5_uint32 C_save = C; |
md5_uint32 D_save = D; |
/* First round: using the given function, the context and a constant |
the next context is computed. Because the algorithms processing |
unit is a 32-bit word and it is determined to work on words in |
little endian byte order we perhaps have to change the byte order |
before the computation. To reduce the work for the next steps |
we store the swapped words in the array CORRECT_WORDS. */ |
#define OP(a, b, c, d, s, T) \ |
do \ |
{ \ |
a += FF (b, c, d) + (*cwp++ = SWAP (*words)) + T; \ |
++words; \ |
CYCLIC (a, s); \ |
a += b; \ |
} \ |
while (0) |
/* It is unfortunate that C does not provide an operator for |
cyclic rotation. Hope the C compiler is smart enough. */ |
#define CYCLIC(w, s) (w = (w << s) | (w >> (32 - s))) |
/* Before we start, one word to the strange constants. |
They are defined in RFC 1321 as |
T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64 |
*/ |
/* Round 1. */ |
OP (A, B, C, D, 7, (md5_uint32) 0xd76aa478); |
OP (D, A, B, C, 12, (md5_uint32) 0xe8c7b756); |
OP (C, D, A, B, 17, (md5_uint32) 0x242070db); |
OP (B, C, D, A, 22, (md5_uint32) 0xc1bdceee); |
OP (A, B, C, D, 7, (md5_uint32) 0xf57c0faf); |
OP (D, A, B, C, 12, (md5_uint32) 0x4787c62a); |
OP (C, D, A, B, 17, (md5_uint32) 0xa8304613); |
OP (B, C, D, A, 22, (md5_uint32) 0xfd469501); |
OP (A, B, C, D, 7, (md5_uint32) 0x698098d8); |
OP (D, A, B, C, 12, (md5_uint32) 0x8b44f7af); |
OP (C, D, A, B, 17, (md5_uint32) 0xffff5bb1); |
OP (B, C, D, A, 22, (md5_uint32) 0x895cd7be); |
OP (A, B, C, D, 7, (md5_uint32) 0x6b901122); |
OP (D, A, B, C, 12, (md5_uint32) 0xfd987193); |
OP (C, D, A, B, 17, (md5_uint32) 0xa679438e); |
OP (B, C, D, A, 22, (md5_uint32) 0x49b40821); |
/* For the second to fourth round we have the possibly swapped words |
in CORRECT_WORDS. Redefine the macro to take an additional first |
argument specifying the function to use. */ |
#undef OP |
#define OP(a, b, c, d, k, s, T) \ |
do \ |
{ \ |
a += FX (b, c, d) + correct_words[k] + T; \ |
CYCLIC (a, s); \ |
a += b; \ |
} \ |
while (0) |
#define FX(b, c, d) FG (b, c, d) |
/* Round 2. */ |
OP (A, B, C, D, 1, 5, (md5_uint32) 0xf61e2562); |
OP (D, A, B, C, 6, 9, (md5_uint32) 0xc040b340); |
OP (C, D, A, B, 11, 14, (md5_uint32) 0x265e5a51); |
OP (B, C, D, A, 0, 20, (md5_uint32) 0xe9b6c7aa); |
OP (A, B, C, D, 5, 5, (md5_uint32) 0xd62f105d); |
OP (D, A, B, C, 10, 9, (md5_uint32) 0x02441453); |
OP (C, D, A, B, 15, 14, (md5_uint32) 0xd8a1e681); |
OP (B, C, D, A, 4, 20, (md5_uint32) 0xe7d3fbc8); |
OP (A, B, C, D, 9, 5, (md5_uint32) 0x21e1cde6); |
OP (D, A, B, C, 14, 9, (md5_uint32) 0xc33707d6); |
OP (C, D, A, B, 3, 14, (md5_uint32) 0xf4d50d87); |
OP (B, C, D, A, 8, 20, (md5_uint32) 0x455a14ed); |
OP (A, B, C, D, 13, 5, (md5_uint32) 0xa9e3e905); |
OP (D, A, B, C, 2, 9, (md5_uint32) 0xfcefa3f8); |
OP (C, D, A, B, 7, 14, (md5_uint32) 0x676f02d9); |
OP (B, C, D, A, 12, 20, (md5_uint32) 0x8d2a4c8a); |
#undef FX |
#define FX(b, c, d) FH (b, c, d) |
/* Round 3. */ |
OP (A, B, C, D, 5, 4, (md5_uint32) 0xfffa3942); |
OP (D, A, B, C, 8, 11, (md5_uint32) 0x8771f681); |
OP (C, D, A, B, 11, 16, (md5_uint32) 0x6d9d6122); |
OP (B, C, D, A, 14, 23, (md5_uint32) 0xfde5380c); |
OP (A, B, C, D, 1, 4, (md5_uint32) 0xa4beea44); |
OP (D, A, B, C, 4, 11, (md5_uint32) 0x4bdecfa9); |
OP (C, D, A, B, 7, 16, (md5_uint32) 0xf6bb4b60); |
OP (B, C, D, A, 10, 23, (md5_uint32) 0xbebfbc70); |
OP (A, B, C, D, 13, 4, (md5_uint32) 0x289b7ec6); |
OP (D, A, B, C, 0, 11, (md5_uint32) 0xeaa127fa); |
OP (C, D, A, B, 3, 16, (md5_uint32) 0xd4ef3085); |
OP (B, C, D, A, 6, 23, (md5_uint32) 0x04881d05); |
OP (A, B, C, D, 9, 4, (md5_uint32) 0xd9d4d039); |
OP (D, A, B, C, 12, 11, (md5_uint32) 0xe6db99e5); |
OP (C, D, A, B, 15, 16, (md5_uint32) 0x1fa27cf8); |
OP (B, C, D, A, 2, 23, (md5_uint32) 0xc4ac5665); |
#undef FX |
#define FX(b, c, d) FI (b, c, d) |
/* Round 4. */ |
OP (A, B, C, D, 0, 6, (md5_uint32) 0xf4292244); |
OP (D, A, B, C, 7, 10, (md5_uint32) 0x432aff97); |
OP (C, D, A, B, 14, 15, (md5_uint32) 0xab9423a7); |
OP (B, C, D, A, 5, 21, (md5_uint32) 0xfc93a039); |
OP (A, B, C, D, 12, 6, (md5_uint32) 0x655b59c3); |
OP (D, A, B, C, 3, 10, (md5_uint32) 0x8f0ccc92); |
OP (C, D, A, B, 10, 15, (md5_uint32) 0xffeff47d); |
OP (B, C, D, A, 1, 21, (md5_uint32) 0x85845dd1); |
OP (A, B, C, D, 8, 6, (md5_uint32) 0x6fa87e4f); |
OP (D, A, B, C, 15, 10, (md5_uint32) 0xfe2ce6e0); |
OP (C, D, A, B, 6, 15, (md5_uint32) 0xa3014314); |
OP (B, C, D, A, 13, 21, (md5_uint32) 0x4e0811a1); |
OP (A, B, C, D, 4, 6, (md5_uint32) 0xf7537e82); |
OP (D, A, B, C, 11, 10, (md5_uint32) 0xbd3af235); |
OP (C, D, A, B, 2, 15, (md5_uint32) 0x2ad7d2bb); |
OP (B, C, D, A, 9, 21, (md5_uint32) 0xeb86d391); |
/* Add the starting values of the context. */ |
A += A_save; |
B += B_save; |
C += C_save; |
D += D_save; |
} |
/* Put checksum in context given as argument. */ |
ctx->A = A; |
ctx->B = B; |
ctx->C = C; |
ctx->D = D; |
} |
/contrib/toolchain/binutils/libiberty/memmem.c |
---|
0,0 → 1,71 |
/* Copyright (C) 1991,92,93,94,96,97,98,2000,2004,2007,2011 Free Software Foundation, Inc. |
This file is part of the GNU C Library. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2, or (at your option) |
any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License along |
with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ |
/* |
@deftypefn Supplemental void* memmem (const void *@var{haystack}, @ |
size_t @var{haystack_len} const void *@var{needle}, size_t @var{needle_len}) |
Returns a pointer to the first occurrence of @var{needle} (length |
@var{needle_len}) in @var{haystack} (length @var{haystack_len}). |
Returns @code{NULL} if not found. |
@end deftypefn |
*/ |
#ifndef _LIBC |
# include <config.h> |
#endif |
#include <stddef.h> |
#include <string.h> |
#ifndef _LIBC |
# define __builtin_expect(expr, val) (expr) |
#endif |
#undef memmem |
/* Return the first occurrence of NEEDLE in HAYSTACK. */ |
void * |
memmem (const void *haystack, size_t haystack_len, const void *needle, |
size_t needle_len) |
{ |
const char *begin; |
const char *const last_possible |
= (const char *) haystack + haystack_len - needle_len; |
if (needle_len == 0) |
/* The first occurrence of the empty string is deemed to occur at |
the beginning of the string. */ |
return (void *) haystack; |
/* Sanity check, otherwise the loop might search through the whole |
memory. */ |
if (__builtin_expect (haystack_len < needle_len, 0)) |
return NULL; |
for (begin = (const char *) haystack; begin <= last_possible; ++begin) |
if (begin[0] == ((const char *) needle)[0] && |
!memcmp ((const void *) &begin[1], |
(const void *) ((const char *) needle + 1), |
needle_len - 1)) |
return (void *) begin; |
return NULL; |
} |
/contrib/toolchain/binutils/libiberty/mempcpy.c |
---|
0,0 → 1,42 |
/* Implement the mempcpy function. |
Copyright (C) 2003, 2004, 2005, 2011 Free Software Foundation, Inc. |
Written by Kaveh R. Ghazi <ghazi@caip.rutgers.edu>. |
This file is part of the libiberty library. |
Libiberty is free software; you can redistribute it and/or |
modify it under the terms of the GNU Library General Public |
License as published by the Free Software Foundation; either |
version 2 of the License, or (at your option) any later version. |
Libiberty is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
Library General Public License for more details. |
You should have received a copy of the GNU Library General Public |
License along with libiberty; see the file COPYING.LIB. If |
not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
/* |
@deftypefn Supplemental void* mempcpy (void *@var{out}, const void *@var{in}, @ |
size_t @var{length}) |
Copies @var{length} bytes from memory region @var{in} to region |
@var{out}. Returns a pointer to @var{out} + @var{length}. |
@end deftypefn |
*/ |
#include <ansidecl.h> |
#include <stddef.h> |
extern PTR memcpy (PTR, const PTR, size_t); |
PTR |
mempcpy (PTR dst, const PTR src, size_t len) |
{ |
return (char *) memcpy (dst, src, len) + len; |
} |
/contrib/toolchain/binutils/libiberty/mkstemps.c |
---|
0,0 → 1,147 |
/* Copyright (C) 1991, 1992, 1996, 1998, 2004 Free Software Foundation, Inc. |
This file is derived from mkstemp.c from the GNU C Library. |
The GNU C Library is free software; you can redistribute it and/or |
modify it under the terms of the GNU Library General Public License as |
published by the Free Software Foundation; either version 2 of the |
License, or (at your option) any later version. |
The GNU C Library is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
Library General Public License for more details. |
You should have received a copy of the GNU Library General Public |
License along with the GNU C Library; see the file COPYING.LIB. If not, |
write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
#ifdef HAVE_CONFIG_H |
#include "config.h" |
#endif |
#include <sys/types.h> |
#ifdef HAVE_STDLIB_H |
#include <stdlib.h> |
#endif |
#ifdef HAVE_STRING_H |
#include <string.h> |
#endif |
#include <errno.h> |
#include <stdio.h> |
#include <fcntl.h> |
#ifdef HAVE_UNISTD_H |
#include <unistd.h> |
#endif |
#ifdef HAVE_SYS_TIME_H |
#include <sys/time.h> |
#endif |
#include "ansidecl.h" |
/* We need to provide a type for gcc_uint64_t. */ |
#ifdef __GNUC__ |
__extension__ typedef unsigned long long gcc_uint64_t; |
#else |
typedef unsigned long gcc_uint64_t; |
#endif |
#ifndef TMP_MAX |
#define TMP_MAX 16384 |
#endif |
#ifndef O_BINARY |
# define O_BINARY 0 |
#endif |
/* |
@deftypefn Replacement int mkstemps (char *@var{pattern}, int @var{suffix_len}) |
Generate a unique temporary file name from @var{pattern}. |
@var{pattern} has the form: |
@example |
@var{path}/ccXXXXXX@var{suffix} |
@end example |
@var{suffix_len} tells us how long @var{suffix} is (it can be zero |
length). The last six characters of @var{pattern} before @var{suffix} |
must be @samp{XXXXXX}; they are replaced with a string that makes the |
filename unique. Returns a file descriptor open on the file for |
reading and writing. |
@end deftypefn |
*/ |
int |
mkstemps (char *pattern, int suffix_len) |
{ |
static const char letters[] |
= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; |
static gcc_uint64_t value; |
#ifdef HAVE_GETTIMEOFDAY |
struct timeval tv; |
#endif |
char *XXXXXX; |
size_t len; |
int count; |
len = strlen (pattern); |
if ((int) len < 6 + suffix_len |
|| strncmp (&pattern[len - 6 - suffix_len], "XXXXXX", 6)) |
{ |
return -1; |
} |
XXXXXX = &pattern[len - 6 - suffix_len]; |
#ifdef HAVE_GETTIMEOFDAY |
/* Get some more or less random data. */ |
gettimeofday (&tv, NULL); |
value += ((gcc_uint64_t) tv.tv_usec << 16) ^ tv.tv_sec ^ getpid (); |
#else |
value += getpid (); |
#endif |
for (count = 0; count < TMP_MAX; ++count) |
{ |
gcc_uint64_t v = value; |
int fd; |
/* Fill in the random bits. */ |
XXXXXX[0] = letters[v % 62]; |
v /= 62; |
XXXXXX[1] = letters[v % 62]; |
v /= 62; |
XXXXXX[2] = letters[v % 62]; |
v /= 62; |
XXXXXX[3] = letters[v % 62]; |
v /= 62; |
XXXXXX[4] = letters[v % 62]; |
v /= 62; |
XXXXXX[5] = letters[v % 62]; |
fd = open (pattern, O_BINARY|O_RDWR|O_CREAT|O_EXCL, 0600); |
if (fd >= 0) |
/* The file does not exist. */ |
return fd; |
if (errno != EEXIST |
#ifdef EISDIR |
&& errno != EISDIR |
#endif |
) |
/* Fatal error (EPERM, ENOSPC etc). Doesn't make sense to loop. */ |
break; |
/* This is a random value. It is only necessary that the next |
TMP_MAX values generated by adding 7777 to VALUE are different |
with (module 2^32). */ |
value += 7777; |
} |
/* We return the null string if we can't find a unique file name. */ |
pattern[0] = '\0'; |
return -1; |
} |
/contrib/toolchain/binutils/libiberty/objalloc.c |
---|
0,0 → 1,298 |
/* objalloc.c -- routines to allocate memory for objects |
Copyright 1997-2012 Free Software Foundation, Inc. |
Written by Ian Lance Taylor, Cygnus Solutions. |
This program is free software; you can redistribute it and/or modify it |
under the terms of the GNU General Public License as published by the |
Free Software Foundation; either version 2, or (at your option) any |
later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
#include "config.h" |
#include "ansidecl.h" |
#include "objalloc.h" |
/* Get a definition for NULL. */ |
#include <stdio.h> |
#if VMS |
#include <stdlib.h> |
#include <unixlib.h> |
#else |
/* Get a definition for size_t. */ |
#include <stddef.h> |
#ifdef HAVE_STDLIB_H |
#include <stdlib.h> |
#else |
/* For systems with larger pointers than ints, this must be declared. */ |
extern PTR malloc (size_t); |
extern void free (PTR); |
#endif |
#endif |
/* These routines allocate space for an object. Freeing allocated |
space may or may not free all more recently allocated space. |
We handle large and small allocation requests differently. If we |
don't have enough space in the current block, and the allocation |
request is for more than 512 bytes, we simply pass it through to |
malloc. */ |
/* The objalloc structure is defined in objalloc.h. */ |
/* This structure appears at the start of each chunk. */ |
struct objalloc_chunk |
{ |
/* Next chunk. */ |
struct objalloc_chunk *next; |
/* If this chunk contains large objects, this is the value of |
current_ptr when this chunk was allocated. If this chunk |
contains small objects, this is NULL. */ |
char *current_ptr; |
}; |
/* The aligned size of objalloc_chunk. */ |
#define CHUNK_HEADER_SIZE \ |
((sizeof (struct objalloc_chunk) + OBJALLOC_ALIGN - 1) \ |
&~ (OBJALLOC_ALIGN - 1)) |
/* We ask for this much memory each time we create a chunk which is to |
hold small objects. */ |
#define CHUNK_SIZE (4096 - 32) |
/* A request for this amount or more is just passed through to malloc. */ |
#define BIG_REQUEST (512) |
/* Create an objalloc structure. */ |
struct objalloc * |
objalloc_create (void) |
{ |
struct objalloc *ret; |
struct objalloc_chunk *chunk; |
ret = (struct objalloc *) malloc (sizeof *ret); |
if (ret == NULL) |
return NULL; |
ret->chunks = (PTR) malloc (CHUNK_SIZE); |
if (ret->chunks == NULL) |
{ |
free (ret); |
return NULL; |
} |
chunk = (struct objalloc_chunk *) ret->chunks; |
chunk->next = NULL; |
chunk->current_ptr = NULL; |
ret->current_ptr = (char *) chunk + CHUNK_HEADER_SIZE; |
ret->current_space = CHUNK_SIZE - CHUNK_HEADER_SIZE; |
return ret; |
} |
/* Allocate space from an objalloc structure. */ |
PTR |
_objalloc_alloc (struct objalloc *o, unsigned long original_len) |
{ |
unsigned long len = original_len; |
/* We avoid confusion from zero sized objects by always allocating |
at least 1 byte. */ |
if (len == 0) |
len = 1; |
len = (len + OBJALLOC_ALIGN - 1) &~ (OBJALLOC_ALIGN - 1); |
/* Check for overflow in the alignment operation above and the |
malloc argument below. */ |
if (len + CHUNK_HEADER_SIZE < original_len) |
return NULL; |
if (len <= o->current_space) |
{ |
o->current_ptr += len; |
o->current_space -= len; |
return (PTR) (o->current_ptr - len); |
} |
if (len >= BIG_REQUEST) |
{ |
char *ret; |
struct objalloc_chunk *chunk; |
ret = (char *) malloc (CHUNK_HEADER_SIZE + len); |
if (ret == NULL) |
return NULL; |
chunk = (struct objalloc_chunk *) ret; |
chunk->next = (struct objalloc_chunk *) o->chunks; |
chunk->current_ptr = o->current_ptr; |
o->chunks = (PTR) chunk; |
return (PTR) (ret + CHUNK_HEADER_SIZE); |
} |
else |
{ |
struct objalloc_chunk *chunk; |
chunk = (struct objalloc_chunk *) malloc (CHUNK_SIZE); |
if (chunk == NULL) |
return NULL; |
chunk->next = (struct objalloc_chunk *) o->chunks; |
chunk->current_ptr = NULL; |
o->current_ptr = (char *) chunk + CHUNK_HEADER_SIZE; |
o->current_space = CHUNK_SIZE - CHUNK_HEADER_SIZE; |
o->chunks = (PTR) chunk; |
return objalloc_alloc (o, len); |
} |
} |
/* Free an entire objalloc structure. */ |
void |
objalloc_free (struct objalloc *o) |
{ |
struct objalloc_chunk *l; |
l = (struct objalloc_chunk *) o->chunks; |
while (l != NULL) |
{ |
struct objalloc_chunk *next; |
next = l->next; |
free (l); |
l = next; |
} |
free (o); |
} |
/* Free a block from an objalloc structure. This also frees all more |
recently allocated blocks. */ |
void |
objalloc_free_block (struct objalloc *o, PTR block) |
{ |
struct objalloc_chunk *p, *small; |
char *b = (char *) block; |
/* First set P to the chunk which contains the block we are freeing, |
and set Q to the last small object chunk we see before P. */ |
small = NULL; |
for (p = (struct objalloc_chunk *) o->chunks; p != NULL; p = p->next) |
{ |
if (p->current_ptr == NULL) |
{ |
if (b > (char *) p && b < (char *) p + CHUNK_SIZE) |
break; |
small = p; |
} |
else |
{ |
if (b == (char *) p + CHUNK_HEADER_SIZE) |
break; |
} |
} |
/* If we can't find the chunk, the caller has made a mistake. */ |
if (p == NULL) |
abort (); |
if (p->current_ptr == NULL) |
{ |
struct objalloc_chunk *q; |
struct objalloc_chunk *first; |
/* The block is in a chunk containing small objects. We can |
free every chunk through SMALL, because they have certainly |
been allocated more recently. After SMALL, we will not see |
any chunks containing small objects; we can free any big |
chunk if the current_ptr is greater than or equal to B. We |
can then reset the new current_ptr to B. */ |
first = NULL; |
q = (struct objalloc_chunk *) o->chunks; |
while (q != p) |
{ |
struct objalloc_chunk *next; |
next = q->next; |
if (small != NULL) |
{ |
if (small == q) |
small = NULL; |
free (q); |
} |
else if (q->current_ptr > b) |
free (q); |
else if (first == NULL) |
first = q; |
q = next; |
} |
if (first == NULL) |
first = p; |
o->chunks = (PTR) first; |
/* Now start allocating from this small block again. */ |
o->current_ptr = b; |
o->current_space = ((char *) p + CHUNK_SIZE) - b; |
} |
else |
{ |
struct objalloc_chunk *q; |
char *current_ptr; |
/* This block is in a large chunk by itself. We can free |
everything on the list up to and including this block. We |
then start allocating from the next chunk containing small |
objects, setting current_ptr from the value stored with the |
large chunk we are freeing. */ |
current_ptr = p->current_ptr; |
p = p->next; |
q = (struct objalloc_chunk *) o->chunks; |
while (q != p) |
{ |
struct objalloc_chunk *next; |
next = q->next; |
free (q); |
q = next; |
} |
o->chunks = (PTR) p; |
while (p->current_ptr != NULL) |
p = p->next; |
o->current_ptr = current_ptr; |
o->current_space = ((char *) p + CHUNK_SIZE) - current_ptr; |
} |
} |
/contrib/toolchain/binutils/libiberty/obstack.c |
---|
0,0 → 1,510 |
/* obstack.c - subroutines used implicitly by object stack macros |
Copyright (C) 1988,89,90,91,92,93,94,96,97 Free Software Foundation, Inc. |
NOTE: This source is derived from an old version taken from the GNU C |
Library (glibc). |
This program is free software; you can redistribute it and/or modify it |
under the terms of the GNU General Public License as published by the |
Free Software Foundation; either version 2, or (at your option) any |
later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, |
USA. */ |
#ifdef HAVE_CONFIG_H |
#include <config.h> |
#endif |
#include "obstack.h" |
/* NOTE BEFORE MODIFYING THIS FILE: This version number must be |
incremented whenever callers compiled using an old obstack.h can no |
longer properly call the functions in this obstack.c. */ |
#define OBSTACK_INTERFACE_VERSION 1 |
/* Comment out all this code if we are using the GNU C Library, and are not |
actually compiling the library itself, and the installed library |
supports the same library interface we do. This code is part of the GNU |
C Library, but also included in many other GNU distributions. Compiling |
and linking in this code is a waste when using the GNU C library |
(especially if it is a shared library). Rather than having every GNU |
program understand `configure --with-gnu-libc' and omit the object |
files, it is simpler to just do this in the source for each such file. */ |
#include <stdio.h> /* Random thing to get __GNU_LIBRARY__. */ |
#if !defined (_LIBC) && defined (__GNU_LIBRARY__) && __GNU_LIBRARY__ > 1 |
#include <gnu-versions.h> |
#if _GNU_OBSTACK_INTERFACE_VERSION == OBSTACK_INTERFACE_VERSION |
#define ELIDE_CODE |
#endif |
#endif |
#ifndef ELIDE_CODE |
#define POINTER void * |
/* Determine default alignment. */ |
struct fooalign {char x; double d;}; |
#define DEFAULT_ALIGNMENT \ |
((PTR_INT_TYPE) ((char *) &((struct fooalign *) 0)->d - (char *) 0)) |
/* If malloc were really smart, it would round addresses to DEFAULT_ALIGNMENT. |
But in fact it might be less smart and round addresses to as much as |
DEFAULT_ROUNDING. So we prepare for it to do that. */ |
union fooround {long x; double d;}; |
#define DEFAULT_ROUNDING (sizeof (union fooround)) |
/* When we copy a long block of data, this is the unit to do it with. |
On some machines, copying successive ints does not work; |
in such a case, redefine COPYING_UNIT to `long' (if that works) |
or `char' as a last resort. */ |
#ifndef COPYING_UNIT |
#define COPYING_UNIT int |
#endif |
/* The functions allocating more room by calling `obstack_chunk_alloc' |
jump to the handler pointed to by `obstack_alloc_failed_handler'. |
This variable by default points to the internal function |
`print_and_abort'. */ |
static void print_and_abort (void); |
void (*obstack_alloc_failed_handler) (void) = print_and_abort; |
/* Exit value used when `print_and_abort' is used. */ |
#if defined __GNU_LIBRARY__ || defined HAVE_STDLIB_H |
#include <stdlib.h> |
#endif |
#ifndef EXIT_FAILURE |
#define EXIT_FAILURE 1 |
#endif |
int obstack_exit_failure = EXIT_FAILURE; |
/* The non-GNU-C macros copy the obstack into this global variable |
to avoid multiple evaluation. */ |
struct obstack *_obstack; |
/* Define a macro that either calls functions with the traditional malloc/free |
calling interface, or calls functions with the mmalloc/mfree interface |
(that adds an extra first argument), based on the state of use_extra_arg. |
For free, do not use ?:, since some compilers, like the MIPS compilers, |
do not allow (expr) ? void : void. */ |
#if defined (__STDC__) && __STDC__ |
#define CALL_CHUNKFUN(h, size) \ |
(((h) -> use_extra_arg) \ |
? (*(h)->chunkfun) ((h)->extra_arg, (size)) \ |
: (*(struct _obstack_chunk *(*) (long)) (h)->chunkfun) ((size))) |
#define CALL_FREEFUN(h, old_chunk) \ |
do { \ |
if ((h) -> use_extra_arg) \ |
(*(h)->freefun) ((h)->extra_arg, (old_chunk)); \ |
else \ |
(*(void (*) (void *)) (h)->freefun) ((old_chunk)); \ |
} while (0) |
#else |
#define CALL_CHUNKFUN(h, size) \ |
(((h) -> use_extra_arg) \ |
? (*(h)->chunkfun) ((h)->extra_arg, (size)) \ |
: (*(struct _obstack_chunk *(*) ()) (h)->chunkfun) ((size))) |
#define CALL_FREEFUN(h, old_chunk) \ |
do { \ |
if ((h) -> use_extra_arg) \ |
(*(h)->freefun) ((h)->extra_arg, (old_chunk)); \ |
else \ |
(*(void (*) ()) (h)->freefun) ((old_chunk)); \ |
} while (0) |
#endif |
/* Initialize an obstack H for use. Specify chunk size SIZE (0 means default). |
Objects start on multiples of ALIGNMENT (0 means use default). |
CHUNKFUN is the function to use to allocate chunks, |
and FREEFUN the function to free them. |
Return nonzero if successful, zero if out of memory. |
To recover from an out of memory error, |
free up some memory, then call this again. */ |
int |
_obstack_begin (struct obstack *h, int size, int alignment, |
POINTER (*chunkfun) (long), void (*freefun) (void *)) |
{ |
register struct _obstack_chunk *chunk; /* points to new chunk */ |
if (alignment == 0) |
alignment = (int) DEFAULT_ALIGNMENT; |
if (size == 0) |
/* Default size is what GNU malloc can fit in a 4096-byte block. */ |
{ |
/* 12 is sizeof (mhead) and 4 is EXTRA from GNU malloc. |
Use the values for range checking, because if range checking is off, |
the extra bytes won't be missed terribly, but if range checking is on |
and we used a larger request, a whole extra 4096 bytes would be |
allocated. |
These number are irrelevant to the new GNU malloc. I suspect it is |
less sensitive to the size of the request. */ |
int extra = ((((12 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1)) |
+ 4 + DEFAULT_ROUNDING - 1) |
& ~(DEFAULT_ROUNDING - 1)); |
size = 4096 - extra; |
} |
h->chunkfun = (struct _obstack_chunk * (*)(void *, long)) chunkfun; |
h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun; |
h->chunk_size = size; |
h->alignment_mask = alignment - 1; |
h->use_extra_arg = 0; |
chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size); |
if (!chunk) |
(*obstack_alloc_failed_handler) (); |
h->next_free = h->object_base = chunk->contents; |
h->chunk_limit = chunk->limit |
= (char *) chunk + h->chunk_size; |
chunk->prev = 0; |
/* The initial chunk now contains no empty object. */ |
h->maybe_empty_object = 0; |
h->alloc_failed = 0; |
return 1; |
} |
int |
_obstack_begin_1 (struct obstack *h, int size, int alignment, |
POINTER (*chunkfun) (POINTER, long), |
void (*freefun) (POINTER, POINTER), POINTER arg) |
{ |
register struct _obstack_chunk *chunk; /* points to new chunk */ |
if (alignment == 0) |
alignment = (int) DEFAULT_ALIGNMENT; |
if (size == 0) |
/* Default size is what GNU malloc can fit in a 4096-byte block. */ |
{ |
/* 12 is sizeof (mhead) and 4 is EXTRA from GNU malloc. |
Use the values for range checking, because if range checking is off, |
the extra bytes won't be missed terribly, but if range checking is on |
and we used a larger request, a whole extra 4096 bytes would be |
allocated. |
These number are irrelevant to the new GNU malloc. I suspect it is |
less sensitive to the size of the request. */ |
int extra = ((((12 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1)) |
+ 4 + DEFAULT_ROUNDING - 1) |
& ~(DEFAULT_ROUNDING - 1)); |
size = 4096 - extra; |
} |
h->chunkfun = (struct _obstack_chunk * (*)(void *,long)) chunkfun; |
h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun; |
h->chunk_size = size; |
h->alignment_mask = alignment - 1; |
h->extra_arg = arg; |
h->use_extra_arg = 1; |
chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size); |
if (!chunk) |
(*obstack_alloc_failed_handler) (); |
h->next_free = h->object_base = chunk->contents; |
h->chunk_limit = chunk->limit |
= (char *) chunk + h->chunk_size; |
chunk->prev = 0; |
/* The initial chunk now contains no empty object. */ |
h->maybe_empty_object = 0; |
h->alloc_failed = 0; |
return 1; |
} |
/* Allocate a new current chunk for the obstack *H |
on the assumption that LENGTH bytes need to be added |
to the current object, or a new object of length LENGTH allocated. |
Copies any partial object from the end of the old chunk |
to the beginning of the new one. */ |
void |
_obstack_newchunk (struct obstack *h, int length) |
{ |
register struct _obstack_chunk *old_chunk = h->chunk; |
register struct _obstack_chunk *new_chunk; |
register long new_size; |
register long obj_size = h->next_free - h->object_base; |
register long i; |
long already; |
/* Compute size for new chunk. */ |
new_size = (obj_size + length) + (obj_size >> 3) + 100; |
if (new_size < h->chunk_size) |
new_size = h->chunk_size; |
/* Allocate and initialize the new chunk. */ |
new_chunk = CALL_CHUNKFUN (h, new_size); |
if (!new_chunk) |
(*obstack_alloc_failed_handler) (); |
h->chunk = new_chunk; |
new_chunk->prev = old_chunk; |
new_chunk->limit = h->chunk_limit = (char *) new_chunk + new_size; |
/* Move the existing object to the new chunk. |
Word at a time is fast and is safe if the object |
is sufficiently aligned. */ |
if (h->alignment_mask + 1 >= DEFAULT_ALIGNMENT) |
{ |
for (i = obj_size / sizeof (COPYING_UNIT) - 1; |
i >= 0; i--) |
((COPYING_UNIT *)new_chunk->contents)[i] |
= ((COPYING_UNIT *)h->object_base)[i]; |
/* We used to copy the odd few remaining bytes as one extra COPYING_UNIT, |
but that can cross a page boundary on a machine |
which does not do strict alignment for COPYING_UNITS. */ |
already = obj_size / sizeof (COPYING_UNIT) * sizeof (COPYING_UNIT); |
} |
else |
already = 0; |
/* Copy remaining bytes one by one. */ |
for (i = already; i < obj_size; i++) |
new_chunk->contents[i] = h->object_base[i]; |
/* If the object just copied was the only data in OLD_CHUNK, |
free that chunk and remove it from the chain. |
But not if that chunk might contain an empty object. */ |
if (h->object_base == old_chunk->contents && ! h->maybe_empty_object) |
{ |
new_chunk->prev = old_chunk->prev; |
CALL_FREEFUN (h, old_chunk); |
} |
h->object_base = new_chunk->contents; |
h->next_free = h->object_base + obj_size; |
/* The new chunk certainly contains no empty object yet. */ |
h->maybe_empty_object = 0; |
} |
/* Return nonzero if object OBJ has been allocated from obstack H. |
This is here for debugging. |
If you use it in a program, you are probably losing. */ |
/* Suppress -Wmissing-prototypes warning. We don't want to declare this in |
obstack.h because it is just for debugging. */ |
int _obstack_allocated_p (struct obstack *h, POINTER obj); |
int |
_obstack_allocated_p (struct obstack *h, POINTER obj) |
{ |
register struct _obstack_chunk *lp; /* below addr of any objects in this chunk */ |
register struct _obstack_chunk *plp; /* point to previous chunk if any */ |
lp = (h)->chunk; |
/* We use >= rather than > since the object cannot be exactly at |
the beginning of the chunk but might be an empty object exactly |
at the end of an adjacent chunk. */ |
while (lp != 0 && ((POINTER) lp >= obj || (POINTER) (lp)->limit < obj)) |
{ |
plp = lp->prev; |
lp = plp; |
} |
return lp != 0; |
} |
/* Free objects in obstack H, including OBJ and everything allocate |
more recently than OBJ. If OBJ is zero, free everything in H. */ |
#undef obstack_free |
/* This function has two names with identical definitions. |
This is the first one, called from non-ANSI code. */ |
void |
_obstack_free (struct obstack *h, POINTER obj) |
{ |
register struct _obstack_chunk *lp; /* below addr of any objects in this chunk */ |
register struct _obstack_chunk *plp; /* point to previous chunk if any */ |
lp = h->chunk; |
/* We use >= because there cannot be an object at the beginning of a chunk. |
But there can be an empty object at that address |
at the end of another chunk. */ |
while (lp != 0 && ((POINTER) lp >= obj || (POINTER) (lp)->limit < obj)) |
{ |
plp = lp->prev; |
CALL_FREEFUN (h, lp); |
lp = plp; |
/* If we switch chunks, we can't tell whether the new current |
chunk contains an empty object, so assume that it may. */ |
h->maybe_empty_object = 1; |
} |
if (lp) |
{ |
h->object_base = h->next_free = (char *) (obj); |
h->chunk_limit = lp->limit; |
h->chunk = lp; |
} |
else if (obj != 0) |
/* obj is not in any of the chunks! */ |
abort (); |
} |
/* This function is used from ANSI code. */ |
void |
obstack_free (struct obstack *h, POINTER obj) |
{ |
register struct _obstack_chunk *lp; /* below addr of any objects in this chunk */ |
register struct _obstack_chunk *plp; /* point to previous chunk if any */ |
lp = h->chunk; |
/* We use >= because there cannot be an object at the beginning of a chunk. |
But there can be an empty object at that address |
at the end of another chunk. */ |
while (lp != 0 && ((POINTER) lp >= obj || (POINTER) (lp)->limit < obj)) |
{ |
plp = lp->prev; |
CALL_FREEFUN (h, lp); |
lp = plp; |
/* If we switch chunks, we can't tell whether the new current |
chunk contains an empty object, so assume that it may. */ |
h->maybe_empty_object = 1; |
} |
if (lp) |
{ |
h->object_base = h->next_free = (char *) (obj); |
h->chunk_limit = lp->limit; |
h->chunk = lp; |
} |
else if (obj != 0) |
/* obj is not in any of the chunks! */ |
abort (); |
} |
int |
_obstack_memory_used (struct obstack *h) |
{ |
register struct _obstack_chunk* lp; |
register int nbytes = 0; |
for (lp = h->chunk; lp != 0; lp = lp->prev) |
{ |
nbytes += lp->limit - (char *) lp; |
} |
return nbytes; |
} |
/* Define the error handler. */ |
#ifndef _ |
# if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC |
# include <libintl.h> |
# ifndef _ |
# define _(Str) gettext (Str) |
# endif |
# else |
# define _(Str) (Str) |
# endif |
#endif |
static void |
print_and_abort (void) |
{ |
fputs (_("memory exhausted\n"), stderr); |
exit (obstack_exit_failure); |
} |
#if 0 |
/* These are now turned off because the applications do not use it |
and it uses bcopy via obstack_grow, which causes trouble on sysV. */ |
/* Now define the functional versions of the obstack macros. |
Define them to simply use the corresponding macros to do the job. */ |
/* The function names appear in parentheses in order to prevent |
the macro-definitions of the names from being expanded there. */ |
POINTER (obstack_base) (struct obstack *obstack) |
{ |
return obstack_base (obstack); |
} |
POINTER (obstack_next_free) (struct obstack *obstack) |
{ |
return obstack_next_free (obstack); |
} |
int (obstack_object_size) (struct obstack *obstack) |
{ |
return obstack_object_size (obstack); |
} |
int (obstack_room) (struct obstack *obstack) |
{ |
return obstack_room (obstack); |
} |
int (obstack_make_room) (struct obstack *obstack, int length) |
{ |
return obstack_make_room (obstack, length); |
} |
void (obstack_grow) (struct obstack *obstack, POINTER pointer, int length) |
{ |
obstack_grow (obstack, pointer, length); |
} |
void (obstack_grow0) (struct obstack *obstack, POINTER pointer, int length) |
{ |
obstack_grow0 (obstack, pointer, length); |
} |
void (obstack_1grow) (struct obstack *obstack, int character) |
{ |
obstack_1grow (obstack, character); |
} |
void (obstack_blank) (struct obstack *obstack, int length) |
{ |
obstack_blank (obstack, length); |
} |
void (obstack_1grow_fast) (struct obstack *obstack, int character) |
{ |
obstack_1grow_fast (obstack, character); |
} |
void (obstack_blank_fast) (struct obstack *obstack, int length) |
{ |
obstack_blank_fast (obstack, length); |
} |
POINTER (obstack_finish) (struct obstack *obstack) |
{ |
return obstack_finish (obstack); |
} |
POINTER (obstack_alloc) (struct obstack *obstack, int length) |
{ |
return obstack_alloc (obstack, length); |
} |
POINTER (obstack_copy) (struct obstack *obstack, POINTER pointer, int length) |
{ |
return obstack_copy (obstack, pointer, length); |
} |
POINTER (obstack_copy0) (struct obstack *obstack, POINTER pointer, int length) |
{ |
return obstack_copy0 (obstack, pointer, length); |
} |
#endif /* 0 */ |
#endif /* !ELIDE_CODE */ |
/contrib/toolchain/binutils/libiberty/partition.c |
---|
0,0 → 1,183 |
/* List implementation of a partition of consecutive integers. |
Copyright (C) 2000, 2001 Free Software Foundation, Inc. |
Contributed by CodeSourcery, LLC. |
This file is part of GNU CC. |
GNU CC is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2, or (at your option) |
any later version. |
GNU CC is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with GNU CC; see the file COPYING. If not, write to |
the Free Software Foundation, 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
#ifdef HAVE_CONFIG_H |
#include "config.h" |
#endif |
#ifdef HAVE_STDLIB_H |
#include <stdlib.h> |
#endif |
#ifdef HAVE_STRING_H |
#include <string.h> |
#endif |
#include "libiberty.h" |
#include "partition.h" |
static int elem_compare (const void *, const void *); |
/* Creates a partition of NUM_ELEMENTS elements. Initially each |
element is in a class by itself. */ |
partition |
partition_new (int num_elements) |
{ |
int e; |
partition part = (partition) |
xmalloc (sizeof (struct partition_def) + |
(num_elements - 1) * sizeof (struct partition_elem)); |
part->num_elements = num_elements; |
for (e = 0; e < num_elements; ++e) |
{ |
part->elements[e].class_element = e; |
part->elements[e].next = &(part->elements[e]); |
part->elements[e].class_count = 1; |
} |
return part; |
} |
/* Freeds a partition. */ |
void |
partition_delete (partition part) |
{ |
free (part); |
} |
/* Unites the classes containing ELEM1 and ELEM2 into a single class |
of partition PART. If ELEM1 and ELEM2 are already in the same |
class, does nothing. Returns the canonical element of the |
resulting union class. */ |
int |
partition_union (partition part, int elem1, int elem2) |
{ |
struct partition_elem *elements = part->elements; |
struct partition_elem *e1; |
struct partition_elem *e2; |
struct partition_elem *p; |
struct partition_elem *old_next; |
/* The canonical element of the resulting union class. */ |
int class_element = elements[elem1].class_element; |
/* If they're already in the same class, do nothing. */ |
if (class_element == elements[elem2].class_element) |
return class_element; |
/* Make sure ELEM1 is in the larger class of the two. If not, swap |
them. This way we always scan the shorter list. */ |
if (elements[elem1].class_count < elements[elem2].class_count) |
{ |
int temp = elem1; |
elem1 = elem2; |
elem2 = temp; |
class_element = elements[elem1].class_element; |
} |
e1 = &(elements[elem1]); |
e2 = &(elements[elem2]); |
/* Keep a count of the number of elements in the list. */ |
elements[class_element].class_count |
+= elements[e2->class_element].class_count; |
/* Update the class fields in elem2's class list. */ |
e2->class_element = class_element; |
for (p = e2->next; p != e2; p = p->next) |
p->class_element = class_element; |
/* Splice ELEM2's class list into ELEM1's. These are circular |
lists. */ |
old_next = e1->next; |
e1->next = e2->next; |
e2->next = old_next; |
return class_element; |
} |
/* Compare elements ELEM1 and ELEM2 from array of integers, given a |
pointer to each. Used to qsort such an array. */ |
static int |
elem_compare (const void *elem1, const void *elem2) |
{ |
int e1 = * (const int *) elem1; |
int e2 = * (const int *) elem2; |
if (e1 < e2) |
return -1; |
else if (e1 > e2) |
return 1; |
else |
return 0; |
} |
/* Prints PART to the file pointer FP. The elements of each |
class are sorted. */ |
void |
partition_print (partition part, FILE *fp) |
{ |
char *done; |
int num_elements = part->num_elements; |
struct partition_elem *elements = part->elements; |
int *class_elements; |
int e; |
/* Flag the elements we've already printed. */ |
done = (char *) xmalloc (num_elements); |
memset (done, 0, num_elements); |
/* A buffer used to sort elements in a class. */ |
class_elements = (int *) xmalloc (num_elements * sizeof (int)); |
fputc ('[', fp); |
for (e = 0; e < num_elements; ++e) |
/* If we haven't printed this element, print its entire class. */ |
if (! done[e]) |
{ |
int c = e; |
int count = elements[elements[e].class_element].class_count; |
int i; |
/* Collect the elements in this class. */ |
for (i = 0; i < count; ++i) { |
class_elements[i] = c; |
done[c] = 1; |
c = elements[c].next - elements; |
} |
/* Sort them. */ |
qsort ((void *) class_elements, count, sizeof (int), elem_compare); |
/* Print them. */ |
fputc ('(', fp); |
for (i = 0; i < count; ++i) |
fprintf (fp, i == 0 ? "%d" : " %d", class_elements[i]); |
fputc (')', fp); |
} |
fputc (']', fp); |
free (class_elements); |
free (done); |
} |
/contrib/toolchain/binutils/libiberty/pex-common.h |
---|
0,0 → 1,153 |
/* Utilities to execute a program in a subprocess (possibly linked by pipes |
with other subprocesses), and wait for it. Shared logic. |
Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004 |
Free Software Foundation, Inc. |
This file is part of the libiberty library. |
Libiberty is free software; you can redistribute it and/or |
modify it under the terms of the GNU Library General Public |
License as published by the Free Software Foundation; either |
version 2 of the License, or (at your option) any later version. |
Libiberty is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
Library General Public License for more details. |
You should have received a copy of the GNU Library General Public |
License along with libiberty; see the file COPYING.LIB. If not, |
write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
#ifndef PEX_COMMON_H |
#define PEX_COMMON_H |
#include "config.h" |
#include "libiberty.h" |
#include <stdio.h> |
/* pid_t is may defined by config.h or sys/types.h needs to be |
included. */ |
#if !defined(pid_t) && defined(HAVE_SYS_TYPES_H) |
#include <sys/types.h> |
#endif |
#define install_error_msg "installation problem, cannot exec `%s'" |
/* stdin file number. */ |
#define STDIN_FILE_NO 0 |
/* stdout file number. */ |
#define STDOUT_FILE_NO 1 |
/* stderr file number. */ |
#define STDERR_FILE_NO 2 |
/* value of `pipe': port index for reading. */ |
#define READ_PORT 0 |
/* value of `pipe': port index for writing. */ |
#define WRITE_PORT 1 |
/* The structure used by pex_init and friends. */ |
struct pex_obj |
{ |
/* Flags. */ |
int flags; |
/* Name of calling program, for error messages. */ |
const char *pname; |
/* Base name to use for temporary files. */ |
const char *tempbase; |
/* Pipe to use as stdin for next process. */ |
int next_input; |
/* File name to use as stdin for next process. */ |
char *next_input_name; |
/* Whether next_input_name was allocated using malloc. */ |
int next_input_name_allocated; |
/* If not -1, stderr pipe from the last process. */ |
int stderr_pipe; |
/* Number of child processes. */ |
int count; |
/* PIDs of child processes; array allocated using malloc. */ |
pid_t *children; |
/* Exit statuses of child processes; array allocated using malloc. */ |
int *status; |
/* Time used by child processes; array allocated using malloc. */ |
struct pex_time *time; |
/* Number of children we have already waited for. */ |
int number_waited; |
/* FILE created by pex_input_file. */ |
FILE *input_file; |
/* FILE created by pex_read_output. */ |
FILE *read_output; |
/* FILE created by pex_read_err. */ |
FILE *read_err; |
/* Number of temporary files to remove. */ |
int remove_count; |
/* List of temporary files to remove; array allocated using malloc |
of strings allocated using malloc. */ |
char **remove; |
/* Pointers to system dependent functions. */ |
const struct pex_funcs *funcs; |
/* For use by system dependent code. */ |
void *sysdep; |
}; |
/* Functions passed to pex_run_common. */ |
struct pex_funcs |
{ |
/* Open file NAME for reading. If BINARY is non-zero, open in |
binary mode. Return >= 0 on success, -1 on error. */ |
int (*open_read) (struct pex_obj *, const char */* name */, int /* binary */); |
/* Open file NAME for writing. If BINARY is non-zero, open in |
binary mode. Return >= 0 on success, -1 on error. */ |
int (*open_write) (struct pex_obj *, const char */* name */, |
int /* binary */); |
/* Execute a child process. FLAGS, EXECUTABLE, ARGV, ERR are from |
pex_run. IN, OUT, ERRDES, TOCLOSE are all descriptors, from |
open_read, open_write, or pipe, or they are one of STDIN_FILE_NO, |
STDOUT_FILE_NO or STDERR_FILE_NO; if IN, OUT, and ERRDES are not |
STD*_FILE_NO, they should be closed. If the descriptor TOCLOSE |
is not -1, and the system supports pipes, TOCLOSE should be |
closed in the child process. The function should handle the |
PEX_STDERR_TO_STDOUT flag. Return >= 0 on success, or -1 on |
error and set *ERRMSG and *ERR. */ |
pid_t (*exec_child) (struct pex_obj *, int /* flags */, |
const char */* executable */, char * const * /* argv */, |
char * const * /* env */, |
int /* in */, int /* out */, int /* errdes */, |
int /* toclose */, const char **/* errmsg */, |
int */* err */); |
/* Close a descriptor. Return 0 on success, -1 on error. */ |
int (*close) (struct pex_obj *, int); |
/* Wait for a child to complete, returning exit status in *STATUS |
and time in *TIME (if it is not null). CHILD is from fork. DONE |
is 1 if this is called via pex_free. ERRMSG and ERR are as in |
fork. Return 0 on success, -1 on error. */ |
pid_t (*wait) (struct pex_obj *, pid_t /* child */, int * /* status */, |
struct pex_time * /* time */, int /* done */, |
const char ** /* errmsg */, int * /* err */); |
/* Create a pipe (only called if PEX_USE_PIPES is set) storing two |
descriptors in P[0] and P[1]. If BINARY is non-zero, open in |
binary mode. Return 0 on success, -1 on error. */ |
int (*pipe) (struct pex_obj *, int * /* p */, int /* binary */); |
/* Get a FILE pointer to read from a file descriptor (only called if |
PEX_USE_PIPES is set). If BINARY is non-zero, open in binary |
mode. Return pointer on success, NULL on error. */ |
FILE * (*fdopenr) (struct pex_obj *, int /* fd */, int /* binary */); |
/* Get a FILE pointer to write to the file descriptor FD (only |
called if PEX_USE_PIPES is set). If BINARY is non-zero, open in |
binary mode. Arrange for FD not to be inherited by the child |
processes. Return pointer on success, NULL on error. */ |
FILE * (*fdopenw) (struct pex_obj *, int /* fd */, int /* binary */); |
/* Free any system dependent data associated with OBJ. May be |
NULL if there is nothing to do. */ |
void (*cleanup) (struct pex_obj *); |
}; |
extern struct pex_obj *pex_init_common (int, const char *, const char *, |
const struct pex_funcs *); |
#endif |
/contrib/toolchain/binutils/libiberty/physmem.c |
---|
0,0 → 1,305 |
/* Calculate the size of physical memory. |
Copyright 2000, 2001, 2003, 2004, 2005 Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2, or (at your option) |
any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ |
/* Written by Paul Eggert. */ |
#if HAVE_CONFIG_H |
# include <config.h> |
#endif |
#if HAVE_UNISTD_H |
# include <unistd.h> |
#endif |
#if HAVE_SYS_PSTAT_H |
# include <sys/pstat.h> |
#endif |
#if HAVE_SYS_SYSMP_H |
# include <sys/sysmp.h> |
#endif |
#if HAVE_SYS_SYSINFO_H && HAVE_MACHINE_HAL_SYSINFO_H |
# include <sys/sysinfo.h> |
# include <machine/hal_sysinfo.h> |
#endif |
#if HAVE_SYS_TABLE_H |
# include <sys/table.h> |
#endif |
#include <sys/types.h> |
#if HAVE_SYS_PARAM_H |
# include <sys/param.h> |
#endif |
#if HAVE_SYS_SYSCTL_H |
# include <sys/sysctl.h> |
#endif |
#if HAVE_SYS_SYSTEMCFG_H |
# include <sys/systemcfg.h> |
#endif |
#ifdef _WIN32 |
# define WIN32_LEAN_AND_MEAN |
# include <windows.h> |
/* MEMORYSTATUSEX is missing from older windows headers, so define |
a local replacement. */ |
typedef struct |
{ |
DWORD dwLength; |
DWORD dwMemoryLoad; |
DWORDLONG ullTotalPhys; |
DWORDLONG ullAvailPhys; |
DWORDLONG ullTotalPageFile; |
DWORDLONG ullAvailPageFile; |
DWORDLONG ullTotalVirtual; |
DWORDLONG ullAvailVirtual; |
DWORDLONG ullAvailExtendedVirtual; |
} lMEMORYSTATUSEX; |
typedef WINBOOL (WINAPI *PFN_MS_EX) (lMEMORYSTATUSEX*); |
#endif |
#include "libiberty.h" |
/* Return the total amount of physical memory. */ |
double |
physmem_total (void) |
{ |
#if defined _SC_PHYS_PAGES && defined _SC_PAGESIZE |
{ /* This works on linux-gnu, solaris2 and cygwin. */ |
double pages = sysconf (_SC_PHYS_PAGES); |
double pagesize = sysconf (_SC_PAGESIZE); |
if (0 <= pages && 0 <= pagesize) |
return pages * pagesize; |
} |
#endif |
#if HAVE_PSTAT_GETSTATIC |
{ /* This works on hpux11. */ |
struct pst_static pss; |
if (0 <= pstat_getstatic (&pss, sizeof pss, 1, 0)) |
{ |
double pages = pss.physical_memory; |
double pagesize = pss.page_size; |
if (0 <= pages && 0 <= pagesize) |
return pages * pagesize; |
} |
} |
#endif |
#if HAVE_SYSMP && defined MP_SAGET && defined MPSA_RMINFO && defined _SC_PAGESIZE |
{ /* This works on irix6. */ |
struct rminfo realmem; |
if (sysmp (MP_SAGET, MPSA_RMINFO, &realmem, sizeof realmem) == 0) |
{ |
double pagesize = sysconf (_SC_PAGESIZE); |
double pages = realmem.physmem; |
if (0 <= pages && 0 <= pagesize) |
return pages * pagesize; |
} |
} |
#endif |
#if HAVE_GETSYSINFO && defined GSI_PHYSMEM |
{ /* This works on Tru64 UNIX V4/5. */ |
int physmem; |
if (getsysinfo (GSI_PHYSMEM, (caddr_t) &physmem, sizeof (physmem), |
NULL, NULL, NULL) == 1) |
{ |
double kbytes = physmem; |
if (0 <= kbytes) |
return kbytes * 1024.0; |
} |
} |
#endif |
#if HAVE_SYSCTL && defined HW_PHYSMEM |
{ /* This works on *bsd and darwin. */ |
unsigned int physmem; |
size_t len = sizeof physmem; |
static int mib[2] = { CTL_HW, HW_PHYSMEM }; |
if (sysctl (mib, ARRAY_SIZE (mib), &physmem, &len, NULL, 0) == 0 |
&& len == sizeof (physmem)) |
return (double) physmem; |
} |
#endif |
#if HAVE__SYSTEM_CONFIGURATION |
/* This works on AIX 4.3.3+. */ |
return _system_configuration.physmem; |
#endif |
#if defined _WIN32 |
{ /* this works on windows */ |
PFN_MS_EX pfnex; |
HMODULE h = GetModuleHandle ("kernel32.dll"); |
if (!h) |
return 0.0; |
/* Use GlobalMemoryStatusEx if available. */ |
if ((pfnex = (PFN_MS_EX) GetProcAddress (h, "GlobalMemoryStatusEx"))) |
{ |
lMEMORYSTATUSEX lms_ex; |
lms_ex.dwLength = sizeof lms_ex; |
if (!pfnex (&lms_ex)) |
return 0.0; |
return (double) lms_ex.ullTotalPhys; |
} |
/* Fall back to GlobalMemoryStatus which is always available. |
but returns wrong results for physical memory > 4GB. */ |
else |
{ |
MEMORYSTATUS ms; |
GlobalMemoryStatus (&ms); |
return (double) ms.dwTotalPhys; |
} |
} |
#endif |
/* Return 0 if we can't determine the value. */ |
return 0; |
} |
/* Return the amount of physical memory available. */ |
double |
physmem_available (void) |
{ |
#if defined _SC_AVPHYS_PAGES && defined _SC_PAGESIZE |
{ /* This works on linux-gnu, solaris2 and cygwin. */ |
double pages = sysconf (_SC_AVPHYS_PAGES); |
double pagesize = sysconf (_SC_PAGESIZE); |
if (0 <= pages && 0 <= pagesize) |
return pages * pagesize; |
} |
#endif |
#if HAVE_PSTAT_GETSTATIC && HAVE_PSTAT_GETDYNAMIC |
{ /* This works on hpux11. */ |
struct pst_static pss; |
struct pst_dynamic psd; |
if (0 <= pstat_getstatic (&pss, sizeof pss, 1, 0) |
&& 0 <= pstat_getdynamic (&psd, sizeof psd, 1, 0)) |
{ |
double pages = psd.psd_free; |
double pagesize = pss.page_size; |
if (0 <= pages && 0 <= pagesize) |
return pages * pagesize; |
} |
} |
#endif |
#if HAVE_SYSMP && defined MP_SAGET && defined MPSA_RMINFO && defined _SC_PAGESIZE |
{ /* This works on irix6. */ |
struct rminfo realmem; |
if (sysmp (MP_SAGET, MPSA_RMINFO, &realmem, sizeof realmem) == 0) |
{ |
double pagesize = sysconf (_SC_PAGESIZE); |
double pages = realmem.availrmem; |
if (0 <= pages && 0 <= pagesize) |
return pages * pagesize; |
} |
} |
#endif |
#if HAVE_TABLE && defined TBL_VMSTATS |
{ /* This works on Tru64 UNIX V4/5. */ |
struct tbl_vmstats vmstats; |
if (table (TBL_VMSTATS, 0, &vmstats, 1, sizeof (vmstats)) == 1) |
{ |
double pages = vmstats.free_count; |
double pagesize = vmstats.pagesize; |
if (0 <= pages && 0 <= pagesize) |
return pages * pagesize; |
} |
} |
#endif |
#if HAVE_SYSCTL && defined HW_USERMEM |
{ /* This works on *bsd and darwin. */ |
unsigned int usermem; |
size_t len = sizeof usermem; |
static int mib[2] = { CTL_HW, HW_USERMEM }; |
if (sysctl (mib, ARRAY_SIZE (mib), &usermem, &len, NULL, 0) == 0 |
&& len == sizeof (usermem)) |
return (double) usermem; |
} |
#endif |
#if defined _WIN32 |
{ /* this works on windows */ |
PFN_MS_EX pfnex; |
HMODULE h = GetModuleHandle ("kernel32.dll"); |
if (!h) |
return 0.0; |
/* Use GlobalMemoryStatusEx if available. */ |
if ((pfnex = (PFN_MS_EX) GetProcAddress (h, "GlobalMemoryStatusEx"))) |
{ |
lMEMORYSTATUSEX lms_ex; |
lms_ex.dwLength = sizeof lms_ex; |
if (!pfnex (&lms_ex)) |
return 0.0; |
return (double) lms_ex.ullAvailPhys; |
} |
/* Fall back to GlobalMemoryStatus which is always available. |
but returns wrong results for physical memory > 4GB */ |
else |
{ |
MEMORYSTATUS ms; |
GlobalMemoryStatus (&ms); |
return (double) ms.dwAvailPhys; |
} |
} |
#endif |
/* Guess 25% of physical memory. */ |
return physmem_total () / 4; |
} |
#if DEBUG |
# include <stdio.h> |
# include <stdlib.h> |
int |
main (void) |
{ |
printf ("%12.f %12.f\n", physmem_total (), physmem_available ()); |
exit (0); |
} |
#endif /* DEBUG */ |
/* |
Local Variables: |
compile-command: "gcc -DDEBUG -DHAVE_CONFIG_H -I.. -g -O -Wall -W physmem.c" |
End: |
*/ |
/contrib/toolchain/binutils/libiberty/random.c |
---|
0,0 → 1,404 |
/* |
* Copyright (c) 1983 Regents of the University of California. |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. [rescinded 22 July 1999] |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
/* |
* This is derived from the Berkeley source: |
* @(#)random.c 5.5 (Berkeley) 7/6/88 |
* It was reworked for the GNU C Library by Roland McGrath. |
*/ |
/* |
@deftypefn Supplement {long int} random (void) |
@deftypefnx Supplement void srandom (unsigned int @var{seed}) |
@deftypefnx Supplement void* initstate (unsigned int @var{seed}, @ |
void *@var{arg_state}, unsigned long @var{n}) |
@deftypefnx Supplement void* setstate (void *@var{arg_state}) |
Random number functions. @code{random} returns a random number in the |
range 0 to @code{LONG_MAX}. @code{srandom} initializes the random |
number generator to some starting point determined by @var{seed} |
(else, the values returned by @code{random} are always the same for each |
run of the program). @code{initstate} and @code{setstate} allow fine-grained |
control over the state of the random number generator. |
@end deftypefn |
*/ |
#include <errno.h> |
#if 0 |
#include <ansidecl.h> |
#include <limits.h> |
#include <stddef.h> |
#include <stdlib.h> |
#else |
#define ULONG_MAX ((unsigned long)(~0L)) /* 0xFFFFFFFF for 32-bits */ |
#define LONG_MAX ((long)(ULONG_MAX >> 1)) /* 0x7FFFFFFF for 32-bits*/ |
#ifdef __STDC__ |
# define PTR void * |
# ifndef NULL |
# define NULL (void *) 0 |
# endif |
#else |
# define PTR char * |
# ifndef NULL |
# define NULL (void *) 0 |
# endif |
#endif |
#endif |
long int random (void); |
/* An improved random number generation package. In addition to the standard |
rand()/srand() like interface, this package also has a special state info |
interface. The initstate() routine is called with a seed, an array of |
bytes, and a count of how many bytes are being passed in; this array is |
then initialized to contain information for random number generation with |
that much state information. Good sizes for the amount of state |
information are 32, 64, 128, and 256 bytes. The state can be switched by |
calling the setstate() function with the same array as was initiallized |
with initstate(). By default, the package runs with 128 bytes of state |
information and generates far better random numbers than a linear |
congruential generator. If the amount of state information is less than |
32 bytes, a simple linear congruential R.N.G. is used. Internally, the |
state information is treated as an array of longs; the zeroeth element of |
the array is the type of R.N.G. being used (small integer); the remainder |
of the array is the state information for the R.N.G. Thus, 32 bytes of |
state information will give 7 longs worth of state information, which will |
allow a degree seven polynomial. (Note: The zeroeth word of state |
information also has some other information stored in it; see setstate |
for details). The random number generation technique is a linear feedback |
shift register approach, employing trinomials (since there are fewer terms |
to sum up that way). In this approach, the least significant bit of all |
the numbers in the state table will act as a linear feedback shift register, |
and will have period 2^deg - 1 (where deg is the degree of the polynomial |
being used, assuming that the polynomial is irreducible and primitive). |
The higher order bits will have longer periods, since their values are |
also influenced by pseudo-random carries out of the lower bits. The |
total period of the generator is approximately deg*(2**deg - 1); thus |
doubling the amount of state information has a vast influence on the |
period of the generator. Note: The deg*(2**deg - 1) is an approximation |
only good for large deg, when the period of the shift register is the |
dominant factor. With deg equal to seven, the period is actually much |
longer than the 7*(2**7 - 1) predicted by this formula. */ |
/* For each of the currently supported random number generators, we have a |
break value on the amount of state information (you need at least thi |
bytes of state info to support this random number generator), a degree for |
the polynomial (actually a trinomial) that the R.N.G. is based on, and |
separation between the two lower order coefficients of the trinomial. */ |
/* Linear congruential. */ |
#define TYPE_0 0 |
#define BREAK_0 8 |
#define DEG_0 0 |
#define SEP_0 0 |
/* x**7 + x**3 + 1. */ |
#define TYPE_1 1 |
#define BREAK_1 32 |
#define DEG_1 7 |
#define SEP_1 3 |
/* x**15 + x + 1. */ |
#define TYPE_2 2 |
#define BREAK_2 64 |
#define DEG_2 15 |
#define SEP_2 1 |
/* x**31 + x**3 + 1. */ |
#define TYPE_3 3 |
#define BREAK_3 128 |
#define DEG_3 31 |
#define SEP_3 3 |
/* x**63 + x + 1. */ |
#define TYPE_4 4 |
#define BREAK_4 256 |
#define DEG_4 63 |
#define SEP_4 1 |
/* Array versions of the above information to make code run faster. |
Relies on fact that TYPE_i == i. */ |
#define MAX_TYPES 5 /* Max number of types above. */ |
static int degrees[MAX_TYPES] = { DEG_0, DEG_1, DEG_2, DEG_3, DEG_4 }; |
static int seps[MAX_TYPES] = { SEP_0, SEP_1, SEP_2, SEP_3, SEP_4 }; |
/* Initially, everything is set up as if from: |
initstate(1, randtbl, 128); |
Note that this initialization takes advantage of the fact that srandom |
advances the front and rear pointers 10*rand_deg times, and hence the |
rear pointer which starts at 0 will also end up at zero; thus the zeroeth |
element of the state information, which contains info about the current |
position of the rear pointer is just |
(MAX_TYPES * (rptr - state)) + TYPE_3 == TYPE_3. */ |
static long int randtbl[DEG_3 + 1] = |
{ TYPE_3, |
0x9a319039, 0x32d9c024, 0x9b663182, 0x5da1f342, |
0xde3b81e0, 0xdf0a6fb5, 0xf103bc02, 0x48f340fb, |
0x7449e56b, 0xbeb1dbb0, 0xab5c5918, 0x946554fd, |
0x8c2e680f, 0xeb3d799f, 0xb11ee0b7, 0x2d436b86, |
0xda672e2a, 0x1588ca88, 0xe369735d, 0x904f35f7, |
0xd7158fd6, 0x6fa6f051, 0x616e6b96, 0xac94efdc, |
0x36413f93, 0xc622c298, 0xf5a42ab8, 0x8a88d77b, |
0xf5ad9d0e, 0x8999220b, 0x27fb47b9 |
}; |
/* FPTR and RPTR are two pointers into the state info, a front and a rear |
pointer. These two pointers are always rand_sep places aparts, as they |
cycle through the state information. (Yes, this does mean we could get |
away with just one pointer, but the code for random is more efficient |
this way). The pointers are left positioned as they would be from the call: |
initstate(1, randtbl, 128); |
(The position of the rear pointer, rptr, is really 0 (as explained above |
in the initialization of randtbl) because the state table pointer is set |
to point to randtbl[1] (as explained below).) */ |
static long int *fptr = &randtbl[SEP_3 + 1]; |
static long int *rptr = &randtbl[1]; |
/* The following things are the pointer to the state information table, |
the type of the current generator, the degree of the current polynomial |
being used, and the separation between the two pointers. |
Note that for efficiency of random, we remember the first location of |
the state information, not the zeroeth. Hence it is valid to access |
state[-1], which is used to store the type of the R.N.G. |
Also, we remember the last location, since this is more efficient than |
indexing every time to find the address of the last element to see if |
the front and rear pointers have wrapped. */ |
static long int *state = &randtbl[1]; |
static int rand_type = TYPE_3; |
static int rand_deg = DEG_3; |
static int rand_sep = SEP_3; |
static long int *end_ptr = &randtbl[sizeof(randtbl) / sizeof(randtbl[0])]; |
/* Initialize the random number generator based on the given seed. If the |
type is the trivial no-state-information type, just remember the seed. |
Otherwise, initializes state[] based on the given "seed" via a linear |
congruential generator. Then, the pointers are set to known locations |
that are exactly rand_sep places apart. Lastly, it cycles the state |
information a given number of times to get rid of any initial dependencies |
introduced by the L.C.R.N.G. Note that the initialization of randtbl[] |
for default usage relies on values produced by this routine. */ |
void |
srandom (unsigned int x) |
{ |
state[0] = x; |
if (rand_type != TYPE_0) |
{ |
register long int i; |
for (i = 1; i < rand_deg; ++i) |
state[i] = (1103515145 * state[i - 1]) + 12345; |
fptr = &state[rand_sep]; |
rptr = &state[0]; |
for (i = 0; i < 10 * rand_deg; ++i) |
random(); |
} |
} |
/* Initialize the state information in the given array of N bytes for |
future random number generation. Based on the number of bytes we |
are given, and the break values for the different R.N.G.'s, we choose |
the best (largest) one we can and set things up for it. srandom is |
then called to initialize the state information. Note that on return |
from srandom, we set state[-1] to be the type multiplexed with the current |
value of the rear pointer; this is so successive calls to initstate won't |
lose this information and will be able to restart with setstate. |
Note: The first thing we do is save the current state, if any, just like |
setstate so that it doesn't matter when initstate is called. |
Returns a pointer to the old state. */ |
PTR |
initstate (unsigned int seed, PTR arg_state, unsigned long n) |
{ |
PTR ostate = (PTR) &state[-1]; |
if (rand_type == TYPE_0) |
state[-1] = rand_type; |
else |
state[-1] = (MAX_TYPES * (rptr - state)) + rand_type; |
if (n < BREAK_1) |
{ |
if (n < BREAK_0) |
{ |
errno = EINVAL; |
return NULL; |
} |
rand_type = TYPE_0; |
rand_deg = DEG_0; |
rand_sep = SEP_0; |
} |
else if (n < BREAK_2) |
{ |
rand_type = TYPE_1; |
rand_deg = DEG_1; |
rand_sep = SEP_1; |
} |
else if (n < BREAK_3) |
{ |
rand_type = TYPE_2; |
rand_deg = DEG_2; |
rand_sep = SEP_2; |
} |
else if (n < BREAK_4) |
{ |
rand_type = TYPE_3; |
rand_deg = DEG_3; |
rand_sep = SEP_3; |
} |
else |
{ |
rand_type = TYPE_4; |
rand_deg = DEG_4; |
rand_sep = SEP_4; |
} |
state = &((long int *) arg_state)[1]; /* First location. */ |
/* Must set END_PTR before srandom. */ |
end_ptr = &state[rand_deg]; |
srandom(seed); |
if (rand_type == TYPE_0) |
state[-1] = rand_type; |
else |
state[-1] = (MAX_TYPES * (rptr - state)) + rand_type; |
return ostate; |
} |
/* Restore the state from the given state array. |
Note: It is important that we also remember the locations of the pointers |
in the current state information, and restore the locations of the pointers |
from the old state information. This is done by multiplexing the pointer |
location into the zeroeth word of the state information. Note that due |
to the order in which things are done, it is OK to call setstate with the |
same state as the current state |
Returns a pointer to the old state information. */ |
PTR |
setstate (PTR arg_state) |
{ |
register long int *new_state = (long int *) arg_state; |
register int type = new_state[0] % MAX_TYPES; |
register int rear = new_state[0] / MAX_TYPES; |
PTR ostate = (PTR) &state[-1]; |
if (rand_type == TYPE_0) |
state[-1] = rand_type; |
else |
state[-1] = (MAX_TYPES * (rptr - state)) + rand_type; |
switch (type) |
{ |
case TYPE_0: |
case TYPE_1: |
case TYPE_2: |
case TYPE_3: |
case TYPE_4: |
rand_type = type; |
rand_deg = degrees[type]; |
rand_sep = seps[type]; |
break; |
default: |
/* State info munged. */ |
errno = EINVAL; |
return NULL; |
} |
state = &new_state[1]; |
if (rand_type != TYPE_0) |
{ |
rptr = &state[rear]; |
fptr = &state[(rear + rand_sep) % rand_deg]; |
} |
/* Set end_ptr too. */ |
end_ptr = &state[rand_deg]; |
return ostate; |
} |
/* If we are using the trivial TYPE_0 R.N.G., just do the old linear |
congruential bit. Otherwise, we do our fancy trinomial stuff, which is the |
same in all ther other cases due to all the global variables that have been |
set up. The basic operation is to add the number at the rear pointer into |
the one at the front pointer. Then both pointers are advanced to the next |
location cyclically in the table. The value returned is the sum generated, |
reduced to 31 bits by throwing away the "least random" low bit. |
Note: The code takes advantage of the fact that both the front and |
rear pointers can't wrap on the same call by not testing the rear |
pointer if the front one has wrapped. Returns a 31-bit random number. */ |
long int |
random (void) |
{ |
if (rand_type == TYPE_0) |
{ |
state[0] = ((state[0] * 1103515245) + 12345) & LONG_MAX; |
return state[0]; |
} |
else |
{ |
long int i; |
*fptr += *rptr; |
/* Chucking least random bit. */ |
i = (*fptr >> 1) & LONG_MAX; |
++fptr; |
if (fptr >= end_ptr) |
{ |
fptr = state; |
++rptr; |
} |
else |
{ |
++rptr; |
if (rptr >= end_ptr) |
rptr = state; |
} |
return i; |
} |
} |
/contrib/toolchain/binutils/libiberty/regex.c |
---|
0,0 → 1,8204 |
/* Extended regular expression matching and search library, |
version 0.12. |
(Implements POSIX draft P1003.2/D11.2, except for some of the |
internationalization features.) |
Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, |
2002, 2005, 2010, 2013 Free Software Foundation, Inc. |
This file is part of the GNU C Library. |
The GNU C Library is free software; you can redistribute it and/or |
modify it under the terms of the GNU Lesser General Public |
License as published by the Free Software Foundation; either |
version 2.1 of the License, or (at your option) any later version. |
The GNU C Library is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
Lesser General Public License for more details. |
You should have received a copy of the GNU Lesser General Public |
License along with the GNU C Library; if not, write to the Free |
Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
02110-1301 USA. */ |
/* This file has been modified for usage in libiberty. It includes "xregex.h" |
instead of <regex.h>. The "xregex.h" header file renames all external |
routines with an "x" prefix so they do not collide with the native regex |
routines or with other components regex routines. */ |
/* AIX requires this to be the first thing in the file. */ |
#if defined _AIX && !defined __GNUC__ && !defined REGEX_MALLOC |
#pragma alloca |
#endif |
#undef _GNU_SOURCE |
#define _GNU_SOURCE |
#ifndef INSIDE_RECURSION |
# ifdef HAVE_CONFIG_H |
# include <config.h> |
# endif |
#endif |
#include <ansidecl.h> |
#ifndef INSIDE_RECURSION |
# if defined STDC_HEADERS && !defined emacs |
# include <stddef.h> |
# define PTR_INT_TYPE ptrdiff_t |
# else |
/* We need this for `regex.h', and perhaps for the Emacs include files. */ |
# include <sys/types.h> |
# define PTR_INT_TYPE long |
# endif |
# define WIDE_CHAR_SUPPORT (HAVE_WCTYPE_H && HAVE_WCHAR_H && HAVE_BTOWC) |
/* For platform which support the ISO C amendement 1 functionality we |
support user defined character classes. */ |
# if defined _LIBC || WIDE_CHAR_SUPPORT |
/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>. */ |
# include <wchar.h> |
# include <wctype.h> |
# endif |
# ifdef _LIBC |
/* We have to keep the namespace clean. */ |
# define regfree(preg) __regfree (preg) |
# define regexec(pr, st, nm, pm, ef) __regexec (pr, st, nm, pm, ef) |
# define regcomp(preg, pattern, cflags) __regcomp (preg, pattern, cflags) |
# define regerror(errcode, preg, errbuf, errbuf_size) \ |
__regerror(errcode, preg, errbuf, errbuf_size) |
# define re_set_registers(bu, re, nu, st, en) \ |
__re_set_registers (bu, re, nu, st, en) |
# define re_match_2(bufp, string1, size1, string2, size2, pos, regs, stop) \ |
__re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop) |
# define re_match(bufp, string, size, pos, regs) \ |
__re_match (bufp, string, size, pos, regs) |
# define re_search(bufp, string, size, startpos, range, regs) \ |
__re_search (bufp, string, size, startpos, range, regs) |
# define re_compile_pattern(pattern, length, bufp) \ |
__re_compile_pattern (pattern, length, bufp) |
# define re_set_syntax(syntax) __re_set_syntax (syntax) |
# define re_search_2(bufp, st1, s1, st2, s2, startpos, range, regs, stop) \ |
__re_search_2 (bufp, st1, s1, st2, s2, startpos, range, regs, stop) |
# define re_compile_fastmap(bufp) __re_compile_fastmap (bufp) |
# define btowc __btowc |
/* We are also using some library internals. */ |
# include <locale/localeinfo.h> |
# include <locale/elem-hash.h> |
# include <langinfo.h> |
# include <locale/coll-lookup.h> |
# endif |
/* This is for other GNU distributions with internationalized messages. */ |
# if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC |
# include <libintl.h> |
# ifdef _LIBC |
# undef gettext |
# define gettext(msgid) __dcgettext ("libc", msgid, LC_MESSAGES) |
# endif |
# else |
# define gettext(msgid) (msgid) |
# endif |
# ifndef gettext_noop |
/* This define is so xgettext can find the internationalizable |
strings. */ |
# define gettext_noop(String) String |
# endif |
/* The `emacs' switch turns on certain matching commands |
that make sense only in Emacs. */ |
# ifdef emacs |
# include "lisp.h" |
# include "buffer.h" |
# include "syntax.h" |
# else /* not emacs */ |
/* If we are not linking with Emacs proper, |
we can't use the relocating allocator |
even if config.h says that we can. */ |
# undef REL_ALLOC |
# if defined STDC_HEADERS || defined _LIBC |
# include <stdlib.h> |
# else |
char *malloc (); |
char *realloc (); |
# endif |
/* When used in Emacs's lib-src, we need to get bzero and bcopy somehow. |
If nothing else has been done, use the method below. */ |
# ifdef INHIBIT_STRING_HEADER |
# if !(defined HAVE_BZERO && defined HAVE_BCOPY) |
# if !defined bzero && !defined bcopy |
# undef INHIBIT_STRING_HEADER |
# endif |
# endif |
# endif |
/* This is the normal way of making sure we have a bcopy and a bzero. |
This is used in most programs--a few other programs avoid this |
by defining INHIBIT_STRING_HEADER. */ |
# ifndef INHIBIT_STRING_HEADER |
# if defined HAVE_STRING_H || defined STDC_HEADERS || defined _LIBC |
# include <string.h> |
# ifndef bzero |
# ifndef _LIBC |
# define bzero(s, n) (memset (s, '\0', n), (s)) |
# else |
# define bzero(s, n) __bzero (s, n) |
# endif |
# endif |
# else |
# include <strings.h> |
# ifndef memcmp |
# define memcmp(s1, s2, n) bcmp (s1, s2, n) |
# endif |
# ifndef memcpy |
# define memcpy(d, s, n) (bcopy (s, d, n), (d)) |
# endif |
# endif |
# endif |
/* Define the syntax stuff for \<, \>, etc. */ |
/* This must be nonzero for the wordchar and notwordchar pattern |
commands in re_match_2. */ |
# ifndef Sword |
# define Sword 1 |
# endif |
# ifdef SWITCH_ENUM_BUG |
# define SWITCH_ENUM_CAST(x) ((int)(x)) |
# else |
# define SWITCH_ENUM_CAST(x) (x) |
# endif |
# endif /* not emacs */ |
# if defined _LIBC || HAVE_LIMITS_H |
# include <limits.h> |
# endif |
# ifndef MB_LEN_MAX |
# define MB_LEN_MAX 1 |
# endif |
/* Get the interface, including the syntax bits. */ |
# include "xregex.h" /* change for libiberty */ |
/* isalpha etc. are used for the character classes. */ |
# include <ctype.h> |
/* Jim Meyering writes: |
"... Some ctype macros are valid only for character codes that |
isascii says are ASCII (SGI's IRIX-4.0.5 is one such system --when |
using /bin/cc or gcc but without giving an ansi option). So, all |
ctype uses should be through macros like ISPRINT... If |
STDC_HEADERS is defined, then autoconf has verified that the ctype |
macros don't need to be guarded with references to isascii. ... |
Defining isascii to 1 should let any compiler worth its salt |
eliminate the && through constant folding." |
Solaris defines some of these symbols so we must undefine them first. */ |
# undef ISASCII |
# if defined STDC_HEADERS || (!defined isascii && !defined HAVE_ISASCII) |
# define ISASCII(c) 1 |
# else |
# define ISASCII(c) isascii(c) |
# endif |
# ifdef isblank |
# define ISBLANK(c) (ISASCII (c) && isblank (c)) |
# else |
# define ISBLANK(c) ((c) == ' ' || (c) == '\t') |
# endif |
# ifdef isgraph |
# define ISGRAPH(c) (ISASCII (c) && isgraph (c)) |
# else |
# define ISGRAPH(c) (ISASCII (c) && isprint (c) && !isspace (c)) |
# endif |
# undef ISPRINT |
# define ISPRINT(c) (ISASCII (c) && isprint (c)) |
# define ISDIGIT(c) (ISASCII (c) && isdigit (c)) |
# define ISALNUM(c) (ISASCII (c) && isalnum (c)) |
# define ISALPHA(c) (ISASCII (c) && isalpha (c)) |
# define ISCNTRL(c) (ISASCII (c) && iscntrl (c)) |
# define ISLOWER(c) (ISASCII (c) && islower (c)) |
# define ISPUNCT(c) (ISASCII (c) && ispunct (c)) |
# define ISSPACE(c) (ISASCII (c) && isspace (c)) |
# define ISUPPER(c) (ISASCII (c) && isupper (c)) |
# define ISXDIGIT(c) (ISASCII (c) && isxdigit (c)) |
# ifdef _tolower |
# define TOLOWER(c) _tolower(c) |
# else |
# define TOLOWER(c) tolower(c) |
# endif |
# ifndef NULL |
# define NULL (void *)0 |
# endif |
/* We remove any previous definition of `SIGN_EXTEND_CHAR', |
since ours (we hope) works properly with all combinations of |
machines, compilers, `char' and `unsigned char' argument types. |
(Per Bothner suggested the basic approach.) */ |
# undef SIGN_EXTEND_CHAR |
# if __STDC__ |
# define SIGN_EXTEND_CHAR(c) ((signed char) (c)) |
# else /* not __STDC__ */ |
/* As in Harbison and Steele. */ |
# define SIGN_EXTEND_CHAR(c) ((((unsigned char) (c)) ^ 128) - 128) |
# endif |
# ifndef emacs |
/* How many characters in the character set. */ |
# define CHAR_SET_SIZE 256 |
# ifdef SYNTAX_TABLE |
extern char *re_syntax_table; |
# else /* not SYNTAX_TABLE */ |
static char re_syntax_table[CHAR_SET_SIZE]; |
static void init_syntax_once (void); |
static void |
init_syntax_once (void) |
{ |
register int c; |
static int done = 0; |
if (done) |
return; |
bzero (re_syntax_table, sizeof re_syntax_table); |
for (c = 0; c < CHAR_SET_SIZE; ++c) |
if (ISALNUM (c)) |
re_syntax_table[c] = Sword; |
re_syntax_table['_'] = Sword; |
done = 1; |
} |
# endif /* not SYNTAX_TABLE */ |
# define SYNTAX(c) re_syntax_table[(unsigned char) (c)] |
# endif /* emacs */ |
/* Integer type for pointers. */ |
# if !defined _LIBC && !defined HAVE_UINTPTR_T |
typedef unsigned long int uintptr_t; |
# endif |
/* Should we use malloc or alloca? If REGEX_MALLOC is not defined, we |
use `alloca' instead of `malloc'. This is because using malloc in |
re_search* or re_match* could cause memory leaks when C-g is used in |
Emacs; also, malloc is slower and causes storage fragmentation. On |
the other hand, malloc is more portable, and easier to debug. |
Because we sometimes use alloca, some routines have to be macros, |
not functions -- `alloca'-allocated space disappears at the end of the |
function it is called in. */ |
# ifdef REGEX_MALLOC |
# define REGEX_ALLOCATE malloc |
# define REGEX_REALLOCATE(source, osize, nsize) realloc (source, nsize) |
# define REGEX_FREE free |
# else /* not REGEX_MALLOC */ |
/* Emacs already defines alloca, sometimes. */ |
# ifndef alloca |
/* Make alloca work the best possible way. */ |
# ifdef __GNUC__ |
# define alloca __builtin_alloca |
# else /* not __GNUC__ */ |
# if HAVE_ALLOCA_H |
# include <alloca.h> |
# endif /* HAVE_ALLOCA_H */ |
# endif /* not __GNUC__ */ |
# endif /* not alloca */ |
# define REGEX_ALLOCATE alloca |
/* Assumes a `char *destination' variable. */ |
# define REGEX_REALLOCATE(source, osize, nsize) \ |
(destination = (char *) alloca (nsize), \ |
memcpy (destination, source, osize)) |
/* No need to do anything to free, after alloca. */ |
# define REGEX_FREE(arg) ((void)0) /* Do nothing! But inhibit gcc warning. */ |
# endif /* not REGEX_MALLOC */ |
/* Define how to allocate the failure stack. */ |
# if defined REL_ALLOC && defined REGEX_MALLOC |
# define REGEX_ALLOCATE_STACK(size) \ |
r_alloc (&failure_stack_ptr, (size)) |
# define REGEX_REALLOCATE_STACK(source, osize, nsize) \ |
r_re_alloc (&failure_stack_ptr, (nsize)) |
# define REGEX_FREE_STACK(ptr) \ |
r_alloc_free (&failure_stack_ptr) |
# else /* not using relocating allocator */ |
# ifdef REGEX_MALLOC |
# define REGEX_ALLOCATE_STACK malloc |
# define REGEX_REALLOCATE_STACK(source, osize, nsize) realloc (source, nsize) |
# define REGEX_FREE_STACK free |
# else /* not REGEX_MALLOC */ |
# define REGEX_ALLOCATE_STACK alloca |
# define REGEX_REALLOCATE_STACK(source, osize, nsize) \ |
REGEX_REALLOCATE (source, osize, nsize) |
/* No need to explicitly free anything. */ |
# define REGEX_FREE_STACK(arg) |
# endif /* not REGEX_MALLOC */ |
# endif /* not using relocating allocator */ |
/* True if `size1' is non-NULL and PTR is pointing anywhere inside |
`string1' or just past its end. This works if PTR is NULL, which is |
a good thing. */ |
# define FIRST_STRING_P(ptr) \ |
(size1 && string1 <= (ptr) && (ptr) <= string1 + size1) |
/* (Re)Allocate N items of type T using malloc, or fail. */ |
# define TALLOC(n, t) ((t *) malloc ((n) * sizeof (t))) |
# define RETALLOC(addr, n, t) ((addr) = (t *) realloc (addr, (n) * sizeof (t))) |
# define RETALLOC_IF(addr, n, t) \ |
if (addr) RETALLOC((addr), (n), t); else (addr) = TALLOC ((n), t) |
# define REGEX_TALLOC(n, t) ((t *) REGEX_ALLOCATE ((n) * sizeof (t))) |
# define BYTEWIDTH 8 /* In bits. */ |
# define STREQ(s1, s2) ((strcmp (s1, s2) == 0)) |
# undef MAX |
# undef MIN |
# define MAX(a, b) ((a) > (b) ? (a) : (b)) |
# define MIN(a, b) ((a) < (b) ? (a) : (b)) |
typedef char boolean; |
# define false 0 |
# define true 1 |
static reg_errcode_t byte_regex_compile (const char *pattern, size_t size, |
reg_syntax_t syntax, |
struct re_pattern_buffer *bufp); |
static int byte_re_match_2_internal (struct re_pattern_buffer *bufp, |
const char *string1, int size1, |
const char *string2, int size2, |
int pos, |
struct re_registers *regs, |
int stop); |
static int byte_re_search_2 (struct re_pattern_buffer *bufp, |
const char *string1, int size1, |
const char *string2, int size2, |
int startpos, int range, |
struct re_registers *regs, int stop); |
static int byte_re_compile_fastmap (struct re_pattern_buffer *bufp); |
#ifdef MBS_SUPPORT |
static reg_errcode_t wcs_regex_compile (const char *pattern, size_t size, |
reg_syntax_t syntax, |
struct re_pattern_buffer *bufp); |
static int wcs_re_match_2_internal (struct re_pattern_buffer *bufp, |
const char *cstring1, int csize1, |
const char *cstring2, int csize2, |
int pos, |
struct re_registers *regs, |
int stop, |
wchar_t *string1, int size1, |
wchar_t *string2, int size2, |
int *mbs_offset1, int *mbs_offset2); |
static int wcs_re_search_2 (struct re_pattern_buffer *bufp, |
const char *string1, int size1, |
const char *string2, int size2, |
int startpos, int range, |
struct re_registers *regs, int stop); |
static int wcs_re_compile_fastmap (struct re_pattern_buffer *bufp); |
#endif |
/* These are the command codes that appear in compiled regular |
expressions. Some opcodes are followed by argument bytes. A |
command code can specify any interpretation whatsoever for its |
arguments. Zero bytes may appear in the compiled regular expression. */ |
typedef enum |
{ |
no_op = 0, |
/* Succeed right away--no more backtracking. */ |
succeed, |
/* Followed by one byte giving n, then by n literal bytes. */ |
exactn, |
# ifdef MBS_SUPPORT |
/* Same as exactn, but contains binary data. */ |
exactn_bin, |
# endif |
/* Matches any (more or less) character. */ |
anychar, |
/* Matches any one char belonging to specified set. First |
following byte is number of bitmap bytes. Then come bytes |
for a bitmap saying which chars are in. Bits in each byte |
are ordered low-bit-first. A character is in the set if its |
bit is 1. A character too large to have a bit in the map is |
automatically not in the set. */ |
/* ifdef MBS_SUPPORT, following element is length of character |
classes, length of collating symbols, length of equivalence |
classes, length of character ranges, and length of characters. |
Next, character class element, collating symbols elements, |
equivalence class elements, range elements, and character |
elements follow. |
See regex_compile function. */ |
charset, |
/* Same parameters as charset, but match any character that is |
not one of those specified. */ |
charset_not, |
/* Start remembering the text that is matched, for storing in a |
register. Followed by one byte with the register number, in |
the range 0 to one less than the pattern buffer's re_nsub |
field. Then followed by one byte with the number of groups |
inner to this one. (This last has to be part of the |
start_memory only because we need it in the on_failure_jump |
of re_match_2.) */ |
start_memory, |
/* Stop remembering the text that is matched and store it in a |
memory register. Followed by one byte with the register |
number, in the range 0 to one less than `re_nsub' in the |
pattern buffer, and one byte with the number of inner groups, |
just like `start_memory'. (We need the number of inner |
groups here because we don't have any easy way of finding the |
corresponding start_memory when we're at a stop_memory.) */ |
stop_memory, |
/* Match a duplicate of something remembered. Followed by one |
byte containing the register number. */ |
duplicate, |
/* Fail unless at beginning of line. */ |
begline, |
/* Fail unless at end of line. */ |
endline, |
/* Succeeds if at beginning of buffer (if emacs) or at beginning |
of string to be matched (if not). */ |
begbuf, |
/* Analogously, for end of buffer/string. */ |
endbuf, |
/* Followed by two byte relative address to which to jump. */ |
jump, |
/* Same as jump, but marks the end of an alternative. */ |
jump_past_alt, |
/* Followed by two-byte relative address of place to resume at |
in case of failure. */ |
/* ifdef MBS_SUPPORT, the size of address is 1. */ |
on_failure_jump, |
/* Like on_failure_jump, but pushes a placeholder instead of the |
current string position when executed. */ |
on_failure_keep_string_jump, |
/* Throw away latest failure point and then jump to following |
two-byte relative address. */ |
/* ifdef MBS_SUPPORT, the size of address is 1. */ |
pop_failure_jump, |
/* Change to pop_failure_jump if know won't have to backtrack to |
match; otherwise change to jump. This is used to jump |
back to the beginning of a repeat. If what follows this jump |
clearly won't match what the repeat does, such that we can be |
sure that there is no use backtracking out of repetitions |
already matched, then we change it to a pop_failure_jump. |
Followed by two-byte address. */ |
/* ifdef MBS_SUPPORT, the size of address is 1. */ |
maybe_pop_jump, |
/* Jump to following two-byte address, and push a dummy failure |
point. This failure point will be thrown away if an attempt |
is made to use it for a failure. A `+' construct makes this |
before the first repeat. Also used as an intermediary kind |
of jump when compiling an alternative. */ |
/* ifdef MBS_SUPPORT, the size of address is 1. */ |
dummy_failure_jump, |
/* Push a dummy failure point and continue. Used at the end of |
alternatives. */ |
push_dummy_failure, |
/* Followed by two-byte relative address and two-byte number n. |
After matching N times, jump to the address upon failure. */ |
/* ifdef MBS_SUPPORT, the size of address is 1. */ |
succeed_n, |
/* Followed by two-byte relative address, and two-byte number n. |
Jump to the address N times, then fail. */ |
/* ifdef MBS_SUPPORT, the size of address is 1. */ |
jump_n, |
/* Set the following two-byte relative address to the |
subsequent two-byte number. The address *includes* the two |
bytes of number. */ |
/* ifdef MBS_SUPPORT, the size of address is 1. */ |
set_number_at, |
wordchar, /* Matches any word-constituent character. */ |
notwordchar, /* Matches any char that is not a word-constituent. */ |
wordbeg, /* Succeeds if at word beginning. */ |
wordend, /* Succeeds if at word end. */ |
wordbound, /* Succeeds if at a word boundary. */ |
notwordbound /* Succeeds if not at a word boundary. */ |
# ifdef emacs |
,before_dot, /* Succeeds if before point. */ |
at_dot, /* Succeeds if at point. */ |
after_dot, /* Succeeds if after point. */ |
/* Matches any character whose syntax is specified. Followed by |
a byte which contains a syntax code, e.g., Sword. */ |
syntaxspec, |
/* Matches any character whose syntax is not that specified. */ |
notsyntaxspec |
# endif /* emacs */ |
} re_opcode_t; |
#endif /* not INSIDE_RECURSION */ |
#ifdef BYTE |
# define CHAR_T char |
# define UCHAR_T unsigned char |
# define COMPILED_BUFFER_VAR bufp->buffer |
# define OFFSET_ADDRESS_SIZE 2 |
# define PREFIX(name) byte_##name |
# define ARG_PREFIX(name) name |
# define PUT_CHAR(c) putchar (c) |
#else |
# ifdef WCHAR |
# define CHAR_T wchar_t |
# define UCHAR_T wchar_t |
# define COMPILED_BUFFER_VAR wc_buffer |
# define OFFSET_ADDRESS_SIZE 1 /* the size which STORE_NUMBER macro use */ |
# define CHAR_CLASS_SIZE ((__alignof__(wctype_t)+sizeof(wctype_t))/sizeof(CHAR_T)+1) |
# define PREFIX(name) wcs_##name |
# define ARG_PREFIX(name) c##name |
/* Should we use wide stream?? */ |
# define PUT_CHAR(c) printf ("%C", c); |
# define TRUE 1 |
# define FALSE 0 |
# else |
# ifdef MBS_SUPPORT |
# define WCHAR |
# define INSIDE_RECURSION |
# include "regex.c" |
# undef INSIDE_RECURSION |
# endif |
# define BYTE |
# define INSIDE_RECURSION |
# include "regex.c" |
# undef INSIDE_RECURSION |
# endif |
#endif |
#ifdef INSIDE_RECURSION |
/* Common operations on the compiled pattern. */ |
/* Store NUMBER in two contiguous bytes starting at DESTINATION. */ |
/* ifdef MBS_SUPPORT, we store NUMBER in 1 element. */ |
# ifdef WCHAR |
# define STORE_NUMBER(destination, number) \ |
do { \ |
*(destination) = (UCHAR_T)(number); \ |
} while (0) |
# else /* BYTE */ |
# define STORE_NUMBER(destination, number) \ |
do { \ |
(destination)[0] = (number) & 0377; \ |
(destination)[1] = (number) >> 8; \ |
} while (0) |
# endif /* WCHAR */ |
/* Same as STORE_NUMBER, except increment DESTINATION to |
the byte after where the number is stored. Therefore, DESTINATION |
must be an lvalue. */ |
/* ifdef MBS_SUPPORT, we store NUMBER in 1 element. */ |
# define STORE_NUMBER_AND_INCR(destination, number) \ |
do { \ |
STORE_NUMBER (destination, number); \ |
(destination) += OFFSET_ADDRESS_SIZE; \ |
} while (0) |
/* Put into DESTINATION a number stored in two contiguous bytes starting |
at SOURCE. */ |
/* ifdef MBS_SUPPORT, we store NUMBER in 1 element. */ |
# ifdef WCHAR |
# define EXTRACT_NUMBER(destination, source) \ |
do { \ |
(destination) = *(source); \ |
} while (0) |
# else /* BYTE */ |
# define EXTRACT_NUMBER(destination, source) \ |
do { \ |
(destination) = *(source) & 0377; \ |
(destination) += SIGN_EXTEND_CHAR (*((source) + 1)) << 8; \ |
} while (0) |
# endif |
# ifdef DEBUG |
static void PREFIX(extract_number) (int *dest, UCHAR_T *source); |
static void |
PREFIX(extract_number) (int *dest, UCHAR_T *source) |
{ |
# ifdef WCHAR |
*dest = *source; |
# else /* BYTE */ |
int temp = SIGN_EXTEND_CHAR (*(source + 1)); |
*dest = *source & 0377; |
*dest += temp << 8; |
# endif |
} |
# ifndef EXTRACT_MACROS /* To debug the macros. */ |
# undef EXTRACT_NUMBER |
# define EXTRACT_NUMBER(dest, src) PREFIX(extract_number) (&dest, src) |
# endif /* not EXTRACT_MACROS */ |
# endif /* DEBUG */ |
/* Same as EXTRACT_NUMBER, except increment SOURCE to after the number. |
SOURCE must be an lvalue. */ |
# define EXTRACT_NUMBER_AND_INCR(destination, source) \ |
do { \ |
EXTRACT_NUMBER (destination, source); \ |
(source) += OFFSET_ADDRESS_SIZE; \ |
} while (0) |
# ifdef DEBUG |
static void PREFIX(extract_number_and_incr) (int *destination, |
UCHAR_T **source); |
static void |
PREFIX(extract_number_and_incr) (int *destination, UCHAR_T **source) |
{ |
PREFIX(extract_number) (destination, *source); |
*source += OFFSET_ADDRESS_SIZE; |
} |
# ifndef EXTRACT_MACROS |
# undef EXTRACT_NUMBER_AND_INCR |
# define EXTRACT_NUMBER_AND_INCR(dest, src) \ |
PREFIX(extract_number_and_incr) (&dest, &src) |
# endif /* not EXTRACT_MACROS */ |
# endif /* DEBUG */ |
/* If DEBUG is defined, Regex prints many voluminous messages about what |
it is doing (if the variable `debug' is nonzero). If linked with the |
main program in `iregex.c', you can enter patterns and strings |
interactively. And if linked with the main program in `main.c' and |
the other test files, you can run the already-written tests. */ |
# ifdef DEBUG |
# ifndef DEFINED_ONCE |
/* We use standard I/O for debugging. */ |
# include <stdio.h> |
/* It is useful to test things that ``must'' be true when debugging. */ |
# include <assert.h> |
static int debug; |
# define DEBUG_STATEMENT(e) e |
# define DEBUG_PRINT1(x) if (debug) printf (x) |
# define DEBUG_PRINT2(x1, x2) if (debug) printf (x1, x2) |
# define DEBUG_PRINT3(x1, x2, x3) if (debug) printf (x1, x2, x3) |
# define DEBUG_PRINT4(x1, x2, x3, x4) if (debug) printf (x1, x2, x3, x4) |
# endif /* not DEFINED_ONCE */ |
# define DEBUG_PRINT_COMPILED_PATTERN(p, s, e) \ |
if (debug) PREFIX(print_partial_compiled_pattern) (s, e) |
# define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2) \ |
if (debug) PREFIX(print_double_string) (w, s1, sz1, s2, sz2) |
/* Print the fastmap in human-readable form. */ |
# ifndef DEFINED_ONCE |
void |
print_fastmap (char *fastmap) |
{ |
unsigned was_a_range = 0; |
unsigned i = 0; |
while (i < (1 << BYTEWIDTH)) |
{ |
if (fastmap[i++]) |
{ |
was_a_range = 0; |
putchar (i - 1); |
while (i < (1 << BYTEWIDTH) && fastmap[i]) |
{ |
was_a_range = 1; |
i++; |
} |
if (was_a_range) |
{ |
printf ("-"); |
putchar (i - 1); |
} |
} |
} |
putchar ('\n'); |
} |
# endif /* not DEFINED_ONCE */ |
/* Print a compiled pattern string in human-readable form, starting at |
the START pointer into it and ending just before the pointer END. */ |
void |
PREFIX(print_partial_compiled_pattern) (UCHAR_T *start, UCHAR_T *end) |
{ |
int mcnt, mcnt2; |
UCHAR_T *p1; |
UCHAR_T *p = start; |
UCHAR_T *pend = end; |
if (start == NULL) |
{ |
printf ("(null)\n"); |
return; |
} |
/* Loop over pattern commands. */ |
while (p < pend) |
{ |
# ifdef _LIBC |
printf ("%td:\t", p - start); |
# else |
printf ("%ld:\t", (long int) (p - start)); |
# endif |
switch ((re_opcode_t) *p++) |
{ |
case no_op: |
printf ("/no_op"); |
break; |
case exactn: |
mcnt = *p++; |
printf ("/exactn/%d", mcnt); |
do |
{ |
putchar ('/'); |
PUT_CHAR (*p++); |
} |
while (--mcnt); |
break; |
# ifdef MBS_SUPPORT |
case exactn_bin: |
mcnt = *p++; |
printf ("/exactn_bin/%d", mcnt); |
do |
{ |
printf("/%lx", (long int) *p++); |
} |
while (--mcnt); |
break; |
# endif /* MBS_SUPPORT */ |
case start_memory: |
mcnt = *p++; |
printf ("/start_memory/%d/%ld", mcnt, (long int) *p++); |
break; |
case stop_memory: |
mcnt = *p++; |
printf ("/stop_memory/%d/%ld", mcnt, (long int) *p++); |
break; |
case duplicate: |
printf ("/duplicate/%ld", (long int) *p++); |
break; |
case anychar: |
printf ("/anychar"); |
break; |
case charset: |
case charset_not: |
{ |
# ifdef WCHAR |
int i, length; |
wchar_t *workp = p; |
printf ("/charset [%s", |
(re_opcode_t) *(workp - 1) == charset_not ? "^" : ""); |
p += 5; |
length = *workp++; /* the length of char_classes */ |
for (i=0 ; i<length ; i++) |
printf("[:%lx:]", (long int) *p++); |
length = *workp++; /* the length of collating_symbol */ |
for (i=0 ; i<length ;) |
{ |
printf("[."); |
while(*p != 0) |
PUT_CHAR((i++,*p++)); |
i++,p++; |
printf(".]"); |
} |
length = *workp++; /* the length of equivalence_class */ |
for (i=0 ; i<length ;) |
{ |
printf("[="); |
while(*p != 0) |
PUT_CHAR((i++,*p++)); |
i++,p++; |
printf("=]"); |
} |
length = *workp++; /* the length of char_range */ |
for (i=0 ; i<length ; i++) |
{ |
wchar_t range_start = *p++; |
wchar_t range_end = *p++; |
printf("%C-%C", range_start, range_end); |
} |
length = *workp++; /* the length of char */ |
for (i=0 ; i<length ; i++) |
printf("%C", *p++); |
putchar (']'); |
# else |
register int c, last = -100; |
register int in_range = 0; |
printf ("/charset [%s", |
(re_opcode_t) *(p - 1) == charset_not ? "^" : ""); |
assert (p + *p < pend); |
for (c = 0; c < 256; c++) |
if (c / 8 < *p |
&& (p[1 + (c/8)] & (1 << (c % 8)))) |
{ |
/* Are we starting a range? */ |
if (last + 1 == c && ! in_range) |
{ |
putchar ('-'); |
in_range = 1; |
} |
/* Have we broken a range? */ |
else if (last + 1 != c && in_range) |
{ |
putchar (last); |
in_range = 0; |
} |
if (! in_range) |
putchar (c); |
last = c; |
} |
if (in_range) |
putchar (last); |
putchar (']'); |
p += 1 + *p; |
# endif /* WCHAR */ |
} |
break; |
case begline: |
printf ("/begline"); |
break; |
case endline: |
printf ("/endline"); |
break; |
case on_failure_jump: |
PREFIX(extract_number_and_incr) (&mcnt, &p); |
# ifdef _LIBC |
printf ("/on_failure_jump to %td", p + mcnt - start); |
# else |
printf ("/on_failure_jump to %ld", (long int) (p + mcnt - start)); |
# endif |
break; |
case on_failure_keep_string_jump: |
PREFIX(extract_number_and_incr) (&mcnt, &p); |
# ifdef _LIBC |
printf ("/on_failure_keep_string_jump to %td", p + mcnt - start); |
# else |
printf ("/on_failure_keep_string_jump to %ld", |
(long int) (p + mcnt - start)); |
# endif |
break; |
case dummy_failure_jump: |
PREFIX(extract_number_and_incr) (&mcnt, &p); |
# ifdef _LIBC |
printf ("/dummy_failure_jump to %td", p + mcnt - start); |
# else |
printf ("/dummy_failure_jump to %ld", (long int) (p + mcnt - start)); |
# endif |
break; |
case push_dummy_failure: |
printf ("/push_dummy_failure"); |
break; |
case maybe_pop_jump: |
PREFIX(extract_number_and_incr) (&mcnt, &p); |
# ifdef _LIBC |
printf ("/maybe_pop_jump to %td", p + mcnt - start); |
# else |
printf ("/maybe_pop_jump to %ld", (long int) (p + mcnt - start)); |
# endif |
break; |
case pop_failure_jump: |
PREFIX(extract_number_and_incr) (&mcnt, &p); |
# ifdef _LIBC |
printf ("/pop_failure_jump to %td", p + mcnt - start); |
# else |
printf ("/pop_failure_jump to %ld", (long int) (p + mcnt - start)); |
# endif |
break; |
case jump_past_alt: |
PREFIX(extract_number_and_incr) (&mcnt, &p); |
# ifdef _LIBC |
printf ("/jump_past_alt to %td", p + mcnt - start); |
# else |
printf ("/jump_past_alt to %ld", (long int) (p + mcnt - start)); |
# endif |
break; |
case jump: |
PREFIX(extract_number_and_incr) (&mcnt, &p); |
# ifdef _LIBC |
printf ("/jump to %td", p + mcnt - start); |
# else |
printf ("/jump to %ld", (long int) (p + mcnt - start)); |
# endif |
break; |
case succeed_n: |
PREFIX(extract_number_and_incr) (&mcnt, &p); |
p1 = p + mcnt; |
PREFIX(extract_number_and_incr) (&mcnt2, &p); |
# ifdef _LIBC |
printf ("/succeed_n to %td, %d times", p1 - start, mcnt2); |
# else |
printf ("/succeed_n to %ld, %d times", |
(long int) (p1 - start), mcnt2); |
# endif |
break; |
case jump_n: |
PREFIX(extract_number_and_incr) (&mcnt, &p); |
p1 = p + mcnt; |
PREFIX(extract_number_and_incr) (&mcnt2, &p); |
printf ("/jump_n to %d, %d times", p1 - start, mcnt2); |
break; |
case set_number_at: |
PREFIX(extract_number_and_incr) (&mcnt, &p); |
p1 = p + mcnt; |
PREFIX(extract_number_and_incr) (&mcnt2, &p); |
# ifdef _LIBC |
printf ("/set_number_at location %td to %d", p1 - start, mcnt2); |
# else |
printf ("/set_number_at location %ld to %d", |
(long int) (p1 - start), mcnt2); |
# endif |
break; |
case wordbound: |
printf ("/wordbound"); |
break; |
case notwordbound: |
printf ("/notwordbound"); |
break; |
case wordbeg: |
printf ("/wordbeg"); |
break; |
case wordend: |
printf ("/wordend"); |
break; |
# ifdef emacs |
case before_dot: |
printf ("/before_dot"); |
break; |
case at_dot: |
printf ("/at_dot"); |
break; |
case after_dot: |
printf ("/after_dot"); |
break; |
case syntaxspec: |
printf ("/syntaxspec"); |
mcnt = *p++; |
printf ("/%d", mcnt); |
break; |
case notsyntaxspec: |
printf ("/notsyntaxspec"); |
mcnt = *p++; |
printf ("/%d", mcnt); |
break; |
# endif /* emacs */ |
case wordchar: |
printf ("/wordchar"); |
break; |
case notwordchar: |
printf ("/notwordchar"); |
break; |
case begbuf: |
printf ("/begbuf"); |
break; |
case endbuf: |
printf ("/endbuf"); |
break; |
default: |
printf ("?%ld", (long int) *(p-1)); |
} |
putchar ('\n'); |
} |
# ifdef _LIBC |
printf ("%td:\tend of pattern.\n", p - start); |
# else |
printf ("%ld:\tend of pattern.\n", (long int) (p - start)); |
# endif |
} |
void |
PREFIX(print_compiled_pattern) (struct re_pattern_buffer *bufp) |
{ |
UCHAR_T *buffer = (UCHAR_T*) bufp->buffer; |
PREFIX(print_partial_compiled_pattern) (buffer, buffer |
+ bufp->used / sizeof(UCHAR_T)); |
printf ("%ld bytes used/%ld bytes allocated.\n", |
bufp->used, bufp->allocated); |
if (bufp->fastmap_accurate && bufp->fastmap) |
{ |
printf ("fastmap: "); |
print_fastmap (bufp->fastmap); |
} |
# ifdef _LIBC |
printf ("re_nsub: %Zd\t", bufp->re_nsub); |
# else |
printf ("re_nsub: %ld\t", (long int) bufp->re_nsub); |
# endif |
printf ("regs_alloc: %d\t", bufp->regs_allocated); |
printf ("can_be_null: %d\t", bufp->can_be_null); |
printf ("newline_anchor: %d\n", bufp->newline_anchor); |
printf ("no_sub: %d\t", bufp->no_sub); |
printf ("not_bol: %d\t", bufp->not_bol); |
printf ("not_eol: %d\t", bufp->not_eol); |
printf ("syntax: %lx\n", bufp->syntax); |
/* Perhaps we should print the translate table? */ |
} |
void |
PREFIX(print_double_string) (const CHAR_T *where, const CHAR_T *string1, |
int size1, const CHAR_T *string2, int size2) |
{ |
int this_char; |
if (where == NULL) |
printf ("(null)"); |
else |
{ |
int cnt; |
if (FIRST_STRING_P (where)) |
{ |
for (this_char = where - string1; this_char < size1; this_char++) |
PUT_CHAR (string1[this_char]); |
where = string2; |
} |
cnt = 0; |
for (this_char = where - string2; this_char < size2; this_char++) |
{ |
PUT_CHAR (string2[this_char]); |
if (++cnt > 100) |
{ |
fputs ("...", stdout); |
break; |
} |
} |
} |
} |
# ifndef DEFINED_ONCE |
void |
printchar (int c) |
{ |
putc (c, stderr); |
} |
# endif |
# else /* not DEBUG */ |
# ifndef DEFINED_ONCE |
# undef assert |
# define assert(e) |
# define DEBUG_STATEMENT(e) |
# define DEBUG_PRINT1(x) |
# define DEBUG_PRINT2(x1, x2) |
# define DEBUG_PRINT3(x1, x2, x3) |
# define DEBUG_PRINT4(x1, x2, x3, x4) |
# endif /* not DEFINED_ONCE */ |
# define DEBUG_PRINT_COMPILED_PATTERN(p, s, e) |
# define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2) |
# endif /* not DEBUG */ |
# ifdef WCHAR |
/* This convert a multibyte string to a wide character string. |
And write their correspondances to offset_buffer(see below) |
and write whether each wchar_t is binary data to is_binary. |
This assume invalid multibyte sequences as binary data. |
We assume offset_buffer and is_binary is already allocated |
enough space. */ |
static size_t convert_mbs_to_wcs (CHAR_T *dest, const unsigned char* src, |
size_t len, int *offset_buffer, |
char *is_binary); |
static size_t |
convert_mbs_to_wcs (CHAR_T *dest, const unsigned char*src, size_t len, |
int *offset_buffer, char *is_binary) |
/* It hold correspondances between src(char string) and |
dest(wchar_t string) for optimization. |
e.g. src = "xxxyzz" |
dest = {'X', 'Y', 'Z'} |
(each "xxx", "y" and "zz" represent one multibyte character |
corresponding to 'X', 'Y' and 'Z'.) |
offset_buffer = {0, 0+3("xxx"), 0+3+1("y"), 0+3+1+2("zz")} |
= {0, 3, 4, 6} |
*/ |
{ |
wchar_t *pdest = dest; |
const unsigned char *psrc = src; |
size_t wc_count = 0; |
mbstate_t mbs; |
int i, consumed; |
size_t mb_remain = len; |
size_t mb_count = 0; |
/* Initialize the conversion state. */ |
memset (&mbs, 0, sizeof (mbstate_t)); |
offset_buffer[0] = 0; |
for( ; mb_remain > 0 ; ++wc_count, ++pdest, mb_remain -= consumed, |
psrc += consumed) |
{ |
#ifdef _LIBC |
consumed = __mbrtowc (pdest, psrc, mb_remain, &mbs); |
#else |
consumed = mbrtowc (pdest, psrc, mb_remain, &mbs); |
#endif |
if (consumed <= 0) |
/* failed to convert. maybe src contains binary data. |
So we consume 1 byte manualy. */ |
{ |
*pdest = *psrc; |
consumed = 1; |
is_binary[wc_count] = TRUE; |
} |
else |
is_binary[wc_count] = FALSE; |
/* In sjis encoding, we use yen sign as escape character in |
place of reverse solidus. So we convert 0x5c(yen sign in |
sjis) to not 0xa5(yen sign in UCS2) but 0x5c(reverse |
solidus in UCS2). */ |
if (consumed == 1 && (int) *psrc == 0x5c && (int) *pdest == 0xa5) |
*pdest = (wchar_t) *psrc; |
offset_buffer[wc_count + 1] = mb_count += consumed; |
} |
/* Fill remain of the buffer with sentinel. */ |
for (i = wc_count + 1 ; i <= len ; i++) |
offset_buffer[i] = mb_count + 1; |
return wc_count; |
} |
# endif /* WCHAR */ |
#else /* not INSIDE_RECURSION */ |
/* Set by `re_set_syntax' to the current regexp syntax to recognize. Can |
also be assigned to arbitrarily: each pattern buffer stores its own |
syntax, so it can be changed between regex compilations. */ |
/* This has no initializer because initialized variables in Emacs |
become read-only after dumping. */ |
reg_syntax_t re_syntax_options; |
/* Specify the precise syntax of regexps for compilation. This provides |
for compatibility for various utilities which historically have |
different, incompatible syntaxes. |
The argument SYNTAX is a bit mask comprised of the various bits |
defined in regex.h. We return the old syntax. */ |
reg_syntax_t |
re_set_syntax (reg_syntax_t syntax) |
{ |
reg_syntax_t ret = re_syntax_options; |
re_syntax_options = syntax; |
# ifdef DEBUG |
if (syntax & RE_DEBUG) |
debug = 1; |
else if (debug) /* was on but now is not */ |
debug = 0; |
# endif /* DEBUG */ |
return ret; |
} |
# ifdef _LIBC |
weak_alias (__re_set_syntax, re_set_syntax) |
# endif |
/* This table gives an error message for each of the error codes listed |
in regex.h. Obviously the order here has to be same as there. |
POSIX doesn't require that we do anything for REG_NOERROR, |
but why not be nice? */ |
static const char *re_error_msgid[] = |
{ |
gettext_noop ("Success"), /* REG_NOERROR */ |
gettext_noop ("No match"), /* REG_NOMATCH */ |
gettext_noop ("Invalid regular expression"), /* REG_BADPAT */ |
gettext_noop ("Invalid collation character"), /* REG_ECOLLATE */ |
gettext_noop ("Invalid character class name"), /* REG_ECTYPE */ |
gettext_noop ("Trailing backslash"), /* REG_EESCAPE */ |
gettext_noop ("Invalid back reference"), /* REG_ESUBREG */ |
gettext_noop ("Unmatched [ or [^"), /* REG_EBRACK */ |
gettext_noop ("Unmatched ( or \\("), /* REG_EPAREN */ |
gettext_noop ("Unmatched \\{"), /* REG_EBRACE */ |
gettext_noop ("Invalid content of \\{\\}"), /* REG_BADBR */ |
gettext_noop ("Invalid range end"), /* REG_ERANGE */ |
gettext_noop ("Memory exhausted"), /* REG_ESPACE */ |
gettext_noop ("Invalid preceding regular expression"), /* REG_BADRPT */ |
gettext_noop ("Premature end of regular expression"), /* REG_EEND */ |
gettext_noop ("Regular expression too big"), /* REG_ESIZE */ |
gettext_noop ("Unmatched ) or \\)") /* REG_ERPAREN */ |
}; |
#endif /* INSIDE_RECURSION */ |
#ifndef DEFINED_ONCE |
/* Avoiding alloca during matching, to placate r_alloc. */ |
/* Define MATCH_MAY_ALLOCATE unless we need to make sure that the |
searching and matching functions should not call alloca. On some |
systems, alloca is implemented in terms of malloc, and if we're |
using the relocating allocator routines, then malloc could cause a |
relocation, which might (if the strings being searched are in the |
ralloc heap) shift the data out from underneath the regexp |
routines. |
Here's another reason to avoid allocation: Emacs |
processes input from X in a signal handler; processing X input may |
call malloc; if input arrives while a matching routine is calling |
malloc, then we're scrod. But Emacs can't just block input while |
calling matching routines; then we don't notice interrupts when |
they come in. So, Emacs blocks input around all regexp calls |
except the matching calls, which it leaves unprotected, in the |
faith that they will not malloc. */ |
/* Normally, this is fine. */ |
# define MATCH_MAY_ALLOCATE |
/* When using GNU C, we are not REALLY using the C alloca, no matter |
what config.h may say. So don't take precautions for it. */ |
# ifdef __GNUC__ |
# undef C_ALLOCA |
# endif |
/* The match routines may not allocate if (1) they would do it with malloc |
and (2) it's not safe for them to use malloc. |
Note that if REL_ALLOC is defined, matching would not use malloc for the |
failure stack, but we would still use it for the register vectors; |
so REL_ALLOC should not affect this. */ |
# if (defined C_ALLOCA || defined REGEX_MALLOC) && defined emacs |
# undef MATCH_MAY_ALLOCATE |
# endif |
#endif /* not DEFINED_ONCE */ |
#ifdef INSIDE_RECURSION |
/* Failure stack declarations and macros; both re_compile_fastmap and |
re_match_2 use a failure stack. These have to be macros because of |
REGEX_ALLOCATE_STACK. */ |
/* Number of failure points for which to initially allocate space |
when matching. If this number is exceeded, we allocate more |
space, so it is not a hard limit. */ |
# ifndef INIT_FAILURE_ALLOC |
# define INIT_FAILURE_ALLOC 5 |
# endif |
/* Roughly the maximum number of failure points on the stack. Would be |
exactly that if always used MAX_FAILURE_ITEMS items each time we failed. |
This is a variable only so users of regex can assign to it; we never |
change it ourselves. */ |
# ifdef INT_IS_16BIT |
# ifndef DEFINED_ONCE |
# if defined MATCH_MAY_ALLOCATE |
/* 4400 was enough to cause a crash on Alpha OSF/1, |
whose default stack limit is 2mb. */ |
long int re_max_failures = 4000; |
# else |
long int re_max_failures = 2000; |
# endif |
# endif |
union PREFIX(fail_stack_elt) |
{ |
UCHAR_T *pointer; |
long int integer; |
}; |
typedef union PREFIX(fail_stack_elt) PREFIX(fail_stack_elt_t); |
typedef struct |
{ |
PREFIX(fail_stack_elt_t) *stack; |
unsigned long int size; |
unsigned long int avail; /* Offset of next open position. */ |
} PREFIX(fail_stack_type); |
# else /* not INT_IS_16BIT */ |
# ifndef DEFINED_ONCE |
# if defined MATCH_MAY_ALLOCATE |
/* 4400 was enough to cause a crash on Alpha OSF/1, |
whose default stack limit is 2mb. */ |
int re_max_failures = 4000; |
# else |
int re_max_failures = 2000; |
# endif |
# endif |
union PREFIX(fail_stack_elt) |
{ |
UCHAR_T *pointer; |
int integer; |
}; |
typedef union PREFIX(fail_stack_elt) PREFIX(fail_stack_elt_t); |
typedef struct |
{ |
PREFIX(fail_stack_elt_t) *stack; |
unsigned size; |
unsigned avail; /* Offset of next open position. */ |
} PREFIX(fail_stack_type); |
# endif /* INT_IS_16BIT */ |
# ifndef DEFINED_ONCE |
# define FAIL_STACK_EMPTY() (fail_stack.avail == 0) |
# define FAIL_STACK_PTR_EMPTY() (fail_stack_ptr->avail == 0) |
# define FAIL_STACK_FULL() (fail_stack.avail == fail_stack.size) |
# endif |
/* Define macros to initialize and free the failure stack. |
Do `return -2' if the alloc fails. */ |
# ifdef MATCH_MAY_ALLOCATE |
# define INIT_FAIL_STACK() \ |
do { \ |
fail_stack.stack = (PREFIX(fail_stack_elt_t) *) \ |
REGEX_ALLOCATE_STACK (INIT_FAILURE_ALLOC * sizeof (PREFIX(fail_stack_elt_t))); \ |
\ |
if (fail_stack.stack == NULL) \ |
return -2; \ |
\ |
fail_stack.size = INIT_FAILURE_ALLOC; \ |
fail_stack.avail = 0; \ |
} while (0) |
# define RESET_FAIL_STACK() REGEX_FREE_STACK (fail_stack.stack) |
# else |
# define INIT_FAIL_STACK() \ |
do { \ |
fail_stack.avail = 0; \ |
} while (0) |
# define RESET_FAIL_STACK() |
# endif |
/* Double the size of FAIL_STACK, up to approximately `re_max_failures' items. |
Return 1 if succeeds, and 0 if either ran out of memory |
allocating space for it or it was already too large. |
REGEX_REALLOCATE_STACK requires `destination' be declared. */ |
# define DOUBLE_FAIL_STACK(fail_stack) \ |
((fail_stack).size > (unsigned) (re_max_failures * MAX_FAILURE_ITEMS) \ |
? 0 \ |
: ((fail_stack).stack = (PREFIX(fail_stack_elt_t) *) \ |
REGEX_REALLOCATE_STACK ((fail_stack).stack, \ |
(fail_stack).size * sizeof (PREFIX(fail_stack_elt_t)), \ |
((fail_stack).size << 1) * sizeof (PREFIX(fail_stack_elt_t))),\ |
\ |
(fail_stack).stack == NULL \ |
? 0 \ |
: ((fail_stack).size <<= 1, \ |
1))) |
/* Push pointer POINTER on FAIL_STACK. |
Return 1 if was able to do so and 0 if ran out of memory allocating |
space to do so. */ |
# define PUSH_PATTERN_OP(POINTER, FAIL_STACK) \ |
((FAIL_STACK_FULL () \ |
&& !DOUBLE_FAIL_STACK (FAIL_STACK)) \ |
? 0 \ |
: ((FAIL_STACK).stack[(FAIL_STACK).avail++].pointer = POINTER, \ |
1)) |
/* Push a pointer value onto the failure stack. |
Assumes the variable `fail_stack'. Probably should only |
be called from within `PUSH_FAILURE_POINT'. */ |
# define PUSH_FAILURE_POINTER(item) \ |
fail_stack.stack[fail_stack.avail++].pointer = (UCHAR_T *) (item) |
/* This pushes an integer-valued item onto the failure stack. |
Assumes the variable `fail_stack'. Probably should only |
be called from within `PUSH_FAILURE_POINT'. */ |
# define PUSH_FAILURE_INT(item) \ |
fail_stack.stack[fail_stack.avail++].integer = (item) |
/* Push a fail_stack_elt_t value onto the failure stack. |
Assumes the variable `fail_stack'. Probably should only |
be called from within `PUSH_FAILURE_POINT'. */ |
# define PUSH_FAILURE_ELT(item) \ |
fail_stack.stack[fail_stack.avail++] = (item) |
/* These three POP... operations complement the three PUSH... operations. |
All assume that `fail_stack' is nonempty. */ |
# define POP_FAILURE_POINTER() fail_stack.stack[--fail_stack.avail].pointer |
# define POP_FAILURE_INT() fail_stack.stack[--fail_stack.avail].integer |
# define POP_FAILURE_ELT() fail_stack.stack[--fail_stack.avail] |
/* Used to omit pushing failure point id's when we're not debugging. */ |
# ifdef DEBUG |
# define DEBUG_PUSH PUSH_FAILURE_INT |
# define DEBUG_POP(item_addr) *(item_addr) = POP_FAILURE_INT () |
# else |
# define DEBUG_PUSH(item) |
# define DEBUG_POP(item_addr) |
# endif |
/* Push the information about the state we will need |
if we ever fail back to it. |
Requires variables fail_stack, regstart, regend, reg_info, and |
num_regs_pushed be declared. DOUBLE_FAIL_STACK requires `destination' |
be declared. |
Does `return FAILURE_CODE' if runs out of memory. */ |
# define PUSH_FAILURE_POINT(pattern_place, string_place, failure_code) \ |
do { \ |
char *destination; \ |
/* Must be int, so when we don't save any registers, the arithmetic \ |
of 0 + -1 isn't done as unsigned. */ \ |
/* Can't be int, since there is not a shred of a guarantee that int \ |
is wide enough to hold a value of something to which pointer can \ |
be assigned */ \ |
active_reg_t this_reg; \ |
\ |
DEBUG_STATEMENT (failure_id++); \ |
DEBUG_STATEMENT (nfailure_points_pushed++); \ |
DEBUG_PRINT2 ("\nPUSH_FAILURE_POINT #%u:\n", failure_id); \ |
DEBUG_PRINT2 (" Before push, next avail: %d\n", (fail_stack).avail);\ |
DEBUG_PRINT2 (" size: %d\n", (fail_stack).size);\ |
\ |
DEBUG_PRINT2 (" slots needed: %ld\n", NUM_FAILURE_ITEMS); \ |
DEBUG_PRINT2 (" available: %d\n", REMAINING_AVAIL_SLOTS); \ |
\ |
/* Ensure we have enough space allocated for what we will push. */ \ |
while (REMAINING_AVAIL_SLOTS < NUM_FAILURE_ITEMS) \ |
{ \ |
if (!DOUBLE_FAIL_STACK (fail_stack)) \ |
return failure_code; \ |
\ |
DEBUG_PRINT2 ("\n Doubled stack; size now: %d\n", \ |
(fail_stack).size); \ |
DEBUG_PRINT2 (" slots available: %d\n", REMAINING_AVAIL_SLOTS);\ |
} \ |
\ |
/* Push the info, starting with the registers. */ \ |
DEBUG_PRINT1 ("\n"); \ |
\ |
if (1) \ |
for (this_reg = lowest_active_reg; this_reg <= highest_active_reg; \ |
this_reg++) \ |
{ \ |
DEBUG_PRINT2 (" Pushing reg: %lu\n", this_reg); \ |
DEBUG_STATEMENT (num_regs_pushed++); \ |
\ |
DEBUG_PRINT2 (" start: %p\n", regstart[this_reg]); \ |
PUSH_FAILURE_POINTER (regstart[this_reg]); \ |
\ |
DEBUG_PRINT2 (" end: %p\n", regend[this_reg]); \ |
PUSH_FAILURE_POINTER (regend[this_reg]); \ |
\ |
DEBUG_PRINT2 (" info: %p\n ", \ |
reg_info[this_reg].word.pointer); \ |
DEBUG_PRINT2 (" match_null=%d", \ |
REG_MATCH_NULL_STRING_P (reg_info[this_reg])); \ |
DEBUG_PRINT2 (" active=%d", IS_ACTIVE (reg_info[this_reg])); \ |
DEBUG_PRINT2 (" matched_something=%d", \ |
MATCHED_SOMETHING (reg_info[this_reg])); \ |
DEBUG_PRINT2 (" ever_matched=%d", \ |
EVER_MATCHED_SOMETHING (reg_info[this_reg])); \ |
DEBUG_PRINT1 ("\n"); \ |
PUSH_FAILURE_ELT (reg_info[this_reg].word); \ |
} \ |
\ |
DEBUG_PRINT2 (" Pushing low active reg: %ld\n", lowest_active_reg);\ |
PUSH_FAILURE_INT (lowest_active_reg); \ |
\ |
DEBUG_PRINT2 (" Pushing high active reg: %ld\n", highest_active_reg);\ |
PUSH_FAILURE_INT (highest_active_reg); \ |
\ |
DEBUG_PRINT2 (" Pushing pattern %p:\n", pattern_place); \ |
DEBUG_PRINT_COMPILED_PATTERN (bufp, pattern_place, pend); \ |
PUSH_FAILURE_POINTER (pattern_place); \ |
\ |
DEBUG_PRINT2 (" Pushing string %p: `", string_place); \ |
DEBUG_PRINT_DOUBLE_STRING (string_place, string1, size1, string2, \ |
size2); \ |
DEBUG_PRINT1 ("'\n"); \ |
PUSH_FAILURE_POINTER (string_place); \ |
\ |
DEBUG_PRINT2 (" Pushing failure id: %u\n", failure_id); \ |
DEBUG_PUSH (failure_id); \ |
} while (0) |
# ifndef DEFINED_ONCE |
/* This is the number of items that are pushed and popped on the stack |
for each register. */ |
# define NUM_REG_ITEMS 3 |
/* Individual items aside from the registers. */ |
# ifdef DEBUG |
# define NUM_NONREG_ITEMS 5 /* Includes failure point id. */ |
# else |
# define NUM_NONREG_ITEMS 4 |
# endif |
/* We push at most this many items on the stack. */ |
/* We used to use (num_regs - 1), which is the number of registers |
this regexp will save; but that was changed to 5 |
to avoid stack overflow for a regexp with lots of parens. */ |
# define MAX_FAILURE_ITEMS (5 * NUM_REG_ITEMS + NUM_NONREG_ITEMS) |
/* We actually push this many items. */ |
# define NUM_FAILURE_ITEMS \ |
(((0 \ |
? 0 : highest_active_reg - lowest_active_reg + 1) \ |
* NUM_REG_ITEMS) \ |
+ NUM_NONREG_ITEMS) |
/* How many items can still be added to the stack without overflowing it. */ |
# define REMAINING_AVAIL_SLOTS ((fail_stack).size - (fail_stack).avail) |
# endif /* not DEFINED_ONCE */ |
/* Pops what PUSH_FAIL_STACK pushes. |
We restore into the parameters, all of which should be lvalues: |
STR -- the saved data position. |
PAT -- the saved pattern position. |
LOW_REG, HIGH_REG -- the highest and lowest active registers. |
REGSTART, REGEND -- arrays of string positions. |
REG_INFO -- array of information about each subexpression. |
Also assumes the variables `fail_stack' and (if debugging), `bufp', |
`pend', `string1', `size1', `string2', and `size2'. */ |
# define POP_FAILURE_POINT(str, pat, low_reg, high_reg, regstart, regend, reg_info)\ |
{ \ |
DEBUG_STATEMENT (unsigned failure_id;) \ |
active_reg_t this_reg; \ |
const UCHAR_T *string_temp; \ |
\ |
assert (!FAIL_STACK_EMPTY ()); \ |
\ |
/* Remove failure points and point to how many regs pushed. */ \ |
DEBUG_PRINT1 ("POP_FAILURE_POINT:\n"); \ |
DEBUG_PRINT2 (" Before pop, next avail: %d\n", fail_stack.avail); \ |
DEBUG_PRINT2 (" size: %d\n", fail_stack.size); \ |
\ |
assert (fail_stack.avail >= NUM_NONREG_ITEMS); \ |
\ |
DEBUG_POP (&failure_id); \ |
DEBUG_PRINT2 (" Popping failure id: %u\n", failure_id); \ |
\ |
/* If the saved string location is NULL, it came from an \ |
on_failure_keep_string_jump opcode, and we want to throw away the \ |
saved NULL, thus retaining our current position in the string. */ \ |
string_temp = POP_FAILURE_POINTER (); \ |
if (string_temp != NULL) \ |
str = (const CHAR_T *) string_temp; \ |
\ |
DEBUG_PRINT2 (" Popping string %p: `", str); \ |
DEBUG_PRINT_DOUBLE_STRING (str, string1, size1, string2, size2); \ |
DEBUG_PRINT1 ("'\n"); \ |
\ |
pat = (UCHAR_T *) POP_FAILURE_POINTER (); \ |
DEBUG_PRINT2 (" Popping pattern %p:\n", pat); \ |
DEBUG_PRINT_COMPILED_PATTERN (bufp, pat, pend); \ |
\ |
/* Restore register info. */ \ |
high_reg = (active_reg_t) POP_FAILURE_INT (); \ |
DEBUG_PRINT2 (" Popping high active reg: %ld\n", high_reg); \ |
\ |
low_reg = (active_reg_t) POP_FAILURE_INT (); \ |
DEBUG_PRINT2 (" Popping low active reg: %ld\n", low_reg); \ |
\ |
if (1) \ |
for (this_reg = high_reg; this_reg >= low_reg; this_reg--) \ |
{ \ |
DEBUG_PRINT2 (" Popping reg: %ld\n", this_reg); \ |
\ |
reg_info[this_reg].word = POP_FAILURE_ELT (); \ |
DEBUG_PRINT2 (" info: %p\n", \ |
reg_info[this_reg].word.pointer); \ |
\ |
regend[this_reg] = (const CHAR_T *) POP_FAILURE_POINTER (); \ |
DEBUG_PRINT2 (" end: %p\n", regend[this_reg]); \ |
\ |
regstart[this_reg] = (const CHAR_T *) POP_FAILURE_POINTER (); \ |
DEBUG_PRINT2 (" start: %p\n", regstart[this_reg]); \ |
} \ |
else \ |
{ \ |
for (this_reg = highest_active_reg; this_reg > high_reg; this_reg--) \ |
{ \ |
reg_info[this_reg].word.integer = 0; \ |
regend[this_reg] = 0; \ |
regstart[this_reg] = 0; \ |
} \ |
highest_active_reg = high_reg; \ |
} \ |
\ |
set_regs_matched_done = 0; \ |
DEBUG_STATEMENT (nfailure_points_popped++); \ |
} /* POP_FAILURE_POINT */ |
/* Structure for per-register (a.k.a. per-group) information. |
Other register information, such as the |
starting and ending positions (which are addresses), and the list of |
inner groups (which is a bits list) are maintained in separate |
variables. |
We are making a (strictly speaking) nonportable assumption here: that |
the compiler will pack our bit fields into something that fits into |
the type of `word', i.e., is something that fits into one item on the |
failure stack. */ |
/* Declarations and macros for re_match_2. */ |
typedef union |
{ |
PREFIX(fail_stack_elt_t) word; |
struct |
{ |
/* This field is one if this group can match the empty string, |
zero if not. If not yet determined, `MATCH_NULL_UNSET_VALUE'. */ |
# define MATCH_NULL_UNSET_VALUE 3 |
unsigned match_null_string_p : 2; |
unsigned is_active : 1; |
unsigned matched_something : 1; |
unsigned ever_matched_something : 1; |
} bits; |
} PREFIX(register_info_type); |
# ifndef DEFINED_ONCE |
# define REG_MATCH_NULL_STRING_P(R) ((R).bits.match_null_string_p) |
# define IS_ACTIVE(R) ((R).bits.is_active) |
# define MATCHED_SOMETHING(R) ((R).bits.matched_something) |
# define EVER_MATCHED_SOMETHING(R) ((R).bits.ever_matched_something) |
/* Call this when have matched a real character; it sets `matched' flags |
for the subexpressions which we are currently inside. Also records |
that those subexprs have matched. */ |
# define SET_REGS_MATCHED() \ |
do \ |
{ \ |
if (!set_regs_matched_done) \ |
{ \ |
active_reg_t r; \ |
set_regs_matched_done = 1; \ |
for (r = lowest_active_reg; r <= highest_active_reg; r++) \ |
{ \ |
MATCHED_SOMETHING (reg_info[r]) \ |
= EVER_MATCHED_SOMETHING (reg_info[r]) \ |
= 1; \ |
} \ |
} \ |
} \ |
while (0) |
# endif /* not DEFINED_ONCE */ |
/* Registers are set to a sentinel when they haven't yet matched. */ |
static CHAR_T PREFIX(reg_unset_dummy); |
# define REG_UNSET_VALUE (&PREFIX(reg_unset_dummy)) |
# define REG_UNSET(e) ((e) == REG_UNSET_VALUE) |
/* Subroutine declarations and macros for regex_compile. */ |
static void PREFIX(store_op1) (re_opcode_t op, UCHAR_T *loc, int arg); |
static void PREFIX(store_op2) (re_opcode_t op, UCHAR_T *loc, |
int arg1, int arg2); |
static void PREFIX(insert_op1) (re_opcode_t op, UCHAR_T *loc, |
int arg, UCHAR_T *end); |
static void PREFIX(insert_op2) (re_opcode_t op, UCHAR_T *loc, |
int arg1, int arg2, UCHAR_T *end); |
static boolean PREFIX(at_begline_loc_p) (const CHAR_T *pattern, |
const CHAR_T *p, |
reg_syntax_t syntax); |
static boolean PREFIX(at_endline_loc_p) (const CHAR_T *p, |
const CHAR_T *pend, |
reg_syntax_t syntax); |
# ifdef WCHAR |
static reg_errcode_t wcs_compile_range (CHAR_T range_start, |
const CHAR_T **p_ptr, |
const CHAR_T *pend, |
char *translate, |
reg_syntax_t syntax, |
UCHAR_T *b, |
CHAR_T *char_set); |
static void insert_space (int num, CHAR_T *loc, CHAR_T *end); |
# else /* BYTE */ |
static reg_errcode_t byte_compile_range (unsigned int range_start, |
const char **p_ptr, |
const char *pend, |
char *translate, |
reg_syntax_t syntax, |
unsigned char *b); |
# endif /* WCHAR */ |
/* Fetch the next character in the uncompiled pattern---translating it |
if necessary. Also cast from a signed character in the constant |
string passed to us by the user to an unsigned char that we can use |
as an array index (in, e.g., `translate'). */ |
/* ifdef MBS_SUPPORT, we translate only if character <= 0xff, |
because it is impossible to allocate 4GB array for some encodings |
which have 4 byte character_set like UCS4. */ |
# ifndef PATFETCH |
# ifdef WCHAR |
# define PATFETCH(c) \ |
do {if (p == pend) return REG_EEND; \ |
c = (UCHAR_T) *p++; \ |
if (translate && (c <= 0xff)) c = (UCHAR_T) translate[c]; \ |
} while (0) |
# else /* BYTE */ |
# define PATFETCH(c) \ |
do {if (p == pend) return REG_EEND; \ |
c = (unsigned char) *p++; \ |
if (translate) c = (unsigned char) translate[c]; \ |
} while (0) |
# endif /* WCHAR */ |
# endif |
/* Fetch the next character in the uncompiled pattern, with no |
translation. */ |
# define PATFETCH_RAW(c) \ |
do {if (p == pend) return REG_EEND; \ |
c = (UCHAR_T) *p++; \ |
} while (0) |
/* Go backwards one character in the pattern. */ |
# define PATUNFETCH p-- |
/* If `translate' is non-null, return translate[D], else just D. We |
cast the subscript to translate because some data is declared as |
`char *', to avoid warnings when a string constant is passed. But |
when we use a character as a subscript we must make it unsigned. */ |
/* ifdef MBS_SUPPORT, we translate only if character <= 0xff, |
because it is impossible to allocate 4GB array for some encodings |
which have 4 byte character_set like UCS4. */ |
# ifndef TRANSLATE |
# ifdef WCHAR |
# define TRANSLATE(d) \ |
((translate && ((UCHAR_T) (d)) <= 0xff) \ |
? (char) translate[(unsigned char) (d)] : (d)) |
# else /* BYTE */ |
# define TRANSLATE(d) \ |
(translate ? (char) translate[(unsigned char) (d)] : (char) (d)) |
# endif /* WCHAR */ |
# endif |
/* Macros for outputting the compiled pattern into `buffer'. */ |
/* If the buffer isn't allocated when it comes in, use this. */ |
# define INIT_BUF_SIZE (32 * sizeof(UCHAR_T)) |
/* Make sure we have at least N more bytes of space in buffer. */ |
# ifdef WCHAR |
# define GET_BUFFER_SPACE(n) \ |
while (((unsigned long)b - (unsigned long)COMPILED_BUFFER_VAR \ |
+ (n)*sizeof(CHAR_T)) > bufp->allocated) \ |
EXTEND_BUFFER () |
# else /* BYTE */ |
# define GET_BUFFER_SPACE(n) \ |
while ((unsigned long) (b - bufp->buffer + (n)) > bufp->allocated) \ |
EXTEND_BUFFER () |
# endif /* WCHAR */ |
/* Make sure we have one more byte of buffer space and then add C to it. */ |
# define BUF_PUSH(c) \ |
do { \ |
GET_BUFFER_SPACE (1); \ |
*b++ = (UCHAR_T) (c); \ |
} while (0) |
/* Ensure we have two more bytes of buffer space and then append C1 and C2. */ |
# define BUF_PUSH_2(c1, c2) \ |
do { \ |
GET_BUFFER_SPACE (2); \ |
*b++ = (UCHAR_T) (c1); \ |
*b++ = (UCHAR_T) (c2); \ |
} while (0) |
/* As with BUF_PUSH_2, except for three bytes. */ |
# define BUF_PUSH_3(c1, c2, c3) \ |
do { \ |
GET_BUFFER_SPACE (3); \ |
*b++ = (UCHAR_T) (c1); \ |
*b++ = (UCHAR_T) (c2); \ |
*b++ = (UCHAR_T) (c3); \ |
} while (0) |
/* Store a jump with opcode OP at LOC to location TO. We store a |
relative address offset by the three bytes the jump itself occupies. */ |
# define STORE_JUMP(op, loc, to) \ |
PREFIX(store_op1) (op, loc, (int) ((to) - (loc) - (1 + OFFSET_ADDRESS_SIZE))) |
/* Likewise, for a two-argument jump. */ |
# define STORE_JUMP2(op, loc, to, arg) \ |
PREFIX(store_op2) (op, loc, (int) ((to) - (loc) - (1 + OFFSET_ADDRESS_SIZE)), arg) |
/* Like `STORE_JUMP', but for inserting. Assume `b' is the buffer end. */ |
# define INSERT_JUMP(op, loc, to) \ |
PREFIX(insert_op1) (op, loc, (int) ((to) - (loc) - (1 + OFFSET_ADDRESS_SIZE)), b) |
/* Like `STORE_JUMP2', but for inserting. Assume `b' is the buffer end. */ |
# define INSERT_JUMP2(op, loc, to, arg) \ |
PREFIX(insert_op2) (op, loc, (int) ((to) - (loc) - (1 + OFFSET_ADDRESS_SIZE)),\ |
arg, b) |
/* This is not an arbitrary limit: the arguments which represent offsets |
into the pattern are two bytes long. So if 2^16 bytes turns out to |
be too small, many things would have to change. */ |
/* Any other compiler which, like MSC, has allocation limit below 2^16 |
bytes will have to use approach similar to what was done below for |
MSC and drop MAX_BUF_SIZE a bit. Otherwise you may end up |
reallocating to 0 bytes. Such thing is not going to work too well. |
You have been warned!! */ |
# ifndef DEFINED_ONCE |
# if defined _MSC_VER && !defined WIN32 |
/* Microsoft C 16-bit versions limit malloc to approx 65512 bytes. |
The REALLOC define eliminates a flurry of conversion warnings, |
but is not required. */ |
# define MAX_BUF_SIZE 65500L |
# define REALLOC(p,s) realloc ((p), (size_t) (s)) |
# else |
# define MAX_BUF_SIZE (1L << 16) |
# define REALLOC(p,s) realloc ((p), (s)) |
# endif |
/* Extend the buffer by twice its current size via realloc and |
reset the pointers that pointed into the old block to point to the |
correct places in the new one. If extending the buffer results in it |
being larger than MAX_BUF_SIZE, then flag memory exhausted. */ |
# if __BOUNDED_POINTERS__ |
# define SET_HIGH_BOUND(P) (__ptrhigh (P) = __ptrlow (P) + bufp->allocated) |
# define MOVE_BUFFER_POINTER(P) \ |
(__ptrlow (P) += incr, SET_HIGH_BOUND (P), __ptrvalue (P) += incr) |
# define ELSE_EXTEND_BUFFER_HIGH_BOUND \ |
else \ |
{ \ |
SET_HIGH_BOUND (b); \ |
SET_HIGH_BOUND (begalt); \ |
if (fixup_alt_jump) \ |
SET_HIGH_BOUND (fixup_alt_jump); \ |
if (laststart) \ |
SET_HIGH_BOUND (laststart); \ |
if (pending_exact) \ |
SET_HIGH_BOUND (pending_exact); \ |
} |
# else |
# define MOVE_BUFFER_POINTER(P) (P) += incr |
# define ELSE_EXTEND_BUFFER_HIGH_BOUND |
# endif |
# endif /* not DEFINED_ONCE */ |
# ifdef WCHAR |
# define EXTEND_BUFFER() \ |
do { \ |
UCHAR_T *old_buffer = COMPILED_BUFFER_VAR; \ |
int wchar_count; \ |
if (bufp->allocated + sizeof(UCHAR_T) > MAX_BUF_SIZE) \ |
return REG_ESIZE; \ |
bufp->allocated <<= 1; \ |
if (bufp->allocated > MAX_BUF_SIZE) \ |
bufp->allocated = MAX_BUF_SIZE; \ |
/* How many characters the new buffer can have? */ \ |
wchar_count = bufp->allocated / sizeof(UCHAR_T); \ |
if (wchar_count == 0) wchar_count = 1; \ |
/* Truncate the buffer to CHAR_T align. */ \ |
bufp->allocated = wchar_count * sizeof(UCHAR_T); \ |
RETALLOC (COMPILED_BUFFER_VAR, wchar_count, UCHAR_T); \ |
bufp->buffer = (char*)COMPILED_BUFFER_VAR; \ |
if (COMPILED_BUFFER_VAR == NULL) \ |
return REG_ESPACE; \ |
/* If the buffer moved, move all the pointers into it. */ \ |
if (old_buffer != COMPILED_BUFFER_VAR) \ |
{ \ |
PTR_INT_TYPE incr = COMPILED_BUFFER_VAR - old_buffer; \ |
MOVE_BUFFER_POINTER (b); \ |
MOVE_BUFFER_POINTER (begalt); \ |
if (fixup_alt_jump) \ |
MOVE_BUFFER_POINTER (fixup_alt_jump); \ |
if (laststart) \ |
MOVE_BUFFER_POINTER (laststart); \ |
if (pending_exact) \ |
MOVE_BUFFER_POINTER (pending_exact); \ |
} \ |
ELSE_EXTEND_BUFFER_HIGH_BOUND \ |
} while (0) |
# else /* BYTE */ |
# define EXTEND_BUFFER() \ |
do { \ |
UCHAR_T *old_buffer = COMPILED_BUFFER_VAR; \ |
if (bufp->allocated == MAX_BUF_SIZE) \ |
return REG_ESIZE; \ |
bufp->allocated <<= 1; \ |
if (bufp->allocated > MAX_BUF_SIZE) \ |
bufp->allocated = MAX_BUF_SIZE; \ |
bufp->buffer = (UCHAR_T *) REALLOC (COMPILED_BUFFER_VAR, \ |
bufp->allocated); \ |
if (COMPILED_BUFFER_VAR == NULL) \ |
return REG_ESPACE; \ |
/* If the buffer moved, move all the pointers into it. */ \ |
if (old_buffer != COMPILED_BUFFER_VAR) \ |
{ \ |
PTR_INT_TYPE incr = COMPILED_BUFFER_VAR - old_buffer; \ |
MOVE_BUFFER_POINTER (b); \ |
MOVE_BUFFER_POINTER (begalt); \ |
if (fixup_alt_jump) \ |
MOVE_BUFFER_POINTER (fixup_alt_jump); \ |
if (laststart) \ |
MOVE_BUFFER_POINTER (laststart); \ |
if (pending_exact) \ |
MOVE_BUFFER_POINTER (pending_exact); \ |
} \ |
ELSE_EXTEND_BUFFER_HIGH_BOUND \ |
} while (0) |
# endif /* WCHAR */ |
# ifndef DEFINED_ONCE |
/* Since we have one byte reserved for the register number argument to |
{start,stop}_memory, the maximum number of groups we can report |
things about is what fits in that byte. */ |
# define MAX_REGNUM 255 |
/* But patterns can have more than `MAX_REGNUM' registers. We just |
ignore the excess. */ |
typedef unsigned regnum_t; |
/* Macros for the compile stack. */ |
/* Since offsets can go either forwards or backwards, this type needs to |
be able to hold values from -(MAX_BUF_SIZE - 1) to MAX_BUF_SIZE - 1. */ |
/* int may be not enough when sizeof(int) == 2. */ |
typedef long pattern_offset_t; |
typedef struct |
{ |
pattern_offset_t begalt_offset; |
pattern_offset_t fixup_alt_jump; |
pattern_offset_t inner_group_offset; |
pattern_offset_t laststart_offset; |
regnum_t regnum; |
} compile_stack_elt_t; |
typedef struct |
{ |
compile_stack_elt_t *stack; |
unsigned size; |
unsigned avail; /* Offset of next open position. */ |
} compile_stack_type; |
# define INIT_COMPILE_STACK_SIZE 32 |
# define COMPILE_STACK_EMPTY (compile_stack.avail == 0) |
# define COMPILE_STACK_FULL (compile_stack.avail == compile_stack.size) |
/* The next available element. */ |
# define COMPILE_STACK_TOP (compile_stack.stack[compile_stack.avail]) |
# endif /* not DEFINED_ONCE */ |
/* Set the bit for character C in a list. */ |
# ifndef DEFINED_ONCE |
# define SET_LIST_BIT(c) \ |
(b[((unsigned char) (c)) / BYTEWIDTH] \ |
|= 1 << (((unsigned char) c) % BYTEWIDTH)) |
# endif /* DEFINED_ONCE */ |
/* Get the next unsigned number in the uncompiled pattern. */ |
# define GET_UNSIGNED_NUMBER(num) \ |
{ \ |
while (p != pend) \ |
{ \ |
PATFETCH (c); \ |
if (c < '0' || c > '9') \ |
break; \ |
if (num <= RE_DUP_MAX) \ |
{ \ |
if (num < 0) \ |
num = 0; \ |
num = num * 10 + c - '0'; \ |
} \ |
} \ |
} |
# ifndef DEFINED_ONCE |
# if defined _LIBC || WIDE_CHAR_SUPPORT |
/* The GNU C library provides support for user-defined character classes |
and the functions from ISO C amendement 1. */ |
# ifdef CHARCLASS_NAME_MAX |
# define CHAR_CLASS_MAX_LENGTH CHARCLASS_NAME_MAX |
# else |
/* This shouldn't happen but some implementation might still have this |
problem. Use a reasonable default value. */ |
# define CHAR_CLASS_MAX_LENGTH 256 |
# endif |
# ifdef _LIBC |
# define IS_CHAR_CLASS(string) __wctype (string) |
# else |
# define IS_CHAR_CLASS(string) wctype (string) |
# endif |
# else |
# define CHAR_CLASS_MAX_LENGTH 6 /* Namely, `xdigit'. */ |
# define IS_CHAR_CLASS(string) \ |
(STREQ (string, "alpha") || STREQ (string, "upper") \ |
|| STREQ (string, "lower") || STREQ (string, "digit") \ |
|| STREQ (string, "alnum") || STREQ (string, "xdigit") \ |
|| STREQ (string, "space") || STREQ (string, "print") \ |
|| STREQ (string, "punct") || STREQ (string, "graph") \ |
|| STREQ (string, "cntrl") || STREQ (string, "blank")) |
# endif |
# endif /* DEFINED_ONCE */ |
# ifndef MATCH_MAY_ALLOCATE |
/* If we cannot allocate large objects within re_match_2_internal, |
we make the fail stack and register vectors global. |
The fail stack, we grow to the maximum size when a regexp |
is compiled. |
The register vectors, we adjust in size each time we |
compile a regexp, according to the number of registers it needs. */ |
static PREFIX(fail_stack_type) fail_stack; |
/* Size with which the following vectors are currently allocated. |
That is so we can make them bigger as needed, |
but never make them smaller. */ |
# ifdef DEFINED_ONCE |
static int regs_allocated_size; |
static const char ** regstart, ** regend; |
static const char ** old_regstart, ** old_regend; |
static const char **best_regstart, **best_regend; |
static const char **reg_dummy; |
# endif /* DEFINED_ONCE */ |
static PREFIX(register_info_type) *PREFIX(reg_info); |
static PREFIX(register_info_type) *PREFIX(reg_info_dummy); |
/* Make the register vectors big enough for NUM_REGS registers, |
but don't make them smaller. */ |
static void |
PREFIX(regex_grow_registers) (int num_regs) |
{ |
if (num_regs > regs_allocated_size) |
{ |
RETALLOC_IF (regstart, num_regs, const char *); |
RETALLOC_IF (regend, num_regs, const char *); |
RETALLOC_IF (old_regstart, num_regs, const char *); |
RETALLOC_IF (old_regend, num_regs, const char *); |
RETALLOC_IF (best_regstart, num_regs, const char *); |
RETALLOC_IF (best_regend, num_regs, const char *); |
RETALLOC_IF (PREFIX(reg_info), num_regs, PREFIX(register_info_type)); |
RETALLOC_IF (reg_dummy, num_regs, const char *); |
RETALLOC_IF (PREFIX(reg_info_dummy), num_regs, PREFIX(register_info_type)); |
regs_allocated_size = num_regs; |
} |
} |
# endif /* not MATCH_MAY_ALLOCATE */ |
# ifndef DEFINED_ONCE |
static boolean group_in_compile_stack (compile_stack_type compile_stack, |
regnum_t regnum); |
# endif /* not DEFINED_ONCE */ |
/* `regex_compile' compiles PATTERN (of length SIZE) according to SYNTAX. |
Returns one of error codes defined in `regex.h', or zero for success. |
Assumes the `allocated' (and perhaps `buffer') and `translate' |
fields are set in BUFP on entry. |
If it succeeds, results are put in BUFP (if it returns an error, the |
contents of BUFP are undefined): |
`buffer' is the compiled pattern; |
`syntax' is set to SYNTAX; |
`used' is set to the length of the compiled pattern; |
`fastmap_accurate' is zero; |
`re_nsub' is the number of subexpressions in PATTERN; |
`not_bol' and `not_eol' are zero; |
The `fastmap' and `newline_anchor' fields are neither |
examined nor set. */ |
/* Return, freeing storage we allocated. */ |
# ifdef WCHAR |
# define FREE_STACK_RETURN(value) \ |
return (free(pattern), free(mbs_offset), free(is_binary), free (compile_stack.stack), value) |
# else |
# define FREE_STACK_RETURN(value) \ |
return (free (compile_stack.stack), value) |
# endif /* WCHAR */ |
static reg_errcode_t |
PREFIX(regex_compile) (const char *ARG_PREFIX(pattern), |
size_t ARG_PREFIX(size), reg_syntax_t syntax, |
struct re_pattern_buffer *bufp) |
{ |
/* We fetch characters from PATTERN here. Even though PATTERN is |
`char *' (i.e., signed), we declare these variables as unsigned, so |
they can be reliably used as array indices. */ |
register UCHAR_T c, c1; |
#ifdef WCHAR |
/* A temporary space to keep wchar_t pattern and compiled pattern. */ |
CHAR_T *pattern, *COMPILED_BUFFER_VAR; |
size_t size; |
/* offset buffer for optimization. See convert_mbs_to_wc. */ |
int *mbs_offset = NULL; |
/* It hold whether each wchar_t is binary data or not. */ |
char *is_binary = NULL; |
/* A flag whether exactn is handling binary data or not. */ |
char is_exactn_bin = FALSE; |
#endif /* WCHAR */ |
/* A random temporary spot in PATTERN. */ |
const CHAR_T *p1; |
/* Points to the end of the buffer, where we should append. */ |
register UCHAR_T *b; |
/* Keeps track of unclosed groups. */ |
compile_stack_type compile_stack; |
/* Points to the current (ending) position in the pattern. */ |
#ifdef WCHAR |
const CHAR_T *p; |
const CHAR_T *pend; |
#else /* BYTE */ |
const CHAR_T *p = pattern; |
const CHAR_T *pend = pattern + size; |
#endif /* WCHAR */ |
/* How to translate the characters in the pattern. */ |
RE_TRANSLATE_TYPE translate = bufp->translate; |
/* Address of the count-byte of the most recently inserted `exactn' |
command. This makes it possible to tell if a new exact-match |
character can be added to that command or if the character requires |
a new `exactn' command. */ |
UCHAR_T *pending_exact = 0; |
/* Address of start of the most recently finished expression. |
This tells, e.g., postfix * where to find the start of its |
operand. Reset at the beginning of groups and alternatives. */ |
UCHAR_T *laststart = 0; |
/* Address of beginning of regexp, or inside of last group. */ |
UCHAR_T *begalt; |
/* Address of the place where a forward jump should go to the end of |
the containing expression. Each alternative of an `or' -- except the |
last -- ends with a forward jump of this sort. */ |
UCHAR_T *fixup_alt_jump = 0; |
/* Counts open-groups as they are encountered. Remembered for the |
matching close-group on the compile stack, so the same register |
number is put in the stop_memory as the start_memory. */ |
regnum_t regnum = 0; |
#ifdef WCHAR |
/* Initialize the wchar_t PATTERN and offset_buffer. */ |
p = pend = pattern = TALLOC(csize + 1, CHAR_T); |
mbs_offset = TALLOC(csize + 1, int); |
is_binary = TALLOC(csize + 1, char); |
if (pattern == NULL || mbs_offset == NULL || is_binary == NULL) |
{ |
free(pattern); |
free(mbs_offset); |
free(is_binary); |
return REG_ESPACE; |
} |
pattern[csize] = L'\0'; /* sentinel */ |
size = convert_mbs_to_wcs(pattern, cpattern, csize, mbs_offset, is_binary); |
pend = p + size; |
if (size < 0) |
{ |
free(pattern); |
free(mbs_offset); |
free(is_binary); |
return REG_BADPAT; |
} |
#endif |
#ifdef DEBUG |
DEBUG_PRINT1 ("\nCompiling pattern: "); |
if (debug) |
{ |
unsigned debug_count; |
for (debug_count = 0; debug_count < size; debug_count++) |
PUT_CHAR (pattern[debug_count]); |
putchar ('\n'); |
} |
#endif /* DEBUG */ |
/* Initialize the compile stack. */ |
compile_stack.stack = TALLOC (INIT_COMPILE_STACK_SIZE, compile_stack_elt_t); |
if (compile_stack.stack == NULL) |
{ |
#ifdef WCHAR |
free(pattern); |
free(mbs_offset); |
free(is_binary); |
#endif |
return REG_ESPACE; |
} |
compile_stack.size = INIT_COMPILE_STACK_SIZE; |
compile_stack.avail = 0; |
/* Initialize the pattern buffer. */ |
bufp->syntax = syntax; |
bufp->fastmap_accurate = 0; |
bufp->not_bol = bufp->not_eol = 0; |
/* Set `used' to zero, so that if we return an error, the pattern |
printer (for debugging) will think there's no pattern. We reset it |
at the end. */ |
bufp->used = 0; |
/* Always count groups, whether or not bufp->no_sub is set. */ |
bufp->re_nsub = 0; |
#if !defined emacs && !defined SYNTAX_TABLE |
/* Initialize the syntax table. */ |
init_syntax_once (); |
#endif |
if (bufp->allocated == 0) |
{ |
if (bufp->buffer) |
{ /* If zero allocated, but buffer is non-null, try to realloc |
enough space. This loses if buffer's address is bogus, but |
that is the user's responsibility. */ |
#ifdef WCHAR |
/* Free bufp->buffer and allocate an array for wchar_t pattern |
buffer. */ |
free(bufp->buffer); |
COMPILED_BUFFER_VAR = TALLOC (INIT_BUF_SIZE/sizeof(UCHAR_T), |
UCHAR_T); |
#else |
RETALLOC (COMPILED_BUFFER_VAR, INIT_BUF_SIZE, UCHAR_T); |
#endif /* WCHAR */ |
} |
else |
{ /* Caller did not allocate a buffer. Do it for them. */ |
COMPILED_BUFFER_VAR = TALLOC (INIT_BUF_SIZE / sizeof(UCHAR_T), |
UCHAR_T); |
} |
if (!COMPILED_BUFFER_VAR) FREE_STACK_RETURN (REG_ESPACE); |
#ifdef WCHAR |
bufp->buffer = (char*)COMPILED_BUFFER_VAR; |
#endif /* WCHAR */ |
bufp->allocated = INIT_BUF_SIZE; |
} |
#ifdef WCHAR |
else |
COMPILED_BUFFER_VAR = (UCHAR_T*) bufp->buffer; |
#endif |
begalt = b = COMPILED_BUFFER_VAR; |
/* Loop through the uncompiled pattern until we're at the end. */ |
while (p != pend) |
{ |
PATFETCH (c); |
switch (c) |
{ |
case '^': |
{ |
if ( /* If at start of pattern, it's an operator. */ |
p == pattern + 1 |
/* If context independent, it's an operator. */ |
|| syntax & RE_CONTEXT_INDEP_ANCHORS |
/* Otherwise, depends on what's come before. */ |
|| PREFIX(at_begline_loc_p) (pattern, p, syntax)) |
BUF_PUSH (begline); |
else |
goto normal_char; |
} |
break; |
case '$': |
{ |
if ( /* If at end of pattern, it's an operator. */ |
p == pend |
/* If context independent, it's an operator. */ |
|| syntax & RE_CONTEXT_INDEP_ANCHORS |
/* Otherwise, depends on what's next. */ |
|| PREFIX(at_endline_loc_p) (p, pend, syntax)) |
BUF_PUSH (endline); |
else |
goto normal_char; |
} |
break; |
case '+': |
case '?': |
if ((syntax & RE_BK_PLUS_QM) |
|| (syntax & RE_LIMITED_OPS)) |
goto normal_char; |
handle_plus: |
case '*': |
/* If there is no previous pattern... */ |
if (!laststart) |
{ |
if (syntax & RE_CONTEXT_INVALID_OPS) |
FREE_STACK_RETURN (REG_BADRPT); |
else if (!(syntax & RE_CONTEXT_INDEP_OPS)) |
goto normal_char; |
} |
{ |
/* Are we optimizing this jump? */ |
boolean keep_string_p = false; |
/* 1 means zero (many) matches is allowed. */ |
char zero_times_ok = 0, many_times_ok = 0; |
/* If there is a sequence of repetition chars, collapse it |
down to just one (the right one). We can't combine |
interval operators with these because of, e.g., `a{2}*', |
which should only match an even number of `a's. */ |
for (;;) |
{ |
zero_times_ok |= c != '+'; |
many_times_ok |= c != '?'; |
if (p == pend) |
break; |
PATFETCH (c); |
if (c == '*' |
|| (!(syntax & RE_BK_PLUS_QM) && (c == '+' || c == '?'))) |
; |
else if (syntax & RE_BK_PLUS_QM && c == '\\') |
{ |
if (p == pend) FREE_STACK_RETURN (REG_EESCAPE); |
PATFETCH (c1); |
if (!(c1 == '+' || c1 == '?')) |
{ |
PATUNFETCH; |
PATUNFETCH; |
break; |
} |
c = c1; |
} |
else |
{ |
PATUNFETCH; |
break; |
} |
/* If we get here, we found another repeat character. */ |
} |
/* Star, etc. applied to an empty pattern is equivalent |
to an empty pattern. */ |
if (!laststart) |
break; |
/* Now we know whether or not zero matches is allowed |
and also whether or not two or more matches is allowed. */ |
if (many_times_ok) |
{ /* More than one repetition is allowed, so put in at the |
end a backward relative jump from `b' to before the next |
jump we're going to put in below (which jumps from |
laststart to after this jump). |
But if we are at the `*' in the exact sequence `.*\n', |
insert an unconditional jump backwards to the ., |
instead of the beginning of the loop. This way we only |
push a failure point once, instead of every time |
through the loop. */ |
assert (p - 1 > pattern); |
/* Allocate the space for the jump. */ |
GET_BUFFER_SPACE (1 + OFFSET_ADDRESS_SIZE); |
/* We know we are not at the first character of the pattern, |
because laststart was nonzero. And we've already |
incremented `p', by the way, to be the character after |
the `*'. Do we have to do something analogous here |
for null bytes, because of RE_DOT_NOT_NULL? */ |
if (TRANSLATE (*(p - 2)) == TRANSLATE ('.') |
&& zero_times_ok |
&& p < pend && TRANSLATE (*p) == TRANSLATE ('\n') |
&& !(syntax & RE_DOT_NEWLINE)) |
{ /* We have .*\n. */ |
STORE_JUMP (jump, b, laststart); |
keep_string_p = true; |
} |
else |
/* Anything else. */ |
STORE_JUMP (maybe_pop_jump, b, laststart - |
(1 + OFFSET_ADDRESS_SIZE)); |
/* We've added more stuff to the buffer. */ |
b += 1 + OFFSET_ADDRESS_SIZE; |
} |
/* On failure, jump from laststart to b + 3, which will be the |
end of the buffer after this jump is inserted. */ |
/* ifdef WCHAR, 'b + 1 + OFFSET_ADDRESS_SIZE' instead of |
'b + 3'. */ |
GET_BUFFER_SPACE (1 + OFFSET_ADDRESS_SIZE); |
INSERT_JUMP (keep_string_p ? on_failure_keep_string_jump |
: on_failure_jump, |
laststart, b + 1 + OFFSET_ADDRESS_SIZE); |
pending_exact = 0; |
b += 1 + OFFSET_ADDRESS_SIZE; |
if (!zero_times_ok) |
{ |
/* At least one repetition is required, so insert a |
`dummy_failure_jump' before the initial |
`on_failure_jump' instruction of the loop. This |
effects a skip over that instruction the first time |
we hit that loop. */ |
GET_BUFFER_SPACE (1 + OFFSET_ADDRESS_SIZE); |
INSERT_JUMP (dummy_failure_jump, laststart, laststart + |
2 + 2 * OFFSET_ADDRESS_SIZE); |
b += 1 + OFFSET_ADDRESS_SIZE; |
} |
} |
break; |
case '.': |
laststart = b; |
BUF_PUSH (anychar); |
break; |
case '[': |
{ |
boolean had_char_class = false; |
#ifdef WCHAR |
CHAR_T range_start = 0xffffffff; |
#else |
unsigned int range_start = 0xffffffff; |
#endif |
if (p == pend) FREE_STACK_RETURN (REG_EBRACK); |
#ifdef WCHAR |
/* We assume a charset(_not) structure as a wchar_t array. |
charset[0] = (re_opcode_t) charset(_not) |
charset[1] = l (= length of char_classes) |
charset[2] = m (= length of collating_symbols) |
charset[3] = n (= length of equivalence_classes) |
charset[4] = o (= length of char_ranges) |
charset[5] = p (= length of chars) |
charset[6] = char_class (wctype_t) |
charset[6+CHAR_CLASS_SIZE] = char_class (wctype_t) |
... |
charset[l+5] = char_class (wctype_t) |
charset[l+6] = collating_symbol (wchar_t) |
... |
charset[l+m+5] = collating_symbol (wchar_t) |
ifdef _LIBC we use the index if |
_NL_COLLATE_SYMB_EXTRAMB instead of |
wchar_t string. |
charset[l+m+6] = equivalence_classes (wchar_t) |
... |
charset[l+m+n+5] = equivalence_classes (wchar_t) |
ifdef _LIBC we use the index in |
_NL_COLLATE_WEIGHT instead of |
wchar_t string. |
charset[l+m+n+6] = range_start |
charset[l+m+n+7] = range_end |
... |
charset[l+m+n+2o+4] = range_start |
charset[l+m+n+2o+5] = range_end |
ifdef _LIBC we use the value looked up |
in _NL_COLLATE_COLLSEQ instead of |
wchar_t character. |
charset[l+m+n+2o+6] = char |
... |
charset[l+m+n+2o+p+5] = char |
*/ |
/* We need at least 6 spaces: the opcode, the length of |
char_classes, the length of collating_symbols, the length of |
equivalence_classes, the length of char_ranges, the length of |
chars. */ |
GET_BUFFER_SPACE (6); |
/* Save b as laststart. And We use laststart as the pointer |
to the first element of the charset here. |
In other words, laststart[i] indicates charset[i]. */ |
laststart = b; |
/* We test `*p == '^' twice, instead of using an if |
statement, so we only need one BUF_PUSH. */ |
BUF_PUSH (*p == '^' ? charset_not : charset); |
if (*p == '^') |
p++; |
/* Push the length of char_classes, the length of |
collating_symbols, the length of equivalence_classes, the |
length of char_ranges and the length of chars. */ |
BUF_PUSH_3 (0, 0, 0); |
BUF_PUSH_2 (0, 0); |
/* Remember the first position in the bracket expression. */ |
p1 = p; |
/* charset_not matches newline according to a syntax bit. */ |
if ((re_opcode_t) b[-6] == charset_not |
&& (syntax & RE_HAT_LISTS_NOT_NEWLINE)) |
{ |
BUF_PUSH('\n'); |
laststart[5]++; /* Update the length of characters */ |
} |
/* Read in characters and ranges, setting map bits. */ |
for (;;) |
{ |
if (p == pend) FREE_STACK_RETURN (REG_EBRACK); |
PATFETCH (c); |
/* \ might escape characters inside [...] and [^...]. */ |
if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\\') |
{ |
if (p == pend) FREE_STACK_RETURN (REG_EESCAPE); |
PATFETCH (c1); |
BUF_PUSH(c1); |
laststart[5]++; /* Update the length of chars */ |
range_start = c1; |
continue; |
} |
/* Could be the end of the bracket expression. If it's |
not (i.e., when the bracket expression is `[]' so |
far), the ']' character bit gets set way below. */ |
if (c == ']' && p != p1 + 1) |
break; |
/* Look ahead to see if it's a range when the last thing |
was a character class. */ |
if (had_char_class && c == '-' && *p != ']') |
FREE_STACK_RETURN (REG_ERANGE); |
/* Look ahead to see if it's a range when the last thing |
was a character: if this is a hyphen not at the |
beginning or the end of a list, then it's the range |
operator. */ |
if (c == '-' |
&& !(p - 2 >= pattern && p[-2] == '[') |
&& !(p - 3 >= pattern && p[-3] == '[' && p[-2] == '^') |
&& *p != ']') |
{ |
reg_errcode_t ret; |
/* Allocate the space for range_start and range_end. */ |
GET_BUFFER_SPACE (2); |
/* Update the pointer to indicate end of buffer. */ |
b += 2; |
ret = wcs_compile_range (range_start, &p, pend, translate, |
syntax, b, laststart); |
if (ret != REG_NOERROR) FREE_STACK_RETURN (ret); |
range_start = 0xffffffff; |
} |
else if (p[0] == '-' && p[1] != ']') |
{ /* This handles ranges made up of characters only. */ |
reg_errcode_t ret; |
/* Move past the `-'. */ |
PATFETCH (c1); |
/* Allocate the space for range_start and range_end. */ |
GET_BUFFER_SPACE (2); |
/* Update the pointer to indicate end of buffer. */ |
b += 2; |
ret = wcs_compile_range (c, &p, pend, translate, syntax, b, |
laststart); |
if (ret != REG_NOERROR) FREE_STACK_RETURN (ret); |
range_start = 0xffffffff; |
} |
/* See if we're at the beginning of a possible character |
class. */ |
else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == ':') |
{ /* Leave room for the null. */ |
char str[CHAR_CLASS_MAX_LENGTH + 1]; |
PATFETCH (c); |
c1 = 0; |
/* If pattern is `[[:'. */ |
if (p == pend) FREE_STACK_RETURN (REG_EBRACK); |
for (;;) |
{ |
PATFETCH (c); |
if ((c == ':' && *p == ']') || p == pend) |
break; |
if (c1 < CHAR_CLASS_MAX_LENGTH) |
str[c1++] = c; |
else |
/* This is in any case an invalid class name. */ |
str[0] = '\0'; |
} |
str[c1] = '\0'; |
/* If isn't a word bracketed by `[:' and `:]': |
undo the ending character, the letters, and leave |
the leading `:' and `[' (but store them as character). */ |
if (c == ':' && *p == ']') |
{ |
wctype_t wt; |
uintptr_t alignedp; |
/* Query the character class as wctype_t. */ |
wt = IS_CHAR_CLASS (str); |
if (wt == 0) |
FREE_STACK_RETURN (REG_ECTYPE); |
/* Throw away the ] at the end of the character |
class. */ |
PATFETCH (c); |
if (p == pend) FREE_STACK_RETURN (REG_EBRACK); |
/* Allocate the space for character class. */ |
GET_BUFFER_SPACE(CHAR_CLASS_SIZE); |
/* Update the pointer to indicate end of buffer. */ |
b += CHAR_CLASS_SIZE; |
/* Move data which follow character classes |
not to violate the data. */ |
insert_space(CHAR_CLASS_SIZE, |
laststart + 6 + laststart[1], |
b - 1); |
alignedp = ((uintptr_t)(laststart + 6 + laststart[1]) |
+ __alignof__(wctype_t) - 1) |
& ~(uintptr_t)(__alignof__(wctype_t) - 1); |
/* Store the character class. */ |
*((wctype_t*)alignedp) = wt; |
/* Update length of char_classes */ |
laststart[1] += CHAR_CLASS_SIZE; |
had_char_class = true; |
} |
else |
{ |
c1++; |
while (c1--) |
PATUNFETCH; |
BUF_PUSH ('['); |
BUF_PUSH (':'); |
laststart[5] += 2; /* Update the length of characters */ |
range_start = ':'; |
had_char_class = false; |
} |
} |
else if (syntax & RE_CHAR_CLASSES && c == '[' && (*p == '=' |
|| *p == '.')) |
{ |
CHAR_T str[128]; /* Should be large enough. */ |
CHAR_T delim = *p; /* '=' or '.' */ |
# ifdef _LIBC |
uint32_t nrules = |
_NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); |
# endif |
PATFETCH (c); |
c1 = 0; |
/* If pattern is `[[=' or '[[.'. */ |
if (p == pend) FREE_STACK_RETURN (REG_EBRACK); |
for (;;) |
{ |
PATFETCH (c); |
if ((c == delim && *p == ']') || p == pend) |
break; |
if (c1 < sizeof (str) - 1) |
str[c1++] = c; |
else |
/* This is in any case an invalid class name. */ |
str[0] = '\0'; |
} |
str[c1] = '\0'; |
if (c == delim && *p == ']' && str[0] != '\0') |
{ |
unsigned int i, offset; |
/* If we have no collation data we use the default |
collation in which each character is in a class |
by itself. It also means that ASCII is the |
character set and therefore we cannot have character |
with more than one byte in the multibyte |
representation. */ |
/* If not defined _LIBC, we push the name and |
`\0' for the sake of matching performance. */ |
int datasize = c1 + 1; |
# ifdef _LIBC |
int32_t idx = 0; |
if (nrules == 0) |
# endif |
{ |
if (c1 != 1) |
FREE_STACK_RETURN (REG_ECOLLATE); |
} |
# ifdef _LIBC |
else |
{ |
const int32_t *table; |
const int32_t *weights; |
const int32_t *extra; |
const int32_t *indirect; |
wint_t *cp; |
/* This #include defines a local function! */ |
# include <locale/weightwc.h> |
if(delim == '=') |
{ |
/* We push the index for equivalence class. */ |
cp = (wint_t*)str; |
table = (const int32_t *) |
_NL_CURRENT (LC_COLLATE, |
_NL_COLLATE_TABLEWC); |
weights = (const int32_t *) |
_NL_CURRENT (LC_COLLATE, |
_NL_COLLATE_WEIGHTWC); |
extra = (const int32_t *) |
_NL_CURRENT (LC_COLLATE, |
_NL_COLLATE_EXTRAWC); |
indirect = (const int32_t *) |
_NL_CURRENT (LC_COLLATE, |
_NL_COLLATE_INDIRECTWC); |
idx = findidx ((const wint_t**)&cp); |
if (idx == 0 || cp < (wint_t*) str + c1) |
/* This is no valid character. */ |
FREE_STACK_RETURN (REG_ECOLLATE); |
str[0] = (wchar_t)idx; |
} |
else /* delim == '.' */ |
{ |
/* We push collation sequence value |
for collating symbol. */ |
int32_t table_size; |
const int32_t *symb_table; |
const unsigned char *extra; |
int32_t idx; |
int32_t elem; |
int32_t second; |
int32_t hash; |
char char_str[c1]; |
/* We have to convert the name to a single-byte |
string. This is possible since the names |
consist of ASCII characters and the internal |
representation is UCS4. */ |
for (i = 0; i < c1; ++i) |
char_str[i] = str[i]; |
table_size = |
_NL_CURRENT_WORD (LC_COLLATE, |
_NL_COLLATE_SYMB_HASH_SIZEMB); |
symb_table = (const int32_t *) |
_NL_CURRENT (LC_COLLATE, |
_NL_COLLATE_SYMB_TABLEMB); |
extra = (const unsigned char *) |
_NL_CURRENT (LC_COLLATE, |
_NL_COLLATE_SYMB_EXTRAMB); |
/* Locate the character in the hashing table. */ |
hash = elem_hash (char_str, c1); |
idx = 0; |
elem = hash % table_size; |
second = hash % (table_size - 2); |
while (symb_table[2 * elem] != 0) |
{ |
/* First compare the hashing value. */ |
if (symb_table[2 * elem] == hash |
&& c1 == extra[symb_table[2 * elem + 1]] |
&& memcmp (char_str, |
&extra[symb_table[2 * elem + 1] |
+ 1], c1) == 0) |
{ |
/* Yep, this is the entry. */ |
idx = symb_table[2 * elem + 1]; |
idx += 1 + extra[idx]; |
break; |
} |
/* Next entry. */ |
elem += second; |
} |
if (symb_table[2 * elem] != 0) |
{ |
/* Compute the index of the byte sequence |
in the table. */ |
idx += 1 + extra[idx]; |
/* Adjust for the alignment. */ |
idx = (idx + 3) & ~3; |
str[0] = (wchar_t) idx + 4; |
} |
else if (symb_table[2 * elem] == 0 && c1 == 1) |
{ |
/* No valid character. Match it as a |
single byte character. */ |
had_char_class = false; |
BUF_PUSH(str[0]); |
/* Update the length of characters */ |
laststart[5]++; |
range_start = str[0]; |
/* Throw away the ] at the end of the |
collating symbol. */ |
PATFETCH (c); |
/* exit from the switch block. */ |
continue; |
} |
else |
FREE_STACK_RETURN (REG_ECOLLATE); |
} |
datasize = 1; |
} |
# endif |
/* Throw away the ] at the end of the equivalence |
class (or collating symbol). */ |
PATFETCH (c); |
/* Allocate the space for the equivalence class |
(or collating symbol) (and '\0' if needed). */ |
GET_BUFFER_SPACE(datasize); |
/* Update the pointer to indicate end of buffer. */ |
b += datasize; |
if (delim == '=') |
{ /* equivalence class */ |
/* Calculate the offset of char_ranges, |
which is next to equivalence_classes. */ |
offset = laststart[1] + laststart[2] |
+ laststart[3] +6; |
/* Insert space. */ |
insert_space(datasize, laststart + offset, b - 1); |
/* Write the equivalence_class and \0. */ |
for (i = 0 ; i < datasize ; i++) |
laststart[offset + i] = str[i]; |
/* Update the length of equivalence_classes. */ |
laststart[3] += datasize; |
had_char_class = true; |
} |
else /* delim == '.' */ |
{ /* collating symbol */ |
/* Calculate the offset of the equivalence_classes, |
which is next to collating_symbols. */ |
offset = laststart[1] + laststart[2] + 6; |
/* Insert space and write the collationg_symbol |
and \0. */ |
insert_space(datasize, laststart + offset, b-1); |
for (i = 0 ; i < datasize ; i++) |
laststart[offset + i] = str[i]; |
/* In re_match_2_internal if range_start < -1, we |
assume -range_start is the offset of the |
collating symbol which is specified as |
the character of the range start. So we assign |
-(laststart[1] + laststart[2] + 6) to |
range_start. */ |
range_start = -(laststart[1] + laststart[2] + 6); |
/* Update the length of collating_symbol. */ |
laststart[2] += datasize; |
had_char_class = false; |
} |
} |
else |
{ |
c1++; |
while (c1--) |
PATUNFETCH; |
BUF_PUSH ('['); |
BUF_PUSH (delim); |
laststart[5] += 2; /* Update the length of characters */ |
range_start = delim; |
had_char_class = false; |
} |
} |
else |
{ |
had_char_class = false; |
BUF_PUSH(c); |
laststart[5]++; /* Update the length of characters */ |
range_start = c; |
} |
} |
#else /* BYTE */ |
/* Ensure that we have enough space to push a charset: the |
opcode, the length count, and the bitset; 34 bytes in all. */ |
GET_BUFFER_SPACE (34); |
laststart = b; |
/* We test `*p == '^' twice, instead of using an if |
statement, so we only need one BUF_PUSH. */ |
BUF_PUSH (*p == '^' ? charset_not : charset); |
if (*p == '^') |
p++; |
/* Remember the first position in the bracket expression. */ |
p1 = p; |
/* Push the number of bytes in the bitmap. */ |
BUF_PUSH ((1 << BYTEWIDTH) / BYTEWIDTH); |
/* Clear the whole map. */ |
bzero (b, (1 << BYTEWIDTH) / BYTEWIDTH); |
/* charset_not matches newline according to a syntax bit. */ |
if ((re_opcode_t) b[-2] == charset_not |
&& (syntax & RE_HAT_LISTS_NOT_NEWLINE)) |
SET_LIST_BIT ('\n'); |
/* Read in characters and ranges, setting map bits. */ |
for (;;) |
{ |
if (p == pend) FREE_STACK_RETURN (REG_EBRACK); |
PATFETCH (c); |
/* \ might escape characters inside [...] and [^...]. */ |
if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\\') |
{ |
if (p == pend) FREE_STACK_RETURN (REG_EESCAPE); |
PATFETCH (c1); |
SET_LIST_BIT (c1); |
range_start = c1; |
continue; |
} |
/* Could be the end of the bracket expression. If it's |
not (i.e., when the bracket expression is `[]' so |
far), the ']' character bit gets set way below. */ |
if (c == ']' && p != p1 + 1) |
break; |
/* Look ahead to see if it's a range when the last thing |
was a character class. */ |
if (had_char_class && c == '-' && *p != ']') |
FREE_STACK_RETURN (REG_ERANGE); |
/* Look ahead to see if it's a range when the last thing |
was a character: if this is a hyphen not at the |
beginning or the end of a list, then it's the range |
operator. */ |
if (c == '-' |
&& !(p - 2 >= pattern && p[-2] == '[') |
&& !(p - 3 >= pattern && p[-3] == '[' && p[-2] == '^') |
&& *p != ']') |
{ |
reg_errcode_t ret |
= byte_compile_range (range_start, &p, pend, translate, |
syntax, b); |
if (ret != REG_NOERROR) FREE_STACK_RETURN (ret); |
range_start = 0xffffffff; |
} |
else if (p[0] == '-' && p[1] != ']') |
{ /* This handles ranges made up of characters only. */ |
reg_errcode_t ret; |
/* Move past the `-'. */ |
PATFETCH (c1); |
ret = byte_compile_range (c, &p, pend, translate, syntax, b); |
if (ret != REG_NOERROR) FREE_STACK_RETURN (ret); |
range_start = 0xffffffff; |
} |
/* See if we're at the beginning of a possible character |
class. */ |
else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == ':') |
{ /* Leave room for the null. */ |
char str[CHAR_CLASS_MAX_LENGTH + 1]; |
PATFETCH (c); |
c1 = 0; |
/* If pattern is `[[:'. */ |
if (p == pend) FREE_STACK_RETURN (REG_EBRACK); |
for (;;) |
{ |
PATFETCH (c); |
if ((c == ':' && *p == ']') || p == pend) |
break; |
if (c1 < CHAR_CLASS_MAX_LENGTH) |
str[c1++] = c; |
else |
/* This is in any case an invalid class name. */ |
str[0] = '\0'; |
} |
str[c1] = '\0'; |
/* If isn't a word bracketed by `[:' and `:]': |
undo the ending character, the letters, and leave |
the leading `:' and `[' (but set bits for them). */ |
if (c == ':' && *p == ']') |
{ |
# if defined _LIBC || WIDE_CHAR_SUPPORT |
boolean is_lower = STREQ (str, "lower"); |
boolean is_upper = STREQ (str, "upper"); |
wctype_t wt; |
int ch; |
wt = IS_CHAR_CLASS (str); |
if (wt == 0) |
FREE_STACK_RETURN (REG_ECTYPE); |
/* Throw away the ] at the end of the character |
class. */ |
PATFETCH (c); |
if (p == pend) FREE_STACK_RETURN (REG_EBRACK); |
for (ch = 0; ch < 1 << BYTEWIDTH; ++ch) |
{ |
# ifdef _LIBC |
if (__iswctype (__btowc (ch), wt)) |
SET_LIST_BIT (ch); |
# else |
if (iswctype (btowc (ch), wt)) |
SET_LIST_BIT (ch); |
# endif |
if (translate && (is_upper || is_lower) |
&& (ISUPPER (ch) || ISLOWER (ch))) |
SET_LIST_BIT (ch); |
} |
had_char_class = true; |
# else |
int ch; |
boolean is_alnum = STREQ (str, "alnum"); |
boolean is_alpha = STREQ (str, "alpha"); |
boolean is_blank = STREQ (str, "blank"); |
boolean is_cntrl = STREQ (str, "cntrl"); |
boolean is_digit = STREQ (str, "digit"); |
boolean is_graph = STREQ (str, "graph"); |
boolean is_lower = STREQ (str, "lower"); |
boolean is_print = STREQ (str, "print"); |
boolean is_punct = STREQ (str, "punct"); |
boolean is_space = STREQ (str, "space"); |
boolean is_upper = STREQ (str, "upper"); |
boolean is_xdigit = STREQ (str, "xdigit"); |
if (!IS_CHAR_CLASS (str)) |
FREE_STACK_RETURN (REG_ECTYPE); |
/* Throw away the ] at the end of the character |
class. */ |
PATFETCH (c); |
if (p == pend) FREE_STACK_RETURN (REG_EBRACK); |
for (ch = 0; ch < 1 << BYTEWIDTH; ch++) |
{ |
/* This was split into 3 if's to |
avoid an arbitrary limit in some compiler. */ |
if ( (is_alnum && ISALNUM (ch)) |
|| (is_alpha && ISALPHA (ch)) |
|| (is_blank && ISBLANK (ch)) |
|| (is_cntrl && ISCNTRL (ch))) |
SET_LIST_BIT (ch); |
if ( (is_digit && ISDIGIT (ch)) |
|| (is_graph && ISGRAPH (ch)) |
|| (is_lower && ISLOWER (ch)) |
|| (is_print && ISPRINT (ch))) |
SET_LIST_BIT (ch); |
if ( (is_punct && ISPUNCT (ch)) |
|| (is_space && ISSPACE (ch)) |
|| (is_upper && ISUPPER (ch)) |
|| (is_xdigit && ISXDIGIT (ch))) |
SET_LIST_BIT (ch); |
if ( translate && (is_upper || is_lower) |
&& (ISUPPER (ch) || ISLOWER (ch))) |
SET_LIST_BIT (ch); |
} |
had_char_class = true; |
# endif /* libc || wctype.h */ |
} |
else |
{ |
c1++; |
while (c1--) |
PATUNFETCH; |
SET_LIST_BIT ('['); |
SET_LIST_BIT (':'); |
range_start = ':'; |
had_char_class = false; |
} |
} |
else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == '=') |
{ |
unsigned char str[MB_LEN_MAX + 1]; |
# ifdef _LIBC |
uint32_t nrules = |
_NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); |
# endif |
PATFETCH (c); |
c1 = 0; |
/* If pattern is `[[='. */ |
if (p == pend) FREE_STACK_RETURN (REG_EBRACK); |
for (;;) |
{ |
PATFETCH (c); |
if ((c == '=' && *p == ']') || p == pend) |
break; |
if (c1 < MB_LEN_MAX) |
str[c1++] = c; |
else |
/* This is in any case an invalid class name. */ |
str[0] = '\0'; |
} |
str[c1] = '\0'; |
if (c == '=' && *p == ']' && str[0] != '\0') |
{ |
/* If we have no collation data we use the default |
collation in which each character is in a class |
by itself. It also means that ASCII is the |
character set and therefore we cannot have character |
with more than one byte in the multibyte |
representation. */ |
# ifdef _LIBC |
if (nrules == 0) |
# endif |
{ |
if (c1 != 1) |
FREE_STACK_RETURN (REG_ECOLLATE); |
/* Throw away the ] at the end of the equivalence |
class. */ |
PATFETCH (c); |
/* Set the bit for the character. */ |
SET_LIST_BIT (str[0]); |
} |
# ifdef _LIBC |
else |
{ |
/* Try to match the byte sequence in `str' against |
those known to the collate implementation. |
First find out whether the bytes in `str' are |
actually from exactly one character. */ |
const int32_t *table; |
const unsigned char *weights; |
const unsigned char *extra; |
const int32_t *indirect; |
int32_t idx; |
const unsigned char *cp = str; |
int ch; |
/* This #include defines a local function! */ |
# include <locale/weight.h> |
table = (const int32_t *) |
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB); |
weights = (const unsigned char *) |
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_WEIGHTMB); |
extra = (const unsigned char *) |
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB); |
indirect = (const int32_t *) |
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB); |
idx = findidx (&cp); |
if (idx == 0 || cp < str + c1) |
/* This is no valid character. */ |
FREE_STACK_RETURN (REG_ECOLLATE); |
/* Throw away the ] at the end of the equivalence |
class. */ |
PATFETCH (c); |
/* Now we have to go through the whole table |
and find all characters which have the same |
first level weight. |
XXX Note that this is not entirely correct. |
we would have to match multibyte sequences |
but this is not possible with the current |
implementation. */ |
for (ch = 1; ch < 256; ++ch) |
/* XXX This test would have to be changed if we |
would allow matching multibyte sequences. */ |
if (table[ch] > 0) |
{ |
int32_t idx2 = table[ch]; |
size_t len = weights[idx2]; |
/* Test whether the lenghts match. */ |
if (weights[idx] == len) |
{ |
/* They do. New compare the bytes of |
the weight. */ |
size_t cnt = 0; |
while (cnt < len |
&& (weights[idx + 1 + cnt] |
== weights[idx2 + 1 + cnt])) |
++cnt; |
if (cnt == len) |
/* They match. Mark the character as |
acceptable. */ |
SET_LIST_BIT (ch); |
} |
} |
} |
# endif |
had_char_class = true; |
} |
else |
{ |
c1++; |
while (c1--) |
PATUNFETCH; |
SET_LIST_BIT ('['); |
SET_LIST_BIT ('='); |
range_start = '='; |
had_char_class = false; |
} |
} |
else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == '.') |
{ |
unsigned char str[128]; /* Should be large enough. */ |
# ifdef _LIBC |
uint32_t nrules = |
_NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); |
# endif |
PATFETCH (c); |
c1 = 0; |
/* If pattern is `[[.'. */ |
if (p == pend) FREE_STACK_RETURN (REG_EBRACK); |
for (;;) |
{ |
PATFETCH (c); |
if ((c == '.' && *p == ']') || p == pend) |
break; |
if (c1 < sizeof (str)) |
str[c1++] = c; |
else |
/* This is in any case an invalid class name. */ |
str[0] = '\0'; |
} |
str[c1] = '\0'; |
if (c == '.' && *p == ']' && str[0] != '\0') |
{ |
/* If we have no collation data we use the default |
collation in which each character is the name |
for its own class which contains only the one |
character. It also means that ASCII is the |
character set and therefore we cannot have character |
with more than one byte in the multibyte |
representation. */ |
# ifdef _LIBC |
if (nrules == 0) |
# endif |
{ |
if (c1 != 1) |
FREE_STACK_RETURN (REG_ECOLLATE); |
/* Throw away the ] at the end of the equivalence |
class. */ |
PATFETCH (c); |
/* Set the bit for the character. */ |
SET_LIST_BIT (str[0]); |
range_start = ((const unsigned char *) str)[0]; |
} |
# ifdef _LIBC |
else |
{ |
/* Try to match the byte sequence in `str' against |
those known to the collate implementation. |
First find out whether the bytes in `str' are |
actually from exactly one character. */ |
int32_t table_size; |
const int32_t *symb_table; |
const unsigned char *extra; |
int32_t idx; |
int32_t elem; |
int32_t second; |
int32_t hash; |
table_size = |
_NL_CURRENT_WORD (LC_COLLATE, |
_NL_COLLATE_SYMB_HASH_SIZEMB); |
symb_table = (const int32_t *) |
_NL_CURRENT (LC_COLLATE, |
_NL_COLLATE_SYMB_TABLEMB); |
extra = (const unsigned char *) |
_NL_CURRENT (LC_COLLATE, |
_NL_COLLATE_SYMB_EXTRAMB); |
/* Locate the character in the hashing table. */ |
hash = elem_hash (str, c1); |
idx = 0; |
elem = hash % table_size; |
second = hash % (table_size - 2); |
while (symb_table[2 * elem] != 0) |
{ |
/* First compare the hashing value. */ |
if (symb_table[2 * elem] == hash |
&& c1 == extra[symb_table[2 * elem + 1]] |
&& memcmp (str, |
&extra[symb_table[2 * elem + 1] |
+ 1], |
c1) == 0) |
{ |
/* Yep, this is the entry. */ |
idx = symb_table[2 * elem + 1]; |
idx += 1 + extra[idx]; |
break; |
} |
/* Next entry. */ |
elem += second; |
} |
if (symb_table[2 * elem] == 0) |
/* This is no valid character. */ |
FREE_STACK_RETURN (REG_ECOLLATE); |
/* Throw away the ] at the end of the equivalence |
class. */ |
PATFETCH (c); |
/* Now add the multibyte character(s) we found |
to the accept list. |
XXX Note that this is not entirely correct. |
we would have to match multibyte sequences |
but this is not possible with the current |
implementation. Also, we have to match |
collating symbols, which expand to more than |
one file, as a whole and not allow the |
individual bytes. */ |
c1 = extra[idx++]; |
if (c1 == 1) |
range_start = extra[idx]; |
while (c1-- > 0) |
{ |
SET_LIST_BIT (extra[idx]); |
++idx; |
} |
} |
# endif |
had_char_class = false; |
} |
else |
{ |
c1++; |
while (c1--) |
PATUNFETCH; |
SET_LIST_BIT ('['); |
SET_LIST_BIT ('.'); |
range_start = '.'; |
had_char_class = false; |
} |
} |
else |
{ |
had_char_class = false; |
SET_LIST_BIT (c); |
range_start = c; |
} |
} |
/* Discard any (non)matching list bytes that are all 0 at the |
end of the map. Decrease the map-length byte too. */ |
while ((int) b[-1] > 0 && b[b[-1] - 1] == 0) |
b[-1]--; |
b += b[-1]; |
#endif /* WCHAR */ |
} |
break; |
case '(': |
if (syntax & RE_NO_BK_PARENS) |
goto handle_open; |
else |
goto normal_char; |
case ')': |
if (syntax & RE_NO_BK_PARENS) |
goto handle_close; |
else |
goto normal_char; |
case '\n': |
if (syntax & RE_NEWLINE_ALT) |
goto handle_alt; |
else |
goto normal_char; |
case '|': |
if (syntax & RE_NO_BK_VBAR) |
goto handle_alt; |
else |
goto normal_char; |
case '{': |
if (syntax & RE_INTERVALS && syntax & RE_NO_BK_BRACES) |
goto handle_interval; |
else |
goto normal_char; |
case '\\': |
if (p == pend) FREE_STACK_RETURN (REG_EESCAPE); |
/* Do not translate the character after the \, so that we can |
distinguish, e.g., \B from \b, even if we normally would |
translate, e.g., B to b. */ |
PATFETCH_RAW (c); |
switch (c) |
{ |
case '(': |
if (syntax & RE_NO_BK_PARENS) |
goto normal_backslash; |
handle_open: |
bufp->re_nsub++; |
regnum++; |
if (COMPILE_STACK_FULL) |
{ |
RETALLOC (compile_stack.stack, compile_stack.size << 1, |
compile_stack_elt_t); |
if (compile_stack.stack == NULL) return REG_ESPACE; |
compile_stack.size <<= 1; |
} |
/* These are the values to restore when we hit end of this |
group. They are all relative offsets, so that if the |
whole pattern moves because of realloc, they will still |
be valid. */ |
COMPILE_STACK_TOP.begalt_offset = begalt - COMPILED_BUFFER_VAR; |
COMPILE_STACK_TOP.fixup_alt_jump |
= fixup_alt_jump ? fixup_alt_jump - COMPILED_BUFFER_VAR + 1 : 0; |
COMPILE_STACK_TOP.laststart_offset = b - COMPILED_BUFFER_VAR; |
COMPILE_STACK_TOP.regnum = regnum; |
/* We will eventually replace the 0 with the number of |
groups inner to this one. But do not push a |
start_memory for groups beyond the last one we can |
represent in the compiled pattern. */ |
if (regnum <= MAX_REGNUM) |
{ |
COMPILE_STACK_TOP.inner_group_offset = b |
- COMPILED_BUFFER_VAR + 2; |
BUF_PUSH_3 (start_memory, regnum, 0); |
} |
compile_stack.avail++; |
fixup_alt_jump = 0; |
laststart = 0; |
begalt = b; |
/* If we've reached MAX_REGNUM groups, then this open |
won't actually generate any code, so we'll have to |
clear pending_exact explicitly. */ |
pending_exact = 0; |
break; |
case ')': |
if (syntax & RE_NO_BK_PARENS) goto normal_backslash; |
if (COMPILE_STACK_EMPTY) |
{ |
if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD) |
goto normal_backslash; |
else |
FREE_STACK_RETURN (REG_ERPAREN); |
} |
handle_close: |
if (fixup_alt_jump) |
{ /* Push a dummy failure point at the end of the |
alternative for a possible future |
`pop_failure_jump' to pop. See comments at |
`push_dummy_failure' in `re_match_2'. */ |
BUF_PUSH (push_dummy_failure); |
/* We allocated space for this jump when we assigned |
to `fixup_alt_jump', in the `handle_alt' case below. */ |
STORE_JUMP (jump_past_alt, fixup_alt_jump, b - 1); |
} |
/* See similar code for backslashed left paren above. */ |
if (COMPILE_STACK_EMPTY) |
{ |
if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD) |
goto normal_char; |
else |
FREE_STACK_RETURN (REG_ERPAREN); |
} |
/* Since we just checked for an empty stack above, this |
``can't happen''. */ |
assert (compile_stack.avail != 0); |
{ |
/* We don't just want to restore into `regnum', because |
later groups should continue to be numbered higher, |
as in `(ab)c(de)' -- the second group is #2. */ |
regnum_t this_group_regnum; |
compile_stack.avail--; |
begalt = COMPILED_BUFFER_VAR + COMPILE_STACK_TOP.begalt_offset; |
fixup_alt_jump |
= COMPILE_STACK_TOP.fixup_alt_jump |
? COMPILED_BUFFER_VAR + COMPILE_STACK_TOP.fixup_alt_jump - 1 |
: 0; |
laststart = COMPILED_BUFFER_VAR + COMPILE_STACK_TOP.laststart_offset; |
this_group_regnum = COMPILE_STACK_TOP.regnum; |
/* If we've reached MAX_REGNUM groups, then this open |
won't actually generate any code, so we'll have to |
clear pending_exact explicitly. */ |
pending_exact = 0; |
/* We're at the end of the group, so now we know how many |
groups were inside this one. */ |
if (this_group_regnum <= MAX_REGNUM) |
{ |
UCHAR_T *inner_group_loc |
= COMPILED_BUFFER_VAR + COMPILE_STACK_TOP.inner_group_offset; |
*inner_group_loc = regnum - this_group_regnum; |
BUF_PUSH_3 (stop_memory, this_group_regnum, |
regnum - this_group_regnum); |
} |
} |
break; |
case '|': /* `\|'. */ |
if (syntax & RE_LIMITED_OPS || syntax & RE_NO_BK_VBAR) |
goto normal_backslash; |
handle_alt: |
if (syntax & RE_LIMITED_OPS) |
goto normal_char; |
/* Insert before the previous alternative a jump which |
jumps to this alternative if the former fails. */ |
GET_BUFFER_SPACE (1 + OFFSET_ADDRESS_SIZE); |
INSERT_JUMP (on_failure_jump, begalt, |
b + 2 + 2 * OFFSET_ADDRESS_SIZE); |
pending_exact = 0; |
b += 1 + OFFSET_ADDRESS_SIZE; |
/* The alternative before this one has a jump after it |
which gets executed if it gets matched. Adjust that |
jump so it will jump to this alternative's analogous |
jump (put in below, which in turn will jump to the next |
(if any) alternative's such jump, etc.). The last such |
jump jumps to the correct final destination. A picture: |
_____ _____ |
| | | | |
| v | v |
a | b | c |
If we are at `b', then fixup_alt_jump right now points to a |
three-byte space after `a'. We'll put in the jump, set |
fixup_alt_jump to right after `b', and leave behind three |
bytes which we'll fill in when we get to after `c'. */ |
if (fixup_alt_jump) |
STORE_JUMP (jump_past_alt, fixup_alt_jump, b); |
/* Mark and leave space for a jump after this alternative, |
to be filled in later either by next alternative or |
when know we're at the end of a series of alternatives. */ |
fixup_alt_jump = b; |
GET_BUFFER_SPACE (1 + OFFSET_ADDRESS_SIZE); |
b += 1 + OFFSET_ADDRESS_SIZE; |
laststart = 0; |
begalt = b; |
break; |
case '{': |
/* If \{ is a literal. */ |
if (!(syntax & RE_INTERVALS) |
/* If we're at `\{' and it's not the open-interval |
operator. */ |
|| (syntax & RE_NO_BK_BRACES)) |
goto normal_backslash; |
handle_interval: |
{ |
/* If got here, then the syntax allows intervals. */ |
/* At least (most) this many matches must be made. */ |
int lower_bound = -1, upper_bound = -1; |
/* Place in the uncompiled pattern (i.e., just after |
the '{') to go back to if the interval is invalid. */ |
const CHAR_T *beg_interval = p; |
if (p == pend) |
goto invalid_interval; |
GET_UNSIGNED_NUMBER (lower_bound); |
if (c == ',') |
{ |
GET_UNSIGNED_NUMBER (upper_bound); |
if (upper_bound < 0) |
upper_bound = RE_DUP_MAX; |
} |
else |
/* Interval such as `{1}' => match exactly once. */ |
upper_bound = lower_bound; |
if (! (0 <= lower_bound && lower_bound <= upper_bound)) |
goto invalid_interval; |
if (!(syntax & RE_NO_BK_BRACES)) |
{ |
if (c != '\\' || p == pend) |
goto invalid_interval; |
PATFETCH (c); |
} |
if (c != '}') |
goto invalid_interval; |
/* If it's invalid to have no preceding re. */ |
if (!laststart) |
{ |
if (syntax & RE_CONTEXT_INVALID_OPS |
&& !(syntax & RE_INVALID_INTERVAL_ORD)) |
FREE_STACK_RETURN (REG_BADRPT); |
else if (syntax & RE_CONTEXT_INDEP_OPS) |
laststart = b; |
else |
goto unfetch_interval; |
} |
/* We just parsed a valid interval. */ |
if (RE_DUP_MAX < upper_bound) |
FREE_STACK_RETURN (REG_BADBR); |
/* If the upper bound is zero, don't want to succeed at |
all; jump from `laststart' to `b + 3', which will be |
the end of the buffer after we insert the jump. */ |
/* ifdef WCHAR, 'b + 1 + OFFSET_ADDRESS_SIZE' |
instead of 'b + 3'. */ |
if (upper_bound == 0) |
{ |
GET_BUFFER_SPACE (1 + OFFSET_ADDRESS_SIZE); |
INSERT_JUMP (jump, laststart, b + 1 |
+ OFFSET_ADDRESS_SIZE); |
b += 1 + OFFSET_ADDRESS_SIZE; |
} |
/* Otherwise, we have a nontrivial interval. When |
we're all done, the pattern will look like: |
set_number_at <jump count> <upper bound> |
set_number_at <succeed_n count> <lower bound> |
succeed_n <after jump addr> <succeed_n count> |
<body of loop> |
jump_n <succeed_n addr> <jump count> |
(The upper bound and `jump_n' are omitted if |
`upper_bound' is 1, though.) */ |
else |
{ /* If the upper bound is > 1, we need to insert |
more at the end of the loop. */ |
unsigned nbytes = 2 + 4 * OFFSET_ADDRESS_SIZE + |
(upper_bound > 1) * (2 + 4 * OFFSET_ADDRESS_SIZE); |
GET_BUFFER_SPACE (nbytes); |
/* Initialize lower bound of the `succeed_n', even |
though it will be set during matching by its |
attendant `set_number_at' (inserted next), |
because `re_compile_fastmap' needs to know. |
Jump to the `jump_n' we might insert below. */ |
INSERT_JUMP2 (succeed_n, laststart, |
b + 1 + 2 * OFFSET_ADDRESS_SIZE |
+ (upper_bound > 1) * (1 + 2 * OFFSET_ADDRESS_SIZE) |
, lower_bound); |
b += 1 + 2 * OFFSET_ADDRESS_SIZE; |
/* Code to initialize the lower bound. Insert |
before the `succeed_n'. The `5' is the last two |
bytes of this `set_number_at', plus 3 bytes of |
the following `succeed_n'. */ |
/* ifdef WCHAR, The '1+2*OFFSET_ADDRESS_SIZE' |
is the 'set_number_at', plus '1+OFFSET_ADDRESS_SIZE' |
of the following `succeed_n'. */ |
PREFIX(insert_op2) (set_number_at, laststart, 1 |
+ 2 * OFFSET_ADDRESS_SIZE, lower_bound, b); |
b += 1 + 2 * OFFSET_ADDRESS_SIZE; |
if (upper_bound > 1) |
{ /* More than one repetition is allowed, so |
append a backward jump to the `succeed_n' |
that starts this interval. |
When we've reached this during matching, |
we'll have matched the interval once, so |
jump back only `upper_bound - 1' times. */ |
STORE_JUMP2 (jump_n, b, laststart |
+ 2 * OFFSET_ADDRESS_SIZE + 1, |
upper_bound - 1); |
b += 1 + 2 * OFFSET_ADDRESS_SIZE; |
/* The location we want to set is the second |
parameter of the `jump_n'; that is `b-2' as |
an absolute address. `laststart' will be |
the `set_number_at' we're about to insert; |
`laststart+3' the number to set, the source |
for the relative address. But we are |
inserting into the middle of the pattern -- |
so everything is getting moved up by 5. |
Conclusion: (b - 2) - (laststart + 3) + 5, |
i.e., b - laststart. |
We insert this at the beginning of the loop |
so that if we fail during matching, we'll |
reinitialize the bounds. */ |
PREFIX(insert_op2) (set_number_at, laststart, |
b - laststart, |
upper_bound - 1, b); |
b += 1 + 2 * OFFSET_ADDRESS_SIZE; |
} |
} |
pending_exact = 0; |
break; |
invalid_interval: |
if (!(syntax & RE_INVALID_INTERVAL_ORD)) |
FREE_STACK_RETURN (p == pend ? REG_EBRACE : REG_BADBR); |
unfetch_interval: |
/* Match the characters as literals. */ |
p = beg_interval; |
c = '{'; |
if (syntax & RE_NO_BK_BRACES) |
goto normal_char; |
else |
goto normal_backslash; |
} |
#ifdef emacs |
/* There is no way to specify the before_dot and after_dot |
operators. rms says this is ok. --karl */ |
case '=': |
BUF_PUSH (at_dot); |
break; |
case 's': |
laststart = b; |
PATFETCH (c); |
BUF_PUSH_2 (syntaxspec, syntax_spec_code[c]); |
break; |
case 'S': |
laststart = b; |
PATFETCH (c); |
BUF_PUSH_2 (notsyntaxspec, syntax_spec_code[c]); |
break; |
#endif /* emacs */ |
case 'w': |
if (syntax & RE_NO_GNU_OPS) |
goto normal_char; |
laststart = b; |
BUF_PUSH (wordchar); |
break; |
case 'W': |
if (syntax & RE_NO_GNU_OPS) |
goto normal_char; |
laststart = b; |
BUF_PUSH (notwordchar); |
break; |
case '<': |
if (syntax & RE_NO_GNU_OPS) |
goto normal_char; |
BUF_PUSH (wordbeg); |
break; |
case '>': |
if (syntax & RE_NO_GNU_OPS) |
goto normal_char; |
BUF_PUSH (wordend); |
break; |
case 'b': |
if (syntax & RE_NO_GNU_OPS) |
goto normal_char; |
BUF_PUSH (wordbound); |
break; |
case 'B': |
if (syntax & RE_NO_GNU_OPS) |
goto normal_char; |
BUF_PUSH (notwordbound); |
break; |
case '`': |
if (syntax & RE_NO_GNU_OPS) |
goto normal_char; |
BUF_PUSH (begbuf); |
break; |
case '\'': |
if (syntax & RE_NO_GNU_OPS) |
goto normal_char; |
BUF_PUSH (endbuf); |
break; |
case '1': case '2': case '3': case '4': case '5': |
case '6': case '7': case '8': case '9': |
if (syntax & RE_NO_BK_REFS) |
goto normal_char; |
c1 = c - '0'; |
if (c1 > regnum) |
FREE_STACK_RETURN (REG_ESUBREG); |
/* Can't back reference to a subexpression if inside of it. */ |
if (group_in_compile_stack (compile_stack, (regnum_t) c1)) |
goto normal_char; |
laststart = b; |
BUF_PUSH_2 (duplicate, c1); |
break; |
case '+': |
case '?': |
if (syntax & RE_BK_PLUS_QM) |
goto handle_plus; |
else |
goto normal_backslash; |
default: |
normal_backslash: |
/* You might think it would be useful for \ to mean |
not to translate; but if we don't translate it |
it will never match anything. */ |
c = TRANSLATE (c); |
goto normal_char; |
} |
break; |
default: |
/* Expects the character in `c'. */ |
normal_char: |
/* If no exactn currently being built. */ |
if (!pending_exact |
#ifdef WCHAR |
/* If last exactn handle binary(or character) and |
new exactn handle character(or binary). */ |
|| is_exactn_bin != is_binary[p - 1 - pattern] |
#endif /* WCHAR */ |
/* If last exactn not at current position. */ |
|| pending_exact + *pending_exact + 1 != b |
/* We have only one byte following the exactn for the count. */ |
|| *pending_exact == (1 << BYTEWIDTH) - 1 |
/* If followed by a repetition operator. */ |
|| *p == '*' || *p == '^' |
|| ((syntax & RE_BK_PLUS_QM) |
? *p == '\\' && (p[1] == '+' || p[1] == '?') |
: (*p == '+' || *p == '?')) |
|| ((syntax & RE_INTERVALS) |
&& ((syntax & RE_NO_BK_BRACES) |
? *p == '{' |
: (p[0] == '\\' && p[1] == '{')))) |
{ |
/* Start building a new exactn. */ |
laststart = b; |
#ifdef WCHAR |
/* Is this exactn binary data or character? */ |
is_exactn_bin = is_binary[p - 1 - pattern]; |
if (is_exactn_bin) |
BUF_PUSH_2 (exactn_bin, 0); |
else |
BUF_PUSH_2 (exactn, 0); |
#else |
BUF_PUSH_2 (exactn, 0); |
#endif /* WCHAR */ |
pending_exact = b - 1; |
} |
BUF_PUSH (c); |
(*pending_exact)++; |
break; |
} /* switch (c) */ |
} /* while p != pend */ |
/* Through the pattern now. */ |
if (fixup_alt_jump) |
STORE_JUMP (jump_past_alt, fixup_alt_jump, b); |
if (!COMPILE_STACK_EMPTY) |
FREE_STACK_RETURN (REG_EPAREN); |
/* If we don't want backtracking, force success |
the first time we reach the end of the compiled pattern. */ |
if (syntax & RE_NO_POSIX_BACKTRACKING) |
BUF_PUSH (succeed); |
#ifdef WCHAR |
free (pattern); |
free (mbs_offset); |
free (is_binary); |
#endif |
free (compile_stack.stack); |
/* We have succeeded; set the length of the buffer. */ |
#ifdef WCHAR |
bufp->used = (uintptr_t) b - (uintptr_t) COMPILED_BUFFER_VAR; |
#else |
bufp->used = b - bufp->buffer; |
#endif |
#ifdef DEBUG |
if (debug) |
{ |
DEBUG_PRINT1 ("\nCompiled pattern: \n"); |
PREFIX(print_compiled_pattern) (bufp); |
} |
#endif /* DEBUG */ |
#ifndef MATCH_MAY_ALLOCATE |
/* Initialize the failure stack to the largest possible stack. This |
isn't necessary unless we're trying to avoid calling alloca in |
the search and match routines. */ |
{ |
int num_regs = bufp->re_nsub + 1; |
/* Since DOUBLE_FAIL_STACK refuses to double only if the current size |
is strictly greater than re_max_failures, the largest possible stack |
is 2 * re_max_failures failure points. */ |
if (fail_stack.size < (2 * re_max_failures * MAX_FAILURE_ITEMS)) |
{ |
fail_stack.size = (2 * re_max_failures * MAX_FAILURE_ITEMS); |
# ifdef emacs |
if (! fail_stack.stack) |
fail_stack.stack |
= (PREFIX(fail_stack_elt_t) *) xmalloc (fail_stack.size |
* sizeof (PREFIX(fail_stack_elt_t))); |
else |
fail_stack.stack |
= (PREFIX(fail_stack_elt_t) *) xrealloc (fail_stack.stack, |
(fail_stack.size |
* sizeof (PREFIX(fail_stack_elt_t)))); |
# else /* not emacs */ |
if (! fail_stack.stack) |
fail_stack.stack |
= (PREFIX(fail_stack_elt_t) *) malloc (fail_stack.size |
* sizeof (PREFIX(fail_stack_elt_t))); |
else |
fail_stack.stack |
= (PREFIX(fail_stack_elt_t) *) realloc (fail_stack.stack, |
(fail_stack.size |
* sizeof (PREFIX(fail_stack_elt_t)))); |
# endif /* not emacs */ |
} |
PREFIX(regex_grow_registers) (num_regs); |
} |
#endif /* not MATCH_MAY_ALLOCATE */ |
return REG_NOERROR; |
} /* regex_compile */ |
/* Subroutines for `regex_compile'. */ |
/* Store OP at LOC followed by two-byte integer parameter ARG. */ |
/* ifdef WCHAR, integer parameter is 1 wchar_t. */ |
static void |
PREFIX(store_op1) (re_opcode_t op, UCHAR_T *loc, int arg) |
{ |
*loc = (UCHAR_T) op; |
STORE_NUMBER (loc + 1, arg); |
} |
/* Like `store_op1', but for two two-byte parameters ARG1 and ARG2. */ |
/* ifdef WCHAR, integer parameter is 1 wchar_t. */ |
static void |
PREFIX(store_op2) (re_opcode_t op, UCHAR_T *loc, int arg1, int arg2) |
{ |
*loc = (UCHAR_T) op; |
STORE_NUMBER (loc + 1, arg1); |
STORE_NUMBER (loc + 1 + OFFSET_ADDRESS_SIZE, arg2); |
} |
/* Copy the bytes from LOC to END to open up three bytes of space at LOC |
for OP followed by two-byte integer parameter ARG. */ |
/* ifdef WCHAR, integer parameter is 1 wchar_t. */ |
static void |
PREFIX(insert_op1) (re_opcode_t op, UCHAR_T *loc, int arg, UCHAR_T *end) |
{ |
register UCHAR_T *pfrom = end; |
register UCHAR_T *pto = end + 1 + OFFSET_ADDRESS_SIZE; |
while (pfrom != loc) |
*--pto = *--pfrom; |
PREFIX(store_op1) (op, loc, arg); |
} |
/* Like `insert_op1', but for two two-byte parameters ARG1 and ARG2. */ |
/* ifdef WCHAR, integer parameter is 1 wchar_t. */ |
static void |
PREFIX(insert_op2) (re_opcode_t op, UCHAR_T *loc, int arg1, |
int arg2, UCHAR_T *end) |
{ |
register UCHAR_T *pfrom = end; |
register UCHAR_T *pto = end + 1 + 2 * OFFSET_ADDRESS_SIZE; |
while (pfrom != loc) |
*--pto = *--pfrom; |
PREFIX(store_op2) (op, loc, arg1, arg2); |
} |
/* P points to just after a ^ in PATTERN. Return true if that ^ comes |
after an alternative or a begin-subexpression. We assume there is at |
least one character before the ^. */ |
static boolean |
PREFIX(at_begline_loc_p) (const CHAR_T *pattern, const CHAR_T *p, |
reg_syntax_t syntax) |
{ |
const CHAR_T *prev = p - 2; |
boolean prev_prev_backslash = prev > pattern && prev[-1] == '\\'; |
return |
/* After a subexpression? */ |
(*prev == '(' && (syntax & RE_NO_BK_PARENS || prev_prev_backslash)) |
/* After an alternative? */ |
|| (*prev == '|' && (syntax & RE_NO_BK_VBAR || prev_prev_backslash)); |
} |
/* The dual of at_begline_loc_p. This one is for $. We assume there is |
at least one character after the $, i.e., `P < PEND'. */ |
static boolean |
PREFIX(at_endline_loc_p) (const CHAR_T *p, const CHAR_T *pend, |
reg_syntax_t syntax) |
{ |
const CHAR_T *next = p; |
boolean next_backslash = *next == '\\'; |
const CHAR_T *next_next = p + 1 < pend ? p + 1 : 0; |
return |
/* Before a subexpression? */ |
(syntax & RE_NO_BK_PARENS ? *next == ')' |
: next_backslash && next_next && *next_next == ')') |
/* Before an alternative? */ |
|| (syntax & RE_NO_BK_VBAR ? *next == '|' |
: next_backslash && next_next && *next_next == '|'); |
} |
#else /* not INSIDE_RECURSION */ |
/* Returns true if REGNUM is in one of COMPILE_STACK's elements and |
false if it's not. */ |
static boolean |
group_in_compile_stack (compile_stack_type compile_stack, regnum_t regnum) |
{ |
int this_element; |
for (this_element = compile_stack.avail - 1; |
this_element >= 0; |
this_element--) |
if (compile_stack.stack[this_element].regnum == regnum) |
return true; |
return false; |
} |
#endif /* not INSIDE_RECURSION */ |
#ifdef INSIDE_RECURSION |
#ifdef WCHAR |
/* This insert space, which size is "num", into the pattern at "loc". |
"end" must point the end of the allocated buffer. */ |
static void |
insert_space (int num, CHAR_T *loc, CHAR_T *end) |
{ |
register CHAR_T *pto = end; |
register CHAR_T *pfrom = end - num; |
while (pfrom >= loc) |
*pto-- = *pfrom--; |
} |
#endif /* WCHAR */ |
#ifdef WCHAR |
static reg_errcode_t |
wcs_compile_range (CHAR_T range_start_char, const CHAR_T **p_ptr, |
const CHAR_T *pend, RE_TRANSLATE_TYPE translate, |
reg_syntax_t syntax, CHAR_T *b, CHAR_T *char_set) |
{ |
const CHAR_T *p = *p_ptr; |
CHAR_T range_start, range_end; |
reg_errcode_t ret; |
# ifdef _LIBC |
uint32_t nrules; |
uint32_t start_val, end_val; |
# endif |
if (p == pend) |
return REG_ERANGE; |
# ifdef _LIBC |
nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); |
if (nrules != 0) |
{ |
const char *collseq = (const char *) _NL_CURRENT(LC_COLLATE, |
_NL_COLLATE_COLLSEQWC); |
const unsigned char *extra = (const unsigned char *) |
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_EXTRAMB); |
if (range_start_char < -1) |
{ |
/* range_start is a collating symbol. */ |
int32_t *wextra; |
/* Retreive the index and get collation sequence value. */ |
wextra = (int32_t*)(extra + char_set[-range_start_char]); |
start_val = wextra[1 + *wextra]; |
} |
else |
start_val = collseq_table_lookup(collseq, TRANSLATE(range_start_char)); |
end_val = collseq_table_lookup (collseq, TRANSLATE (p[0])); |
/* Report an error if the range is empty and the syntax prohibits |
this. */ |
ret = ((syntax & RE_NO_EMPTY_RANGES) |
&& (start_val > end_val))? REG_ERANGE : REG_NOERROR; |
/* Insert space to the end of the char_ranges. */ |
insert_space(2, b - char_set[5] - 2, b - 1); |
*(b - char_set[5] - 2) = (wchar_t)start_val; |
*(b - char_set[5] - 1) = (wchar_t)end_val; |
char_set[4]++; /* ranges_index */ |
} |
else |
# endif |
{ |
range_start = (range_start_char >= 0)? TRANSLATE (range_start_char): |
range_start_char; |
range_end = TRANSLATE (p[0]); |
/* Report an error if the range is empty and the syntax prohibits |
this. */ |
ret = ((syntax & RE_NO_EMPTY_RANGES) |
&& (range_start > range_end))? REG_ERANGE : REG_NOERROR; |
/* Insert space to the end of the char_ranges. */ |
insert_space(2, b - char_set[5] - 2, b - 1); |
*(b - char_set[5] - 2) = range_start; |
*(b - char_set[5] - 1) = range_end; |
char_set[4]++; /* ranges_index */ |
} |
/* Have to increment the pointer into the pattern string, so the |
caller isn't still at the ending character. */ |
(*p_ptr)++; |
return ret; |
} |
#else /* BYTE */ |
/* Read the ending character of a range (in a bracket expression) from the |
uncompiled pattern *P_PTR (which ends at PEND). We assume the |
starting character is in `P[-2]'. (`P[-1]' is the character `-'.) |
Then we set the translation of all bits between the starting and |
ending characters (inclusive) in the compiled pattern B. |
Return an error code. |
We use these short variable names so we can use the same macros as |
`regex_compile' itself. */ |
static reg_errcode_t |
byte_compile_range (unsigned int range_start_char, const char **p_ptr, |
const char *pend, RE_TRANSLATE_TYPE translate, |
reg_syntax_t syntax, unsigned char *b) |
{ |
unsigned this_char; |
const char *p = *p_ptr; |
reg_errcode_t ret; |
# if _LIBC |
const unsigned char *collseq; |
unsigned int start_colseq; |
unsigned int end_colseq; |
# else |
unsigned end_char; |
# endif |
if (p == pend) |
return REG_ERANGE; |
/* Have to increment the pointer into the pattern string, so the |
caller isn't still at the ending character. */ |
(*p_ptr)++; |
/* Report an error if the range is empty and the syntax prohibits this. */ |
ret = syntax & RE_NO_EMPTY_RANGES ? REG_ERANGE : REG_NOERROR; |
# if _LIBC |
collseq = (const unsigned char *) _NL_CURRENT (LC_COLLATE, |
_NL_COLLATE_COLLSEQMB); |
start_colseq = collseq[(unsigned char) TRANSLATE (range_start_char)]; |
end_colseq = collseq[(unsigned char) TRANSLATE (p[0])]; |
for (this_char = 0; this_char <= (unsigned char) -1; ++this_char) |
{ |
unsigned int this_colseq = collseq[(unsigned char) TRANSLATE (this_char)]; |
if (start_colseq <= this_colseq && this_colseq <= end_colseq) |
{ |
SET_LIST_BIT (TRANSLATE (this_char)); |
ret = REG_NOERROR; |
} |
} |
# else |
/* Here we see why `this_char' has to be larger than an `unsigned |
char' -- we would otherwise go into an infinite loop, since all |
characters <= 0xff. */ |
range_start_char = TRANSLATE (range_start_char); |
/* TRANSLATE(p[0]) is casted to char (not unsigned char) in TRANSLATE, |
and some compilers cast it to int implicitly, so following for_loop |
may fall to (almost) infinite loop. |
e.g. If translate[p[0]] = 0xff, end_char may equals to 0xffffffff. |
To avoid this, we cast p[0] to unsigned int and truncate it. */ |
end_char = ((unsigned)TRANSLATE(p[0]) & ((1 << BYTEWIDTH) - 1)); |
for (this_char = range_start_char; this_char <= end_char; ++this_char) |
{ |
SET_LIST_BIT (TRANSLATE (this_char)); |
ret = REG_NOERROR; |
} |
# endif |
return ret; |
} |
#endif /* WCHAR */ |
/* re_compile_fastmap computes a ``fastmap'' for the compiled pattern in |
BUFP. A fastmap records which of the (1 << BYTEWIDTH) possible |
characters can start a string that matches the pattern. This fastmap |
is used by re_search to skip quickly over impossible starting points. |
The caller must supply the address of a (1 << BYTEWIDTH)-byte data |
area as BUFP->fastmap. |
We set the `fastmap', `fastmap_accurate', and `can_be_null' fields in |
the pattern buffer. |
Returns 0 if we succeed, -2 if an internal error. */ |
#ifdef WCHAR |
/* local function for re_compile_fastmap. |
truncate wchar_t character to char. */ |
static unsigned char truncate_wchar (CHAR_T c); |
static unsigned char |
truncate_wchar (CHAR_T c) |
{ |
unsigned char buf[MB_CUR_MAX]; |
mbstate_t state; |
int retval; |
memset (&state, '\0', sizeof (state)); |
# ifdef _LIBC |
retval = __wcrtomb (buf, c, &state); |
# else |
retval = wcrtomb (buf, c, &state); |
# endif |
return retval > 0 ? buf[0] : (unsigned char) c; |
} |
#endif /* WCHAR */ |
static int |
PREFIX(re_compile_fastmap) (struct re_pattern_buffer *bufp) |
{ |
int j, k; |
#ifdef MATCH_MAY_ALLOCATE |
PREFIX(fail_stack_type) fail_stack; |
#endif |
#ifndef REGEX_MALLOC |
char *destination; |
#endif |
register char *fastmap = bufp->fastmap; |
#ifdef WCHAR |
/* We need to cast pattern to (wchar_t*), because we casted this compiled |
pattern to (char*) in regex_compile. */ |
UCHAR_T *pattern = (UCHAR_T*)bufp->buffer; |
register UCHAR_T *pend = (UCHAR_T*) (bufp->buffer + bufp->used); |
#else /* BYTE */ |
UCHAR_T *pattern = bufp->buffer; |
register UCHAR_T *pend = pattern + bufp->used; |
#endif /* WCHAR */ |
UCHAR_T *p = pattern; |
#ifdef REL_ALLOC |
/* This holds the pointer to the failure stack, when |
it is allocated relocatably. */ |
fail_stack_elt_t *failure_stack_ptr; |
#endif |
/* Assume that each path through the pattern can be null until |
proven otherwise. We set this false at the bottom of switch |
statement, to which we get only if a particular path doesn't |
match the empty string. */ |
boolean path_can_be_null = true; |
/* We aren't doing a `succeed_n' to begin with. */ |
boolean succeed_n_p = false; |
assert (fastmap != NULL && p != NULL); |
INIT_FAIL_STACK (); |
bzero (fastmap, 1 << BYTEWIDTH); /* Assume nothing's valid. */ |
bufp->fastmap_accurate = 1; /* It will be when we're done. */ |
bufp->can_be_null = 0; |
while (1) |
{ |
if (p == pend || *p == (UCHAR_T) succeed) |
{ |
/* We have reached the (effective) end of pattern. */ |
if (!FAIL_STACK_EMPTY ()) |
{ |
bufp->can_be_null |= path_can_be_null; |
/* Reset for next path. */ |
path_can_be_null = true; |
p = fail_stack.stack[--fail_stack.avail].pointer; |
continue; |
} |
else |
break; |
} |
/* We should never be about to go beyond the end of the pattern. */ |
assert (p < pend); |
switch (SWITCH_ENUM_CAST ((re_opcode_t) *p++)) |
{ |
/* I guess the idea here is to simply not bother with a fastmap |
if a backreference is used, since it's too hard to figure out |
the fastmap for the corresponding group. Setting |
`can_be_null' stops `re_search_2' from using the fastmap, so |
that is all we do. */ |
case duplicate: |
bufp->can_be_null = 1; |
goto done; |
/* Following are the cases which match a character. These end |
with `break'. */ |
#ifdef WCHAR |
case exactn: |
fastmap[truncate_wchar(p[1])] = 1; |
break; |
#else /* BYTE */ |
case exactn: |
fastmap[p[1]] = 1; |
break; |
#endif /* WCHAR */ |
#ifdef MBS_SUPPORT |
case exactn_bin: |
fastmap[p[1]] = 1; |
break; |
#endif |
#ifdef WCHAR |
/* It is hard to distinguish fastmap from (multi byte) characters |
which depends on current locale. */ |
case charset: |
case charset_not: |
case wordchar: |
case notwordchar: |
bufp->can_be_null = 1; |
goto done; |
#else /* BYTE */ |
case charset: |
for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--) |
if (p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH))) |
fastmap[j] = 1; |
break; |
case charset_not: |
/* Chars beyond end of map must be allowed. */ |
for (j = *p * BYTEWIDTH; j < (1 << BYTEWIDTH); j++) |
fastmap[j] = 1; |
for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--) |
if (!(p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH)))) |
fastmap[j] = 1; |
break; |
case wordchar: |
for (j = 0; j < (1 << BYTEWIDTH); j++) |
if (SYNTAX (j) == Sword) |
fastmap[j] = 1; |
break; |
case notwordchar: |
for (j = 0; j < (1 << BYTEWIDTH); j++) |
if (SYNTAX (j) != Sword) |
fastmap[j] = 1; |
break; |
#endif /* WCHAR */ |
case anychar: |
{ |
int fastmap_newline = fastmap['\n']; |
/* `.' matches anything ... */ |
for (j = 0; j < (1 << BYTEWIDTH); j++) |
fastmap[j] = 1; |
/* ... except perhaps newline. */ |
if (!(bufp->syntax & RE_DOT_NEWLINE)) |
fastmap['\n'] = fastmap_newline; |
/* Return if we have already set `can_be_null'; if we have, |
then the fastmap is irrelevant. Something's wrong here. */ |
else if (bufp->can_be_null) |
goto done; |
/* Otherwise, have to check alternative paths. */ |
break; |
} |
#ifdef emacs |
case syntaxspec: |
k = *p++; |
for (j = 0; j < (1 << BYTEWIDTH); j++) |
if (SYNTAX (j) == (enum syntaxcode) k) |
fastmap[j] = 1; |
break; |
case notsyntaxspec: |
k = *p++; |
for (j = 0; j < (1 << BYTEWIDTH); j++) |
if (SYNTAX (j) != (enum syntaxcode) k) |
fastmap[j] = 1; |
break; |
/* All cases after this match the empty string. These end with |
`continue'. */ |
case before_dot: |
case at_dot: |
case after_dot: |
continue; |
#endif /* emacs */ |
case no_op: |
case begline: |
case endline: |
case begbuf: |
case endbuf: |
case wordbound: |
case notwordbound: |
case wordbeg: |
case wordend: |
case push_dummy_failure: |
continue; |
case jump_n: |
case pop_failure_jump: |
case maybe_pop_jump: |
case jump: |
case jump_past_alt: |
case dummy_failure_jump: |
EXTRACT_NUMBER_AND_INCR (j, p); |
p += j; |
if (j > 0) |
continue; |
/* Jump backward implies we just went through the body of a |
loop and matched nothing. Opcode jumped to should be |
`on_failure_jump' or `succeed_n'. Just treat it like an |
ordinary jump. For a * loop, it has pushed its failure |
point already; if so, discard that as redundant. */ |
if ((re_opcode_t) *p != on_failure_jump |
&& (re_opcode_t) *p != succeed_n) |
continue; |
p++; |
EXTRACT_NUMBER_AND_INCR (j, p); |
p += j; |
/* If what's on the stack is where we are now, pop it. */ |
if (!FAIL_STACK_EMPTY () |
&& fail_stack.stack[fail_stack.avail - 1].pointer == p) |
fail_stack.avail--; |
continue; |
case on_failure_jump: |
case on_failure_keep_string_jump: |
handle_on_failure_jump: |
EXTRACT_NUMBER_AND_INCR (j, p); |
/* For some patterns, e.g., `(a?)?', `p+j' here points to the |
end of the pattern. We don't want to push such a point, |
since when we restore it above, entering the switch will |
increment `p' past the end of the pattern. We don't need |
to push such a point since we obviously won't find any more |
fastmap entries beyond `pend'. Such a pattern can match |
the null string, though. */ |
if (p + j < pend) |
{ |
if (!PUSH_PATTERN_OP (p + j, fail_stack)) |
{ |
RESET_FAIL_STACK (); |
return -2; |
} |
} |
else |
bufp->can_be_null = 1; |
if (succeed_n_p) |
{ |
EXTRACT_NUMBER_AND_INCR (k, p); /* Skip the n. */ |
succeed_n_p = false; |
} |
continue; |
case succeed_n: |
/* Get to the number of times to succeed. */ |
p += OFFSET_ADDRESS_SIZE; |
/* Increment p past the n for when k != 0. */ |
EXTRACT_NUMBER_AND_INCR (k, p); |
if (k == 0) |
{ |
p -= 2 * OFFSET_ADDRESS_SIZE; |
succeed_n_p = true; /* Spaghetti code alert. */ |
goto handle_on_failure_jump; |
} |
continue; |
case set_number_at: |
p += 2 * OFFSET_ADDRESS_SIZE; |
continue; |
case start_memory: |
case stop_memory: |
p += 2; |
continue; |
default: |
abort (); /* We have listed all the cases. */ |
} /* switch *p++ */ |
/* Getting here means we have found the possible starting |
characters for one path of the pattern -- and that the empty |
string does not match. We need not follow this path further. |
Instead, look at the next alternative (remembered on the |
stack), or quit if no more. The test at the top of the loop |
does these things. */ |
path_can_be_null = false; |
p = pend; |
} /* while p */ |
/* Set `can_be_null' for the last path (also the first path, if the |
pattern is empty). */ |
bufp->can_be_null |= path_can_be_null; |
done: |
RESET_FAIL_STACK (); |
return 0; |
} |
#else /* not INSIDE_RECURSION */ |
int |
re_compile_fastmap (struct re_pattern_buffer *bufp) |
{ |
# ifdef MBS_SUPPORT |
if (MB_CUR_MAX != 1) |
return wcs_re_compile_fastmap(bufp); |
else |
# endif |
return byte_re_compile_fastmap(bufp); |
} /* re_compile_fastmap */ |
#ifdef _LIBC |
weak_alias (__re_compile_fastmap, re_compile_fastmap) |
#endif |
/* Set REGS to hold NUM_REGS registers, storing them in STARTS and |
ENDS. Subsequent matches using PATTERN_BUFFER and REGS will use |
this memory for recording register information. STARTS and ENDS |
must be allocated using the malloc library routine, and must each |
be at least NUM_REGS * sizeof (regoff_t) bytes long. |
If NUM_REGS == 0, then subsequent matches should allocate their own |
register data. |
Unless this function is called, the first search or match using |
PATTERN_BUFFER will allocate its own register data, without |
freeing the old data. */ |
void |
re_set_registers (struct re_pattern_buffer *bufp, |
struct re_registers *regs, unsigned num_regs, |
regoff_t *starts, regoff_t *ends) |
{ |
if (num_regs) |
{ |
bufp->regs_allocated = REGS_REALLOCATE; |
regs->num_regs = num_regs; |
regs->start = starts; |
regs->end = ends; |
} |
else |
{ |
bufp->regs_allocated = REGS_UNALLOCATED; |
regs->num_regs = 0; |
regs->start = regs->end = (regoff_t *) 0; |
} |
} |
#ifdef _LIBC |
weak_alias (__re_set_registers, re_set_registers) |
#endif |
/* Searching routines. */ |
/* Like re_search_2, below, but only one string is specified, and |
doesn't let you say where to stop matching. */ |
int |
re_search (struct re_pattern_buffer *bufp, const char *string, int size, |
int startpos, int range, struct re_registers *regs) |
{ |
return re_search_2 (bufp, NULL, 0, string, size, startpos, range, |
regs, size); |
} |
#ifdef _LIBC |
weak_alias (__re_search, re_search) |
#endif |
/* Using the compiled pattern in BUFP->buffer, first tries to match the |
virtual concatenation of STRING1 and STRING2, starting first at index |
STARTPOS, then at STARTPOS + 1, and so on. |
STRING1 and STRING2 have length SIZE1 and SIZE2, respectively. |
RANGE is how far to scan while trying to match. RANGE = 0 means try |
only at STARTPOS; in general, the last start tried is STARTPOS + |
RANGE. |
In REGS, return the indices of the virtual concatenation of STRING1 |
and STRING2 that matched the entire BUFP->buffer and its contained |
subexpressions. |
Do not consider matching one past the index STOP in the virtual |
concatenation of STRING1 and STRING2. |
We return either the position in the strings at which the match was |
found, -1 if no match, or -2 if error (such as failure |
stack overflow). */ |
int |
re_search_2 (struct re_pattern_buffer *bufp, const char *string1, int size1, |
const char *string2, int size2, int startpos, int range, |
struct re_registers *regs, int stop) |
{ |
# ifdef MBS_SUPPORT |
if (MB_CUR_MAX != 1) |
return wcs_re_search_2 (bufp, string1, size1, string2, size2, startpos, |
range, regs, stop); |
else |
# endif |
return byte_re_search_2 (bufp, string1, size1, string2, size2, startpos, |
range, regs, stop); |
} /* re_search_2 */ |
#ifdef _LIBC |
weak_alias (__re_search_2, re_search_2) |
#endif |
#endif /* not INSIDE_RECURSION */ |
#ifdef INSIDE_RECURSION |
#ifdef MATCH_MAY_ALLOCATE |
# define FREE_VAR(var) if (var) REGEX_FREE (var); var = NULL |
#else |
# define FREE_VAR(var) free (var); var = NULL |
#endif |
#ifdef WCHAR |
# define MAX_ALLOCA_SIZE 2000 |
# define FREE_WCS_BUFFERS() \ |
do { \ |
if (size1 > MAX_ALLOCA_SIZE) \ |
{ \ |
free (wcs_string1); \ |
free (mbs_offset1); \ |
} \ |
else \ |
{ \ |
FREE_VAR (wcs_string1); \ |
FREE_VAR (mbs_offset1); \ |
} \ |
if (size2 > MAX_ALLOCA_SIZE) \ |
{ \ |
free (wcs_string2); \ |
free (mbs_offset2); \ |
} \ |
else \ |
{ \ |
FREE_VAR (wcs_string2); \ |
FREE_VAR (mbs_offset2); \ |
} \ |
} while (0) |
#endif |
static int |
PREFIX(re_search_2) (struct re_pattern_buffer *bufp, const char *string1, |
int size1, const char *string2, int size2, |
int startpos, int range, |
struct re_registers *regs, int stop) |
{ |
int val; |
register char *fastmap = bufp->fastmap; |
register RE_TRANSLATE_TYPE translate = bufp->translate; |
int total_size = size1 + size2; |
int endpos = startpos + range; |
#ifdef WCHAR |
/* We need wchar_t* buffers correspond to cstring1, cstring2. */ |
wchar_t *wcs_string1 = NULL, *wcs_string2 = NULL; |
/* We need the size of wchar_t buffers correspond to csize1, csize2. */ |
int wcs_size1 = 0, wcs_size2 = 0; |
/* offset buffer for optimizatoin. See convert_mbs_to_wc. */ |
int *mbs_offset1 = NULL, *mbs_offset2 = NULL; |
/* They hold whether each wchar_t is binary data or not. */ |
char *is_binary = NULL; |
#endif /* WCHAR */ |
/* Check for out-of-range STARTPOS. */ |
if (startpos < 0 || startpos > total_size) |
return -1; |
/* Fix up RANGE if it might eventually take us outside |
the virtual concatenation of STRING1 and STRING2. |
Make sure we won't move STARTPOS below 0 or above TOTAL_SIZE. */ |
if (endpos < 0) |
range = 0 - startpos; |
else if (endpos > total_size) |
range = total_size - startpos; |
/* If the search isn't to be a backwards one, don't waste time in a |
search for a pattern that must be anchored. */ |
if (bufp->used > 0 && range > 0 |
&& ((re_opcode_t) bufp->buffer[0] == begbuf |
/* `begline' is like `begbuf' if it cannot match at newlines. */ |
|| ((re_opcode_t) bufp->buffer[0] == begline |
&& !bufp->newline_anchor))) |
{ |
if (startpos > 0) |
return -1; |
else |
range = 1; |
} |
#ifdef emacs |
/* In a forward search for something that starts with \=. |
don't keep searching past point. */ |
if (bufp->used > 0 && (re_opcode_t) bufp->buffer[0] == at_dot && range > 0) |
{ |
range = PT - startpos; |
if (range <= 0) |
return -1; |
} |
#endif /* emacs */ |
/* Update the fastmap now if not correct already. */ |
if (fastmap && !bufp->fastmap_accurate) |
if (re_compile_fastmap (bufp) == -2) |
return -2; |
#ifdef WCHAR |
/* Allocate wchar_t array for wcs_string1 and wcs_string2 and |
fill them with converted string. */ |
if (size1 != 0) |
{ |
if (size1 > MAX_ALLOCA_SIZE) |
{ |
wcs_string1 = TALLOC (size1 + 1, CHAR_T); |
mbs_offset1 = TALLOC (size1 + 1, int); |
is_binary = TALLOC (size1 + 1, char); |
} |
else |
{ |
wcs_string1 = REGEX_TALLOC (size1 + 1, CHAR_T); |
mbs_offset1 = REGEX_TALLOC (size1 + 1, int); |
is_binary = REGEX_TALLOC (size1 + 1, char); |
} |
if (!wcs_string1 || !mbs_offset1 || !is_binary) |
{ |
if (size1 > MAX_ALLOCA_SIZE) |
{ |
free (wcs_string1); |
free (mbs_offset1); |
free (is_binary); |
} |
else |
{ |
FREE_VAR (wcs_string1); |
FREE_VAR (mbs_offset1); |
FREE_VAR (is_binary); |
} |
return -2; |
} |
wcs_size1 = convert_mbs_to_wcs(wcs_string1, string1, size1, |
mbs_offset1, is_binary); |
wcs_string1[wcs_size1] = L'\0'; /* for a sentinel */ |
if (size1 > MAX_ALLOCA_SIZE) |
free (is_binary); |
else |
FREE_VAR (is_binary); |
} |
if (size2 != 0) |
{ |
if (size2 > MAX_ALLOCA_SIZE) |
{ |
wcs_string2 = TALLOC (size2 + 1, CHAR_T); |
mbs_offset2 = TALLOC (size2 + 1, int); |
is_binary = TALLOC (size2 + 1, char); |
} |
else |
{ |
wcs_string2 = REGEX_TALLOC (size2 + 1, CHAR_T); |
mbs_offset2 = REGEX_TALLOC (size2 + 1, int); |
is_binary = REGEX_TALLOC (size2 + 1, char); |
} |
if (!wcs_string2 || !mbs_offset2 || !is_binary) |
{ |
FREE_WCS_BUFFERS (); |
if (size2 > MAX_ALLOCA_SIZE) |
free (is_binary); |
else |
FREE_VAR (is_binary); |
return -2; |
} |
wcs_size2 = convert_mbs_to_wcs(wcs_string2, string2, size2, |
mbs_offset2, is_binary); |
wcs_string2[wcs_size2] = L'\0'; /* for a sentinel */ |
if (size2 > MAX_ALLOCA_SIZE) |
free (is_binary); |
else |
FREE_VAR (is_binary); |
} |
#endif /* WCHAR */ |
/* Loop through the string, looking for a place to start matching. */ |
for (;;) |
{ |
/* If a fastmap is supplied, skip quickly over characters that |
cannot be the start of a match. If the pattern can match the |
null string, however, we don't need to skip characters; we want |
the first null string. */ |
if (fastmap && startpos < total_size && !bufp->can_be_null) |
{ |
if (range > 0) /* Searching forwards. */ |
{ |
register const char *d; |
register int lim = 0; |
int irange = range; |
if (startpos < size1 && startpos + range >= size1) |
lim = range - (size1 - startpos); |
d = (startpos >= size1 ? string2 - size1 : string1) + startpos; |
/* Written out as an if-else to avoid testing `translate' |
inside the loop. */ |
if (translate) |
while (range > lim |
&& !fastmap[(unsigned char) |
translate[(unsigned char) *d++]]) |
range--; |
else |
while (range > lim && !fastmap[(unsigned char) *d++]) |
range--; |
startpos += irange - range; |
} |
else /* Searching backwards. */ |
{ |
register CHAR_T c = (size1 == 0 || startpos >= size1 |
? string2[startpos - size1] |
: string1[startpos]); |
if (!fastmap[(unsigned char) TRANSLATE (c)]) |
goto advance; |
} |
} |
/* If can't match the null string, and that's all we have left, fail. */ |
if (range >= 0 && startpos == total_size && fastmap |
&& !bufp->can_be_null) |
{ |
#ifdef WCHAR |
FREE_WCS_BUFFERS (); |
#endif |
return -1; |
} |
#ifdef WCHAR |
val = wcs_re_match_2_internal (bufp, string1, size1, string2, |
size2, startpos, regs, stop, |
wcs_string1, wcs_size1, |
wcs_string2, wcs_size2, |
mbs_offset1, mbs_offset2); |
#else /* BYTE */ |
val = byte_re_match_2_internal (bufp, string1, size1, string2, |
size2, startpos, regs, stop); |
#endif /* BYTE */ |
#ifndef REGEX_MALLOC |
# ifdef C_ALLOCA |
alloca (0); |
# endif |
#endif |
if (val >= 0) |
{ |
#ifdef WCHAR |
FREE_WCS_BUFFERS (); |
#endif |
return startpos; |
} |
if (val == -2) |
{ |
#ifdef WCHAR |
FREE_WCS_BUFFERS (); |
#endif |
return -2; |
} |
advance: |
if (!range) |
break; |
else if (range > 0) |
{ |
range--; |
startpos++; |
} |
else |
{ |
range++; |
startpos--; |
} |
} |
#ifdef WCHAR |
FREE_WCS_BUFFERS (); |
#endif |
return -1; |
} |
#ifdef WCHAR |
/* This converts PTR, a pointer into one of the search wchar_t strings |
`string1' and `string2' into an multibyte string offset from the |
beginning of that string. We use mbs_offset to optimize. |
See convert_mbs_to_wcs. */ |
# define POINTER_TO_OFFSET(ptr) \ |
(FIRST_STRING_P (ptr) \ |
? ((regoff_t)(mbs_offset1 != NULL? mbs_offset1[(ptr)-string1] : 0)) \ |
: ((regoff_t)((mbs_offset2 != NULL? mbs_offset2[(ptr)-string2] : 0) \ |
+ csize1))) |
#else /* BYTE */ |
/* This converts PTR, a pointer into one of the search strings `string1' |
and `string2' into an offset from the beginning of that string. */ |
# define POINTER_TO_OFFSET(ptr) \ |
(FIRST_STRING_P (ptr) \ |
? ((regoff_t) ((ptr) - string1)) \ |
: ((regoff_t) ((ptr) - string2 + size1))) |
#endif /* WCHAR */ |
/* Macros for dealing with the split strings in re_match_2. */ |
#define MATCHING_IN_FIRST_STRING (dend == end_match_1) |
/* Call before fetching a character with *d. This switches over to |
string2 if necessary. */ |
#define PREFETCH() \ |
while (d == dend) \ |
{ \ |
/* End of string2 => fail. */ \ |
if (dend == end_match_2) \ |
goto fail; \ |
/* End of string1 => advance to string2. */ \ |
d = string2; \ |
dend = end_match_2; \ |
} |
/* Test if at very beginning or at very end of the virtual concatenation |
of `string1' and `string2'. If only one string, it's `string2'. */ |
#define AT_STRINGS_BEG(d) ((d) == (size1 ? string1 : string2) || !size2) |
#define AT_STRINGS_END(d) ((d) == end2) |
/* Test if D points to a character which is word-constituent. We have |
two special cases to check for: if past the end of string1, look at |
the first character in string2; and if before the beginning of |
string2, look at the last character in string1. */ |
#ifdef WCHAR |
/* Use internationalized API instead of SYNTAX. */ |
# define WORDCHAR_P(d) \ |
(iswalnum ((wint_t)((d) == end1 ? *string2 \ |
: (d) == string2 - 1 ? *(end1 - 1) : *(d))) != 0 \ |
|| ((d) == end1 ? *string2 \ |
: (d) == string2 - 1 ? *(end1 - 1) : *(d)) == L'_') |
#else /* BYTE */ |
# define WORDCHAR_P(d) \ |
(SYNTAX ((d) == end1 ? *string2 \ |
: (d) == string2 - 1 ? *(end1 - 1) : *(d)) \ |
== Sword) |
#endif /* WCHAR */ |
/* Disabled due to a compiler bug -- see comment at case wordbound */ |
#if 0 |
/* Test if the character before D and the one at D differ with respect |
to being word-constituent. */ |
#define AT_WORD_BOUNDARY(d) \ |
(AT_STRINGS_BEG (d) || AT_STRINGS_END (d) \ |
|| WORDCHAR_P (d - 1) != WORDCHAR_P (d)) |
#endif |
/* Free everything we malloc. */ |
#ifdef MATCH_MAY_ALLOCATE |
# ifdef WCHAR |
# define FREE_VARIABLES() \ |
do { \ |
REGEX_FREE_STACK (fail_stack.stack); \ |
FREE_VAR (regstart); \ |
FREE_VAR (regend); \ |
FREE_VAR (old_regstart); \ |
FREE_VAR (old_regend); \ |
FREE_VAR (best_regstart); \ |
FREE_VAR (best_regend); \ |
FREE_VAR (reg_info); \ |
FREE_VAR (reg_dummy); \ |
FREE_VAR (reg_info_dummy); \ |
if (!cant_free_wcs_buf) \ |
{ \ |
FREE_VAR (string1); \ |
FREE_VAR (string2); \ |
FREE_VAR (mbs_offset1); \ |
FREE_VAR (mbs_offset2); \ |
} \ |
} while (0) |
# else /* BYTE */ |
# define FREE_VARIABLES() \ |
do { \ |
REGEX_FREE_STACK (fail_stack.stack); \ |
FREE_VAR (regstart); \ |
FREE_VAR (regend); \ |
FREE_VAR (old_regstart); \ |
FREE_VAR (old_regend); \ |
FREE_VAR (best_regstart); \ |
FREE_VAR (best_regend); \ |
FREE_VAR (reg_info); \ |
FREE_VAR (reg_dummy); \ |
FREE_VAR (reg_info_dummy); \ |
} while (0) |
# endif /* WCHAR */ |
#else |
# ifdef WCHAR |
# define FREE_VARIABLES() \ |
do { \ |
if (!cant_free_wcs_buf) \ |
{ \ |
FREE_VAR (string1); \ |
FREE_VAR (string2); \ |
FREE_VAR (mbs_offset1); \ |
FREE_VAR (mbs_offset2); \ |
} \ |
} while (0) |
# else /* BYTE */ |
# define FREE_VARIABLES() ((void)0) /* Do nothing! But inhibit gcc warning. */ |
# endif /* WCHAR */ |
#endif /* not MATCH_MAY_ALLOCATE */ |
/* These values must meet several constraints. They must not be valid |
register values; since we have a limit of 255 registers (because |
we use only one byte in the pattern for the register number), we can |
use numbers larger than 255. They must differ by 1, because of |
NUM_FAILURE_ITEMS above. And the value for the lowest register must |
be larger than the value for the highest register, so we do not try |
to actually save any registers when none are active. */ |
#define NO_HIGHEST_ACTIVE_REG (1 << BYTEWIDTH) |
#define NO_LOWEST_ACTIVE_REG (NO_HIGHEST_ACTIVE_REG + 1) |
#else /* not INSIDE_RECURSION */ |
/* Matching routines. */ |
#ifndef emacs /* Emacs never uses this. */ |
/* re_match is like re_match_2 except it takes only a single string. */ |
int |
re_match (struct re_pattern_buffer *bufp, const char *string, |
int size, int pos, struct re_registers *regs) |
{ |
int result; |
# ifdef MBS_SUPPORT |
if (MB_CUR_MAX != 1) |
result = wcs_re_match_2_internal (bufp, NULL, 0, string, size, |
pos, regs, size, |
NULL, 0, NULL, 0, NULL, NULL); |
else |
# endif |
result = byte_re_match_2_internal (bufp, NULL, 0, string, size, |
pos, regs, size); |
# ifndef REGEX_MALLOC |
# ifdef C_ALLOCA |
alloca (0); |
# endif |
# endif |
return result; |
} |
# ifdef _LIBC |
weak_alias (__re_match, re_match) |
# endif |
#endif /* not emacs */ |
#endif /* not INSIDE_RECURSION */ |
#ifdef INSIDE_RECURSION |
static boolean PREFIX(group_match_null_string_p) (UCHAR_T **p, |
UCHAR_T *end, |
PREFIX(register_info_type) *reg_info); |
static boolean PREFIX(alt_match_null_string_p) (UCHAR_T *p, |
UCHAR_T *end, |
PREFIX(register_info_type) *reg_info); |
static boolean PREFIX(common_op_match_null_string_p) (UCHAR_T **p, |
UCHAR_T *end, |
PREFIX(register_info_type) *reg_info); |
static int PREFIX(bcmp_translate) (const CHAR_T *s1, const CHAR_T *s2, |
int len, char *translate); |
#else /* not INSIDE_RECURSION */ |
/* re_match_2 matches the compiled pattern in BUFP against the |
the (virtual) concatenation of STRING1 and STRING2 (of length SIZE1 |
and SIZE2, respectively). We start matching at POS, and stop |
matching at STOP. |
If REGS is non-null and the `no_sub' field of BUFP is nonzero, we |
store offsets for the substring each group matched in REGS. See the |
documentation for exactly how many groups we fill. |
We return -1 if no match, -2 if an internal error (such as the |
failure stack overflowing). Otherwise, we return the length of the |
matched substring. */ |
int |
re_match_2 (struct re_pattern_buffer *bufp, const char *string1, int size1, |
const char *string2, int size2, int pos, |
struct re_registers *regs, int stop) |
{ |
int result; |
# ifdef MBS_SUPPORT |
if (MB_CUR_MAX != 1) |
result = wcs_re_match_2_internal (bufp, string1, size1, string2, size2, |
pos, regs, stop, |
NULL, 0, NULL, 0, NULL, NULL); |
else |
# endif |
result = byte_re_match_2_internal (bufp, string1, size1, string2, size2, |
pos, regs, stop); |
#ifndef REGEX_MALLOC |
# ifdef C_ALLOCA |
alloca (0); |
# endif |
#endif |
return result; |
} |
#ifdef _LIBC |
weak_alias (__re_match_2, re_match_2) |
#endif |
#endif /* not INSIDE_RECURSION */ |
#ifdef INSIDE_RECURSION |
#ifdef WCHAR |
static int count_mbs_length (int *, int); |
/* This check the substring (from 0, to length) of the multibyte string, |
to which offset_buffer correspond. And count how many wchar_t_characters |
the substring occupy. We use offset_buffer to optimization. |
See convert_mbs_to_wcs. */ |
static int |
count_mbs_length(int *offset_buffer, int length) |
{ |
int upper, lower; |
/* Check whether the size is valid. */ |
if (length < 0) |
return -1; |
if (offset_buffer == NULL) |
return 0; |
/* If there are no multibyte character, offset_buffer[i] == i. |
Optmize for this case. */ |
if (offset_buffer[length] == length) |
return length; |
/* Set up upper with length. (because for all i, offset_buffer[i] >= i) */ |
upper = length; |
lower = 0; |
while (true) |
{ |
int middle = (lower + upper) / 2; |
if (middle == lower || middle == upper) |
break; |
if (offset_buffer[middle] > length) |
upper = middle; |
else if (offset_buffer[middle] < length) |
lower = middle; |
else |
return middle; |
} |
return -1; |
} |
#endif /* WCHAR */ |
/* This is a separate function so that we can force an alloca cleanup |
afterwards. */ |
#ifdef WCHAR |
static int |
wcs_re_match_2_internal (struct re_pattern_buffer *bufp, |
const char *cstring1, int csize1, |
const char *cstring2, int csize2, |
int pos, |
struct re_registers *regs, |
int stop, |
/* string1 == string2 == NULL means string1/2, size1/2 and |
mbs_offset1/2 need seting up in this function. */ |
/* We need wchar_t* buffers correspond to cstring1, cstring2. */ |
wchar_t *string1, int size1, |
wchar_t *string2, int size2, |
/* offset buffer for optimizatoin. See convert_mbs_to_wc. */ |
int *mbs_offset1, int *mbs_offset2) |
#else /* BYTE */ |
static int |
byte_re_match_2_internal (struct re_pattern_buffer *bufp, |
const char *string1, int size1, |
const char *string2, int size2, |
int pos, |
struct re_registers *regs, int stop) |
#endif /* BYTE */ |
{ |
/* General temporaries. */ |
int mcnt; |
UCHAR_T *p1; |
#ifdef WCHAR |
/* They hold whether each wchar_t is binary data or not. */ |
char *is_binary = NULL; |
/* If true, we can't free string1/2, mbs_offset1/2. */ |
int cant_free_wcs_buf = 1; |
#endif /* WCHAR */ |
/* Just past the end of the corresponding string. */ |
const CHAR_T *end1, *end2; |
/* Pointers into string1 and string2, just past the last characters in |
each to consider matching. */ |
const CHAR_T *end_match_1, *end_match_2; |
/* Where we are in the data, and the end of the current string. */ |
const CHAR_T *d, *dend; |
/* Where we are in the pattern, and the end of the pattern. */ |
#ifdef WCHAR |
UCHAR_T *pattern, *p; |
register UCHAR_T *pend; |
#else /* BYTE */ |
UCHAR_T *p = bufp->buffer; |
register UCHAR_T *pend = p + bufp->used; |
#endif /* WCHAR */ |
/* Mark the opcode just after a start_memory, so we can test for an |
empty subpattern when we get to the stop_memory. */ |
UCHAR_T *just_past_start_mem = 0; |
/* We use this to map every character in the string. */ |
RE_TRANSLATE_TYPE translate = bufp->translate; |
/* Failure point stack. Each place that can handle a failure further |
down the line pushes a failure point on this stack. It consists of |
restart, regend, and reg_info for all registers corresponding to |
the subexpressions we're currently inside, plus the number of such |
registers, and, finally, two char *'s. The first char * is where |
to resume scanning the pattern; the second one is where to resume |
scanning the strings. If the latter is zero, the failure point is |
a ``dummy''; if a failure happens and the failure point is a dummy, |
it gets discarded and the next next one is tried. */ |
#ifdef MATCH_MAY_ALLOCATE /* otherwise, this is global. */ |
PREFIX(fail_stack_type) fail_stack; |
#endif |
#ifdef DEBUG |
static unsigned failure_id; |
unsigned nfailure_points_pushed = 0, nfailure_points_popped = 0; |
#endif |
#ifdef REL_ALLOC |
/* This holds the pointer to the failure stack, when |
it is allocated relocatably. */ |
fail_stack_elt_t *failure_stack_ptr; |
#endif |
/* We fill all the registers internally, independent of what we |
return, for use in backreferences. The number here includes |
an element for register zero. */ |
size_t num_regs = bufp->re_nsub + 1; |
/* The currently active registers. */ |
active_reg_t lowest_active_reg = NO_LOWEST_ACTIVE_REG; |
active_reg_t highest_active_reg = NO_HIGHEST_ACTIVE_REG; |
/* Information on the contents of registers. These are pointers into |
the input strings; they record just what was matched (on this |
attempt) by a subexpression part of the pattern, that is, the |
regnum-th regstart pointer points to where in the pattern we began |
matching and the regnum-th regend points to right after where we |
stopped matching the regnum-th subexpression. (The zeroth register |
keeps track of what the whole pattern matches.) */ |
#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */ |
const CHAR_T **regstart, **regend; |
#endif |
/* If a group that's operated upon by a repetition operator fails to |
match anything, then the register for its start will need to be |
restored because it will have been set to wherever in the string we |
are when we last see its open-group operator. Similarly for a |
register's end. */ |
#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */ |
const CHAR_T **old_regstart, **old_regend; |
#endif |
/* The is_active field of reg_info helps us keep track of which (possibly |
nested) subexpressions we are currently in. The matched_something |
field of reg_info[reg_num] helps us tell whether or not we have |
matched any of the pattern so far this time through the reg_num-th |
subexpression. These two fields get reset each time through any |
loop their register is in. */ |
#ifdef MATCH_MAY_ALLOCATE /* otherwise, this is global. */ |
PREFIX(register_info_type) *reg_info; |
#endif |
/* The following record the register info as found in the above |
variables when we find a match better than any we've seen before. |
This happens as we backtrack through the failure points, which in |
turn happens only if we have not yet matched the entire string. */ |
unsigned best_regs_set = false; |
#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */ |
const CHAR_T **best_regstart, **best_regend; |
#endif |
/* Logically, this is `best_regend[0]'. But we don't want to have to |
allocate space for that if we're not allocating space for anything |
else (see below). Also, we never need info about register 0 for |
any of the other register vectors, and it seems rather a kludge to |
treat `best_regend' differently than the rest. So we keep track of |
the end of the best match so far in a separate variable. We |
initialize this to NULL so that when we backtrack the first time |
and need to test it, it's not garbage. */ |
const CHAR_T *match_end = NULL; |
/* This helps SET_REGS_MATCHED avoid doing redundant work. */ |
int set_regs_matched_done = 0; |
/* Used when we pop values we don't care about. */ |
#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */ |
const CHAR_T **reg_dummy; |
PREFIX(register_info_type) *reg_info_dummy; |
#endif |
#ifdef DEBUG |
/* Counts the total number of registers pushed. */ |
unsigned num_regs_pushed = 0; |
#endif |
DEBUG_PRINT1 ("\n\nEntering re_match_2.\n"); |
INIT_FAIL_STACK (); |
#ifdef MATCH_MAY_ALLOCATE |
/* Do not bother to initialize all the register variables if there are |
no groups in the pattern, as it takes a fair amount of time. If |
there are groups, we include space for register 0 (the whole |
pattern), even though we never use it, since it simplifies the |
array indexing. We should fix this. */ |
if (bufp->re_nsub) |
{ |
regstart = REGEX_TALLOC (num_regs, const CHAR_T *); |
regend = REGEX_TALLOC (num_regs, const CHAR_T *); |
old_regstart = REGEX_TALLOC (num_regs, const CHAR_T *); |
old_regend = REGEX_TALLOC (num_regs, const CHAR_T *); |
best_regstart = REGEX_TALLOC (num_regs, const CHAR_T *); |
best_regend = REGEX_TALLOC (num_regs, const CHAR_T *); |
reg_info = REGEX_TALLOC (num_regs, PREFIX(register_info_type)); |
reg_dummy = REGEX_TALLOC (num_regs, const CHAR_T *); |
reg_info_dummy = REGEX_TALLOC (num_regs, PREFIX(register_info_type)); |
if (!(regstart && regend && old_regstart && old_regend && reg_info |
&& best_regstart && best_regend && reg_dummy && reg_info_dummy)) |
{ |
FREE_VARIABLES (); |
return -2; |
} |
} |
else |
{ |
/* We must initialize all our variables to NULL, so that |
`FREE_VARIABLES' doesn't try to free them. */ |
regstart = regend = old_regstart = old_regend = best_regstart |
= best_regend = reg_dummy = NULL; |
reg_info = reg_info_dummy = (PREFIX(register_info_type) *) NULL; |
} |
#endif /* MATCH_MAY_ALLOCATE */ |
/* The starting position is bogus. */ |
#ifdef WCHAR |
if (pos < 0 || pos > csize1 + csize2) |
#else /* BYTE */ |
if (pos < 0 || pos > size1 + size2) |
#endif |
{ |
FREE_VARIABLES (); |
return -1; |
} |
#ifdef WCHAR |
/* Allocate wchar_t array for string1 and string2 and |
fill them with converted string. */ |
if (string1 == NULL && string2 == NULL) |
{ |
/* We need seting up buffers here. */ |
/* We must free wcs buffers in this function. */ |
cant_free_wcs_buf = 0; |
if (csize1 != 0) |
{ |
string1 = REGEX_TALLOC (csize1 + 1, CHAR_T); |
mbs_offset1 = REGEX_TALLOC (csize1 + 1, int); |
is_binary = REGEX_TALLOC (csize1 + 1, char); |
if (!string1 || !mbs_offset1 || !is_binary) |
{ |
FREE_VAR (string1); |
FREE_VAR (mbs_offset1); |
FREE_VAR (is_binary); |
return -2; |
} |
} |
if (csize2 != 0) |
{ |
string2 = REGEX_TALLOC (csize2 + 1, CHAR_T); |
mbs_offset2 = REGEX_TALLOC (csize2 + 1, int); |
is_binary = REGEX_TALLOC (csize2 + 1, char); |
if (!string2 || !mbs_offset2 || !is_binary) |
{ |
FREE_VAR (string1); |
FREE_VAR (mbs_offset1); |
FREE_VAR (string2); |
FREE_VAR (mbs_offset2); |
FREE_VAR (is_binary); |
return -2; |
} |
size2 = convert_mbs_to_wcs(string2, cstring2, csize2, |
mbs_offset2, is_binary); |
string2[size2] = L'\0'; /* for a sentinel */ |
FREE_VAR (is_binary); |
} |
} |
/* We need to cast pattern to (wchar_t*), because we casted this compiled |
pattern to (char*) in regex_compile. */ |
p = pattern = (CHAR_T*)bufp->buffer; |
pend = (CHAR_T*)(bufp->buffer + bufp->used); |
#endif /* WCHAR */ |
/* Initialize subexpression text positions to -1 to mark ones that no |
start_memory/stop_memory has been seen for. Also initialize the |
register information struct. */ |
for (mcnt = 1; (unsigned) mcnt < num_regs; mcnt++) |
{ |
regstart[mcnt] = regend[mcnt] |
= old_regstart[mcnt] = old_regend[mcnt] = REG_UNSET_VALUE; |
REG_MATCH_NULL_STRING_P (reg_info[mcnt]) = MATCH_NULL_UNSET_VALUE; |
IS_ACTIVE (reg_info[mcnt]) = 0; |
MATCHED_SOMETHING (reg_info[mcnt]) = 0; |
EVER_MATCHED_SOMETHING (reg_info[mcnt]) = 0; |
} |
/* We move `string1' into `string2' if the latter's empty -- but not if |
`string1' is null. */ |
if (size2 == 0 && string1 != NULL) |
{ |
string2 = string1; |
size2 = size1; |
string1 = 0; |
size1 = 0; |
#ifdef WCHAR |
mbs_offset2 = mbs_offset1; |
csize2 = csize1; |
mbs_offset1 = NULL; |
csize1 = 0; |
#endif |
} |
end1 = string1 + size1; |
end2 = string2 + size2; |
/* Compute where to stop matching, within the two strings. */ |
#ifdef WCHAR |
if (stop <= csize1) |
{ |
mcnt = count_mbs_length(mbs_offset1, stop); |
end_match_1 = string1 + mcnt; |
end_match_2 = string2; |
} |
else |
{ |
if (stop > csize1 + csize2) |
stop = csize1 + csize2; |
end_match_1 = end1; |
mcnt = count_mbs_length(mbs_offset2, stop-csize1); |
end_match_2 = string2 + mcnt; |
} |
if (mcnt < 0) |
{ /* count_mbs_length return error. */ |
FREE_VARIABLES (); |
return -1; |
} |
#else |
if (stop <= size1) |
{ |
end_match_1 = string1 + stop; |
end_match_2 = string2; |
} |
else |
{ |
end_match_1 = end1; |
end_match_2 = string2 + stop - size1; |
} |
#endif /* WCHAR */ |
/* `p' scans through the pattern as `d' scans through the data. |
`dend' is the end of the input string that `d' points within. `d' |
is advanced into the following input string whenever necessary, but |
this happens before fetching; therefore, at the beginning of the |
loop, `d' can be pointing at the end of a string, but it cannot |
equal `string2'. */ |
#ifdef WCHAR |
if (size1 > 0 && pos <= csize1) |
{ |
mcnt = count_mbs_length(mbs_offset1, pos); |
d = string1 + mcnt; |
dend = end_match_1; |
} |
else |
{ |
mcnt = count_mbs_length(mbs_offset2, pos-csize1); |
d = string2 + mcnt; |
dend = end_match_2; |
} |
if (mcnt < 0) |
{ /* count_mbs_length return error. */ |
FREE_VARIABLES (); |
return -1; |
} |
#else |
if (size1 > 0 && pos <= size1) |
{ |
d = string1 + pos; |
dend = end_match_1; |
} |
else |
{ |
d = string2 + pos - size1; |
dend = end_match_2; |
} |
#endif /* WCHAR */ |
DEBUG_PRINT1 ("The compiled pattern is:\n"); |
DEBUG_PRINT_COMPILED_PATTERN (bufp, p, pend); |
DEBUG_PRINT1 ("The string to match is: `"); |
DEBUG_PRINT_DOUBLE_STRING (d, string1, size1, string2, size2); |
DEBUG_PRINT1 ("'\n"); |
/* This loops over pattern commands. It exits by returning from the |
function if the match is complete, or it drops through if the match |
fails at this starting point in the input data. */ |
for (;;) |
{ |
#ifdef _LIBC |
DEBUG_PRINT2 ("\n%p: ", p); |
#else |
DEBUG_PRINT2 ("\n0x%x: ", p); |
#endif |
if (p == pend) |
{ /* End of pattern means we might have succeeded. */ |
DEBUG_PRINT1 ("end of pattern ... "); |
/* If we haven't matched the entire string, and we want the |
longest match, try backtracking. */ |
if (d != end_match_2) |
{ |
/* 1 if this match ends in the same string (string1 or string2) |
as the best previous match. */ |
boolean same_str_p; |
/* 1 if this match is the best seen so far. */ |
boolean best_match_p; |
same_str_p = (FIRST_STRING_P (match_end) |
== MATCHING_IN_FIRST_STRING); |
/* AIX compiler got confused when this was combined |
with the previous declaration. */ |
if (same_str_p) |
best_match_p = d > match_end; |
else |
best_match_p = !MATCHING_IN_FIRST_STRING; |
DEBUG_PRINT1 ("backtracking.\n"); |
if (!FAIL_STACK_EMPTY ()) |
{ /* More failure points to try. */ |
/* If exceeds best match so far, save it. */ |
if (!best_regs_set || best_match_p) |
{ |
best_regs_set = true; |
match_end = d; |
DEBUG_PRINT1 ("\nSAVING match as best so far.\n"); |
for (mcnt = 1; (unsigned) mcnt < num_regs; mcnt++) |
{ |
best_regstart[mcnt] = regstart[mcnt]; |
best_regend[mcnt] = regend[mcnt]; |
} |
} |
goto fail; |
} |
/* If no failure points, don't restore garbage. And if |
last match is real best match, don't restore second |
best one. */ |
else if (best_regs_set && !best_match_p) |
{ |
restore_best_regs: |
/* Restore best match. It may happen that `dend == |
end_match_1' while the restored d is in string2. |
For example, the pattern `x.*y.*z' against the |
strings `x-' and `y-z-', if the two strings are |
not consecutive in memory. */ |
DEBUG_PRINT1 ("Restoring best registers.\n"); |
d = match_end; |
dend = ((d >= string1 && d <= end1) |
? end_match_1 : end_match_2); |
for (mcnt = 1; (unsigned) mcnt < num_regs; mcnt++) |
{ |
regstart[mcnt] = best_regstart[mcnt]; |
regend[mcnt] = best_regend[mcnt]; |
} |
} |
} /* d != end_match_2 */ |
succeed_label: |
DEBUG_PRINT1 ("Accepting match.\n"); |
/* If caller wants register contents data back, do it. */ |
if (regs && !bufp->no_sub) |
{ |
/* Have the register data arrays been allocated? */ |
if (bufp->regs_allocated == REGS_UNALLOCATED) |
{ /* No. So allocate them with malloc. We need one |
extra element beyond `num_regs' for the `-1' marker |
GNU code uses. */ |
regs->num_regs = MAX (RE_NREGS, num_regs + 1); |
regs->start = TALLOC (regs->num_regs, regoff_t); |
regs->end = TALLOC (regs->num_regs, regoff_t); |
if (regs->start == NULL || regs->end == NULL) |
{ |
FREE_VARIABLES (); |
return -2; |
} |
bufp->regs_allocated = REGS_REALLOCATE; |
} |
else if (bufp->regs_allocated == REGS_REALLOCATE) |
{ /* Yes. If we need more elements than were already |
allocated, reallocate them. If we need fewer, just |
leave it alone. */ |
if (regs->num_regs < num_regs + 1) |
{ |
regs->num_regs = num_regs + 1; |
RETALLOC (regs->start, regs->num_regs, regoff_t); |
RETALLOC (regs->end, regs->num_regs, regoff_t); |
if (regs->start == NULL || regs->end == NULL) |
{ |
FREE_VARIABLES (); |
return -2; |
} |
} |
} |
else |
{ |
/* These braces fend off a "empty body in an else-statement" |
warning under GCC when assert expands to nothing. */ |
assert (bufp->regs_allocated == REGS_FIXED); |
} |
/* Convert the pointer data in `regstart' and `regend' to |
indices. Register zero has to be set differently, |
since we haven't kept track of any info for it. */ |
if (regs->num_regs > 0) |
{ |
regs->start[0] = pos; |
#ifdef WCHAR |
if (MATCHING_IN_FIRST_STRING) |
regs->end[0] = mbs_offset1 != NULL ? |
mbs_offset1[d-string1] : 0; |
else |
regs->end[0] = csize1 + (mbs_offset2 != NULL ? |
mbs_offset2[d-string2] : 0); |
#else |
regs->end[0] = (MATCHING_IN_FIRST_STRING |
? ((regoff_t) (d - string1)) |
: ((regoff_t) (d - string2 + size1))); |
#endif /* WCHAR */ |
} |
/* Go through the first `min (num_regs, regs->num_regs)' |
registers, since that is all we initialized. */ |
for (mcnt = 1; (unsigned) mcnt < MIN (num_regs, regs->num_regs); |
mcnt++) |
{ |
if (REG_UNSET (regstart[mcnt]) || REG_UNSET (regend[mcnt])) |
regs->start[mcnt] = regs->end[mcnt] = -1; |
else |
{ |
regs->start[mcnt] |
= (regoff_t) POINTER_TO_OFFSET (regstart[mcnt]); |
regs->end[mcnt] |
= (regoff_t) POINTER_TO_OFFSET (regend[mcnt]); |
} |
} |
/* If the regs structure we return has more elements than |
were in the pattern, set the extra elements to -1. If |
we (re)allocated the registers, this is the case, |
because we always allocate enough to have at least one |
-1 at the end. */ |
for (mcnt = num_regs; (unsigned) mcnt < regs->num_regs; mcnt++) |
regs->start[mcnt] = regs->end[mcnt] = -1; |
} /* regs && !bufp->no_sub */ |
DEBUG_PRINT4 ("%u failure points pushed, %u popped (%u remain).\n", |
nfailure_points_pushed, nfailure_points_popped, |
nfailure_points_pushed - nfailure_points_popped); |
DEBUG_PRINT2 ("%u registers pushed.\n", num_regs_pushed); |
#ifdef WCHAR |
if (MATCHING_IN_FIRST_STRING) |
mcnt = mbs_offset1 != NULL ? mbs_offset1[d-string1] : 0; |
else |
mcnt = (mbs_offset2 != NULL ? mbs_offset2[d-string2] : 0) + |
csize1; |
mcnt -= pos; |
#else |
mcnt = d - pos - (MATCHING_IN_FIRST_STRING |
? string1 |
: string2 - size1); |
#endif /* WCHAR */ |
DEBUG_PRINT2 ("Returning %d from re_match_2.\n", mcnt); |
FREE_VARIABLES (); |
return mcnt; |
} |
/* Otherwise match next pattern command. */ |
switch (SWITCH_ENUM_CAST ((re_opcode_t) *p++)) |
{ |
/* Ignore these. Used to ignore the n of succeed_n's which |
currently have n == 0. */ |
case no_op: |
DEBUG_PRINT1 ("EXECUTING no_op.\n"); |
break; |
case succeed: |
DEBUG_PRINT1 ("EXECUTING succeed.\n"); |
goto succeed_label; |
/* Match the next n pattern characters exactly. The following |
byte in the pattern defines n, and the n bytes after that |
are the characters to match. */ |
case exactn: |
#ifdef MBS_SUPPORT |
case exactn_bin: |
#endif |
mcnt = *p++; |
DEBUG_PRINT2 ("EXECUTING exactn %d.\n", mcnt); |
/* This is written out as an if-else so we don't waste time |
testing `translate' inside the loop. */ |
if (translate) |
{ |
do |
{ |
PREFETCH (); |
#ifdef WCHAR |
if (*d <= 0xff) |
{ |
if ((UCHAR_T) translate[(unsigned char) *d++] |
!= (UCHAR_T) *p++) |
goto fail; |
} |
else |
{ |
if (*d++ != (CHAR_T) *p++) |
goto fail; |
} |
#else |
if ((UCHAR_T) translate[(unsigned char) *d++] |
!= (UCHAR_T) *p++) |
goto fail; |
#endif /* WCHAR */ |
} |
while (--mcnt); |
} |
else |
{ |
do |
{ |
PREFETCH (); |
if (*d++ != (CHAR_T) *p++) goto fail; |
} |
while (--mcnt); |
} |
SET_REGS_MATCHED (); |
break; |
/* Match any character except possibly a newline or a null. */ |
case anychar: |
DEBUG_PRINT1 ("EXECUTING anychar.\n"); |
PREFETCH (); |
if ((!(bufp->syntax & RE_DOT_NEWLINE) && TRANSLATE (*d) == '\n') |
|| (bufp->syntax & RE_DOT_NOT_NULL && TRANSLATE (*d) == '\000')) |
goto fail; |
SET_REGS_MATCHED (); |
DEBUG_PRINT2 (" Matched `%ld'.\n", (long int) *d); |
d++; |
break; |
case charset: |
case charset_not: |
{ |
register UCHAR_T c; |
#ifdef WCHAR |
unsigned int i, char_class_length, coll_symbol_length, |
equiv_class_length, ranges_length, chars_length, length; |
CHAR_T *workp, *workp2, *charset_top; |
#define WORK_BUFFER_SIZE 128 |
CHAR_T str_buf[WORK_BUFFER_SIZE]; |
# ifdef _LIBC |
uint32_t nrules; |
# endif /* _LIBC */ |
#endif /* WCHAR */ |
boolean negate = (re_opcode_t) *(p - 1) == charset_not; |
DEBUG_PRINT2 ("EXECUTING charset%s.\n", negate ? "_not" : ""); |
PREFETCH (); |
c = TRANSLATE (*d); /* The character to match. */ |
#ifdef WCHAR |
# ifdef _LIBC |
nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); |
# endif /* _LIBC */ |
charset_top = p - 1; |
char_class_length = *p++; |
coll_symbol_length = *p++; |
equiv_class_length = *p++; |
ranges_length = *p++; |
chars_length = *p++; |
/* p points charset[6], so the address of the next instruction |
(charset[l+m+n+2o+k+p']) equals p[l+m+n+2*o+p'], |
where l=length of char_classes, m=length of collating_symbol, |
n=equivalence_class, o=length of char_range, |
p'=length of character. */ |
workp = p; |
/* Update p to indicate the next instruction. */ |
p += char_class_length + coll_symbol_length+ equiv_class_length + |
2*ranges_length + chars_length; |
/* match with char_class? */ |
for (i = 0; i < char_class_length ; i += CHAR_CLASS_SIZE) |
{ |
wctype_t wctype; |
uintptr_t alignedp = ((uintptr_t)workp |
+ __alignof__(wctype_t) - 1) |
& ~(uintptr_t)(__alignof__(wctype_t) - 1); |
wctype = *((wctype_t*)alignedp); |
workp += CHAR_CLASS_SIZE; |
# ifdef _LIBC |
if (__iswctype((wint_t)c, wctype)) |
goto char_set_matched; |
# else |
if (iswctype((wint_t)c, wctype)) |
goto char_set_matched; |
# endif |
} |
/* match with collating_symbol? */ |
# ifdef _LIBC |
if (nrules != 0) |
{ |
const unsigned char *extra = (const unsigned char *) |
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_EXTRAMB); |
for (workp2 = workp + coll_symbol_length ; workp < workp2 ; |
workp++) |
{ |
int32_t *wextra; |
wextra = (int32_t*)(extra + *workp++); |
for (i = 0; i < *wextra; ++i) |
if (TRANSLATE(d[i]) != wextra[1 + i]) |
break; |
if (i == *wextra) |
{ |
/* Update d, however d will be incremented at |
char_set_matched:, we decrement d here. */ |
d += i - 1; |
goto char_set_matched; |
} |
} |
} |
else /* (nrules == 0) */ |
# endif |
/* If we can't look up collation data, we use wcscoll |
instead. */ |
{ |
for (workp2 = workp + coll_symbol_length ; workp < workp2 ;) |
{ |
const CHAR_T *backup_d = d, *backup_dend = dend; |
# ifdef _LIBC |
length = __wcslen (workp); |
# else |
length = wcslen (workp); |
# endif |
/* If wcscoll(the collating symbol, whole string) > 0, |
any substring of the string never match with the |
collating symbol. */ |
# ifdef _LIBC |
if (__wcscoll (workp, d) > 0) |
# else |
if (wcscoll (workp, d) > 0) |
# endif |
{ |
workp += length + 1; |
continue; |
} |
/* First, we compare the collating symbol with |
the first character of the string. |
If it don't match, we add the next character to |
the compare buffer in turn. */ |
for (i = 0 ; i < WORK_BUFFER_SIZE-1 ; i++, d++) |
{ |
int match; |
if (d == dend) |
{ |
if (dend == end_match_2) |
break; |
d = string2; |
dend = end_match_2; |
} |
/* add next character to the compare buffer. */ |
str_buf[i] = TRANSLATE(*d); |
str_buf[i+1] = '\0'; |
# ifdef _LIBC |
match = __wcscoll (workp, str_buf); |
# else |
match = wcscoll (workp, str_buf); |
# endif |
if (match == 0) |
goto char_set_matched; |
if (match < 0) |
/* (str_buf > workp) indicate (str_buf + X > workp), |
because for all X (str_buf + X > str_buf). |
So we don't need continue this loop. */ |
break; |
/* Otherwise(str_buf < workp), |
(str_buf+next_character) may equals (workp). |
So we continue this loop. */ |
} |
/* not matched */ |
d = backup_d; |
dend = backup_dend; |
workp += length + 1; |
} |
} |
/* match with equivalence_class? */ |
# ifdef _LIBC |
if (nrules != 0) |
{ |
const CHAR_T *backup_d = d, *backup_dend = dend; |
/* Try to match the equivalence class against |
those known to the collate implementation. */ |
const int32_t *table; |
const int32_t *weights; |
const int32_t *extra; |
const int32_t *indirect; |
int32_t idx, idx2; |
wint_t *cp; |
size_t len; |
/* This #include defines a local function! */ |
# include <locale/weightwc.h> |
table = (const int32_t *) |
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEWC); |
weights = (const wint_t *) |
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_WEIGHTWC); |
extra = (const wint_t *) |
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAWC); |
indirect = (const int32_t *) |
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTWC); |
/* Write 1 collating element to str_buf, and |
get its index. */ |
idx2 = 0; |
for (i = 0 ; idx2 == 0 && i < WORK_BUFFER_SIZE - 1; i++) |
{ |
cp = (wint_t*)str_buf; |
if (d == dend) |
{ |
if (dend == end_match_2) |
break; |
d = string2; |
dend = end_match_2; |
} |
str_buf[i] = TRANSLATE(*(d+i)); |
str_buf[i+1] = '\0'; /* sentinel */ |
idx2 = findidx ((const wint_t**)&cp); |
} |
/* Update d, however d will be incremented at |
char_set_matched:, we decrement d here. */ |
d = backup_d + ((wchar_t*)cp - (wchar_t*)str_buf - 1); |
if (d >= dend) |
{ |
if (dend == end_match_2) |
d = dend; |
else |
{ |
d = string2; |
dend = end_match_2; |
} |
} |
len = weights[idx2]; |
for (workp2 = workp + equiv_class_length ; workp < workp2 ; |
workp++) |
{ |
idx = (int32_t)*workp; |
/* We already checked idx != 0 in regex_compile. */ |
if (idx2 != 0 && len == weights[idx]) |
{ |
int cnt = 0; |
while (cnt < len && (weights[idx + 1 + cnt] |
== weights[idx2 + 1 + cnt])) |
++cnt; |
if (cnt == len) |
goto char_set_matched; |
} |
} |
/* not matched */ |
d = backup_d; |
dend = backup_dend; |
} |
else /* (nrules == 0) */ |
# endif |
/* If we can't look up collation data, we use wcscoll |
instead. */ |
{ |
for (workp2 = workp + equiv_class_length ; workp < workp2 ;) |
{ |
const CHAR_T *backup_d = d, *backup_dend = dend; |
# ifdef _LIBC |
length = __wcslen (workp); |
# else |
length = wcslen (workp); |
# endif |
/* If wcscoll(the collating symbol, whole string) > 0, |
any substring of the string never match with the |
collating symbol. */ |
# ifdef _LIBC |
if (__wcscoll (workp, d) > 0) |
# else |
if (wcscoll (workp, d) > 0) |
# endif |
{ |
workp += length + 1; |
break; |
} |
/* First, we compare the equivalence class with |
the first character of the string. |
If it don't match, we add the next character to |
the compare buffer in turn. */ |
for (i = 0 ; i < WORK_BUFFER_SIZE - 1 ; i++, d++) |
{ |
int match; |
if (d == dend) |
{ |
if (dend == end_match_2) |
break; |
d = string2; |
dend = end_match_2; |
} |
/* add next character to the compare buffer. */ |
str_buf[i] = TRANSLATE(*d); |
str_buf[i+1] = '\0'; |
# ifdef _LIBC |
match = __wcscoll (workp, str_buf); |
# else |
match = wcscoll (workp, str_buf); |
# endif |
if (match == 0) |
goto char_set_matched; |
if (match < 0) |
/* (str_buf > workp) indicate (str_buf + X > workp), |
because for all X (str_buf + X > str_buf). |
So we don't need continue this loop. */ |
break; |
/* Otherwise(str_buf < workp), |
(str_buf+next_character) may equals (workp). |
So we continue this loop. */ |
} |
/* not matched */ |
d = backup_d; |
dend = backup_dend; |
workp += length + 1; |
} |
} |
/* match with char_range? */ |
# ifdef _LIBC |
if (nrules != 0) |
{ |
uint32_t collseqval; |
const char *collseq = (const char *) |
_NL_CURRENT(LC_COLLATE, _NL_COLLATE_COLLSEQWC); |
collseqval = collseq_table_lookup (collseq, c); |
for (; workp < p - chars_length ;) |
{ |
uint32_t start_val, end_val; |
/* We already compute the collation sequence value |
of the characters (or collating symbols). */ |
start_val = (uint32_t) *workp++; /* range_start */ |
end_val = (uint32_t) *workp++; /* range_end */ |
if (start_val <= collseqval && collseqval <= end_val) |
goto char_set_matched; |
} |
} |
else |
# endif |
{ |
/* We set range_start_char at str_buf[0], range_end_char |
at str_buf[4], and compared char at str_buf[2]. */ |
str_buf[1] = 0; |
str_buf[2] = c; |
str_buf[3] = 0; |
str_buf[5] = 0; |
for (; workp < p - chars_length ;) |
{ |
wchar_t *range_start_char, *range_end_char; |
/* match if (range_start_char <= c <= range_end_char). */ |
/* If range_start(or end) < 0, we assume -range_start(end) |
is the offset of the collating symbol which is specified |
as the character of the range start(end). */ |
/* range_start */ |
if (*workp < 0) |
range_start_char = charset_top - (*workp++); |
else |
{ |
str_buf[0] = *workp++; |
range_start_char = str_buf; |
} |
/* range_end */ |
if (*workp < 0) |
range_end_char = charset_top - (*workp++); |
else |
{ |
str_buf[4] = *workp++; |
range_end_char = str_buf + 4; |
} |
# ifdef _LIBC |
if (__wcscoll (range_start_char, str_buf+2) <= 0 |
&& __wcscoll (str_buf+2, range_end_char) <= 0) |
# else |
if (wcscoll (range_start_char, str_buf+2) <= 0 |
&& wcscoll (str_buf+2, range_end_char) <= 0) |
# endif |
goto char_set_matched; |
} |
} |
/* match with char? */ |
for (; workp < p ; workp++) |
if (c == *workp) |
goto char_set_matched; |
negate = !negate; |
char_set_matched: |
if (negate) goto fail; |
#else |
/* Cast to `unsigned' instead of `unsigned char' in case the |
bit list is a full 32 bytes long. */ |
if (c < (unsigned) (*p * BYTEWIDTH) |
&& p[1 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH))) |
negate = !negate; |
p += 1 + *p; |
if (!negate) goto fail; |
#undef WORK_BUFFER_SIZE |
#endif /* WCHAR */ |
SET_REGS_MATCHED (); |
d++; |
break; |
} |
/* The beginning of a group is represented by start_memory. |
The arguments are the register number in the next byte, and the |
number of groups inner to this one in the next. The text |
matched within the group is recorded (in the internal |
registers data structure) under the register number. */ |
case start_memory: |
DEBUG_PRINT3 ("EXECUTING start_memory %ld (%ld):\n", |
(long int) *p, (long int) p[1]); |
/* Find out if this group can match the empty string. */ |
p1 = p; /* To send to group_match_null_string_p. */ |
if (REG_MATCH_NULL_STRING_P (reg_info[*p]) == MATCH_NULL_UNSET_VALUE) |
REG_MATCH_NULL_STRING_P (reg_info[*p]) |
= PREFIX(group_match_null_string_p) (&p1, pend, reg_info); |
/* Save the position in the string where we were the last time |
we were at this open-group operator in case the group is |
operated upon by a repetition operator, e.g., with `(a*)*b' |
against `ab'; then we want to ignore where we are now in |
the string in case this attempt to match fails. */ |
old_regstart[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p]) |
? REG_UNSET (regstart[*p]) ? d : regstart[*p] |
: regstart[*p]; |
DEBUG_PRINT2 (" old_regstart: %d\n", |
POINTER_TO_OFFSET (old_regstart[*p])); |
regstart[*p] = d; |
DEBUG_PRINT2 (" regstart: %d\n", POINTER_TO_OFFSET (regstart[*p])); |
IS_ACTIVE (reg_info[*p]) = 1; |
MATCHED_SOMETHING (reg_info[*p]) = 0; |
/* Clear this whenever we change the register activity status. */ |
set_regs_matched_done = 0; |
/* This is the new highest active register. */ |
highest_active_reg = *p; |
/* If nothing was active before, this is the new lowest active |
register. */ |
if (lowest_active_reg == NO_LOWEST_ACTIVE_REG) |
lowest_active_reg = *p; |
/* Move past the register number and inner group count. */ |
p += 2; |
just_past_start_mem = p; |
break; |
/* The stop_memory opcode represents the end of a group. Its |
arguments are the same as start_memory's: the register |
number, and the number of inner groups. */ |
case stop_memory: |
DEBUG_PRINT3 ("EXECUTING stop_memory %ld (%ld):\n", |
(long int) *p, (long int) p[1]); |
/* We need to save the string position the last time we were at |
this close-group operator in case the group is operated |
upon by a repetition operator, e.g., with `((a*)*(b*)*)*' |
against `aba'; then we want to ignore where we are now in |
the string in case this attempt to match fails. */ |
old_regend[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p]) |
? REG_UNSET (regend[*p]) ? d : regend[*p] |
: regend[*p]; |
DEBUG_PRINT2 (" old_regend: %d\n", |
POINTER_TO_OFFSET (old_regend[*p])); |
regend[*p] = d; |
DEBUG_PRINT2 (" regend: %d\n", POINTER_TO_OFFSET (regend[*p])); |
/* This register isn't active anymore. */ |
IS_ACTIVE (reg_info[*p]) = 0; |
/* Clear this whenever we change the register activity status. */ |
set_regs_matched_done = 0; |
/* If this was the only register active, nothing is active |
anymore. */ |
if (lowest_active_reg == highest_active_reg) |
{ |
lowest_active_reg = NO_LOWEST_ACTIVE_REG; |
highest_active_reg = NO_HIGHEST_ACTIVE_REG; |
} |
else |
{ /* We must scan for the new highest active register, since |
it isn't necessarily one less than now: consider |
(a(b)c(d(e)f)g). When group 3 ends, after the f), the |
new highest active register is 1. */ |
UCHAR_T r = *p - 1; |
while (r > 0 && !IS_ACTIVE (reg_info[r])) |
r--; |
/* If we end up at register zero, that means that we saved |
the registers as the result of an `on_failure_jump', not |
a `start_memory', and we jumped to past the innermost |
`stop_memory'. For example, in ((.)*) we save |
registers 1 and 2 as a result of the *, but when we pop |
back to the second ), we are at the stop_memory 1. |
Thus, nothing is active. */ |
if (r == 0) |
{ |
lowest_active_reg = NO_LOWEST_ACTIVE_REG; |
highest_active_reg = NO_HIGHEST_ACTIVE_REG; |
} |
else |
highest_active_reg = r; |
} |
/* If just failed to match something this time around with a |
group that's operated on by a repetition operator, try to |
force exit from the ``loop'', and restore the register |
information for this group that we had before trying this |
last match. */ |
if ((!MATCHED_SOMETHING (reg_info[*p]) |
|| just_past_start_mem == p - 1) |
&& (p + 2) < pend) |
{ |
boolean is_a_jump_n = false; |
p1 = p + 2; |
mcnt = 0; |
switch ((re_opcode_t) *p1++) |
{ |
case jump_n: |
is_a_jump_n = true; |
case pop_failure_jump: |
case maybe_pop_jump: |
case jump: |
case dummy_failure_jump: |
EXTRACT_NUMBER_AND_INCR (mcnt, p1); |
if (is_a_jump_n) |
p1 += OFFSET_ADDRESS_SIZE; |
break; |
default: |
/* do nothing */ ; |
} |
p1 += mcnt; |
/* If the next operation is a jump backwards in the pattern |
to an on_failure_jump right before the start_memory |
corresponding to this stop_memory, exit from the loop |
by forcing a failure after pushing on the stack the |
on_failure_jump's jump in the pattern, and d. */ |
if (mcnt < 0 && (re_opcode_t) *p1 == on_failure_jump |
&& (re_opcode_t) p1[1+OFFSET_ADDRESS_SIZE] == start_memory |
&& p1[2+OFFSET_ADDRESS_SIZE] == *p) |
{ |
/* If this group ever matched anything, then restore |
what its registers were before trying this last |
failed match, e.g., with `(a*)*b' against `ab' for |
regstart[1], and, e.g., with `((a*)*(b*)*)*' |
against `aba' for regend[3]. |
Also restore the registers for inner groups for, |
e.g., `((a*)(b*))*' against `aba' (register 3 would |
otherwise get trashed). */ |
if (EVER_MATCHED_SOMETHING (reg_info[*p])) |
{ |
unsigned r; |
EVER_MATCHED_SOMETHING (reg_info[*p]) = 0; |
/* Restore this and inner groups' (if any) registers. */ |
for (r = *p; r < (unsigned) *p + (unsigned) *(p + 1); |
r++) |
{ |
regstart[r] = old_regstart[r]; |
/* xx why this test? */ |
if (old_regend[r] >= regstart[r]) |
regend[r] = old_regend[r]; |
} |
} |
p1++; |
EXTRACT_NUMBER_AND_INCR (mcnt, p1); |
PUSH_FAILURE_POINT (p1 + mcnt, d, -2); |
goto fail; |
} |
} |
/* Move past the register number and the inner group count. */ |
p += 2; |
break; |
/* \<digit> has been turned into a `duplicate' command which is |
followed by the numeric value of <digit> as the register number. */ |
case duplicate: |
{ |
register const CHAR_T *d2, *dend2; |
int regno = *p++; /* Get which register to match against. */ |
DEBUG_PRINT2 ("EXECUTING duplicate %d.\n", regno); |
/* Can't back reference a group which we've never matched. */ |
if (REG_UNSET (regstart[regno]) || REG_UNSET (regend[regno])) |
goto fail; |
/* Where in input to try to start matching. */ |
d2 = regstart[regno]; |
/* Where to stop matching; if both the place to start and |
the place to stop matching are in the same string, then |
set to the place to stop, otherwise, for now have to use |
the end of the first string. */ |
dend2 = ((FIRST_STRING_P (regstart[regno]) |
== FIRST_STRING_P (regend[regno])) |
? regend[regno] : end_match_1); |
for (;;) |
{ |
/* If necessary, advance to next segment in register |
contents. */ |
while (d2 == dend2) |
{ |
if (dend2 == end_match_2) break; |
if (dend2 == regend[regno]) break; |
/* End of string1 => advance to string2. */ |
d2 = string2; |
dend2 = regend[regno]; |
} |
/* At end of register contents => success */ |
if (d2 == dend2) break; |
/* If necessary, advance to next segment in data. */ |
PREFETCH (); |
/* How many characters left in this segment to match. */ |
mcnt = dend - d; |
/* Want how many consecutive characters we can match in |
one shot, so, if necessary, adjust the count. */ |
if (mcnt > dend2 - d2) |
mcnt = dend2 - d2; |
/* Compare that many; failure if mismatch, else move |
past them. */ |
if (translate |
? PREFIX(bcmp_translate) (d, d2, mcnt, translate) |
: memcmp (d, d2, mcnt*sizeof(UCHAR_T))) |
goto fail; |
d += mcnt, d2 += mcnt; |
/* Do this because we've match some characters. */ |
SET_REGS_MATCHED (); |
} |
} |
break; |
/* begline matches the empty string at the beginning of the string |
(unless `not_bol' is set in `bufp'), and, if |
`newline_anchor' is set, after newlines. */ |
case begline: |
DEBUG_PRINT1 ("EXECUTING begline.\n"); |
if (AT_STRINGS_BEG (d)) |
{ |
if (!bufp->not_bol) break; |
} |
else if (d[-1] == '\n' && bufp->newline_anchor) |
{ |
break; |
} |
/* In all other cases, we fail. */ |
goto fail; |
/* endline is the dual of begline. */ |
case endline: |
DEBUG_PRINT1 ("EXECUTING endline.\n"); |
if (AT_STRINGS_END (d)) |
{ |
if (!bufp->not_eol) break; |
} |
/* We have to ``prefetch'' the next character. */ |
else if ((d == end1 ? *string2 : *d) == '\n' |
&& bufp->newline_anchor) |
{ |
break; |
} |
goto fail; |
/* Match at the very beginning of the data. */ |
case begbuf: |
DEBUG_PRINT1 ("EXECUTING begbuf.\n"); |
if (AT_STRINGS_BEG (d)) |
break; |
goto fail; |
/* Match at the very end of the data. */ |
case endbuf: |
DEBUG_PRINT1 ("EXECUTING endbuf.\n"); |
if (AT_STRINGS_END (d)) |
break; |
goto fail; |
/* on_failure_keep_string_jump is used to optimize `.*\n'. It |
pushes NULL as the value for the string on the stack. Then |
`pop_failure_point' will keep the current value for the |
string, instead of restoring it. To see why, consider |
matching `foo\nbar' against `.*\n'. The .* matches the foo; |
then the . fails against the \n. But the next thing we want |
to do is match the \n against the \n; if we restored the |
string value, we would be back at the foo. |
Because this is used only in specific cases, we don't need to |
check all the things that `on_failure_jump' does, to make |
sure the right things get saved on the stack. Hence we don't |
share its code. The only reason to push anything on the |
stack at all is that otherwise we would have to change |
`anychar's code to do something besides goto fail in this |
case; that seems worse than this. */ |
case on_failure_keep_string_jump: |
DEBUG_PRINT1 ("EXECUTING on_failure_keep_string_jump"); |
EXTRACT_NUMBER_AND_INCR (mcnt, p); |
#ifdef _LIBC |
DEBUG_PRINT3 (" %d (to %p):\n", mcnt, p + mcnt); |
#else |
DEBUG_PRINT3 (" %d (to 0x%x):\n", mcnt, p + mcnt); |
#endif |
PUSH_FAILURE_POINT (p + mcnt, NULL, -2); |
break; |
/* Uses of on_failure_jump: |
Each alternative starts with an on_failure_jump that points |
to the beginning of the next alternative. Each alternative |
except the last ends with a jump that in effect jumps past |
the rest of the alternatives. (They really jump to the |
ending jump of the following alternative, because tensioning |
these jumps is a hassle.) |
Repeats start with an on_failure_jump that points past both |
the repetition text and either the following jump or |
pop_failure_jump back to this on_failure_jump. */ |
case on_failure_jump: |
on_failure: |
DEBUG_PRINT1 ("EXECUTING on_failure_jump"); |
EXTRACT_NUMBER_AND_INCR (mcnt, p); |
#ifdef _LIBC |
DEBUG_PRINT3 (" %d (to %p)", mcnt, p + mcnt); |
#else |
DEBUG_PRINT3 (" %d (to 0x%x)", mcnt, p + mcnt); |
#endif |
/* If this on_failure_jump comes right before a group (i.e., |
the original * applied to a group), save the information |
for that group and all inner ones, so that if we fail back |
to this point, the group's information will be correct. |
For example, in \(a*\)*\1, we need the preceding group, |
and in \(zz\(a*\)b*\)\2, we need the inner group. */ |
/* We can't use `p' to check ahead because we push |
a failure point to `p + mcnt' after we do this. */ |
p1 = p; |
/* We need to skip no_op's before we look for the |
start_memory in case this on_failure_jump is happening as |
the result of a completed succeed_n, as in \(a\)\{1,3\}b\1 |
against aba. */ |
while (p1 < pend && (re_opcode_t) *p1 == no_op) |
p1++; |
if (p1 < pend && (re_opcode_t) *p1 == start_memory) |
{ |
/* We have a new highest active register now. This will |
get reset at the start_memory we are about to get to, |
but we will have saved all the registers relevant to |
this repetition op, as described above. */ |
highest_active_reg = *(p1 + 1) + *(p1 + 2); |
if (lowest_active_reg == NO_LOWEST_ACTIVE_REG) |
lowest_active_reg = *(p1 + 1); |
} |
DEBUG_PRINT1 (":\n"); |
PUSH_FAILURE_POINT (p + mcnt, d, -2); |
break; |
/* A smart repeat ends with `maybe_pop_jump'. |
We change it to either `pop_failure_jump' or `jump'. */ |
case maybe_pop_jump: |
EXTRACT_NUMBER_AND_INCR (mcnt, p); |
DEBUG_PRINT2 ("EXECUTING maybe_pop_jump %d.\n", mcnt); |
{ |
register UCHAR_T *p2 = p; |
/* Compare the beginning of the repeat with what in the |
pattern follows its end. If we can establish that there |
is nothing that they would both match, i.e., that we |
would have to backtrack because of (as in, e.g., `a*a') |
then we can change to pop_failure_jump, because we'll |
never have to backtrack. |
This is not true in the case of alternatives: in |
`(a|ab)*' we do need to backtrack to the `ab' alternative |
(e.g., if the string was `ab'). But instead of trying to |
detect that here, the alternative has put on a dummy |
failure point which is what we will end up popping. */ |
/* Skip over open/close-group commands. |
If what follows this loop is a ...+ construct, |
look at what begins its body, since we will have to |
match at least one of that. */ |
while (1) |
{ |
if (p2 + 2 < pend |
&& ((re_opcode_t) *p2 == stop_memory |
|| (re_opcode_t) *p2 == start_memory)) |
p2 += 3; |
else if (p2 + 2 + 2 * OFFSET_ADDRESS_SIZE < pend |
&& (re_opcode_t) *p2 == dummy_failure_jump) |
p2 += 2 + 2 * OFFSET_ADDRESS_SIZE; |
else |
break; |
} |
p1 = p + mcnt; |
/* p1[0] ... p1[2] are the `on_failure_jump' corresponding |
to the `maybe_finalize_jump' of this case. Examine what |
follows. */ |
/* If we're at the end of the pattern, we can change. */ |
if (p2 == pend) |
{ |
/* Consider what happens when matching ":\(.*\)" |
against ":/". I don't really understand this code |
yet. */ |
p[-(1+OFFSET_ADDRESS_SIZE)] = (UCHAR_T) |
pop_failure_jump; |
DEBUG_PRINT1 |
(" End of pattern: change to `pop_failure_jump'.\n"); |
} |
else if ((re_opcode_t) *p2 == exactn |
#ifdef MBS_SUPPORT |
|| (re_opcode_t) *p2 == exactn_bin |
#endif |
|| (bufp->newline_anchor && (re_opcode_t) *p2 == endline)) |
{ |
register UCHAR_T c |
= *p2 == (UCHAR_T) endline ? '\n' : p2[2]; |
if (((re_opcode_t) p1[1+OFFSET_ADDRESS_SIZE] == exactn |
#ifdef MBS_SUPPORT |
|| (re_opcode_t) p1[1+OFFSET_ADDRESS_SIZE] == exactn_bin |
#endif |
) && p1[3+OFFSET_ADDRESS_SIZE] != c) |
{ |
p[-(1+OFFSET_ADDRESS_SIZE)] = (UCHAR_T) |
pop_failure_jump; |
#ifdef WCHAR |
DEBUG_PRINT3 (" %C != %C => pop_failure_jump.\n", |
(wint_t) c, |
(wint_t) p1[3+OFFSET_ADDRESS_SIZE]); |
#else |
DEBUG_PRINT3 (" %c != %c => pop_failure_jump.\n", |
(char) c, |
(char) p1[3+OFFSET_ADDRESS_SIZE]); |
#endif |
} |
#ifndef WCHAR |
else if ((re_opcode_t) p1[3] == charset |
|| (re_opcode_t) p1[3] == charset_not) |
{ |
int negate = (re_opcode_t) p1[3] == charset_not; |
if (c < (unsigned) (p1[4] * BYTEWIDTH) |
&& p1[5 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH))) |
negate = !negate; |
/* `negate' is equal to 1 if c would match, which means |
that we can't change to pop_failure_jump. */ |
if (!negate) |
{ |
p[-3] = (unsigned char) pop_failure_jump; |
DEBUG_PRINT1 (" No match => pop_failure_jump.\n"); |
} |
} |
#endif /* not WCHAR */ |
} |
#ifndef WCHAR |
else if ((re_opcode_t) *p2 == charset) |
{ |
/* We win if the first character of the loop is not part |
of the charset. */ |
if ((re_opcode_t) p1[3] == exactn |
&& ! ((int) p2[1] * BYTEWIDTH > (int) p1[5] |
&& (p2[2 + p1[5] / BYTEWIDTH] |
& (1 << (p1[5] % BYTEWIDTH))))) |
{ |
p[-3] = (unsigned char) pop_failure_jump; |
DEBUG_PRINT1 (" No match => pop_failure_jump.\n"); |
} |
else if ((re_opcode_t) p1[3] == charset_not) |
{ |
int idx; |
/* We win if the charset_not inside the loop |
lists every character listed in the charset after. */ |
for (idx = 0; idx < (int) p2[1]; idx++) |
if (! (p2[2 + idx] == 0 |
|| (idx < (int) p1[4] |
&& ((p2[2 + idx] & ~ p1[5 + idx]) == 0)))) |
break; |
if (idx == p2[1]) |
{ |
p[-3] = (unsigned char) pop_failure_jump; |
DEBUG_PRINT1 (" No match => pop_failure_jump.\n"); |
} |
} |
else if ((re_opcode_t) p1[3] == charset) |
{ |
int idx; |
/* We win if the charset inside the loop |
has no overlap with the one after the loop. */ |
for (idx = 0; |
idx < (int) p2[1] && idx < (int) p1[4]; |
idx++) |
if ((p2[2 + idx] & p1[5 + idx]) != 0) |
break; |
if (idx == p2[1] || idx == p1[4]) |
{ |
p[-3] = (unsigned char) pop_failure_jump; |
DEBUG_PRINT1 (" No match => pop_failure_jump.\n"); |
} |
} |
} |
#endif /* not WCHAR */ |
} |
p -= OFFSET_ADDRESS_SIZE; /* Point at relative address again. */ |
if ((re_opcode_t) p[-1] != pop_failure_jump) |
{ |
p[-1] = (UCHAR_T) jump; |
DEBUG_PRINT1 (" Match => jump.\n"); |
goto unconditional_jump; |
} |
/* Note fall through. */ |
/* The end of a simple repeat has a pop_failure_jump back to |
its matching on_failure_jump, where the latter will push a |
failure point. The pop_failure_jump takes off failure |
points put on by this pop_failure_jump's matching |
on_failure_jump; we got through the pattern to here from the |
matching on_failure_jump, so didn't fail. */ |
case pop_failure_jump: |
{ |
/* We need to pass separate storage for the lowest and |
highest registers, even though we don't care about the |
actual values. Otherwise, we will restore only one |
register from the stack, since lowest will == highest in |
`pop_failure_point'. */ |
active_reg_t dummy_low_reg, dummy_high_reg; |
UCHAR_T *pdummy ATTRIBUTE_UNUSED = NULL; |
const CHAR_T *sdummy ATTRIBUTE_UNUSED = NULL; |
DEBUG_PRINT1 ("EXECUTING pop_failure_jump.\n"); |
POP_FAILURE_POINT (sdummy, pdummy, |
dummy_low_reg, dummy_high_reg, |
reg_dummy, reg_dummy, reg_info_dummy); |
} |
/* Note fall through. */ |
unconditional_jump: |
#ifdef _LIBC |
DEBUG_PRINT2 ("\n%p: ", p); |
#else |
DEBUG_PRINT2 ("\n0x%x: ", p); |
#endif |
/* Note fall through. */ |
/* Unconditionally jump (without popping any failure points). */ |
case jump: |
EXTRACT_NUMBER_AND_INCR (mcnt, p); /* Get the amount to jump. */ |
DEBUG_PRINT2 ("EXECUTING jump %d ", mcnt); |
p += mcnt; /* Do the jump. */ |
#ifdef _LIBC |
DEBUG_PRINT2 ("(to %p).\n", p); |
#else |
DEBUG_PRINT2 ("(to 0x%x).\n", p); |
#endif |
break; |
/* We need this opcode so we can detect where alternatives end |
in `group_match_null_string_p' et al. */ |
case jump_past_alt: |
DEBUG_PRINT1 ("EXECUTING jump_past_alt.\n"); |
goto unconditional_jump; |
/* Normally, the on_failure_jump pushes a failure point, which |
then gets popped at pop_failure_jump. We will end up at |
pop_failure_jump, also, and with a pattern of, say, `a+', we |
are skipping over the on_failure_jump, so we have to push |
something meaningless for pop_failure_jump to pop. */ |
case dummy_failure_jump: |
DEBUG_PRINT1 ("EXECUTING dummy_failure_jump.\n"); |
/* It doesn't matter what we push for the string here. What |
the code at `fail' tests is the value for the pattern. */ |
PUSH_FAILURE_POINT (NULL, NULL, -2); |
goto unconditional_jump; |
/* At the end of an alternative, we need to push a dummy failure |
point in case we are followed by a `pop_failure_jump', because |
we don't want the failure point for the alternative to be |
popped. For example, matching `(a|ab)*' against `aab' |
requires that we match the `ab' alternative. */ |
case push_dummy_failure: |
DEBUG_PRINT1 ("EXECUTING push_dummy_failure.\n"); |
/* See comments just above at `dummy_failure_jump' about the |
two zeroes. */ |
PUSH_FAILURE_POINT (NULL, NULL, -2); |
break; |
/* Have to succeed matching what follows at least n times. |
After that, handle like `on_failure_jump'. */ |
case succeed_n: |
EXTRACT_NUMBER (mcnt, p + OFFSET_ADDRESS_SIZE); |
DEBUG_PRINT2 ("EXECUTING succeed_n %d.\n", mcnt); |
assert (mcnt >= 0); |
/* Originally, this is how many times we HAVE to succeed. */ |
if (mcnt > 0) |
{ |
mcnt--; |
p += OFFSET_ADDRESS_SIZE; |
STORE_NUMBER_AND_INCR (p, mcnt); |
#ifdef _LIBC |
DEBUG_PRINT3 (" Setting %p to %d.\n", p - OFFSET_ADDRESS_SIZE |
, mcnt); |
#else |
DEBUG_PRINT3 (" Setting 0x%x to %d.\n", p - OFFSET_ADDRESS_SIZE |
, mcnt); |
#endif |
} |
else if (mcnt == 0) |
{ |
#ifdef _LIBC |
DEBUG_PRINT2 (" Setting two bytes from %p to no_op.\n", |
p + OFFSET_ADDRESS_SIZE); |
#else |
DEBUG_PRINT2 (" Setting two bytes from 0x%x to no_op.\n", |
p + OFFSET_ADDRESS_SIZE); |
#endif /* _LIBC */ |
#ifdef WCHAR |
p[1] = (UCHAR_T) no_op; |
#else |
p[2] = (UCHAR_T) no_op; |
p[3] = (UCHAR_T) no_op; |
#endif /* WCHAR */ |
goto on_failure; |
} |
break; |
case jump_n: |
EXTRACT_NUMBER (mcnt, p + OFFSET_ADDRESS_SIZE); |
DEBUG_PRINT2 ("EXECUTING jump_n %d.\n", mcnt); |
/* Originally, this is how many times we CAN jump. */ |
if (mcnt) |
{ |
mcnt--; |
STORE_NUMBER (p + OFFSET_ADDRESS_SIZE, mcnt); |
#ifdef _LIBC |
DEBUG_PRINT3 (" Setting %p to %d.\n", p + OFFSET_ADDRESS_SIZE, |
mcnt); |
#else |
DEBUG_PRINT3 (" Setting 0x%x to %d.\n", p + OFFSET_ADDRESS_SIZE, |
mcnt); |
#endif /* _LIBC */ |
goto unconditional_jump; |
} |
/* If don't have to jump any more, skip over the rest of command. */ |
else |
p += 2 * OFFSET_ADDRESS_SIZE; |
break; |
case set_number_at: |
{ |
DEBUG_PRINT1 ("EXECUTING set_number_at.\n"); |
EXTRACT_NUMBER_AND_INCR (mcnt, p); |
p1 = p + mcnt; |
EXTRACT_NUMBER_AND_INCR (mcnt, p); |
#ifdef _LIBC |
DEBUG_PRINT3 (" Setting %p to %d.\n", p1, mcnt); |
#else |
DEBUG_PRINT3 (" Setting 0x%x to %d.\n", p1, mcnt); |
#endif |
STORE_NUMBER (p1, mcnt); |
break; |
} |
#if 0 |
/* The DEC Alpha C compiler 3.x generates incorrect code for the |
test WORDCHAR_P (d - 1) != WORDCHAR_P (d) in the expansion of |
AT_WORD_BOUNDARY, so this code is disabled. Expanding the |
macro and introducing temporary variables works around the bug. */ |
case wordbound: |
DEBUG_PRINT1 ("EXECUTING wordbound.\n"); |
if (AT_WORD_BOUNDARY (d)) |
break; |
goto fail; |
case notwordbound: |
DEBUG_PRINT1 ("EXECUTING notwordbound.\n"); |
if (AT_WORD_BOUNDARY (d)) |
goto fail; |
break; |
#else |
case wordbound: |
{ |
boolean prevchar, thischar; |
DEBUG_PRINT1 ("EXECUTING wordbound.\n"); |
if (AT_STRINGS_BEG (d) || AT_STRINGS_END (d)) |
break; |
prevchar = WORDCHAR_P (d - 1); |
thischar = WORDCHAR_P (d); |
if (prevchar != thischar) |
break; |
goto fail; |
} |
case notwordbound: |
{ |
boolean prevchar, thischar; |
DEBUG_PRINT1 ("EXECUTING notwordbound.\n"); |
if (AT_STRINGS_BEG (d) || AT_STRINGS_END (d)) |
goto fail; |
prevchar = WORDCHAR_P (d - 1); |
thischar = WORDCHAR_P (d); |
if (prevchar != thischar) |
goto fail; |
break; |
} |
#endif |
case wordbeg: |
DEBUG_PRINT1 ("EXECUTING wordbeg.\n"); |
if (!AT_STRINGS_END (d) && WORDCHAR_P (d) |
&& (AT_STRINGS_BEG (d) || !WORDCHAR_P (d - 1))) |
break; |
goto fail; |
case wordend: |
DEBUG_PRINT1 ("EXECUTING wordend.\n"); |
if (!AT_STRINGS_BEG (d) && WORDCHAR_P (d - 1) |
&& (AT_STRINGS_END (d) || !WORDCHAR_P (d))) |
break; |
goto fail; |
#ifdef emacs |
case before_dot: |
DEBUG_PRINT1 ("EXECUTING before_dot.\n"); |
if (PTR_CHAR_POS ((unsigned char *) d) >= point) |
goto fail; |
break; |
case at_dot: |
DEBUG_PRINT1 ("EXECUTING at_dot.\n"); |
if (PTR_CHAR_POS ((unsigned char *) d) != point) |
goto fail; |
break; |
case after_dot: |
DEBUG_PRINT1 ("EXECUTING after_dot.\n"); |
if (PTR_CHAR_POS ((unsigned char *) d) <= point) |
goto fail; |
break; |
case syntaxspec: |
DEBUG_PRINT2 ("EXECUTING syntaxspec %d.\n", mcnt); |
mcnt = *p++; |
goto matchsyntax; |
case wordchar: |
DEBUG_PRINT1 ("EXECUTING Emacs wordchar.\n"); |
mcnt = (int) Sword; |
matchsyntax: |
PREFETCH (); |
/* Can't use *d++ here; SYNTAX may be an unsafe macro. */ |
d++; |
if (SYNTAX (d[-1]) != (enum syntaxcode) mcnt) |
goto fail; |
SET_REGS_MATCHED (); |
break; |
case notsyntaxspec: |
DEBUG_PRINT2 ("EXECUTING notsyntaxspec %d.\n", mcnt); |
mcnt = *p++; |
goto matchnotsyntax; |
case notwordchar: |
DEBUG_PRINT1 ("EXECUTING Emacs notwordchar.\n"); |
mcnt = (int) Sword; |
matchnotsyntax: |
PREFETCH (); |
/* Can't use *d++ here; SYNTAX may be an unsafe macro. */ |
d++; |
if (SYNTAX (d[-1]) == (enum syntaxcode) mcnt) |
goto fail; |
SET_REGS_MATCHED (); |
break; |
#else /* not emacs */ |
case wordchar: |
DEBUG_PRINT1 ("EXECUTING non-Emacs wordchar.\n"); |
PREFETCH (); |
if (!WORDCHAR_P (d)) |
goto fail; |
SET_REGS_MATCHED (); |
d++; |
break; |
case notwordchar: |
DEBUG_PRINT1 ("EXECUTING non-Emacs notwordchar.\n"); |
PREFETCH (); |
if (WORDCHAR_P (d)) |
goto fail; |
SET_REGS_MATCHED (); |
d++; |
break; |
#endif /* not emacs */ |
default: |
abort (); |
} |
continue; /* Successfully executed one pattern command; keep going. */ |
/* We goto here if a matching operation fails. */ |
fail: |
if (!FAIL_STACK_EMPTY ()) |
{ /* A restart point is known. Restore to that state. */ |
DEBUG_PRINT1 ("\nFAIL:\n"); |
POP_FAILURE_POINT (d, p, |
lowest_active_reg, highest_active_reg, |
regstart, regend, reg_info); |
/* If this failure point is a dummy, try the next one. */ |
if (!p) |
goto fail; |
/* If we failed to the end of the pattern, don't examine *p. */ |
assert (p <= pend); |
if (p < pend) |
{ |
boolean is_a_jump_n = false; |
/* If failed to a backwards jump that's part of a repetition |
loop, need to pop this failure point and use the next one. */ |
switch ((re_opcode_t) *p) |
{ |
case jump_n: |
is_a_jump_n = true; |
case maybe_pop_jump: |
case pop_failure_jump: |
case jump: |
p1 = p + 1; |
EXTRACT_NUMBER_AND_INCR (mcnt, p1); |
p1 += mcnt; |
if ((is_a_jump_n && (re_opcode_t) *p1 == succeed_n) |
|| (!is_a_jump_n |
&& (re_opcode_t) *p1 == on_failure_jump)) |
goto fail; |
break; |
default: |
/* do nothing */ ; |
} |
} |
if (d >= string1 && d <= end1) |
dend = end_match_1; |
} |
else |
break; /* Matching at this starting point really fails. */ |
} /* for (;;) */ |
if (best_regs_set) |
goto restore_best_regs; |
FREE_VARIABLES (); |
return -1; /* Failure to match. */ |
} /* re_match_2 */ |
/* Subroutine definitions for re_match_2. */ |
/* We are passed P pointing to a register number after a start_memory. |
Return true if the pattern up to the corresponding stop_memory can |
match the empty string, and false otherwise. |
If we find the matching stop_memory, sets P to point to one past its number. |
Otherwise, sets P to an undefined byte less than or equal to END. |
We don't handle duplicates properly (yet). */ |
static boolean |
PREFIX(group_match_null_string_p) (UCHAR_T **p, UCHAR_T *end, |
PREFIX(register_info_type) *reg_info) |
{ |
int mcnt; |
/* Point to after the args to the start_memory. */ |
UCHAR_T *p1 = *p + 2; |
while (p1 < end) |
{ |
/* Skip over opcodes that can match nothing, and return true or |
false, as appropriate, when we get to one that can't, or to the |
matching stop_memory. */ |
switch ((re_opcode_t) *p1) |
{ |
/* Could be either a loop or a series of alternatives. */ |
case on_failure_jump: |
p1++; |
EXTRACT_NUMBER_AND_INCR (mcnt, p1); |
/* If the next operation is not a jump backwards in the |
pattern. */ |
if (mcnt >= 0) |
{ |
/* Go through the on_failure_jumps of the alternatives, |
seeing if any of the alternatives cannot match nothing. |
The last alternative starts with only a jump, |
whereas the rest start with on_failure_jump and end |
with a jump, e.g., here is the pattern for `a|b|c': |
/on_failure_jump/0/6/exactn/1/a/jump_past_alt/0/6 |
/on_failure_jump/0/6/exactn/1/b/jump_past_alt/0/3 |
/exactn/1/c |
So, we have to first go through the first (n-1) |
alternatives and then deal with the last one separately. */ |
/* Deal with the first (n-1) alternatives, which start |
with an on_failure_jump (see above) that jumps to right |
past a jump_past_alt. */ |
while ((re_opcode_t) p1[mcnt-(1+OFFSET_ADDRESS_SIZE)] == |
jump_past_alt) |
{ |
/* `mcnt' holds how many bytes long the alternative |
is, including the ending `jump_past_alt' and |
its number. */ |
if (!PREFIX(alt_match_null_string_p) (p1, p1 + mcnt - |
(1 + OFFSET_ADDRESS_SIZE), |
reg_info)) |
return false; |
/* Move to right after this alternative, including the |
jump_past_alt. */ |
p1 += mcnt; |
/* Break if it's the beginning of an n-th alternative |
that doesn't begin with an on_failure_jump. */ |
if ((re_opcode_t) *p1 != on_failure_jump) |
break; |
/* Still have to check that it's not an n-th |
alternative that starts with an on_failure_jump. */ |
p1++; |
EXTRACT_NUMBER_AND_INCR (mcnt, p1); |
if ((re_opcode_t) p1[mcnt-(1+OFFSET_ADDRESS_SIZE)] != |
jump_past_alt) |
{ |
/* Get to the beginning of the n-th alternative. */ |
p1 -= 1 + OFFSET_ADDRESS_SIZE; |
break; |
} |
} |
/* Deal with the last alternative: go back and get number |
of the `jump_past_alt' just before it. `mcnt' contains |
the length of the alternative. */ |
EXTRACT_NUMBER (mcnt, p1 - OFFSET_ADDRESS_SIZE); |
if (!PREFIX(alt_match_null_string_p) (p1, p1 + mcnt, reg_info)) |
return false; |
p1 += mcnt; /* Get past the n-th alternative. */ |
} /* if mcnt > 0 */ |
break; |
case stop_memory: |
assert (p1[1] == **p); |
*p = p1 + 2; |
return true; |
default: |
if (!PREFIX(common_op_match_null_string_p) (&p1, end, reg_info)) |
return false; |
} |
} /* while p1 < end */ |
return false; |
} /* group_match_null_string_p */ |
/* Similar to group_match_null_string_p, but doesn't deal with alternatives: |
It expects P to be the first byte of a single alternative and END one |
byte past the last. The alternative can contain groups. */ |
static boolean |
PREFIX(alt_match_null_string_p) (UCHAR_T *p, UCHAR_T *end, |
PREFIX(register_info_type) *reg_info) |
{ |
int mcnt; |
UCHAR_T *p1 = p; |
while (p1 < end) |
{ |
/* Skip over opcodes that can match nothing, and break when we get |
to one that can't. */ |
switch ((re_opcode_t) *p1) |
{ |
/* It's a loop. */ |
case on_failure_jump: |
p1++; |
EXTRACT_NUMBER_AND_INCR (mcnt, p1); |
p1 += mcnt; |
break; |
default: |
if (!PREFIX(common_op_match_null_string_p) (&p1, end, reg_info)) |
return false; |
} |
} /* while p1 < end */ |
return true; |
} /* alt_match_null_string_p */ |
/* Deals with the ops common to group_match_null_string_p and |
alt_match_null_string_p. |
Sets P to one after the op and its arguments, if any. */ |
static boolean |
PREFIX(common_op_match_null_string_p) (UCHAR_T **p, UCHAR_T *end, |
PREFIX(register_info_type) *reg_info) |
{ |
int mcnt; |
boolean ret; |
int reg_no; |
UCHAR_T *p1 = *p; |
switch ((re_opcode_t) *p1++) |
{ |
case no_op: |
case begline: |
case endline: |
case begbuf: |
case endbuf: |
case wordbeg: |
case wordend: |
case wordbound: |
case notwordbound: |
#ifdef emacs |
case before_dot: |
case at_dot: |
case after_dot: |
#endif |
break; |
case start_memory: |
reg_no = *p1; |
assert (reg_no > 0 && reg_no <= MAX_REGNUM); |
ret = PREFIX(group_match_null_string_p) (&p1, end, reg_info); |
/* Have to set this here in case we're checking a group which |
contains a group and a back reference to it. */ |
if (REG_MATCH_NULL_STRING_P (reg_info[reg_no]) == MATCH_NULL_UNSET_VALUE) |
REG_MATCH_NULL_STRING_P (reg_info[reg_no]) = ret; |
if (!ret) |
return false; |
break; |
/* If this is an optimized succeed_n for zero times, make the jump. */ |
case jump: |
EXTRACT_NUMBER_AND_INCR (mcnt, p1); |
if (mcnt >= 0) |
p1 += mcnt; |
else |
return false; |
break; |
case succeed_n: |
/* Get to the number of times to succeed. */ |
p1 += OFFSET_ADDRESS_SIZE; |
EXTRACT_NUMBER_AND_INCR (mcnt, p1); |
if (mcnt == 0) |
{ |
p1 -= 2 * OFFSET_ADDRESS_SIZE; |
EXTRACT_NUMBER_AND_INCR (mcnt, p1); |
p1 += mcnt; |
} |
else |
return false; |
break; |
case duplicate: |
if (!REG_MATCH_NULL_STRING_P (reg_info[*p1])) |
return false; |
break; |
case set_number_at: |
p1 += 2 * OFFSET_ADDRESS_SIZE; |
default: |
/* All other opcodes mean we cannot match the empty string. */ |
return false; |
} |
*p = p1; |
return true; |
} /* common_op_match_null_string_p */ |
/* Return zero if TRANSLATE[S1] and TRANSLATE[S2] are identical for LEN |
bytes; nonzero otherwise. */ |
static int |
PREFIX(bcmp_translate) (const CHAR_T *s1, const CHAR_T *s2, register int len, |
RE_TRANSLATE_TYPE translate) |
{ |
register const UCHAR_T *p1 = (const UCHAR_T *) s1; |
register const UCHAR_T *p2 = (const UCHAR_T *) s2; |
while (len) |
{ |
#ifdef WCHAR |
if (((*p1<=0xff)?translate[*p1++]:*p1++) |
!= ((*p2<=0xff)?translate[*p2++]:*p2++)) |
return 1; |
#else /* BYTE */ |
if (translate[*p1++] != translate[*p2++]) return 1; |
#endif /* WCHAR */ |
len--; |
} |
return 0; |
} |
#else /* not INSIDE_RECURSION */ |
/* Entry points for GNU code. */ |
/* re_compile_pattern is the GNU regular expression compiler: it |
compiles PATTERN (of length SIZE) and puts the result in BUFP. |
Returns 0 if the pattern was valid, otherwise an error string. |
Assumes the `allocated' (and perhaps `buffer') and `translate' fields |
are set in BUFP on entry. |
We call regex_compile to do the actual compilation. */ |
const char * |
re_compile_pattern (const char *pattern, size_t length, |
struct re_pattern_buffer *bufp) |
{ |
reg_errcode_t ret; |
/* GNU code is written to assume at least RE_NREGS registers will be set |
(and at least one extra will be -1). */ |
bufp->regs_allocated = REGS_UNALLOCATED; |
/* And GNU code determines whether or not to get register information |
by passing null for the REGS argument to re_match, etc., not by |
setting no_sub. */ |
bufp->no_sub = 0; |
/* Match anchors at newline. */ |
bufp->newline_anchor = 1; |
# ifdef MBS_SUPPORT |
if (MB_CUR_MAX != 1) |
ret = wcs_regex_compile (pattern, length, re_syntax_options, bufp); |
else |
# endif |
ret = byte_regex_compile (pattern, length, re_syntax_options, bufp); |
if (!ret) |
return NULL; |
return gettext (re_error_msgid[(int) ret]); |
} |
#ifdef _LIBC |
weak_alias (__re_compile_pattern, re_compile_pattern) |
#endif |
/* Entry points compatible with 4.2 BSD regex library. We don't define |
them unless specifically requested. */ |
#if defined _REGEX_RE_COMP || defined _LIBC |
/* BSD has one and only one pattern buffer. */ |
static struct re_pattern_buffer re_comp_buf; |
char * |
#ifdef _LIBC |
/* Make these definitions weak in libc, so POSIX programs can redefine |
these names if they don't use our functions, and still use |
regcomp/regexec below without link errors. */ |
weak_function |
#endif |
re_comp (const char *s) |
{ |
reg_errcode_t ret; |
if (!s) |
{ |
if (!re_comp_buf.buffer) |
return (char *) gettext ("No previous regular expression"); |
return 0; |
} |
if (!re_comp_buf.buffer) |
{ |
re_comp_buf.buffer = (unsigned char *) malloc (200); |
if (re_comp_buf.buffer == NULL) |
return (char *) gettext (re_error_msgid[(int) REG_ESPACE]); |
re_comp_buf.allocated = 200; |
re_comp_buf.fastmap = (char *) malloc (1 << BYTEWIDTH); |
if (re_comp_buf.fastmap == NULL) |
return (char *) gettext (re_error_msgid[(int) REG_ESPACE]); |
} |
/* Since `re_exec' always passes NULL for the `regs' argument, we |
don't need to initialize the pattern buffer fields which affect it. */ |
/* Match anchors at newlines. */ |
re_comp_buf.newline_anchor = 1; |
# ifdef MBS_SUPPORT |
if (MB_CUR_MAX != 1) |
ret = wcs_regex_compile (s, strlen (s), re_syntax_options, &re_comp_buf); |
else |
# endif |
ret = byte_regex_compile (s, strlen (s), re_syntax_options, &re_comp_buf); |
if (!ret) |
return NULL; |
/* Yes, we're discarding `const' here if !HAVE_LIBINTL. */ |
return (char *) gettext (re_error_msgid[(int) ret]); |
} |
int |
#ifdef _LIBC |
weak_function |
#endif |
re_exec (const char *s) |
{ |
const int len = strlen (s); |
return |
0 <= re_search (&re_comp_buf, s, len, 0, len, (struct re_registers *) 0); |
} |
#endif /* _REGEX_RE_COMP */ |
/* POSIX.2 functions. Don't define these for Emacs. */ |
#ifndef emacs |
/* regcomp takes a regular expression as a string and compiles it. |
PREG is a regex_t *. We do not expect any fields to be initialized, |
since POSIX says we shouldn't. Thus, we set |
`buffer' to the compiled pattern; |
`used' to the length of the compiled pattern; |
`syntax' to RE_SYNTAX_POSIX_EXTENDED if the |
REG_EXTENDED bit in CFLAGS is set; otherwise, to |
RE_SYNTAX_POSIX_BASIC; |
`newline_anchor' to REG_NEWLINE being set in CFLAGS; |
`fastmap' to an allocated space for the fastmap; |
`fastmap_accurate' to zero; |
`re_nsub' to the number of subexpressions in PATTERN. |
PATTERN is the address of the pattern string. |
CFLAGS is a series of bits which affect compilation. |
If REG_EXTENDED is set, we use POSIX extended syntax; otherwise, we |
use POSIX basic syntax. |
If REG_NEWLINE is set, then . and [^...] don't match newline. |
Also, regexec will try a match beginning after every newline. |
If REG_ICASE is set, then we considers upper- and lowercase |
versions of letters to be equivalent when matching. |
If REG_NOSUB is set, then when PREG is passed to regexec, that |
routine will report only success or failure, and nothing about the |
registers. |
It returns 0 if it succeeds, nonzero if it doesn't. (See regex.h for |
the return codes and their meanings.) */ |
int |
regcomp (regex_t *preg, const char *pattern, int cflags) |
{ |
reg_errcode_t ret; |
reg_syntax_t syntax |
= (cflags & REG_EXTENDED) ? |
RE_SYNTAX_POSIX_EXTENDED : RE_SYNTAX_POSIX_BASIC; |
/* regex_compile will allocate the space for the compiled pattern. */ |
preg->buffer = 0; |
preg->allocated = 0; |
preg->used = 0; |
/* Try to allocate space for the fastmap. */ |
preg->fastmap = (char *) malloc (1 << BYTEWIDTH); |
if (cflags & REG_ICASE) |
{ |
int i; |
preg->translate |
= (RE_TRANSLATE_TYPE) malloc (CHAR_SET_SIZE |
* sizeof (*(RE_TRANSLATE_TYPE)0)); |
if (preg->translate == NULL) |
return (int) REG_ESPACE; |
/* Map uppercase characters to corresponding lowercase ones. */ |
for (i = 0; i < CHAR_SET_SIZE; i++) |
preg->translate[i] = ISUPPER (i) ? TOLOWER (i) : i; |
} |
else |
preg->translate = NULL; |
/* If REG_NEWLINE is set, newlines are treated differently. */ |
if (cflags & REG_NEWLINE) |
{ /* REG_NEWLINE implies neither . nor [^...] match newline. */ |
syntax &= ~RE_DOT_NEWLINE; |
syntax |= RE_HAT_LISTS_NOT_NEWLINE; |
/* It also changes the matching behavior. */ |
preg->newline_anchor = 1; |
} |
else |
preg->newline_anchor = 0; |
preg->no_sub = !!(cflags & REG_NOSUB); |
/* POSIX says a null character in the pattern terminates it, so we |
can use strlen here in compiling the pattern. */ |
# ifdef MBS_SUPPORT |
if (MB_CUR_MAX != 1) |
ret = wcs_regex_compile (pattern, strlen (pattern), syntax, preg); |
else |
# endif |
ret = byte_regex_compile (pattern, strlen (pattern), syntax, preg); |
/* POSIX doesn't distinguish between an unmatched open-group and an |
unmatched close-group: both are REG_EPAREN. */ |
if (ret == REG_ERPAREN) ret = REG_EPAREN; |
if (ret == REG_NOERROR && preg->fastmap) |
{ |
/* Compute the fastmap now, since regexec cannot modify the pattern |
buffer. */ |
if (re_compile_fastmap (preg) == -2) |
{ |
/* Some error occurred while computing the fastmap, just forget |
about it. */ |
free (preg->fastmap); |
preg->fastmap = NULL; |
} |
} |
return (int) ret; |
} |
#ifdef _LIBC |
weak_alias (__regcomp, regcomp) |
#endif |
/* regexec searches for a given pattern, specified by PREG, in the |
string STRING. |
If NMATCH is zero or REG_NOSUB was set in the cflags argument to |
`regcomp', we ignore PMATCH. Otherwise, we assume PMATCH has at |
least NMATCH elements, and we set them to the offsets of the |
corresponding matched substrings. |
EFLAGS specifies `execution flags' which affect matching: if |
REG_NOTBOL is set, then ^ does not match at the beginning of the |
string; if REG_NOTEOL is set, then $ does not match at the end. |
We return 0 if we find a match and REG_NOMATCH if not. */ |
int |
regexec (const regex_t *preg, const char *string, size_t nmatch, |
regmatch_t pmatch[], int eflags) |
{ |
int ret; |
struct re_registers regs; |
regex_t private_preg; |
int len = strlen (string); |
boolean want_reg_info = !preg->no_sub && nmatch > 0; |
private_preg = *preg; |
private_preg.not_bol = !!(eflags & REG_NOTBOL); |
private_preg.not_eol = !!(eflags & REG_NOTEOL); |
/* The user has told us exactly how many registers to return |
information about, via `nmatch'. We have to pass that on to the |
matching routines. */ |
private_preg.regs_allocated = REGS_FIXED; |
if (want_reg_info) |
{ |
regs.num_regs = nmatch; |
regs.start = TALLOC (nmatch * 2, regoff_t); |
if (regs.start == NULL) |
return (int) REG_NOMATCH; |
regs.end = regs.start + nmatch; |
} |
/* Perform the searching operation. */ |
ret = re_search (&private_preg, string, len, |
/* start: */ 0, /* range: */ len, |
want_reg_info ? ®s : (struct re_registers *) 0); |
/* Copy the register information to the POSIX structure. */ |
if (want_reg_info) |
{ |
if (ret >= 0) |
{ |
unsigned r; |
for (r = 0; r < nmatch; r++) |
{ |
pmatch[r].rm_so = regs.start[r]; |
pmatch[r].rm_eo = regs.end[r]; |
} |
} |
/* If we needed the temporary register info, free the space now. */ |
free (regs.start); |
} |
/* We want zero return to mean success, unlike `re_search'. */ |
return ret >= 0 ? (int) REG_NOERROR : (int) REG_NOMATCH; |
} |
#ifdef _LIBC |
weak_alias (__regexec, regexec) |
#endif |
/* Returns a message corresponding to an error code, ERRCODE, returned |
from either regcomp or regexec. We don't use PREG here. */ |
size_t |
regerror (int errcode, const regex_t *preg ATTRIBUTE_UNUSED, |
char *errbuf, size_t errbuf_size) |
{ |
const char *msg; |
size_t msg_size; |
if (errcode < 0 |
|| errcode >= (int) (sizeof (re_error_msgid) |
/ sizeof (re_error_msgid[0]))) |
/* Only error codes returned by the rest of the code should be passed |
to this routine. If we are given anything else, or if other regex |
code generates an invalid error code, then the program has a bug. |
Dump core so we can fix it. */ |
abort (); |
msg = gettext (re_error_msgid[errcode]); |
msg_size = strlen (msg) + 1; /* Includes the null. */ |
if (errbuf_size != 0) |
{ |
if (msg_size > errbuf_size) |
{ |
#if defined HAVE_MEMPCPY || defined _LIBC |
*((char *) mempcpy (errbuf, msg, errbuf_size - 1)) = '\0'; |
#else |
memcpy (errbuf, msg, errbuf_size - 1); |
errbuf[errbuf_size - 1] = 0; |
#endif |
} |
else |
memcpy (errbuf, msg, msg_size); |
} |
return msg_size; |
} |
#ifdef _LIBC |
weak_alias (__regerror, regerror) |
#endif |
/* Free dynamically allocated space used by PREG. */ |
void |
regfree (regex_t *preg) |
{ |
free (preg->buffer); |
preg->buffer = NULL; |
preg->allocated = 0; |
preg->used = 0; |
free (preg->fastmap); |
preg->fastmap = NULL; |
preg->fastmap_accurate = 0; |
free (preg->translate); |
preg->translate = NULL; |
} |
#ifdef _LIBC |
weak_alias (__regfree, regfree) |
#endif |
#endif /* not emacs */ |
#endif /* not INSIDE_RECURSION */ |
#undef STORE_NUMBER |
#undef STORE_NUMBER_AND_INCR |
#undef EXTRACT_NUMBER |
#undef EXTRACT_NUMBER_AND_INCR |
#undef DEBUG_PRINT_COMPILED_PATTERN |
#undef DEBUG_PRINT_DOUBLE_STRING |
#undef INIT_FAIL_STACK |
#undef RESET_FAIL_STACK |
#undef DOUBLE_FAIL_STACK |
#undef PUSH_PATTERN_OP |
#undef PUSH_FAILURE_POINTER |
#undef PUSH_FAILURE_INT |
#undef PUSH_FAILURE_ELT |
#undef POP_FAILURE_POINTER |
#undef POP_FAILURE_INT |
#undef POP_FAILURE_ELT |
#undef DEBUG_PUSH |
#undef DEBUG_POP |
#undef PUSH_FAILURE_POINT |
#undef POP_FAILURE_POINT |
#undef REG_UNSET_VALUE |
#undef REG_UNSET |
#undef PATFETCH |
#undef PATFETCH_RAW |
#undef PATUNFETCH |
#undef TRANSLATE |
#undef INIT_BUF_SIZE |
#undef GET_BUFFER_SPACE |
#undef BUF_PUSH |
#undef BUF_PUSH_2 |
#undef BUF_PUSH_3 |
#undef STORE_JUMP |
#undef STORE_JUMP2 |
#undef INSERT_JUMP |
#undef INSERT_JUMP2 |
#undef EXTEND_BUFFER |
#undef GET_UNSIGNED_NUMBER |
#undef FREE_STACK_RETURN |
# undef POINTER_TO_OFFSET |
# undef MATCHING_IN_FRST_STRING |
# undef PREFETCH |
# undef AT_STRINGS_BEG |
# undef AT_STRINGS_END |
# undef WORDCHAR_P |
# undef FREE_VAR |
# undef FREE_VARIABLES |
# undef NO_HIGHEST_ACTIVE_REG |
# undef NO_LOWEST_ACTIVE_REG |
# undef CHAR_T |
# undef UCHAR_T |
# undef COMPILED_BUFFER_VAR |
# undef OFFSET_ADDRESS_SIZE |
# undef CHAR_CLASS_SIZE |
# undef PREFIX |
# undef ARG_PREFIX |
# undef PUT_CHAR |
# undef BYTE |
# undef WCHAR |
# define DEFINED_ONCE |
/contrib/toolchain/binutils/libiberty/rindex.c |
---|
0,0 → 1,21 |
/* Stub implementation of (obsolete) rindex(). */ |
/* |
@deftypefn Supplemental char* rindex (const char *@var{s}, int @var{c}) |
Returns a pointer to the last occurrence of the character @var{c} in |
the string @var{s}, or @code{NULL} if not found. The use of @code{rindex} is |
deprecated in new programs in favor of @code{strrchr}. |
@end deftypefn |
*/ |
extern char *strrchr (const char *, int); |
char * |
rindex (const char *s, int c) |
{ |
return strrchr (s, c); |
} |
/contrib/toolchain/binutils/libiberty/safe-ctype.c |
---|
0,0 → 1,255 |
/* <ctype.h> replacement macros. |
Copyright (C) 2000, 2001, 2002, 2003, 2004, |
2005 Free Software Foundation, Inc. |
Contributed by Zack Weinberg <zackw@stanford.edu>. |
This file is part of the libiberty library. |
Libiberty is free software; you can redistribute it and/or |
modify it under the terms of the GNU Library General Public |
License as published by the Free Software Foundation; either |
version 2 of the License, or (at your option) any later version. |
Libiberty is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
Library General Public License for more details. |
You should have received a copy of the GNU Library General Public |
License along with libiberty; see the file COPYING.LIB. If |
not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
/* |
@defvr Extension HOST_CHARSET |
This macro indicates the basic character set and encoding used by the |
host: more precisely, the encoding used for character constants in |
preprocessor @samp{#if} statements (the C "execution character set"). |
It is defined by @file{safe-ctype.h}, and will be an integer constant |
with one of the following values: |
@ftable @code |
@item HOST_CHARSET_UNKNOWN |
The host character set is unknown - that is, not one of the next two |
possibilities. |
@item HOST_CHARSET_ASCII |
The host character set is ASCII. |
@item HOST_CHARSET_EBCDIC |
The host character set is some variant of EBCDIC. (Only one of the |
nineteen EBCDIC varying characters is tested; exercise caution.) |
@end ftable |
@end defvr |
@deffn Extension ISALPHA (@var{c}) |
@deffnx Extension ISALNUM (@var{c}) |
@deffnx Extension ISBLANK (@var{c}) |
@deffnx Extension ISCNTRL (@var{c}) |
@deffnx Extension ISDIGIT (@var{c}) |
@deffnx Extension ISGRAPH (@var{c}) |
@deffnx Extension ISLOWER (@var{c}) |
@deffnx Extension ISPRINT (@var{c}) |
@deffnx Extension ISPUNCT (@var{c}) |
@deffnx Extension ISSPACE (@var{c}) |
@deffnx Extension ISUPPER (@var{c}) |
@deffnx Extension ISXDIGIT (@var{c}) |
These twelve macros are defined by @file{safe-ctype.h}. Each has the |
same meaning as the corresponding macro (with name in lowercase) |
defined by the standard header @file{ctype.h}. For example, |
@code{ISALPHA} returns true for alphabetic characters and false for |
others. However, there are two differences between these macros and |
those provided by @file{ctype.h}: |
@itemize @bullet |
@item These macros are guaranteed to have well-defined behavior for all |
values representable by @code{signed char} and @code{unsigned char}, and |
for @code{EOF}. |
@item These macros ignore the current locale; they are true for these |
fixed sets of characters: |
@multitable {@code{XDIGIT}} {yada yada yada yada yada yada yada yada} |
@item @code{ALPHA} @tab @kbd{A-Za-z} |
@item @code{ALNUM} @tab @kbd{A-Za-z0-9} |
@item @code{BLANK} @tab @kbd{space tab} |
@item @code{CNTRL} @tab @code{!PRINT} |
@item @code{DIGIT} @tab @kbd{0-9} |
@item @code{GRAPH} @tab @code{ALNUM || PUNCT} |
@item @code{LOWER} @tab @kbd{a-z} |
@item @code{PRINT} @tab @code{GRAPH ||} @kbd{space} |
@item @code{PUNCT} @tab @kbd{`~!@@#$%^&*()_-=+[@{]@}\|;:'",<.>/?} |
@item @code{SPACE} @tab @kbd{space tab \n \r \f \v} |
@item @code{UPPER} @tab @kbd{A-Z} |
@item @code{XDIGIT} @tab @kbd{0-9A-Fa-f} |
@end multitable |
Note that, if the host character set is ASCII or a superset thereof, |
all these macros will return false for all values of @code{char} outside |
the range of 7-bit ASCII. In particular, both ISPRINT and ISCNTRL return |
false for characters with numeric values from 128 to 255. |
@end itemize |
@end deffn |
@deffn Extension ISIDNUM (@var{c}) |
@deffnx Extension ISIDST (@var{c}) |
@deffnx Extension IS_VSPACE (@var{c}) |
@deffnx Extension IS_NVSPACE (@var{c}) |
@deffnx Extension IS_SPACE_OR_NUL (@var{c}) |
@deffnx Extension IS_ISOBASIC (@var{c}) |
These six macros are defined by @file{safe-ctype.h} and provide |
additional character classes which are useful when doing lexical |
analysis of C or similar languages. They are true for the following |
sets of characters: |
@multitable {@code{SPACE_OR_NUL}} {yada yada yada yada yada yada yada yada} |
@item @code{IDNUM} @tab @kbd{A-Za-z0-9_} |
@item @code{IDST} @tab @kbd{A-Za-z_} |
@item @code{VSPACE} @tab @kbd{\r \n} |
@item @code{NVSPACE} @tab @kbd{space tab \f \v \0} |
@item @code{SPACE_OR_NUL} @tab @code{VSPACE || NVSPACE} |
@item @code{ISOBASIC} @tab @code{VSPACE || NVSPACE || PRINT} |
@end multitable |
@end deffn |
*/ |
#include "ansidecl.h" |
#include <safe-ctype.h> |
#include <stdio.h> /* for EOF */ |
#if EOF != -1 |
#error "<safe-ctype.h> requires EOF == -1" |
#endif |
/* Shorthand */ |
#define bl _sch_isblank |
#define cn _sch_iscntrl |
#define di _sch_isdigit |
#define is _sch_isidst |
#define lo _sch_islower |
#define nv _sch_isnvsp |
#define pn _sch_ispunct |
#define pr _sch_isprint |
#define sp _sch_isspace |
#define up _sch_isupper |
#define vs _sch_isvsp |
#define xd _sch_isxdigit |
/* Masks. */ |
#define L (const unsigned short) (lo|is |pr) /* lower case letter */ |
#define XL (const unsigned short) (lo|is|xd|pr) /* lowercase hex digit */ |
#define U (const unsigned short) (up|is |pr) /* upper case letter */ |
#define XU (const unsigned short) (up|is|xd|pr) /* uppercase hex digit */ |
#define D (const unsigned short) (di |xd|pr) /* decimal digit */ |
#define P (const unsigned short) (pn |pr) /* punctuation */ |
#define _ (const unsigned short) (pn|is |pr) /* underscore */ |
#define C (const unsigned short) ( cn) /* control character */ |
#define Z (const unsigned short) (nv |cn) /* NUL */ |
#define M (const unsigned short) (nv|sp |cn) /* cursor movement: \f \v */ |
#define V (const unsigned short) (vs|sp |cn) /* vertical space: \r \n */ |
#define T (const unsigned short) (nv|sp|bl|cn) /* tab */ |
#define S (const unsigned short) (nv|sp|bl|pr) /* space */ |
/* Are we ASCII? */ |
#if HOST_CHARSET == HOST_CHARSET_ASCII |
const unsigned short _sch_istable[256] = |
{ |
Z, C, C, C, C, C, C, C, /* NUL SOH STX ETX EOT ENQ ACK BEL */ |
C, T, V, M, M, V, C, C, /* BS HT LF VT FF CR SO SI */ |
C, C, C, C, C, C, C, C, /* DLE DC1 DC2 DC3 DC4 NAK SYN ETB */ |
C, C, C, C, C, C, C, C, /* CAN EM SUB ESC FS GS RS US */ |
S, P, P, P, P, P, P, P, /* SP ! " # $ % & ' */ |
P, P, P, P, P, P, P, P, /* ( ) * + , - . / */ |
D, D, D, D, D, D, D, D, /* 0 1 2 3 4 5 6 7 */ |
D, D, P, P, P, P, P, P, /* 8 9 : ; < = > ? */ |
P, XU, XU, XU, XU, XU, XU, U, /* @ A B C D E F G */ |
U, U, U, U, U, U, U, U, /* H I J K L M N O */ |
U, U, U, U, U, U, U, U, /* P Q R S T U V W */ |
U, U, U, P, P, P, P, _, /* X Y Z [ \ ] ^ _ */ |
P, XL, XL, XL, XL, XL, XL, L, /* ` a b c d e f g */ |
L, L, L, L, L, L, L, L, /* h i j k l m n o */ |
L, L, L, L, L, L, L, L, /* p q r s t u v w */ |
L, L, L, P, P, P, P, C, /* x y z { | } ~ DEL */ |
/* high half of unsigned char is locale-specific, so all tests are |
false in "C" locale */ |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
}; |
const unsigned char _sch_tolower[256] = |
{ |
0, 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, |
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', |
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', |
91, 92, 93, 94, 95, 96, |
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', |
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', |
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,158,159, |
160,161,162,163, 164,165,166,167, 168,169,170,171, 172,173,174,175, |
176,177,178,179, 180,181,182,183, 184,185,186,187, 188,189,190,191, |
192,193,194,195, 196,197,198,199, 200,201,202,203, 204,205,206,207, |
208,209,210,211, 212,213,214,215, 216,217,218,219, 220,221,222,223, |
224,225,226,227, 228,229,230,231, 232,233,234,235, 236,237,238,239, |
240,241,242,243, 244,245,246,247, 248,249,250,251, 252,253,254,255, |
}; |
const unsigned char _sch_toupper[256] = |
{ |
0, 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, |
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', |
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', |
91, 92, 93, 94, 95, 96, |
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', |
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', |
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,158,159, |
160,161,162,163, 164,165,166,167, 168,169,170,171, 172,173,174,175, |
176,177,178,179, 180,181,182,183, 184,185,186,187, 188,189,190,191, |
192,193,194,195, 196,197,198,199, 200,201,202,203, 204,205,206,207, |
208,209,210,211, 212,213,214,215, 216,217,218,219, 220,221,222,223, |
224,225,226,227, 228,229,230,231, 232,233,234,235, 236,237,238,239, |
240,241,242,243, 244,245,246,247, 248,249,250,251, 252,253,254,255, |
}; |
#else |
# if HOST_CHARSET == HOST_CHARSET_EBCDIC |
#error "FIXME: write tables for EBCDIC" |
# else |
#error "Unrecognized host character set" |
# endif |
#endif |
/contrib/toolchain/binutils/libiberty/setenv.c |
---|
0,0 → 1,185 |
/* Copyright (C) 1992, 1995, 1996, 1997, 2002, 2011 Free Software Foundation, |
Inc. |
This file based on setenv.c in the GNU C Library. |
The GNU C Library is free software; you can redistribute it and/or |
modify it under the terms of the GNU Library General Public License as |
published by the Free Software Foundation; either version 2 of the |
License, or (at your option) any later version. |
The GNU C Library is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
Library General Public License for more details. |
You should have received a copy of the GNU Library General Public |
License along with the GNU C Library; see the file COPYING.LIB. If not, |
write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
/* |
@deftypefn Supplemental int setenv (const char *@var{name}, @ |
const char *@var{value}, int @var{overwrite}) |
@deftypefnx Supplemental void unsetenv (const char *@var{name}) |
@code{setenv} adds @var{name} to the environment with value |
@var{value}. If the name was already present in the environment, |
the new value will be stored only if @var{overwrite} is nonzero. |
The companion @code{unsetenv} function removes @var{name} from the |
environment. This implementation is not safe for multithreaded code. |
@end deftypefn |
*/ |
#if HAVE_CONFIG_H |
# include <config.h> |
#endif |
#define setenv libiberty_setenv |
#define unsetenv libiberty_unsetenv |
#include "ansidecl.h" |
#include <sys/types.h> /* For `size_t' */ |
#include <stdio.h> /* For `NULL' */ |
#include <errno.h> |
#if !defined(errno) && !defined(HAVE_ERRNO_DECL) |
extern int errno; |
#endif |
#define __set_errno(ev) ((errno) = (ev)) |
#if HAVE_STDLIB_H |
# include <stdlib.h> |
#endif |
#if HAVE_STRING_H |
# include <string.h> |
#endif |
#if HAVE_UNISTD_H |
# include <unistd.h> |
#endif |
#define __environ environ |
#ifndef HAVE_ENVIRON_DECL |
extern char **environ; |
#endif |
#undef setenv |
#undef unsetenv |
/* LOCK and UNLOCK are defined as no-ops. This makes the libiberty |
* implementation MT-Unsafe. */ |
#define LOCK |
#define UNLOCK |
/* Below this point, it's verbatim code from the glibc-2.0 implementation */ |
/* If this variable is not a null pointer we allocated the current |
environment. */ |
static char **last_environ; |
int |
setenv (const char *name, const char *value, int replace) |
{ |
register char **ep = 0; |
register size_t size; |
const size_t namelen = strlen (name); |
const size_t vallen = strlen (value) + 1; |
LOCK; |
size = 0; |
if (__environ != NULL) |
{ |
for (ep = __environ; *ep != NULL; ++ep) |
if (!strncmp (*ep, name, namelen) && (*ep)[namelen] == '=') |
break; |
else |
++size; |
} |
if (__environ == NULL || *ep == NULL) |
{ |
char **new_environ; |
if (__environ == last_environ && __environ != NULL) |
/* We allocated this space; we can extend it. */ |
new_environ = (char **) realloc (last_environ, |
(size + 2) * sizeof (char *)); |
else |
new_environ = (char **) malloc ((size + 2) * sizeof (char *)); |
if (new_environ == NULL) |
{ |
UNLOCK; |
return -1; |
} |
new_environ[size] = (char *) malloc (namelen + 1 + vallen); |
if (new_environ[size] == NULL) |
{ |
free ((char *) new_environ); |
__set_errno (ENOMEM); |
UNLOCK; |
return -1; |
} |
if (__environ != last_environ) |
memcpy ((char *) new_environ, (char *) __environ, |
size * sizeof (char *)); |
memcpy (new_environ[size], name, namelen); |
new_environ[size][namelen] = '='; |
memcpy (&new_environ[size][namelen + 1], value, vallen); |
new_environ[size + 1] = NULL; |
last_environ = __environ = new_environ; |
} |
else if (replace) |
{ |
size_t len = strlen (*ep); |
if (len + 1 < namelen + 1 + vallen) |
{ |
/* The existing string is too short; malloc a new one. */ |
char *new_string = (char *) malloc (namelen + 1 + vallen); |
if (new_string == NULL) |
{ |
UNLOCK; |
return -1; |
} |
*ep = new_string; |
} |
memcpy (*ep, name, namelen); |
(*ep)[namelen] = '='; |
memcpy (&(*ep)[namelen + 1], value, vallen); |
} |
UNLOCK; |
return 0; |
} |
void |
unsetenv (const char *name) |
{ |
const size_t len = strlen (name); |
char **ep; |
LOCK; |
for (ep = __environ; *ep; ++ep) |
if (!strncmp (*ep, name, len) && (*ep)[len] == '=') |
{ |
/* Found it. Remove this pointer by moving later ones back. */ |
char **dp = ep; |
do |
dp[0] = dp[1]; |
while (*dp++); |
/* Continue the loop in case NAME appears again. */ |
} |
UNLOCK; |
} |
/contrib/toolchain/binutils/libiberty/setproctitle.c |
---|
0,0 → 1,48 |
/* Set the title of a process. |
Copyright (C) 2010, 2011 Free Software Foundation, Inc. |
This file is part of the libiberty library. |
Libiberty is free software; you can redistribute it and/or |
modify it under the terms of the GNU Library General Public |
License as published by the Free Software Foundation; either |
version 2 of the License, or (at your option) any later version. |
Libiberty is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
Library General Public License for more details. |
You should have received a copy of the GNU Library General Public |
License along with libiberty; see the file COPYING.LIB. If not, |
write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
#ifdef HAVE_CONFIG_H |
#include "config.h" |
#endif |
#ifdef HAVE_SYS_PRCTL_H |
#include <sys/types.h> |
#include <sys/prctl.h> |
#endif |
#include "ansidecl.h" |
/* |
@deftypefn Supplemental void setproctitle (const char *@var{fmt}, ...) |
Set the title of a process to @var{fmt}. va args not supported for now, |
but defined for compatibility with BSD. |
@end deftypefn |
*/ |
void |
setproctitle (const char *name ATTRIBUTE_UNUSED, ...) |
{ |
#ifdef PR_SET_NAME |
/* On GNU/Linux this sets the top visible "comm", but not |
necessarily the name visible in ps. */ |
prctl (PR_SET_NAME, name); |
#endif |
} |
/contrib/toolchain/binutils/libiberty/sha1.c |
---|
0,0 → 1,415 |
/* sha1.c - Functions to compute SHA1 message digest of files or |
memory blocks according to the NIST specification FIPS-180-1. |
Copyright (C) 2000, 2001, 2003, 2004, 2005, 2006, 2008 Free Software |
Foundation, Inc. |
This program is free software; you can redistribute it and/or modify it |
under the terms of the GNU General Public License as published by the |
Free Software Foundation; either version 2, or (at your option) any |
later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software Foundation, |
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ |
/* Written by Scott G. Miller |
Credits: |
Robert Klep <robert@ilse.nl> -- Expansion function fix |
*/ |
#include <config.h> |
#include "sha1.h" |
#include <stddef.h> |
#include <string.h> |
#if USE_UNLOCKED_IO |
# include "unlocked-io.h" |
#endif |
#ifdef WORDS_BIGENDIAN |
# define SWAP(n) (n) |
#else |
# define SWAP(n) \ |
(((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24)) |
#endif |
#define BLOCKSIZE 4096 |
#if BLOCKSIZE % 64 != 0 |
# error "invalid BLOCKSIZE" |
#endif |
/* This array contains the bytes used to pad the buffer to the next |
64-byte boundary. (RFC 1321, 3.1: Step 1) */ |
static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ }; |
/* Take a pointer to a 160 bit block of data (five 32 bit ints) and |
initialize it to the start constants of the SHA1 algorithm. This |
must be called before using hash in the call to sha1_hash. */ |
void |
sha1_init_ctx (struct sha1_ctx *ctx) |
{ |
ctx->A = 0x67452301; |
ctx->B = 0xefcdab89; |
ctx->C = 0x98badcfe; |
ctx->D = 0x10325476; |
ctx->E = 0xc3d2e1f0; |
ctx->total[0] = ctx->total[1] = 0; |
ctx->buflen = 0; |
} |
/* Put result from CTX in first 20 bytes following RESBUF. The result |
must be in little endian byte order. |
IMPORTANT: On some systems it is required that RESBUF is correctly |
aligned for a 32-bit value. */ |
void * |
sha1_read_ctx (const struct sha1_ctx *ctx, void *resbuf) |
{ |
((sha1_uint32 *) resbuf)[0] = SWAP (ctx->A); |
((sha1_uint32 *) resbuf)[1] = SWAP (ctx->B); |
((sha1_uint32 *) resbuf)[2] = SWAP (ctx->C); |
((sha1_uint32 *) resbuf)[3] = SWAP (ctx->D); |
((sha1_uint32 *) resbuf)[4] = SWAP (ctx->E); |
return resbuf; |
} |
/* Process the remaining bytes in the internal buffer and the usual |
prolog according to the standard and write the result to RESBUF. |
IMPORTANT: On some systems it is required that RESBUF is correctly |
aligned for a 32-bit value. */ |
void * |
sha1_finish_ctx (struct sha1_ctx *ctx, void *resbuf) |
{ |
/* Take yet unprocessed bytes into account. */ |
sha1_uint32 bytes = ctx->buflen; |
size_t size = (bytes < 56) ? 64 / 4 : 64 * 2 / 4; |
/* Now count remaining bytes. */ |
ctx->total[0] += bytes; |
if (ctx->total[0] < bytes) |
++ctx->total[1]; |
/* Put the 64-bit file length in *bits* at the end of the buffer. */ |
ctx->buffer[size - 2] = SWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 29)); |
ctx->buffer[size - 1] = SWAP (ctx->total[0] << 3); |
memcpy (&((char *) ctx->buffer)[bytes], fillbuf, (size - 2) * 4 - bytes); |
/* Process last bytes. */ |
sha1_process_block (ctx->buffer, size * 4, ctx); |
return sha1_read_ctx (ctx, resbuf); |
} |
/* Compute SHA1 message digest for bytes read from STREAM. The |
resulting message digest number will be written into the 16 bytes |
beginning at RESBLOCK. */ |
int |
sha1_stream (FILE *stream, void *resblock) |
{ |
struct sha1_ctx ctx; |
char buffer[BLOCKSIZE + 72]; |
size_t sum; |
/* Initialize the computation context. */ |
sha1_init_ctx (&ctx); |
/* Iterate over full file contents. */ |
while (1) |
{ |
/* We read the file in blocks of BLOCKSIZE bytes. One call of the |
computation function processes the whole buffer so that with the |
next round of the loop another block can be read. */ |
size_t n; |
sum = 0; |
/* Read block. Take care for partial reads. */ |
while (1) |
{ |
n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream); |
sum += n; |
if (sum == BLOCKSIZE) |
break; |
if (n == 0) |
{ |
/* Check for the error flag IFF N == 0, so that we don't |
exit the loop after a partial read due to e.g., EAGAIN |
or EWOULDBLOCK. */ |
if (ferror (stream)) |
return 1; |
goto process_partial_block; |
} |
/* We've read at least one byte, so ignore errors. But always |
check for EOF, since feof may be true even though N > 0. |
Otherwise, we could end up calling fread after EOF. */ |
if (feof (stream)) |
goto process_partial_block; |
} |
/* Process buffer with BLOCKSIZE bytes. Note that |
BLOCKSIZE % 64 == 0 |
*/ |
sha1_process_block (buffer, BLOCKSIZE, &ctx); |
} |
process_partial_block:; |
/* Process any remaining bytes. */ |
if (sum > 0) |
sha1_process_bytes (buffer, sum, &ctx); |
/* Construct result in desired memory. */ |
sha1_finish_ctx (&ctx, resblock); |
return 0; |
} |
/* Compute SHA1 message digest for LEN bytes beginning at BUFFER. The |
result is always in little endian byte order, so that a byte-wise |
output yields to the wanted ASCII representation of the message |
digest. */ |
void * |
sha1_buffer (const char *buffer, size_t len, void *resblock) |
{ |
struct sha1_ctx ctx; |
/* Initialize the computation context. */ |
sha1_init_ctx (&ctx); |
/* Process whole buffer but last len % 64 bytes. */ |
sha1_process_bytes (buffer, len, &ctx); |
/* Put result in desired memory area. */ |
return sha1_finish_ctx (&ctx, resblock); |
} |
void |
sha1_process_bytes (const void *buffer, size_t len, struct sha1_ctx *ctx) |
{ |
/* When we already have some bits in our internal buffer concatenate |
both inputs first. */ |
if (ctx->buflen != 0) |
{ |
size_t left_over = ctx->buflen; |
size_t add = 128 - left_over > len ? len : 128 - left_over; |
memcpy (&((char *) ctx->buffer)[left_over], buffer, add); |
ctx->buflen += add; |
if (ctx->buflen > 64) |
{ |
sha1_process_block (ctx->buffer, ctx->buflen & ~63, ctx); |
ctx->buflen &= 63; |
/* The regions in the following copy operation cannot overlap. */ |
memcpy (ctx->buffer, |
&((char *) ctx->buffer)[(left_over + add) & ~63], |
ctx->buflen); |
} |
buffer = (const char *) buffer + add; |
len -= add; |
} |
/* Process available complete blocks. */ |
if (len >= 64) |
{ |
#if !_STRING_ARCH_unaligned |
# define alignof(type) offsetof (struct { char c; type x; }, x) |
# define UNALIGNED_P(p) (((size_t) p) % alignof (sha1_uint32) != 0) |
if (UNALIGNED_P (buffer)) |
while (len > 64) |
{ |
sha1_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx); |
buffer = (const char *) buffer + 64; |
len -= 64; |
} |
else |
#endif |
{ |
sha1_process_block (buffer, len & ~63, ctx); |
buffer = (const char *) buffer + (len & ~63); |
len &= 63; |
} |
} |
/* Move remaining bytes in internal buffer. */ |
if (len > 0) |
{ |
size_t left_over = ctx->buflen; |
memcpy (&((char *) ctx->buffer)[left_over], buffer, len); |
left_over += len; |
if (left_over >= 64) |
{ |
sha1_process_block (ctx->buffer, 64, ctx); |
left_over -= 64; |
memcpy (ctx->buffer, &ctx->buffer[16], left_over); |
} |
ctx->buflen = left_over; |
} |
} |
/* --- Code below is the primary difference between md5.c and sha1.c --- */ |
/* SHA1 round constants */ |
#define K1 0x5a827999 |
#define K2 0x6ed9eba1 |
#define K3 0x8f1bbcdc |
#define K4 0xca62c1d6 |
/* Round functions. Note that F2 is the same as F4. */ |
#define F1(B,C,D) ( D ^ ( B & ( C ^ D ) ) ) |
#define F2(B,C,D) (B ^ C ^ D) |
#define F3(B,C,D) ( ( B & C ) | ( D & ( B | C ) ) ) |
#define F4(B,C,D) (B ^ C ^ D) |
/* Process LEN bytes of BUFFER, accumulating context into CTX. |
It is assumed that LEN % 64 == 0. |
Most of this code comes from GnuPG's cipher/sha1.c. */ |
void |
sha1_process_block (const void *buffer, size_t len, struct sha1_ctx *ctx) |
{ |
const sha1_uint32 *words = (const sha1_uint32*) buffer; |
size_t nwords = len / sizeof (sha1_uint32); |
const sha1_uint32 *endp = words + nwords; |
sha1_uint32 x[16]; |
sha1_uint32 a = ctx->A; |
sha1_uint32 b = ctx->B; |
sha1_uint32 c = ctx->C; |
sha1_uint32 d = ctx->D; |
sha1_uint32 e = ctx->E; |
/* First increment the byte count. RFC 1321 specifies the possible |
length of the file up to 2^64 bits. Here we only compute the |
number of bytes. Do a double word increment. */ |
ctx->total[0] += len; |
ctx->total[1] += ((len >> 31) >> 1) + (ctx->total[0] < len); |
#define rol(x, n) (((x) << (n)) | ((sha1_uint32) (x) >> (32 - (n)))) |
#define M(I) ( tm = x[I&0x0f] ^ x[(I-14)&0x0f] \ |
^ x[(I-8)&0x0f] ^ x[(I-3)&0x0f] \ |
, (x[I&0x0f] = rol(tm, 1)) ) |
#define R(A,B,C,D,E,F,K,M) do { E += rol( A, 5 ) \ |
+ F( B, C, D ) \ |
+ K \ |
+ M; \ |
B = rol( B, 30 ); \ |
} while(0) |
while (words < endp) |
{ |
sha1_uint32 tm; |
int t; |
for (t = 0; t < 16; t++) |
{ |
x[t] = SWAP (*words); |
words++; |
} |
R( a, b, c, d, e, F1, K1, x[ 0] ); |
R( e, a, b, c, d, F1, K1, x[ 1] ); |
R( d, e, a, b, c, F1, K1, x[ 2] ); |
R( c, d, e, a, b, F1, K1, x[ 3] ); |
R( b, c, d, e, a, F1, K1, x[ 4] ); |
R( a, b, c, d, e, F1, K1, x[ 5] ); |
R( e, a, b, c, d, F1, K1, x[ 6] ); |
R( d, e, a, b, c, F1, K1, x[ 7] ); |
R( c, d, e, a, b, F1, K1, x[ 8] ); |
R( b, c, d, e, a, F1, K1, x[ 9] ); |
R( a, b, c, d, e, F1, K1, x[10] ); |
R( e, a, b, c, d, F1, K1, x[11] ); |
R( d, e, a, b, c, F1, K1, x[12] ); |
R( c, d, e, a, b, F1, K1, x[13] ); |
R( b, c, d, e, a, F1, K1, x[14] ); |
R( a, b, c, d, e, F1, K1, x[15] ); |
R( e, a, b, c, d, F1, K1, M(16) ); |
R( d, e, a, b, c, F1, K1, M(17) ); |
R( c, d, e, a, b, F1, K1, M(18) ); |
R( b, c, d, e, a, F1, K1, M(19) ); |
R( a, b, c, d, e, F2, K2, M(20) ); |
R( e, a, b, c, d, F2, K2, M(21) ); |
R( d, e, a, b, c, F2, K2, M(22) ); |
R( c, d, e, a, b, F2, K2, M(23) ); |
R( b, c, d, e, a, F2, K2, M(24) ); |
R( a, b, c, d, e, F2, K2, M(25) ); |
R( e, a, b, c, d, F2, K2, M(26) ); |
R( d, e, a, b, c, F2, K2, M(27) ); |
R( c, d, e, a, b, F2, K2, M(28) ); |
R( b, c, d, e, a, F2, K2, M(29) ); |
R( a, b, c, d, e, F2, K2, M(30) ); |
R( e, a, b, c, d, F2, K2, M(31) ); |
R( d, e, a, b, c, F2, K2, M(32) ); |
R( c, d, e, a, b, F2, K2, M(33) ); |
R( b, c, d, e, a, F2, K2, M(34) ); |
R( a, b, c, d, e, F2, K2, M(35) ); |
R( e, a, b, c, d, F2, K2, M(36) ); |
R( d, e, a, b, c, F2, K2, M(37) ); |
R( c, d, e, a, b, F2, K2, M(38) ); |
R( b, c, d, e, a, F2, K2, M(39) ); |
R( a, b, c, d, e, F3, K3, M(40) ); |
R( e, a, b, c, d, F3, K3, M(41) ); |
R( d, e, a, b, c, F3, K3, M(42) ); |
R( c, d, e, a, b, F3, K3, M(43) ); |
R( b, c, d, e, a, F3, K3, M(44) ); |
R( a, b, c, d, e, F3, K3, M(45) ); |
R( e, a, b, c, d, F3, K3, M(46) ); |
R( d, e, a, b, c, F3, K3, M(47) ); |
R( c, d, e, a, b, F3, K3, M(48) ); |
R( b, c, d, e, a, F3, K3, M(49) ); |
R( a, b, c, d, e, F3, K3, M(50) ); |
R( e, a, b, c, d, F3, K3, M(51) ); |
R( d, e, a, b, c, F3, K3, M(52) ); |
R( c, d, e, a, b, F3, K3, M(53) ); |
R( b, c, d, e, a, F3, K3, M(54) ); |
R( a, b, c, d, e, F3, K3, M(55) ); |
R( e, a, b, c, d, F3, K3, M(56) ); |
R( d, e, a, b, c, F3, K3, M(57) ); |
R( c, d, e, a, b, F3, K3, M(58) ); |
R( b, c, d, e, a, F3, K3, M(59) ); |
R( a, b, c, d, e, F4, K4, M(60) ); |
R( e, a, b, c, d, F4, K4, M(61) ); |
R( d, e, a, b, c, F4, K4, M(62) ); |
R( c, d, e, a, b, F4, K4, M(63) ); |
R( b, c, d, e, a, F4, K4, M(64) ); |
R( a, b, c, d, e, F4, K4, M(65) ); |
R( e, a, b, c, d, F4, K4, M(66) ); |
R( d, e, a, b, c, F4, K4, M(67) ); |
R( c, d, e, a, b, F4, K4, M(68) ); |
R( b, c, d, e, a, F4, K4, M(69) ); |
R( a, b, c, d, e, F4, K4, M(70) ); |
R( e, a, b, c, d, F4, K4, M(71) ); |
R( d, e, a, b, c, F4, K4, M(72) ); |
R( c, d, e, a, b, F4, K4, M(73) ); |
R( b, c, d, e, a, F4, K4, M(74) ); |
R( a, b, c, d, e, F4, K4, M(75) ); |
R( e, a, b, c, d, F4, K4, M(76) ); |
R( d, e, a, b, c, F4, K4, M(77) ); |
R( c, d, e, a, b, F4, K4, M(78) ); |
R( b, c, d, e, a, F4, K4, M(79) ); |
a = ctx->A += a; |
b = ctx->B += b; |
c = ctx->C += c; |
d = ctx->D += d; |
e = ctx->E += e; |
} |
} |
/contrib/toolchain/binutils/libiberty/sigsetmask.c |
---|
0,0 → 1,40 |
/* Version of sigsetmask.c |
Written by Steve Chamberlain (sac@cygnus.com). |
Contributed by Cygnus Support. |
This file is in the public doamin. */ |
/* |
@deftypefn Supplemental int sigsetmask (int @var{set}) |
Sets the signal mask to the one provided in @var{set} and returns |
the old mask (which, for libiberty's implementation, will always |
be the value @code{1}). |
@end deftypefn |
*/ |
#define _POSIX_SOURCE |
#include <ansidecl.h> |
/* Including <sys/types.h> seems to be needed by ISC. */ |
#include <sys/types.h> |
#include <signal.h> |
extern void abort (void) ATTRIBUTE_NORETURN; |
#ifdef SIG_SETMASK |
int |
sigsetmask (int set) |
{ |
sigset_t new_sig; |
sigset_t old_sig; |
sigemptyset (&new_sig); |
if (set != 0) { |
abort(); /* FIXME, we don't know how to translate old mask to new */ |
} |
sigprocmask(SIG_SETMASK, &new_sig, &old_sig); |
return 1; /* FIXME, we always return 1 as old value. */ |
} |
#endif |
/contrib/toolchain/binutils/libiberty/simple-object-coff.c |
---|
0,0 → 1,804 |
/* simple-object-coff.c -- routines to manipulate COFF object files. |
Copyright 2010 Free Software Foundation, Inc. |
Written by Ian Lance Taylor, Google. |
This program is free software; you can redistribute it and/or modify it |
under the terms of the GNU General Public License as published by the |
Free Software Foundation; either version 2, or (at your option) any |
later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
#include "config.h" |
#include "libiberty.h" |
#include "simple-object.h" |
#include <errno.h> |
#include <stddef.h> |
#ifdef HAVE_STDLIB_H |
#include <stdlib.h> |
#endif |
#ifdef HAVE_STDINT_H |
#include <stdint.h> |
#endif |
#ifdef HAVE_STRING_H |
#include <string.h> |
#endif |
#ifdef HAVE_INTTYPES_H |
#include <inttypes.h> |
#endif |
#include "simple-object-common.h" |
/* COFF structures and constants. */ |
/* COFF file header. */ |
struct external_filehdr |
{ |
unsigned char f_magic[2]; /* magic number */ |
unsigned char f_nscns[2]; /* number of sections */ |
unsigned char f_timdat[4]; /* time & date stamp */ |
unsigned char f_symptr[4]; /* file pointer to symtab */ |
unsigned char f_nsyms[4]; /* number of symtab entries */ |
unsigned char f_opthdr[2]; /* sizeof(optional hdr) */ |
unsigned char f_flags[2]; /* flags */ |
}; |
/* Bits for filehdr f_flags field. */ |
#define F_EXEC (0x0002) |
#define IMAGE_FILE_SYSTEM (0x1000) |
#define IMAGE_FILE_DLL (0x2000) |
/* COFF section header. */ |
struct external_scnhdr |
{ |
unsigned char s_name[8]; /* section name */ |
unsigned char s_paddr[4]; /* physical address, aliased s_nlib */ |
unsigned char s_vaddr[4]; /* virtual address */ |
unsigned char s_size[4]; /* section size */ |
unsigned char s_scnptr[4]; /* file ptr to raw data for section */ |
unsigned char s_relptr[4]; /* file ptr to relocation */ |
unsigned char s_lnnoptr[4]; /* file ptr to line numbers */ |
unsigned char s_nreloc[2]; /* number of relocation entries */ |
unsigned char s_nlnno[2]; /* number of line number entries */ |
unsigned char s_flags[4]; /* flags */ |
}; |
/* The length of the s_name field in struct external_scnhdr. */ |
#define SCNNMLEN (8) |
/* Bits for scnhdr s_flags field. This includes some bits defined |
only for PE. This may need to be moved into coff_magic. */ |
#define STYP_DATA (1 << 6) |
#define IMAGE_SCN_MEM_DISCARDABLE (1 << 25) |
#define IMAGE_SCN_MEM_SHARED (1 << 28) |
#define IMAGE_SCN_MEM_READ (1 << 30) |
#define IMAGE_SCN_ALIGN_POWER_BIT_POS 20 |
#define IMAGE_SCN_ALIGN_POWER_CONST(val) \ |
(((val) + 1) << IMAGE_SCN_ALIGN_POWER_BIT_POS) |
/* COFF symbol table entry. */ |
#define E_SYMNMLEN 8 /* # characters in a symbol name */ |
struct external_syment |
{ |
union |
{ |
unsigned char e_name[E_SYMNMLEN]; |
struct |
{ |
unsigned char e_zeroes[4]; |
unsigned char e_offset[4]; |
} e; |
} e; |
unsigned char e_value[4]; |
unsigned char e_scnum[2]; |
unsigned char e_type[2]; |
unsigned char e_sclass[1]; |
unsigned char e_numaux[1]; |
}; |
/* Length allowed for filename in aux sym format 4. */ |
#define E_FILNMLEN 18 |
/* Omits x_sym and other unused variants. */ |
union external_auxent |
{ |
/* Aux sym format 4: file. */ |
union |
{ |
char x_fname[E_FILNMLEN]; |
struct |
{ |
unsigned char x_zeroes[4]; |
unsigned char x_offset[4]; |
} x_n; |
} x_file; |
/* Aux sym format 5: section. */ |
struct |
{ |
unsigned char x_scnlen[4]; /* section length */ |
unsigned char x_nreloc[2]; /* # relocation entries */ |
unsigned char x_nlinno[2]; /* # line numbers */ |
unsigned char x_checksum[4]; /* section COMDAT checksum */ |
unsigned char x_associated[2]; /* COMDAT assoc section index */ |
unsigned char x_comdat[1]; /* COMDAT selection number */ |
} x_scn; |
}; |
/* Symbol-related constants. */ |
#define IMAGE_SYM_DEBUG (-2) |
#define IMAGE_SYM_TYPE_NULL (0) |
#define IMAGE_SYM_DTYPE_NULL (0) |
#define IMAGE_SYM_CLASS_STATIC (3) |
#define IMAGE_SYM_CLASS_FILE (103) |
#define IMAGE_SYM_TYPE \ |
((IMAGE_SYM_DTYPE_NULL << 4) | IMAGE_SYM_TYPE_NULL) |
/* Private data for an simple_object_read. */ |
struct simple_object_coff_read |
{ |
/* Magic number. */ |
unsigned short magic; |
/* Whether the file is big-endian. */ |
unsigned char is_big_endian; |
/* Number of sections. */ |
unsigned short nscns; |
/* File offset of symbol table. */ |
off_t symptr; |
/* Number of symbol table entries. */ |
unsigned int nsyms; |
/* Flags. */ |
unsigned short flags; |
/* Offset of section headers in file. */ |
off_t scnhdr_offset; |
}; |
/* Private data for an simple_object_attributes. */ |
struct simple_object_coff_attributes |
{ |
/* Magic number. */ |
unsigned short magic; |
/* Whether the file is big-endian. */ |
unsigned char is_big_endian; |
/* Flags. */ |
unsigned short flags; |
}; |
/* There is no magic number which indicates a COFF file as opposed to |
any other sort of file. Instead, each COFF file starts with a |
two-byte magic number which also indicates the type of the target. |
This struct holds a magic number as well as characteristics of that |
COFF format. */ |
struct coff_magic_struct |
{ |
/* Magic number. */ |
unsigned short magic; |
/* Whether this magic number is for a big-endian file. */ |
unsigned char is_big_endian; |
/* Flag bits, in the f_flags fields, which indicates that this file |
is not a relocatable object file. There is no flag which |
specifically indicates a relocatable object file, it is only |
implied by the absence of these flags. */ |
unsigned short non_object_flags; |
}; |
/* This is a list of the COFF magic numbers which we recognize, namely |
the ones used on Windows. More can be added as needed. */ |
static const struct coff_magic_struct coff_magic[] = |
{ |
/* i386. */ |
{ 0x14c, 0, F_EXEC | IMAGE_FILE_SYSTEM | IMAGE_FILE_DLL }, |
/* x86_64. */ |
{ 0x8664, 0, F_EXEC | IMAGE_FILE_SYSTEM | IMAGE_FILE_DLL } |
}; |
/* See if we have a COFF file. */ |
static void * |
simple_object_coff_match (unsigned char header[SIMPLE_OBJECT_MATCH_HEADER_LEN], |
int descriptor, off_t offset, |
const char *segment_name ATTRIBUTE_UNUSED, |
const char **errmsg, int *err) |
{ |
size_t c; |
unsigned short magic_big; |
unsigned short magic_little; |
unsigned short magic; |
size_t i; |
int is_big_endian; |
unsigned short (*fetch_16) (const unsigned char *); |
unsigned int (*fetch_32) (const unsigned char *); |
unsigned char hdrbuf[sizeof (struct external_filehdr)]; |
unsigned short flags; |
struct simple_object_coff_read *ocr; |
c = sizeof (coff_magic) / sizeof (coff_magic[0]); |
magic_big = simple_object_fetch_big_16 (header); |
magic_little = simple_object_fetch_little_16 (header); |
for (i = 0; i < c; ++i) |
{ |
if (coff_magic[i].is_big_endian |
? coff_magic[i].magic == magic_big |
: coff_magic[i].magic == magic_little) |
break; |
} |
if (i >= c) |
{ |
*errmsg = NULL; |
*err = 0; |
return NULL; |
} |
is_big_endian = coff_magic[i].is_big_endian; |
magic = is_big_endian ? magic_big : magic_little; |
fetch_16 = (is_big_endian |
? simple_object_fetch_big_16 |
: simple_object_fetch_little_16); |
fetch_32 = (is_big_endian |
? simple_object_fetch_big_32 |
: simple_object_fetch_little_32); |
if (!simple_object_internal_read (descriptor, offset, hdrbuf, sizeof hdrbuf, |
errmsg, err)) |
return NULL; |
flags = fetch_16 (hdrbuf + offsetof (struct external_filehdr, f_flags)); |
if ((flags & coff_magic[i].non_object_flags) != 0) |
{ |
*errmsg = "not relocatable object file"; |
*err = 0; |
return NULL; |
} |
ocr = XNEW (struct simple_object_coff_read); |
ocr->magic = magic; |
ocr->is_big_endian = is_big_endian; |
ocr->nscns = fetch_16 (hdrbuf + offsetof (struct external_filehdr, f_nscns)); |
ocr->symptr = fetch_32 (hdrbuf |
+ offsetof (struct external_filehdr, f_symptr)); |
ocr->nsyms = fetch_32 (hdrbuf + offsetof (struct external_filehdr, f_nsyms)); |
ocr->flags = flags; |
ocr->scnhdr_offset = (sizeof (struct external_filehdr) |
+ fetch_16 (hdrbuf + offsetof (struct external_filehdr, |
f_opthdr))); |
return (void *) ocr; |
} |
/* Read the string table in a COFF file. */ |
static char * |
simple_object_coff_read_strtab (simple_object_read *sobj, size_t *strtab_size, |
const char **errmsg, int *err) |
{ |
struct simple_object_coff_read *ocr = |
(struct simple_object_coff_read *) sobj->data; |
off_t strtab_offset; |
unsigned char strsizebuf[4]; |
size_t strsize; |
char *strtab; |
strtab_offset = sobj->offset + ocr->symptr |
+ ocr->nsyms * sizeof (struct external_syment); |
if (!simple_object_internal_read (sobj->descriptor, strtab_offset, |
strsizebuf, 4, errmsg, err)) |
return NULL; |
strsize = (ocr->is_big_endian |
? simple_object_fetch_big_32 (strsizebuf) |
: simple_object_fetch_little_32 (strsizebuf)); |
strtab = XNEWVEC (char, strsize); |
if (!simple_object_internal_read (sobj->descriptor, strtab_offset, |
(unsigned char *) strtab, strsize, errmsg, |
err)) |
{ |
XDELETEVEC (strtab); |
return NULL; |
} |
*strtab_size = strsize; |
return strtab; |
} |
/* Find all sections in a COFF file. */ |
static const char * |
simple_object_coff_find_sections (simple_object_read *sobj, |
int (*pfn) (void *, const char *, |
off_t offset, off_t length), |
void *data, |
int *err) |
{ |
struct simple_object_coff_read *ocr = |
(struct simple_object_coff_read *) sobj->data; |
size_t scnhdr_size; |
unsigned char *scnbuf; |
const char *errmsg; |
unsigned int (*fetch_32) (const unsigned char *); |
unsigned int nscns; |
char *strtab; |
size_t strtab_size; |
unsigned int i; |
scnhdr_size = sizeof (struct external_scnhdr); |
scnbuf = XNEWVEC (unsigned char, scnhdr_size * ocr->nscns); |
if (!simple_object_internal_read (sobj->descriptor, |
sobj->offset + ocr->scnhdr_offset, |
scnbuf, scnhdr_size * ocr->nscns, &errmsg, |
err)) |
{ |
XDELETEVEC (scnbuf); |
return errmsg; |
} |
fetch_32 = (ocr->is_big_endian |
? simple_object_fetch_big_32 |
: simple_object_fetch_little_32); |
nscns = ocr->nscns; |
strtab = NULL; |
strtab_size = 0; |
for (i = 0; i < nscns; ++i) |
{ |
unsigned char *scnhdr; |
unsigned char *scnname; |
char namebuf[SCNNMLEN + 1]; |
char *name; |
off_t scnptr; |
unsigned int size; |
scnhdr = scnbuf + i * scnhdr_size; |
scnname = scnhdr + offsetof (struct external_scnhdr, s_name); |
memcpy (namebuf, scnname, SCNNMLEN); |
namebuf[SCNNMLEN] = '\0'; |
name = &namebuf[0]; |
if (namebuf[0] == '/') |
{ |
size_t strindex; |
char *end; |
strindex = strtol (namebuf + 1, &end, 10); |
if (*end == '\0') |
{ |
/* The real section name is found in the string |
table. */ |
if (strtab == NULL) |
{ |
strtab = simple_object_coff_read_strtab (sobj, |
&strtab_size, |
&errmsg, err); |
if (strtab == NULL) |
{ |
XDELETEVEC (scnbuf); |
return errmsg; |
} |
} |
if (strindex < 4 || strindex >= strtab_size) |
{ |
XDELETEVEC (strtab); |
XDELETEVEC (scnbuf); |
*err = 0; |
return "section string index out of range"; |
} |
name = strtab + strindex; |
} |
} |
scnptr = fetch_32 (scnhdr + offsetof (struct external_scnhdr, s_scnptr)); |
size = fetch_32 (scnhdr + offsetof (struct external_scnhdr, s_size)); |
if (!(*pfn) (data, name, scnptr, size)) |
break; |
} |
if (strtab != NULL) |
XDELETEVEC (strtab); |
XDELETEVEC (scnbuf); |
return NULL; |
} |
/* Fetch the attributes for an simple_object_read. */ |
static void * |
simple_object_coff_fetch_attributes (simple_object_read *sobj, |
const char **errmsg ATTRIBUTE_UNUSED, |
int *err ATTRIBUTE_UNUSED) |
{ |
struct simple_object_coff_read *ocr = |
(struct simple_object_coff_read *) sobj->data; |
struct simple_object_coff_attributes *ret; |
ret = XNEW (struct simple_object_coff_attributes); |
ret->magic = ocr->magic; |
ret->is_big_endian = ocr->is_big_endian; |
ret->flags = ocr->flags; |
return ret; |
} |
/* Release the private data for an simple_object_read. */ |
static void |
simple_object_coff_release_read (void *data) |
{ |
XDELETE (data); |
} |
/* Compare two attributes structures. */ |
static const char * |
simple_object_coff_attributes_merge (void *todata, void *fromdata, int *err) |
{ |
struct simple_object_coff_attributes *to = |
(struct simple_object_coff_attributes *) todata; |
struct simple_object_coff_attributes *from = |
(struct simple_object_coff_attributes *) fromdata; |
if (to->magic != from->magic || to->is_big_endian != from->is_big_endian) |
{ |
*err = 0; |
return "COFF object format mismatch"; |
} |
return NULL; |
} |
/* Release the private data for an attributes structure. */ |
static void |
simple_object_coff_release_attributes (void *data) |
{ |
XDELETE (data); |
} |
/* Prepare to write out a file. */ |
static void * |
simple_object_coff_start_write (void *attributes_data, |
const char **errmsg ATTRIBUTE_UNUSED, |
int *err ATTRIBUTE_UNUSED) |
{ |
struct simple_object_coff_attributes *attrs = |
(struct simple_object_coff_attributes *) attributes_data; |
struct simple_object_coff_attributes *ret; |
/* We're just going to record the attributes, but we need to make a |
copy because the user may delete them. */ |
ret = XNEW (struct simple_object_coff_attributes); |
*ret = *attrs; |
return ret; |
} |
/* Write out a COFF filehdr. */ |
static int |
simple_object_coff_write_filehdr (simple_object_write *sobj, int descriptor, |
unsigned int nscns, size_t symtab_offset, |
unsigned int nsyms, const char **errmsg, |
int *err) |
{ |
struct simple_object_coff_attributes *attrs = |
(struct simple_object_coff_attributes *) sobj->data; |
unsigned char hdrbuf[sizeof (struct external_filehdr)]; |
unsigned char *hdr; |
void (*set_16) (unsigned char *, unsigned short); |
void (*set_32) (unsigned char *, unsigned int); |
hdr = &hdrbuf[0]; |
set_16 = (attrs->is_big_endian |
? simple_object_set_big_16 |
: simple_object_set_little_16); |
set_32 = (attrs->is_big_endian |
? simple_object_set_big_32 |
: simple_object_set_little_32); |
memset (hdr, 0, sizeof (struct external_filehdr)); |
set_16 (hdr + offsetof (struct external_filehdr, f_magic), attrs->magic); |
set_16 (hdr + offsetof (struct external_filehdr, f_nscns), nscns); |
/* f_timdat left as zero. */ |
set_32 (hdr + offsetof (struct external_filehdr, f_symptr), symtab_offset); |
set_32 (hdr + offsetof (struct external_filehdr, f_nsyms), nsyms); |
/* f_opthdr left as zero. */ |
set_16 (hdr + offsetof (struct external_filehdr, f_flags), attrs->flags); |
return simple_object_internal_write (descriptor, 0, hdrbuf, |
sizeof (struct external_filehdr), |
errmsg, err); |
} |
/* Write out a COFF section header. */ |
static int |
simple_object_coff_write_scnhdr (simple_object_write *sobj, int descriptor, |
const char *name, size_t *name_offset, |
off_t scnhdr_offset, size_t scnsize, |
off_t offset, unsigned int align, |
const char **errmsg, int *err) |
{ |
struct simple_object_coff_attributes *attrs = |
(struct simple_object_coff_attributes *) sobj->data; |
void (*set_32) (unsigned char *, unsigned int); |
unsigned char hdrbuf[sizeof (struct external_scnhdr)]; |
unsigned char *hdr; |
size_t namelen; |
unsigned int flags; |
set_32 = (attrs->is_big_endian |
? simple_object_set_big_32 |
: simple_object_set_little_32); |
memset (hdrbuf, 0, sizeof hdrbuf); |
hdr = &hdrbuf[0]; |
namelen = strlen (name); |
if (namelen <= SCNNMLEN) |
strncpy ((char *) hdr + offsetof (struct external_scnhdr, s_name), name, |
SCNNMLEN); |
else |
{ |
snprintf ((char *) hdr + offsetof (struct external_scnhdr, s_name), |
SCNNMLEN, "/%lu", (unsigned long) *name_offset); |
*name_offset += namelen + 1; |
} |
/* s_paddr left as zero. */ |
/* s_vaddr left as zero. */ |
set_32 (hdr + offsetof (struct external_scnhdr, s_size), scnsize); |
set_32 (hdr + offsetof (struct external_scnhdr, s_scnptr), offset); |
/* s_relptr left as zero. */ |
/* s_lnnoptr left as zero. */ |
/* s_nreloc left as zero. */ |
/* s_nlnno left as zero. */ |
flags = (STYP_DATA | IMAGE_SCN_MEM_DISCARDABLE | IMAGE_SCN_MEM_SHARED |
| IMAGE_SCN_MEM_READ); |
/* PE can represent alignment up to 13. */ |
if (align > 13) |
align = 13; |
flags |= IMAGE_SCN_ALIGN_POWER_CONST(align); |
set_32 (hdr + offsetof (struct external_scnhdr, s_flags), flags); |
return simple_object_internal_write (descriptor, scnhdr_offset, hdrbuf, |
sizeof (struct external_scnhdr), |
errmsg, err); |
} |
/* Write out a complete COFF file. */ |
static const char * |
simple_object_coff_write_to_file (simple_object_write *sobj, int descriptor, |
int *err) |
{ |
struct simple_object_coff_attributes *attrs = |
(struct simple_object_coff_attributes *) sobj->data; |
unsigned int nscns, secnum; |
simple_object_write_section *section; |
off_t scnhdr_offset; |
size_t symtab_offset; |
off_t secsym_offset; |
unsigned int nsyms; |
size_t offset; |
size_t name_offset; |
const char *errmsg; |
unsigned char strsizebuf[4]; |
/* The interface doesn't give us access to the name of the input file |
yet. We want to use its basename for the FILE symbol. This is |
what 'gas' uses when told to assemble from stdin. */ |
const char *source_filename = "fake"; |
size_t sflen; |
union |
{ |
struct external_syment sym; |
union external_auxent aux; |
} syms[2]; |
void (*set_16) (unsigned char *, unsigned short); |
void (*set_32) (unsigned char *, unsigned int); |
set_16 = (attrs->is_big_endian |
? simple_object_set_big_16 |
: simple_object_set_little_16); |
set_32 = (attrs->is_big_endian |
? simple_object_set_big_32 |
: simple_object_set_little_32); |
nscns = 0; |
for (section = sobj->sections; section != NULL; section = section->next) |
++nscns; |
scnhdr_offset = sizeof (struct external_filehdr); |
offset = scnhdr_offset + nscns * sizeof (struct external_scnhdr); |
name_offset = 4; |
for (section = sobj->sections; section != NULL; section = section->next) |
{ |
size_t mask; |
size_t new_offset; |
size_t scnsize; |
struct simple_object_write_section_buffer *buffer; |
mask = (1U << section->align) - 1; |
new_offset = offset & mask; |
new_offset &= ~ mask; |
while (new_offset > offset) |
{ |
unsigned char zeroes[16]; |
size_t write; |
memset (zeroes, 0, sizeof zeroes); |
write = new_offset - offset; |
if (write > sizeof zeroes) |
write = sizeof zeroes; |
if (!simple_object_internal_write (descriptor, offset, zeroes, write, |
&errmsg, err)) |
return errmsg; |
} |
scnsize = 0; |
for (buffer = section->buffers; buffer != NULL; buffer = buffer->next) |
{ |
if (!simple_object_internal_write (descriptor, offset + scnsize, |
((const unsigned char *) |
buffer->buffer), |
buffer->size, &errmsg, err)) |
return errmsg; |
scnsize += buffer->size; |
} |
if (!simple_object_coff_write_scnhdr (sobj, descriptor, section->name, |
&name_offset, scnhdr_offset, |
scnsize, offset, section->align, |
&errmsg, err)) |
return errmsg; |
scnhdr_offset += sizeof (struct external_scnhdr); |
offset += scnsize; |
} |
/* Symbol table is always half-word aligned. */ |
offset += (offset & 1); |
/* There is a file symbol and a section symbol per section, |
and each of these has a single auxiliary symbol following. */ |
nsyms = 2 * (nscns + 1); |
symtab_offset = offset; |
/* Advance across space reserved for symbol table to locate |
start of string table. */ |
offset += nsyms * sizeof (struct external_syment); |
/* Write out file symbol. */ |
memset (&syms[0], 0, sizeof (syms)); |
strcpy ((char *)&syms[0].sym.e.e_name[0], ".file"); |
set_16 (&syms[0].sym.e_scnum[0], IMAGE_SYM_DEBUG); |
set_16 (&syms[0].sym.e_type[0], IMAGE_SYM_TYPE); |
syms[0].sym.e_sclass[0] = IMAGE_SYM_CLASS_FILE; |
syms[0].sym.e_numaux[0] = 1; |
/* The name need not be nul-terminated if it fits into the x_fname field |
directly, but must be if it has to be placed into the string table. */ |
sflen = strlen (source_filename); |
if (sflen <= E_FILNMLEN) |
memcpy (&syms[1].aux.x_file.x_fname[0], source_filename, sflen); |
else |
{ |
set_32 (&syms[1].aux.x_file.x_n.x_offset[0], name_offset); |
if (!simple_object_internal_write (descriptor, offset + name_offset, |
((const unsigned char *) |
source_filename), |
sflen + 1, &errmsg, err)) |
return errmsg; |
name_offset += strlen (source_filename) + 1; |
} |
if (!simple_object_internal_write (descriptor, symtab_offset, |
(const unsigned char *) &syms[0], |
sizeof (syms), &errmsg, err)) |
return errmsg; |
/* Write the string table length, followed by the strings and section |
symbols in step with each other. */ |
set_32 (strsizebuf, name_offset); |
if (!simple_object_internal_write (descriptor, offset, strsizebuf, 4, |
&errmsg, err)) |
return errmsg; |
name_offset = 4; |
secsym_offset = symtab_offset + sizeof (syms); |
memset (&syms[0], 0, sizeof (syms)); |
set_16 (&syms[0].sym.e_type[0], IMAGE_SYM_TYPE); |
syms[0].sym.e_sclass[0] = IMAGE_SYM_CLASS_STATIC; |
syms[0].sym.e_numaux[0] = 1; |
secnum = 1; |
for (section = sobj->sections; section != NULL; section = section->next) |
{ |
size_t namelen; |
size_t scnsize; |
struct simple_object_write_section_buffer *buffer; |
namelen = strlen (section->name); |
set_16 (&syms[0].sym.e_scnum[0], secnum++); |
scnsize = 0; |
for (buffer = section->buffers; buffer != NULL; buffer = buffer->next) |
scnsize += buffer->size; |
set_32 (&syms[1].aux.x_scn.x_scnlen[0], scnsize); |
if (namelen > SCNNMLEN) |
{ |
set_32 (&syms[0].sym.e.e.e_zeroes[0], 0); |
set_32 (&syms[0].sym.e.e.e_offset[0], name_offset); |
if (!simple_object_internal_write (descriptor, offset + name_offset, |
((const unsigned char *) |
section->name), |
namelen + 1, &errmsg, err)) |
return errmsg; |
name_offset += namelen + 1; |
} |
else |
{ |
memcpy (&syms[0].sym.e.e_name[0], section->name, |
strlen (section->name)); |
memset (&syms[0].sym.e.e_name[strlen (section->name)], 0, |
E_SYMNMLEN - strlen (section->name)); |
} |
if (!simple_object_internal_write (descriptor, secsym_offset, |
(const unsigned char *) &syms[0], |
sizeof (syms), &errmsg, err)) |
return errmsg; |
secsym_offset += sizeof (syms); |
} |
if (!simple_object_coff_write_filehdr (sobj, descriptor, nscns, |
symtab_offset, nsyms, &errmsg, err)) |
return errmsg; |
return NULL; |
} |
/* Release the private data for an simple_object_write structure. */ |
static void |
simple_object_coff_release_write (void *data) |
{ |
XDELETE (data); |
} |
/* The COFF functions. */ |
const struct simple_object_functions simple_object_coff_functions = |
{ |
simple_object_coff_match, |
simple_object_coff_find_sections, |
simple_object_coff_fetch_attributes, |
simple_object_coff_release_read, |
simple_object_coff_attributes_merge, |
simple_object_coff_release_attributes, |
simple_object_coff_start_write, |
simple_object_coff_write_to_file, |
simple_object_coff_release_write |
}; |
/contrib/toolchain/binutils/libiberty/simple-object-common.h |
---|
0,0 → 1,356 |
/* simple-object-common.h -- common structs for object file manipulation. |
Copyright (C) 2010 Free Software Foundation, Inc. |
This file is part of the libiberty library. |
Libiberty is free software; you can redistribute it and/or |
modify it under the terms of the GNU Library General Public |
License as published by the Free Software Foundation; either |
version 2 of the License, or (at your option) any later version. |
Libiberty is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
Library General Public License for more details. |
You should have received a copy of the GNU Library General Public |
License along with libiberty; see the file COPYING.LIB. If not, |
write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
/* Forward reference. */ |
struct simple_object_functions; |
/* An object file opened for reading. */ |
struct simple_object_read_struct |
{ |
/* The file descriptor. */ |
int descriptor; |
/* The offset within the file. */ |
off_t offset; |
/* The functions which do the actual work. */ |
const struct simple_object_functions *functions; |
/* Private data for the object file format. */ |
void *data; |
}; |
/* Object file attributes. */ |
struct simple_object_attributes_struct |
{ |
/* The functions which do the actual work. */ |
const struct simple_object_functions *functions; |
/* Private data for the object file format. */ |
void *data; |
}; |
/* An object file being created. */ |
struct simple_object_write_struct |
{ |
/* The functions which do the actual work. */ |
const struct simple_object_functions *functions; |
/* The segment_name argument from the user. */ |
char *segment_name; |
/* The start of the list of sections. */ |
simple_object_write_section *sections; |
/* The last entry in the list of sections. */ |
simple_object_write_section *last_section; |
/* Private data for the object file format. */ |
void *data; |
}; |
/* A section in an object file being created. */ |
struct simple_object_write_section_struct |
{ |
/* Next in the list of sections attached to an |
simple_object_write. */ |
simple_object_write_section *next; |
/* The name of this section. */ |
char *name; |
/* The required alignment. */ |
unsigned int align; |
/* The first data attached to this section. */ |
struct simple_object_write_section_buffer *buffers; |
/* The last data attached to this section. */ |
struct simple_object_write_section_buffer *last_buffer; |
}; |
/* Data attached to a section. */ |
struct simple_object_write_section_buffer |
{ |
/* The next data for this section. */ |
struct simple_object_write_section_buffer *next; |
/* The size of the buffer. */ |
size_t size; |
/* The actual bytes. */ |
const void *buffer; |
/* A buffer to free, or NULL. */ |
void *free_buffer; |
}; |
/* The number of bytes we read from the start of the file to pass to |
the match function. */ |
#define SIMPLE_OBJECT_MATCH_HEADER_LEN (16) |
/* Format-specific object file functions. */ |
struct simple_object_functions |
{ |
/* If this file matches these functions, return a new value for the |
private data for an simple_object_read. HEADER is the first 16 |
bytes of the file. DESCRIPTOR, OFFSET, SEGMENT_NAME, ERRMSG, and |
ERR are as for simple_object_open_read. If this file does not |
match, this function should return NULL with *ERRMSG set to |
NULL. */ |
void *(*match) (unsigned char header[SIMPLE_OBJECT_MATCH_HEADER_LEN], |
int descriptor, off_t offset, const char *segment_name, |
const char **errmsg, int *err); |
/* Implement simple_object_find_sections. */ |
const char *(*find_sections) (simple_object_read *, |
int (*pfn) (void *, const char *, |
off_t offset, off_t length), |
void *data, |
int *err); |
/* Return the private data for the attributes for SOBJ. */ |
void *(*fetch_attributes) (simple_object_read *sobj, const char **errmsg, |
int *err); |
/* Release the private data for an simple_object_read. */ |
void (*release_read) (void *); |
/* Merge the private data for the attributes of two files. If they |
could be linked together, return NULL. Otherwise return an error |
message. */ |
const char *(*attributes_merge) (void *, void *, int *err); |
/* Release the private data for an simple_object_attributes. */ |
void (*release_attributes) (void *); |
/* Start creating an object file. */ |
void *(*start_write) (void *attributes_data, const char **errmsg, |
int *err); |
/* Write the complete object file. */ |
const char *(*write_to_file) (simple_object_write *sobj, int descriptor, |
int *err); |
/* Release the private data for an simple_object_write. */ |
void (*release_write) (void *); |
}; |
/* The known object file formats. */ |
extern const struct simple_object_functions simple_object_coff_functions; |
extern const struct simple_object_functions simple_object_elf_functions; |
extern const struct simple_object_functions simple_object_mach_o_functions; |
extern const struct simple_object_functions simple_object_xcoff_functions; |
/* Read SIZE bytes from DESCRIPTOR at file offset OFFSET into BUFFER. |
Return non-zero on success. On failure return 0 and set *ERRMSG |
and *ERR. */ |
extern int |
simple_object_internal_read (int descriptor, off_t offset, |
unsigned char *buffer, size_t size, |
const char **errmsg, int *err); |
/* Write SIZE bytes from BUFFER to DESCRIPTOR at file offset OFFSET. |
Return non-zero on success. On failure return 0 and set *ERRMSG |
and *ERR. */ |
extern int |
simple_object_internal_write (int descriptor, off_t offset, |
const unsigned char *buffer, size_t size, |
const char **errmsg, int *err); |
/* Define ulong_type as an unsigned 64-bit type if available. |
Otherwise just make it unsigned long. */ |
#ifdef UNSIGNED_64BIT_TYPE |
__extension__ typedef UNSIGNED_64BIT_TYPE ulong_type; |
#else |
typedef unsigned long ulong_type; |
#endif |
/* Fetch a big-endian 16-bit value. */ |
static inline unsigned short |
simple_object_fetch_big_16 (const unsigned char *buf) |
{ |
return ((unsigned short) buf[0] << 8) | (unsigned short) buf[1]; |
} |
/* Fetch a little-endian 16-bit value. */ |
static inline unsigned short |
simple_object_fetch_little_16 (const unsigned char *buf) |
{ |
return ((unsigned short) buf[1] << 8) | (unsigned short) buf[0]; |
} |
/* Fetch a big-endian 32-bit value. */ |
static inline unsigned int |
simple_object_fetch_big_32 (const unsigned char *buf) |
{ |
return (((unsigned int) buf[0] << 24) |
| ((unsigned int) buf[1] << 16) |
| ((unsigned int) buf[2] << 8) |
| (unsigned int) buf[3]); |
} |
/* Fetch a little-endian 32-bit value. */ |
static inline unsigned int |
simple_object_fetch_little_32 (const unsigned char *buf) |
{ |
return (((unsigned int) buf[3] << 24) |
| ((unsigned int) buf[2] << 16) |
| ((unsigned int) buf[1] << 8) |
| (unsigned int) buf[0]); |
} |
/* Fetch a big-endian 32-bit value as a ulong_type. */ |
static inline ulong_type |
simple_object_fetch_big_32_ulong (const unsigned char *buf) |
{ |
return (ulong_type) simple_object_fetch_big_32 (buf); |
} |
/* Fetch a little-endian 32-bit value as a ulong_type. */ |
static inline ulong_type |
simple_object_fetch_little_32_ulong (const unsigned char *buf) |
{ |
return (ulong_type) simple_object_fetch_little_32 (buf); |
} |
#ifdef UNSIGNED_64BIT_TYPE |
/* Fetch a big-endian 64-bit value. */ |
static inline ulong_type |
simple_object_fetch_big_64 (const unsigned char *buf) |
{ |
return (((ulong_type) buf[0] << 56) |
| ((ulong_type) buf[1] << 48) |
| ((ulong_type) buf[2] << 40) |
| ((ulong_type) buf[3] << 32) |
| ((ulong_type) buf[4] << 24) |
| ((ulong_type) buf[5] << 16) |
| ((ulong_type) buf[6] << 8) |
| (ulong_type) buf[7]); |
} |
/* Fetch a little-endian 64-bit value. */ |
static inline ulong_type |
simple_object_fetch_little_64 (const unsigned char *buf) |
{ |
return (((ulong_type) buf[7] << 56) |
| ((ulong_type) buf[6] << 48) |
| ((ulong_type) buf[5] << 40) |
| ((ulong_type) buf[4] << 32) |
| ((ulong_type) buf[3] << 24) |
| ((ulong_type) buf[2] << 16) |
| ((ulong_type) buf[1] << 8) |
| (ulong_type) buf[0]); |
} |
#endif |
/* Store a big-endian 16-bit value. */ |
static inline void |
simple_object_set_big_16 (unsigned char *buf, unsigned short val) |
{ |
buf[0] = (val >> 8) & 0xff; |
buf[1] = val & 0xff; |
} |
/* Store a little-endian 16-bit value. */ |
static inline void |
simple_object_set_little_16 (unsigned char *buf, unsigned short val) |
{ |
buf[1] = (val >> 8) & 0xff; |
buf[0] = val & 0xff; |
} |
/* Store a big-endian 32-bit value. */ |
static inline void |
simple_object_set_big_32 (unsigned char *buf, unsigned int val) |
{ |
buf[0] = (val >> 24) & 0xff; |
buf[1] = (val >> 16) & 0xff; |
buf[2] = (val >> 8) & 0xff; |
buf[3] = val & 0xff; |
} |
/* Store a little-endian 32-bit value. */ |
static inline void |
simple_object_set_little_32 (unsigned char *buf, unsigned int val) |
{ |
buf[3] = (val >> 24) & 0xff; |
buf[2] = (val >> 16) & 0xff; |
buf[1] = (val >> 8) & 0xff; |
buf[0] = val & 0xff; |
} |
/* Store a big-endian 32-bit value coming in as a ulong_type. */ |
static inline void |
simple_object_set_big_32_ulong (unsigned char *buf, ulong_type val) |
{ |
simple_object_set_big_32 (buf, val); |
} |
/* Store a little-endian 32-bit value coming in as a ulong_type. */ |
static inline void |
simple_object_set_little_32_ulong (unsigned char *buf, ulong_type val) |
{ |
simple_object_set_little_32 (buf, val); |
} |
#ifdef UNSIGNED_64BIT_TYPE |
/* Store a big-endian 64-bit value. */ |
static inline void |
simple_object_set_big_64 (unsigned char *buf, ulong_type val) |
{ |
buf[0] = (val >> 56) & 0xff; |
buf[1] = (val >> 48) & 0xff; |
buf[2] = (val >> 40) & 0xff; |
buf[3] = (val >> 32) & 0xff; |
buf[4] = (val >> 24) & 0xff; |
buf[5] = (val >> 16) & 0xff; |
buf[6] = (val >> 8) & 0xff; |
buf[7] = val & 0xff; |
} |
/* Store a little-endian 64-bit value. */ |
static inline void |
simple_object_set_little_64 (unsigned char *buf, ulong_type val) |
{ |
buf[7] = (val >> 56) & 0xff; |
buf[6] = (val >> 48) & 0xff; |
buf[5] = (val >> 40) & 0xff; |
buf[4] = (val >> 32) & 0xff; |
buf[3] = (val >> 24) & 0xff; |
buf[2] = (val >> 16) & 0xff; |
buf[1] = (val >> 8) & 0xff; |
buf[0] = val & 0xff; |
} |
#endif |
/contrib/toolchain/binutils/libiberty/simple-object-elf.c |
---|
0,0 → 1,953 |
/* simple-object-elf.c -- routines to manipulate ELF object files. |
Copyright 2010 Free Software Foundation, Inc. |
Written by Ian Lance Taylor, Google. |
This program is free software; you can redistribute it and/or modify it |
under the terms of the GNU General Public License as published by the |
Free Software Foundation; either version 2, or (at your option) any |
later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
#include "config.h" |
#include "libiberty.h" |
#include "simple-object.h" |
#include <errno.h> |
#include <stddef.h> |
#ifdef HAVE_STDLIB_H |
#include <stdlib.h> |
#endif |
#ifdef HAVE_STDINT_H |
#include <stdint.h> |
#endif |
#ifdef HAVE_STRING_H |
#include <string.h> |
#endif |
#ifdef HAVE_INTTYPES_H |
#include <inttypes.h> |
#endif |
#include "simple-object-common.h" |
/* ELF structures and constants. */ |
/* 32-bit ELF file header. */ |
typedef struct { |
unsigned char e_ident[16]; /* ELF "magic number" */ |
unsigned char e_type[2]; /* Identifies object file type */ |
unsigned char e_machine[2]; /* Specifies required architecture */ |
unsigned char e_version[4]; /* Identifies object file version */ |
unsigned char e_entry[4]; /* Entry point virtual address */ |
unsigned char e_phoff[4]; /* Program header table file offset */ |
unsigned char e_shoff[4]; /* Section header table file offset */ |
unsigned char e_flags[4]; /* Processor-specific flags */ |
unsigned char e_ehsize[2]; /* ELF header size in bytes */ |
unsigned char e_phentsize[2]; /* Program header table entry size */ |
unsigned char e_phnum[2]; /* Program header table entry count */ |
unsigned char e_shentsize[2]; /* Section header table entry size */ |
unsigned char e_shnum[2]; /* Section header table entry count */ |
unsigned char e_shstrndx[2]; /* Section header string table index */ |
} Elf32_External_Ehdr; |
/* 64-bit ELF file header. */ |
typedef struct { |
unsigned char e_ident[16]; /* ELF "magic number" */ |
unsigned char e_type[2]; /* Identifies object file type */ |
unsigned char e_machine[2]; /* Specifies required architecture */ |
unsigned char e_version[4]; /* Identifies object file version */ |
unsigned char e_entry[8]; /* Entry point virtual address */ |
unsigned char e_phoff[8]; /* Program header table file offset */ |
unsigned char e_shoff[8]; /* Section header table file offset */ |
unsigned char e_flags[4]; /* Processor-specific flags */ |
unsigned char e_ehsize[2]; /* ELF header size in bytes */ |
unsigned char e_phentsize[2]; /* Program header table entry size */ |
unsigned char e_phnum[2]; /* Program header table entry count */ |
unsigned char e_shentsize[2]; /* Section header table entry size */ |
unsigned char e_shnum[2]; /* Section header table entry count */ |
unsigned char e_shstrndx[2]; /* Section header string table index */ |
} Elf64_External_Ehdr; |
/* Indexes and values in e_ident field of Ehdr. */ |
#define EI_MAG0 0 /* File identification byte 0 index */ |
#define ELFMAG0 0x7F /* Magic number byte 0 */ |
#define EI_MAG1 1 /* File identification byte 1 index */ |
#define ELFMAG1 'E' /* Magic number byte 1 */ |
#define EI_MAG2 2 /* File identification byte 2 index */ |
#define ELFMAG2 'L' /* Magic number byte 2 */ |
#define EI_MAG3 3 /* File identification byte 3 index */ |
#define ELFMAG3 'F' /* Magic number byte 3 */ |
#define EI_CLASS 4 /* File class */ |
#define ELFCLASSNONE 0 /* Invalid class */ |
#define ELFCLASS32 1 /* 32-bit objects */ |
#define ELFCLASS64 2 /* 64-bit objects */ |
#define EI_DATA 5 /* Data encoding */ |
#define ELFDATANONE 0 /* Invalid data encoding */ |
#define ELFDATA2LSB 1 /* 2's complement, little endian */ |
#define ELFDATA2MSB 2 /* 2's complement, big endian */ |
#define EI_VERSION 6 /* File version */ |
#define EV_CURRENT 1 /* Current version */ |
#define EI_OSABI 7 /* Operating System/ABI indication */ |
/* Values for e_type field of Ehdr. */ |
#define ET_REL 1 /* Relocatable file */ |
/* Values for e_machine field of Ehdr. */ |
#define EM_SPARC 2 /* SUN SPARC */ |
#define EM_SPARC32PLUS 18 /* Sun's "v8plus" */ |
/* Special section index values. */ |
#define SHN_LORESERVE 0xFF00 /* Begin range of reserved indices */ |
#define SHN_XINDEX 0xFFFF /* Section index is held elsewhere */ |
/* 32-bit ELF program header. */ |
typedef struct { |
unsigned char p_type[4]; /* Identifies program segment type */ |
unsigned char p_offset[4]; /* Segment file offset */ |
unsigned char p_vaddr[4]; /* Segment virtual address */ |
unsigned char p_paddr[4]; /* Segment physical address */ |
unsigned char p_filesz[4]; /* Segment size in file */ |
unsigned char p_memsz[4]; /* Segment size in memory */ |
unsigned char p_flags[4]; /* Segment flags */ |
unsigned char p_align[4]; /* Segment alignment, file & memory */ |
} Elf32_External_Phdr; |
/* 64-bit ELF program header. */ |
typedef struct { |
unsigned char p_type[4]; /* Identifies program segment type */ |
unsigned char p_flags[4]; /* Segment flags */ |
unsigned char p_offset[8]; /* Segment file offset */ |
unsigned char p_vaddr[8]; /* Segment virtual address */ |
unsigned char p_paddr[8]; /* Segment physical address */ |
unsigned char p_filesz[8]; /* Segment size in file */ |
unsigned char p_memsz[8]; /* Segment size in memory */ |
unsigned char p_align[8]; /* Segment alignment, file & memory */ |
} Elf64_External_Phdr; |
/* 32-bit ELF section header */ |
typedef struct { |
unsigned char sh_name[4]; /* Section name, index in string tbl */ |
unsigned char sh_type[4]; /* Type of section */ |
unsigned char sh_flags[4]; /* Miscellaneous section attributes */ |
unsigned char sh_addr[4]; /* Section virtual addr at execution */ |
unsigned char sh_offset[4]; /* Section file offset */ |
unsigned char sh_size[4]; /* Size of section in bytes */ |
unsigned char sh_link[4]; /* Index of another section */ |
unsigned char sh_info[4]; /* Additional section information */ |
unsigned char sh_addralign[4]; /* Section alignment */ |
unsigned char sh_entsize[4]; /* Entry size if section holds table */ |
} Elf32_External_Shdr; |
/* 64-bit ELF section header. */ |
typedef struct { |
unsigned char sh_name[4]; /* Section name, index in string tbl */ |
unsigned char sh_type[4]; /* Type of section */ |
unsigned char sh_flags[8]; /* Miscellaneous section attributes */ |
unsigned char sh_addr[8]; /* Section virtual addr at execution */ |
unsigned char sh_offset[8]; /* Section file offset */ |
unsigned char sh_size[8]; /* Size of section in bytes */ |
unsigned char sh_link[4]; /* Index of another section */ |
unsigned char sh_info[4]; /* Additional section information */ |
unsigned char sh_addralign[8]; /* Section alignment */ |
unsigned char sh_entsize[8]; /* Entry size if section holds table */ |
} Elf64_External_Shdr; |
/* Values for sh_type field. */ |
#define SHT_PROGBITS 1 /* Program data */ |
#define SHT_STRTAB 3 /* A string table */ |
/* Functions to fetch and store different ELF types, depending on the |
endianness and size. */ |
struct elf_type_functions |
{ |
unsigned short (*fetch_Elf_Half) (const unsigned char *); |
unsigned int (*fetch_Elf_Word) (const unsigned char *); |
ulong_type (*fetch_Elf_Addr) (const unsigned char *); |
void (*set_Elf_Half) (unsigned char *, unsigned short); |
void (*set_Elf_Word) (unsigned char *, unsigned int); |
void (*set_Elf_Addr) (unsigned char *, ulong_type); |
}; |
static const struct elf_type_functions elf_big_32_functions = |
{ |
simple_object_fetch_big_16, |
simple_object_fetch_big_32, |
simple_object_fetch_big_32_ulong, |
simple_object_set_big_16, |
simple_object_set_big_32, |
simple_object_set_big_32_ulong |
}; |
static const struct elf_type_functions elf_little_32_functions = |
{ |
simple_object_fetch_little_16, |
simple_object_fetch_little_32, |
simple_object_fetch_little_32_ulong, |
simple_object_set_little_16, |
simple_object_set_little_32, |
simple_object_set_little_32_ulong |
}; |
#ifdef UNSIGNED_64BIT_TYPE |
static const struct elf_type_functions elf_big_64_functions = |
{ |
simple_object_fetch_big_16, |
simple_object_fetch_big_32, |
simple_object_fetch_big_64, |
simple_object_set_big_16, |
simple_object_set_big_32, |
simple_object_set_big_64 |
}; |
static const struct elf_type_functions elf_little_64_functions = |
{ |
simple_object_fetch_little_16, |
simple_object_fetch_little_32, |
simple_object_fetch_little_64, |
simple_object_set_little_16, |
simple_object_set_little_32, |
simple_object_set_little_64 |
}; |
#endif |
/* Hideous macro to fetch the value of a field from an external ELF |
struct of some sort. TYPEFUNCS is the set of type functions. |
BUFFER points to the external data. STRUCTTYPE is the appropriate |
struct type. FIELD is a field within the struct. TYPE is the type |
of the field in the struct: Elf_Half, Elf_Word, or Elf_Addr. */ |
#define ELF_FETCH_STRUCT_FIELD(TYPEFUNCS, STRUCTTYPE, FIELD, BUFFER, TYPE) \ |
((TYPEFUNCS)->fetch_ ## TYPE ((BUFFER) + offsetof (STRUCTTYPE, FIELD))) |
/* Even more hideous macro to fetch the value of FIELD from BUFFER. |
SIZE is 32 or 64. STRUCTTYPE is the name of the struct from |
elf/external.h: Ehdr, Shdr, etc. FIELD is the name of a field in |
the struct. TYPE is the type of the field in the struct: Elf_Half, |
Elf_Word, or Elf_Addr. */ |
#define ELF_FETCH_SIZED_FIELD(TYPEFUNCS, SIZE, STRUCTTYPE, BUFFER, \ |
FIELD, TYPE) \ |
ELF_FETCH_STRUCT_FIELD (TYPEFUNCS, \ |
Elf ## SIZE ## _External_ ## STRUCTTYPE, \ |
FIELD, BUFFER, TYPE) |
/* Like ELF_FETCH_SIZED_FIELD but taking an ELFCLASS value. */ |
#define ELF_FETCH_FIELD(TYPEFUNCS, CLASS, STRUCTTYPE, BUFFER, \ |
FIELD, TYPE) \ |
((CLASS) == ELFCLASS32 \ |
? ELF_FETCH_SIZED_FIELD (TYPEFUNCS, 32, STRUCTTYPE, BUFFER, FIELD, \ |
TYPE) \ |
: ELF_FETCH_SIZED_FIELD (TYPEFUNCS, 64, STRUCTTYPE, BUFFER, FIELD, \ |
TYPE)) |
/* Hideous macro to set the value of a field in an external ELF |
structure to VAL. TYPEFUNCS is the set of type functions. BUFFER |
points to the external data. STRUCTTYPE is the appropriate |
structure type. FIELD is a field within the struct. TYPE is the |
type of the field in the struct: Elf_Half, Elf_Word, or |
Elf_Addr. */ |
#define ELF_SET_STRUCT_FIELD(TYPEFUNCS, STRUCTTYPE, FIELD, BUFFER, TYPE, VAL) \ |
(TYPEFUNCS)->set_ ## TYPE ((BUFFER) + offsetof (STRUCTTYPE, FIELD), (VAL)) |
/* Even more hideous macro to set the value of FIELD in BUFFER to VAL. |
SIZE is 32 or 64. STRUCTTYPE is the name of the struct from |
elf/external.h: Ehdr, Shdr, etc. FIELD is the name of a field in |
the struct. TYPE is the type of the field in the struct: Elf_Half, |
Elf_Word, or Elf_Addr. */ |
#define ELF_SET_SIZED_FIELD(TYPEFUNCS, SIZE, STRUCTTYPE, BUFFER, FIELD, \ |
TYPE, VAL) \ |
ELF_SET_STRUCT_FIELD (TYPEFUNCS, \ |
Elf ## SIZE ## _External_ ## STRUCTTYPE, \ |
FIELD, BUFFER, TYPE, VAL) |
/* Like ELF_SET_SIZED_FIELD but taking an ELFCLASS value. */ |
#define ELF_SET_FIELD(TYPEFUNCS, CLASS, STRUCTTYPE, BUFFER, FIELD, \ |
TYPE, VAL) \ |
((CLASS) == ELFCLASS32 \ |
? ELF_SET_SIZED_FIELD (TYPEFUNCS, 32, STRUCTTYPE, BUFFER, FIELD, \ |
TYPE, VAL) \ |
: ELF_SET_SIZED_FIELD (TYPEFUNCS, 64, STRUCTTYPE, BUFFER, FIELD, \ |
TYPE, VAL)) |
/* Private data for an simple_object_read. */ |
struct simple_object_elf_read |
{ |
/* Type functions. */ |
const struct elf_type_functions* type_functions; |
/* Elf data. */ |
unsigned char ei_data; |
/* Elf class. */ |
unsigned char ei_class; |
/* ELF OS ABI. */ |
unsigned char ei_osabi; |
/* Elf machine number. */ |
unsigned short machine; |
/* Processor specific flags. */ |
unsigned int flags; |
/* File offset of section headers. */ |
ulong_type shoff; |
/* Number of sections. */ |
unsigned int shnum; |
/* Index of string table section header. */ |
unsigned int shstrndx; |
}; |
/* Private data for an simple_object_attributes. */ |
struct simple_object_elf_attributes |
{ |
/* Type functions. */ |
const struct elf_type_functions* type_functions; |
/* Elf data. */ |
unsigned char ei_data; |
/* Elf class. */ |
unsigned char ei_class; |
/* ELF OS ABI. */ |
unsigned char ei_osabi; |
/* Elf machine number. */ |
unsigned short machine; |
/* Processor specific flags. */ |
unsigned int flags; |
}; |
/* See if we have an ELF file. */ |
static void * |
simple_object_elf_match (unsigned char header[SIMPLE_OBJECT_MATCH_HEADER_LEN], |
int descriptor, off_t offset, |
const char *segment_name ATTRIBUTE_UNUSED, |
const char **errmsg, int *err) |
{ |
unsigned char ei_data; |
unsigned char ei_class; |
const struct elf_type_functions *type_functions; |
unsigned char ehdr[sizeof (Elf64_External_Ehdr)]; |
struct simple_object_elf_read *eor; |
if (header[EI_MAG0] != ELFMAG0 |
|| header[EI_MAG1] != ELFMAG1 |
|| header[EI_MAG2] != ELFMAG2 |
|| header[EI_MAG3] != ELFMAG3 |
|| header[EI_VERSION] != EV_CURRENT) |
{ |
*errmsg = NULL; |
*err = 0; |
return NULL; |
} |
ei_data = header[EI_DATA]; |
if (ei_data != ELFDATA2LSB && ei_data != ELFDATA2MSB) |
{ |
*errmsg = "unknown ELF endianness"; |
*err = 0; |
return NULL; |
} |
ei_class = header[EI_CLASS]; |
switch (ei_class) |
{ |
case ELFCLASS32: |
type_functions = (ei_data == ELFDATA2LSB |
? &elf_little_32_functions |
: &elf_big_32_functions); |
break; |
case ELFCLASS64: |
#ifndef UNSIGNED_64BIT_TYPE |
*errmsg = "64-bit ELF objects not supported"; |
*err = 0; |
return NULL; |
#else |
type_functions = (ei_data == ELFDATA2LSB |
? &elf_little_64_functions |
: &elf_big_64_functions); |
break; |
#endif |
default: |
*errmsg = "unrecognized ELF size"; |
*err = 0; |
return NULL; |
} |
if (!simple_object_internal_read (descriptor, offset, ehdr, sizeof ehdr, |
errmsg, err)) |
return NULL; |
eor = XNEW (struct simple_object_elf_read); |
eor->type_functions = type_functions; |
eor->ei_data = ei_data; |
eor->ei_class = ei_class; |
eor->ei_osabi = header[EI_OSABI]; |
eor->machine = ELF_FETCH_FIELD (type_functions, ei_class, Ehdr, ehdr, |
e_machine, Elf_Half); |
eor->flags = ELF_FETCH_FIELD (type_functions, ei_class, Ehdr, ehdr, |
e_flags, Elf_Word); |
eor->shoff = ELF_FETCH_FIELD (type_functions, ei_class, Ehdr, ehdr, |
e_shoff, Elf_Addr); |
eor->shnum = ELF_FETCH_FIELD (type_functions, ei_class, Ehdr, ehdr, |
e_shnum, Elf_Half); |
eor->shstrndx = ELF_FETCH_FIELD (type_functions, ei_class, Ehdr, ehdr, |
e_shstrndx, Elf_Half); |
if ((eor->shnum == 0 || eor->shstrndx == SHN_XINDEX) |
&& eor->shoff != 0) |
{ |
unsigned char shdr[sizeof (Elf64_External_Shdr)]; |
/* Object file has more than 0xffff sections. */ |
if (!simple_object_internal_read (descriptor, offset + eor->shoff, shdr, |
(ei_class == ELFCLASS32 |
? sizeof (Elf32_External_Shdr) |
: sizeof (Elf64_External_Shdr)), |
errmsg, err)) |
{ |
XDELETE (eor); |
return NULL; |
} |
if (eor->shnum == 0) |
eor->shnum = ELF_FETCH_FIELD (type_functions, ei_class, Shdr, |
shdr, sh_size, Elf_Addr); |
if (eor->shstrndx == SHN_XINDEX) |
{ |
eor->shstrndx = ELF_FETCH_FIELD (type_functions, ei_class, Shdr, |
shdr, sh_link, Elf_Word); |
/* Versions of the GNU binutils between 2.12 and 2.18 did |
not handle objects with more than SHN_LORESERVE sections |
correctly. All large section indexes were offset by |
0x100. There is more information at |
http://sourceware.org/bugzilla/show_bug.cgi?id-5900 . |
Fortunately these object files are easy to detect, as the |
GNU binutils always put the section header string table |
near the end of the list of sections. Thus if the |
section header string table index is larger than the |
number of sections, then we know we have to subtract |
0x100 to get the real section index. */ |
if (eor->shstrndx >= eor->shnum |
&& eor->shstrndx >= SHN_LORESERVE + 0x100) |
eor->shstrndx -= 0x100; |
} |
} |
if (eor->shstrndx >= eor->shnum) |
{ |
*errmsg = "invalid ELF shstrndx >= shnum"; |
*err = 0; |
XDELETE (eor); |
return NULL; |
} |
return (void *) eor; |
} |
/* Find all sections in an ELF file. */ |
static const char * |
simple_object_elf_find_sections (simple_object_read *sobj, |
int (*pfn) (void *, const char *, |
off_t offset, off_t length), |
void *data, |
int *err) |
{ |
struct simple_object_elf_read *eor = |
(struct simple_object_elf_read *) sobj->data; |
const struct elf_type_functions *type_functions = eor->type_functions; |
unsigned char ei_class = eor->ei_class; |
size_t shdr_size; |
unsigned int shnum; |
unsigned char *shdrs; |
const char *errmsg; |
unsigned char *shstrhdr; |
size_t name_size; |
off_t shstroff; |
unsigned char *names; |
unsigned int i; |
shdr_size = (ei_class == ELFCLASS32 |
? sizeof (Elf32_External_Shdr) |
: sizeof (Elf64_External_Shdr)); |
/* Read the section headers. We skip section 0, which is not a |
useful section. */ |
shnum = eor->shnum; |
shdrs = XNEWVEC (unsigned char, shdr_size * (shnum - 1)); |
if (!simple_object_internal_read (sobj->descriptor, |
sobj->offset + eor->shoff + shdr_size, |
shdrs, |
shdr_size * (shnum - 1), |
&errmsg, err)) |
{ |
XDELETEVEC (shdrs); |
return errmsg; |
} |
/* Read the section names. */ |
shstrhdr = shdrs + (eor->shstrndx - 1) * shdr_size; |
name_size = ELF_FETCH_FIELD (type_functions, ei_class, Shdr, |
shstrhdr, sh_size, Elf_Addr); |
shstroff = ELF_FETCH_FIELD (type_functions, ei_class, Shdr, |
shstrhdr, sh_offset, Elf_Addr); |
names = XNEWVEC (unsigned char, name_size); |
if (!simple_object_internal_read (sobj->descriptor, |
sobj->offset + shstroff, |
names, name_size, &errmsg, err)) |
{ |
XDELETEVEC (names); |
XDELETEVEC (shdrs); |
return errmsg; |
} |
for (i = 1; i < shnum; ++i) |
{ |
unsigned char *shdr; |
unsigned int sh_name; |
const char *name; |
off_t offset; |
off_t length; |
shdr = shdrs + (i - 1) * shdr_size; |
sh_name = ELF_FETCH_FIELD (type_functions, ei_class, Shdr, |
shdr, sh_name, Elf_Word); |
if (sh_name >= name_size) |
{ |
*err = 0; |
XDELETEVEC (names); |
XDELETEVEC (shdrs); |
return "ELF section name out of range"; |
} |
name = (const char *) names + sh_name; |
offset = ELF_FETCH_FIELD (type_functions, ei_class, Shdr, |
shdr, sh_offset, Elf_Addr); |
length = ELF_FETCH_FIELD (type_functions, ei_class, Shdr, |
shdr, sh_size, Elf_Addr); |
if (!(*pfn) (data, name, offset, length)) |
break; |
} |
XDELETEVEC (names); |
XDELETEVEC (shdrs); |
return NULL; |
} |
/* Fetch the attributes for an simple_object_read. */ |
static void * |
simple_object_elf_fetch_attributes (simple_object_read *sobj, |
const char **errmsg ATTRIBUTE_UNUSED, |
int *err ATTRIBUTE_UNUSED) |
{ |
struct simple_object_elf_read *eor = |
(struct simple_object_elf_read *) sobj->data; |
struct simple_object_elf_attributes *ret; |
ret = XNEW (struct simple_object_elf_attributes); |
ret->type_functions = eor->type_functions; |
ret->ei_data = eor->ei_data; |
ret->ei_class = eor->ei_class; |
ret->ei_osabi = eor->ei_osabi; |
ret->machine = eor->machine; |
ret->flags = eor->flags; |
return ret; |
} |
/* Release the privata data for an simple_object_read. */ |
static void |
simple_object_elf_release_read (void *data) |
{ |
XDELETE (data); |
} |
/* Compare two attributes structures. */ |
static const char * |
simple_object_elf_attributes_merge (void *todata, void *fromdata, int *err) |
{ |
struct simple_object_elf_attributes *to = |
(struct simple_object_elf_attributes *) todata; |
struct simple_object_elf_attributes *from = |
(struct simple_object_elf_attributes *) fromdata; |
if (to->ei_data != from->ei_data || to->ei_class != from->ei_class) |
{ |
*err = 0; |
return "ELF object format mismatch"; |
} |
if (to->machine != from->machine) |
{ |
int ok; |
/* EM_SPARC and EM_SPARC32PLUS are compatible and force an |
output of EM_SPARC32PLUS. */ |
ok = 0; |
switch (to->machine) |
{ |
case EM_SPARC: |
if (from->machine == EM_SPARC32PLUS) |
{ |
to->machine = from->machine; |
ok = 1; |
} |
break; |
case EM_SPARC32PLUS: |
if (from->machine == EM_SPARC) |
ok = 1; |
break; |
default: |
break; |
} |
if (!ok) |
{ |
*err = 0; |
return "ELF machine number mismatch"; |
} |
} |
return NULL; |
} |
/* Release the private data for an attributes structure. */ |
static void |
simple_object_elf_release_attributes (void *data) |
{ |
XDELETE (data); |
} |
/* Prepare to write out a file. */ |
static void * |
simple_object_elf_start_write (void *attributes_data, |
const char **errmsg ATTRIBUTE_UNUSED, |
int *err ATTRIBUTE_UNUSED) |
{ |
struct simple_object_elf_attributes *attrs = |
(struct simple_object_elf_attributes *) attributes_data; |
struct simple_object_elf_attributes *ret; |
/* We're just going to record the attributes, but we need to make a |
copy because the user may delete them. */ |
ret = XNEW (struct simple_object_elf_attributes); |
*ret = *attrs; |
return ret; |
} |
/* Write out an ELF ehdr. */ |
static int |
simple_object_elf_write_ehdr (simple_object_write *sobj, int descriptor, |
const char **errmsg, int *err) |
{ |
struct simple_object_elf_attributes *attrs = |
(struct simple_object_elf_attributes *) sobj->data; |
const struct elf_type_functions* fns; |
unsigned char cl; |
size_t ehdr_size; |
unsigned char buf[sizeof (Elf64_External_Ehdr)]; |
simple_object_write_section *section; |
unsigned int shnum; |
fns = attrs->type_functions; |
cl = attrs->ei_class; |
shnum = 0; |
for (section = sobj->sections; section != NULL; section = section->next) |
++shnum; |
if (shnum > 0) |
{ |
/* Add a section header for the dummy section and one for |
.shstrtab. */ |
shnum += 2; |
} |
ehdr_size = (cl == ELFCLASS32 |
? sizeof (Elf32_External_Ehdr) |
: sizeof (Elf64_External_Ehdr)); |
memset (buf, 0, sizeof (Elf64_External_Ehdr)); |
buf[EI_MAG0] = ELFMAG0; |
buf[EI_MAG1] = ELFMAG1; |
buf[EI_MAG2] = ELFMAG2; |
buf[EI_MAG3] = ELFMAG3; |
buf[EI_CLASS] = cl; |
buf[EI_DATA] = attrs->ei_data; |
buf[EI_VERSION] = EV_CURRENT; |
buf[EI_OSABI] = attrs->ei_osabi; |
ELF_SET_FIELD (fns, cl, Ehdr, buf, e_type, Elf_Half, ET_REL); |
ELF_SET_FIELD (fns, cl, Ehdr, buf, e_machine, Elf_Half, attrs->machine); |
ELF_SET_FIELD (fns, cl, Ehdr, buf, e_version, Elf_Word, EV_CURRENT); |
/* e_entry left as zero. */ |
/* e_phoff left as zero. */ |
ELF_SET_FIELD (fns, cl, Ehdr, buf, e_shoff, Elf_Addr, ehdr_size); |
ELF_SET_FIELD (fns, cl, Ehdr, buf, e_flags, Elf_Word, attrs->flags); |
ELF_SET_FIELD (fns, cl, Ehdr, buf, e_ehsize, Elf_Half, ehdr_size); |
ELF_SET_FIELD (fns, cl, Ehdr, buf, e_phentsize, Elf_Half, |
(cl == ELFCLASS32 |
? sizeof (Elf32_External_Phdr) |
: sizeof (Elf64_External_Phdr))); |
/* e_phnum left as zero. */ |
ELF_SET_FIELD (fns, cl, Ehdr, buf, e_shentsize, Elf_Half, |
(cl == ELFCLASS32 |
? sizeof (Elf32_External_Shdr) |
: sizeof (Elf64_External_Shdr))); |
ELF_SET_FIELD (fns, cl, Ehdr, buf, e_shnum, Elf_Half, shnum); |
ELF_SET_FIELD (fns, cl, Ehdr, buf, e_shstrndx, Elf_Half, |
shnum == 0 ? 0 : shnum - 1); |
return simple_object_internal_write (descriptor, 0, buf, ehdr_size, |
errmsg, err); |
} |
/* Write out an ELF shdr. */ |
static int |
simple_object_elf_write_shdr (simple_object_write *sobj, int descriptor, |
off_t offset, unsigned int sh_name, |
unsigned int sh_type, unsigned int sh_flags, |
unsigned int sh_offset, unsigned int sh_size, |
unsigned int sh_addralign, const char **errmsg, |
int *err) |
{ |
struct simple_object_elf_attributes *attrs = |
(struct simple_object_elf_attributes *) sobj->data; |
const struct elf_type_functions* fns; |
unsigned char cl; |
size_t shdr_size; |
unsigned char buf[sizeof (Elf64_External_Shdr)]; |
fns = attrs->type_functions; |
cl = attrs->ei_class; |
shdr_size = (cl == ELFCLASS32 |
? sizeof (Elf32_External_Shdr) |
: sizeof (Elf64_External_Shdr)); |
memset (buf, 0, sizeof (Elf64_External_Shdr)); |
ELF_SET_FIELD (fns, cl, Shdr, buf, sh_name, Elf_Word, sh_name); |
ELF_SET_FIELD (fns, cl, Shdr, buf, sh_type, Elf_Word, sh_type); |
ELF_SET_FIELD (fns, cl, Shdr, buf, sh_flags, Elf_Addr, sh_flags); |
ELF_SET_FIELD (fns, cl, Shdr, buf, sh_offset, Elf_Addr, sh_offset); |
ELF_SET_FIELD (fns, cl, Shdr, buf, sh_size, Elf_Addr, sh_size); |
/* sh_link left as zero. */ |
/* sh_info left as zero. */ |
ELF_SET_FIELD (fns, cl, Shdr, buf, sh_addralign, Elf_Addr, sh_addralign); |
/* sh_entsize left as zero. */ |
return simple_object_internal_write (descriptor, offset, buf, shdr_size, |
errmsg, err); |
} |
/* Write out a complete ELF file. |
Ehdr |
initial dummy Shdr |
user-created Shdrs |
.shstrtab Shdr |
user-created section data |
.shstrtab data */ |
static const char * |
simple_object_elf_write_to_file (simple_object_write *sobj, int descriptor, |
int *err) |
{ |
struct simple_object_elf_attributes *attrs = |
(struct simple_object_elf_attributes *) sobj->data; |
unsigned char cl; |
size_t ehdr_size; |
size_t shdr_size; |
const char *errmsg; |
simple_object_write_section *section; |
unsigned int shnum; |
size_t shdr_offset; |
size_t sh_offset; |
size_t sh_name; |
unsigned char zero; |
if (!simple_object_elf_write_ehdr (sobj, descriptor, &errmsg, err)) |
return errmsg; |
cl = attrs->ei_class; |
if (cl == ELFCLASS32) |
{ |
ehdr_size = sizeof (Elf32_External_Ehdr); |
shdr_size = sizeof (Elf32_External_Shdr); |
} |
else |
{ |
ehdr_size = sizeof (Elf64_External_Ehdr); |
shdr_size = sizeof (Elf64_External_Shdr); |
} |
shnum = 0; |
for (section = sobj->sections; section != NULL; section = section->next) |
++shnum; |
if (shnum == 0) |
return NULL; |
/* Add initial dummy Shdr and .shstrtab. */ |
shnum += 2; |
shdr_offset = ehdr_size; |
sh_offset = shdr_offset + shnum * shdr_size; |
if (!simple_object_elf_write_shdr (sobj, descriptor, shdr_offset, |
0, 0, 0, 0, 0, 0, &errmsg, err)) |
return errmsg; |
shdr_offset += shdr_size; |
sh_name = 1; |
for (section = sobj->sections; section != NULL; section = section->next) |
{ |
size_t mask; |
size_t new_sh_offset; |
size_t sh_size; |
struct simple_object_write_section_buffer *buffer; |
mask = (1U << section->align) - 1; |
new_sh_offset = sh_offset + mask; |
new_sh_offset &= ~ mask; |
while (new_sh_offset > sh_offset) |
{ |
unsigned char zeroes[16]; |
size_t write; |
memset (zeroes, 0, sizeof zeroes); |
write = new_sh_offset - sh_offset; |
if (write > sizeof zeroes) |
write = sizeof zeroes; |
if (!simple_object_internal_write (descriptor, sh_offset, zeroes, |
write, &errmsg, err)) |
return errmsg; |
sh_offset += write; |
} |
sh_size = 0; |
for (buffer = section->buffers; buffer != NULL; buffer = buffer->next) |
{ |
if (!simple_object_internal_write (descriptor, sh_offset + sh_size, |
((const unsigned char *) |
buffer->buffer), |
buffer->size, &errmsg, err)) |
return errmsg; |
sh_size += buffer->size; |
} |
if (!simple_object_elf_write_shdr (sobj, descriptor, shdr_offset, |
sh_name, SHT_PROGBITS, 0, sh_offset, |
sh_size, 1U << section->align, |
&errmsg, err)) |
return errmsg; |
shdr_offset += shdr_size; |
sh_name += strlen (section->name) + 1; |
sh_offset += sh_size; |
} |
if (!simple_object_elf_write_shdr (sobj, descriptor, shdr_offset, |
sh_name, SHT_STRTAB, 0, sh_offset, |
sh_name + strlen (".shstrtab") + 1, |
1, &errmsg, err)) |
return errmsg; |
/* .shstrtab has a leading zero byte. */ |
zero = 0; |
if (!simple_object_internal_write (descriptor, sh_offset, &zero, 1, |
&errmsg, err)) |
return errmsg; |
++sh_offset; |
for (section = sobj->sections; section != NULL; section = section->next) |
{ |
size_t len; |
len = strlen (section->name) + 1; |
if (!simple_object_internal_write (descriptor, sh_offset, |
(const unsigned char *) section->name, |
len, &errmsg, err)) |
return errmsg; |
sh_offset += len; |
} |
if (!simple_object_internal_write (descriptor, sh_offset, |
(const unsigned char *) ".shstrtab", |
strlen (".shstrtab") + 1, &errmsg, err)) |
return errmsg; |
return NULL; |
} |
/* Release the private data for an simple_object_write structure. */ |
static void |
simple_object_elf_release_write (void *data) |
{ |
XDELETE (data); |
} |
/* The ELF functions. */ |
const struct simple_object_functions simple_object_elf_functions = |
{ |
simple_object_elf_match, |
simple_object_elf_find_sections, |
simple_object_elf_fetch_attributes, |
simple_object_elf_release_read, |
simple_object_elf_attributes_merge, |
simple_object_elf_release_attributes, |
simple_object_elf_start_write, |
simple_object_elf_write_to_file, |
simple_object_elf_release_write |
}; |
/contrib/toolchain/binutils/libiberty/simple-object-mach-o.c |
---|
0,0 → 1,1378 |
/* simple-object-mach-o.c -- routines to manipulate Mach-O object files. |
Copyright 2010, 2011, 2013 Free Software Foundation, Inc. |
Written by Ian Lance Taylor, Google. |
This program is free software; you can redistribute it and/or modify it |
under the terms of the GNU General Public License as published by the |
Free Software Foundation; either version 2, or (at your option) any |
later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
#include "config.h" |
#include "libiberty.h" |
#include "simple-object.h" |
#include <stddef.h> |
#ifdef HAVE_STDLIB_H |
#include <stdlib.h> |
#endif |
#ifdef HAVE_STDINT_H |
#include <stdint.h> |
#endif |
#ifdef HAVE_STRING_H |
#include <string.h> |
#endif |
#ifdef HAVE_INTTYPES_H |
#include <inttypes.h> |
#endif |
#include "simple-object-common.h" |
/* Mach-O structures and constants. */ |
/* Mach-O header (32-bit version). */ |
struct mach_o_header_32 |
{ |
unsigned char magic[4]; /* Magic number. */ |
unsigned char cputype[4]; /* CPU that this object is for. */ |
unsigned char cpusubtype[4]; /* CPU subtype. */ |
unsigned char filetype[4]; /* Type of file. */ |
unsigned char ncmds[4]; /* Number of load commands. */ |
unsigned char sizeofcmds[4]; /* Total size of load commands. */ |
unsigned char flags[4]; /* Flags for special featues. */ |
}; |
/* Mach-O header (64-bit version). */ |
struct mach_o_header_64 |
{ |
unsigned char magic[4]; /* Magic number. */ |
unsigned char cputype[4]; /* CPU that this object is for. */ |
unsigned char cpusubtype[4]; /* CPU subtype. */ |
unsigned char filetype[4]; /* Type of file. */ |
unsigned char ncmds[4]; /* Number of load commands. */ |
unsigned char sizeofcmds[4]; /* Total size of load commands. */ |
unsigned char flags[4]; /* Flags for special featues. */ |
unsigned char reserved[4]; /* Reserved. Duh. */ |
}; |
/* For magic field in header. */ |
#define MACH_O_MH_MAGIC 0xfeedface |
#define MACH_O_MH_MAGIC_64 0xfeedfacf |
/* For filetype field in header. */ |
#define MACH_O_MH_OBJECT 0x01 |
/* A Mach-O file is a list of load commands. This is the header of a |
load command. */ |
struct mach_o_load_command |
{ |
unsigned char cmd[4]; /* The type of load command. */ |
unsigned char cmdsize[4]; /* Size in bytes of entire command. */ |
}; |
/* For cmd field in load command. */ |
#define MACH_O_LC_SEGMENT 0x01 |
#define MACH_O_LC_SEGMENT_64 0x19 |
/* LC_SEGMENT load command. */ |
struct mach_o_segment_command_32 |
{ |
unsigned char cmd[4]; /* The type of load command (LC_SEGMENT). */ |
unsigned char cmdsize[4]; /* Size in bytes of entire command. */ |
unsigned char segname[16]; /* Name of this segment. */ |
unsigned char vmaddr[4]; /* Virtual memory address of this segment. */ |
unsigned char vmsize[4]; /* Size there, in bytes. */ |
unsigned char fileoff[4]; /* Offset in bytes of the data to be mapped. */ |
unsigned char filesize[4]; /* Size in bytes on disk. */ |
unsigned char maxprot[4]; /* Maximum permitted vmem protection. */ |
unsigned char initprot[4]; /* Initial vmem protection. */ |
unsigned char nsects[4]; /* Number of sections in this segment. */ |
unsigned char flags[4]; /* Flags that affect the loading. */ |
}; |
/* LC_SEGMENT_64 load command. */ |
struct mach_o_segment_command_64 |
{ |
unsigned char cmd[4]; /* The type of load command (LC_SEGMENT_64). */ |
unsigned char cmdsize[4]; /* Size in bytes of entire command. */ |
unsigned char segname[16]; /* Name of this segment. */ |
unsigned char vmaddr[8]; /* Virtual memory address of this segment. */ |
unsigned char vmsize[8]; /* Size there, in bytes. */ |
unsigned char fileoff[8]; /* Offset in bytes of the data to be mapped. */ |
unsigned char filesize[8]; /* Size in bytes on disk. */ |
unsigned char maxprot[4]; /* Maximum permitted vmem protection. */ |
unsigned char initprot[4]; /* Initial vmem protection. */ |
unsigned char nsects[4]; /* Number of sections in this segment. */ |
unsigned char flags[4]; /* Flags that affect the loading. */ |
}; |
/* 32-bit section header. */ |
struct mach_o_section_32 |
{ |
unsigned char sectname[16]; /* Section name. */ |
unsigned char segname[16]; /* Segment that the section belongs to. */ |
unsigned char addr[4]; /* Address of this section in memory. */ |
unsigned char size[4]; /* Size in bytes of this section. */ |
unsigned char offset[4]; /* File offset of this section. */ |
unsigned char align[4]; /* log2 of this section's alignment. */ |
unsigned char reloff[4]; /* File offset of this section's relocs. */ |
unsigned char nreloc[4]; /* Number of relocs for this section. */ |
unsigned char flags[4]; /* Section flags/attributes. */ |
unsigned char reserved1[4]; |
unsigned char reserved2[4]; |
}; |
/* 64-bit section header. */ |
struct mach_o_section_64 |
{ |
unsigned char sectname[16]; /* Section name. */ |
unsigned char segname[16]; /* Segment that the section belongs to. */ |
unsigned char addr[8]; /* Address of this section in memory. */ |
unsigned char size[8]; /* Size in bytes of this section. */ |
unsigned char offset[4]; /* File offset of this section. */ |
unsigned char align[4]; /* log2 of this section's alignment. */ |
unsigned char reloff[4]; /* File offset of this section's relocs. */ |
unsigned char nreloc[4]; /* Number of relocs for this section. */ |
unsigned char flags[4]; /* Section flags/attributes. */ |
unsigned char reserved1[4]; |
unsigned char reserved2[4]; |
unsigned char reserved3[4]; |
}; |
/* Flags for Mach-O sections. */ |
#define MACH_O_S_ATTR_DEBUG 0x02000000 |
/* The length of a segment or section name. */ |
#define MACH_O_NAME_LEN (16) |
/* A GNU specific extension for long section names. */ |
#define GNU_SECTION_NAMES "__section_names" |
/* A GNU-specific extension to wrap multiple sections using three |
mach-o sections within a given segment. The section '__wrapper_sects' |
is subdivided according to the index '__wrapper_index' and each sub |
sect is named according to the names supplied in '__wrapper_names'. */ |
#define GNU_WRAPPER_SECTS "__wrapper_sects" |
#define GNU_WRAPPER_INDEX "__wrapper_index" |
#define GNU_WRAPPER_NAMES "__wrapper_names" |
/* Private data for an simple_object_read. */ |
struct simple_object_mach_o_read |
{ |
/* User specified segment name. */ |
char *segment_name; |
/* Magic number. */ |
unsigned int magic; |
/* Whether this file is big-endian. */ |
int is_big_endian; |
/* CPU type from header. */ |
unsigned int cputype; |
/* CPU subtype from header. */ |
unsigned int cpusubtype; |
/* Number of commands, from header. */ |
unsigned int ncmds; |
/* Flags from header. */ |
unsigned int flags; |
/* Reserved field from header, only used on 64-bit. */ |
unsigned int reserved; |
}; |
/* Private data for an simple_object_attributes. */ |
struct simple_object_mach_o_attributes |
{ |
/* Magic number. */ |
unsigned int magic; |
/* Whether this file is big-endian. */ |
int is_big_endian; |
/* CPU type from header. */ |
unsigned int cputype; |
/* CPU subtype from header. */ |
unsigned int cpusubtype; |
/* Flags from header. */ |
unsigned int flags; |
/* Reserved field from header, only used on 64-bit. */ |
unsigned int reserved; |
}; |
/* See if we have a Mach-O MH_OBJECT file: |
A standard MH_OBJECT (from as) will have three load commands: |
0 - LC_SEGMENT/LC_SEGMENT64 |
1 - LC_SYMTAB |
2 - LC_DYSYMTAB |
The LC_SEGMENT/LC_SEGMENT64 will introduce a single anonymous segment |
containing all the sections. |
Files written by simple-object will have only the segment command |
(no symbol tables). */ |
static void * |
simple_object_mach_o_match ( |
unsigned char header[SIMPLE_OBJECT_MATCH_HEADER_LEN], |
int descriptor, |
off_t offset, |
const char *segment_name, |
const char **errmsg, |
int *err) |
{ |
unsigned int magic; |
int is_big_endian; |
unsigned int (*fetch_32) (const unsigned char *); |
unsigned int filetype; |
struct simple_object_mach_o_read *omr; |
unsigned char buf[sizeof (struct mach_o_header_64)]; |
unsigned char *b; |
magic = simple_object_fetch_big_32 (header); |
if (magic == MACH_O_MH_MAGIC || magic == MACH_O_MH_MAGIC_64) |
is_big_endian = 1; |
else |
{ |
magic = simple_object_fetch_little_32 (header); |
if (magic == MACH_O_MH_MAGIC || magic == MACH_O_MH_MAGIC_64) |
is_big_endian = 0; |
else |
{ |
*errmsg = NULL; |
*err = 0; |
return NULL; |
} |
} |
#ifndef UNSIGNED_64BIT_TYPE |
if (magic == MACH_O_MH_MAGIC_64) |
{ |
*errmsg = "64-bit Mach-O objects not supported"; |
*err = 0; |
return NULL; |
} |
#endif |
/* We require the user to provide a segment name. This is |
unfortunate but I don't see any good choices here. */ |
if (segment_name == NULL) |
{ |
*errmsg = "Mach-O file found but no segment name specified"; |
*err = 0; |
return NULL; |
} |
if (strlen (segment_name) > MACH_O_NAME_LEN) |
{ |
*errmsg = "Mach-O segment name too long"; |
*err = 0; |
return NULL; |
} |
/* The 32-bit and 64-bit headers are similar enough that we can use |
the same code. */ |
fetch_32 = (is_big_endian |
? simple_object_fetch_big_32 |
: simple_object_fetch_little_32); |
if (!simple_object_internal_read (descriptor, offset, buf, |
(magic == MACH_O_MH_MAGIC |
? sizeof (struct mach_o_header_32) |
: sizeof (struct mach_o_header_64)), |
errmsg, err)) |
return NULL; |
b = &buf[0]; |
filetype = (*fetch_32) (b + offsetof (struct mach_o_header_32, filetype)); |
if (filetype != MACH_O_MH_OBJECT) |
{ |
*errmsg = "Mach-O file is not object file"; |
*err = 0; |
return NULL; |
} |
omr = XNEW (struct simple_object_mach_o_read); |
omr->segment_name = xstrdup (segment_name); |
omr->magic = magic; |
omr->is_big_endian = is_big_endian; |
omr->cputype = (*fetch_32) (b + offsetof (struct mach_o_header_32, cputype)); |
omr->cpusubtype = (*fetch_32) (b |
+ offsetof (struct mach_o_header_32, |
cpusubtype)); |
omr->ncmds = (*fetch_32) (b + offsetof (struct mach_o_header_32, ncmds)); |
omr->flags = (*fetch_32) (b + offsetof (struct mach_o_header_32, flags)); |
if (magic == MACH_O_MH_MAGIC) |
omr->reserved = 0; |
else |
omr->reserved = (*fetch_32) (b |
+ offsetof (struct mach_o_header_64, |
reserved)); |
return (void *) omr; |
} |
/* Get the file offset and size from a section header. */ |
static void |
simple_object_mach_o_section_info (int is_big_endian, int is_32, |
const unsigned char *sechdr, off_t *offset, |
size_t *size) |
{ |
unsigned int (*fetch_32) (const unsigned char *); |
ulong_type (*fetch_64) (const unsigned char *); |
fetch_32 = (is_big_endian |
? simple_object_fetch_big_32 |
: simple_object_fetch_little_32); |
fetch_64 = NULL; |
#ifdef UNSIGNED_64BIT_TYPE |
fetch_64 = (is_big_endian |
? simple_object_fetch_big_64 |
: simple_object_fetch_little_64); |
#endif |
if (is_32) |
{ |
*offset = fetch_32 (sechdr |
+ offsetof (struct mach_o_section_32, offset)); |
*size = fetch_32 (sechdr |
+ offsetof (struct mach_o_section_32, size)); |
} |
else |
{ |
*offset = fetch_32 (sechdr |
+ offsetof (struct mach_o_section_64, offset)); |
*size = fetch_64 (sechdr |
+ offsetof (struct mach_o_section_64, size)); |
} |
} |
/* Handle a segment in a Mach-O Object file. |
This will callback to the function pfn for each "section found" the meaning |
of which depends on gnu extensions to mach-o: |
If we find mach-o sections (with the segment name as specified) which also |
contain: a 'sects' wrapper, an index, and a name table, we expand this into |
as many sections as are specified in the index. In this case, there will |
be a callback for each of these. |
We will also allow an extension that permits long names (more than 16 |
characters) to be used with mach-o. In this case, the section name has |
a specific format embedding an index into a name table, and the file must |
contain such name table. |
Return 1 if we should continue, 0 if the caller should return. */ |
#define SOMO_SECTS_PRESENT 0x01 |
#define SOMO_INDEX_PRESENT 0x02 |
#define SOMO_NAMES_PRESENT 0x04 |
#define SOMO_LONGN_PRESENT 0x08 |
#define SOMO_WRAPPING (SOMO_SECTS_PRESENT | SOMO_INDEX_PRESENT \ |
| SOMO_NAMES_PRESENT) |
static int |
simple_object_mach_o_segment (simple_object_read *sobj, off_t offset, |
const unsigned char *segbuf, |
int (*pfn) (void *, const char *, off_t offset, |
off_t length), |
void *data, |
const char **errmsg, int *err) |
{ |
struct simple_object_mach_o_read *omr = |
(struct simple_object_mach_o_read *) sobj->data; |
unsigned int (*fetch_32) (const unsigned char *); |
int is_32; |
size_t seghdrsize; |
size_t sechdrsize; |
size_t segname_offset; |
size_t sectname_offset; |
unsigned int nsects; |
unsigned char *secdata; |
unsigned int i; |
unsigned int gnu_sections_found; |
unsigned int strtab_index; |
unsigned int index_index; |
unsigned int nametab_index; |
unsigned int sections_index; |
char *strtab; |
char *nametab; |
unsigned char *index; |
size_t strtab_size; |
size_t nametab_size; |
size_t index_size; |
unsigned int n_wrapped_sects; |
size_t wrapper_sect_size; |
off_t wrapper_sect_offset = 0; |
fetch_32 = (omr->is_big_endian |
? simple_object_fetch_big_32 |
: simple_object_fetch_little_32); |
is_32 = omr->magic == MACH_O_MH_MAGIC; |
if (is_32) |
{ |
seghdrsize = sizeof (struct mach_o_segment_command_32); |
sechdrsize = sizeof (struct mach_o_section_32); |
segname_offset = offsetof (struct mach_o_section_32, segname); |
sectname_offset = offsetof (struct mach_o_section_32, sectname); |
nsects = (*fetch_32) (segbuf |
+ offsetof (struct mach_o_segment_command_32, |
nsects)); |
} |
else |
{ |
seghdrsize = sizeof (struct mach_o_segment_command_64); |
sechdrsize = sizeof (struct mach_o_section_64); |
segname_offset = offsetof (struct mach_o_section_64, segname); |
sectname_offset = offsetof (struct mach_o_section_64, sectname); |
nsects = (*fetch_32) (segbuf |
+ offsetof (struct mach_o_segment_command_64, |
nsects)); |
} |
/* Fetch the section headers from the segment command. */ |
secdata = XNEWVEC (unsigned char, nsects * sechdrsize); |
if (!simple_object_internal_read (sobj->descriptor, offset + seghdrsize, |
secdata, nsects * sechdrsize, errmsg, err)) |
{ |
XDELETEVEC (secdata); |
return 0; |
} |
/* Scan for special sections that signal GNU extensions to the format. */ |
gnu_sections_found = 0; |
index_index = nsects; |
sections_index = nsects; |
strtab_index = nsects; |
nametab_index = nsects; |
for (i = 0; i < nsects; ++i) |
{ |
size_t nameoff; |
nameoff = i * sechdrsize + segname_offset; |
if (strcmp ((char *) secdata + nameoff, omr->segment_name) != 0) |
continue; |
nameoff = i * sechdrsize + sectname_offset; |
if (strcmp ((char *) secdata + nameoff, GNU_WRAPPER_NAMES) == 0) |
{ |
nametab_index = i; |
gnu_sections_found |= SOMO_NAMES_PRESENT; |
} |
else if (strcmp ((char *) secdata + nameoff, GNU_WRAPPER_INDEX) == 0) |
{ |
index_index = i; |
gnu_sections_found |= SOMO_INDEX_PRESENT; |
} |
else if (strcmp ((char *) secdata + nameoff, GNU_WRAPPER_SECTS) == 0) |
{ |
sections_index = i; |
gnu_sections_found |= SOMO_SECTS_PRESENT; |
} |
else if (strcmp ((char *) secdata + nameoff, GNU_SECTION_NAMES) == 0) |
{ |
strtab_index = i; |
gnu_sections_found |= SOMO_LONGN_PRESENT; |
} |
} |
/* If any of the special wrapper section components is present, then |
they all should be. */ |
if ((gnu_sections_found & SOMO_WRAPPING) != 0) |
{ |
off_t nametab_offset; |
off_t index_offset; |
if ((gnu_sections_found & SOMO_WRAPPING) != SOMO_WRAPPING) |
{ |
*errmsg = "GNU Mach-o section wrapper: required section missing"; |
*err = 0; /* No useful errno. */ |
XDELETEVEC (secdata); |
return 0; |
} |
/* Fetch the name table. */ |
simple_object_mach_o_section_info (omr->is_big_endian, is_32, |
secdata + nametab_index * sechdrsize, |
&nametab_offset, &nametab_size); |
nametab = XNEWVEC (char, nametab_size); |
if (!simple_object_internal_read (sobj->descriptor, |
sobj->offset + nametab_offset, |
(unsigned char *) nametab, nametab_size, |
errmsg, err)) |
{ |
XDELETEVEC (nametab); |
XDELETEVEC (secdata); |
return 0; |
} |
/* Fetch the index. */ |
simple_object_mach_o_section_info (omr->is_big_endian, is_32, |
secdata + index_index * sechdrsize, |
&index_offset, &index_size); |
index = XNEWVEC (unsigned char, index_size); |
if (!simple_object_internal_read (sobj->descriptor, |
sobj->offset + index_offset, |
index, index_size, |
errmsg, err)) |
{ |
XDELETEVEC (index); |
XDELETEVEC (nametab); |
XDELETEVEC (secdata); |
return 0; |
} |
/* The index contains 4 unsigned ints per sub-section: |
sub-section offset/length, sub-section name/length. |
We fix this for both 32 and 64 bit mach-o for now, since |
other fields limit the maximum size of an object to 4G. */ |
n_wrapped_sects = index_size / 16; |
/* Get the parameters for the wrapper too. */ |
simple_object_mach_o_section_info (omr->is_big_endian, is_32, |
secdata + sections_index * sechdrsize, |
&wrapper_sect_offset, |
&wrapper_sect_size); |
} |
else |
{ |
index = NULL; |
index_size = 0; |
nametab = NULL; |
nametab_size = 0; |
n_wrapped_sects = 0; |
} |
/* If we have a long names section, fetch it. */ |
if ((gnu_sections_found & SOMO_LONGN_PRESENT) != 0) |
{ |
off_t strtab_offset; |
simple_object_mach_o_section_info (omr->is_big_endian, is_32, |
secdata + strtab_index * sechdrsize, |
&strtab_offset, &strtab_size); |
strtab = XNEWVEC (char, strtab_size); |
if (!simple_object_internal_read (sobj->descriptor, |
sobj->offset + strtab_offset, |
(unsigned char *) strtab, strtab_size, |
errmsg, err)) |
{ |
XDELETEVEC (strtab); |
XDELETEVEC (index); |
XDELETEVEC (nametab); |
XDELETEVEC (secdata); |
return 0; |
} |
} |
else |
{ |
strtab = NULL; |
strtab_size = 0; |
strtab_index = nsects; |
} |
/* Process the sections. */ |
for (i = 0; i < nsects; ++i) |
{ |
const unsigned char *sechdr; |
char namebuf[MACH_O_NAME_LEN * 2 + 2]; |
char *name; |
off_t secoffset; |
size_t secsize; |
int l; |
sechdr = secdata + i * sechdrsize; |
/* We've already processed the long section names. */ |
if ((gnu_sections_found & SOMO_LONGN_PRESENT) != 0 |
&& i == strtab_index) |
continue; |
/* We only act on the segment named. */ |
if (strcmp ((char *) sechdr + segname_offset, omr->segment_name) != 0) |
continue; |
/* Process sections associated with the wrapper. */ |
if ((gnu_sections_found & SOMO_WRAPPING) != 0) |
{ |
if (i == nametab_index || i == index_index) |
continue; |
if (i == sections_index) |
{ |
unsigned int j; |
for (j = 0; j < n_wrapped_sects; ++j) |
{ |
unsigned int subsect_offset, subsect_length, name_offset; |
subsect_offset = (*fetch_32) (index + 16 * j); |
subsect_length = (*fetch_32) (index + 16 * j + 4); |
name_offset = (*fetch_32) (index + 16 * j + 8); |
/* We don't need the name_length yet. */ |
secoffset = wrapper_sect_offset + subsect_offset; |
secsize = subsect_length; |
name = nametab + name_offset; |
if (!(*pfn) (data, name, secoffset, secsize)) |
{ |
*errmsg = NULL; |
*err = 0; |
XDELETEVEC (index); |
XDELETEVEC (nametab); |
XDELETEVEC (strtab); |
XDELETEVEC (secdata); |
return 0; |
} |
} |
continue; |
} |
} |
if ((gnu_sections_found & SOMO_LONGN_PRESENT) != 0) |
{ |
memcpy (namebuf, sechdr + sectname_offset, MACH_O_NAME_LEN); |
namebuf[MACH_O_NAME_LEN] = '\0'; |
name = &namebuf[0]; |
if (strtab != NULL && name[0] == '_' && name[1] == '_') |
{ |
unsigned long stringoffset; |
if (sscanf (name + 2, "%08lX", &stringoffset) == 1) |
{ |
if (stringoffset >= strtab_size) |
{ |
*errmsg = "section name offset out of range"; |
*err = 0; |
XDELETEVEC (index); |
XDELETEVEC (nametab); |
XDELETEVEC (strtab); |
XDELETEVEC (secdata); |
return 0; |
} |
name = strtab + stringoffset; |
} |
} |
} |
else |
{ |
/* Otherwise, make a name like __segment,__section as per the |
convention in mach-o asm. */ |
name = &namebuf[0]; |
memcpy (namebuf, (char *) sechdr + segname_offset, MACH_O_NAME_LEN); |
namebuf[MACH_O_NAME_LEN] = '\0'; |
l = strlen (namebuf); |
namebuf[l] = ','; |
memcpy (namebuf + l + 1, (char *) sechdr + sectname_offset, |
MACH_O_NAME_LEN); |
namebuf[l + 1 + MACH_O_NAME_LEN] = '\0'; |
} |
simple_object_mach_o_section_info (omr->is_big_endian, is_32, sechdr, |
&secoffset, &secsize); |
if (!(*pfn) (data, name, secoffset, secsize)) |
{ |
*errmsg = NULL; |
*err = 0; |
XDELETEVEC (index); |
XDELETEVEC (nametab); |
XDELETEVEC (strtab); |
XDELETEVEC (secdata); |
return 0; |
} |
} |
XDELETEVEC (index); |
XDELETEVEC (nametab); |
XDELETEVEC (strtab); |
XDELETEVEC (secdata); |
return 1; |
} |
/* Find all sections in a Mach-O file. */ |
static const char * |
simple_object_mach_o_find_sections (simple_object_read *sobj, |
int (*pfn) (void *, const char *, |
off_t offset, off_t length), |
void *data, |
int *err) |
{ |
struct simple_object_mach_o_read *omr = |
(struct simple_object_mach_o_read *) sobj->data; |
off_t offset; |
size_t seghdrsize; |
unsigned int (*fetch_32) (const unsigned char *); |
const char *errmsg; |
unsigned int i; |
if (omr->magic == MACH_O_MH_MAGIC) |
{ |
offset = sizeof (struct mach_o_header_32); |
seghdrsize = sizeof (struct mach_o_segment_command_32); |
} |
else |
{ |
offset = sizeof (struct mach_o_header_64); |
seghdrsize = sizeof (struct mach_o_segment_command_64); |
} |
fetch_32 = (omr->is_big_endian |
? simple_object_fetch_big_32 |
: simple_object_fetch_little_32); |
for (i = 0; i < omr->ncmds; ++i) |
{ |
unsigned char loadbuf[sizeof (struct mach_o_load_command)]; |
unsigned int cmd; |
unsigned int cmdsize; |
if (!simple_object_internal_read (sobj->descriptor, |
sobj->offset + offset, |
loadbuf, |
sizeof (struct mach_o_load_command), |
&errmsg, err)) |
return errmsg; |
cmd = (*fetch_32) (loadbuf + offsetof (struct mach_o_load_command, cmd)); |
cmdsize = (*fetch_32) (loadbuf |
+ offsetof (struct mach_o_load_command, cmdsize)); |
if (cmd == MACH_O_LC_SEGMENT || cmd == MACH_O_LC_SEGMENT_64) |
{ |
unsigned char segbuf[sizeof (struct mach_o_segment_command_64)]; |
int r; |
if (!simple_object_internal_read (sobj->descriptor, |
sobj->offset + offset, |
segbuf, seghdrsize, &errmsg, err)) |
return errmsg; |
r = simple_object_mach_o_segment (sobj, offset, segbuf, pfn, |
data, &errmsg, err); |
if (!r) |
return errmsg; |
} |
offset += cmdsize; |
} |
return NULL; |
} |
/* Fetch the attributes for an simple_object_read. */ |
static void * |
simple_object_mach_o_fetch_attributes (simple_object_read *sobj, |
const char **errmsg ATTRIBUTE_UNUSED, |
int *err ATTRIBUTE_UNUSED) |
{ |
struct simple_object_mach_o_read *omr = |
(struct simple_object_mach_o_read *) sobj->data; |
struct simple_object_mach_o_attributes *ret; |
ret = XNEW (struct simple_object_mach_o_attributes); |
ret->magic = omr->magic; |
ret->is_big_endian = omr->is_big_endian; |
ret->cputype = omr->cputype; |
ret->cpusubtype = omr->cpusubtype; |
ret->flags = omr->flags; |
ret->reserved = omr->reserved; |
return ret; |
} |
/* Release the private data for an simple_object_read. */ |
static void |
simple_object_mach_o_release_read (void *data) |
{ |
struct simple_object_mach_o_read *omr = |
(struct simple_object_mach_o_read *) data; |
free (omr->segment_name); |
XDELETE (omr); |
} |
/* Compare two attributes structures. */ |
static const char * |
simple_object_mach_o_attributes_merge (void *todata, void *fromdata, int *err) |
{ |
struct simple_object_mach_o_attributes *to = |
(struct simple_object_mach_o_attributes *) todata; |
struct simple_object_mach_o_attributes *from = |
(struct simple_object_mach_o_attributes *) fromdata; |
if (to->magic != from->magic |
|| to->is_big_endian != from->is_big_endian |
|| to->cputype != from->cputype) |
{ |
*err = 0; |
return "Mach-O object format mismatch"; |
} |
return NULL; |
} |
/* Release the private data for an attributes structure. */ |
static void |
simple_object_mach_o_release_attributes (void *data) |
{ |
XDELETE (data); |
} |
/* Prepare to write out a file. */ |
static void * |
simple_object_mach_o_start_write (void *attributes_data, |
const char **errmsg ATTRIBUTE_UNUSED, |
int *err ATTRIBUTE_UNUSED) |
{ |
struct simple_object_mach_o_attributes *attrs = |
(struct simple_object_mach_o_attributes *) attributes_data; |
struct simple_object_mach_o_attributes *ret; |
/* We're just going to record the attributes, but we need to make a |
copy because the user may delete them. */ |
ret = XNEW (struct simple_object_mach_o_attributes); |
*ret = *attrs; |
return ret; |
} |
/* Write out the header of a Mach-O file. */ |
static int |
simple_object_mach_o_write_header (simple_object_write *sobj, int descriptor, |
size_t nsects, const char **errmsg, |
int *err) |
{ |
struct simple_object_mach_o_attributes *attrs = |
(struct simple_object_mach_o_attributes *) sobj->data; |
void (*set_32) (unsigned char *, unsigned int); |
unsigned char hdrbuf[sizeof (struct mach_o_header_64)]; |
unsigned char *hdr; |
size_t wrsize; |
set_32 = (attrs->is_big_endian |
? simple_object_set_big_32 |
: simple_object_set_little_32); |
memset (hdrbuf, 0, sizeof hdrbuf); |
/* The 32-bit and 64-bit headers start out the same. */ |
hdr = &hdrbuf[0]; |
set_32 (hdr + offsetof (struct mach_o_header_32, magic), attrs->magic); |
set_32 (hdr + offsetof (struct mach_o_header_32, cputype), attrs->cputype); |
set_32 (hdr + offsetof (struct mach_o_header_32, cpusubtype), |
attrs->cpusubtype); |
set_32 (hdr + offsetof (struct mach_o_header_32, filetype), MACH_O_MH_OBJECT); |
set_32 (hdr + offsetof (struct mach_o_header_32, ncmds), 1); |
set_32 (hdr + offsetof (struct mach_o_header_32, flags), attrs->flags); |
if (attrs->magic == MACH_O_MH_MAGIC) |
{ |
wrsize = sizeof (struct mach_o_header_32); |
set_32 (hdr + offsetof (struct mach_o_header_32, sizeofcmds), |
(sizeof (struct mach_o_segment_command_32) |
+ nsects * sizeof (struct mach_o_section_32))); |
} |
else |
{ |
set_32 (hdr + offsetof (struct mach_o_header_64, sizeofcmds), |
(sizeof (struct mach_o_segment_command_64) |
+ nsects * sizeof (struct mach_o_section_64))); |
set_32 (hdr + offsetof (struct mach_o_header_64, reserved), |
attrs->reserved); |
wrsize = sizeof (struct mach_o_header_64); |
} |
return simple_object_internal_write (descriptor, 0, hdrbuf, wrsize, |
errmsg, err); |
} |
/* Write a Mach-O section header. */ |
static int |
simple_object_mach_o_write_section_header (simple_object_write *sobj, |
int descriptor, |
size_t sechdr_offset, |
const char *name, const char *segn, |
size_t secaddr, size_t secsize, |
size_t offset, unsigned int align, |
const char **errmsg, int *err) |
{ |
struct simple_object_mach_o_attributes *attrs = |
(struct simple_object_mach_o_attributes *) sobj->data; |
void (*set_32) (unsigned char *, unsigned int); |
unsigned char hdrbuf[sizeof (struct mach_o_section_64)]; |
unsigned char *hdr; |
size_t sechdrsize; |
set_32 = (attrs->is_big_endian |
? simple_object_set_big_32 |
: simple_object_set_little_32); |
memset (hdrbuf, 0, sizeof hdrbuf); |
hdr = &hdrbuf[0]; |
if (attrs->magic == MACH_O_MH_MAGIC) |
{ |
strncpy ((char *) hdr + offsetof (struct mach_o_section_32, sectname), |
name, MACH_O_NAME_LEN); |
strncpy ((char *) hdr + offsetof (struct mach_o_section_32, segname), |
segn, MACH_O_NAME_LEN); |
set_32 (hdr + offsetof (struct mach_o_section_32, addr), secaddr); |
set_32 (hdr + offsetof (struct mach_o_section_32, size), secsize); |
set_32 (hdr + offsetof (struct mach_o_section_32, offset), offset); |
set_32 (hdr + offsetof (struct mach_o_section_32, align), align); |
/* reloff left as zero. */ |
/* nreloc left as zero. */ |
set_32 (hdr + offsetof (struct mach_o_section_32, flags), |
MACH_O_S_ATTR_DEBUG); |
/* reserved1 left as zero. */ |
/* reserved2 left as zero. */ |
sechdrsize = sizeof (struct mach_o_section_32); |
} |
else |
{ |
#ifdef UNSIGNED_64BIT_TYPE |
void (*set_64) (unsigned char *, ulong_type); |
set_64 = (attrs->is_big_endian |
? simple_object_set_big_64 |
: simple_object_set_little_64); |
strncpy ((char *) hdr + offsetof (struct mach_o_section_64, sectname), |
name, MACH_O_NAME_LEN); |
strncpy ((char *) hdr + offsetof (struct mach_o_section_64, segname), |
segn, MACH_O_NAME_LEN); |
set_64 (hdr + offsetof (struct mach_o_section_64, addr), secaddr); |
set_64 (hdr + offsetof (struct mach_o_section_64, size), secsize); |
set_32 (hdr + offsetof (struct mach_o_section_64, offset), offset); |
set_32 (hdr + offsetof (struct mach_o_section_64, align), align); |
/* reloff left as zero. */ |
/* nreloc left as zero. */ |
set_32 (hdr + offsetof (struct mach_o_section_64, flags), |
MACH_O_S_ATTR_DEBUG); |
/* reserved1 left as zero. */ |
/* reserved2 left as zero. */ |
/* reserved3 left as zero. */ |
#endif |
sechdrsize = sizeof (struct mach_o_section_64); |
} |
return simple_object_internal_write (descriptor, sechdr_offset, hdr, |
sechdrsize, errmsg, err); |
} |
/* Write out the single (anonymous) segment containing the sections of a Mach-O |
Object file. |
As a GNU extension to mach-o, when the caller specifies a segment name in |
sobj->segment_name, all the sections passed will be output under a single |
mach-o section header. The caller's sections are indexed within this |
'wrapper' section by a table stored in a second mach-o section. Finally, |
arbitrary length section names are permitted by the extension and these are |
stored in a table in a third mach-o section. |
Note that this is only likely to make any sense for the __GNU_LTO segment |
at present. |
If the wrapper extension is not in force, we assume that the section name |
is in the form __SEGMENT_NAME,__section_name as per Mach-O asm. */ |
static int |
simple_object_mach_o_write_segment (simple_object_write *sobj, int descriptor, |
size_t *nsects, const char **errmsg, |
int *err) |
{ |
struct simple_object_mach_o_attributes *attrs = |
(struct simple_object_mach_o_attributes *) sobj->data; |
void (*set_32) (unsigned char *, unsigned int); |
size_t hdrsize; |
size_t seghdrsize; |
size_t sechdrsize; |
size_t cmdsize; |
size_t offset; |
size_t sechdr_offset; |
size_t secaddr; |
unsigned int name_offset; |
simple_object_write_section *section; |
unsigned char hdrbuf[sizeof (struct mach_o_segment_command_64)]; |
unsigned char *hdr; |
size_t nsects_in; |
unsigned int *index; |
char *snames; |
unsigned int sect; |
set_32 = (attrs->is_big_endian |
? simple_object_set_big_32 |
: simple_object_set_little_32); |
/* Write out the sections first. */ |
if (attrs->magic == MACH_O_MH_MAGIC) |
{ |
hdrsize = sizeof (struct mach_o_header_32); |
seghdrsize = sizeof (struct mach_o_segment_command_32); |
sechdrsize = sizeof (struct mach_o_section_32); |
} |
else |
{ |
hdrsize = sizeof (struct mach_o_header_64); |
seghdrsize = sizeof (struct mach_o_segment_command_64); |
sechdrsize = sizeof (struct mach_o_section_64); |
} |
name_offset = 0; |
*nsects = nsects_in = 0; |
/* Count the number of sections we start with. */ |
for (section = sobj->sections; section != NULL; section = section->next) |
nsects_in++; |
if (sobj->segment_name != NULL) |
{ |
/* We will only write 3 sections: wrapped data, index and names. */ |
*nsects = 3; |
/* The index has four entries per wrapped section: |
Section Offset, length, Name offset, length. |
Where the offsets are based at the start of the wrapper and name |
sections respectively. |
The values are stored as 32 bit int for both 32 and 64 bit mach-o |
since the size of a mach-o MH_OBJECT cannot exceed 4G owing to |
other constraints. */ |
index = XNEWVEC (unsigned int, nsects_in * 4); |
/* We now need to figure out the size of the names section. This just |
stores the names as null-terminated c strings, packed without any |
alignment padding. */ |
for (section = sobj->sections, sect = 0; section != NULL; |
section = section->next, sect++) |
{ |
index[sect*4+2] = name_offset; |
index[sect*4+3] = strlen (section->name) + 1; |
name_offset += strlen (section->name) + 1; |
} |
snames = XNEWVEC (char, name_offset); |
} |
else |
{ |
*nsects = nsects_in; |
index = NULL; |
snames = NULL; |
} |
sechdr_offset = hdrsize + seghdrsize; |
cmdsize = seghdrsize + *nsects * sechdrsize; |
offset = hdrsize + cmdsize; |
secaddr = 0; |
for (section = sobj->sections, sect = 0; |
section != NULL; section = section->next, sect++) |
{ |
size_t mask; |
size_t new_offset; |
size_t secsize; |
struct simple_object_write_section_buffer *buffer; |
mask = (1U << section->align) - 1; |
new_offset = offset + mask; |
new_offset &= ~ mask; |
while (new_offset > offset) |
{ |
unsigned char zeroes[16]; |
size_t write; |
memset (zeroes, 0, sizeof zeroes); |
write = new_offset - offset; |
if (write > sizeof zeroes) |
write = sizeof zeroes; |
if (!simple_object_internal_write (descriptor, offset, zeroes, write, |
errmsg, err)) |
return 0; |
offset += write; |
} |
secsize = 0; |
for (buffer = section->buffers; buffer != NULL; buffer = buffer->next) |
{ |
if (!simple_object_internal_write (descriptor, offset + secsize, |
((const unsigned char *) |
buffer->buffer), |
buffer->size, errmsg, err)) |
return 0; |
secsize += buffer->size; |
} |
if (sobj->segment_name != NULL) |
{ |
index[sect*4+0] = (unsigned int) offset; |
index[sect*4+1] = secsize; |
/* Stash the section name in our table. */ |
memcpy (snames + index[sect * 4 + 2], section->name, |
index[sect * 4 + 3]); |
} |
else |
{ |
char namebuf[MACH_O_NAME_LEN + 1]; |
char segnbuf[MACH_O_NAME_LEN + 1]; |
char *comma; |
/* Try to extract segment,section from the input name. */ |
memset (namebuf, 0, sizeof namebuf); |
memset (segnbuf, 0, sizeof segnbuf); |
comma = strchr (section->name, ','); |
if (comma != NULL) |
{ |
int len = comma - section->name; |
len = len > MACH_O_NAME_LEN ? MACH_O_NAME_LEN : len; |
strncpy (namebuf, section->name, len); |
strncpy (segnbuf, comma + 1, MACH_O_NAME_LEN); |
} |
else /* just try to copy the name, leave segment blank. */ |
strncpy (namebuf, section->name, MACH_O_NAME_LEN); |
if (!simple_object_mach_o_write_section_header (sobj, descriptor, |
sechdr_offset, |
namebuf, segnbuf, |
secaddr, secsize, |
offset, |
section->align, |
errmsg, err)) |
return 0; |
sechdr_offset += sechdrsize; |
} |
offset += secsize; |
secaddr += secsize; |
} |
if (sobj->segment_name != NULL) |
{ |
size_t secsize; |
unsigned int i; |
/* Write the section header for the wrapper. */ |
/* Account for any initial aligment - which becomes the alignment for this |
created section. */ |
secsize = (offset - index[0]); |
if (!simple_object_mach_o_write_section_header (sobj, descriptor, |
sechdr_offset, |
GNU_WRAPPER_SECTS, |
sobj->segment_name, |
0 /*secaddr*/, |
secsize, index[0], |
sobj->sections->align, |
errmsg, err)) |
return 0; |
/* Subtract the wrapper section start from the begining of each sub |
section. */ |
for (i = 1; i < nsects_in; ++i) |
index[4 * i] -= index[0]; |
index[0] = 0; |
sechdr_offset += sechdrsize; |
/* Write out the section names. |
... the header ... |
name_offset contains the length of the section. It is not aligned. */ |
if (!simple_object_mach_o_write_section_header (sobj, descriptor, |
sechdr_offset, |
GNU_WRAPPER_NAMES, |
sobj->segment_name, |
0 /*secaddr*/, |
name_offset, |
offset, |
0, errmsg, err)) |
return 0; |
/* ... and the content.. */ |
if (!simple_object_internal_write (descriptor, offset, |
(const unsigned char *) snames, |
name_offset, errmsg, err)) |
return 0; |
sechdr_offset += sechdrsize; |
secaddr += name_offset; |
offset += name_offset; |
/* Now do the index, we'll align this to 4 bytes although the read code |
will handle unaligned. */ |
offset += 3; |
offset &= ~0x03; |
if (!simple_object_mach_o_write_section_header (sobj, descriptor, |
sechdr_offset, |
GNU_WRAPPER_INDEX, |
sobj->segment_name, |
0 /*secaddr*/, |
nsects_in * 16, |
offset, |
2, errmsg, err)) |
return 0; |
/* ... and the content.. */ |
if (!simple_object_internal_write (descriptor, offset, |
(const unsigned char *) index, |
nsects_in*16, errmsg, err)) |
return 0; |
XDELETEVEC (index); |
XDELETEVEC (snames); |
} |
/* Write out the segment header. */ |
memset (hdrbuf, 0, sizeof hdrbuf); |
hdr = &hdrbuf[0]; |
if (attrs->magic == MACH_O_MH_MAGIC) |
{ |
set_32 (hdr + offsetof (struct mach_o_segment_command_32, cmd), |
MACH_O_LC_SEGMENT); |
set_32 (hdr + offsetof (struct mach_o_segment_command_32, cmdsize), |
cmdsize); |
/* MH_OBJECTS have a single, anonymous, segment - so the segment name |
is left empty. */ |
/* vmaddr left as zero. */ |
/* vmsize left as zero. */ |
set_32 (hdr + offsetof (struct mach_o_segment_command_32, fileoff), |
hdrsize + cmdsize); |
set_32 (hdr + offsetof (struct mach_o_segment_command_32, filesize), |
offset - (hdrsize + cmdsize)); |
/* maxprot left as zero. */ |
/* initprot left as zero. */ |
set_32 (hdr + offsetof (struct mach_o_segment_command_32, nsects), |
*nsects); |
/* flags left as zero. */ |
} |
else |
{ |
#ifdef UNSIGNED_64BIT_TYPE |
void (*set_64) (unsigned char *, ulong_type); |
set_64 = (attrs->is_big_endian |
? simple_object_set_big_64 |
: simple_object_set_little_64); |
set_32 (hdr + offsetof (struct mach_o_segment_command_64, cmd), |
MACH_O_LC_SEGMENT); |
set_32 (hdr + offsetof (struct mach_o_segment_command_64, cmdsize), |
cmdsize); |
/* MH_OBJECTS have a single, anonymous, segment - so the segment name |
is left empty. */ |
/* vmaddr left as zero. */ |
/* vmsize left as zero. */ |
set_64 (hdr + offsetof (struct mach_o_segment_command_64, fileoff), |
hdrsize + cmdsize); |
set_64 (hdr + offsetof (struct mach_o_segment_command_64, filesize), |
offset - (hdrsize + cmdsize)); |
/* maxprot left as zero. */ |
/* initprot left as zero. */ |
set_32 (hdr + offsetof (struct mach_o_segment_command_64, nsects), |
*nsects); |
/* flags left as zero. */ |
#endif |
} |
return simple_object_internal_write (descriptor, hdrsize, hdr, seghdrsize, |
errmsg, err); |
} |
/* Write out a complete Mach-O file. */ |
static const char * |
simple_object_mach_o_write_to_file (simple_object_write *sobj, int descriptor, |
int *err) |
{ |
size_t nsects = 0; |
const char *errmsg; |
if (!simple_object_mach_o_write_segment (sobj, descriptor, &nsects, |
&errmsg, err)) |
return errmsg; |
if (!simple_object_mach_o_write_header (sobj, descriptor, nsects, |
&errmsg, err)) |
return errmsg; |
return NULL; |
} |
/* Release the private data for an simple_object_write structure. */ |
static void |
simple_object_mach_o_release_write (void *data) |
{ |
XDELETE (data); |
} |
/* The Mach-O functions. */ |
const struct simple_object_functions simple_object_mach_o_functions = |
{ |
simple_object_mach_o_match, |
simple_object_mach_o_find_sections, |
simple_object_mach_o_fetch_attributes, |
simple_object_mach_o_release_read, |
simple_object_mach_o_attributes_merge, |
simple_object_mach_o_release_attributes, |
simple_object_mach_o_start_write, |
simple_object_mach_o_write_to_file, |
simple_object_mach_o_release_write |
}; |
/contrib/toolchain/binutils/libiberty/simple-object-xcoff.c |
---|
0,0 → 1,898 |
/* simple-object-coff.c -- routines to manipulate XCOFF object files. |
Copyright 2013 Free Software Foundation, Inc. |
Written by Ian Lance Taylor, Google and David Edelsohn, IBM. |
This program is free software; you can redistribute it and/or modify it |
under the terms of the GNU General Public License as published by the |
Free Software Foundation; either version 2, or (at your option) any |
later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
#include "config.h" |
#include "libiberty.h" |
#include "simple-object.h" |
#include <errno.h> |
#include <stddef.h> |
#ifdef HAVE_STDLIB_H |
#include <stdlib.h> |
#endif |
#ifdef HAVE_STDINT_H |
#include <stdint.h> |
#endif |
#ifdef HAVE_STRING_H |
#include <string.h> |
#endif |
#ifdef HAVE_INTTYPES_H |
#include <inttypes.h> |
#endif |
#include "simple-object-common.h" |
/* XCOFF structures and constants. */ |
/* XCOFF file header. */ |
struct external_filehdr |
{ |
unsigned char f_magic[2]; /* magic number */ |
unsigned char f_nscns[2]; /* number of sections */ |
unsigned char f_timdat[4]; /* time & date stamp */ |
union |
{ |
struct |
{ |
unsigned char f_symptr[4]; /* file pointer to symtab */ |
unsigned char f_nsyms[4]; /* number of symtab entries */ |
unsigned char f_opthdr[2]; /* sizeof(optional hdr) */ |
unsigned char f_flags[2]; /* flags */ |
} xcoff32; |
struct |
{ |
unsigned char f_symptr[8]; /* file pointer to symtab */ |
unsigned char f_opthdr[2]; /* sizeof(optional hdr) */ |
unsigned char f_flags[2]; /* flags */ |
unsigned char f_nsyms[4]; /* number of symtab entries */ |
} xcoff64; |
} u; |
}; |
/* Bits for filehdr f_flags field. */ |
#define F_EXEC (0x0002) |
/* The known values of f_magic in an XCOFF file header. */ |
#define U802WRMAGIC 0730 /* Writeable text segments. */ |
#define U802ROMAGIC 0735 /* Readonly sharable text segments. */ |
#define U802TOCMAGIC 0737 /* Readonly text segments and TOC. */ |
#define U803XTOCMAGIC 0757 /* Aix 4.3 64-bit XCOFF. */ |
#define U64_TOCMAGIC 0767 /* AIX 5+ 64-bit XCOFF. */ |
/* XCOFF section header. */ |
struct external_scnhdr |
{ |
unsigned char s_name[8]; /* section name */ |
union |
{ |
struct |
{ |
unsigned char s_paddr[4]; /* physical address, aliased s_nlib */ |
unsigned char s_vaddr[4]; /* virtual address */ |
unsigned char s_size[4]; /* section size */ |
unsigned char s_scnptr[4]; /* file ptr to raw data for section */ |
unsigned char s_relptr[4]; /* file ptr to relocation */ |
unsigned char s_lnnoptr[4]; /* file ptr to line numbers */ |
unsigned char s_nreloc[2]; /* number of relocation entries */ |
unsigned char s_nlnno[2]; /* number of line number entries */ |
unsigned char s_flags[4]; /* flags */ |
} xcoff32; |
struct |
{ |
unsigned char s_paddr[8]; /* physical address, aliased s_nlib */ |
unsigned char s_vaddr[8]; /* virtual address */ |
unsigned char s_size[8]; /* section size */ |
unsigned char s_scnptr[8]; /* file ptr to raw data for section */ |
unsigned char s_relptr[8]; /* file ptr to relocation */ |
unsigned char s_lnnoptr[8]; /* file ptr to line numbers */ |
unsigned char s_nreloc[4]; /* number of relocation entries */ |
unsigned char s_nlnno[4]; /* number of line number entries */ |
unsigned char s_flags[4]; /* flags */ |
} xcoff64; |
} u; |
}; |
#define SCNHSZ32 (40) |
#define SCNHSZ64 (68) |
/* The length of the s_name field in struct external_scnhdr. */ |
#define SCNNMLEN (8) |
/* Bits for scnhdr s_flags field. */ |
#define STYP_DATA 0x40 |
/* XCOFF symbol table entry. */ |
#define N_SYMNMLEN (8) /* # characters in a symbol name */ |
/* The format of an XCOFF symbol-table entry. */ |
struct external_syment |
{ |
union { |
struct { |
union { |
/* The name of the symbol. There is an implicit null character |
after the end of the array. */ |
char n_name[N_SYMNMLEN]; |
struct { |
/* If n_zeroes is zero, n_offset is the offset the name from |
the start of the string table. */ |
unsigned char n_zeroes[4]; |
unsigned char n_offset[4]; |
} n; |
} n; |
/* The symbol's value. */ |
unsigned char n_value[4]; |
} xcoff32; |
struct { |
/* The symbol's value. */ |
unsigned char n_value[8]; |
/* The offset of the symbol from the start of the string table. */ |
unsigned char n_offset[4]; |
} xcoff64; |
} u; |
/* The number of the section to which this symbol belongs. */ |
unsigned char n_scnum[2]; |
/* The type of symbol. (It can be interpreted as an n_lang |
and an n_cpu byte, but we don't care about that here.) */ |
unsigned char n_type[2]; |
/* The class of symbol (a C_* value). */ |
unsigned char n_sclass[1]; |
/* The number of auxiliary symbols attached to this entry. */ |
unsigned char n_numaux[1]; |
}; |
#define SYMESZ (18) |
/* Length allowed for filename in aux sym format 4. */ |
#define FILNMLEN (14) |
/* Omits x_sym and other unused variants. */ |
union external_auxent |
{ |
/* Aux sym format 4: file. */ |
union |
{ |
char x_fname[FILNMLEN]; |
struct |
{ |
unsigned char x_zeroes[4]; |
unsigned char x_offset[4]; |
unsigned char x_pad[FILNMLEN-8]; |
unsigned char x_ftype; |
} _x; |
} x_file; |
/* Aux sym format 5: section. */ |
struct |
{ |
unsigned char x_scnlen[4]; /* section length */ |
unsigned char x_nreloc[2]; /* # relocation entries */ |
unsigned char x_nlinno[2]; /* # line numbers */ |
} x_scn; |
/* CSECT auxiliary entry. */ |
union |
{ |
struct |
{ |
struct |
{ |
unsigned char x_scnlen[4]; /* csect length */ |
unsigned char x_parmhash[4]; /* parm type hash index */ |
unsigned char x_snhash[2]; /* sect num with parm hash */ |
unsigned char x_smtyp; /* symbol align and type */ |
unsigned char x_smclas; /* storage mapping class */ |
unsigned char x_stab; /* dbx stab info index */ |
unsigned char x_snstab[2]; /* sect num with dbx stab */ |
} x_csect; |
} xcoff32; |
struct |
{ |
struct |
{ |
unsigned char x_scnlen_lo[4]; /* csect length */ |
unsigned char x_parmhash[4]; /* parm type hash index */ |
unsigned char x_snhash[2]; /* sect num with parm hash */ |
unsigned char x_smtyp; /* symbol align and type */ |
unsigned char x_smclas; /* storage mapping class */ |
unsigned char x_scnlen_hi[4]; |
unsigned char pad; |
unsigned char x_auxtype; |
} x_csect; |
} xcoff64; |
} u; |
/* SECTION/DWARF auxiliary entry. */ |
struct |
{ |
unsigned char x_scnlen[4]; /* section length */ |
unsigned char pad1[4]; |
unsigned char x_nreloc[4]; /* number RLDs */ |
} x_sect; |
}; |
/* Symbol-related constants. */ |
#define N_DEBUG (-2) |
#define IMAGE_SYM_TYPE_NULL (0) |
#define IMAGE_SYM_DTYPE_NULL (0) |
#define IMAGE_SYM_CLASS_STATIC (3) |
#define IMAGE_SYM_CLASS_FILE (103) |
#define IMAGE_SYM_TYPE \ |
((IMAGE_SYM_DTYPE_NULL << 4) | IMAGE_SYM_TYPE_NULL) |
#define C_STAT (3) |
#define C_FILE (103) |
/* Private data for an simple_object_read. */ |
struct simple_object_xcoff_read |
{ |
/* Magic number. */ |
unsigned short magic; |
/* Number of sections. */ |
unsigned short nscns; |
/* File offset of symbol table. */ |
off_t symptr; |
/* Number of symbol table entries. */ |
unsigned int nsyms; |
/* Flags. */ |
unsigned short flags; |
/* Offset of section headers in file. */ |
off_t scnhdr_offset; |
}; |
/* Private data for an simple_object_attributes. */ |
struct simple_object_xcoff_attributes |
{ |
/* Magic number. */ |
unsigned short magic; |
/* Flags. */ |
unsigned short flags; |
}; |
/* See if we have a XCOFF file. */ |
static void * |
simple_object_xcoff_match (unsigned char header[SIMPLE_OBJECT_MATCH_HEADER_LEN], |
int descriptor, off_t offset, |
const char *segment_name ATTRIBUTE_UNUSED, |
const char **errmsg, int *err) |
{ |
unsigned short magic; |
unsigned short (*fetch_16) (const unsigned char *); |
unsigned int (*fetch_32) (const unsigned char *); |
ulong_type (*fetch_64) (const unsigned char *); |
unsigned char hdrbuf[sizeof (struct external_filehdr)]; |
struct simple_object_xcoff_read *ocr; |
int u64; |
magic = simple_object_fetch_big_16 (header); |
if (magic != U802TOCMAGIC && magic != U64_TOCMAGIC) |
{ |
*errmsg = NULL; |
*err = 0; |
return NULL; |
} |
fetch_16 = simple_object_fetch_big_16; |
fetch_32 = simple_object_fetch_big_32; |
fetch_64 = simple_object_fetch_big_64; |
if (!simple_object_internal_read (descriptor, offset, hdrbuf, sizeof hdrbuf, |
errmsg, err)) |
return NULL; |
u64 = magic == U64_TOCMAGIC; |
ocr = XNEW (struct simple_object_xcoff_read); |
ocr->magic = magic; |
ocr->nscns = fetch_16 (hdrbuf + offsetof (struct external_filehdr, f_nscns)); |
if (u64) |
{ |
ocr->symptr = fetch_64 (hdrbuf |
+ offsetof (struct external_filehdr, |
u.xcoff64.f_symptr)); |
ocr->nsyms = fetch_32 (hdrbuf + offsetof (struct external_filehdr, |
u.xcoff64.f_nsyms)); |
ocr->scnhdr_offset = (sizeof (struct external_filehdr) |
+ fetch_16 (hdrbuf + offsetof (struct external_filehdr, |
u.xcoff64.f_opthdr))); |
} |
else |
{ |
ocr->symptr = fetch_32 (hdrbuf |
+ offsetof (struct external_filehdr, |
u.xcoff32.f_symptr)); |
ocr->nsyms = fetch_32 (hdrbuf + offsetof (struct external_filehdr, |
u.xcoff32.f_nsyms)); |
ocr->scnhdr_offset = (sizeof (struct external_filehdr) - 4 |
+ fetch_16 (hdrbuf + offsetof (struct external_filehdr, |
u.xcoff32.f_opthdr))); |
} |
return (void *) ocr; |
} |
/* Read the string table in a XCOFF file. */ |
static char * |
simple_object_xcoff_read_strtab (simple_object_read *sobj, size_t *strtab_size, |
const char **errmsg, int *err) |
{ |
struct simple_object_xcoff_read *ocr = |
(struct simple_object_xcoff_read *) sobj->data; |
off_t strtab_offset; |
unsigned char strsizebuf[4]; |
size_t strsize; |
char *strtab; |
strtab_offset = sobj->offset + ocr->symptr |
+ ocr->nsyms * SYMESZ; |
if (!simple_object_internal_read (sobj->descriptor, strtab_offset, |
strsizebuf, 4, errmsg, err)) |
return NULL; |
strsize = simple_object_fetch_big_32 (strsizebuf); |
strtab = XNEWVEC (char, strsize); |
if (!simple_object_internal_read (sobj->descriptor, strtab_offset, |
(unsigned char *) strtab, strsize, errmsg, |
err)) |
{ |
XDELETEVEC (strtab); |
return NULL; |
} |
*strtab_size = strsize; |
return strtab; |
} |
/* Find all sections in a XCOFF file. */ |
static const char * |
simple_object_xcoff_find_sections (simple_object_read *sobj, |
int (*pfn) (void *, const char *, |
off_t offset, off_t length), |
void *data, |
int *err) |
{ |
struct simple_object_xcoff_read *ocr = |
(struct simple_object_xcoff_read *) sobj->data; |
int u64 = ocr->magic == U64_TOCMAGIC; |
size_t scnhdr_size; |
unsigned char *scnbuf; |
const char *errmsg; |
unsigned int (*fetch_32) (const unsigned char *); |
ulong_type (*fetch_64) (const unsigned char *); |
unsigned int nscns; |
char *strtab; |
size_t strtab_size; |
unsigned int i; |
scnhdr_size = u64 ? SCNHSZ64 : SCNHSZ32; |
scnbuf = XNEWVEC (unsigned char, scnhdr_size * ocr->nscns); |
if (!simple_object_internal_read (sobj->descriptor, |
sobj->offset + ocr->scnhdr_offset, |
scnbuf, scnhdr_size * ocr->nscns, &errmsg, |
err)) |
{ |
XDELETEVEC (scnbuf); |
return errmsg; |
} |
fetch_32 = simple_object_fetch_big_32; |
fetch_64 = simple_object_fetch_big_64; |
nscns = ocr->nscns; |
strtab = NULL; |
strtab_size = 0; |
for (i = 0; i < nscns; ++i) |
{ |
unsigned char *scnhdr; |
unsigned char *scnname; |
char namebuf[SCNNMLEN + 1]; |
char *name; |
off_t scnptr; |
unsigned int size; |
scnhdr = scnbuf + i * scnhdr_size; |
scnname = scnhdr + offsetof (struct external_scnhdr, s_name); |
memcpy (namebuf, scnname, SCNNMLEN); |
namebuf[SCNNMLEN] = '\0'; |
name = &namebuf[0]; |
if (namebuf[0] == '/') |
{ |
size_t strindex; |
char *end; |
strindex = strtol (namebuf + 1, &end, 10); |
if (*end == '\0') |
{ |
/* The real section name is found in the string |
table. */ |
if (strtab == NULL) |
{ |
strtab = simple_object_xcoff_read_strtab (sobj, |
&strtab_size, |
&errmsg, err); |
if (strtab == NULL) |
{ |
XDELETEVEC (scnbuf); |
return errmsg; |
} |
} |
if (strindex < 4 || strindex >= strtab_size) |
{ |
XDELETEVEC (strtab); |
XDELETEVEC (scnbuf); |
*err = 0; |
return "section string index out of range"; |
} |
name = strtab + strindex; |
} |
} |
if (u64) |
{ |
scnptr = fetch_64 (scnhdr + offsetof (struct external_scnhdr, |
u.xcoff64.s_scnptr)); |
size = fetch_64 (scnhdr + offsetof (struct external_scnhdr, |
u.xcoff64.s_size)); |
} |
else |
{ |
scnptr = fetch_32 (scnhdr + offsetof (struct external_scnhdr, |
u.xcoff32.s_scnptr)); |
size = fetch_32 (scnhdr + offsetof (struct external_scnhdr, |
u.xcoff32.s_size)); |
} |
if (!(*pfn) (data, name, scnptr, size)) |
break; |
} |
if (strtab != NULL) |
XDELETEVEC (strtab); |
XDELETEVEC (scnbuf); |
return NULL; |
} |
/* Fetch the attributes for an simple_object_read. */ |
static void * |
simple_object_xcoff_fetch_attributes (simple_object_read *sobj, |
const char **errmsg ATTRIBUTE_UNUSED, |
int *err ATTRIBUTE_UNUSED) |
{ |
struct simple_object_xcoff_read *ocr = |
(struct simple_object_xcoff_read *) sobj->data; |
struct simple_object_xcoff_attributes *ret; |
ret = XNEW (struct simple_object_xcoff_attributes); |
ret->magic = ocr->magic; |
ret->flags = ocr->flags; |
return ret; |
} |
/* Release the private data for an simple_object_read. */ |
static void |
simple_object_xcoff_release_read (void *data) |
{ |
XDELETE (data); |
} |
/* Compare two attributes structures. */ |
static const char * |
simple_object_xcoff_attributes_merge (void *todata, void *fromdata, int *err) |
{ |
struct simple_object_xcoff_attributes *to = |
(struct simple_object_xcoff_attributes *) todata; |
struct simple_object_xcoff_attributes *from = |
(struct simple_object_xcoff_attributes *) fromdata; |
if (to->magic != from->magic) |
{ |
*err = 0; |
return "XCOFF object format mismatch"; |
} |
return NULL; |
} |
/* Release the private data for an attributes structure. */ |
static void |
simple_object_xcoff_release_attributes (void *data) |
{ |
XDELETE (data); |
} |
/* Prepare to write out a file. */ |
static void * |
simple_object_xcoff_start_write (void *attributes_data, |
const char **errmsg ATTRIBUTE_UNUSED, |
int *err ATTRIBUTE_UNUSED) |
{ |
struct simple_object_xcoff_attributes *attrs = |
(struct simple_object_xcoff_attributes *) attributes_data; |
struct simple_object_xcoff_attributes *ret; |
/* We're just going to record the attributes, but we need to make a |
copy because the user may delete them. */ |
ret = XNEW (struct simple_object_xcoff_attributes); |
*ret = *attrs; |
return ret; |
} |
/* Write out a XCOFF filehdr. */ |
static int |
simple_object_xcoff_write_filehdr (simple_object_write *sobj, int descriptor, |
unsigned int nscns, size_t symtab_offset, |
unsigned int nsyms, const char **errmsg, |
int *err) |
{ |
struct simple_object_xcoff_attributes *attrs = |
(struct simple_object_xcoff_attributes *) sobj->data; |
int u64 = attrs->magic == U64_TOCMAGIC; |
unsigned char hdrbuf[sizeof (struct external_filehdr)]; |
unsigned char *hdr; |
void (*set_16) (unsigned char *, unsigned short); |
void (*set_32) (unsigned char *, unsigned int); |
void (*set_64) (unsigned char *, ulong_type); |
hdr = &hdrbuf[0]; |
set_16 = simple_object_set_big_16; |
set_32 = simple_object_set_big_32; |
set_64 = simple_object_set_big_64; |
memset (hdr, 0, sizeof (struct external_filehdr)); |
set_16 (hdr + offsetof (struct external_filehdr, f_magic), attrs->magic); |
set_16 (hdr + offsetof (struct external_filehdr, f_nscns), nscns); |
/* f_timdat left as zero. */ |
if (u64) |
{ |
set_64 (hdr + offsetof (struct external_filehdr, u.xcoff64.f_symptr), |
symtab_offset); |
set_32 (hdr + offsetof (struct external_filehdr, u.xcoff64.f_nsyms), |
nsyms); |
/* f_opthdr left as zero. */ |
set_16 (hdr + offsetof (struct external_filehdr, u.xcoff64.f_flags), |
attrs->flags); |
} |
else |
{ |
set_32 (hdr + offsetof (struct external_filehdr, u.xcoff64.f_symptr), |
symtab_offset); |
set_32 (hdr + offsetof (struct external_filehdr, u.xcoff64.f_nsyms), |
nsyms); |
/* f_opthdr left as zero. */ |
set_16 (hdr + offsetof (struct external_filehdr, u.xcoff64.f_flags), |
attrs->flags); |
} |
return simple_object_internal_write (descriptor, 0, hdrbuf, |
sizeof (struct external_filehdr), |
errmsg, err); |
} |
/* Write out a XCOFF section header. */ |
static int |
simple_object_xcoff_write_scnhdr (simple_object_write *sobj, |
int descriptor, |
const char *name, size_t *name_offset, |
off_t scnhdr_offset, size_t scnsize, |
off_t offset, unsigned int align, |
const char **errmsg, int *err) |
{ |
struct simple_object_xcoff_read *ocr = |
(struct simple_object_xcoff_read *) sobj->data; |
int u64 = ocr->magic == U64_TOCMAGIC; |
void (*set_32) (unsigned char *, unsigned int); |
void (*set_64) (unsigned char *, unsigned int); |
unsigned char hdrbuf[sizeof (struct external_scnhdr)]; |
unsigned char *hdr; |
size_t namelen; |
unsigned int flags; |
set_32 = simple_object_set_big_32; |
set_64 = simple_object_set_big_32; |
memset (hdrbuf, 0, sizeof hdrbuf); |
hdr = &hdrbuf[0]; |
namelen = strlen (name); |
if (namelen <= SCNNMLEN) |
strncpy ((char *) hdr + offsetof (struct external_scnhdr, s_name), |
name, SCNNMLEN); |
else |
{ |
snprintf ((char *) hdr + offsetof (struct external_scnhdr, s_name), |
SCNNMLEN, "/%lu", (unsigned long) *name_offset); |
*name_offset += namelen + 1; |
} |
/* s_paddr left as zero. */ |
/* s_vaddr left as zero. */ |
if (u64) |
{ |
set_64 (hdr + offsetof (struct external_scnhdr, u.xcoff64.s_size), |
scnsize); |
set_64 (hdr + offsetof (struct external_scnhdr, u.xcoff64.s_scnptr), |
offset); |
} |
else |
{ |
set_32 (hdr + offsetof (struct external_scnhdr, u.xcoff32.s_size), |
scnsize); |
set_32 (hdr + offsetof (struct external_scnhdr, u.xcoff32.s_scnptr), |
offset); |
} |
/* s_relptr left as zero. */ |
/* s_lnnoptr left as zero. */ |
/* s_nreloc left as zero. */ |
/* s_nlnno left as zero. */ |
flags = STYP_DATA; |
if (align > 13) |
align = 13; |
if (u64) |
set_32 (hdr + offsetof (struct external_scnhdr, u.xcoff64.s_flags), flags); |
else |
set_32 (hdr + offsetof (struct external_scnhdr, u.xcoff32.s_flags), flags); |
return simple_object_internal_write (descriptor, scnhdr_offset, hdrbuf, |
u64 ? SCNHSZ64 : SCNHSZ32, |
errmsg, err); |
} |
/* Write out a complete XCOFF file. */ |
static const char * |
simple_object_xcoff_write_to_file (simple_object_write *sobj, int descriptor, |
int *err) |
{ |
struct simple_object_xcoff_read *ocr = |
(struct simple_object_xcoff_read *) sobj->data; |
int u64 = ocr->magic == U64_TOCMAGIC; |
unsigned int nscns, secnum; |
simple_object_write_section *section; |
off_t scnhdr_offset; |
size_t symtab_offset; |
off_t secsym_offset; |
unsigned int nsyms; |
size_t offset; |
size_t name_offset; |
const char *errmsg; |
unsigned char strsizebuf[4]; |
/* The interface doesn't give us access to the name of the input file |
yet. We want to use its basename for the FILE symbol. This is |
what 'gas' uses when told to assemble from stdin. */ |
const char *source_filename = "fake"; |
size_t sflen; |
union |
{ |
struct external_syment sym; |
union external_auxent aux; |
} syms[2]; |
void (*set_16) (unsigned char *, unsigned short); |
void (*set_32) (unsigned char *, unsigned int); |
set_16 = simple_object_set_big_16; |
set_32 = simple_object_set_big_32; |
nscns = 0; |
for (section = sobj->sections; section != NULL; section = section->next) |
++nscns; |
scnhdr_offset = sizeof (struct external_filehdr) - (u64 ? 4 : 0); |
offset = scnhdr_offset + nscns * (u64 ? SCNHSZ64 : SCNHSZ32); |
name_offset = 4; |
for (section = sobj->sections; section != NULL; section = section->next) |
{ |
size_t mask; |
size_t new_offset; |
size_t scnsize; |
struct simple_object_write_section_buffer *buffer; |
mask = (1U << section->align) - 1; |
new_offset = offset & mask; |
new_offset &= ~ mask; |
while (new_offset > offset) |
{ |
unsigned char zeroes[16]; |
size_t write; |
memset (zeroes, 0, sizeof zeroes); |
write = new_offset - offset; |
if (write > sizeof zeroes) |
write = sizeof zeroes; |
if (!simple_object_internal_write (descriptor, offset, zeroes, write, |
&errmsg, err)) |
return errmsg; |
} |
scnsize = 0; |
for (buffer = section->buffers; buffer != NULL; buffer = buffer->next) |
{ |
if (!simple_object_internal_write (descriptor, offset + scnsize, |
((const unsigned char *) |
buffer->buffer), |
buffer->size, &errmsg, err)) |
return errmsg; |
scnsize += buffer->size; |
} |
if (!simple_object_xcoff_write_scnhdr (sobj, descriptor, section->name, |
&name_offset, scnhdr_offset, |
scnsize, offset, section->align, |
&errmsg, err)) |
return errmsg; |
scnhdr_offset += u64 ? SCNHSZ64 : SCNHSZ32; |
offset += scnsize; |
} |
/* Symbol table is always half-word aligned. */ |
offset += (offset & 1); |
/* There is a file symbol and a section symbol per section, |
and each of these has a single auxiliary symbol following. */ |
nsyms = 2 * (nscns + 1); |
symtab_offset = offset; |
/* Advance across space reserved for symbol table to locate |
start of string table. */ |
offset += nsyms * SYMESZ; |
/* Write out file symbol. */ |
memset (&syms[0], 0, sizeof (syms)); |
if (!u64) |
strcpy ((char *)&syms[0].sym.u.xcoff32.n.n_name[0], ".file"); |
set_16 (&syms[0].sym.n_scnum[0], N_DEBUG); |
set_16 (&syms[0].sym.n_type[0], IMAGE_SYM_TYPE); |
syms[0].sym.n_sclass[0] = C_FILE; |
syms[0].sym.n_numaux[0] = 1; |
/* The name need not be nul-terminated if it fits into the x_fname field |
directly, but must be if it has to be placed into the string table. */ |
sflen = strlen (source_filename); |
if (sflen <= FILNMLEN) |
memcpy (&syms[1].aux.x_file.x_fname[0], source_filename, sflen); |
else |
{ |
set_32 (&syms[1].aux.x_file._x.x_offset[0], name_offset); |
if (!simple_object_internal_write (descriptor, offset + name_offset, |
((const unsigned char *) |
source_filename), |
sflen + 1, &errmsg, err)) |
return errmsg; |
name_offset += strlen (source_filename) + 1; |
} |
if (!simple_object_internal_write (descriptor, symtab_offset, |
(const unsigned char *) &syms[0], |
sizeof (syms), &errmsg, err)) |
return errmsg; |
/* Write the string table length, followed by the strings and section |
symbols in step with each other. */ |
set_32 (strsizebuf, name_offset); |
if (!simple_object_internal_write (descriptor, offset, strsizebuf, 4, |
&errmsg, err)) |
return errmsg; |
name_offset = 4; |
secsym_offset = symtab_offset + sizeof (syms); |
memset (&syms[0], 0, sizeof (syms)); |
set_16 (&syms[0].sym.n_type[0], IMAGE_SYM_TYPE); |
syms[0].sym.n_sclass[0] = C_STAT; |
syms[0].sym.n_numaux[0] = 1; |
secnum = 1; |
for (section = sobj->sections; section != NULL; section = section->next) |
{ |
size_t namelen; |
size_t scnsize; |
struct simple_object_write_section_buffer *buffer; |
namelen = strlen (section->name); |
set_16 (&syms[0].sym.n_scnum[0], secnum++); |
scnsize = 0; |
for (buffer = section->buffers; buffer != NULL; buffer = buffer->next) |
scnsize += buffer->size; |
set_32 (&syms[1].aux.x_scn.x_scnlen[0], scnsize); |
if (namelen > SCNNMLEN) |
{ |
set_32 (&syms[0].sym.u.xcoff32.n.n.n_zeroes[0], 0); |
set_32 (&syms[0].sym.u.xcoff32.n.n.n_offset[0], name_offset); |
if (!simple_object_internal_write (descriptor, offset + name_offset, |
((const unsigned char *) |
section->name), |
namelen + 1, &errmsg, err)) |
return errmsg; |
name_offset += namelen + 1; |
} |
else |
{ |
memcpy (&syms[0].sym.u.xcoff32.n.n_name[0], section->name, |
strlen (section->name)); |
memset (&syms[0].sym.u.xcoff32.n.n_name[strlen (section->name)], 0, |
N_SYMNMLEN - strlen (section->name)); |
} |
if (!simple_object_internal_write (descriptor, secsym_offset, |
(const unsigned char *) &syms[0], |
sizeof (syms), &errmsg, err)) |
return errmsg; |
secsym_offset += sizeof (syms); |
} |
if (!simple_object_xcoff_write_filehdr (sobj, descriptor, nscns, |
symtab_offset, nsyms, &errmsg, err)) |
return errmsg; |
return NULL; |
} |
/* Release the private data for an simple_object_write structure. */ |
static void |
simple_object_xcoff_release_write (void *data) |
{ |
XDELETE (data); |
} |
/* The XCOFF functions. */ |
const struct simple_object_functions simple_object_xcoff_functions = |
{ |
simple_object_xcoff_match, |
simple_object_xcoff_find_sections, |
simple_object_xcoff_fetch_attributes, |
simple_object_xcoff_release_read, |
simple_object_xcoff_attributes_merge, |
simple_object_xcoff_release_attributes, |
simple_object_xcoff_start_write, |
simple_object_xcoff_write_to_file, |
simple_object_xcoff_release_write |
}; |
/contrib/toolchain/binutils/libiberty/simple-object.c |
---|
0,0 → 1,423 |
/* simple-object.c -- simple routines to read and write object files. |
Copyright 2010 Free Software Foundation, Inc. |
Written by Ian Lance Taylor, Google. |
This program is free software; you can redistribute it and/or modify it |
under the terms of the GNU General Public License as published by the |
Free Software Foundation; either version 2, or (at your option) any |
later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
#include "config.h" |
#include "libiberty.h" |
#include "simple-object.h" |
#include <errno.h> |
#ifdef HAVE_STDLIB_H |
#include <stdlib.h> |
#endif |
#ifdef HAVE_STDINT_H |
#include <stdint.h> |
#endif |
#ifdef HAVE_STRING_H |
#include <string.h> |
#endif |
#ifdef HAVE_INTTYPES_H |
#include <inttypes.h> |
#endif |
#ifndef SEEK_SET |
#define SEEK_SET 0 |
#endif |
#include "simple-object-common.h" |
/* The known object file formats. */ |
static const struct simple_object_functions * const format_functions[] = |
{ |
&simple_object_elf_functions, |
&simple_object_mach_o_functions, |
&simple_object_coff_functions, |
&simple_object_xcoff_functions |
}; |
/* Read data from a file using the simple_object error reporting |
conventions. */ |
int |
simple_object_internal_read (int descriptor, off_t offset, |
unsigned char *buffer, size_t size, |
const char **errmsg, int *err) |
{ |
ssize_t got; |
if (lseek (descriptor, offset, SEEK_SET) < 0) |
{ |
*errmsg = "lseek"; |
*err = errno; |
return 0; |
} |
got = read (descriptor, buffer, size); |
if (got < 0) |
{ |
*errmsg = "read"; |
*err = errno; |
return 0; |
} |
if ((size_t) got < size) |
{ |
*errmsg = "file too short"; |
*err = 0; |
return 0; |
} |
return 1; |
} |
/* Write data to a file using the simple_object error reporting |
conventions. */ |
int |
simple_object_internal_write (int descriptor, off_t offset, |
const unsigned char *buffer, size_t size, |
const char **errmsg, int *err) |
{ |
ssize_t wrote; |
if (lseek (descriptor, offset, SEEK_SET) < 0) |
{ |
*errmsg = "lseek"; |
*err = errno; |
return 0; |
} |
wrote = write (descriptor, buffer, size); |
if (wrote < 0) |
{ |
*errmsg = "write"; |
*err = errno; |
return 0; |
} |
if ((size_t) wrote < size) |
{ |
*errmsg = "short write"; |
*err = 0; |
return 0; |
} |
return 1; |
} |
/* Open for read. */ |
simple_object_read * |
simple_object_start_read (int descriptor, off_t offset, |
const char *segment_name, const char **errmsg, |
int *err) |
{ |
unsigned char header[SIMPLE_OBJECT_MATCH_HEADER_LEN]; |
size_t len, i; |
if (!simple_object_internal_read (descriptor, offset, header, |
SIMPLE_OBJECT_MATCH_HEADER_LEN, |
errmsg, err)) |
return NULL; |
len = sizeof (format_functions) / sizeof (format_functions[0]); |
for (i = 0; i < len; ++i) |
{ |
void *data; |
data = format_functions[i]->match (header, descriptor, offset, |
segment_name, errmsg, err); |
if (data != NULL) |
{ |
simple_object_read *ret; |
ret = XNEW (simple_object_read); |
ret->descriptor = descriptor; |
ret->offset = offset; |
ret->functions = format_functions[i]; |
ret->data = data; |
return ret; |
} |
} |
*errmsg = "file not recognized"; |
*err = 0; |
return NULL; |
} |
/* Find all sections. */ |
const char * |
simple_object_find_sections (simple_object_read *sobj, |
int (*pfn) (void *, const char *, off_t, off_t), |
void *data, |
int *err) |
{ |
return sobj->functions->find_sections (sobj, pfn, data, err); |
} |
/* Internal data passed to find_one_section. */ |
struct find_one_section_data |
{ |
/* The section we are looking for. */ |
const char *name; |
/* Where to store the section offset. */ |
off_t *offset; |
/* Where to store the section length. */ |
off_t *length; |
/* Set if the name is found. */ |
int found; |
}; |
/* Internal function passed to find_sections. */ |
static int |
find_one_section (void *data, const char *name, off_t offset, off_t length) |
{ |
struct find_one_section_data *fosd = (struct find_one_section_data *) data; |
if (strcmp (name, fosd->name) != 0) |
return 1; |
*fosd->offset = offset; |
*fosd->length = length; |
fosd->found = 1; |
/* Stop iteration. */ |
return 0; |
} |
/* Find a section. */ |
int |
simple_object_find_section (simple_object_read *sobj, const char *name, |
off_t *offset, off_t *length, |
const char **errmsg, int *err) |
{ |
struct find_one_section_data fosd; |
fosd.name = name; |
fosd.offset = offset; |
fosd.length = length; |
fosd.found = 0; |
*errmsg = simple_object_find_sections (sobj, find_one_section, |
(void *) &fosd, err); |
if (*errmsg != NULL) |
return 0; |
if (!fosd.found) |
return 0; |
return 1; |
} |
/* Fetch attributes. */ |
simple_object_attributes * |
simple_object_fetch_attributes (simple_object_read *sobj, const char **errmsg, |
int *err) |
{ |
void *data; |
simple_object_attributes *ret; |
data = sobj->functions->fetch_attributes (sobj, errmsg, err); |
if (data == NULL) |
return NULL; |
ret = XNEW (simple_object_attributes); |
ret->functions = sobj->functions; |
ret->data = data; |
return ret; |
} |
/* Release an simple_object_read. */ |
void |
simple_object_release_read (simple_object_read *sobj) |
{ |
sobj->functions->release_read (sobj->data); |
XDELETE (sobj); |
} |
/* Merge attributes. */ |
const char * |
simple_object_attributes_merge (simple_object_attributes *to, |
simple_object_attributes *from, |
int *err) |
{ |
if (to->functions != from->functions) |
{ |
*err = 0; |
return "different object file format"; |
} |
return to->functions->attributes_merge (to->data, from->data, err); |
} |
/* Release an attributes structure. */ |
void |
simple_object_release_attributes (simple_object_attributes *attrs) |
{ |
attrs->functions->release_attributes (attrs->data); |
XDELETE (attrs); |
} |
/* Start creating an object file. */ |
simple_object_write * |
simple_object_start_write (simple_object_attributes *attrs, |
const char *segment_name, const char **errmsg, |
int *err) |
{ |
void *data; |
simple_object_write *ret; |
data = attrs->functions->start_write (attrs->data, errmsg, err); |
if (data == NULL) |
return NULL; |
ret = XNEW (simple_object_write); |
ret->functions = attrs->functions; |
ret->segment_name = xstrdup (segment_name); |
ret->sections = NULL; |
ret->last_section = NULL; |
ret->data = data; |
return ret; |
} |
/* Start creating a section. */ |
simple_object_write_section * |
simple_object_write_create_section (simple_object_write *sobj, const char *name, |
unsigned int align, |
const char **errmsg ATTRIBUTE_UNUSED, |
int *err ATTRIBUTE_UNUSED) |
{ |
simple_object_write_section *ret; |
ret = XNEW (simple_object_write_section); |
ret->next = NULL; |
ret->name = xstrdup (name); |
ret->align = align; |
ret->buffers = NULL; |
ret->last_buffer = NULL; |
if (sobj->last_section == NULL) |
{ |
sobj->sections = ret; |
sobj->last_section = ret; |
} |
else |
{ |
sobj->last_section->next = ret; |
sobj->last_section = ret; |
} |
return ret; |
} |
/* Add data to a section. */ |
const char * |
simple_object_write_add_data (simple_object_write *sobj ATTRIBUTE_UNUSED, |
simple_object_write_section *section, |
const void *buffer, |
size_t size, int copy, |
int *err ATTRIBUTE_UNUSED) |
{ |
struct simple_object_write_section_buffer *wsb; |
wsb = XNEW (struct simple_object_write_section_buffer); |
wsb->next = NULL; |
wsb->size = size; |
if (!copy) |
{ |
wsb->buffer = buffer; |
wsb->free_buffer = NULL; |
} |
else |
{ |
wsb->free_buffer = (void *) XNEWVEC (char, size); |
memcpy (wsb->free_buffer, buffer, size); |
wsb->buffer = wsb->free_buffer; |
} |
if (section->last_buffer == NULL) |
{ |
section->buffers = wsb; |
section->last_buffer = wsb; |
} |
else |
{ |
section->last_buffer->next = wsb; |
section->last_buffer = wsb; |
} |
return NULL; |
} |
/* Write the complete object file. */ |
const char * |
simple_object_write_to_file (simple_object_write *sobj, int descriptor, |
int *err) |
{ |
return sobj->functions->write_to_file (sobj, descriptor, err); |
} |
/* Release an simple_object_write. */ |
void |
simple_object_release_write (simple_object_write *sobj) |
{ |
simple_object_write_section *section; |
free (sobj->segment_name); |
section = sobj->sections; |
while (section != NULL) |
{ |
struct simple_object_write_section_buffer *buffer; |
simple_object_write_section *next_section; |
buffer = section->buffers; |
while (buffer != NULL) |
{ |
struct simple_object_write_section_buffer *next_buffer; |
if (buffer->free_buffer != NULL) |
XDELETEVEC (buffer->free_buffer); |
next_buffer = buffer->next; |
XDELETE (buffer); |
buffer = next_buffer; |
} |
next_section = section->next; |
free (section->name); |
XDELETE (section); |
section = next_section; |
} |
sobj->functions->release_write (sobj->data); |
XDELETE (sobj); |
} |
/contrib/toolchain/binutils/libiberty/sort.c |
---|
0,0 → 1,186 |
/* Sorting algorithms. |
Copyright (C) 2000 Free Software Foundation, Inc. |
Contributed by Mark Mitchell <mark@codesourcery.com>. |
This file is part of GNU CC. |
GNU CC is free software; you can redistribute it and/or modify it |
under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2, or (at your option) |
any later version. |
GNU CC is distributed in the hope that it will be useful, but |
WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with GNU CC; see the file COPYING. If not, write to |
the Free Software Foundation, 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
#ifdef HAVE_CONFIG_H |
#include "config.h" |
#endif |
#include "libiberty.h" |
#include "sort.h" |
#ifdef HAVE_LIMITS_H |
#include <limits.h> |
#endif |
#ifdef HAVE_SYS_PARAM_H |
#include <sys/param.h> |
#endif |
#ifdef HAVE_STDLIB_H |
#include <stdlib.h> |
#endif |
#ifdef HAVE_STRING_H |
#include <string.h> |
#endif |
#ifndef UCHAR_MAX |
#define UCHAR_MAX ((unsigned char)(-1)) |
#endif |
/* POINTERS and WORK are both arrays of N pointers. When this |
function returns POINTERS will be sorted in ascending order. */ |
void sort_pointers (size_t n, void **pointers, void **work) |
{ |
/* The type of a single digit. This can be any unsigned integral |
type. When changing this, DIGIT_MAX should be changed as |
well. */ |
typedef unsigned char digit_t; |
/* The maximum value a single digit can have. */ |
#define DIGIT_MAX (UCHAR_MAX + 1) |
/* The Ith entry is the number of elements in *POINTERSP that have I |
in the digit on which we are currently sorting. */ |
unsigned int count[DIGIT_MAX]; |
/* Nonzero if we are running on a big-endian machine. */ |
int big_endian_p; |
size_t i; |
size_t j; |
/* The algorithm used here is radix sort which takes time linear in |
the number of elements in the array. */ |
/* The algorithm here depends on being able to swap the two arrays |
an even number of times. */ |
if ((sizeof (void *) / sizeof (digit_t)) % 2 != 0) |
abort (); |
/* Figure out the endianness of the machine. */ |
for (i = 0, j = 0; i < sizeof (size_t); ++i) |
{ |
j *= (UCHAR_MAX + 1); |
j += i; |
} |
big_endian_p = (((char *)&j)[0] == 0); |
/* Move through the pointer values from least significant to most |
significant digits. */ |
for (i = 0; i < sizeof (void *) / sizeof (digit_t); ++i) |
{ |
digit_t *digit; |
digit_t *bias; |
digit_t *top; |
unsigned int *countp; |
void **pointerp; |
/* The offset from the start of the pointer will depend on the |
endianness of the machine. */ |
if (big_endian_p) |
j = sizeof (void *) / sizeof (digit_t) - i; |
else |
j = i; |
/* Now, perform a stable sort on this digit. We use counting |
sort. */ |
memset (count, 0, DIGIT_MAX * sizeof (unsigned int)); |
/* Compute the address of the appropriate digit in the first and |
one-past-the-end elements of the array. On a little-endian |
machine, the least-significant digit is closest to the front. */ |
bias = ((digit_t *) pointers) + j; |
top = ((digit_t *) (pointers + n)) + j; |
/* Count how many there are of each value. At the end of this |
loop, COUNT[K] will contain the number of pointers whose Ith |
digit is K. */ |
for (digit = bias; |
digit < top; |
digit += sizeof (void *) / sizeof (digit_t)) |
++count[*digit]; |
/* Now, make COUNT[K] contain the number of pointers whose Ith |
digit is less than or equal to K. */ |
for (countp = count + 1; countp < count + DIGIT_MAX; ++countp) |
*countp += countp[-1]; |
/* Now, drop the pointers into their correct locations. */ |
for (pointerp = pointers + n - 1; pointerp >= pointers; --pointerp) |
work[--count[((digit_t *) pointerp)[j]]] = *pointerp; |
/* Swap WORK and POINTERS so that POINTERS contains the sorted |
array. */ |
pointerp = pointers; |
pointers = work; |
work = pointerp; |
} |
} |
/* Everything below here is a unit test for the routines in this |
file. */ |
#ifdef UNIT_TEST |
#include <stdio.h> |
void *xmalloc (size_t n) |
{ |
return malloc (n); |
} |
int main (int argc, char **argv) |
{ |
int k; |
int result; |
size_t i; |
void **pointers; |
void **work; |
if (argc > 1) |
k = atoi (argv[1]); |
else |
k = 10; |
pointers = XNEWVEC (void*, k); |
work = XNEWVEC (void*, k); |
for (i = 0; i < k; ++i) |
{ |
pointers[i] = (void *) random (); |
printf ("%x\n", pointers[i]); |
} |
sort_pointers (k, pointers, work); |
printf ("\nSorted\n\n"); |
result = 0; |
for (i = 0; i < k; ++i) |
{ |
printf ("%x\n", pointers[i]); |
if (i > 0 && (char*) pointers[i] < (char*) pointers[i - 1]) |
result = 1; |
} |
free (pointers); |
free (work); |
return result; |
} |
#endif |
/contrib/toolchain/binutils/libiberty/spaces.c |
---|
0,0 → 1,69 |
/* Allocate memory region filled with spaces. |
Copyright (C) 1991 Free Software Foundation, Inc. |
This file is part of the libiberty library. |
Libiberty is free software; you can redistribute it and/or |
modify it under the terms of the GNU Library General Public |
License as published by the Free Software Foundation; either |
version 2 of the License, or (at your option) any later version. |
Libiberty is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
Library General Public License for more details. |
You should have received a copy of the GNU Library General Public |
License along with libiberty; see the file COPYING.LIB. If |
not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
/* |
@deftypefn Extension char* spaces (int @var{count}) |
Returns a pointer to a memory region filled with the specified |
number of spaces and null terminated. The returned pointer is |
valid until at least the next call. |
@end deftypefn |
*/ |
#ifdef HAVE_CONFIG_H |
#include "config.h" |
#endif |
#include "ansidecl.h" |
#include "libiberty.h" |
#if VMS |
#include <stdlib.h> |
#include <unixlib.h> |
#else |
/* For systems with larger pointers than ints, these must be declared. */ |
extern PTR malloc (size_t); |
extern void free (PTR); |
#endif |
const char * |
spaces (int count) |
{ |
register char *t; |
static char *buf; |
static int maxsize; |
if (count > maxsize) |
{ |
free (buf); |
buf = (char *) malloc (count + 1); |
if (buf == (char *) 0) |
return 0; |
for (t = buf + count ; t != buf ; ) |
{ |
*--t = ' '; |
} |
maxsize = count; |
buf[count] = '\0'; |
} |
return (const char *) (buf + maxsize - count); |
} |
/contrib/toolchain/binutils/libiberty/splay-tree.c |
---|
0,0 → 1,593 |
/* A splay-tree datatype. |
Copyright (C) 1998, 1999, 2000, 2001, 2009, |
2010, 2011 Free Software Foundation, Inc. |
Contributed by Mark Mitchell (mark@markmitchell.com). |
This file is part of GNU CC. |
GNU CC is free software; you can redistribute it and/or modify it |
under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2, or (at your option) |
any later version. |
GNU CC is distributed in the hope that it will be useful, but |
WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with GNU CC; see the file COPYING. If not, write to |
the Free Software Foundation, 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
/* For an easily readable description of splay-trees, see: |
Lewis, Harry R. and Denenberg, Larry. Data Structures and Their |
Algorithms. Harper-Collins, Inc. 1991. */ |
#ifdef HAVE_CONFIG_H |
#include "config.h" |
#endif |
#ifdef HAVE_STDLIB_H |
#include <stdlib.h> |
#endif |
#include <stdio.h> |
#include "libiberty.h" |
#include "splay-tree.h" |
static void splay_tree_delete_helper (splay_tree, splay_tree_node); |
static inline void rotate_left (splay_tree_node *, |
splay_tree_node, splay_tree_node); |
static inline void rotate_right (splay_tree_node *, |
splay_tree_node, splay_tree_node); |
static void splay_tree_splay (splay_tree, splay_tree_key); |
static int splay_tree_foreach_helper (splay_tree_node, |
splay_tree_foreach_fn, void*); |
/* Deallocate NODE (a member of SP), and all its sub-trees. */ |
static void |
splay_tree_delete_helper (splay_tree sp, splay_tree_node node) |
{ |
splay_tree_node pending = 0; |
splay_tree_node active = 0; |
if (!node) |
return; |
#define KDEL(x) if (sp->delete_key) (*sp->delete_key)(x); |
#define VDEL(x) if (sp->delete_value) (*sp->delete_value)(x); |
KDEL (node->key); |
VDEL (node->value); |
/* We use the "key" field to hold the "next" pointer. */ |
node->key = (splay_tree_key)pending; |
pending = (splay_tree_node)node; |
/* Now, keep processing the pending list until there aren't any |
more. This is a little more complicated than just recursing, but |
it doesn't toast the stack for large trees. */ |
while (pending) |
{ |
active = pending; |
pending = 0; |
while (active) |
{ |
splay_tree_node temp; |
/* active points to a node which has its key and value |
deallocated, we just need to process left and right. */ |
if (active->left) |
{ |
KDEL (active->left->key); |
VDEL (active->left->value); |
active->left->key = (splay_tree_key)pending; |
pending = (splay_tree_node)(active->left); |
} |
if (active->right) |
{ |
KDEL (active->right->key); |
VDEL (active->right->value); |
active->right->key = (splay_tree_key)pending; |
pending = (splay_tree_node)(active->right); |
} |
temp = active; |
active = (splay_tree_node)(temp->key); |
(*sp->deallocate) ((char*) temp, sp->allocate_data); |
} |
} |
#undef KDEL |
#undef VDEL |
} |
/* Rotate the edge joining the left child N with its parent P. PP is the |
grandparents' pointer to P. */ |
static inline void |
rotate_left (splay_tree_node *pp, splay_tree_node p, splay_tree_node n) |
{ |
splay_tree_node tmp; |
tmp = n->right; |
n->right = p; |
p->left = tmp; |
*pp = n; |
} |
/* Rotate the edge joining the right child N with its parent P. PP is the |
grandparents' pointer to P. */ |
static inline void |
rotate_right (splay_tree_node *pp, splay_tree_node p, splay_tree_node n) |
{ |
splay_tree_node tmp; |
tmp = n->left; |
n->left = p; |
p->right = tmp; |
*pp = n; |
} |
/* Bottom up splay of key. */ |
static void |
splay_tree_splay (splay_tree sp, splay_tree_key key) |
{ |
if (sp->root == 0) |
return; |
do { |
int cmp1, cmp2; |
splay_tree_node n, c; |
n = sp->root; |
cmp1 = (*sp->comp) (key, n->key); |
/* Found. */ |
if (cmp1 == 0) |
return; |
/* Left or right? If no child, then we're done. */ |
if (cmp1 < 0) |
c = n->left; |
else |
c = n->right; |
if (!c) |
return; |
/* Next one left or right? If found or no child, we're done |
after one rotation. */ |
cmp2 = (*sp->comp) (key, c->key); |
if (cmp2 == 0 |
|| (cmp2 < 0 && !c->left) |
|| (cmp2 > 0 && !c->right)) |
{ |
if (cmp1 < 0) |
rotate_left (&sp->root, n, c); |
else |
rotate_right (&sp->root, n, c); |
return; |
} |
/* Now we have the four cases of double-rotation. */ |
if (cmp1 < 0 && cmp2 < 0) |
{ |
rotate_left (&n->left, c, c->left); |
rotate_left (&sp->root, n, n->left); |
} |
else if (cmp1 > 0 && cmp2 > 0) |
{ |
rotate_right (&n->right, c, c->right); |
rotate_right (&sp->root, n, n->right); |
} |
else if (cmp1 < 0 && cmp2 > 0) |
{ |
rotate_right (&n->left, c, c->right); |
rotate_left (&sp->root, n, n->left); |
} |
else if (cmp1 > 0 && cmp2 < 0) |
{ |
rotate_left (&n->right, c, c->left); |
rotate_right (&sp->root, n, n->right); |
} |
} while (1); |
} |
/* Call FN, passing it the DATA, for every node below NODE, all of |
which are from SP, following an in-order traversal. If FN every |
returns a non-zero value, the iteration ceases immediately, and the |
value is returned. Otherwise, this function returns 0. */ |
static int |
splay_tree_foreach_helper (splay_tree_node node, |
splay_tree_foreach_fn fn, void *data) |
{ |
int val; |
splay_tree_node *stack; |
int stack_ptr, stack_size; |
/* A non-recursive implementation is used to avoid filling the stack |
for large trees. Splay trees are worst case O(n) in the depth of |
the tree. */ |
#define INITIAL_STACK_SIZE 100 |
stack_size = INITIAL_STACK_SIZE; |
stack_ptr = 0; |
stack = XNEWVEC (splay_tree_node, stack_size); |
val = 0; |
for (;;) |
{ |
while (node != NULL) |
{ |
if (stack_ptr == stack_size) |
{ |
stack_size *= 2; |
stack = XRESIZEVEC (splay_tree_node, stack, stack_size); |
} |
stack[stack_ptr++] = node; |
node = node->left; |
} |
if (stack_ptr == 0) |
break; |
node = stack[--stack_ptr]; |
val = (*fn) (node, data); |
if (val) |
break; |
node = node->right; |
} |
XDELETEVEC (stack); |
return val; |
} |
/* An allocator and deallocator based on xmalloc. */ |
static void * |
splay_tree_xmalloc_allocate (int size, void *data ATTRIBUTE_UNUSED) |
{ |
return (void *) xmalloc (size); |
} |
static void |
splay_tree_xmalloc_deallocate (void *object, void *data ATTRIBUTE_UNUSED) |
{ |
free (object); |
} |
/* Allocate a new splay tree, using COMPARE_FN to compare nodes, |
DELETE_KEY_FN to deallocate keys, and DELETE_VALUE_FN to deallocate |
values. Use xmalloc to allocate the splay tree structure, and any |
nodes added. */ |
splay_tree |
splay_tree_new (splay_tree_compare_fn compare_fn, |
splay_tree_delete_key_fn delete_key_fn, |
splay_tree_delete_value_fn delete_value_fn) |
{ |
return (splay_tree_new_with_allocator |
(compare_fn, delete_key_fn, delete_value_fn, |
splay_tree_xmalloc_allocate, splay_tree_xmalloc_deallocate, 0)); |
} |
/* Allocate a new splay tree, using COMPARE_FN to compare nodes, |
DELETE_KEY_FN to deallocate keys, and DELETE_VALUE_FN to deallocate |
values. */ |
splay_tree |
splay_tree_new_with_allocator (splay_tree_compare_fn compare_fn, |
splay_tree_delete_key_fn delete_key_fn, |
splay_tree_delete_value_fn delete_value_fn, |
splay_tree_allocate_fn allocate_fn, |
splay_tree_deallocate_fn deallocate_fn, |
void *allocate_data) |
{ |
return |
splay_tree_new_typed_alloc (compare_fn, delete_key_fn, delete_value_fn, |
allocate_fn, allocate_fn, deallocate_fn, |
allocate_data); |
} |
/* |
@deftypefn Supplemental splay_tree splay_tree_new_with_typed_alloc @ |
(splay_tree_compare_fn @var{compare_fn}, @ |
splay_tree_delete_key_fn @var{delete_key_fn}, @ |
splay_tree_delete_value_fn @var{delete_value_fn}, @ |
splay_tree_allocate_fn @var{tree_allocate_fn}, @ |
splay_tree_allocate_fn @var{node_allocate_fn}, @ |
splay_tree_deallocate_fn @var{deallocate_fn}, @ |
void * @var{allocate_data}) |
This function creates a splay tree that uses two different allocators |
@var{tree_allocate_fn} and @var{node_allocate_fn} to use for allocating the |
tree itself and its nodes respectively. This is useful when variables of |
different types need to be allocated with different allocators. |
The splay tree will use @var{compare_fn} to compare nodes, |
@var{delete_key_fn} to deallocate keys, and @var{delete_value_fn} to |
deallocate values. |
@end deftypefn |
*/ |
splay_tree |
splay_tree_new_typed_alloc (splay_tree_compare_fn compare_fn, |
splay_tree_delete_key_fn delete_key_fn, |
splay_tree_delete_value_fn delete_value_fn, |
splay_tree_allocate_fn tree_allocate_fn, |
splay_tree_allocate_fn node_allocate_fn, |
splay_tree_deallocate_fn deallocate_fn, |
void * allocate_data) |
{ |
splay_tree sp = (splay_tree) (*tree_allocate_fn) |
(sizeof (struct splay_tree_s), allocate_data); |
sp->root = 0; |
sp->comp = compare_fn; |
sp->delete_key = delete_key_fn; |
sp->delete_value = delete_value_fn; |
sp->allocate = node_allocate_fn; |
sp->deallocate = deallocate_fn; |
sp->allocate_data = allocate_data; |
return sp; |
} |
/* Deallocate SP. */ |
void |
splay_tree_delete (splay_tree sp) |
{ |
splay_tree_delete_helper (sp, sp->root); |
(*sp->deallocate) ((char*) sp, sp->allocate_data); |
} |
/* Insert a new node (associating KEY with DATA) into SP. If a |
previous node with the indicated KEY exists, its data is replaced |
with the new value. Returns the new node. */ |
splay_tree_node |
splay_tree_insert (splay_tree sp, splay_tree_key key, splay_tree_value value) |
{ |
int comparison = 0; |
splay_tree_splay (sp, key); |
if (sp->root) |
comparison = (*sp->comp)(sp->root->key, key); |
if (sp->root && comparison == 0) |
{ |
/* If the root of the tree already has the indicated KEY, just |
replace the value with VALUE. */ |
if (sp->delete_value) |
(*sp->delete_value)(sp->root->value); |
sp->root->value = value; |
} |
else |
{ |
/* Create a new node, and insert it at the root. */ |
splay_tree_node node; |
node = ((splay_tree_node) |
(*sp->allocate) (sizeof (struct splay_tree_node_s), |
sp->allocate_data)); |
node->key = key; |
node->value = value; |
if (!sp->root) |
node->left = node->right = 0; |
else if (comparison < 0) |
{ |
node->left = sp->root; |
node->right = node->left->right; |
node->left->right = 0; |
} |
else |
{ |
node->right = sp->root; |
node->left = node->right->left; |
node->right->left = 0; |
} |
sp->root = node; |
} |
return sp->root; |
} |
/* Remove KEY from SP. It is not an error if it did not exist. */ |
void |
splay_tree_remove (splay_tree sp, splay_tree_key key) |
{ |
splay_tree_splay (sp, key); |
if (sp->root && (*sp->comp) (sp->root->key, key) == 0) |
{ |
splay_tree_node left, right; |
left = sp->root->left; |
right = sp->root->right; |
/* Delete the root node itself. */ |
if (sp->delete_value) |
(*sp->delete_value) (sp->root->value); |
(*sp->deallocate) (sp->root, sp->allocate_data); |
/* One of the children is now the root. Doesn't matter much |
which, so long as we preserve the properties of the tree. */ |
if (left) |
{ |
sp->root = left; |
/* If there was a right child as well, hang it off the |
right-most leaf of the left child. */ |
if (right) |
{ |
while (left->right) |
left = left->right; |
left->right = right; |
} |
} |
else |
sp->root = right; |
} |
} |
/* Lookup KEY in SP, returning VALUE if present, and NULL |
otherwise. */ |
splay_tree_node |
splay_tree_lookup (splay_tree sp, splay_tree_key key) |
{ |
splay_tree_splay (sp, key); |
if (sp->root && (*sp->comp)(sp->root->key, key) == 0) |
return sp->root; |
else |
return 0; |
} |
/* Return the node in SP with the greatest key. */ |
splay_tree_node |
splay_tree_max (splay_tree sp) |
{ |
splay_tree_node n = sp->root; |
if (!n) |
return NULL; |
while (n->right) |
n = n->right; |
return n; |
} |
/* Return the node in SP with the smallest key. */ |
splay_tree_node |
splay_tree_min (splay_tree sp) |
{ |
splay_tree_node n = sp->root; |
if (!n) |
return NULL; |
while (n->left) |
n = n->left; |
return n; |
} |
/* Return the immediate predecessor KEY, or NULL if there is no |
predecessor. KEY need not be present in the tree. */ |
splay_tree_node |
splay_tree_predecessor (splay_tree sp, splay_tree_key key) |
{ |
int comparison; |
splay_tree_node node; |
/* If the tree is empty, there is certainly no predecessor. */ |
if (!sp->root) |
return NULL; |
/* Splay the tree around KEY. That will leave either the KEY |
itself, its predecessor, or its successor at the root. */ |
splay_tree_splay (sp, key); |
comparison = (*sp->comp)(sp->root->key, key); |
/* If the predecessor is at the root, just return it. */ |
if (comparison < 0) |
return sp->root; |
/* Otherwise, find the rightmost element of the left subtree. */ |
node = sp->root->left; |
if (node) |
while (node->right) |
node = node->right; |
return node; |
} |
/* Return the immediate successor KEY, or NULL if there is no |
successor. KEY need not be present in the tree. */ |
splay_tree_node |
splay_tree_successor (splay_tree sp, splay_tree_key key) |
{ |
int comparison; |
splay_tree_node node; |
/* If the tree is empty, there is certainly no successor. */ |
if (!sp->root) |
return NULL; |
/* Splay the tree around KEY. That will leave either the KEY |
itself, its predecessor, or its successor at the root. */ |
splay_tree_splay (sp, key); |
comparison = (*sp->comp)(sp->root->key, key); |
/* If the successor is at the root, just return it. */ |
if (comparison > 0) |
return sp->root; |
/* Otherwise, find the leftmost element of the right subtree. */ |
node = sp->root->right; |
if (node) |
while (node->left) |
node = node->left; |
return node; |
} |
/* Call FN, passing it the DATA, for every node in SP, following an |
in-order traversal. If FN every returns a non-zero value, the |
iteration ceases immediately, and the value is returned. |
Otherwise, this function returns 0. */ |
int |
splay_tree_foreach (splay_tree sp, splay_tree_foreach_fn fn, void *data) |
{ |
return splay_tree_foreach_helper (sp->root, fn, data); |
} |
/* Splay-tree comparison function, treating the keys as ints. */ |
int |
splay_tree_compare_ints (splay_tree_key k1, splay_tree_key k2) |
{ |
if ((int) k1 < (int) k2) |
return -1; |
else if ((int) k1 > (int) k2) |
return 1; |
else |
return 0; |
} |
/* Splay-tree comparison function, treating the keys as pointers. */ |
int |
splay_tree_compare_pointers (splay_tree_key k1, splay_tree_key k2) |
{ |
if ((char*) k1 < (char*) k2) |
return -1; |
else if ((char*) k1 > (char*) k2) |
return 1; |
else |
return 0; |
} |
/contrib/toolchain/binutils/libiberty/stack-limit.c |
---|
0,0 → 1,63 |
/* Increase stack size limit if possible. |
Copyright (C) 2011 Free Software Foundation, Inc. |
This file is part of the libiberty library. This library is free |
software; you can redistribute it and/or modify it under the |
terms of the GNU General Public License as published by the |
Free Software Foundation; either version 2, or (at your option) |
any later version. |
This library is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with GNU CC; see the file COPYING. If not, write to |
the Free Software Foundation, 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. |
As a special exception, if you link this library with files |
compiled with a GNU compiler to produce an executable, this does not cause |
the resulting executable to be covered by the GNU General Public License. |
This exception does not however invalidate any other reasons why |
the executable file might be covered by the GNU General Public License. */ |
/* |
@deftypefn Extension void stack_limit_increase (unsigned long @var{pref}) |
Attempt to increase stack size limit to @var{pref} bytes if possible. |
@end deftypefn |
*/ |
#include "config.h" |
#include "ansidecl.h" |
#ifdef HAVE_STDINT_H |
#include <stdint.h> |
#endif |
#ifdef HAVE_SYS_RESOURCE_H |
#include <sys/resource.h> |
#endif |
void |
stack_limit_increase (unsigned long pref ATTRIBUTE_UNUSED) |
{ |
#if defined(HAVE_SETRLIMIT) && defined(HAVE_GETRLIMIT) \ |
&& defined(RLIMIT_STACK) && defined(RLIM_INFINITY) |
struct rlimit rlim; |
if (getrlimit (RLIMIT_STACK, &rlim) == 0 |
&& rlim.rlim_cur != RLIM_INFINITY |
&& rlim.rlim_cur < pref |
&& (rlim.rlim_max == RLIM_INFINITY || rlim.rlim_cur < rlim.rlim_max)) |
{ |
rlim.rlim_cur = pref; |
if (rlim.rlim_max != RLIM_INFINITY && rlim.rlim_cur > rlim.rlim_max) |
rlim.rlim_cur = rlim.rlim_max; |
setrlimit (RLIMIT_STACK, &rlim); |
} |
#endif |
} |
/contrib/toolchain/binutils/libiberty/stpcpy.c |
---|
0,0 → 1,43 |
/* Implement the stpcpy function. |
Copyright (C) 2003 Free Software Foundation, Inc. |
Written by Kaveh R. Ghazi <ghazi@caip.rutgers.edu>. |
This file is part of the libiberty library. |
Libiberty is free software; you can redistribute it and/or |
modify it under the terms of the GNU Library General Public |
License as published by the Free Software Foundation; either |
version 2 of the License, or (at your option) any later version. |
Libiberty is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
Library General Public License for more details. |
You should have received a copy of the GNU Library General Public |
License along with libiberty; see the file COPYING.LIB. If |
not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
/* |
@deftypefn Supplemental char* stpcpy (char *@var{dst}, const char *@var{src}) |
Copies the string @var{src} into @var{dst}. Returns a pointer to |
@var{dst} + strlen(@var{src}). |
@end deftypefn |
*/ |
#include <ansidecl.h> |
#include <stddef.h> |
extern size_t strlen (const char *); |
extern PTR memcpy (PTR, const PTR, size_t); |
char * |
stpcpy (char *dst, const char *src) |
{ |
const size_t len = strlen (src); |
return (char *) memcpy (dst, src, len + 1) + len; |
} |
/contrib/toolchain/binutils/libiberty/stpncpy.c |
---|
0,0 → 1,48 |
/* Implement the stpncpy function. |
Copyright (C) 2003, 2011 Free Software Foundation, Inc. |
Written by Kaveh R. Ghazi <ghazi@caip.rutgers.edu>. |
This file is part of the libiberty library. |
Libiberty is free software; you can redistribute it and/or |
modify it under the terms of the GNU Library General Public |
License as published by the Free Software Foundation; either |
version 2 of the License, or (at your option) any later version. |
Libiberty is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
Library General Public License for more details. |
You should have received a copy of the GNU Library General Public |
License along with libiberty; see the file COPYING.LIB. If |
not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
/* |
@deftypefn Supplemental char* stpncpy (char *@var{dst}, const char *@var{src}, @ |
size_t @var{len}) |
Copies the string @var{src} into @var{dst}, copying exactly @var{len} |
and padding with zeros if necessary. If @var{len} < strlen(@var{src}) |
then return @var{dst} + @var{len}, otherwise returns @var{dst} + |
strlen(@var{src}). |
@end deftypefn |
*/ |
#include <ansidecl.h> |
#include <stddef.h> |
extern size_t strlen (const char *); |
extern char *strncpy (char *, const char *, size_t); |
char * |
stpncpy (char *dst, const char *src, size_t len) |
{ |
size_t n = strlen (src); |
if (n > len) |
n = len; |
return strncpy (dst, src, len) + n; |
} |
/contrib/toolchain/binutils/libiberty/strcasecmp.c |
---|
0,0 → 1,87 |
/* |
* Copyright (c) 1987 Regents of the University of California. |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms are permitted |
* provided that this notice is preserved and that due credit is given |
* to the University of California at Berkeley. The name of the University |
* may not be used to endorse or promote products derived from this |
* software without specific written prior permission. This software |
* is provided ``as is'' without express or implied warranty. |
*/ |
/* |
@deftypefn Supplemental int strcasecmp (const char *@var{s1}, const char *@var{s2}) |
A case-insensitive @code{strcmp}. |
@end deftypefn |
*/ |
#if defined(LIBC_SCCS) && !defined(lint) |
static char sccsid[] = "@(#)strcasecmp.c 5.5 (Berkeley) 11/24/87"; |
#endif /* LIBC_SCCS and not lint */ |
#include <ansidecl.h> |
#include <stddef.h> |
/* |
* This array is designed for mapping upper and lower case letter |
* together for a case independent comparison. The mappings are |
* based upon ascii character sequences. |
*/ |
typedef unsigned char uc; |
static const unsigned char charmap[] = { |
(uc)'\000',(uc)'\001',(uc)'\002',(uc)'\003',(uc)'\004',(uc)'\005',(uc)'\006',(uc)'\007', |
(uc)'\010',(uc)'\011',(uc)'\012',(uc)'\013',(uc)'\014',(uc)'\015',(uc)'\016',(uc)'\017', |
(uc)'\020',(uc)'\021',(uc)'\022',(uc)'\023',(uc)'\024',(uc)'\025',(uc)'\026',(uc)'\027', |
(uc)'\030',(uc)'\031',(uc)'\032',(uc)'\033',(uc)'\034',(uc)'\035',(uc)'\036',(uc)'\037', |
(uc)'\040',(uc)'\041',(uc)'\042',(uc)'\043',(uc)'\044',(uc)'\045',(uc)'\046',(uc)'\047', |
(uc)'\050',(uc)'\051',(uc)'\052',(uc)'\053',(uc)'\054',(uc)'\055',(uc)'\056',(uc)'\057', |
(uc)'\060',(uc)'\061',(uc)'\062',(uc)'\063',(uc)'\064',(uc)'\065',(uc)'\066',(uc)'\067', |
(uc)'\070',(uc)'\071',(uc)'\072',(uc)'\073',(uc)'\074',(uc)'\075',(uc)'\076',(uc)'\077', |
(uc)'\100',(uc)'\141',(uc)'\142',(uc)'\143',(uc)'\144',(uc)'\145',(uc)'\146',(uc)'\147', |
(uc)'\150',(uc)'\151',(uc)'\152',(uc)'\153',(uc)'\154',(uc)'\155',(uc)'\156',(uc)'\157', |
(uc)'\160',(uc)'\161',(uc)'\162',(uc)'\163',(uc)'\164',(uc)'\165',(uc)'\166',(uc)'\167', |
(uc)'\170',(uc)'\171',(uc)'\172',(uc)'\133',(uc)'\134',(uc)'\135',(uc)'\136',(uc)'\137', |
(uc)'\140',(uc)'\141',(uc)'\142',(uc)'\143',(uc)'\144',(uc)'\145',(uc)'\146',(uc)'\147', |
(uc)'\150',(uc)'\151',(uc)'\152',(uc)'\153',(uc)'\154',(uc)'\155',(uc)'\156',(uc)'\157', |
(uc)'\160',(uc)'\161',(uc)'\162',(uc)'\163',(uc)'\164',(uc)'\165',(uc)'\166',(uc)'\167', |
(uc)'\170',(uc)'\171',(uc)'\172',(uc)'\173',(uc)'\174',(uc)'\175',(uc)'\176',(uc)'\177', |
(uc)'\200',(uc)'\201',(uc)'\202',(uc)'\203',(uc)'\204',(uc)'\205',(uc)'\206',(uc)'\207', |
(uc)'\210',(uc)'\211',(uc)'\212',(uc)'\213',(uc)'\214',(uc)'\215',(uc)'\216',(uc)'\217', |
(uc)'\220',(uc)'\221',(uc)'\222',(uc)'\223',(uc)'\224',(uc)'\225',(uc)'\226',(uc)'\227', |
(uc)'\230',(uc)'\231',(uc)'\232',(uc)'\233',(uc)'\234',(uc)'\235',(uc)'\236',(uc)'\237', |
(uc)'\240',(uc)'\241',(uc)'\242',(uc)'\243',(uc)'\244',(uc)'\245',(uc)'\246',(uc)'\247', |
(uc)'\250',(uc)'\251',(uc)'\252',(uc)'\253',(uc)'\254',(uc)'\255',(uc)'\256',(uc)'\257', |
(uc)'\260',(uc)'\261',(uc)'\262',(uc)'\263',(uc)'\264',(uc)'\265',(uc)'\266',(uc)'\267', |
(uc)'\270',(uc)'\271',(uc)'\272',(uc)'\273',(uc)'\274',(uc)'\275',(uc)'\276',(uc)'\277', |
(uc)'\300',(uc)'\341',(uc)'\342',(uc)'\343',(uc)'\344',(uc)'\345',(uc)'\346',(uc)'\347', |
(uc)'\350',(uc)'\351',(uc)'\352',(uc)'\353',(uc)'\354',(uc)'\355',(uc)'\356',(uc)'\357', |
(uc)'\360',(uc)'\361',(uc)'\362',(uc)'\363',(uc)'\364',(uc)'\365',(uc)'\366',(uc)'\367', |
(uc)'\370',(uc)'\371',(uc)'\372',(uc)'\333',(uc)'\334',(uc)'\335',(uc)'\336',(uc)'\337', |
(uc)'\340',(uc)'\341',(uc)'\342',(uc)'\343',(uc)'\344',(uc)'\345',(uc)'\346',(uc)'\347', |
(uc)'\350',(uc)'\351',(uc)'\352',(uc)'\353',(uc)'\354',(uc)'\355',(uc)'\356',(uc)'\357', |
(uc)'\360',(uc)'\361',(uc)'\362',(uc)'\363',(uc)'\364',(uc)'\365',(uc)'\366',(uc)'\367', |
(uc)'\370',(uc)'\371',(uc)'\372',(uc)'\373',(uc)'\374',(uc)'\375',(uc)'\376',(uc)'\377', |
}; |
int |
strcasecmp(const char *s1, const char *s2) |
{ |
register unsigned char u1, u2; |
for (;;) { |
u1 = (unsigned char) *s1++; |
u2 = (unsigned char) *s2++; |
if (charmap[u1] != charmap[u2]) { |
return charmap[u1] - charmap[u2]; |
} |
if (u1 == '\0') { |
return 0; |
} |
} |
} |
/contrib/toolchain/binutils/libiberty/strerror.c |
---|
0,0 → 1,809 |
/* Extended support for using errno values. |
Written by Fred Fish. fnf@cygnus.com |
This file is in the public domain. --Per Bothner. */ |
#include "config.h" |
#ifdef HAVE_SYS_ERRLIST |
/* Note that errno.h (not sure what OS) or stdio.h (BSD 4.4, at least) |
might declare sys_errlist in a way that the compiler might consider |
incompatible with our later declaration, perhaps by using const |
attributes. So we hide the declaration in errno.h (if any) using a |
macro. */ |
#define sys_nerr sys_nerr__ |
#define sys_errlist sys_errlist__ |
#endif |
#include "ansidecl.h" |
#include "libiberty.h" |
#include <stdio.h> |
#include <errno.h> |
#ifdef HAVE_SYS_ERRLIST |
#undef sys_nerr |
#undef sys_errlist |
#endif |
/* Routines imported from standard C runtime libraries. */ |
#ifdef HAVE_STDLIB_H |
#include <stdlib.h> |
#else |
extern PTR malloc (); |
#endif |
#ifdef HAVE_STRING_H |
#include <string.h> |
#else |
extern PTR memset (); |
#endif |
#ifndef MAX |
# define MAX(a,b) ((a) > (b) ? (a) : (b)) |
#endif |
static void init_error_tables (void); |
/* Translation table for errno values. See intro(2) in most UNIX systems |
Programmers Reference Manuals. |
Note that this table is generally only accessed when it is used at runtime |
to initialize errno name and message tables that are indexed by errno |
value. |
Not all of these errnos will exist on all systems. This table is the only |
thing that should have to be updated as new error numbers are introduced. |
It's sort of ugly, but at least its portable. */ |
struct error_info |
{ |
const int value; /* The numeric value from <errno.h> */ |
const char *const name; /* The equivalent symbolic value */ |
#ifndef HAVE_SYS_ERRLIST |
const char *const msg; /* Short message about this value */ |
#endif |
}; |
#ifndef HAVE_SYS_ERRLIST |
# define ENTRY(value, name, msg) {value, name, msg} |
#else |
# define ENTRY(value, name, msg) {value, name} |
#endif |
static const struct error_info error_table[] = |
{ |
#if defined (EPERM) |
ENTRY(EPERM, "EPERM", "Not owner"), |
#endif |
#if defined (ENOENT) |
ENTRY(ENOENT, "ENOENT", "No such file or directory"), |
#endif |
#if defined (ESRCH) |
ENTRY(ESRCH, "ESRCH", "No such process"), |
#endif |
#if defined (EINTR) |
ENTRY(EINTR, "EINTR", "Interrupted system call"), |
#endif |
#if defined (EIO) |
ENTRY(EIO, "EIO", "I/O error"), |
#endif |
#if defined (ENXIO) |
ENTRY(ENXIO, "ENXIO", "No such device or address"), |
#endif |
#if defined (E2BIG) |
ENTRY(E2BIG, "E2BIG", "Arg list too long"), |
#endif |
#if defined (ENOEXEC) |
ENTRY(ENOEXEC, "ENOEXEC", "Exec format error"), |
#endif |
#if defined (EBADF) |
ENTRY(EBADF, "EBADF", "Bad file number"), |
#endif |
#if defined (ECHILD) |
ENTRY(ECHILD, "ECHILD", "No child processes"), |
#endif |
#if defined (EWOULDBLOCK) /* Put before EAGAIN, sometimes aliased */ |
ENTRY(EWOULDBLOCK, "EWOULDBLOCK", "Operation would block"), |
#endif |
#if defined (EAGAIN) |
ENTRY(EAGAIN, "EAGAIN", "No more processes"), |
#endif |
#if defined (ENOMEM) |
ENTRY(ENOMEM, "ENOMEM", "Not enough space"), |
#endif |
#if defined (EACCES) |
ENTRY(EACCES, "EACCES", "Permission denied"), |
#endif |
#if defined (EFAULT) |
ENTRY(EFAULT, "EFAULT", "Bad address"), |
#endif |
#if defined (ENOTBLK) |
ENTRY(ENOTBLK, "ENOTBLK", "Block device required"), |
#endif |
#if defined (EBUSY) |
ENTRY(EBUSY, "EBUSY", "Device busy"), |
#endif |
#if defined (EEXIST) |
ENTRY(EEXIST, "EEXIST", "File exists"), |
#endif |
#if defined (EXDEV) |
ENTRY(EXDEV, "EXDEV", "Cross-device link"), |
#endif |
#if defined (ENODEV) |
ENTRY(ENODEV, "ENODEV", "No such device"), |
#endif |
#if defined (ENOTDIR) |
ENTRY(ENOTDIR, "ENOTDIR", "Not a directory"), |
#endif |
#if defined (EISDIR) |
ENTRY(EISDIR, "EISDIR", "Is a directory"), |
#endif |
#if defined (EINVAL) |
ENTRY(EINVAL, "EINVAL", "Invalid argument"), |
#endif |
#if defined (ENFILE) |
ENTRY(ENFILE, "ENFILE", "File table overflow"), |
#endif |
#if defined (EMFILE) |
ENTRY(EMFILE, "EMFILE", "Too many open files"), |
#endif |
#if defined (ENOTTY) |
ENTRY(ENOTTY, "ENOTTY", "Not a typewriter"), |
#endif |
#if defined (ETXTBSY) |
ENTRY(ETXTBSY, "ETXTBSY", "Text file busy"), |
#endif |
#if defined (EFBIG) |
ENTRY(EFBIG, "EFBIG", "File too large"), |
#endif |
#if defined (ENOSPC) |
ENTRY(ENOSPC, "ENOSPC", "No space left on device"), |
#endif |
#if defined (ESPIPE) |
ENTRY(ESPIPE, "ESPIPE", "Illegal seek"), |
#endif |
#if defined (EROFS) |
ENTRY(EROFS, "EROFS", "Read-only file system"), |
#endif |
#if defined (EMLINK) |
ENTRY(EMLINK, "EMLINK", "Too many links"), |
#endif |
#if defined (EPIPE) |
ENTRY(EPIPE, "EPIPE", "Broken pipe"), |
#endif |
#if defined (EDOM) |
ENTRY(EDOM, "EDOM", "Math argument out of domain of func"), |
#endif |
#if defined (ERANGE) |
ENTRY(ERANGE, "ERANGE", "Math result not representable"), |
#endif |
#if defined (ENOMSG) |
ENTRY(ENOMSG, "ENOMSG", "No message of desired type"), |
#endif |
#if defined (EIDRM) |
ENTRY(EIDRM, "EIDRM", "Identifier removed"), |
#endif |
#if defined (ECHRNG) |
ENTRY(ECHRNG, "ECHRNG", "Channel number out of range"), |
#endif |
#if defined (EL2NSYNC) |
ENTRY(EL2NSYNC, "EL2NSYNC", "Level 2 not synchronized"), |
#endif |
#if defined (EL3HLT) |
ENTRY(EL3HLT, "EL3HLT", "Level 3 halted"), |
#endif |
#if defined (EL3RST) |
ENTRY(EL3RST, "EL3RST", "Level 3 reset"), |
#endif |
#if defined (ELNRNG) |
ENTRY(ELNRNG, "ELNRNG", "Link number out of range"), |
#endif |
#if defined (EUNATCH) |
ENTRY(EUNATCH, "EUNATCH", "Protocol driver not attached"), |
#endif |
#if defined (ENOCSI) |
ENTRY(ENOCSI, "ENOCSI", "No CSI structure available"), |
#endif |
#if defined (EL2HLT) |
ENTRY(EL2HLT, "EL2HLT", "Level 2 halted"), |
#endif |
#if defined (EDEADLK) |
ENTRY(EDEADLK, "EDEADLK", "Deadlock condition"), |
#endif |
#if defined (ENOLCK) |
ENTRY(ENOLCK, "ENOLCK", "No record locks available"), |
#endif |
#if defined (EBADE) |
ENTRY(EBADE, "EBADE", "Invalid exchange"), |
#endif |
#if defined (EBADR) |
ENTRY(EBADR, "EBADR", "Invalid request descriptor"), |
#endif |
#if defined (EXFULL) |
ENTRY(EXFULL, "EXFULL", "Exchange full"), |
#endif |
#if defined (ENOANO) |
ENTRY(ENOANO, "ENOANO", "No anode"), |
#endif |
#if defined (EBADRQC) |
ENTRY(EBADRQC, "EBADRQC", "Invalid request code"), |
#endif |
#if defined (EBADSLT) |
ENTRY(EBADSLT, "EBADSLT", "Invalid slot"), |
#endif |
#if defined (EDEADLOCK) |
ENTRY(EDEADLOCK, "EDEADLOCK", "File locking deadlock error"), |
#endif |
#if defined (EBFONT) |
ENTRY(EBFONT, "EBFONT", "Bad font file format"), |
#endif |
#if defined (ENOSTR) |
ENTRY(ENOSTR, "ENOSTR", "Device not a stream"), |
#endif |
#if defined (ENODATA) |
ENTRY(ENODATA, "ENODATA", "No data available"), |
#endif |
#if defined (ETIME) |
ENTRY(ETIME, "ETIME", "Timer expired"), |
#endif |
#if defined (ENOSR) |
ENTRY(ENOSR, "ENOSR", "Out of streams resources"), |
#endif |
#if defined (ENONET) |
ENTRY(ENONET, "ENONET", "Machine is not on the network"), |
#endif |
#if defined (ENOPKG) |
ENTRY(ENOPKG, "ENOPKG", "Package not installed"), |
#endif |
#if defined (EREMOTE) |
ENTRY(EREMOTE, "EREMOTE", "Object is remote"), |
#endif |
#if defined (ENOLINK) |
ENTRY(ENOLINK, "ENOLINK", "Link has been severed"), |
#endif |
#if defined (EADV) |
ENTRY(EADV, "EADV", "Advertise error"), |
#endif |
#if defined (ESRMNT) |
ENTRY(ESRMNT, "ESRMNT", "Srmount error"), |
#endif |
#if defined (ECOMM) |
ENTRY(ECOMM, "ECOMM", "Communication error on send"), |
#endif |
#if defined (EPROTO) |
ENTRY(EPROTO, "EPROTO", "Protocol error"), |
#endif |
#if defined (EMULTIHOP) |
ENTRY(EMULTIHOP, "EMULTIHOP", "Multihop attempted"), |
#endif |
#if defined (EDOTDOT) |
ENTRY(EDOTDOT, "EDOTDOT", "RFS specific error"), |
#endif |
#if defined (EBADMSG) |
ENTRY(EBADMSG, "EBADMSG", "Not a data message"), |
#endif |
#if defined (ENAMETOOLONG) |
ENTRY(ENAMETOOLONG, "ENAMETOOLONG", "File name too long"), |
#endif |
#if defined (EOVERFLOW) |
ENTRY(EOVERFLOW, "EOVERFLOW", "Value too large for defined data type"), |
#endif |
#if defined (ENOTUNIQ) |
ENTRY(ENOTUNIQ, "ENOTUNIQ", "Name not unique on network"), |
#endif |
#if defined (EBADFD) |
ENTRY(EBADFD, "EBADFD", "File descriptor in bad state"), |
#endif |
#if defined (EREMCHG) |
ENTRY(EREMCHG, "EREMCHG", "Remote address changed"), |
#endif |
#if defined (ELIBACC) |
ENTRY(ELIBACC, "ELIBACC", "Can not access a needed shared library"), |
#endif |
#if defined (ELIBBAD) |
ENTRY(ELIBBAD, "ELIBBAD", "Accessing a corrupted shared library"), |
#endif |
#if defined (ELIBSCN) |
ENTRY(ELIBSCN, "ELIBSCN", ".lib section in a.out corrupted"), |
#endif |
#if defined (ELIBMAX) |
ENTRY(ELIBMAX, "ELIBMAX", "Attempting to link in too many shared libraries"), |
#endif |
#if defined (ELIBEXEC) |
ENTRY(ELIBEXEC, "ELIBEXEC", "Cannot exec a shared library directly"), |
#endif |
#if defined (EILSEQ) |
ENTRY(EILSEQ, "EILSEQ", "Illegal byte sequence"), |
#endif |
#if defined (ENOSYS) |
ENTRY(ENOSYS, "ENOSYS", "Operation not applicable"), |
#endif |
#if defined (ELOOP) |
ENTRY(ELOOP, "ELOOP", "Too many symbolic links encountered"), |
#endif |
#if defined (ERESTART) |
ENTRY(ERESTART, "ERESTART", "Interrupted system call should be restarted"), |
#endif |
#if defined (ESTRPIPE) |
ENTRY(ESTRPIPE, "ESTRPIPE", "Streams pipe error"), |
#endif |
#if defined (ENOTEMPTY) |
ENTRY(ENOTEMPTY, "ENOTEMPTY", "Directory not empty"), |
#endif |
#if defined (EUSERS) |
ENTRY(EUSERS, "EUSERS", "Too many users"), |
#endif |
#if defined (ENOTSOCK) |
ENTRY(ENOTSOCK, "ENOTSOCK", "Socket operation on non-socket"), |
#endif |
#if defined (EDESTADDRREQ) |
ENTRY(EDESTADDRREQ, "EDESTADDRREQ", "Destination address required"), |
#endif |
#if defined (EMSGSIZE) |
ENTRY(EMSGSIZE, "EMSGSIZE", "Message too long"), |
#endif |
#if defined (EPROTOTYPE) |
ENTRY(EPROTOTYPE, "EPROTOTYPE", "Protocol wrong type for socket"), |
#endif |
#if defined (ENOPROTOOPT) |
ENTRY(ENOPROTOOPT, "ENOPROTOOPT", "Protocol not available"), |
#endif |
#if defined (EPROTONOSUPPORT) |
ENTRY(EPROTONOSUPPORT, "EPROTONOSUPPORT", "Protocol not supported"), |
#endif |
#if defined (ESOCKTNOSUPPORT) |
ENTRY(ESOCKTNOSUPPORT, "ESOCKTNOSUPPORT", "Socket type not supported"), |
#endif |
#if defined (EOPNOTSUPP) |
ENTRY(EOPNOTSUPP, "EOPNOTSUPP", "Operation not supported on transport endpoint"), |
#endif |
#if defined (EPFNOSUPPORT) |
ENTRY(EPFNOSUPPORT, "EPFNOSUPPORT", "Protocol family not supported"), |
#endif |
#if defined (EAFNOSUPPORT) |
ENTRY(EAFNOSUPPORT, "EAFNOSUPPORT", "Address family not supported by protocol"), |
#endif |
#if defined (EADDRINUSE) |
ENTRY(EADDRINUSE, "EADDRINUSE", "Address already in use"), |
#endif |
#if defined (EADDRNOTAVAIL) |
ENTRY(EADDRNOTAVAIL, "EADDRNOTAVAIL","Cannot assign requested address"), |
#endif |
#if defined (ENETDOWN) |
ENTRY(ENETDOWN, "ENETDOWN", "Network is down"), |
#endif |
#if defined (ENETUNREACH) |
ENTRY(ENETUNREACH, "ENETUNREACH", "Network is unreachable"), |
#endif |
#if defined (ENETRESET) |
ENTRY(ENETRESET, "ENETRESET", "Network dropped connection because of reset"), |
#endif |
#if defined (ECONNABORTED) |
ENTRY(ECONNABORTED, "ECONNABORTED", "Software caused connection abort"), |
#endif |
#if defined (ECONNRESET) |
ENTRY(ECONNRESET, "ECONNRESET", "Connection reset by peer"), |
#endif |
#if defined (ENOBUFS) |
ENTRY(ENOBUFS, "ENOBUFS", "No buffer space available"), |
#endif |
#if defined (EISCONN) |
ENTRY(EISCONN, "EISCONN", "Transport endpoint is already connected"), |
#endif |
#if defined (ENOTCONN) |
ENTRY(ENOTCONN, "ENOTCONN", "Transport endpoint is not connected"), |
#endif |
#if defined (ESHUTDOWN) |
ENTRY(ESHUTDOWN, "ESHUTDOWN", "Cannot send after transport endpoint shutdown"), |
#endif |
#if defined (ETOOMANYREFS) |
ENTRY(ETOOMANYREFS, "ETOOMANYREFS", "Too many references: cannot splice"), |
#endif |
#if defined (ETIMEDOUT) |
ENTRY(ETIMEDOUT, "ETIMEDOUT", "Connection timed out"), |
#endif |
#if defined (ECONNREFUSED) |
ENTRY(ECONNREFUSED, "ECONNREFUSED", "Connection refused"), |
#endif |
#if defined (EHOSTDOWN) |
ENTRY(EHOSTDOWN, "EHOSTDOWN", "Host is down"), |
#endif |
#if defined (EHOSTUNREACH) |
ENTRY(EHOSTUNREACH, "EHOSTUNREACH", "No route to host"), |
#endif |
#if defined (EALREADY) |
ENTRY(EALREADY, "EALREADY", "Operation already in progress"), |
#endif |
#if defined (EINPROGRESS) |
ENTRY(EINPROGRESS, "EINPROGRESS", "Operation now in progress"), |
#endif |
#if defined (ESTALE) |
ENTRY(ESTALE, "ESTALE", "Stale NFS file handle"), |
#endif |
#if defined (EUCLEAN) |
ENTRY(EUCLEAN, "EUCLEAN", "Structure needs cleaning"), |
#endif |
#if defined (ENOTNAM) |
ENTRY(ENOTNAM, "ENOTNAM", "Not a XENIX named type file"), |
#endif |
#if defined (ENAVAIL) |
ENTRY(ENAVAIL, "ENAVAIL", "No XENIX semaphores available"), |
#endif |
#if defined (EISNAM) |
ENTRY(EISNAM, "EISNAM", "Is a named type file"), |
#endif |
#if defined (EREMOTEIO) |
ENTRY(EREMOTEIO, "EREMOTEIO", "Remote I/O error"), |
#endif |
ENTRY(0, NULL, NULL) |
}; |
#ifdef EVMSERR |
/* This is not in the table, because the numeric value of EVMSERR (32767) |
lies outside the range of sys_errlist[]. */ |
static struct { int value; const char *name, *msg; } |
evmserr = { EVMSERR, "EVMSERR", "VMS-specific error" }; |
#endif |
/* Translation table allocated and initialized at runtime. Indexed by the |
errno value to find the equivalent symbolic value. */ |
static const char **error_names; |
static int num_error_names = 0; |
/* Translation table allocated and initialized at runtime, if it does not |
already exist in the host environment. Indexed by the errno value to find |
the descriptive string. |
We don't export it for use in other modules because even though it has the |
same name, it differs from other implementations in that it is dynamically |
initialized rather than statically initialized. */ |
#ifndef HAVE_SYS_ERRLIST |
#define sys_nerr sys_nerr__ |
#define sys_errlist sys_errlist__ |
static int sys_nerr; |
static const char **sys_errlist; |
#else |
extern int sys_nerr; |
extern char *sys_errlist[]; |
#endif |
/* |
NAME |
init_error_tables -- initialize the name and message tables |
SYNOPSIS |
static void init_error_tables (); |
DESCRIPTION |
Using the error_table, which is initialized at compile time, generate |
the error_names and the sys_errlist (if needed) tables, which are |
indexed at runtime by a specific errno value. |
BUGS |
The initialization of the tables may fail under low memory conditions, |
in which case we don't do anything particularly useful, but we don't |
bomb either. Who knows, it might succeed at a later point if we free |
some memory in the meantime. In any case, the other routines know |
how to deal with lack of a table after trying to initialize it. This |
may or may not be considered to be a bug, that we don't specifically |
warn about this particular failure mode. |
*/ |
static void |
init_error_tables (void) |
{ |
const struct error_info *eip; |
int nbytes; |
/* If we haven't already scanned the error_table once to find the maximum |
errno value, then go find it now. */ |
if (num_error_names == 0) |
{ |
for (eip = error_table; eip -> name != NULL; eip++) |
{ |
if (eip -> value >= num_error_names) |
{ |
num_error_names = eip -> value + 1; |
} |
} |
} |
/* Now attempt to allocate the error_names table, zero it out, and then |
initialize it from the statically initialized error_table. */ |
if (error_names == NULL) |
{ |
nbytes = num_error_names * sizeof (char *); |
if ((error_names = (const char **) malloc (nbytes)) != NULL) |
{ |
memset (error_names, 0, nbytes); |
for (eip = error_table; eip -> name != NULL; eip++) |
{ |
error_names[eip -> value] = eip -> name; |
} |
} |
} |
#ifndef HAVE_SYS_ERRLIST |
/* Now attempt to allocate the sys_errlist table, zero it out, and then |
initialize it from the statically initialized error_table. */ |
if (sys_errlist == NULL) |
{ |
nbytes = num_error_names * sizeof (char *); |
if ((sys_errlist = (const char **) malloc (nbytes)) != NULL) |
{ |
memset (sys_errlist, 0, nbytes); |
sys_nerr = num_error_names; |
for (eip = error_table; eip -> name != NULL; eip++) |
{ |
sys_errlist[eip -> value] = eip -> msg; |
} |
} |
} |
#endif |
} |
/* |
@deftypefn Extension int errno_max (void) |
Returns the maximum @code{errno} value for which a corresponding |
symbolic name or message is available. Note that in the case where we |
use the @code{sys_errlist} supplied by the system, it is possible for |
there to be more symbolic names than messages, or vice versa. In |
fact, the manual page for @code{perror(3C)} explicitly warns that one |
should check the size of the table (@code{sys_nerr}) before indexing |
it, since new error codes may be added to the system before they are |
added to the table. Thus @code{sys_nerr} might be smaller than value |
implied by the largest @code{errno} value defined in @code{<errno.h>}. |
We return the maximum value that can be used to obtain a meaningful |
symbolic name or message. |
@end deftypefn |
*/ |
int |
errno_max (void) |
{ |
int maxsize; |
if (error_names == NULL) |
{ |
init_error_tables (); |
} |
maxsize = MAX (sys_nerr, num_error_names); |
return (maxsize - 1); |
} |
#ifndef HAVE_STRERROR |
/* |
@deftypefn Supplemental char* strerror (int @var{errnoval}) |
Maps an @code{errno} number to an error message string, the contents |
of which are implementation defined. On systems which have the |
external variables @code{sys_nerr} and @code{sys_errlist}, these |
strings will be the same as the ones used by @code{perror}. |
If the supplied error number is within the valid range of indices for |
the @code{sys_errlist}, but no message is available for the particular |
error number, then returns the string @samp{Error @var{num}}, where |
@var{num} is the error number. |
If the supplied error number is not a valid index into |
@code{sys_errlist}, returns @code{NULL}. |
The returned string is only guaranteed to be valid only until the |
next call to @code{strerror}. |
@end deftypefn |
*/ |
char * |
strerror (int errnoval) |
{ |
const char *msg; |
static char buf[32]; |
#ifndef HAVE_SYS_ERRLIST |
if (error_names == NULL) |
{ |
init_error_tables (); |
} |
#endif |
if ((errnoval < 0) || (errnoval >= sys_nerr)) |
{ |
#ifdef EVMSERR |
if (errnoval == evmserr.value) |
msg = evmserr.msg; |
else |
#endif |
/* Out of range, just return NULL */ |
msg = NULL; |
} |
else if ((sys_errlist == NULL) || (sys_errlist[errnoval] == NULL)) |
{ |
/* In range, but no sys_errlist or no entry at this index. */ |
sprintf (buf, "Error %d", errnoval); |
msg = buf; |
} |
else |
{ |
/* In range, and a valid message. Just return the message. */ |
msg = (char *) sys_errlist[errnoval]; |
} |
return (msg); |
} |
#endif /* ! HAVE_STRERROR */ |
/* |
@deftypefn Replacement {const char*} strerrno (int @var{errnum}) |
Given an error number returned from a system call (typically returned |
in @code{errno}), returns a pointer to a string containing the |
symbolic name of that error number, as found in @code{<errno.h>}. |
If the supplied error number is within the valid range of indices for |
symbolic names, but no name is available for the particular error |
number, then returns the string @samp{Error @var{num}}, where @var{num} |
is the error number. |
If the supplied error number is not within the range of valid |
indices, then returns @code{NULL}. |
The contents of the location pointed to are only guaranteed to be |
valid until the next call to @code{strerrno}. |
@end deftypefn |
*/ |
const char * |
strerrno (int errnoval) |
{ |
const char *name; |
static char buf[32]; |
if (error_names == NULL) |
{ |
init_error_tables (); |
} |
if ((errnoval < 0) || (errnoval >= num_error_names)) |
{ |
#ifdef EVMSERR |
if (errnoval == evmserr.value) |
name = evmserr.name; |
else |
#endif |
/* Out of range, just return NULL */ |
name = NULL; |
} |
else if ((error_names == NULL) || (error_names[errnoval] == NULL)) |
{ |
/* In range, but no error_names or no entry at this index. */ |
sprintf (buf, "Error %d", errnoval); |
name = (const char *) buf; |
} |
else |
{ |
/* In range, and a valid name. Just return the name. */ |
name = error_names[errnoval]; |
} |
return (name); |
} |
/* |
@deftypefn Extension int strtoerrno (const char *@var{name}) |
Given the symbolic name of a error number (e.g., @code{EACCES}), map it |
to an errno value. If no translation is found, returns 0. |
@end deftypefn |
*/ |
int |
strtoerrno (const char *name) |
{ |
int errnoval = 0; |
if (name != NULL) |
{ |
if (error_names == NULL) |
{ |
init_error_tables (); |
} |
for (errnoval = 0; errnoval < num_error_names; errnoval++) |
{ |
if ((error_names[errnoval] != NULL) && |
(strcmp (name, error_names[errnoval]) == 0)) |
{ |
break; |
} |
} |
if (errnoval == num_error_names) |
{ |
#ifdef EVMSERR |
if (strcmp (name, evmserr.name) == 0) |
errnoval = evmserr.value; |
else |
#endif |
errnoval = 0; |
} |
} |
return (errnoval); |
} |
/* A simple little main that does nothing but print all the errno translations |
if MAIN is defined and this file is compiled and linked. */ |
#ifdef MAIN |
#include <stdio.h> |
int |
main (void) |
{ |
int errn; |
int errnmax; |
const char *name; |
const char *msg; |
char *strerror (); |
errnmax = errno_max (); |
printf ("%d entries in names table.\n", num_error_names); |
printf ("%d entries in messages table.\n", sys_nerr); |
printf ("%d is max useful index.\n", errnmax); |
/* Keep printing values until we get to the end of *both* tables, not |
*either* table. Note that knowing the maximum useful index does *not* |
relieve us of the responsibility of testing the return pointer for |
NULL. */ |
for (errn = 0; errn <= errnmax; errn++) |
{ |
name = strerrno (errn); |
name = (name == NULL) ? "<NULL>" : name; |
msg = strerror (errn); |
msg = (msg == NULL) ? "<NULL>" : msg; |
printf ("%-4d%-18s%s\n", errn, name, msg); |
} |
return 0; |
} |
#endif |
/contrib/toolchain/binutils/libiberty/strncasecmp.c |
---|
0,0 → 1,86 |
/* |
* Copyright (c) 1987 Regents of the University of California. |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms are permitted |
* provided that this notice is preserved and that due credit is given |
* to the University of California at Berkeley. The name of the University |
* may not be used to endorse or promote products derived from this |
* software without specific written prior permission. This software |
* is provided ``as is'' without express or implied warranty. |
*/ |
/* |
@deftypefn Supplemental int strncasecmp (const char *@var{s1}, const char *@var{s2}) |
A case-insensitive @code{strncmp}. |
@end deftypefn |
*/ |
#if defined(LIBC_SCCS) && !defined(lint) |
static char sccsid[] = "@(#)strcasecmp.c 5.5 (Berkeley) 11/24/87"; |
#endif /* LIBC_SCCS and not lint */ |
#include <ansidecl.h> |
#include <stddef.h> |
/* |
* This array is designed for mapping upper and lower case letter |
* together for a case independent comparison. The mappings are |
* based upon ascii character sequences. |
*/ |
static const unsigned char charmap[] = { |
'\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007', |
'\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017', |
'\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027', |
'\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037', |
'\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047', |
'\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057', |
'\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067', |
'\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077', |
'\100', '\141', '\142', '\143', '\144', '\145', '\146', '\147', |
'\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157', |
'\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167', |
'\170', '\171', '\172', '\133', '\134', '\135', '\136', '\137', |
'\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147', |
'\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157', |
'\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167', |
'\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177', |
'\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207', |
'\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217', |
'\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227', |
'\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237', |
'\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247', |
'\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257', |
'\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267', |
'\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277', |
'\300', '\341', '\342', '\343', '\344', '\345', '\346', '\347', |
'\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357', |
'\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367', |
'\370', '\371', '\372', '\333', '\334', '\335', '\336', '\337', |
'\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347', |
'\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357', |
'\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367', |
'\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377', |
}; |
int |
strncasecmp(const char *s1, const char *s2, register size_t n) |
{ |
register unsigned char u1, u2; |
for (; n != 0; --n) { |
u1 = (unsigned char) *s1++; |
u2 = (unsigned char) *s2++; |
if (charmap[u1] != charmap[u2]) { |
return charmap[u1] - charmap[u2]; |
} |
if (u1 == '\0') { |
return 0; |
} |
} |
return 0; |
} |
/contrib/toolchain/binutils/libiberty/strndup.c |
---|
0,0 → 1,55 |
/* Implement the strndup function. |
Copyright (C) 2005 Free Software Foundation, Inc. |
Written by Kaveh R. Ghazi <ghazi@caip.rutgers.edu>. |
This file is part of the libiberty library. |
Libiberty is free software; you can redistribute it and/or |
modify it under the terms of the GNU Library General Public |
License as published by the Free Software Foundation; either |
version 2 of the License, or (at your option) any later version. |
Libiberty is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
Library General Public License for more details. |
You should have received a copy of the GNU Library General Public |
License along with libiberty; see the file COPYING.LIB. If |
not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
/* |
@deftypefn Extension char* strndup (const char *@var{s}, size_t @var{n}) |
Returns a pointer to a copy of @var{s} with at most @var{n} characters |
in memory obtained from @code{malloc}, or @code{NULL} if insufficient |
memory was available. The result is always NUL terminated. |
@end deftypefn |
*/ |
#include "ansidecl.h" |
#include <stddef.h> |
extern size_t strlen (const char*); |
extern PTR malloc (size_t); |
extern PTR memcpy (PTR, const PTR, size_t); |
char * |
strndup (const char *s, size_t n) |
{ |
char *result; |
size_t len = strlen (s); |
if (n < len) |
len = n; |
result = (char *) malloc (len + 1); |
if (!result) |
return 0; |
result[len] = '\0'; |
return (char *) memcpy (result, s, len); |
} |
/contrib/toolchain/binutils/libiberty/strnlen.c |
---|
0,0 → 1,30 |
/* Portable version of strnlen. |
This function is in the public domain. */ |
/* |
@deftypefn Supplemental size_t strnlen (const char *@var{s}, size_t @var{maxlen}) |
Returns the length of @var{s}, as with @code{strlen}, but never looks |
past the first @var{maxlen} characters in the string. If there is no |
'\0' character in the first @var{maxlen} characters, returns |
@var{maxlen}. |
@end deftypefn |
*/ |
#include "config.h" |
#include <stddef.h> |
size_t |
strnlen (const char *s, size_t maxlen) |
{ |
size_t i; |
for (i = 0; i < maxlen; ++i) |
if (s[i] == '\0') |
break; |
return i; |
} |
/contrib/toolchain/binutils/libiberty/strsignal.c |
---|
0,0 → 1,610 |
/* Extended support for using signal values. |
Written by Fred Fish. fnf@cygnus.com |
This file is in the public domain. */ |
#include "config.h" |
#include "ansidecl.h" |
#include "libiberty.h" |
/* We need to declare sys_siglist, because even if the system provides |
it we can't assume that it is declared in <signal.h> (for example, |
SunOS provides sys_siglist, but it does not declare it in any |
header file). However, we can't declare sys_siglist portably, |
because on some systems it is declared with const and on some |
systems it is declared without const. If we were using autoconf, |
we could work out the right declaration. Until, then we just |
ignore any declaration in the system header files, and always |
declare it ourselves. With luck, this will always work. */ |
#define sys_siglist no_such_symbol |
#define sys_nsig sys_nsig__no_such_symbol |
#include <stdio.h> |
#include <signal.h> |
/* Routines imported from standard C runtime libraries. */ |
#ifdef HAVE_STDLIB_H |
#include <stdlib.h> |
#else |
extern PTR malloc (); |
#endif |
#ifdef HAVE_STRING_H |
#include <string.h> |
#else |
extern PTR memset (); |
#endif |
/* Undefine the macro we used to hide the definition of sys_siglist |
found in the system header files. */ |
#undef sys_siglist |
#undef sys_nsig |
#ifndef NULL |
# define NULL (void *) 0 |
#endif |
#ifndef MAX |
# define MAX(a,b) ((a) > (b) ? (a) : (b)) |
#endif |
static void init_signal_tables (void); |
/* Translation table for signal values. |
Note that this table is generally only accessed when it is used at runtime |
to initialize signal name and message tables that are indexed by signal |
value. |
Not all of these signals will exist on all systems. This table is the only |
thing that should have to be updated as new signal numbers are introduced. |
It's sort of ugly, but at least its portable. */ |
struct signal_info |
{ |
const int value; /* The numeric value from <signal.h> */ |
const char *const name; /* The equivalent symbolic value */ |
#ifndef HAVE_SYS_SIGLIST |
const char *const msg; /* Short message about this value */ |
#endif |
}; |
#ifndef HAVE_SYS_SIGLIST |
# define ENTRY(value, name, msg) {value, name, msg} |
#else |
# define ENTRY(value, name, msg) {value, name} |
#endif |
static const struct signal_info signal_table[] = |
{ |
#if defined (SIGHUP) |
ENTRY(SIGHUP, "SIGHUP", "Hangup"), |
#endif |
#if defined (SIGINT) |
ENTRY(SIGINT, "SIGINT", "Interrupt"), |
#endif |
#if defined (SIGQUIT) |
ENTRY(SIGQUIT, "SIGQUIT", "Quit"), |
#endif |
#if defined (SIGILL) |
ENTRY(SIGILL, "SIGILL", "Illegal instruction"), |
#endif |
#if defined (SIGTRAP) |
ENTRY(SIGTRAP, "SIGTRAP", "Trace/breakpoint trap"), |
#endif |
/* Put SIGIOT before SIGABRT, so that if SIGIOT==SIGABRT then SIGABRT |
overrides SIGIOT. SIGABRT is in ANSI and POSIX.1, and SIGIOT isn't. */ |
#if defined (SIGIOT) |
ENTRY(SIGIOT, "SIGIOT", "IOT trap"), |
#endif |
#if defined (SIGABRT) |
ENTRY(SIGABRT, "SIGABRT", "Aborted"), |
#endif |
#if defined (SIGEMT) |
ENTRY(SIGEMT, "SIGEMT", "Emulation trap"), |
#endif |
#if defined (SIGFPE) |
ENTRY(SIGFPE, "SIGFPE", "Arithmetic exception"), |
#endif |
#if defined (SIGKILL) |
ENTRY(SIGKILL, "SIGKILL", "Killed"), |
#endif |
#if defined (SIGBUS) |
ENTRY(SIGBUS, "SIGBUS", "Bus error"), |
#endif |
#if defined (SIGSEGV) |
ENTRY(SIGSEGV, "SIGSEGV", "Segmentation fault"), |
#endif |
#if defined (SIGSYS) |
ENTRY(SIGSYS, "SIGSYS", "Bad system call"), |
#endif |
#if defined (SIGPIPE) |
ENTRY(SIGPIPE, "SIGPIPE", "Broken pipe"), |
#endif |
#if defined (SIGALRM) |
ENTRY(SIGALRM, "SIGALRM", "Alarm clock"), |
#endif |
#if defined (SIGTERM) |
ENTRY(SIGTERM, "SIGTERM", "Terminated"), |
#endif |
#if defined (SIGUSR1) |
ENTRY(SIGUSR1, "SIGUSR1", "User defined signal 1"), |
#endif |
#if defined (SIGUSR2) |
ENTRY(SIGUSR2, "SIGUSR2", "User defined signal 2"), |
#endif |
/* Put SIGCLD before SIGCHLD, so that if SIGCLD==SIGCHLD then SIGCHLD |
overrides SIGCLD. SIGCHLD is in POXIX.1 */ |
#if defined (SIGCLD) |
ENTRY(SIGCLD, "SIGCLD", "Child status changed"), |
#endif |
#if defined (SIGCHLD) |
ENTRY(SIGCHLD, "SIGCHLD", "Child status changed"), |
#endif |
#if defined (SIGPWR) |
ENTRY(SIGPWR, "SIGPWR", "Power fail/restart"), |
#endif |
#if defined (SIGWINCH) |
ENTRY(SIGWINCH, "SIGWINCH", "Window size changed"), |
#endif |
#if defined (SIGURG) |
ENTRY(SIGURG, "SIGURG", "Urgent I/O condition"), |
#endif |
#if defined (SIGIO) |
/* "I/O pending" has also been suggested, but is misleading since the |
signal only happens when the process has asked for it, not everytime |
I/O is pending. */ |
ENTRY(SIGIO, "SIGIO", "I/O possible"), |
#endif |
#if defined (SIGPOLL) |
ENTRY(SIGPOLL, "SIGPOLL", "Pollable event occurred"), |
#endif |
#if defined (SIGSTOP) |
ENTRY(SIGSTOP, "SIGSTOP", "Stopped (signal)"), |
#endif |
#if defined (SIGTSTP) |
ENTRY(SIGTSTP, "SIGTSTP", "Stopped (user)"), |
#endif |
#if defined (SIGCONT) |
ENTRY(SIGCONT, "SIGCONT", "Continued"), |
#endif |
#if defined (SIGTTIN) |
ENTRY(SIGTTIN, "SIGTTIN", "Stopped (tty input)"), |
#endif |
#if defined (SIGTTOU) |
ENTRY(SIGTTOU, "SIGTTOU", "Stopped (tty output)"), |
#endif |
#if defined (SIGVTALRM) |
ENTRY(SIGVTALRM, "SIGVTALRM", "Virtual timer expired"), |
#endif |
#if defined (SIGPROF) |
ENTRY(SIGPROF, "SIGPROF", "Profiling timer expired"), |
#endif |
#if defined (SIGXCPU) |
ENTRY(SIGXCPU, "SIGXCPU", "CPU time limit exceeded"), |
#endif |
#if defined (SIGXFSZ) |
ENTRY(SIGXFSZ, "SIGXFSZ", "File size limit exceeded"), |
#endif |
#if defined (SIGWIND) |
ENTRY(SIGWIND, "SIGWIND", "SIGWIND"), |
#endif |
#if defined (SIGPHONE) |
ENTRY(SIGPHONE, "SIGPHONE", "SIGPHONE"), |
#endif |
#if defined (SIGLOST) |
ENTRY(SIGLOST, "SIGLOST", "Resource lost"), |
#endif |
#if defined (SIGWAITING) |
ENTRY(SIGWAITING, "SIGWAITING", "Process's LWPs are blocked"), |
#endif |
#if defined (SIGLWP) |
ENTRY(SIGLWP, "SIGLWP", "Signal LWP"), |
#endif |
#if defined (SIGDANGER) |
ENTRY(SIGDANGER, "SIGDANGER", "Swap space dangerously low"), |
#endif |
#if defined (SIGGRANT) |
ENTRY(SIGGRANT, "SIGGRANT", "Monitor mode granted"), |
#endif |
#if defined (SIGRETRACT) |
ENTRY(SIGRETRACT, "SIGRETRACT", "Need to relinguish monitor mode"), |
#endif |
#if defined (SIGMSG) |
ENTRY(SIGMSG, "SIGMSG", "Monitor mode data available"), |
#endif |
#if defined (SIGSOUND) |
ENTRY(SIGSOUND, "SIGSOUND", "Sound completed"), |
#endif |
#if defined (SIGSAK) |
ENTRY(SIGSAK, "SIGSAK", "Secure attention"), |
#endif |
ENTRY(0, NULL, NULL) |
}; |
/* Translation table allocated and initialized at runtime. Indexed by the |
signal value to find the equivalent symbolic value. */ |
static const char **signal_names; |
static int num_signal_names = 0; |
/* Translation table allocated and initialized at runtime, if it does not |
already exist in the host environment. Indexed by the signal value to find |
the descriptive string. |
We don't export it for use in other modules because even though it has the |
same name, it differs from other implementations in that it is dynamically |
initialized rather than statically initialized. */ |
#ifndef HAVE_SYS_SIGLIST |
static int sys_nsig; |
static const char **sys_siglist; |
#else |
#ifdef NSIG |
static int sys_nsig = NSIG; |
#else |
#ifdef _NSIG |
static int sys_nsig = _NSIG; |
#endif |
#endif |
extern const char * const sys_siglist[]; |
#endif |
/* |
NAME |
init_signal_tables -- initialize the name and message tables |
SYNOPSIS |
static void init_signal_tables (); |
DESCRIPTION |
Using the signal_table, which is initialized at compile time, generate |
the signal_names and the sys_siglist (if needed) tables, which are |
indexed at runtime by a specific signal value. |
BUGS |
The initialization of the tables may fail under low memory conditions, |
in which case we don't do anything particularly useful, but we don't |
bomb either. Who knows, it might succeed at a later point if we free |
some memory in the meantime. In any case, the other routines know |
how to deal with lack of a table after trying to initialize it. This |
may or may not be considered to be a bug, that we don't specifically |
warn about this particular failure mode. |
*/ |
static void |
init_signal_tables (void) |
{ |
const struct signal_info *eip; |
int nbytes; |
/* If we haven't already scanned the signal_table once to find the maximum |
signal value, then go find it now. */ |
if (num_signal_names == 0) |
{ |
for (eip = signal_table; eip -> name != NULL; eip++) |
{ |
if (eip -> value >= num_signal_names) |
{ |
num_signal_names = eip -> value + 1; |
} |
} |
} |
/* Now attempt to allocate the signal_names table, zero it out, and then |
initialize it from the statically initialized signal_table. */ |
if (signal_names == NULL) |
{ |
nbytes = num_signal_names * sizeof (char *); |
if ((signal_names = (const char **) malloc (nbytes)) != NULL) |
{ |
memset (signal_names, 0, nbytes); |
for (eip = signal_table; eip -> name != NULL; eip++) |
{ |
signal_names[eip -> value] = eip -> name; |
} |
} |
} |
#ifndef HAVE_SYS_SIGLIST |
/* Now attempt to allocate the sys_siglist table, zero it out, and then |
initialize it from the statically initialized signal_table. */ |
if (sys_siglist == NULL) |
{ |
nbytes = num_signal_names * sizeof (char *); |
if ((sys_siglist = (const char **) malloc (nbytes)) != NULL) |
{ |
memset (sys_siglist, 0, nbytes); |
sys_nsig = num_signal_names; |
for (eip = signal_table; eip -> name != NULL; eip++) |
{ |
sys_siglist[eip -> value] = eip -> msg; |
} |
} |
} |
#endif |
} |
/* |
@deftypefn Extension int signo_max (void) |
Returns the maximum signal value for which a corresponding symbolic |
name or message is available. Note that in the case where we use the |
@code{sys_siglist} supplied by the system, it is possible for there to |
be more symbolic names than messages, or vice versa. In fact, the |
manual page for @code{psignal(3b)} explicitly warns that one should |
check the size of the table (@code{NSIG}) before indexing it, since |
new signal codes may be added to the system before they are added to |
the table. Thus @code{NSIG} might be smaller than value implied by |
the largest signo value defined in @code{<signal.h>}. |
We return the maximum value that can be used to obtain a meaningful |
symbolic name or message. |
@end deftypefn |
*/ |
int |
signo_max (void) |
{ |
int maxsize; |
if (signal_names == NULL) |
{ |
init_signal_tables (); |
} |
maxsize = MAX (sys_nsig, num_signal_names); |
return (maxsize - 1); |
} |
/* |
@deftypefn Supplemental {const char *} strsignal (int @var{signo}) |
Maps an signal number to an signal message string, the contents of |
which are implementation defined. On systems which have the external |
variable @code{sys_siglist}, these strings will be the same as the |
ones used by @code{psignal()}. |
If the supplied signal number is within the valid range of indices for |
the @code{sys_siglist}, but no message is available for the particular |
signal number, then returns the string @samp{Signal @var{num}}, where |
@var{num} is the signal number. |
If the supplied signal number is not a valid index into |
@code{sys_siglist}, returns @code{NULL}. |
The returned string is only guaranteed to be valid only until the next |
call to @code{strsignal}. |
@end deftypefn |
*/ |
#ifndef HAVE_STRSIGNAL |
char * |
strsignal (int signo) |
{ |
char *msg; |
static char buf[32]; |
#ifndef HAVE_SYS_SIGLIST |
if (signal_names == NULL) |
{ |
init_signal_tables (); |
} |
#endif |
if ((signo < 0) || (signo >= sys_nsig)) |
{ |
/* Out of range, just return NULL */ |
msg = NULL; |
} |
else if ((sys_siglist == NULL) || (sys_siglist[signo] == NULL)) |
{ |
/* In range, but no sys_siglist or no entry at this index. */ |
sprintf (buf, "Signal %d", signo); |
msg = buf; |
} |
else |
{ |
/* In range, and a valid message. Just return the message. We |
can safely cast away const, since POSIX says the user must |
not modify the result. */ |
msg = (char *) sys_siglist[signo]; |
} |
return (msg); |
} |
#endif /* ! HAVE_STRSIGNAL */ |
/* |
@deftypefn Extension {const char*} strsigno (int @var{signo}) |
Given an signal number, returns a pointer to a string containing the |
symbolic name of that signal number, as found in @code{<signal.h>}. |
If the supplied signal number is within the valid range of indices for |
symbolic names, but no name is available for the particular signal |
number, then returns the string @samp{Signal @var{num}}, where |
@var{num} is the signal number. |
If the supplied signal number is not within the range of valid |
indices, then returns @code{NULL}. |
The contents of the location pointed to are only guaranteed to be |
valid until the next call to @code{strsigno}. |
@end deftypefn |
*/ |
const char * |
strsigno (int signo) |
{ |
const char *name; |
static char buf[32]; |
if (signal_names == NULL) |
{ |
init_signal_tables (); |
} |
if ((signo < 0) || (signo >= num_signal_names)) |
{ |
/* Out of range, just return NULL */ |
name = NULL; |
} |
else if ((signal_names == NULL) || (signal_names[signo] == NULL)) |
{ |
/* In range, but no signal_names or no entry at this index. */ |
sprintf (buf, "Signal %d", signo); |
name = (const char *) buf; |
} |
else |
{ |
/* In range, and a valid name. Just return the name. */ |
name = signal_names[signo]; |
} |
return (name); |
} |
/* |
@deftypefn Extension int strtosigno (const char *@var{name}) |
Given the symbolic name of a signal, map it to a signal number. If no |
translation is found, returns 0. |
@end deftypefn |
*/ |
int |
strtosigno (const char *name) |
{ |
int signo = 0; |
if (name != NULL) |
{ |
if (signal_names == NULL) |
{ |
init_signal_tables (); |
} |
for (signo = 0; signo < num_signal_names; signo++) |
{ |
if ((signal_names[signo] != NULL) && |
(strcmp (name, signal_names[signo]) == 0)) |
{ |
break; |
} |
} |
if (signo == num_signal_names) |
{ |
signo = 0; |
} |
} |
return (signo); |
} |
/* |
@deftypefn Supplemental void psignal (int @var{signo}, char *@var{message}) |
Print @var{message} to the standard error, followed by a colon, |
followed by the description of the signal specified by @var{signo}, |
followed by a newline. |
@end deftypefn |
*/ |
#ifndef HAVE_PSIGNAL |
void |
psignal (int signo, char *message) |
{ |
if (signal_names == NULL) |
{ |
init_signal_tables (); |
} |
if ((signo <= 0) || (signo >= sys_nsig)) |
{ |
fprintf (stderr, "%s: unknown signal\n", message); |
} |
else |
{ |
fprintf (stderr, "%s: %s\n", message, sys_siglist[signo]); |
} |
} |
#endif /* ! HAVE_PSIGNAL */ |
/* A simple little main that does nothing but print all the signal translations |
if MAIN is defined and this file is compiled and linked. */ |
#ifdef MAIN |
#include <stdio.h> |
int |
main (void) |
{ |
int signo; |
int maxsigno; |
const char *name; |
const char *msg; |
maxsigno = signo_max (); |
printf ("%d entries in names table.\n", num_signal_names); |
printf ("%d entries in messages table.\n", sys_nsig); |
printf ("%d is max useful index.\n", maxsigno); |
/* Keep printing values until we get to the end of *both* tables, not |
*either* table. Note that knowing the maximum useful index does *not* |
relieve us of the responsibility of testing the return pointer for |
NULL. */ |
for (signo = 0; signo <= maxsigno; signo++) |
{ |
name = strsigno (signo); |
name = (name == NULL) ? "<NULL>" : name; |
msg = strsignal (signo); |
msg = (msg == NULL) ? "<NULL>" : msg; |
printf ("%-4d%-18s%s\n", signo, name, msg); |
} |
return 0; |
} |
#endif |
/contrib/toolchain/binutils/libiberty/strverscmp.c |
---|
0,0 → 1,157 |
/* Compare strings while treating digits characters numerically. |
Copyright (C) 1997, 2002, 2005 Free Software Foundation, Inc. |
This file is part of the libiberty library. |
Contributed by Jean-François Bignolles <bignolle@ecoledoc.ibp.fr>, 1997. |
Libiberty is free software; you can redistribute it and/or |
modify it under the terms of the GNU Lesser General Public |
License as published by the Free Software Foundation; either |
version 2.1 of the License, or (at your option) any later version. |
Libiberty is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
Lesser General Public License for more details. |
You should have received a copy of the GNU Lesser General Public |
License along with the GNU C Library; if not, write to the Free |
Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
02110-1301 USA. */ |
#include "libiberty.h" |
#include "safe-ctype.h" |
/* |
@deftypefun int strverscmp (const char *@var{s1}, const char *@var{s2}) |
The @code{strverscmp} function compares the string @var{s1} against |
@var{s2}, considering them as holding indices/version numbers. Return |
value follows the same conventions as found in the @code{strverscmp} |
function. In fact, if @var{s1} and @var{s2} contain no digits, |
@code{strverscmp} behaves like @code{strcmp}. |
Basically, we compare strings normally (character by character), until |
we find a digit in each string - then we enter a special comparison |
mode, where each sequence of digits is taken as a whole. If we reach the |
end of these two parts without noticing a difference, we return to the |
standard comparison mode. There are two types of numeric parts: |
"integral" and "fractional" (those begin with a '0'). The types |
of the numeric parts affect the way we sort them: |
@itemize @bullet |
@item |
integral/integral: we compare values as you would expect. |
@item |
fractional/integral: the fractional part is less than the integral one. |
Again, no surprise. |
@item |
fractional/fractional: the things become a bit more complex. |
If the common prefix contains only leading zeroes, the longest part is less |
than the other one; else the comparison behaves normally. |
@end itemize |
@smallexample |
strverscmp ("no digit", "no digit") |
@result{} 0 // @r{same behavior as strcmp.} |
strverscmp ("item#99", "item#100") |
@result{} <0 // @r{same prefix, but 99 < 100.} |
strverscmp ("alpha1", "alpha001") |
@result{} >0 // @r{fractional part inferior to integral one.} |
strverscmp ("part1_f012", "part1_f01") |
@result{} >0 // @r{two fractional parts.} |
strverscmp ("foo.009", "foo.0") |
@result{} <0 // @r{idem, but with leading zeroes only.} |
@end smallexample |
This function is especially useful when dealing with filename sorting, |
because filenames frequently hold indices/version numbers. |
@end deftypefun |
*/ |
/* states: S_N: normal, S_I: comparing integral part, S_F: comparing |
fractional parts, S_Z: idem but with leading Zeroes only */ |
#define S_N 0x0 |
#define S_I 0x4 |
#define S_F 0x8 |
#define S_Z 0xC |
/* result_type: CMP: return diff; LEN: compare using len_diff/diff */ |
#define CMP 2 |
#define LEN 3 |
/* Compare S1 and S2 as strings holding indices/version numbers, |
returning less than, equal to or greater than zero if S1 is less than, |
equal to or greater than S2 (for more info, see the Glibc texinfo doc). */ |
int |
strverscmp (const char *s1, const char *s2) |
{ |
const unsigned char *p1 = (const unsigned char *) s1; |
const unsigned char *p2 = (const unsigned char *) s2; |
unsigned char c1, c2; |
int state; |
int diff; |
/* Symbol(s) 0 [1-9] others (padding) |
Transition (10) 0 (01) d (00) x (11) - */ |
static const unsigned int next_state[] = |
{ |
/* state x d 0 - */ |
/* S_N */ S_N, S_I, S_Z, S_N, |
/* S_I */ S_N, S_I, S_I, S_I, |
/* S_F */ S_N, S_F, S_F, S_F, |
/* S_Z */ S_N, S_F, S_Z, S_Z |
}; |
static const int result_type[] = |
{ |
/* state x/x x/d x/0 x/- d/x d/d d/0 d/- |
0/x 0/d 0/0 0/- -/x -/d -/0 -/- */ |
/* S_N */ CMP, CMP, CMP, CMP, CMP, LEN, CMP, CMP, |
CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP, |
/* S_I */ CMP, -1, -1, CMP, +1, LEN, LEN, CMP, |
+1, LEN, LEN, CMP, CMP, CMP, CMP, CMP, |
/* S_F */ CMP, CMP, CMP, CMP, CMP, LEN, CMP, CMP, |
CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP, |
/* S_Z */ CMP, +1, +1, CMP, -1, CMP, CMP, CMP, |
-1, CMP, CMP, CMP |
}; |
if (p1 == p2) |
return 0; |
c1 = *p1++; |
c2 = *p2++; |
/* Hint: '0' is a digit too. */ |
state = S_N | ((c1 == '0') + (ISDIGIT (c1) != 0)); |
while ((diff = c1 - c2) == 0 && c1 != '\0') |
{ |
state = next_state[state]; |
c1 = *p1++; |
c2 = *p2++; |
state |= (c1 == '0') + (ISDIGIT (c1) != 0); |
} |
state = result_type[state << 2 | (((c2 == '0') + (ISDIGIT (c2) != 0)))]; |
switch (state) |
{ |
case CMP: |
return diff; |
case LEN: |
while (ISDIGIT (*p1++)) |
if (!ISDIGIT (*p2++)) |
return 1; |
return ISDIGIT (*p2) ? -1 : diff; |
default: |
return state; |
} |
} |
/contrib/toolchain/binutils/libiberty/timeval-utils.c |
---|
0,0 → 1,87 |
/* Basic struct timeval utilities. |
Copyright (C) 2011 Free Software Foundation, Inc. |
This file is part of the libiberty library. |
Libiberty is free software; you can redistribute it and/or |
modify it under the terms of the GNU Library General Public |
License as published by the Free Software Foundation; either |
version 2 of the License, or (at your option) any later version. |
Libiberty is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
Library General Public License for more details. |
You should have received a copy of the GNU Library General Public |
License along with libiberty; see the file COPYING.LIB. If not, |
write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
#include "config.h" |
/* On some systems (such as WindISS), you must include <sys/types.h> |
to get the definition of "time_t" before you include <time.h>. */ |
#include <sys/types.h> |
#ifdef TIME_WITH_SYS_TIME |
# include <sys/time.h> |
# include <time.h> |
#else |
# if HAVE_SYS_TIME_H |
# include <sys/time.h> |
# else |
# ifdef HAVE_TIME_H |
# include <time.h> |
# endif |
# endif |
#endif |
#include "timeval-utils.h" |
/* |
@deftypefn Extension void timeval_add (struct timeval *@var{a}, @ |
struct timeval *@var{b}, struct timeval *@var{result}) |
Adds @var{a} to @var{b} and stores the result in @var{result}. |
@end deftypefn |
*/ |
void |
timeval_add (struct timeval *result, |
const struct timeval *a, const struct timeval *b) |
{ |
result->tv_sec = a->tv_sec + b->tv_sec; |
result->tv_usec = a->tv_usec + b->tv_usec; |
if (result->tv_usec >= 1000000) |
{ |
++result->tv_sec; |
result->tv_usec -= 1000000; |
} |
} |
/* |
@deftypefn Extension void timeval_sub (struct timeval *@var{a}, @ |
struct timeval *@var{b}, struct timeval *@var{result}) |
Subtracts @var{b} from @var{a} and stores the result in @var{result}. |
@end deftypefn |
*/ |
void |
timeval_sub (struct timeval *result, |
const struct timeval *a, const struct timeval *b) |
{ |
result->tv_sec = a->tv_sec - b->tv_sec; |
result->tv_usec = a->tv_usec - b->tv_usec; |
if (result->tv_usec < 0) |
{ |
--result->tv_sec; |
result->tv_usec += 1000000; |
} |
} |
/contrib/toolchain/binutils/libiberty/unlink-if-ordinary.c |
---|
0,0 → 1,72 |
/* unlink-if-ordinary.c - remove link to a file unless it is special |
Copyright (C) 2004, 2005 Free Software Foundation, Inc. |
This file is part of the libiberty library. This library is free |
software; you can redistribute it and/or modify it under the |
terms of the GNU General Public License as published by the |
Free Software Foundation; either version 2, or (at your option) |
any later version. |
This library is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with GNU CC; see the file COPYING. If not, write to |
the Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. |
As a special exception, if you link this library with files |
compiled with a GNU compiler to produce an executable, this does not cause |
the resulting executable to be covered by the GNU General Public License. |
This exception does not however invalidate any other reasons why |
the executable file might be covered by the GNU General Public License. */ |
/* |
@deftypefn Supplemental int unlink_if_ordinary (const char*) |
Unlinks the named file, unless it is special (e.g. a device file). |
Returns 0 when the file was unlinked, a negative value (and errno set) when |
there was an error deleting the file, and a positive value if no attempt |
was made to unlink the file because it is special. |
@end deftypefn |
*/ |
#ifdef HAVE_CONFIG_H |
#include "config.h" |
#endif |
#include <sys/types.h> |
#ifdef HAVE_UNISTD_H |
#include <unistd.h> |
#endif |
#if HAVE_SYS_STAT_H |
#include <sys/stat.h> |
#endif |
#include "libiberty.h" |
#ifndef S_ISLNK |
#ifdef S_IFLNK |
#define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) |
#else |
#define S_ISLNK(m) 0 |
#define lstat stat |
#endif |
#endif |
int |
unlink_if_ordinary (const char *name) |
{ |
struct stat st; |
if (lstat (name, &st) == 0 |
&& (S_ISREG (st.st_mode) || S_ISLNK (st.st_mode))) |
return unlink (name); |
return 1; |
} |
/contrib/toolchain/binutils/libiberty/vasprintf.c |
---|
0,0 → 1,197 |
/* Like vsprintf but provides a pointer to malloc'd storage, which must |
be freed by the caller. |
Copyright (C) 1994, 2003, 2011 Free Software Foundation, Inc. |
This file is part of the libiberty library. |
Libiberty is free software; you can redistribute it and/or |
modify it under the terms of the GNU Library General Public |
License as published by the Free Software Foundation; either |
version 2 of the License, or (at your option) any later version. |
Libiberty is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
Library General Public License for more details. |
You should have received a copy of the GNU Library General Public |
License along with libiberty; see the file COPYING.LIB. If |
not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
#ifdef HAVE_CONFIG_H |
#include "config.h" |
#endif |
#include <ansidecl.h> |
#include <stdarg.h> |
#if !defined (va_copy) && defined (__va_copy) |
# define va_copy(d,s) __va_copy((d),(s)) |
#endif |
#include <stdio.h> |
#ifdef HAVE_STRING_H |
#include <string.h> |
#endif |
#ifdef HAVE_STDLIB_H |
#include <stdlib.h> |
#else |
extern unsigned long strtoul (); |
extern PTR malloc (); |
#endif |
#include "libiberty.h" |
#ifdef TEST |
int global_total_width; |
#endif |
/* |
@deftypefn Extension int vasprintf (char **@var{resptr}, @ |
const char *@var{format}, va_list @var{args}) |
Like @code{vsprintf}, but instead of passing a pointer to a buffer, |
you pass a pointer to a pointer. This function will compute the size |
of the buffer needed, allocate memory with @code{malloc}, and store a |
pointer to the allocated memory in @code{*@var{resptr}}. The value |
returned is the same as @code{vsprintf} would return. If memory could |
not be allocated, minus one is returned and @code{NULL} is stored in |
@code{*@var{resptr}}. |
@end deftypefn |
*/ |
static int int_vasprintf (char **, const char *, va_list); |
static int |
int_vasprintf (char **result, const char *format, va_list args) |
{ |
const char *p = format; |
/* Add one to make sure that it is never zero, which might cause malloc |
to return NULL. */ |
int total_width = strlen (format) + 1; |
va_list ap; |
#ifdef va_copy |
va_copy (ap, args); |
#else |
memcpy ((PTR) &ap, (PTR) &args, sizeof (va_list)); |
#endif |
while (*p != '\0') |
{ |
if (*p++ == '%') |
{ |
while (strchr ("-+ #0", *p)) |
++p; |
if (*p == '*') |
{ |
++p; |
total_width += abs (va_arg (ap, int)); |
} |
else |
total_width += strtoul (p, (char **) &p, 10); |
if (*p == '.') |
{ |
++p; |
if (*p == '*') |
{ |
++p; |
total_width += abs (va_arg (ap, int)); |
} |
else |
total_width += strtoul (p, (char **) &p, 10); |
} |
while (strchr ("hlL", *p)) |
++p; |
/* Should be big enough for any format specifier except %s and floats. */ |
total_width += 30; |
switch (*p) |
{ |
case 'd': |
case 'i': |
case 'o': |
case 'u': |
case 'x': |
case 'X': |
case 'c': |
(void) va_arg (ap, int); |
break; |
case 'f': |
case 'e': |
case 'E': |
case 'g': |
case 'G': |
(void) va_arg (ap, double); |
/* Since an ieee double can have an exponent of 307, we'll |
make the buffer wide enough to cover the gross case. */ |
total_width += 307; |
break; |
case 's': |
total_width += strlen (va_arg (ap, char *)); |
break; |
case 'p': |
case 'n': |
(void) va_arg (ap, char *); |
break; |
} |
p++; |
} |
} |
#ifdef va_copy |
va_end (ap); |
#endif |
#ifdef TEST |
global_total_width = total_width; |
#endif |
*result = (char *) malloc (total_width); |
if (*result != NULL) |
return vsprintf (*result, format, args); |
else |
return -1; |
} |
int |
vasprintf (char **result, const char *format, |
#if defined (_BSD_VA_LIST_) && defined (__FreeBSD__) |
_BSD_VA_LIST_ args) |
#else |
va_list args) |
#endif |
{ |
return int_vasprintf (result, format, args); |
} |
#ifdef TEST |
static void ATTRIBUTE_PRINTF_1 |
checkit (const char *format, ...) |
{ |
char *result; |
VA_OPEN (args, format); |
VA_FIXEDARG (args, const char *, format); |
vasprintf (&result, format, args); |
VA_CLOSE (args); |
if (strlen (result) < (size_t) global_total_width) |
printf ("PASS: "); |
else |
printf ("FAIL: "); |
printf ("%d %s\n", global_total_width, result); |
free (result); |
} |
extern int main (void); |
int |
main (void) |
{ |
checkit ("%d", 0x12345678); |
checkit ("%200d", 5); |
checkit ("%.300d", 6); |
checkit ("%100.150d", 7); |
checkit ("%s", "jjjjjjjjjiiiiiiiiiiiiiiioooooooooooooooooppppppppppppaa\n\ |
777777777777777777333333333333366666666666622222222222777777777777733333"); |
checkit ("%f%s%d%s", 1.0, "foo", 77, "asdjffffffffffffffiiiiiiiiiiixxxxx"); |
return 0; |
} |
#endif /* TEST */ |
/contrib/toolchain/binutils/libiberty/xatexit.c |
---|
0,0 → 1,99 |
/* |
* Copyright (c) 1990 Regents of the University of California. |
* All rights reserved. |
* |
* %sccs.include.redist.c% |
*/ |
/* |
@deftypefun int xatexit (void (*@var{fn}) (void)) |
Behaves as the standard @code{atexit} function, but with no limit on |
the number of registered functions. Returns 0 on success, or @minus{}1 on |
failure. If you use @code{xatexit} to register functions, you must use |
@code{xexit} to terminate your program. |
@end deftypefun |
*/ |
/* Adapted from newlib/libc/stdlib/{,at}exit.[ch]. |
If you use xatexit, you must call xexit instead of exit. */ |
#ifdef HAVE_CONFIG_H |
#include "config.h" |
#endif |
#include "ansidecl.h" |
#include "libiberty.h" |
#include <stdio.h> |
#include <stddef.h> |
#if VMS |
#include <stdlib.h> |
#include <unixlib.h> |
#else |
/* For systems with larger pointers than ints, this must be declared. */ |
PTR malloc (size_t); |
#endif |
static void xatexit_cleanup (void); |
/* Pointer to function run by xexit. */ |
extern void (*_xexit_cleanup) (void); |
#define XATEXIT_SIZE 32 |
struct xatexit { |
struct xatexit *next; /* next in list */ |
int ind; /* next index in this table */ |
void (*fns[XATEXIT_SIZE]) (void); /* the table itself */ |
}; |
/* Allocate one struct statically to guarantee that we can register |
at least a few handlers. */ |
static struct xatexit xatexit_first; |
/* Points to head of LIFO stack. */ |
static struct xatexit *xatexit_head = &xatexit_first; |
/* Register function FN to be run by xexit. |
Return 0 if successful, -1 if not. */ |
int |
xatexit (void (*fn) (void)) |
{ |
register struct xatexit *p; |
/* Tell xexit to call xatexit_cleanup. */ |
if (!_xexit_cleanup) |
_xexit_cleanup = xatexit_cleanup; |
p = xatexit_head; |
if (p->ind >= XATEXIT_SIZE) |
{ |
if ((p = (struct xatexit *) malloc (sizeof *p)) == NULL) |
return -1; |
p->ind = 0; |
p->next = xatexit_head; |
xatexit_head = p; |
} |
p->fns[p->ind++] = fn; |
return 0; |
} |
/* Call any cleanup functions. */ |
static void |
xatexit_cleanup (void) |
{ |
register struct xatexit *p; |
register int n; |
for (p = xatexit_head; p; p = p->next) |
for (n = p->ind; --n >= 0;) |
(*p->fns[n]) (); |
} |
/contrib/toolchain/binutils/libiberty/xexit.c |
---|
0,0 → 1,52 |
/* xexit.c -- Run any exit handlers, then exit. |
Copyright (C) 1994, 95, 1997 Free Software Foundation, Inc. |
This file is part of the libiberty library. |
Libiberty is free software; you can redistribute it and/or |
modify it under the terms of the GNU Library General Public |
License as published by the Free Software Foundation; either |
version 2 of the License, or (at your option) any later version. |
Libiberty is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
Library General Public License for more details. |
You should have received a copy of the GNU Library General Public |
License along with libiberty; see the file COPYING.LIB. If not, write |
to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
/* |
@deftypefn Replacement void xexit (int @var{code}) |
Terminates the program. If any functions have been registered with |
the @code{xatexit} replacement function, they will be called first. |
Termination is handled via the system's normal @code{exit} call. |
@end deftypefn |
*/ |
#ifdef HAVE_CONFIG_H |
#include "config.h" |
#endif |
#include <stdio.h> |
#ifdef HAVE_STDLIB_H |
#include <stdlib.h> |
#endif |
#include "libiberty.h" |
/* This variable is set by xatexit if it is called. This way, xmalloc |
doesn't drag xatexit into the link. */ |
void (*_xexit_cleanup) (void); |
void |
xexit (int code) |
{ |
if (_xexit_cleanup != NULL) |
(*_xexit_cleanup) (); |
exit (code); |
} |
/contrib/toolchain/binutils/libiberty/xmalloc.c |
---|
0,0 → 1,184 |
/* memory allocation routines with error checking. |
Copyright 1989, 90, 91, 92, 93, 94 Free Software Foundation, Inc. |
This file is part of the libiberty library. |
Libiberty is free software; you can redistribute it and/or |
modify it under the terms of the GNU Library General Public |
License as published by the Free Software Foundation; either |
version 2 of the License, or (at your option) any later version. |
Libiberty is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
Library General Public License for more details. |
You should have received a copy of the GNU Library General Public |
License along with libiberty; see the file COPYING.LIB. If |
not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
/* |
@deftypefn Replacement void* xmalloc (size_t) |
Allocate memory without fail. If @code{malloc} fails, this will print |
a message to @code{stderr} (using the name set by |
@code{xmalloc_set_program_name}, |
if any) and then call @code{xexit}. Note that it is therefore safe for |
a program to contain @code{#define malloc xmalloc} in its source. |
@end deftypefn |
@deftypefn Replacement void* xrealloc (void *@var{ptr}, size_t @var{size}) |
Reallocate memory without fail. This routine functions like @code{realloc}, |
but will behave the same as @code{xmalloc} if memory cannot be found. |
@end deftypefn |
@deftypefn Replacement void* xcalloc (size_t @var{nelem}, size_t @var{elsize}) |
Allocate memory without fail, and set it to zero. This routine functions |
like @code{calloc}, but will behave the same as @code{xmalloc} if memory |
cannot be found. |
@end deftypefn |
@deftypefn Replacement void xmalloc_set_program_name (const char *@var{name}) |
You can use this to set the name of the program used by |
@code{xmalloc_failed} when printing a failure message. |
@end deftypefn |
@deftypefn Replacement void xmalloc_failed (size_t) |
This function is not meant to be called by client code, and is listed |
here for completeness only. If any of the allocation routines fail, this |
function will be called to print an error message and terminate execution. |
@end deftypefn |
*/ |
#ifdef HAVE_CONFIG_H |
#include "config.h" |
#endif |
#include "ansidecl.h" |
#include "libiberty.h" |
#include <stdio.h> |
#include <stddef.h> |
#if VMS |
#include <stdlib.h> |
#include <unixlib.h> |
#else |
/* For systems with larger pointers than ints, these must be declared. */ |
# if HAVE_STDLIB_H && HAVE_UNISTD_H && HAVE_DECL_MALLOC \ |
&& HAVE_DECL_REALLOC && HAVE_DECL_CALLOC && HAVE_DECL_SBRK |
# include <stdlib.h> |
# include <unistd.h> |
# else |
# ifdef __cplusplus |
extern "C" { |
# endif /* __cplusplus */ |
void *malloc (size_t); |
void *realloc (void *, size_t); |
void *calloc (size_t, size_t); |
void *sbrk (ptrdiff_t); |
# ifdef __cplusplus |
} |
# endif /* __cplusplus */ |
# endif /* HAVE_STDLIB_H ... */ |
#endif /* VMS */ |
/* The program name if set. */ |
static const char *name = ""; |
#ifdef HAVE_SBRK |
/* The initial sbrk, set when the program name is set. Not used for win32 |
ports other than cygwin32. */ |
static char *first_break = NULL; |
#endif /* HAVE_SBRK */ |
void |
xmalloc_set_program_name (const char *s) |
{ |
name = s; |
#ifdef HAVE_SBRK |
/* Win32 ports other than cygwin32 don't have brk() */ |
if (first_break == NULL) |
first_break = (char *) sbrk (0); |
#endif /* HAVE_SBRK */ |
} |
void |
xmalloc_failed (size_t size) |
{ |
#ifdef HAVE_SBRK |
extern char **environ; |
size_t allocated; |
if (first_break != NULL) |
allocated = (char *) sbrk (0) - first_break; |
else |
allocated = (char *) sbrk (0) - (char *) &environ; |
fprintf (stderr, |
"\n%s%sout of memory allocating %lu bytes after a total of %lu bytes\n", |
name, *name ? ": " : "", |
(unsigned long) size, (unsigned long) allocated); |
#else /* HAVE_SBRK */ |
fprintf (stderr, |
"\n%s%sout of memory allocating %lu bytes\n", |
name, *name ? ": " : "", |
(unsigned long) size); |
#endif /* HAVE_SBRK */ |
xexit (1); |
} |
PTR |
xmalloc (size_t size) |
{ |
PTR newmem; |
if (size == 0) |
size = 1; |
newmem = malloc (size); |
if (!newmem) |
xmalloc_failed (size); |
return (newmem); |
} |
PTR |
xcalloc (size_t nelem, size_t elsize) |
{ |
PTR newmem; |
if (nelem == 0 || elsize == 0) |
nelem = elsize = 1; |
newmem = calloc (nelem, elsize); |
if (!newmem) |
xmalloc_failed (nelem * elsize); |
return (newmem); |
} |
PTR |
xrealloc (PTR oldmem, size_t size) |
{ |
PTR newmem; |
if (size == 0) |
size = 1; |
if (!oldmem) |
newmem = malloc (size); |
else |
newmem = realloc (oldmem, size); |
if (!newmem) |
xmalloc_failed (size); |
return (newmem); |
} |
/contrib/toolchain/binutils/libiberty/xmemdup.c |
---|
0,0 → 1,39 |
/* xmemdup.c -- Duplicate a memory buffer, using xcalloc. |
This trivial function is in the public domain. |
Jeff Garzik, September 1999. */ |
/* |
@deftypefn Replacement void* xmemdup (void *@var{input}, @ |
size_t @var{copy_size}, size_t @var{alloc_size}) |
Duplicates a region of memory without fail. First, @var{alloc_size} bytes |
are allocated, then @var{copy_size} bytes from @var{input} are copied into |
it, and the new memory is returned. If fewer bytes are copied than were |
allocated, the remaining memory is zeroed. |
@end deftypefn |
*/ |
#ifdef HAVE_CONFIG_H |
#include "config.h" |
#endif |
#include "ansidecl.h" |
#include "libiberty.h" |
#include <sys/types.h> /* For size_t. */ |
#ifdef HAVE_STRING_H |
#include <string.h> |
#else |
# ifdef HAVE_STRINGS_H |
# include <strings.h> |
# endif |
#endif |
PTR |
xmemdup (const PTR input, size_t copy_size, size_t alloc_size) |
{ |
PTR output = xcalloc (1, alloc_size); |
return (PTR) memcpy (output, input, copy_size); |
} |
/contrib/toolchain/binutils/libiberty/xstrdup.c |
---|
0,0 → 1,36 |
/* xstrdup.c -- Duplicate a string in memory, using xmalloc. |
This trivial function is in the public domain. |
Ian Lance Taylor, Cygnus Support, December 1995. */ |
/* |
@deftypefn Replacement char* xstrdup (const char *@var{s}) |
Duplicates a character string without fail, using @code{xmalloc} to |
obtain memory. |
@end deftypefn |
*/ |
#ifdef HAVE_CONFIG_H |
#include "config.h" |
#endif |
#include <sys/types.h> |
#ifdef HAVE_STRING_H |
#include <string.h> |
#else |
# ifdef HAVE_STRINGS_H |
# include <strings.h> |
# endif |
#endif |
#include "ansidecl.h" |
#include "libiberty.h" |
char * |
xstrdup (const char *s) |
{ |
register size_t len = strlen (s) + 1; |
register char *ret = XNEWVEC (char, len); |
return (char *) memcpy (ret, s, len); |
} |
/contrib/toolchain/binutils/libiberty/xstrerror.c |
---|
0,0 → 1,79 |
/* xstrerror.c -- jacket routine for more robust strerror() usage. |
Fri Jun 16 18:30:00 1995 Pat Rankin <rankin@eql.caltech.edu> |
This code is in the public domain. */ |
/* |
@deftypefn Replacement char* xstrerror (int @var{errnum}) |
Behaves exactly like the standard @code{strerror} function, but |
will never return a @code{NULL} pointer. |
@end deftypefn |
*/ |
#include <stdio.h> |
#include "config.h" |
#include "libiberty.h" |
#ifdef VMS |
# include <errno.h> |
# if !defined (__STRICT_ANSI__) && !defined (__HIDE_FORBIDDEN_NAMES) |
# ifdef __cplusplus |
extern "C" { |
# endif /* __cplusplus */ |
extern char *strerror (int,...); |
# define DONT_DECLARE_STRERROR |
# ifdef __cplusplus |
} |
# endif /* __cplusplus */ |
# endif |
#endif /* VMS */ |
#ifndef DONT_DECLARE_STRERROR |
# ifdef __cplusplus |
extern "C" { |
# endif /* __cplusplus */ |
extern char *strerror (int); |
# ifdef __cplusplus |
} |
# endif /* __cplusplus */ |
#endif |
/* If strerror returns NULL, we'll format the number into a static buffer. */ |
#define ERRSTR_FMT "undocumented error #%d" |
static char xstrerror_buf[sizeof ERRSTR_FMT + 20]; |
/* Like strerror, but result is never a null pointer. */ |
char * |
xstrerror (int errnum) |
{ |
char *errstr; |
#ifdef VMS |
char *(*vmslib_strerror) (int,...); |
/* Override any possibly-conflicting declaration from system header. */ |
vmslib_strerror = (char *(*) (int,...)) strerror; |
/* Second argument matters iff first is EVMSERR, but it's simpler to |
pass it unconditionally. `vaxc$errno' is declared in <errno.h> |
and maintained by the run-time library in parallel to `errno'. |
We assume that `errnum' corresponds to the last value assigned to |
errno by the run-time library, hence vaxc$errno will be relevant. */ |
errstr = (*vmslib_strerror) (errnum, vaxc$errno); |
#else |
errstr = strerror (errnum); |
#endif |
/* If `errnum' is out of range, result might be NULL. We'll fix that. */ |
if (!errstr) |
{ |
sprintf (xstrerror_buf, ERRSTR_FMT, errnum); |
errstr = xstrerror_buf; |
} |
return errstr; |
} |
/contrib/toolchain/binutils/libiberty/xstrndup.c |
---|
0,0 → 1,60 |
/* Implement the xstrndup function. |
Copyright (C) 2005 Free Software Foundation, Inc. |
Written by Kaveh R. Ghazi <ghazi@caip.rutgers.edu>. |
This file is part of the libiberty library. |
Libiberty is free software; you can redistribute it and/or |
modify it under the terms of the GNU Library General Public |
License as published by the Free Software Foundation; either |
version 2 of the License, or (at your option) any later version. |
Libiberty is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
Library General Public License for more details. |
You should have received a copy of the GNU Library General Public |
License along with libiberty; see the file COPYING.LIB. If |
not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
/* |
@deftypefn Replacement char* xstrndup (const char *@var{s}, size_t @var{n}) |
Returns a pointer to a copy of @var{s} with at most @var{n} characters |
without fail, using @code{xmalloc} to obtain memory. The result is |
always NUL terminated. |
@end deftypefn |
*/ |
#ifdef HAVE_CONFIG_H |
#include "config.h" |
#endif |
#include <sys/types.h> |
#ifdef HAVE_STRING_H |
#include <string.h> |
#else |
# ifdef HAVE_STRINGS_H |
# include <strings.h> |
# endif |
#endif |
#include "ansidecl.h" |
#include "libiberty.h" |
char * |
xstrndup (const char *s, size_t n) |
{ |
char *result; |
size_t len = strlen (s); |
if (n < len) |
len = n; |
result = XNEWVEC (char, len + 1); |
result[len] = '\0'; |
return (char *) memcpy (result, s, len); |
} |