aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephen Hines <srhines@google.com>2014-09-10 02:43:45 -0700
committerStephen Hines <srhines@google.com>2014-09-10 02:43:45 -0700
commit5984fc03b6189f19f3721423b92469e4908a49ef (patch)
tree76774faf25c7c757927fbb8c2e19f15d7226cc3d
parent340b5550cf63b6beae3b12c2e91377bce7704c34 (diff)
downloadslang-lollipop-dev.tar.gz
Emit 32/64-bit bitcode appropriately for C++ reflection.lollipop-dev
Bug: 17417839 This change adds proper handling of C++ reflection for the -m32/-m64 command line arguments. Only one type of bitcode will be emitted. Change-Id: Ic52812b0fc7836eefbe8b6837272124d69b50182
-rw-r--r--RSCCOptions.td3
-rw-r--r--rs_cc_options.cpp19
-rw-r--r--slang_rs.cpp10
3 files changed, 25 insertions, 7 deletions
diff --git a/RSCCOptions.td b/RSCCOptions.td
index 1d5f536..1277c3a 100644
--- a/RSCCOptions.td
+++ b/RSCCOptions.td
@@ -60,6 +60,9 @@ def emit_nothing : Flag<["-"], "emit-nothing">,
HelpText<"Build ASTs then convert to LLVM, but emit nothing">;
}
+def m32 : Flag<["-"], "m32">, HelpText<"Emit 32-bit C++ code">;
+def m64 : Flag<["-"], "m64">, HelpText<"Emit 64-bit C++ code">;
+
def emit_g : Flag<["-"], "g">,
HelpText<"Emit LLVM Debug Metadata">;
diff --git a/rs_cc_options.cpp b/rs_cc_options.cpp
index f8d3fbe..ff37dd0 100644
--- a/rs_cc_options.cpp
+++ b/rs_cc_options.cpp
@@ -186,6 +186,7 @@ void slang::ParseArguments(llvm::SmallVectorImpl<const char *> &ArgVector,
<< OptParser->getOptionName(OPT_bitcode_storage)
<< BitcodeStorageValue;
+ llvm::opt::Arg *lastBitwidthArg = Args->getLastArg(OPT_m32, OPT_m64);
if (Args->hasArg(OPT_reflect_cpp)) {
Opts.mBitcodeStorage = slang::BCST_CPP_CODE;
// mJavaReflectionPathBase can be set for C++ reflected builds.
@@ -193,6 +194,20 @@ void slang::ParseArguments(llvm::SmallVectorImpl<const char *> &ArgVector,
if (Opts.mJavaReflectionPathBase.empty()) {
Opts.mJavaReflectionPathBase = Opts.mBitcodeOutputDir;
}
+
+ // Check for bitwidth arguments.
+ if (lastBitwidthArg) {
+ if (lastBitwidthArg->getOption().matches(OPT_m32)) {
+ Opts.mBitWidth = 32;
+ } else {
+ Opts.mBitWidth = 64;
+ }
+ }
+ } else if (lastBitwidthArg) {
+ // -m32/-m64 are forbidden for non-C++ reflection paths.
+ DiagEngine.Report(DiagEngine.getCustomDiagID(
+ clang::DiagnosticsEngine::Error,
+ "cannot use -m32/-m64 without specifying C++ reflection (-reflect-c++)"));
}
Opts.mDependencyOutputDir =
@@ -220,11 +235,9 @@ void slang::ParseArguments(llvm::SmallVectorImpl<const char *> &ArgVector,
Opts.mTargetAPI = UINT_MAX;
}
- Opts.mEmit3264 = Opts.mTargetAPI >= 21;
+ Opts.mEmit3264 = (Opts.mTargetAPI >= 21) && (Opts.mBitcodeStorage != slang::BCST_CPP_CODE);
if (Opts.mEmit3264) {
- if (Opts.mBitcodeStorage != slang::BCST_CPP_CODE) {
Opts.mBitcodeStorage = slang::BCST_JAVA_CODE;
- }
}
}
}
diff --git a/slang_rs.cpp b/slang_rs.cpp
index e269e57..c59459b 100644
--- a/slang_rs.cpp
+++ b/slang_rs.cpp
@@ -362,11 +362,13 @@ bool SlangRS::compile(
if (Opts.mOutputType != Slang::OT_Dependency && doReflection) {
if (Opts.mBitcodeStorage == BCST_CPP_CODE) {
- RSReflectionCpp R(mRSContext, Opts.mJavaReflectionPathBase,
- getInputFileName(), getOutputFileName());
- if (!R.reflect()) {
+ const std::string &outputFileName = (Opts.mBitWidth == 64) ?
+ getOutputFileName() : getOutput32FileName();
+ RSReflectionCpp R(mRSContext, Opts.mJavaReflectionPathBase,
+ getInputFileName(), outputFileName);
+ if (!R.reflect()) {
return false;
- }
+ }
} else {
if (!Opts.mRSPackageName.empty()) {
mRSContext->setRSPackageName(Opts.mRSPackageName);