diff options
author | Pirama Arumuga Nainar <pirama@google.com> | 2016-03-18 21:54:50 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2016-03-18 21:54:52 +0000 |
commit | 9ca594530f29b3a7965df6b8795785eb7a486b59 (patch) | |
tree | 2136cb4ca224d094ff4bc91cc8610ef2911bbdbf | |
parent | 4d86eba217ca46ddd94538a95f7290148092911d (diff) | |
parent | 98cfae456bb1831336bce2b21979a04e2e31fed4 (diff) | |
download | slang-9ca594530f29b3a7965df6b8795785eb7a486b59.tar.gz |
Merge "Update slang for LLVM rebase to r256229"
-rw-r--r-- | Android.mk | 6 | ||||
-rw-r--r-- | BitWriter_2_9/Android.mk | 1 | ||||
-rw-r--r-- | BitWriter_2_9/BitcodeWriter.cpp | 4 | ||||
-rw-r--r-- | BitWriter_2_9/ValueEnumerator.cpp | 18 | ||||
-rw-r--r-- | BitWriter_2_9_func/Android.mk | 1 | ||||
-rw-r--r-- | BitWriter_2_9_func/BitcodeWriter.cpp | 9 | ||||
-rw-r--r-- | BitWriter_2_9_func/ValueEnumerator.cpp | 18 | ||||
-rw-r--r-- | BitWriter_3_2/Android.mk | 2 | ||||
-rw-r--r-- | BitWriter_3_2/BitcodeWriter.cpp | 9 | ||||
-rw-r--r-- | BitWriter_3_2/ValueEnumerator.cpp | 18 | ||||
-rw-r--r-- | lit-tests/P_ref_count/ref_count.rs | 4 | ||||
-rw-r--r-- | llvm-rs-cc.cpp | 14 | ||||
-rw-r--r-- | rs_cc_options.cpp | 71 | ||||
-rw-r--r-- | slang.cpp | 37 | ||||
-rw-r--r-- | slang.h | 15 | ||||
-rw-r--r-- | slang_backend.cpp | 13 | ||||
-rw-r--r-- | slang_backend.h | 4 | ||||
-rw-r--r-- | slang_rs_ast_replace.cpp | 2 | ||||
-rw-r--r-- | slang_rs_context.cpp | 2 | ||||
-rw-r--r-- | slang_rs_object_ref_count.cpp | 6 | ||||
-rw-r--r-- | tests/F_vector_cast/stderr.txt.expect | 4 |
21 files changed, 149 insertions, 109 deletions
@@ -92,11 +92,14 @@ LOCAL_LDLIBS := -ldl -lpthread include $(CLANG_HOST_BUILD_MK) include $(CLANG_TBLGEN_RULES_MK) include $(LLVM_GEN_INTRINSICS_MK) +include $(LLVM_GEN_ATTRIBUTES_MK) include $(BUILD_HOST_STATIC_LIBRARY) # ======================================================== include $(CLEAR_VARS) +LLVM_ROOT_PATH := external/llvm + LOCAL_MODULE := llvm-rs-as LOCAL_MODULE_TAGS := optional @@ -113,6 +116,8 @@ LOCAL_SHARED_LIBRARIES := \ libLLVM include $(CLANG_HOST_BUILD_MK) +include $(LLVM_HOST_BUILD_MK) +include $(LLVM_GEN_ATTRIBUTES_MK) include $(BUILD_HOST_EXECUTABLE) # Executable llvm-rs-cc for host @@ -190,6 +195,7 @@ $(intermediates)/RSCCOptions.inc: $(LOCAL_PATH)/RSCCOptions.td $(LLVM_ROOT_PATH) include $(CLANG_HOST_BUILD_MK) include $(CLANG_TBLGEN_RULES_MK) +include $(LLVM_GEN_ATTRIBUTES_MK) include $(BUILD_HOST_EXECUTABLE) endif # TARGET_BUILD_APPS diff --git a/BitWriter_2_9/Android.mk b/BitWriter_2_9/Android.mk index 37d1e61..ff9c5bc 100644 --- a/BitWriter_2_9/Android.mk +++ b/BitWriter_2_9/Android.mk @@ -22,6 +22,7 @@ LOCAL_MODULE:= libLLVMBitWriter_2_9 LOCAL_MODULE_HOST_OS := darwin linux windows include $(LLVM_HOST_BUILD_MK) +include $(LLVM_GEN_ATTRIBUTES_MK) include $(LLVM_GEN_INTRINSICS_MK) include $(BUILD_HOST_STATIC_LIBRARY) diff --git a/BitWriter_2_9/BitcodeWriter.cpp b/BitWriter_2_9/BitcodeWriter.cpp index e63959e..5a905f8 100644 --- a/BitWriter_2_9/BitcodeWriter.cpp +++ b/BitWriter_2_9/BitcodeWriter.cpp @@ -518,7 +518,7 @@ static void WriteModuleInfo(const Module *M, Vals.push_back(getEncodedLinkage(A)); Vals.push_back(getEncodedVisibility(A)); unsigned AbbrevToUse = 0; - Stream.EmitRecord(bitc::MODULE_CODE_ALIAS, Vals, AbbrevToUse); + Stream.EmitRecord(bitc::MODULE_CODE_ALIAS_OLD, Vals, AbbrevToUse); Vals.clear(); } } @@ -729,7 +729,7 @@ static void WriteMetadataAttachment(const Function &F, // If no metadata, ignore instruction. if (MDs.empty()) continue; - Record.push_back(VE.getInstructionID(I)); + Record.push_back(VE.getInstructionID(&*I)); for (unsigned i = 0, e = MDs.size(); i != e; ++i) { Record.push_back(MDs[i].first); diff --git a/BitWriter_2_9/ValueEnumerator.cpp b/BitWriter_2_9/ValueEnumerator.cpp index 59d15df..dedbedd 100644 --- a/BitWriter_2_9/ValueEnumerator.cpp +++ b/BitWriter_2_9/ValueEnumerator.cpp @@ -37,18 +37,18 @@ ValueEnumerator::ValueEnumerator(const llvm::Module &M) // Enumerate the global variables. for (llvm::Module::const_global_iterator I = M.global_begin(), E = M.global_end(); I != E; ++I) - EnumerateValue(I); + EnumerateValue(&*I); // Enumerate the functions. for (llvm::Module::const_iterator I = M.begin(), E = M.end(); I != E; ++I) { - EnumerateValue(I); + EnumerateValue(&*I); EnumerateAttributes(cast<Function>(I)->getAttributes()); } // Enumerate the aliases. for (llvm::Module::const_alias_iterator I = M.alias_begin(), E = M.alias_end(); I != E; ++I) - EnumerateValue(I); + EnumerateValue(&*I); // Remember what is the cutoff between globalvalue's and other constants. unsigned FirstConstant = Values.size(); @@ -238,7 +238,7 @@ void ValueEnumerator::EnumerateNamedMetadata(const llvm::Module &M) { for (llvm::Module::const_named_metadata_iterator I = M.named_metadata_begin(), E = M.named_metadata_end(); I != E; ++I) - EnumerateNamedMDNode(I); + EnumerateNamedMDNode(&*I); } void ValueEnumerator::EnumerateNamedMDNode(const NamedMDNode *MD) { @@ -461,7 +461,7 @@ void ValueEnumerator::incorporateFunction(const Function &F) { // Adding function arguments to the value table. for (Function::const_arg_iterator I = F.arg_begin(), E = F.arg_end(); I != E; ++I) - EnumerateValue(I); + EnumerateValue(&*I); FirstFuncConstantID = Values.size(); @@ -474,8 +474,8 @@ void ValueEnumerator::incorporateFunction(const Function &F) { isa<InlineAsm>(*OI)) EnumerateValue(*OI); } - BasicBlocks.push_back(BB); - ValueMap[BB] = BasicBlocks.size(); + BasicBlocks.push_back(&*BB); + ValueMap[&*BB] = BasicBlocks.size(); } // Optimize the constant layout. @@ -500,7 +500,7 @@ void ValueEnumerator::incorporateFunction(const Function &F) { } if (!I->getType()->isVoidTy()) - EnumerateValue(I); + EnumerateValue(&*I); } } @@ -528,7 +528,7 @@ static void IncorporateFunctionInfoGlobalBBIDs(const Function *F, DenseMap<const BasicBlock*, unsigned> &IDMap) { unsigned Counter = 0; for (Function::const_iterator BB = F->begin(), E = F->end(); BB != E; ++BB) - IDMap[BB] = ++Counter; + IDMap[&*BB] = ++Counter; } /// getGlobalBasicBlockID - This returns the function-specific ID for the diff --git a/BitWriter_2_9_func/Android.mk b/BitWriter_2_9_func/Android.mk index 742eda3..a33313a 100644 --- a/BitWriter_2_9_func/Android.mk +++ b/BitWriter_2_9_func/Android.mk @@ -22,6 +22,7 @@ LOCAL_MODULE:= libLLVMBitWriter_2_9_func LOCAL_MODULE_HOST_OS := darwin linux windows include $(LLVM_HOST_BUILD_MK) +include $(LLVM_GEN_ATTRIBUTES_MK) include $(LLVM_GEN_INTRINSICS_MK) include $(BUILD_HOST_STATIC_LIBRARY) diff --git a/BitWriter_2_9_func/BitcodeWriter.cpp b/BitWriter_2_9_func/BitcodeWriter.cpp index a187c0f..4ef7ac2 100644 --- a/BitWriter_2_9_func/BitcodeWriter.cpp +++ b/BitWriter_2_9_func/BitcodeWriter.cpp @@ -516,7 +516,7 @@ static void WriteModuleInfo(const Module *M, Vals.push_back(getEncodedLinkage(A)); Vals.push_back(getEncodedVisibility(A)); unsigned AbbrevToUse = 0; - Stream.EmitRecord(bitc::MODULE_CODE_ALIAS, Vals, AbbrevToUse); + Stream.EmitRecord(bitc::MODULE_CODE_ALIAS_OLD, Vals, AbbrevToUse); Vals.clear(); } } @@ -727,7 +727,7 @@ static void WriteMetadataAttachment(const Function &F, // If no metadata, ignore instruction. if (MDs.empty()) continue; - Record.push_back(VE.getInstructionID(I)); + Record.push_back(VE.getInstructionID(&*I)); for (unsigned i = 0, e = MDs.size(); i != e; ++i) { Record.push_back(MDs[i].first); @@ -1238,9 +1238,10 @@ static void WriteInstruction(const Instruction &I, unsigned InstID, case Instruction::LandingPad: { const LandingPadInst &LP = cast<LandingPadInst>(I); - Code = bitc::FUNC_CODE_INST_LANDINGPAD; + Code = bitc::FUNC_CODE_INST_LANDINGPAD_OLD; Vals.push_back(VE.getTypeID(LP.getType())); - PushValueAndType(LP.getPersonalityFn(), InstID, Vals, VE); + // TODO (rebase): is this fix enough? + // PushValueAndType(LP.getPersonalityFn(), InstID, Vals, VE); Vals.push_back(LP.isCleanup()); Vals.push_back(LP.getNumClauses()); for (unsigned I = 0, E = LP.getNumClauses(); I != E; ++I) { diff --git a/BitWriter_2_9_func/ValueEnumerator.cpp b/BitWriter_2_9_func/ValueEnumerator.cpp index 79b6f98..ce785da 100644 --- a/BitWriter_2_9_func/ValueEnumerator.cpp +++ b/BitWriter_2_9_func/ValueEnumerator.cpp @@ -37,18 +37,18 @@ ValueEnumerator::ValueEnumerator(const llvm::Module &M) // Enumerate the global variables. for (llvm::Module::const_global_iterator I = M.global_begin(), E = M.global_end(); I != E; ++I) - EnumerateValue(I); + EnumerateValue(&*I); // Enumerate the functions. for (llvm::Module::const_iterator I = M.begin(), E = M.end(); I != E; ++I) { - EnumerateValue(I); + EnumerateValue(&*I); EnumerateAttributes(cast<Function>(I)->getAttributes()); } // Enumerate the aliases. for (llvm::Module::const_alias_iterator I = M.alias_begin(), E = M.alias_end(); I != E; ++I) - EnumerateValue(I); + EnumerateValue(&*I); // Remember what is the cutoff between globalvalue's and other constants. unsigned FirstConstant = Values.size(); @@ -238,7 +238,7 @@ void ValueEnumerator::EnumerateNamedMetadata(const llvm::Module &M) { for (llvm::Module::const_named_metadata_iterator I = M.named_metadata_begin(), E = M.named_metadata_end(); I != E; ++I) - EnumerateNamedMDNode(I); + EnumerateNamedMDNode(&*I); } void ValueEnumerator::EnumerateNamedMDNode(const NamedMDNode *MD) { @@ -461,7 +461,7 @@ void ValueEnumerator::incorporateFunction(const Function &F) { // Adding function arguments to the value table. for (Function::const_arg_iterator I = F.arg_begin(), E = F.arg_end(); I != E; ++I) - EnumerateValue(I); + EnumerateValue(&*I); FirstFuncConstantID = Values.size(); @@ -474,8 +474,8 @@ void ValueEnumerator::incorporateFunction(const Function &F) { isa<InlineAsm>(*OI)) EnumerateValue(*OI); } - BasicBlocks.push_back(BB); - ValueMap[BB] = BasicBlocks.size(); + BasicBlocks.push_back(&*BB); + ValueMap[&*BB] = BasicBlocks.size(); } // Optimize the constant layout. @@ -500,7 +500,7 @@ void ValueEnumerator::incorporateFunction(const Function &F) { } if (!I->getType()->isVoidTy()) - EnumerateValue(I); + EnumerateValue(&*I); } } @@ -528,7 +528,7 @@ static void IncorporateFunctionInfoGlobalBBIDs(const Function *F, DenseMap<const BasicBlock*, unsigned> &IDMap) { unsigned Counter = 0; for (Function::const_iterator BB = F->begin(), E = F->end(); BB != E; ++BB) - IDMap[BB] = ++Counter; + IDMap[&*BB] = ++Counter; } /// getGlobalBasicBlockID - This returns the function-specific ID for the diff --git a/BitWriter_3_2/Android.mk b/BitWriter_3_2/Android.mk index 7a456e2..743aeaf 100644 --- a/BitWriter_3_2/Android.mk +++ b/BitWriter_3_2/Android.mk @@ -22,6 +22,7 @@ LOCAL_MODULE:= libLLVMBitWriter_3_2 LOCAL_MODULE_HOST_OS := darwin linux windows include $(LLVM_HOST_BUILD_MK) +include $(LLVM_GEN_ATTRIBUTES_MK) include $(LLVM_GEN_INTRINSICS_MK) include $(BUILD_HOST_STATIC_LIBRARY) @@ -37,6 +38,7 @@ LOCAL_SRC_FILES := $(bitcode_writer_3_2_SRC_FILES) LOCAL_MODULE:= libLLVMBitWriter_3_2 include $(LLVM_DEVICE_BUILD_MK) +include $(LLVM_GEN_ATTRIBUTES_MK) include $(LLVM_GEN_INTRINSICS_MK) include $(BUILD_STATIC_LIBRARY) diff --git a/BitWriter_3_2/BitcodeWriter.cpp b/BitWriter_3_2/BitcodeWriter.cpp index fff4490..2b8d641 100644 --- a/BitWriter_3_2/BitcodeWriter.cpp +++ b/BitWriter_3_2/BitcodeWriter.cpp @@ -531,7 +531,7 @@ static void WriteModuleInfo(const Module *M, Vals.push_back(getEncodedLinkage(A)); Vals.push_back(getEncodedVisibility(A)); unsigned AbbrevToUse = 0; - Stream.EmitRecord(bitc::MODULE_CODE_ALIAS, Vals, AbbrevToUse); + Stream.EmitRecord(bitc::MODULE_CODE_ALIAS_OLD, Vals, AbbrevToUse); Vals.clear(); } } @@ -756,7 +756,7 @@ static void WriteMetadataAttachment(const Function &F, // If no metadata, ignore instruction. if (MDs.empty()) continue; - Record.push_back(VE.getInstructionID(I)); + Record.push_back(VE.getInstructionID(&*I)); for (unsigned i = 0, e = MDs.size(); i != e; ++i) { Record.push_back(MDs[i].first); @@ -1279,9 +1279,10 @@ static void WriteInstruction(const Instruction &I, unsigned InstID, case Instruction::LandingPad: { const LandingPadInst &LP = cast<LandingPadInst>(I); - Code = bitc::FUNC_CODE_INST_LANDINGPAD; + Code = bitc::FUNC_CODE_INST_LANDINGPAD_OLD; Vals.push_back(VE.getTypeID(LP.getType())); - PushValueAndType(LP.getPersonalityFn(), InstID, Vals, VE); + // TODO (rebase): is this fix enough? + // PushValueAndType(LP.getPersonalityFn(), InstID, Vals, VE); Vals.push_back(LP.isCleanup()); Vals.push_back(LP.getNumClauses()); for (unsigned I = 0, E = LP.getNumClauses(); I != E; ++I) { diff --git a/BitWriter_3_2/ValueEnumerator.cpp b/BitWriter_3_2/ValueEnumerator.cpp index ff96493..4ce2ec6 100644 --- a/BitWriter_3_2/ValueEnumerator.cpp +++ b/BitWriter_3_2/ValueEnumerator.cpp @@ -37,18 +37,18 @@ ValueEnumerator::ValueEnumerator(const llvm::Module &M) // Enumerate the global variables. for (llvm::Module::const_global_iterator I = M.global_begin(), E = M.global_end(); I != E; ++I) - EnumerateValue(I); + EnumerateValue(&*I); // Enumerate the functions. for (llvm::Module::const_iterator I = M.begin(), E = M.end(); I != E; ++I) { - EnumerateValue(I); + EnumerateValue(&*I); EnumerateAttributes(cast<Function>(I)->getAttributes()); } // Enumerate the aliases. for (llvm::Module::const_alias_iterator I = M.alias_begin(), E = M.alias_end(); I != E; ++I) - EnumerateValue(I); + EnumerateValue(&*I); // Remember what is the cutoff between globalvalue's and other constants. unsigned FirstConstant = Values.size(); @@ -238,7 +238,7 @@ void ValueEnumerator::EnumerateNamedMetadata(const llvm::Module &M) { for (llvm::Module::const_named_metadata_iterator I = M.named_metadata_begin(), E = M.named_metadata_end(); I != E; ++I) - EnumerateNamedMDNode(I); + EnumerateNamedMDNode(&*I); } void ValueEnumerator::EnumerateNamedMDNode(const NamedMDNode *MD) { @@ -461,7 +461,7 @@ void ValueEnumerator::incorporateFunction(const Function &F) { // Adding function arguments to the value table. for (Function::const_arg_iterator I = F.arg_begin(), E = F.arg_end(); I != E; ++I) - EnumerateValue(I); + EnumerateValue(&*I); FirstFuncConstantID = Values.size(); @@ -474,8 +474,8 @@ void ValueEnumerator::incorporateFunction(const Function &F) { isa<InlineAsm>(*OI)) EnumerateValue(*OI); } - BasicBlocks.push_back(BB); - ValueMap[BB] = BasicBlocks.size(); + BasicBlocks.push_back(&*BB); + ValueMap[&*BB] = BasicBlocks.size(); } // Optimize the constant layout. @@ -500,7 +500,7 @@ void ValueEnumerator::incorporateFunction(const Function &F) { } if (!I->getType()->isVoidTy()) - EnumerateValue(I); + EnumerateValue(&*I); } } @@ -528,7 +528,7 @@ static void IncorporateFunctionInfoGlobalBBIDs(const Function *F, DenseMap<const BasicBlock*, unsigned> &IDMap) { unsigned Counter = 0; for (Function::const_iterator BB = F->begin(), E = F->end(); BB != E; ++BB) - IDMap[BB] = ++Counter; + IDMap[&*BB] = ++Counter; } /// getGlobalBasicBlockID - This returns the function-specific ID for the diff --git a/lit-tests/P_ref_count/ref_count.rs b/lit-tests/P_ref_count/ref_count.rs index 5abea94..0f5d612 100644 --- a/lit-tests/P_ref_count/ref_count.rs +++ b/lit-tests/P_ref_count/ref_count.rs @@ -1,7 +1,7 @@ // RUN: %Slang %s // RUN: %rs-filecheck-wrapper %s -// CHECK: call void @_Z13rsClearObjectP10rs_element(%struct.rs_element{{.*}}* %.rs.tmp{{[0-9]+}}) -// CHECK: call void @_Z11rsSetObjectP10rs_elementS_(%struct.rs_element{{.*}}* %.rs.retval{{[0-9]+}}, {{.*}}) +// CHECK: call void @_Z13rsClearObjectP10rs_element(%struct.rs_element{{.*}}* nonnull %.rs.tmp{{[0-9]+}}) +// CHECK: call void @_Z11rsSetObjectP10rs_elementS_(%struct.rs_element{{.*}}* nonnull %.rs.retval{{[0-9]+}}, {{.*}}) #pragma version(1) #pragma rs java_package_name(ref_count) diff --git a/llvm-rs-cc.cpp b/llvm-rs-cc.cpp index 631e9b7..201db3a 100644 --- a/llvm-rs-cc.cpp +++ b/llvm-rs-cc.cpp @@ -47,16 +47,18 @@ #include <string> namespace { -class StringSet : public llvm::StringSaver { +class StringSet { public: - const char *saveImpl(llvm::StringRef Str) override { - return Strings.insert(Str.str()).first->c_str(); + const char *save(const char *Str) { + return Strings.save(Str); } - StringSet() : llvm::StringSaver(A), A() {} + StringSet() : Strings(A), A() {} + + llvm::StringSaver & getStringSaver() { return Strings; } private: - std::set<std::string> Strings; + llvm::StringSaver Strings; llvm::BumpPtrAllocator A; }; } @@ -230,7 +232,7 @@ int main(int argc, const char **argv) { llvm::IntrusiveRefCntPtr<clang::DiagnosticOptions> DiagOpts = new clang::DiagnosticOptions(); if (!slang::ParseArguments(llvm::makeArrayRef(argv, argc), Inputs, Opts, - *DiagOpts, SavedStrings)) { + *DiagOpts, SavedStrings.getStringSaver())) { // Exits when there's any error occurred during parsing the arguments return 1; } diff --git a/rs_cc_options.cpp b/rs_cc_options.cpp index 1f989b2..889a050 100644 --- a/rs_cc_options.cpp +++ b/rs_cc_options.cpp @@ -72,8 +72,7 @@ namespace { class RSCCOptTable : public llvm::opt::OptTable { public: RSCCOptTable() - : OptTable(RSCCInfoTable, - sizeof(RSCCInfoTable) / sizeof(RSCCInfoTable[0])) {} + : OptTable(llvm::makeArrayRef(RSCCInfoTable)) {} }; } @@ -102,46 +101,46 @@ bool ParseArguments(const llvm::ArrayRef<const char *> &ArgsIn, // Populate a vector with the command line arguments, expanding command files // that have been included via the '@' argument. llvm::SmallVector<const char *, 256> ArgVector; - ArgVector.append(ArgsIn.begin(), ArgsIn.end()); + // Skip over the command name, or we will mistakenly process it as a source file. + ArgVector.append(ArgsIn.slice(1).begin(), ArgsIn.end()); llvm::cl::ExpandResponseFiles(StringSaver, llvm::cl::TokenizeGNUCommandLine, ArgVector, false); std::unique_ptr<llvm::opt::OptTable> OptParser(createRSCCOptTable()); unsigned MissingArgIndex = 0; unsigned MissingArgCount = 0; - std::unique_ptr<llvm::opt::InputArgList> Args( - OptParser->ParseArgs(ArgVector.begin() + 1, ArgVector.end(), - MissingArgIndex, MissingArgCount)); + llvm::opt::InputArgList Args = + OptParser->ParseArgs(ArgVector, MissingArgIndex, MissingArgCount); // Check for missing argument error. if (MissingArgCount) { DiagEngine.Report(clang::diag::err_drv_missing_argument) - << Args->getArgString(MissingArgIndex) << MissingArgCount; + << Args.getArgString(MissingArgIndex) << MissingArgCount; } // Issue errors on unknown arguments. - for (llvm::opt::arg_iterator it = Args->filtered_begin(OPT_UNKNOWN), - ie = Args->filtered_end(); + for (llvm::opt::arg_iterator it = Args.filtered_begin(OPT_UNKNOWN), + ie = Args.filtered_end(); it != ie; ++it) { DiagEngine.Report(clang::diag::err_drv_unknown_argument) - << (*it)->getAsString(*Args); + << (*it)->getAsString(Args); } - DiagOpts.IgnoreWarnings = Args->hasArg(OPT_w); - DiagOpts.Warnings = Args->getAllArgValues(OPT_W); + DiagOpts.IgnoreWarnings = Args.hasArg(OPT_w); + DiagOpts.Warnings = Args.getAllArgValues(OPT_W); - for (llvm::opt::ArgList::const_iterator it = Args->begin(), ie = Args->end(); + for (llvm::opt::ArgList::const_iterator it = Args.begin(), ie = Args.end(); it != ie; ++it) { const llvm::opt::Arg *A = *it; if (A->getOption().getKind() == llvm::opt::Option::InputClass) Inputs.push_back(A->getValue()); } - Opts.mIncludePaths = Args->getAllArgValues(OPT_I); + Opts.mIncludePaths = Args.getAllArgValues(OPT_I); - Opts.mBitcodeOutputDir = Args->getLastArgValue(OPT_o); + Opts.mBitcodeOutputDir = Args.getLastArgValue(OPT_o); - if (const llvm::opt::Arg *A = Args->getLastArg(OPT_M_Group)) { + if (const llvm::opt::Arg *A = Args.getLastArg(OPT_M_Group)) { switch (A->getOption().getID()) { case OPT_M: { Opts.mEmitDependency = true; @@ -163,7 +162,7 @@ bool ParseArguments(const llvm::ArrayRef<const char *> &ArgsIn, } } - if (const llvm::opt::Arg *A = Args->getLastArg(OPT_Output_Type_Group)) { + if (const llvm::opt::Arg *A = Args.getLastArg(OPT_Output_Type_Group)) { switch (A->getOption().getID()) { case OPT_emit_asm: { Opts.mOutputType = Slang::OT_Assembly; @@ -188,20 +187,20 @@ bool ParseArguments(const llvm::ArrayRef<const char *> &ArgsIn, if (Opts.mEmitDependency && ((Opts.mOutputType != Slang::OT_Bitcode) && (Opts.mOutputType != Slang::OT_Dependency))) DiagEngine.Report(clang::diag::err_drv_argument_not_allowed_with) - << Args->getLastArg(OPT_M_Group)->getAsString(*Args) - << Args->getLastArg(OPT_Output_Type_Group)->getAsString(*Args); + << Args.getLastArg(OPT_M_Group)->getAsString(Args) + << Args.getLastArg(OPT_Output_Type_Group)->getAsString(Args); - Opts.mAllowRSPrefix = Args->hasArg(OPT_allow_rs_prefix); + Opts.mAllowRSPrefix = Args.hasArg(OPT_allow_rs_prefix); Opts.mJavaReflectionPathBase = - Args->getLastArgValue(OPT_java_reflection_path_base); + Args.getLastArgValue(OPT_java_reflection_path_base); Opts.mJavaReflectionPackageName = - Args->getLastArgValue(OPT_java_reflection_package_name); + Args.getLastArgValue(OPT_java_reflection_package_name); - Opts.mRSPackageName = Args->getLastArgValue(OPT_rs_package_name); + Opts.mRSPackageName = Args.getLastArgValue(OPT_rs_package_name); llvm::StringRef BitcodeStorageValue = - Args->getLastArgValue(OPT_bitcode_storage); + Args.getLastArgValue(OPT_bitcode_storage); if (BitcodeStorageValue == "ar") Opts.mBitcodeStorage = BCST_APK_RESOURCE; else if (BitcodeStorageValue == "jc") @@ -210,8 +209,8 @@ bool ParseArguments(const llvm::ArrayRef<const char *> &ArgsIn, DiagEngine.Report(clang::diag::err_drv_invalid_value) << OptParser->getOptionName(OPT_bitcode_storage) << BitcodeStorageValue; - llvm::opt::Arg *lastBitwidthArg = Args->getLastArg(OPT_m32, OPT_m64); - if (Args->hasArg(OPT_reflect_cpp)) { + llvm::opt::Arg *lastBitwidthArg = Args.getLastArg(OPT_m32, OPT_m64); + if (Args.hasArg(OPT_reflect_cpp)) { Opts.mBitcodeStorage = BCST_CPP_CODE; // mJavaReflectionPathBase can be set for C++ reflected builds. // Set it to the standard mBitcodeOutputDir (via -o) by default. @@ -247,20 +246,20 @@ bool ParseArguments(const llvm::ArrayRef<const char *> &ArgsIn, } Opts.mDependencyOutputDir = - Args->getLastArgValue(OPT_output_dep_dir, Opts.mBitcodeOutputDir); - Opts.mAdditionalDepTargets = Args->getAllArgValues(OPT_additional_dep_target); + Args.getLastArgValue(OPT_output_dep_dir, Opts.mBitcodeOutputDir); + Opts.mAdditionalDepTargets = Args.getAllArgValues(OPT_additional_dep_target); - Opts.mShowHelp = Args->hasArg(OPT_help); - Opts.mShowVersion = Args->hasArg(OPT_version); - Opts.mDebugEmission = Args->hasArg(OPT_emit_g); - Opts.mVerbose = Args->hasArg(OPT_verbose); - Opts.mASTPrint = Args->hasArg(OPT_ast_print); + Opts.mShowHelp = Args.hasArg(OPT_help); + Opts.mShowVersion = Args.hasArg(OPT_version); + Opts.mDebugEmission = Args.hasArg(OPT_emit_g); + Opts.mVerbose = Args.hasArg(OPT_verbose); + Opts.mASTPrint = Args.hasArg(OPT_ast_print); // Delegate options std::vector<std::string> DelegatedStrings; for (int Opt : std::vector<unsigned>{OPT_debug, OPT_print_after_all, OPT_print_before_all}) { - if (Args->hasArg(Opt)) { + if (Args.hasArg(Opt)) { // TODO: Don't assume that the option begins with "-"; determine this programmatically instead. DelegatedStrings.push_back(std::string("-") + std::string(OptParser->getOptionName(Opt))); slangAssert(OptParser->getOptionKind(Opt) == llvm::opt::Option::FlagClass); @@ -277,13 +276,13 @@ bool ParseArguments(const llvm::ArrayRef<const char *> &ArgsIn, // If we are emitting both 32-bit and 64-bit bitcode, we must embed it. size_t OptLevel = - clang::getLastArgIntValue(*Args, OPT_optimization_level, 3, DiagEngine); + clang::getLastArgIntValue(Args, OPT_optimization_level, 3, DiagEngine); Opts.mOptimizationLevel = OptLevel == 0 ? llvm::CodeGenOpt::None : llvm::CodeGenOpt::Aggressive; Opts.mTargetAPI = - clang::getLastArgIntValue(*Args, OPT_target_api, RS_VERSION, DiagEngine); + clang::getLastArgIntValue(Args, OPT_target_api, RS_VERSION, DiagEngine); if (Opts.mTargetAPI == 0) { Opts.mTargetAPI = UINT_MAX; @@ -40,13 +40,14 @@ #include "clang/Frontend/DependencyOutputOptions.h" #include "clang/Frontend/FrontendDiagnostic.h" #include "clang/Frontend/FrontendOptions.h" +#include "clang/Frontend/PCHContainerOperations.h" #include "clang/Frontend/TextDiagnosticPrinter.h" #include "clang/Frontend/Utils.h" -#include "clang/Lex/Preprocessor.h" -#include "clang/Lex/PreprocessorOptions.h" #include "clang/Lex/HeaderSearch.h" #include "clang/Lex/HeaderSearchOptions.h" +#include "clang/Lex/Preprocessor.h" +#include "clang/Lex/PreprocessorOptions.h" #include "clang/Parse/ParseAST.h" @@ -174,17 +175,13 @@ void Slang::createSourceManager() { void Slang::createPreprocessor() { // Default only search header file in current dir - llvm::IntrusiveRefCntPtr<clang::HeaderSearchOptions> HSOpts = - new clang::HeaderSearchOptions(); - clang::HeaderSearch *HeaderInfo = new clang::HeaderSearch(HSOpts, + clang::HeaderSearch *HeaderInfo = new clang::HeaderSearch(&getHeaderSearchOpts(), *mSourceMgr, *mDiagEngine, LangOpts, mTarget.get()); - llvm::IntrusiveRefCntPtr<clang::PreprocessorOptions> PPOpts = - new clang::PreprocessorOptions(); - mPP.reset(new clang::Preprocessor(PPOpts, + mPP.reset(new clang::Preprocessor(&getPreprocessorOpts(), *mDiagEngine, LangOpts, *mSourceMgr, @@ -195,7 +192,13 @@ void Slang::createPreprocessor() { // Initialize the preprocessor mPP->Initialize(getTargetInfo()); clang::FrontendOptions FEOpts; - clang::InitializePreprocessor(*mPP, *PPOpts, FEOpts); + + auto *Reader = mPCHContainerOperations->getReaderOrNull( + getHeaderSearchOpts().ModuleFormat); + clang::InitializePreprocessor(*mPP, getPreprocessorOpts(), *Reader, FEOpts); + + clang::ApplyHeaderSearchOptions(*HeaderInfo, getHeaderSearchOpts(), LangOpts, + mPP->getTargetInfo().getTriple()); mPragmas.clear(); @@ -228,16 +231,22 @@ void Slang::createASTContext() { clang::ASTConsumer * Slang::createBackend(const RSCCOptions &Opts, const clang::CodeGenOptions &CodeGenOpts, llvm::raw_ostream *OS, OutputType OT) { - return new Backend(mRSContext, &getDiagnostics(), Opts, CodeGenOpts, - getTargetOptions(), &mPragmas, OS, OT, getSourceManager(), - mAllowRSPrefix, mIsFilterscript); + auto *B = new Backend(mRSContext, &getDiagnostics(), Opts, + getHeaderSearchOpts(), getPreprocessorOpts(), + CodeGenOpts, getTargetOptions(), &mPragmas, OS, OT, + getSourceManager(), mAllowRSPrefix, mIsFilterscript); + B->Initialize(getASTContext()); + return B; } Slang::Slang(uint32_t BitWidth, clang::DiagnosticsEngine *DiagEngine, DiagnosticBuffer *DiagClient) : mDiagEngine(DiagEngine), mDiagClient(DiagClient), - mTargetOpts(new clang::TargetOptions()), mOT(OT_Default), - mRSContext(nullptr), mAllowRSPrefix(false), mTargetAPI(0), + mTargetOpts(new clang::TargetOptions()), + mHSOpts(new clang::HeaderSearchOptions()), + mPPOpts(new clang::PreprocessorOptions()), + mPCHContainerOperations(std::make_shared<clang::PCHContainerOperations>()), + mOT(OT_Default), mRSContext(nullptr), mAllowRSPrefix(false), mTargetAPI(0), mVerbose(false), mIsFilterscript(false) { // Please refer to include/clang/Basic/LangOptions.h to setup // the options. @@ -57,8 +57,11 @@ namespace clang { class DiagnosticsEngine; class FileManager; class FileSystemOptions; + class HeaderSearchOptions; class LangOptions; + class PCHContainerOperations; class Preprocessor; + class PreprocessorOptions; class SourceManager; class TargetInfo; } // namespace clang @@ -123,6 +126,16 @@ class Slang : public clang::ModuleLoader { // AST consumer, responsible for code generation std::unique_ptr<clang::ASTConsumer> mBackend; + // Options for includes + llvm::IntrusiveRefCntPtr<clang::HeaderSearchOptions> mHSOpts; + + // Options for the preprocessor (but not header includes) + llvm::IntrusiveRefCntPtr<clang::PreprocessorOptions> mPPOpts; + + // Module provider (probably not necessary, but keeps us more consistent + // with regular Clang. + std::shared_ptr<clang::PCHContainerOperations> mPCHContainerOperations; + // File names std::string mInputFileName; std::string mOutputFileName; @@ -182,6 +195,8 @@ class Slang : public clang::ModuleLoader { clang::SourceManager &getSourceManager() { return *mSourceMgr; } clang::Preprocessor &getPreprocessor() { return *mPP; } clang::ASTContext &getASTContext() { return *mASTContext; } + clang::HeaderSearchOptions &getHeaderSearchOpts() { return *mHSOpts; } + clang::PreprocessorOptions &getPreprocessorOpts() { return *mPPOpts; } inline clang::TargetOptions const &getTargetOptions() const { return *mTargetOpts.get(); } diff --git a/slang_backend.cpp b/slang_backend.cpp index c6b5a58..e4110df 100644 --- a/slang_backend.cpp +++ b/slang_backend.cpp @@ -176,9 +176,6 @@ bool Backend::CreateCodeGenPasses() { TargetInfo->createTargetMachine(Triple, mTargetOpts.CPU, FeaturesStr, Options, RM, CM); - // Register scheduler - llvm::RegisterScheduler::setDefault(llvm::createDefaultScheduler); - // Register allocation policy: // createFastRegisterAllocator: fast but bad quality // createGreedyRegisterAllocator: not so fast but good quality @@ -208,7 +205,10 @@ bool Backend::CreateCodeGenPasses() { } Backend::Backend(RSContext *Context, clang::DiagnosticsEngine *DiagEngine, - const RSCCOptions &Opts, const clang::CodeGenOptions &CodeGenOpts, + const RSCCOptions &Opts, + const clang::HeaderSearchOptions &HeaderSearchOpts, + const clang::PreprocessorOptions &PreprocessorOpts, + const clang::CodeGenOptions &CodeGenOpts, const clang::TargetOptions &TargetOpts, PragmaList *Pragmas, llvm::raw_ostream *OS, Slang::OutputType OT, clang::SourceManager &SourceMgr, bool AllowRSPrefix, @@ -228,7 +228,8 @@ Backend::Backend(RSContext *Context, clang::DiagnosticsEngine *DiagEngine, mForEachHandler(Context), mLLVMContext(llvm::getGlobalContext()), mDiagEngine(*DiagEngine), mCodeGenOpts(CodeGenOpts), mPragmas(Pragmas) { - mGen = CreateLLVMCodeGen(mDiagEngine, "", mCodeGenOpts, mLLVMContext); + mGen = CreateLLVMCodeGen(mDiagEngine, "", HeaderSearchOpts, PreprocessorOpts, + mCodeGenOpts, mLLVMContext); } void Backend::Initialize(clang::ASTContext &Ctx) { @@ -340,8 +341,6 @@ void Backend::HandleTranslationUnit(clang::ASTContext &Ctx) { slangAssert(false && "Unknown output type"); } } - - mBufferOutStream.flush(); } void Backend::HandleTagDeclDefinition(clang::TagDecl *D) { diff --git a/slang_backend.h b/slang_backend.h index ef7f635..72519ae 100644 --- a/slang_backend.h +++ b/slang_backend.h @@ -45,6 +45,8 @@ namespace clang { class DeclGroupRef; class DiagnosticsEngine; class FunctionDecl; + class HeaderSearchOptions; + class PreprocessorOptions; class TagDecl; class TargetOptions; class VarDecl; @@ -149,6 +151,8 @@ class Backend : public clang::ASTConsumer { Backend(RSContext *Context, clang::DiagnosticsEngine *DiagEngine, const RSCCOptions &Opts, + const clang::HeaderSearchOptions &HeaderSearchOpts, + const clang::PreprocessorOptions &PreprocessorOpts, const clang::CodeGenOptions &CodeGenOpts, const clang::TargetOptions &TargetOpts, PragmaList *Pragmas, diff --git a/slang_rs_ast_replace.cpp b/slang_rs_ast_replace.cpp index ef95b08..92e1428 100644 --- a/slang_rs_ast_replace.cpp +++ b/slang_rs_ast_replace.cpp @@ -54,7 +54,7 @@ void RSASTReplace::ReplaceInCompoundStmt(clang::CompoundStmt *CS) { } } - CS->setStmts(C, UpdatedStmtList, UpdatedStmtCount); + CS->setStmts(C, llvm::makeArrayRef(UpdatedStmtList, UpdatedStmtCount)); delete [] UpdatedStmtList; } diff --git a/slang_rs_context.cpp b/slang_rs_context.cpp index 0281a68..626cc0a 100644 --- a/slang_rs_context.cpp +++ b/slang_rs_context.cpp @@ -69,7 +69,7 @@ RSContext::RSContext(clang::Preprocessor &PP, AddPragmaHandlers(PP, this); // Prepare target data - mDataLayout = new llvm::DataLayout(Target.getTargetDescription()); + mDataLayout = new llvm::DataLayout(Target.getDataLayoutString()); // Reserve slot 0 for the root kernel. mExportForEach.push_back(nullptr); diff --git a/slang_rs_object_ref_count.cpp b/slang_rs_object_ref_count.cpp index bf93eb0..906d08c 100644 --- a/slang_rs_object_ref_count.cpp +++ b/slang_rs_object_ref_count.cpp @@ -169,7 +169,7 @@ void AppendAfterStmt(clang::ASTContext &C, } } - CS->setStmts(C, UpdatedStmtList, UpdatedStmtCount); + CS->setStmts(C, llvm::makeArrayRef(UpdatedStmtList, UpdatedStmtCount)); delete [] UpdatedStmtList; } @@ -1088,7 +1088,7 @@ void RSObjectRefCount::Scope::InsertStmt(const clang::ASTContext &C, } newBody.push_back(S1); } - mCS->setStmts(C, newBody.data(), newBody.size()); + mCS->setStmts(C, newBody); } void RSObjectRefCount::Scope::ReplaceStmt(const clang::ASTContext &C, @@ -1101,7 +1101,7 @@ void RSObjectRefCount::Scope::ReplaceStmt(const clang::ASTContext &C, newBody.push_back(S1); } } - mCS->setStmts(C, newBody.data(), newBody.size()); + mCS->setStmts(C, newBody); } void RSObjectRefCount::Scope::ReplaceExpr(const clang::ASTContext& C, diff --git a/tests/F_vector_cast/stderr.txt.expect b/tests/F_vector_cast/stderr.txt.expect index fdf739c..032948d 100644 --- a/tests/F_vector_cast/stderr.txt.expect +++ b/tests/F_vector_cast/stderr.txt.expect @@ -1,5 +1,5 @@ -vector_cast.rs:8:11: error: can't convert between vector values of different size ('float2' (vector of 2 'float' values) and 'int2' (vector of 2 'int' values)) -vector_cast.rs:15:11: error: can't convert between vector values of different size ('int3' (vector of 3 'int' values) and 'float3' (vector of 3 'float' values)) +vector_cast.rs:8:11: error: cannot convert between vector values of different size ('float2' (vector of 2 'float' values) and 'int2' (vector of 2 'int' values)) +vector_cast.rs:15:11: error: cannot convert between vector values of different size ('int3' (vector of 3 'int' values) and 'float3' (vector of 3 'float' values)) vector_cast.rs:7:9: error: invalid vector cast vector_cast.rs:14:9: error: invalid vector cast vector_cast.rs:21:9: error: invalid vector cast |