diff options
author | Petter Rodhelind <petter.rodhelind@gmail.com> | 2020-01-14 11:41:08 +0100 |
---|---|---|
committer | Petter Rodhelind <petter.rodhelind@gmail.com> | 2020-01-14 11:41:08 +0100 |
commit | 02d7aa8915f9c3a3288dab01f321eb94ba219e3b (patch) | |
tree | f053238978479e408a2b83571443e132f30586ab /src/libmach/manglegcc2.c | |
parent | c0c9d8f883dfd3a7f5a74499d91bb95884b15873 (diff) | |
parent | 3d1382b98a502d0c34d5ba2c462396acc515016e (diff) | |
download | plan9port-02d7aa8915f9c3a3288dab01f321eb94ba219e3b.tar.gz plan9port-02d7aa8915f9c3a3288dab01f321eb94ba219e3b.tar.bz2 plan9port-02d7aa8915f9c3a3288dab01f321eb94ba219e3b.zip |
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'src/libmach/manglegcc2.c')
-rw-r--r-- | src/libmach/manglegcc2.c | 47 |
1 files changed, 23 insertions, 24 deletions
diff --git a/src/libmach/manglegcc2.c b/src/libmach/manglegcc2.c index 9dae425b..66231637 100644 --- a/src/libmach/manglegcc2.c +++ b/src/libmach/manglegcc2.c @@ -63,7 +63,7 @@ static Chartab modifiertab[] = 'S', "signed", /* means static for member functions */ 'U', "unsigned", 'V', "volatile", - + 'G', "garbage", /* no idea what this is */ 0, 0 }; @@ -86,7 +86,7 @@ demanglegcc2(char *s, char *buf) { char *name, *os, *p, *t; int isfn, namelen; - + /* * Pick off some cases that seem not to fit the pattern. @@ -119,22 +119,22 @@ demanglegcc2(char *s, char *buf) isfn = 1; name = gdestructor; namelen = strlen(name); - s += 13; + s += 13; }else if(memcmp(s, "_GLOBAL_.D._", 12) == 0){ isfn = 0; name = gdestructor; namelen = strlen(name); - s += 12; + s += 12; }else if(memcmp(s, "_GLOBAL_.I.__", 13) == 0){ isfn = 1; name = gconstructor; namelen = strlen(name); - s += 13; + s += 13; }else if(memcmp(s, "_GLOBAL_.I._", 12) == 0){ isfn = 0; name = gconstructor; namelen = strlen(name); - s += 12; + s += 12; }else{ t = strstr(os, "__"); if(t == nil) @@ -144,7 +144,7 @@ demanglegcc2(char *s, char *buf) if(strchr(manglestarts, *(s+2))) break; }while((t = strstr(s+1, "__")) != nil); - + name = os; namelen = s - os; if(namelen == 0){ @@ -154,14 +154,14 @@ demanglegcc2(char *s, char *buf) } s += 2; } - + /* * Now s points at the mangled crap (maybe). * and name is the final element of the name. */ if(strchr(manglestarts, *s) == nil) return os; - + p = buf; if(*s == 'F'){ /* global function, no extra name pieces, just types */ @@ -173,7 +173,7 @@ demanglegcc2(char *s, char *buf) fprint(2, "parsename %s: %r\n", s); return os; } - + /* if we have a constructor or destructor, try to use the C++ name */ t = nil; if(name == constructor || name == destructor){ @@ -197,7 +197,7 @@ demanglegcc2(char *s, char *buf) p -= 2; memmove(p, name, namelen); p += namelen; - + if(*s == 'F'){ /* might be from above, or might follow name pieces */ s++; @@ -219,8 +219,8 @@ demanglegcc2(char *s, char *buf) if(*s == '_'){ /* return type (left over from H) */ - } - + } + *p = 0; return buf; } @@ -234,7 +234,7 @@ static char* demanglegcc2a(char *s, char *buf) { char *p; - + if(*s != '_' || strchr(manglestarts, *(s+1)) == nil) return nil; p = buf; @@ -259,7 +259,7 @@ demanglegcc2b(char *s, char *buf) { char *p; char *t; - + if(memcmp(s, "__ti", 4) == 0){ t = "$typeinfo"; s += 4; @@ -325,7 +325,7 @@ gccnumber(char **ps, int *pn, int many) { char *s; int n, eatunderscore; - + s = *ps; eatunderscore = 0; if(!many && *s == '_'){ @@ -362,7 +362,7 @@ gccname(char **ps, char **pp) { int i, n, m, val; char *os, *s, *t, *p, *p0, *p1; - + s = *ps; os = s; p = *pp; @@ -376,7 +376,7 @@ gccname(char **ps, char **pp) p += strlen(t); goto out; } - + /* modifiers */ if((t = chartabsearch(modifiertab, *s)) != nil){ s++; @@ -394,7 +394,7 @@ gccname(char **ps, char **pp) */ goto out; } - + switch(*s){ default: bad: @@ -546,7 +546,7 @@ gccname(char **ps, char **pp) if(!gccname(&s, &p)) return 0; break; - + case 'Q': /* qualified name */ s++; if(!gccnumber(&s, &n, 0)) @@ -601,7 +601,7 @@ gccname(char **ps, char **pp) } *p++ = '>'; break; - + case 'T': /* once-repeated type */ s++; if(!gccnumber(&s, &n, 0)) @@ -609,7 +609,7 @@ gccname(char **ps, char **pp) sprint(p, "T%d", n); p += strlen(p); break; - + case 'X': /* type parameter in 'H' */ if(!isdigit((uchar)*(s+1)) || !isdigit((uchar)*(s+2))) goto bad; @@ -622,9 +622,8 @@ gccname(char **ps, char **pp) USED(p1); USED(p0); -out: +out: *ps = s; *pp = p; return 1; } - |