diff options
author | Stephen Hines <srhines@google.com> | 2014-09-10 02:43:45 -0700 |
---|---|---|
committer | Stephen Hines <srhines@google.com> | 2014-09-10 02:43:45 -0700 |
commit | 5984fc03b6189f19f3721423b92469e4908a49ef (patch) | |
tree | 76774faf25c7c757927fbb8c2e19f15d7226cc3d | |
parent | 340b5550cf63b6beae3b12c2e91377bce7704c34 (diff) | |
download | slang-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.td | 3 | ||||
-rw-r--r-- | rs_cc_options.cpp | 19 | ||||
-rw-r--r-- | slang_rs.cpp | 10 |
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); |