summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Demangle
Commit message (Collapse)AuthorAgeFilesLines
* llvm-undname: Fix assert-on->4GiB-string-literal, found by oss-fuzzNico Weber2019-04-241-1/+4
| | | | llvm-svn: 359109
* llvm-undname: Support demangling the spaceship operatorNico Weber2019-04-232-5/+5
| | | | | | Also add a test for demanling the co_await operator. llvm-svn: 359007
* llvm-undname: Fix an assert-on-invalid, found by oss-fuzzNico Weber2019-04-221-1/+1
| | | | llvm-svn: 358891
* llvm-undname: Fix hex escapes in wchar_t, char16_t, char32_t stringsNico Weber2019-04-211-3/+3
| | | | | | | | | | | | | | | | | llvm-undname used to put '\x' in front of every pair of nibbles, but u"\xD7\xFF" produces a string with 6 bytes: \xD7 \0 \xFF \0 (and \0\0). Correct for a single character (plus terminating \0) is u\xD7FF instead. Now, wchar_t, char16_t, and char32_t strings roundtrip from source to clang-cl (and cl.exe) and then llvm-undname. (...at least as long as it's not a string like L"\xD7FF" L"foo" which gets demangled as L"\xD7FFfoo", where the compiler then considers the "f" as part of the hex escape. That seems ok.) Also add a comment saying that the "almost-valid" char32_t string I added in my last commit is actually produced by compilers. llvm-svn: 358857
* llvm-undname: Fix stack overflow on almost-validNico Weber2019-04-211-3/+3
| | | | | | | | | | | | | | | | | If a unsigned with all 4 bytes non-0 was passed to outputHex(), there were two off-by-ones in it: - Both MaxPos and Pos left space for the final \0, which left the buffer one byte to small. Set MaxPos to 16 instead of 15 to fix. - The `assert(Pos >= 0);` was after a `Pos--`, move it up one line. Since valid Unicode codepoints are <= 0x10ffff, this could never really happen in practice. Found by oss-fuzz. llvm-svn: 358856
* llvm-undname: Fix stack overflow on invalid found by oss-fuzzNico Weber2019-04-211-1/+1
| | | | llvm-svn: 358852
* llvm-undname: Improve string literal demangling with embedded \0 charsNico Weber2019-04-201-2/+5
| | | | | | | | | - Don't assert when a string looks like a u32 string to the heuristic but doesn't have a length that's 0 mod 4. Instead, classify those as u16 with embedded \0 chars. Found by oss-fuzz. - Print embedded nul bytes as \0 instead of \x00. llvm-svn: 358835
* llvm-undname: Attempt to fix leak-on-invalid found by oss-fuzzNico Weber2019-04-191-3/+6
| | | | llvm-svn: 358760
* llvm-undname: Fix two more asserts-on-invalid, found by oss-fuzzNico Weber2019-04-181-3/+4
| | | | llvm-svn: 358708
* llvm-undname: Fix two asserts-on-invalidNico Weber2019-04-181-3/+5
| | | | llvm-svn: 358707
* llvm-undname: Consistently use "return nullptr" in functions returning pointersNico Weber2019-04-161-4/+4
| | | | llvm-svn: 358492
* llvm-undname: Fix nullptr deref on invalid structor names in template argsNico Weber2019-04-161-3/+4
| | | | | | | | | | | | Similar to r358421: A StructorIndentifierNode has a Class field which is read when printing it, but if the StructorIndentifierNode appears in a template argument then demangleFullyQualifiedSymbolName() which sets Class isn't called. Since StructorIndentifierNodes are always leaf names, we can just reject them as well. Found by oss-fuzz. llvm-svn: 358491
* llvm-undname: Fix nullptr deref on invalid conversion operator names in ↵Nico Weber2019-04-151-1/+10
| | | | | | | | | | | | | | | | | template args A ConversionOperatorIdentifierNode has a TargetType which is read when printing it, but if the ConversionOperatorIdentifierNode appears in a template argument there's nothing that can provide the TargetType. Normally the COIN is a symbol (leaf) name and takes its TargetType from the symbol's type, but in a template argument context the COIN can only be either a non-leaf name piece or a type, and must hence be invalid. Similar to the COIN check in demangleDeclarator(). Found by oss-fuzz. llvm-svn: 358421
* llvm-undname: Fix oss-fuzz-foudn crash-on-invalid with incomplete special ↵Nico Weber2019-04-141-0/+4
| | | | | | table nodes llvm-svn: 358367
* llvm-undname: Fix another crash-on-invalid found by oss-fuzzNico Weber2019-04-141-1/+4
| | | | llvm-svn: 358363
* llvm-undname: Use UNREACHABLE after exhaustive switch returning everywhereNico Weber2019-04-111-1/+1
| | | | | | No behavior change. llvm-svn: 358241
* llvm-undname: Name a bool param, no behavior changeNico Weber2019-04-111-5/+6
| | | | llvm-svn: 358240
* llvm-undname: Fix out-of-bounds read on invalid intrinsic function codeNico Weber2019-04-111-3/+9
| | | | | | Found by inspection. llvm-svn: 358239
* llvm-undname: Don't crash on incomplete enum tag manglingsNico Weber2019-04-111-1/+1
| | | | | | Found by inspection. llvm-svn: 358238
* llvm-undname: Fix crash on incomplete virtual this adjustsNico Weber2019-04-111-2/+3
| | | | | | | | Found by oss-fuzz. Also remove an else-after-return, this part has no behavior change. llvm-svn: 358237
* llvm-undname: Fix crash on invalid name in a template parameter pointer to ↵Nico Weber2019-04-111-0/+2
| | | | | | | | member arg Found by oss-fuzz. llvm-svn: 358234
* llvm-undname: Fix another crash-on-invalidNico Weber2019-04-101-2/+0
| | | | | | | | | | | | | | | | | | | | | | | | This fixes a regression from https://reviews.llvm.org/D60354. We used to SymbolNode *Symbol = demangleEncodedSymbol(MangledName, QN); if (Symbol) { Symbol->Name = QN; } but changed that to SymbolNode *Symbol = demangleEncodedSymbol(MangledName, QN); if (Error) return nullptr; Symbol->Name = QN; and one branch somewhere returned a nullptr without setting Error. Looking at the code changed in r340083 and r340710 that branch looks like a remnant from an earlier attempt to demangle RTTI descriptors that has since been rewritten -- so just remove this branch. It shouldn't change behavior for correctly mangled symbols. llvm-svn: 358112
* llvm-undname: Fix more crashes and asserts on invalid inputsNico Weber2019-04-081-24/+76
| | | | | | | | | | | | | | | | | | | | | For functions whose callers don't check that enough input is present, add checks at the start of the function that enough input is there and set Error otherwise. For functions that return AST objects, return nullptr instead of incomplete AST objects with nullptr fields if an error occurred during the function. Introduce a new function demangleDeclarator() for the sequence demangleFullyQualifiedSymbolName(); demangleEncodedSymbol() and use it in the two places that had this sequence. Let this new function check that ConversionOperatorIdentifiers have a valid TargetType. Some of the bad inputs found by oss-fuzz, others by inspection. Differential Revision: https://reviews.llvm.org/D60354 llvm-svn: 357936
* llvm-undname: Name a pair. No behavior change.Nico Weber2019-04-031-3/+5
| | | | | | Differential Revision: https://reviews.llvm.org/D60210 llvm-svn: 357653
* llvm-undname: Fix a crash-on-invalidNico Weber2019-04-031-1/+1
| | | | | | | | Found by oss-fuzz, fixes issue 13260 on oss-fuzz. Differential Revision: https://reviews.llvm.org/D60207 llvm-svn: 357649
* llvm-undame: Fix an assert-on-invalidNico Weber2019-04-031-1/+4
| | | | | | | | Found by oss-fuzz, fixes issue 12432 on os-fuzz. Differential Revision: https://reviews.llvm.org/D60206 llvm-svn: 357648
* llvm-undname: Fix an assert-on-invalidNico Weber2019-04-031-0/+5
| | | | | | | | Found by oss-fuzz, fixes issues 12428 and 12429 on oss-fuzz. Differential Revision: https://reviews.llvm.org/D60204 llvm-svn: 357647
* llvm-undname: Fix a crash-on-invalidNico Weber2019-04-031-0/+4
| | | | | | | | Found by oss-fuzz, fixes issues 12435 and 12438 on oss-fuzz. Differential Revision: https://reviews.llvm.org/D60202 llvm-svn: 357646
* Add missing include (cstdlib) to Demangle.hKonstantin Zhuravlyov2019-01-221-0/+1
| | | | | | Differential Revision: https://reviews.llvm.org/D57035 llvm-svn: 351861
* Update more file headers across all of the LLVM projects in the monorepoChandler Carruth2019-01-193-12/+9
| | | | | | | | | | | | | | | | | | to reflect the new license. These used slightly different spellings that defeated my regular expressions. We understand that people may be surprised that we're moving the header entirely to discuss the new license. We checked this carefully with the Foundation's lawyer and we believe this is the correct approach. Essentially, all code in the project is now made available by the LLVM project under our new license, so you will see that the license headers include that license only. Some of our contributors have contributed code under our old license, and accordingly, we have retained a copy of our old license notice in the top-level files in each project and repository. llvm-svn: 351648
* Update the file headers across all of the LLVM projects in the monorepoChandler Carruth2019-01-192-8/+6
| | | | | | | | | | | | | | | | | to reflect the new license. We understand that people may be surprised that we're moving the header entirely to discuss the new license. We checked this carefully with the Foundation's lawyer and we believe this is the correct approach. Essentially, all code in the project is now made available by the LLVM project under our new license, so you will see that the license headers include that license only. Some of our contributors have contributed code under our old license, and accordingly, we have retained a copy of our old license notice in the top-level files in each project and repository. llvm-svn: 351636
* Add __[_[_]]Z demangling to new common demangle functionJames Henderson2019-01-181-1/+7
| | | | | | | | | | | | This is a follow-up to r351448. It adds support for other _*Z extensions of the Itanium demanling, to the newly available demangle function heuristic. Reviewed by: erik.pilkington, rupprecht, grimar Differential Revision: https://reviews.llvm.org/D56855 llvm-svn: 351551
* NFC: Make the copies of the demangler byte-for-byte identicalErik Pilkington2019-01-172-11/+11
| | | | | | | | | | | | | | With this patch, the copies of the files ItaniumDemangle.h, StringView.h, and Utility.h are kept byte-for-byte in sync between libcxxabi and llvm. All differences (namespaces, fallthrough, and unreachable macros) are defined in each copies' DemanglerConfig.h. This patch also adds a script to copy changes from libcxxabi (cp-to-llvm.sh), and a README.txt explaining the situation. Differential revision: https://reviews.llvm.org/D53538 llvm-svn: 351474
* Move demangling function from llvm-objdump to Demangle libraryJames Henderson2019-01-172-0/+31
| | | | | | | | | | | | | | | | This allows it to be used in an upcoming llvm-readobj change. A small change in internal behaviour of the function is to always call the microsoftDemangle function if the string does not have an itanium encoding prefix, rather than only if it starts with '?'. This is harmless because the microsoftDemangle function does the same check already. Reviewed by: grimar, erik.pilkington Differential Revision: https://reviews.llvm.org/D56721 llvm-svn: 351448
* [llvm-undname] Add support for demangling msvc's noexcept types.Zachary Turner2019-01-082-3/+9
| | | | | | | | | | | Starting in C++17, MSVC introduced a new mangling for function parameters that are themselves noexcept functions. This patch makes llvm-undname properly demangle them. Patch by Zachary Henkel Differential Revision: https://reviews.llvm.org/D55769 llvm-svn: 350656
* [MS Demangler] Add a flag for dumping types without tag specifier.Zachary Turner2019-01-021-8/+10
| | | | | | | | Sometimes it's useful to be able to output demangled names without tag specifiers like "struct", "class", etc. This patch adds a flag enabling this. llvm-svn: 350241
* Add missing include file.Zachary Turner2018-12-171-0/+1
| | | | llvm-svn: 349363
* [MS Demangler] Add a helper function to print a Node as a string.Zachary Turner2018-12-171-0/+8
| | | | llvm-svn: 349359
* [MS Demangler] Fail gracefully on invalid pointer types.Zachary Turner2018-12-141-6/+12
| | | | | | | | | Once we detect a 'P', we know we a pointer type is upcoming, so we make some assumptions about the output that follows. If those assumptions didn't hold, we would assert. Instead, we should fail gracefully and propagate the error up. llvm-svn: 349169
* Fix a crash in llvm-undname with invalid types.Zachary Turner2018-12-141-2/+2
| | | | llvm-svn: 349165
* [Demangle] remove itaniumFindTypesInMangledNamePavel Labath2018-11-271-9/+0
| | | | | | | | | | | | | | | | Summary: This (very specialized) function was added to enable an LLDB use case. Now that a more generic interface (overriding of parser functions - D52992) is available, and LLDB has been converted to use that (D54074), the function is unused and can be removed. Reviewers: erik.pilkington, sgraenitz, rsmith Subscribers: mgorny, hiraditya, christof, libcxx-commits, llvm-commits Differential Revision: https://reviews.llvm.org/D54893 llvm-svn: 347670
* [MS Demangler] Print public:, protected:, private: if set in FunctionClass ↵Nico Weber2018-11-131-4/+15
| | | | | | | | | | | | or a variable's StorageClass. undname prints them, and the information is in the decorated name, so we probably shouldn't lose it when undecorating. I spot-checked a few of the funnier-looking outputs, and undname has the same output. Differential Revision: https://reviews.llvm.org/D54396 llvm-svn: 346791
* Make initializeOutputStream() return false on error and true on success.Nico Weber2018-11-112-10/+10
| | | | | | | | As discussed in https://reviews.llvm.org/D52104 Differential Revision: https://reviews.llvm.org/D52143 llvm-svn: 346606
* [MS demangler] Use a slightly shorter unmangling for mangled strings.Nico Weber2018-11-091-5/+4
| | | | | | | | | | Before: const wchar_t * {L"%"} Now: L"%" See also PR39593. Differential Revision: https://reviews.llvm.org/D54294 llvm-svn: 346544
* Fix clang -Wimplicit-fallthrough warnings across llvm, NFCReid Kleckner2018-11-011-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | This patch should not introduce any behavior changes. It consists of mostly one of two changes: 1. Replacing fall through comments with the LLVM_FALLTHROUGH macro 2. Inserting 'break' before falling through into a case block consisting of only 'break'. We were already using this warning with GCC, but its warning behaves slightly differently. In this patch, the following differences are relevant: 1. GCC recognizes comments that say "fall through" as annotations, clang doesn't 2. GCC doesn't warn on "case N: foo(); default: break;", clang does 3. GCC doesn't warn when the case contains a switch, but falls through the outer case. I will enable the warning separately in a follow-up patch so that it can be cleanly reverted if necessary. Reviewers: alexfh, rsmith, lattner, rtrieu, EricWF, bollu Differential Revision: https://reviews.llvm.org/D53950 llvm-svn: 345882
* [MS Demangler] Expose the Demangler AST publicly.Zachary Turner2018-11-013-853/+13
| | | | | | | | | LLDB would like to use this in order to build a clang AST from a mangled name. This is NFC otherwise. llvm-svn: 345837
* Port libcxxabi r344607 into llvmPavel Labath2018-10-171-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | Summary: The original commit message was: This uses CRTP (for performance reasons) to allow a user the override demangler functions to implement custom parsing logic. The motivation for this is LLDB, which needs to occasionaly modify the mangled names. One such instance is already implemented via the TypeCallback member, but this is very specific functionality which does not help with any other use case. Currently we have a use case for modifying the constructor flavours, which would require adding another callback. This approach does not scale. With CRTP, the user (LLDB) can override any function it needs without any special support from the demangler library. After LLDB is ported to use this instead of the TypeCallback mechanism, the callback can be removed. The only difference here is the addition of a unit test which exercises the CRTP mechanism to override a function in the parser. Reviewers: erik.pilkington, rsmith, EricWF Subscribers: mgorny, kristina, llvm-commits Differential Revision: https://reviews.llvm.org/D53300 llvm-svn: 344703
* NFC: Fix a -Wsign-conversion warningErik Pilkington2018-10-151-5/+11
| | | | llvm-svn: 344564
* Move some helpers from the global namespace into anonymous ones.Benjamin Kramer2018-10-131-5/+6
| | | | llvm-svn: 344468
* Update microsoftDemangle() to work more like itaniumDemangle().Nico Weber2018-09-152-29/+32
| | | | | | | | | | | * Use same method of initializing the output stream and its buffer * Allow a nullptr Status pointer * Don't print the mangled name on demangling error * Write to N (if it is non-nullptr) Differential Revision: https://reviews.llvm.org/D52104 llvm-svn: 342330
OpenPOWER on IntegriCloud