]> git.ipfire.org Git - thirdparty/gcc.git/blame - liboffloadmic/runtime/cean_util.h
PR c++/87554 - ICE with extern template and reference member.
[thirdparty/gcc.git] / liboffloadmic / runtime / cean_util.h
CommitLineData
d3a7dd32 1/*
8aafcf7e 2 Copyright (c) 2014-2016 Intel Corporation. All Rights Reserved.
d3a7dd32 3
4 Redistribution and use in source and binary forms, with or without
5 modification, are permitted provided that the following conditions
6 are met:
7
8 * Redistributions of source code must retain the above copyright
9 notice, this list of conditions and the following disclaimer.
10 * Redistributions in binary form must reproduce the above copyright
11 notice, this list of conditions and the following disclaimer in the
12 documentation and/or other materials provided with the distribution.
13 * Neither the name of Intel Corporation nor the names of its
14 contributors may be used to endorse or promote products derived
15 from this software without specific prior written permission.
16
17 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21 HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*/
29
30
31#ifndef CEAN_UTIL_H_INCLUDED
32#define CEAN_UTIL_H_INCLUDED
33
34#include <stdint.h>
5553d0c3 35#include "offload_util.h"
d3a7dd32 36
37// CEAN expression representation
5553d0c3 38struct Dim_Desc {
d3a7dd32 39 int64_t size; // Length of data type
40 int64_t lindex; // Lower index
41 int64_t lower; // Lower section bound
42 int64_t upper; // Upper section bound
43 int64_t stride; // Stride
44};
45
5553d0c3 46struct Arr_Desc {
d3a7dd32 47 int64_t base; // Base address
48 int64_t rank; // Rank of array
5553d0c3 49 Dim_Desc dim[1];
d3a7dd32 50};
51
52struct CeanReadDim {
53 int64_t count; // The number of elements in this dimension
54 int64_t size; // The number of bytes between successive
55 // elements in this dimension.
56};
57
58struct CeanReadRanges {
5553d0c3 59 Arr_Desc* arr_desc;
d3a7dd32 60 void * ptr;
61 int64_t current_number; // the number of ranges read
62 int64_t range_max_number; // number of contiguous ranges
63 int64_t range_size; // size of max contiguous range
64 int last_noncont_ind; // size of Dim array
65 int64_t init_offset; // offset of 1-st element from array left bound
66 CeanReadDim Dim[1];
67};
68
8aafcf7e 69struct IntervalDesc {
70 int64_t lower; // Lower index
71 int64_t size; // Size of each element at this interval
72};
73
74struct NonContigDesc {
75 int64_t base; // Base address
76 int64_t interval_cnt; // Number of intervals
77 struct IntervalDesc interval[1];
78};
79
d3a7dd32 80// array descriptor length
81#define __arr_desc_length(rank) \
5553d0c3 82 (sizeof(int64_t) + sizeof(Dim_Desc) * (rank))
d3a7dd32 83
84// returns offset and length of the data to be transferred
5553d0c3 85DLL_LOCAL void __arr_data_offset_and_length(const Arr_Desc *adp,
d3a7dd32 86 int64_t &offset,
87 int64_t &length);
88
89// define if data array described by argument is contiguous one
5553d0c3 90DLL_LOCAL bool is_arr_desc_contiguous(const Arr_Desc *ap);
d3a7dd32 91
92// allocate element of CeanReadRanges type initialized
93// to read consequently contiguous ranges described by "ap" argument
5553d0c3 94DLL_LOCAL CeanReadRanges * init_read_ranges_arr_desc(const Arr_Desc *ap);
d3a7dd32 95
5553d0c3 96// check if ranges described by 1 argument could be transferred into ranges
d3a7dd32 97// described by 2-nd one
5553d0c3 98DLL_LOCAL bool cean_ranges_match(
d3a7dd32 99 CeanReadRanges * read_rng1,
100 CeanReadRanges * read_rng2
101);
102
103// first argument - returned value by call to init_read_ranges_arr_desc.
104// returns true if offset and length of next range is set successfuly.
105// returns false if the ranges is over.
5553d0c3 106DLL_LOCAL bool get_next_range(
d3a7dd32 107 CeanReadRanges * read_rng,
108 int64_t *offset
109);
110
5553d0c3 111// returns number of transferred bytes
112DLL_LOCAL int64_t cean_get_transf_size(CeanReadRanges * read_rng);
d3a7dd32 113
114#if OFFLOAD_DEBUG > 0
115// prints array descriptor contents to stderr
5553d0c3 116DLL_LOCAL void __arr_desc_dump(
d3a7dd32 117 const char *spaces,
118 const char *name,
5553d0c3 119 const Arr_Desc *adp,
120 bool dereference,
121 bool print_values);
8aafcf7e 122
123DLL_LOCAL void noncont_struct_dump(
124 const char *spaces,
125 const char *name,
126 struct NonContigDesc *desc_p);
127
128DLL_LOCAL int64_t get_noncont_struct_size(struct NonContigDesc *desc_p);
129
5553d0c3 130#define ARRAY_DESC_DUMP(spaces, name, adp, dereference, print_values) \
131 if (console_enabled >= 2) \
132 __arr_desc_dump(spaces, name, adp, dereference, print_values);
d3a7dd32 133#else
5553d0c3 134#define ARRAY_DESC_DUMP(spaces, name, adp, dereference, print_values)
d3a7dd32 135#endif // OFFLOAD_DEBUG
136
137#endif // CEAN_UTIL_H_INCLUDED