aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPirama Arumuga Nainar <pirama@google.com>2016-03-18 21:54:50 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2016-03-18 21:54:52 +0000
commit9ca594530f29b3a7965df6b8795785eb7a486b59 (patch)
tree2136cb4ca224d094ff4bc91cc8610ef2911bbdbf
parent4d86eba217ca46ddd94538a95f7290148092911d (diff)
parent98cfae456bb1831336bce2b21979a04e2e31fed4 (diff)
downloadslang-9ca594530f29b3a7965df6b8795785eb7a486b59.tar.gz
Merge "Update slang for LLVM rebase to r256229"
-rw-r--r--Android.mk6
-rw-r--r--BitWriter_2_9/Android.mk1
-rw-r--r--BitWriter_2_9/BitcodeWriter.cpp4
-rw-r--r--BitWriter_2_9/ValueEnumerator.cpp18
-rw-r--r--BitWriter_2_9_func/Android.mk1
-rw-r--r--BitWriter_2_9_func/BitcodeWriter.cpp9
-rw-r--r--BitWriter_2_9_func/ValueEnumerator.cpp18
-rw-r--r--BitWriter_3_2/Android.mk2
-rw-r--r--BitWriter_3_2/BitcodeWriter.cpp9
-rw-r--r--BitWriter_3_2/ValueEnumerator.cpp18
-rw-r--r--lit-tests/P_ref_count/ref_count.rs4
-rw-r--r--llvm-rs-cc.cpp14
-rw-r--r--rs_cc_options.cpp71
-rw-r--r--slang.cpp37
-rw-r--r--slang.h15
-rw-r--r--slang_backend.cpp13
-rw-r--r--slang_backend.h4
-rw-r--r--slang_rs_ast_replace.cpp2
-rw-r--r--slang_rs_context.cpp2
-rw-r--r--slang_rs_object_ref_count.cpp6
-rw-r--r--tests/F_vector_cast/stderr.txt.expect4
21 files changed, 149 insertions, 109 deletions
diff --git a/Android.mk b/Android.mk
index 8141ec0..5ea12e0 100644
--- a/Android.mk
+++ b/Android.mk
@@ -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;
diff --git a/slang.cpp b/slang.cpp
index 5f1a7d4..3c58722 100644
--- a/slang.cpp
+++ b/slang.cpp
@@ -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.
diff --git a/slang.h b/slang.h
index 89cc33c..faf6f8a 100644
--- a/slang.h
+++ b/slang.h
@@ -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