diff options
author | Abid Qadeer <haqadeer@amd.com> | 2024-07-09 10:45:01 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-09 10:45:01 +0100 |
commit | 2a36ef580e560698581984d3e309e474c91ed111 (patch) | |
tree | e5cd70bb737f4479832bbeae2a7bd6c947bc0b4a /llvm/lib/IR/Verifier.cpp | |
parent | 313b6c9a5e8c2b8686ea43a42806822fa5c07ef8 (diff) | |
download | llvm-2a36ef580e560698581984d3e309e474c91ed111.zip llvm-2a36ef580e560698581984d3e309e474c91ed111.tar.gz llvm-2a36ef580e560698581984d3e309e474c91ed111.tar.bz2 |
[DebugInfo] Allow DISubrange/DIGenericSubrange without count/upperBound. (#96474)
Due to the current order of metadata in DISubprgram, `Type` is processed
before `Unit` by the Verifier. This can cause a race and
use of garbage data. Consider the following code:
```
int test(int a[][5])
{
return a[0][2];
}
```
when compiled with clang, the control reaches
`Verifier::visitDISubrange` first with `CurrentSourceLang` still equal
to dwarf::DW_LANG_lo_user (32768). The `Verifier::visitDICompileUnit`
which sets the value of `CurrentSourceLang` is reached later. So
`Verifier::visitDISubrange` ends up using a wrong value of
`CurrentSourceLang`.
This behavior does not effect C like language much but is a problem for
Fortran. There is special processing in `Verifier::visitDISubrange` when
`CurrentSourceLang` is Fortran. With this problem, that special handling
is missed and verifier fails for any code that has Fortran's assumed
size array in a global subroutine.
Various solutions were tried to solve this problem before it was decided that
best course of action is to remove these checks from Verifier.
Diffstat (limited to 'llvm/lib/IR/Verifier.cpp')
-rw-r--r-- | llvm/lib/IR/Verifier.cpp | 11 |
1 files changed, 0 insertions, 11 deletions
diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index 44982f5..d156eae 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -359,9 +359,6 @@ class Verifier : public InstVisitor<Verifier>, VerifierSupport { /// Whether the current function has a DISubprogram attached to it. bool HasDebugInfo = false; - /// The current source language. - dwarf::SourceLanguage CurrentSourceLang = dwarf::DW_LANG_lo_user; - /// Stores the count of how many objects were passed to llvm.localescape for a /// given function and the largest index passed to llvm.localrecover. DenseMap<Function *, std::pair<unsigned, unsigned>> FrameEscapeInfo; @@ -1156,10 +1153,6 @@ void Verifier::visitDIScope(const DIScope &N) { void Verifier::visitDISubrange(const DISubrange &N) { CheckDI(N.getTag() == dwarf::DW_TAG_subrange_type, "invalid tag", &N); - bool HasAssumedSizedArraySupport = dwarf::isFortran(CurrentSourceLang); - CheckDI(HasAssumedSizedArraySupport || N.getRawCountNode() || - N.getRawUpperBound(), - "Subrange must contain count or upperBound", &N); CheckDI(!N.getRawCountNode() || !N.getRawUpperBound(), "Subrange can have any one of count or upperBound", &N); auto *CBound = N.getRawCountNode(); @@ -1188,8 +1181,6 @@ void Verifier::visitDISubrange(const DISubrange &N) { void Verifier::visitDIGenericSubrange(const DIGenericSubrange &N) { CheckDI(N.getTag() == dwarf::DW_TAG_generic_subrange, "invalid tag", &N); - CheckDI(N.getRawCountNode() || N.getRawUpperBound(), - "GenericSubrange must contain count or upperBound", &N); CheckDI(!N.getRawCountNode() || !N.getRawUpperBound(), "GenericSubrange can have any one of count or upperBound", &N); auto *CBound = N.getRawCountNode(); @@ -1413,8 +1404,6 @@ void Verifier::visitDICompileUnit(const DICompileUnit &N) { CheckDI(!N.getFile()->getFilename().empty(), "invalid filename", &N, N.getFile()); - CurrentSourceLang = (dwarf::SourceLanguage)N.getSourceLanguage(); - CheckDI((N.getEmissionKind() <= DICompileUnit::LastEmissionKind), "invalid emission kind", &N); |