[DebugInfo] Support for DW_TAG_generic_subrange

This is needed to support fortran assumed rank arrays which
have runtime rank.

  Summary:
Fortran assumed rank arrays have dynamic rank. DWARF TAG
DW_TAG_generic_subrange is needed to support that.

  Testing:
unit test cases added (hand-written)
check llvm
check debug-info

Reviewed By: aprantl

Differential Revision: https://reviews.llvm.org/D89218
This commit is contained in:
Alok Kumar Sharma
2020-10-28 19:54:39 +05:30
parent 3b2256a41b
commit a6dd01afa3
27 changed files with 856 additions and 7 deletions

View File

@@ -875,6 +875,7 @@ MetadataLoader::MetadataLoaderImpl::lazyLoadModuleMetadataBlock() {
case bitc::METADATA_OBJC_PROPERTY:
case bitc::METADATA_IMPORTED_ENTITY:
case bitc::METADATA_GLOBAL_VAR_EXPR:
case bitc::METADATA_GENERIC_SUBRANGE:
// We don't expect to see any of these, if we see one, give up on
// lazy-loading and fallback.
MDStringRef.clear();
@@ -1371,6 +1372,18 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
NextMetadataNo++;
break;
}
case bitc::METADATA_GENERIC_SUBRANGE: {
Metadata *Val = nullptr;
Val = GET_OR_DISTINCT(DIGenericSubrange,
(Context, getMDOrNull(Record[1]),
getMDOrNull(Record[2]), getMDOrNull(Record[3]),
getMDOrNull(Record[4])));
MetadataList.assignValue(Val, NextMetadataNo);
IsDistinct = Record[0] & 1;
NextMetadataNo++;
break;
}
case bitc::METADATA_ENUMERATOR: {
if (Record.size() < 3)
return error("Invalid record");