177ff6f7dSPeter Klausler //===-- runtime/support.cpp -----------------------------------------------===// 277ff6f7dSPeter Klausler // 377ff6f7dSPeter Klausler // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 477ff6f7dSPeter Klausler // See https://llvm.org/LICENSE.txt for license information. 577ff6f7dSPeter Klausler // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 677ff6f7dSPeter Klausler // 777ff6f7dSPeter Klausler //===----------------------------------------------------------------------===// 877ff6f7dSPeter Klausler 977ff6f7dSPeter Klausler #include "flang/Runtime/support.h" 10*f49d26bcSjeanPerier #include "ISO_Fortran_util.h" 112b78c641SjeanPerier #include "type-info.h" 1277ff6f7dSPeter Klausler #include "flang/Runtime/descriptor.h" 1377ff6f7dSPeter Klausler 1477ff6f7dSPeter Klausler namespace Fortran::runtime { 1577ff6f7dSPeter Klausler extern "C" { 1676facde3SSlava Zakharin RT_EXT_API_GROUP_BEGIN 1777ff6f7dSPeter Klausler RTDEF(IsContiguous)18b4b23ff7SSlava Zakharinbool RTDEF(IsContiguous)(const Descriptor &descriptor) { 1977ff6f7dSPeter Klausler return descriptor.IsContiguous(); 2077ff6f7dSPeter Klausler } 2177ff6f7dSPeter Klausler RTDEF(IsAssumedSize)22*f49d26bcSjeanPerierbool RTDEF(IsAssumedSize)(const Descriptor &descriptor) { 23*f49d26bcSjeanPerier return ISO::IsAssumedSize(&descriptor.raw()); 24*f49d26bcSjeanPerier } 25*f49d26bcSjeanPerier RTDEF(CopyAndUpdateDescriptor)262b78c641SjeanPeriervoid RTDEF(CopyAndUpdateDescriptor)(Descriptor &to, const Descriptor &from, 272b78c641SjeanPerier const typeInfo::DerivedType *newDynamicType, 282b78c641SjeanPerier ISO::CFI_attribute_t newAttribute, enum LowerBoundModifier newLowerBounds) { 292b78c641SjeanPerier to = from; 302b78c641SjeanPerier if (newDynamicType) { 312b78c641SjeanPerier DescriptorAddendum *toAddendum{to.Addendum()}; 322b78c641SjeanPerier INTERNAL_CHECK(toAddendum); 332b78c641SjeanPerier toAddendum->set_derivedType(newDynamicType); 342b78c641SjeanPerier to.raw().elem_len = newDynamicType->sizeInBytes(); 352b78c641SjeanPerier } 362b78c641SjeanPerier to.raw().attribute = newAttribute; 372b78c641SjeanPerier if (newLowerBounds != LowerBoundModifier::Preserve) { 382b78c641SjeanPerier const ISO::CFI_index_t newLowerBound{ 392b78c641SjeanPerier newLowerBounds == LowerBoundModifier::SetToOnes ? 1 : 0}; 402b78c641SjeanPerier const int rank{to.rank()}; 412b78c641SjeanPerier for (int i = 0; i < rank; ++i) { 422b78c641SjeanPerier to.GetDimension(i).SetLowerBound(newLowerBound); 432b78c641SjeanPerier } 442b78c641SjeanPerier } 452b78c641SjeanPerier } 462b78c641SjeanPerier 4776facde3SSlava Zakharin RT_EXT_API_GROUP_END 4877ff6f7dSPeter Klausler } // extern "C" 4977ff6f7dSPeter Klausler } // namespace Fortran::runtime 50