xref: /llvm-project/flang/include/flang/Runtime/temporary-stack.h (revision c01937296b01f512e9074730e04ad0bedb40d089)
1 //===-- include/flang/Runtime/temporary-stack.h -----------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 // Runtime functions for storing a dynamically resizable number of temporaries.
9 // For use in HLFIR lowering.
10 //===----------------------------------------------------------------------===//
11 
12 #ifndef FORTRAN_RUNTIME_TEMPORARY_STACK_H_
13 #define FORTRAN_RUNTIME_TEMPORARY_STACK_H_
14 
15 #include "flang/Runtime/entry-names.h"
16 #include <stdint.h>
17 
18 namespace Fortran::runtime {
19 class Descriptor;
20 extern "C" {
21 
22 // Stores both the descriptor and a copy of the value in a dynamically resizable
23 // data structure identified by opaquePtr. All value stacks must be destroyed
24 // at the end of their lifetime and not used afterwards.
25 // Popped descriptors point to the copy of the value, not the original address
26 // of the value. This copy is dynamically allocated, it is up to the caller to
27 // free the value pointed to by the box. The copy operation is a simple memcpy.
28 // The sourceFile and line number used when creating the stack are shared for
29 // all operations.
30 // Opaque pointers returned from these are incompatible with those returned by
31 // the flavours for storing descriptors.
32 [[nodiscard]] void *RTNAME(CreateValueStack)(
33     const char *sourceFile = nullptr, int line = 0);
34 void RTNAME(PushValue)(void *opaquePtr, const Descriptor &value);
35 // Note: retValue should be large enough to hold the right number of dimensions,
36 // and the optional descriptor addendum
37 void RTNAME(PopValue)(void *opaquePtr, Descriptor &retValue);
38 // Return the i'th element into retValue (which must be the right size). An
39 // exact copy of this descriptor remains in this storage so this one should not
40 // be deallocated
41 void RTNAME(ValueAt)(void *opaquePtr, uint64_t i, Descriptor &retValue);
42 void RTNAME(DestroyValueStack)(void *opaquePtr);
43 
44 // Stores descriptors value in a dynamically resizable data structure identified
45 // by opaquePtr. All descriptor stacks must be destroyed at the end of their
46 // lifetime and not used afterwards.
47 // Popped descriptors are identical to those which were pushed.
48 // The sourceFile and line number used when creating the stack are shared for
49 // all operations.
50 // Opaque pointers returned from these are incompatible with those returned by
51 // the flavours for storing both descriptors and values.
52 [[nodiscard]] void *RTNAME(CreateDescriptorStack)(
53     const char *sourceFile = nullptr, int line = 0);
54 void RTNAME(PushDescriptor)(void *opaquePtr, const Descriptor &value);
55 // Note: retValue should be large enough to hold the right number of dimensions,
56 // and the optional descriptor addendum
57 void RTNAME(PopDescriptor)(void *opaquePtr, Descriptor &retValue);
58 // Return the i'th element into retValue (which must be the right size). An
59 // exact copy of this descriptor remains in this storage so this one should not
60 // be deallocated
61 void RTNAME(DescriptorAt)(void *opaquePtr, uint64_t i, Descriptor &retValue);
62 void RTNAME(DestroyDescriptorStack)(void *opaquePtr);
63 
64 } // extern "C"
65 } // namespace Fortran::runtime
66 
67 #endif // FORTRAN_RUNTIME_TEMPORARY_STACK_H_
68