forked from CyanogenMod/android_frameworks_compile_slang
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathslang_rs_metadata_spec.h
85 lines (69 loc) · 2.71 KB
/
slang_rs_metadata_spec.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/*
* Copyright 2010, The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_METADATA_SPEC_H_ // NOLINT
#define _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_METADATA_SPEC_H_
// Design Philosophy:
// Expensive encoding but cheap decoding process.
//
// 1. A string table concatenates ALL strings (including '\0' in t)
// 2. A string index table which is an integer array containg the offset
// to access each string in the string table.
// 3. All ->name field in RSType/RSVar/RSFunction now refer to an index in the
// string index table for offset lookup.
// 4. RSType information is encoded as a byte stream like:
//
// [RSType #1][RSType #2] ... [RSType #N]
//
// All ->type or ->base_type in RS*Type now becomes an index to RSType array.
//
// 5. RSVar => an string table index plus RSType array index
// 6. RSFunction => an string table index
namespace llvm {
class Module;
}
// Forward declaration
union RSType;
struct RSVar {
const char *name; // variable name
const union RSType *type;
};
struct RSFunction {
const char *name; // function name
};
// Opaque pointer
typedef int RSMetadataEncoder;
// Create a context associated with M for encoding metadata.
RSMetadataEncoder *CreateRSMetadataEncoder(llvm::Module *M);
// Encode V as a metadata in M. Return 0 if every thing goes well.
int RSEncodeVarMetadata(RSMetadataEncoder *E, const RSVar *V);
// Encode F as a metadata in M. Return 0 if every thing goes well.
int RSEncodeFunctionMetadata(RSMetadataEncoder *E, const RSFunction *F);
// Release the memory allocation of Encoder without flushing things.
void DestroyRSMetadataEncoder(RSMetadataEncoder *E);
// Flush metadata in E to its associated module and Destroy it. Return 0 if
// every thing goes well. This will also call the DestroyRSMetadataEncoder().
int FinalizeRSMetadataEncoder(RSMetadataEncoder *E);
// TODO(slang): Decoder
struct RSMetadata {
unsigned num_vars;
unsigned num_funcs;
RSVar *vars;
RSFunction *funcs;
void *context;
};
// struct RSMetadata *RSDecodeMetadata(llvm::Module *M);
// void RSReleaseMetadata(struct RSMetadata *MD);
#endif // _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_METADATA_SPEC_H_ NOLINT