Enable emission of debugger-friendly bitcode

- Add "-g" flag to llvm-rs-cc in order to emit debug metadata
- Add optimization level parameter -O and tests
- Add lit based tests (use llvm-lit from libbcc/tests/debuginfo)
-- Add README file for lit-tests directory

Change-Id: I5e2f6f9b6f536fa7a10de008b54ac0878cf352a9
diff --git a/slang_rs_backend.cpp b/slang_rs_backend.cpp
index d4a081b..6602130 100644
--- a/slang_rs_backend.cpp
+++ b/slang_rs_backend.cpp
@@ -19,6 +19,8 @@
 #include <string>
 #include <vector>
 
+#include "clang/Frontend/CodeGenOptions.h"
+
 #include "llvm/ADT/Twine.h"
 #include "llvm/ADT/StringExtras.h"
 
@@ -29,6 +31,7 @@
 #include "llvm/Metadata.h"
 #include "llvm/Module.h"
 
+#include "llvm/Support/DebugLoc.h"
 #include "llvm/Support/IRBuilder.h"
 
 #include "slang_assert.h"
@@ -60,6 +63,7 @@
     mExportForEachMetadata(NULL),
     mExportTypeMetadata(NULL),
     mRSObjectSlotsMetadata(NULL),
+    mRSOptimizationMetadata(NULL),
     mRefCount(mContext->getASTContext()) {
 }
 
@@ -194,6 +198,16 @@
     return;
   }
 
+  // Write optimization level
+  llvm::SmallVector<llvm::Value*, 1> OptimizationOption;
+  OptimizationOption.push_back(llvm::ConstantInt::get(
+    mLLVMContext, llvm::APInt(32, mCodeGenOpts.OptimizationLevel)));
+
+  if (mRSOptimizationMetadata == NULL)
+    mRSOptimizationMetadata = M->getOrInsertNamedMetadata(OPTIMIZATION_LEVEL_MN);
+  mRSOptimizationMetadata->addOperand(
+    llvm::MDNode::get(mLLVMContext, OptimizationOption));
+
   // Dump export variable info
   if (mContext->hasExportVar()) {
     int slotCount = 0;