Define RS metadata spec and implement the encoder.
However, it's not enabled in any code currently since decoder doen't implement.
diff --git a/slang_rs_metadata_spec.h b/slang_rs_metadata_spec.h
new file mode 100644
index 0000000..8ae5a5d
--- /dev/null
+++ b/slang_rs_metadata_spec.h
@@ -0,0 +1,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 _SLANG_COMPILER_SLANG_RS_METADATA_SPEC_HPP
+#define _SLANG_COMPILER_SLANG_RS_METADATA_SPEC_HPP
+
+// Design Philosiphy:
+// 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: 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 // _SLANG_COMPILER_SLANG_RS_METADATA_SPEC_HPP