Adds support for DMGL_RET_POSTFIX in D demangler, so it shows the type of the declared variable, or function return type. Postfix notation is used with space.
libiberty/ChangeLog: * d-demangle.c: Add DMGL_RET_POSTFIX support. * testsuite/d-demangle-expected: Add new tests. Signed-off-by: Witold Baryluk <witold.bary...@gmail.com> --- libiberty/ChangeLog | 5 ++ libiberty/d-demangle.c | 18 +++++- libiberty/testsuite/d-demangle-expected | 84 +++++++++++++++++++++++++ 3 files changed, 104 insertions(+), 3 deletions(-) diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog index 45dcc6d61..32cc8ff23 100644 --- a/libiberty/ChangeLog +++ b/libiberty/ChangeLog @@ -1,3 +1,8 @@ +2020-05-15 Witold Baryluk <witold.bary...@gmail.com> + + * d-demangle.c: Add DMGL_RET_POSTFIX support. + * testsuite/d-demangle-expected: Add new tests. + 2020-05-15 Iain Buclaw <ibuc...@gdcproject.org> * d-demangle.c (dlang_attributes): Add @live attribute. diff --git a/libiberty/d-demangle.c b/libiberty/d-demangle.c index f2d6946ec..318c21c8d 100644 --- a/libiberty/d-demangle.c +++ b/libiberty/d-demangle.c @@ -167,6 +167,8 @@ struct dlang_info const char *s; /* The index of the last back reference. */ int last_backref; + /* Demangler options passed to dlang_demangle. */ + int option; }; /* Pass as the LEN to dlang_parse_template if symbol length is not known. */ @@ -1553,6 +1555,15 @@ dlang_parse_mangle (string *decl, const char *mangled, struct dlang_info *info) string_init (&type); mangled = dlang_type (&type, mangled, info); + + /* If requested return the return type of a function or type of + a variable in postfix notation with space as separator. */ + if ((info->option & DMGL_RET_POSTFIX) != 0) + { + string_append (decl, " "); + string_appendn (decl, type.b, string_length (&type)); + } + string_delete (&type); } } @@ -1860,17 +1871,18 @@ dlang_parse_template (string *decl, const char *mangled, /* Initialize the information structure we use to pass around information. */ static void dlang_demangle_init_info (const char *mangled, int last_backref, - struct dlang_info *info) + int option, struct dlang_info *info) { info->s = mangled; info->last_backref = last_backref; + info->option = option; } /* Extract and demangle the symbol in MANGLED. Returns the demangled signature on success or NULL on failure. */ char * -dlang_demangle (const char *mangled, int option ATTRIBUTE_UNUSED) +dlang_demangle (const char *mangled, int option) { string decl; char *demangled = NULL; @@ -1891,7 +1903,7 @@ dlang_demangle (const char *mangled, int option ATTRIBUTE_UNUSED) { struct dlang_info info; - dlang_demangle_init_info (mangled, strlen (mangled), &info); + dlang_demangle_init_info (mangled, strlen (mangled), option, &info); mangled = dlang_parse_mangle (&decl, mangled, &info); /* Check that the entire symbol was successfully demangled. */ diff --git a/libiberty/testsuite/d-demangle-expected b/libiberty/testsuite/d-demangle-expected index e3f32e31d..778058b40 100644 --- a/libiberty/testsuite/d-demangle-expected +++ b/libiberty/testsuite/d-demangle-expected @@ -1406,3 +1406,87 @@ std.algorithm.iteration.FilterResult!(std.typecons.Tuple!(int, "a", int, "b", in --format=dlang _D3std3uni__T6toCaseS_DQvQt12toLowerIndexFNaNbNiNewZtVii1043S_DQCjQCi10toLowerTabFNaNbNiNemZwSQDo5ascii7toLowerTAyaZQDzFNaNeQmZ14__foreachbody2MFNaNeKmKwZ14__foreachbody3MFNaNeKwZi std.uni.toCase!(std.uni.toLowerIndex(dchar), 1043, std.uni.toLowerTab(ulong), std.ascii.toLower, immutable(char)[]).toCase(immutable(char)[]).__foreachbody2(ref ulong, ref dchar).__foreachbody3(ref dchar) +# +--format=dlang +_D3std8datetime9stopwatch9StopWatch6__ctorMFNbNcNiNfEQBz8typecons__T4FlagVAyaa9_6175746f5374617274ZQBfZSQDyQDxQDrQDk +std.datetime.stopwatch.StopWatch.this(std.typecons.Flag!("autoStart").Flag) +# +--format=dlang +_D4core4time8Duration__T8opBinaryVAyaa1_2bTSQBqQBoQBmZQBeMxFNaNbNiNfQzZQBc +core.time.Duration.opBinary!("+", core.time.Duration).opBinary(core.time.Duration) const +# +--format=dlang +_D4core4sync5mutex5Mutex__T12lock_nothrowTOCQBqQBoQBmQBjZQBeMOFNbNiNeZv +core.sync.mutex.Mutex.lock_nothrow!(shared(core.sync.mutex.Mutex)).lock_nothrow() shared +# +--format=dlang +_D4core8internal5array8capacity__T22_d_arraysetlengthTImplHTAPmTQdZ18_d_arraysetlengthTFNaNbNeMNkKQBmmZm +core.internal.array.capacity._d_arraysetlengthTImpl!(ulong*[], ulong*)._d_arraysetlengthT(scope return ref ulong*[], ulong) +# +--format=dlang +_D3std6random__T7uniformVAyaa2_5b29TiTiTSQBnQBm__T21MersenneTwisterEngineTkVmi32Vmi624Vmi397Vmi31Vki2567483615Vmi11Vki4294967295Vmi7Vki2636928640Vmi15Vki4022730752Vmi18Vki1812433253ZQFcZQGoFNaNfiiKQGbZi +std.random.uniform!("[)", int, int, std.random.MersenneTwisterEngine!(uint, 32uL, 624uL, 397uL, 31uL, 2567483615u, 11uL, 4294967295u, 7uL, 2636928640u, 15uL, 4022730752u, 18uL, 1812433253u).MersenneTwisterEngine).uniform(int, int, ref std.random.MersenneTwisterEngine!(uint, 32uL, 624uL, 397uL, 31uL, 2567483615u, 11uL, 4294967295u, 7uL, 2636928640u, 15uL, 4022730752u, 18uL, 1812433253u).MersenneTwisterEngine) +# +--format=dlang +_D3std5range__T9GeneratorS_D3rcu8gen_listFZ9__lambda1FNfZiZQBs8popFrontMFNfZv +std.range.Generator!(rcu.gen_list().__lambda1()).Generator.popFront() +# +--format=dlang +_D3std4conv__T4textTAyaTQeTQhZQqFNaNbNfQtQvQxZQBa +std.conv.text!(immutable(char)[], immutable(char)[], immutable(char)[]).text(immutable(char)[], immutable(char)[], immutable(char)[]) +# +--format=dlang +_D3std6format15FormatException6__ctorMFNaNbNiNfAyaQdmC6object9ThrowableZCQCtQCsQCo +std.format.FormatException.this(immutable(char)[], immutable(char)[], ulong, object.Throwable) +# +--format=dlang +_D3std9algorithm8mutation__T11moveEmplaceTASQBq8datetime8timezone13PosixTimeZone14TempTransitionZQCrFNaNbNiKQCoKQCsZv +std.algorithm.mutation.moveEmplace!(std.datetime.timezone.PosixTimeZone.TempTransition[]).moveEmplace(ref std.datetime.timezone.PosixTimeZone.TempTransition[], ref std.datetime.timezone.PosixTimeZone.TempTransition[]) +# +--format=dlang +_D3rcu3rndS3std6random__T21MersenneTwisterEngineTkVmi32Vmi624Vmi397Vmi31Vki2567483615Vmi11Vki4294967295Vmi7Vki2636928640Vmi15Vki4022730752Vmi18Vki1812433253ZQFc +rcu.rnd +# +--format=dlang --ret-postfix +_D3rcu3rndS3std6random__T21MersenneTwisterEngineTkVmi32Vmi624Vmi397Vmi31Vki2567483615Vmi11Vki4294967295Vmi7Vki2636928640Vmi15Vki4022730752Vmi18Vki1812433253ZQFc +rcu.rnd std.random.MersenneTwisterEngine!(uint, 32uL, 624uL, 397uL, 31uL, 2567483615u, 11uL, 4294967295u, 7uL, 2636928640u, 15uL, 4022730752u, 18uL, 1812433253u).MersenneTwisterEngine +# +--format=dlang +_D3rcu4secsFxS4core4time8DurationZd +rcu.secs(const(core.time.Duration)) +# +--format=dlang --ret-postfix +_D3rcu4secsFxS4core4time8DurationZd +rcu.secs(const(core.time.Duration)) double +# +--format=dlang +_D3rcu6readerFiZv +rcu.reader(int) +# +--format=dlang --ret-postfix +_D3rcu6readerFiZv +rcu.reader(int) void +# +--format=dlang +_D3std5stdio__T8writeflnTaTiZQoFNfxAaiZv +std.stdio.writefln!(char, int).writefln(const(char[]), int) +# +--format=dlang --ret-postfix +_D3std5stdio__T8writeflnTaTiZQoFNfxAaiZv +std.stdio.writefln!(char, int).writefln(const(char[]), int) void +# +--format=dlang +_D3rcu__T3RCUTSQn1AZQl15reader_accessorMFNbZSQBr__TQBqTQBpZQBy12RCU_Accessor +rcu.RCU!(rcu.A).RCU.reader_accessor() +# +--format=dlang --ret-postfix +_D3rcu__T3RCUTSQn1AZQl15reader_accessorMFNbZSQBr__TQBqTQBpZQBy12RCU_Accessor +rcu.RCU!(rcu.A).RCU.reader_accessor() rcu.RCU!(rcu.A).RCU.RCU_Accessor +# +--format=dlang +_D3std5array__TQjTSQr5range__T4TakeTSQBjQt__T9GeneratorS_D3rcu8gen_listFZ9__lambda1FNfZiZQBsZQClZQDnFNfQDhZAi +std.array.array!(std.range.Take!(std.range.Generator!(rcu.gen_list().__lambda1()).Generator).Take).array(std.range.Take!(std.range.Generator!(rcu.gen_list().__lambda1()).Generator).Take) +# +--format=dlang --ret-postfix +_D3std5array__TQjTSQr5range__T4TakeTSQBjQt__T9GeneratorS_D3rcu8gen_listFZ9__lambda1FNfZiZQBsZQClZQDnFNfQDhZAi +std.array.array!(std.range.Take!(std.range.Generator!(rcu.gen_list().__lambda1() int).Generator).Take).array(std.range.Take!(std.range.Generator!(rcu.gen_list().__lambda1() int).Generator).Take) int[] -- 2.26.2