xref: /llvm-project/flang/runtime/support.cpp (revision f49d26bc7766a6589bdbfc6fd752665ae5643b62)
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 Zakharin bool RTDEF(IsContiguous)(const Descriptor &descriptor) {
1977ff6f7dSPeter Klausler   return descriptor.IsContiguous();
2077ff6f7dSPeter Klausler }
2177ff6f7dSPeter Klausler 
RTDEF(IsAssumedSize)22*f49d26bcSjeanPerier bool RTDEF(IsAssumedSize)(const Descriptor &descriptor) {
23*f49d26bcSjeanPerier   return ISO::IsAssumedSize(&descriptor.raw());
24*f49d26bcSjeanPerier }
25*f49d26bcSjeanPerier 
RTDEF(CopyAndUpdateDescriptor)262b78c641SjeanPerier void 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