summaryrefslogtreecommitdiff
path: root/libiberty/cplus-dem.c
diff options
context:
space:
mode:
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>1998-08-19 13:05:52 +0000
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>1998-08-19 13:05:52 +0000
commit37c9cc60fb49f0ff9aee2e34d3a5c593fcb818b6 (patch)
treef5fe7b0ede9446140ddb3f6734b49a72b5b43110 /libiberty/cplus-dem.c
parent02e61418971f1a58c09faad67d448e20b4a567c7 (diff)
downloadgcc-37c9cc60fb49f0ff9aee2e34d3a5c593fcb818b6.tar.gz
x
* cplus-dem.c (work_stuff): Add dllimported. (demangled_prefix): Mark symbols imported from PE DLL. (internal_cplus_demangled): Handle. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@21852 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libiberty/cplus-dem.c')
-rw-r--r--libiberty/cplus-dem.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/libiberty/cplus-dem.c b/libiberty/cplus-dem.c
index 0f1dcc54a54..6b58ae25779 100644
--- a/libiberty/cplus-dem.c
+++ b/libiberty/cplus-dem.c
@@ -128,6 +128,7 @@ struct work_stuff
int static_type; /* A static member function */
int const_type; /* A const member function */
int volatile_type; /* A volatile member function */
+ 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
@@ -672,6 +673,7 @@ internal_cplus_demangle (work, mangled)
work->constructor = work->destructor = 0;
work->static_type = work->const_type = 0;
work->volatile_type = 0;
+ work->dllimported = 0;
if ((mangled != NULL) && (*mangled != '\0'))
{
@@ -706,6 +708,11 @@ internal_cplus_demangle (work, mangled)
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;
@@ -1757,7 +1764,17 @@ demangle_prefix (work, mangled, declp)
const char *scan;
int i;
- if (strlen(*mangled) >= 11 && strncmp(*mangled, "_GLOBAL_", 8) == 0)
+ 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])