aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Demangle
AgeCommit message (Collapse)AuthorFilesLines
2020-02-11Use std::foo_t rather than std::foo in LLVM.Justin Lebar1-4/+2
Summary: C++14 migration. No functional change. Reviewers: bkramer, JDevlieghere, lebedev.ri Subscribers: MatzeB, hiraditya, jkorous, dexonsmith, arphaman, kadircet, lebedev.ri, usaxena95, cfe-commits, llvm-commits Tags: #clang, #llvm Differential Revision: https://reviews.llvm.org/D74384
2019-12-04Revert "Add some missing includes to MicrosoftDemangle.cpp (PR44217)"David Blaikie1-2/+0
This reverts commit 9b962d83ece841e43fd2823375dc6ddc94c1b178. This didn't address the underlying issue (in MicrosoftDemangleNodes.h) that was fixed 6 months ago anyway.
2019-12-04Add some missing includes to MicrosoftDemangle.cpp (PR44217)David Blaikie1-0/+2
2019-11-21[cmake] Explicitly mark libraries defined in lib/ as "Component Libraries"Tom Stellard1-1/+1
Summary: Most libraries are defined in the lib/ directory but there are also a few libraries defined in tools/ e.g. libLLVM, libLTO. I'm defining "Component Libraries" as libraries defined in lib/ that may be included in libLLVM.so. Explicitly marking the libraries in lib/ as component libraries allows us to remove some fragile checks that attempt to differentiate between lib/ libraries and tools/ libraires: 1. In tools/llvm-shlib, because llvm_map_components_to_libnames(LIB_NAMES "all") returned a list of all libraries defined in the whole project, there was custom code needed to filter out libraries defined in tools/, none of which should be included in libLLVM.so. This code assumed that any library defined as static was from lib/ and everything else should be excluded. With this change, llvm_map_components_to_libnames(LIB_NAMES, "all") only returns libraries that have been added to the LLVM_COMPONENT_LIBS global cmake property, so this custom filtering logic can be removed. Doing this also fixes the build with BUILD_SHARED_LIBS=ON and LLVM_BUILD_LLVM_DYLIB=ON. 2. There was some code in llvm_add_library that assumed that libraries defined in lib/ would not have LLVM_LINK_COMPONENTS or ARG_LINK_COMPONENTS set. This is only true because libraries defined lib lib/ use LLVMBuild.txt and don't set these values. This code has been fixed now to check if the library has been explicitly marked as a component library, which should now make it easier to remove LLVMBuild at some point in the future. I have tested this patch on Windows, MacOS and Linux with release builds and the following combinations of CMake options: - "" (No options) - -DLLVM_BUILD_LLVM_DYLIB=ON - -DLLVM_LINK_LLVM_DYLIB=ON - -DBUILD_SHARED_LIBS=ON - -DBUILD_SHARED_LIBS=ON -DLLVM_BUILD_LLVM_DYLIB=ON - -DBUILD_SHARED_LIBS=ON -DLLVM_LINK_LLVM_DYLIB=ON Reviewers: beanz, smeenai, compnerd, phosek Reviewed By: beanz Subscribers: wuzish, jholewinski, arsenm, dschuff, jyknight, dylanmckay, sdardis, nemanjai, jvesely, nhaehnle, mgorny, mehdi_amini, sbc100, jgravelle-google, hiraditya, aheejin, fedor.sergeev, asb, rbar, johnrusso, simoncook, apazos, sabuasal, niosHD, jrtc27, MaskRay, zzheng, edward-jones, atanasyan, steven_wu, rogfer01, MartinMosbeck, brucehoult, the_o, dexonsmith, PkmX, jocewei, jsji, dang, Jim, lenary, s.egerton, pzheng, sameer.abuasal, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D70179
2019-11-04[demangle] NFC: get rid of NodeOrStringErik Pilkington1-8/+0
This class was a bit overengineered, and was triggering some PVS warnings. Instead, put strings into a NameType and let clients unconditionally treat it as a Node.
2019-10-15[Demangle] Add a few more options to the microsoft demanglerMartin Storsjo2-20/+41
This corresponds to commonly used options to UnDecorateSymbolName within llvm. Add them as hidden options in llvm-undname. MS undname.exe takes numeric flags, corresponding to the UNDNAME_* constants, but instead of hardcoding in mappings for those numbers, just add textual options instead, as it the use of them here is primarily intended for testing. Differential Revision: https://reviews.llvm.org/D68917 llvm-svn: 374865
2019-10-02Fix uninitialized variable warning. NFCI.Simon Pilgrim1-1/+1
llvm-svn: 373450
2019-09-23llvm-undname: Add support for demangling typeinfo namesNico Weber1-0/+18
typeinfo names aren't symbols but string constant contents stored in compiler-generated typeinfo objects, but llvm-cxxfilt can demangle these for Itanium names. In the MSVC ABI, these are just a '.' followed by a mangled type -- this means they don't start with '?' like all MS-mangled symbols do. Differential Revision: https://reviews.llvm.org/D67851 llvm-svn: 372602
2019-09-20llvm-undname: Delete an empty, unused method.Nico Weber1-2/+0
llvm-svn: 372367
2019-09-07Synchronize LLVM's copy of libc++abi's demangler with the libc++abiRichard Smith1-0/+10
version after r371273. Also fix a minor issue in r371273 that only surfaced after template instantiation from LLVM's use of the demangler. llvm-svn: 371274
2019-06-04llvm-undname: Correctly demangle vararg parametersNico Weber2-5/+10
FunctionSignatureNode already had an IsVariadic field, but it wasn't used anywhere yet. Set it and use it. llvm-svn: 362541
2019-06-04llvm-undname: More coverage-related cleanupsNico Weber1-11/+9
- The loop in demangleFunctionParameterList() only exits on Error, @, and Z. All 3 cases were handled, so the rest of the function is DEMANGLE_UNREACHABLE. - The loop in demangleTemplateParameterList() always returns on Error, so there's no need to check for that in the loop header and after the loop. - Add test cases for invalid function parameter manglings. - Add a (redundant) test case for a simple template parameter list mangling. - Add a test case pointing out that varargs functions aren't demangled correctly. llvm-svn: 362540
2019-06-04llvm-undname: Add test coverage for demangleInitFiniStub()Nico Weber1-2/+2
llvm-svn: 362536
2019-06-04llvm-undname: Yet more coverage for error pathsNico Weber1-3/+8
- For error returns in demangleSpecialTableNode(), demangleLocalStaticGuard(), RTTITypeDescriptor, demangleRttiBaseClassDescriptorNode(), demangleUnsigned(), demangleUntypedVariable() (via RttiBaseClassArray) - For ?_A and ?_P which are handled at early levels of the demangler but are not implemented in a later stage; this is now more obvious - Replace a "default:" with an explicit list of cases, to get -Wswitch check we list all cases llvm-svn: 362520
2019-06-04llvm-undname: More no-op changes to increase test coverageNico Weber1-6/+5
- Add test coverage around invalid anon namespaces and for error paths in demanglePrimitiveType() and in demangleFullyQualifiedTypeName() - Use DEMANGLE_UNREACHABLE in two more unreachable places llvm-svn: 362514
2019-06-04llvm-undname: Several behavior-preserving changes to increase coverageNico Weber2-16/+10
- Replace `Error = true` in a few branches that are truly unreachable with DEMANGLE_UNREACHABLE - Remove early return early in startsWithLocalScopePattern() because it's redundant with the next two early returns - Remove unreachable `case '0'` (it's handled in the branch below) - Remove an unused bool return - Add test coverage for several early error returns, mostly in array type parsing llvm-svn: 362506
2019-06-02llvm-undname; Add more test coverage for demangleFunctionClass()Nico Weber1-2/+2
Also add two FC_Far that seem to be missing, by symmetry from the public and protected cases. (But FC_Far isn't really a thing anymore, so this doesn't really have an observable effect.) llvm-svn: 362344
2019-06-02Remove code path that's dead after r358835Nico Weber1-4/+2
llvm-svn: 362333
2019-05-28llvm-undname: Support demangling char8_tNico Weber2-0/+3
Ports clang's mangling support added in r354633 to llvm-undname. llvm-svn: 361839
2019-05-28llvm-undname: Add support for local static thread guardsNico Weber2-3/+9
llvm-svn: 361835
2019-05-28llvm-undname: Remove unreachable statementNico Weber1-1/+0
llvm-svn: 361786
2019-05-27llvm-undname: Extract demangleMD5Name() method; no behavior changeNico Weber1-30/+34
llvm-svn: 361783
2019-05-27llvm-undname: Make demangling of MD5 names more robustNico Weber1-3/+25
Demangler::parse() for MD5 names would: 1. Put all remaining text into the MD5 name sight unseen 2. Not modify MangledName This meant that if the demangler recursively called parse() (e.g. in demangleLocallyScopedNamePiece()), every recursive call that started on an MD5 name would add all remaining bytes to the output buffer but only advance the input by a byte. For valid inputs, MD5 types are never (well, see comments for 2 exceptions) nested, but for invalid input this could cause memory use quadratic in the input size. llvm-svn: 361744
2019-05-22llvm-undname: Fix an assert-on-invalid, found by oss-fuzzNico Weber1-1/+3
If a template parameter refers to a pointer to member, but the mangling of that was a string literal instead of a real symbol, llvm-undname used to crash instead of rejecting the input. llvm-svn: 361402
2019-04-24llvm-undname: Fix assert-on->4GiB-string-literal, found by oss-fuzzNico Weber1-1/+4
llvm-svn: 359109
2019-04-23llvm-undname: Support demangling the spaceship operatorNico Weber2-5/+5
Also add a test for demanling the co_await operator. llvm-svn: 359007
2019-04-22llvm-undname: Fix an assert-on-invalid, found by oss-fuzzNico Weber1-1/+1
llvm-svn: 358891
2019-04-21llvm-undname: Fix hex escapes in wchar_t, char16_t, char32_t stringsNico Weber1-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
2019-04-21llvm-undname: Fix stack overflow on almost-validNico Weber1-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
2019-04-21llvm-undname: Fix stack overflow on invalid found by oss-fuzzNico Weber1-1/+1
llvm-svn: 358852
2019-04-20llvm-undname: Improve string literal demangling with embedded \0 charsNico Weber1-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
2019-04-19llvm-undname: Attempt to fix leak-on-invalid found by oss-fuzzNico Weber1-3/+6
llvm-svn: 358760
2019-04-18llvm-undname: Fix two more asserts-on-invalid, found by oss-fuzzNico Weber1-3/+4
llvm-svn: 358708
2019-04-18llvm-undname: Fix two asserts-on-invalidNico Weber1-3/+5
llvm-svn: 358707
2019-04-16llvm-undname: Consistently use "return nullptr" in functions returning pointersNico Weber1-4/+4
llvm-svn: 358492
2019-04-16llvm-undname: Fix nullptr deref on invalid structor names in template argsNico Weber1-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
2019-04-15llvm-undname: Fix nullptr deref on invalid conversion operator names in ↵Nico Weber1-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
2019-04-14llvm-undname: Fix oss-fuzz-foudn crash-on-invalid with incomplete special ↵Nico Weber1-0/+4
table nodes llvm-svn: 358367
2019-04-14llvm-undname: Fix another crash-on-invalid found by oss-fuzzNico Weber1-1/+4
llvm-svn: 358363
2019-04-11llvm-undname: Use UNREACHABLE after exhaustive switch returning everywhereNico Weber1-1/+1
No behavior change. llvm-svn: 358241
2019-04-11llvm-undname: Name a bool param, no behavior changeNico Weber1-5/+6
llvm-svn: 358240
2019-04-11llvm-undname: Fix out-of-bounds read on invalid intrinsic function codeNico Weber1-3/+9
Found by inspection. llvm-svn: 358239
2019-04-11llvm-undname: Don't crash on incomplete enum tag manglingsNico Weber1-1/+1
Found by inspection. llvm-svn: 358238
2019-04-11llvm-undname: Fix crash on incomplete virtual this adjustsNico Weber1-2/+3
Found by oss-fuzz. Also remove an else-after-return, this part has no behavior change. llvm-svn: 358237
2019-04-11llvm-undname: Fix crash on invalid name in a template parameter pointer to ↵Nico Weber1-0/+2
member arg Found by oss-fuzz. llvm-svn: 358234
2019-04-10llvm-undname: Fix another crash-on-invalidNico Weber1-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
2019-04-08llvm-undname: Fix more crashes and asserts on invalid inputsNico Weber1-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
2019-04-03llvm-undname: Name a pair. No behavior change.Nico Weber1-3/+5
Differential Revision: https://reviews.llvm.org/D60210 llvm-svn: 357653
2019-04-03llvm-undname: Fix a crash-on-invalidNico Weber1-1/+1
Found by oss-fuzz, fixes issue 13260 on oss-fuzz. Differential Revision: https://reviews.llvm.org/D60207 llvm-svn: 357649
2019-04-03llvm-undame: Fix an assert-on-invalidNico Weber1-1/+4
Found by oss-fuzz, fixes issue 12432 on os-fuzz. Differential Revision: https://reviews.llvm.org/D60206 llvm-svn: 357648