mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-02 10:21:54 +00:00
[MS Demangler] Fail gracefully on invalid pointer types.
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
This commit is contained in:
parent
6d3b7f4c22
commit
0a0be9b76e
@ -40,7 +40,8 @@ struct NodeList {
|
|||||||
NodeList *Next = nullptr;
|
NodeList *Next = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool isMemberPointer(StringView MangledName) {
|
static bool isMemberPointer(StringView MangledName, bool &Error) {
|
||||||
|
Error = false;
|
||||||
switch (MangledName.popFront()) {
|
switch (MangledName.popFront()) {
|
||||||
case '$':
|
case '$':
|
||||||
// This is probably an rvalue reference (e.g. $$Q), and you cannot have an
|
// This is probably an rvalue reference (e.g. $$Q), and you cannot have an
|
||||||
@ -58,7 +59,8 @@ static bool isMemberPointer(StringView MangledName) {
|
|||||||
// what.
|
// what.
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
assert(false && "Ty is not a pointer type!");
|
Error = true;
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If it starts with a number, then 6 indicates a non-member function
|
// If it starts with a number, then 6 indicates a non-member function
|
||||||
@ -89,9 +91,9 @@ static bool isMemberPointer(StringView MangledName) {
|
|||||||
case 'T':
|
case 'T':
|
||||||
return true;
|
return true;
|
||||||
default:
|
default:
|
||||||
assert(false);
|
Error = true;
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static SpecialIntrinsicKind
|
static SpecialIntrinsicKind
|
||||||
@ -1651,10 +1653,12 @@ TypeNode *Demangler::demangleType(StringView &MangledName,
|
|||||||
if (isTagType(MangledName))
|
if (isTagType(MangledName))
|
||||||
Ty = demangleClassType(MangledName);
|
Ty = demangleClassType(MangledName);
|
||||||
else if (isPointerType(MangledName)) {
|
else if (isPointerType(MangledName)) {
|
||||||
if (isMemberPointer(MangledName))
|
if (isMemberPointer(MangledName, Error))
|
||||||
Ty = demangleMemberPointerType(MangledName);
|
Ty = demangleMemberPointerType(MangledName);
|
||||||
else
|
else if (!Error)
|
||||||
Ty = demanglePointerType(MangledName);
|
Ty = demanglePointerType(MangledName);
|
||||||
|
else
|
||||||
|
return nullptr;
|
||||||
} else if (isArrayType(MangledName))
|
} else if (isArrayType(MangledName))
|
||||||
Ty = demangleArrayType(MangledName);
|
Ty = demangleArrayType(MangledName);
|
||||||
else if (isFunctionType(MangledName)) {
|
else if (isFunctionType(MangledName)) {
|
||||||
@ -1988,6 +1992,8 @@ Demangler::demangleFunctionParameterList(StringView &MangledName) {
|
|||||||
|
|
||||||
*Current = Arena.alloc<NodeList>();
|
*Current = Arena.alloc<NodeList>();
|
||||||
TypeNode *TN = demangleType(MangledName, QualifierMangleMode::Drop);
|
TypeNode *TN = demangleType(MangledName, QualifierMangleMode::Drop);
|
||||||
|
if (!TN || Error)
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
(*Current)->N = TN;
|
(*Current)->N = TN;
|
||||||
|
|
||||||
|
@ -4,3 +4,8 @@
|
|||||||
?ff@@$$J0YAXAU?$AS_@$0A@PEAU?$AS_@$0A@H@__clang@@@__clang@@@Z
|
?ff@@$$J0YAXAU?$AS_@$0A@PEAU?$AS_@$0A@H@__clang@@@__clang@@@Z
|
||||||
; CHECK: ?ff@@$$J0YAXAU?$AS_@$0A@PEAU?$AS_@$0A@H@__clang@@@__clang@@@Z
|
; CHECK: ?ff@@$$J0YAXAU?$AS_@$0A@PEAU?$AS_@$0A@H@__clang@@@__clang@@@Z
|
||||||
; CHECK-NEXT: error: Invalid mangled name
|
; CHECK-NEXT: error: Invalid mangled name
|
||||||
|
|
||||||
|
?f0@@YAXPEU?$AS_@$00$$CAD@__clang@@@Z
|
||||||
|
; CHECK-EMPTY:
|
||||||
|
; CHECK-NEXT: ?f0@@YAXPEU?$AS_@$00$$CAD@__clang@@@Z
|
||||||
|
; CHECK-NEXT: error: Invalid mangled name
|
Loading…
x
Reference in New Issue
Block a user