diff options
author | Stephen Hines <srhines@google.com> | 2013-01-09 20:02:04 -0800 |
---|---|---|
committer | Stephen Hines <srhines@google.com> | 2013-01-21 11:10:34 -0800 |
commit | 23c4358f12bd9d0ba7166eceebd683db95a41b3f (patch) | |
tree | a00b90b20e7645966092dc9eef97c7f468457b76 | |
parent | f69e1e58cf65555c4be3f6c5c53f89eb044f1db5 (diff) | |
download | android_frameworks_compile_slang-23c4358f12bd9d0ba7166eceebd683db95a41b3f.tar.gz android_frameworks_compile_slang-23c4358f12bd9d0ba7166eceebd683db95a41b3f.tar.bz2 android_frameworks_compile_slang-23c4358f12bd9d0ba7166eceebd683db95a41b3f.zip |
Updates for LLVM merge to r171906 on 20130108.
Change-Id: I4cf3718041d8876d4a23a412b6b4fa4226ec3b50
-rw-r--r-- | Android.mk | 2 | ||||
-rw-r--r-- | BitWriter_2_9/BitcodeWriter.cpp | 36 | ||||
-rw-r--r-- | BitWriter_2_9/BitcodeWriterPass.cpp | 6 | ||||
-rw-r--r-- | BitWriter_2_9/ValueEnumerator.cpp | 38 | ||||
-rw-r--r-- | BitWriter_2_9/ValueEnumerator.h | 36 | ||||
-rw-r--r-- | BitWriter_2_9_func/BitcodeWriter.cpp | 86 | ||||
-rw-r--r-- | BitWriter_2_9_func/BitcodeWriterPass.cpp | 6 | ||||
-rw-r--r-- | BitWriter_2_9_func/ValueEnumerator.cpp | 38 | ||||
-rw-r--r-- | BitWriter_2_9_func/ValueEnumerator.h | 36 | ||||
-rw-r--r-- | BitWriter_3_2/BitcodeWriter.cpp | 106 | ||||
-rw-r--r-- | BitWriter_3_2/ValueEnumerator.cpp | 38 | ||||
-rw-r--r-- | BitWriter_3_2/ValueEnumerator.h | 36 | ||||
-rw-r--r-- | RSCCOptions.td | 74 | ||||
-rw-r--r-- | llvm-rs-cc.cpp | 28 | ||||
-rw-r--r-- | llvm-rs-link.cpp | 12 | ||||
-rw-r--r-- | slang.cpp | 44 | ||||
-rw-r--r-- | slang.h | 19 | ||||
-rw-r--r-- | slang_backend.cpp | 14 | ||||
-rw-r--r-- | slang_rs_backend.cpp | 14 | ||||
-rw-r--r-- | slang_rs_context.cpp | 12 | ||||
-rw-r--r-- | slang_rs_context.h | 6 | ||||
-rw-r--r-- | slang_rs_export_foreach.cpp | 4 | ||||
-rw-r--r-- | slang_rs_export_func.cpp | 8 | ||||
-rw-r--r-- | slang_rs_export_type.cpp | 14 | ||||
-rw-r--r-- | slang_rs_object_ref_count.cpp | 28 | ||||
-rw-r--r-- | slang_rs_pragma_handler.cpp | 6 |
26 files changed, 383 insertions, 364 deletions
@@ -43,8 +43,8 @@ static_libraries_needed_by_slang := \ libclangAnalysis \ libclangCodeGen \ libclangAST \ - libclangLex \ libclangEdit \ + libclangLex \ libclangFrontend \ libclangBasic \ libclangSerialization \ diff --git a/BitWriter_2_9/BitcodeWriter.cpp b/BitWriter_2_9/BitcodeWriter.cpp index 4cfba10..037bd42 100644 --- a/BitWriter_2_9/BitcodeWriter.cpp +++ b/BitWriter_2_9/BitcodeWriter.cpp @@ -12,21 +12,21 @@ //===----------------------------------------------------------------------===// #include "ReaderWriter_2_9.h" -#include "llvm/Bitcode/BitstreamWriter.h" -#include "llvm/Bitcode/LLVMBitCodes.h" #include "ValueEnumerator.h" -#include "llvm/Constants.h" -#include "llvm/DerivedTypes.h" -#include "llvm/InlineAsm.h" -#include "llvm/Instructions.h" -#include "llvm/Module.h" -#include "llvm/Operator.h" -#include "llvm/ValueSymbolTable.h" #include "llvm/ADT/Triple.h" +#include "llvm/Bitcode/BitstreamWriter.h" +#include "llvm/Bitcode/LLVMBitCodes.h" +#include "llvm/IR/Constants.h" +#include "llvm/IR/DerivedTypes.h" +#include "llvm/IR/InlineAsm.h" +#include "llvm/IR/Instructions.h" +#include "llvm/IR/Module.h" +#include "llvm/IR/Operator.h" +#include "llvm/IR/ValueSymbolTable.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/MathExtras.h" -#include "llvm/Support/raw_ostream.h" #include "llvm/Support/Program.h" +#include "llvm/Support/raw_ostream.h" #include <cctype> #include <map> using namespace llvm; @@ -134,18 +134,19 @@ static void WriteStringRecord(unsigned Code, StringRef Str, // Emit information about parameter attributes. static void WriteAttributeTable(const llvm_2_9::ValueEnumerator &VE, BitstreamWriter &Stream) { - const std::vector<AttrListPtr> &Attrs = VE.getAttributes(); + const std::vector<AttributeSet> &Attrs = VE.getAttributes(); if (Attrs.empty()) return; Stream.EnterSubblock(bitc::PARAMATTR_BLOCK_ID, 3); SmallVector<uint64_t, 64> Record; for (unsigned i = 0, e = Attrs.size(); i != e; ++i) { - const AttrListPtr &A = Attrs[i]; + const AttributeSet &A = Attrs[i]; for (unsigned i = 0, e = A.getNumSlots(); i != e; ++i) { const AttributeWithIndex &PAWI = A.getSlot(i); Record.push_back(PAWI.Index); - + Record.push_back(Attribute::encodeLLVMAttributesForBitcode(PAWI.Attrs)); +#if 0 // FIXME: remove in LLVM 3.0 // Store the alignment in the bitcode as a 16-bit raw value instead of a // 5-bit log2 encoded value. Shift the bits above the alignment up by @@ -157,6 +158,7 @@ static void WriteAttributeTable(const llvm_2_9::ValueEnumerator &VE, FauxAttr |= (PAWI.Attrs.Raw() & (0x3FFull << 21)) << 11; Record.push_back(FauxAttr); +#endif } Stream.EmitRecord(bitc::PARAMATTR_CODE_ENTRY, Record); @@ -433,10 +435,6 @@ static unsigned getEncodedVisibility(const GlobalValue *GV) { static void WriteModuleInfo(const Module *M, const llvm_2_9::ValueEnumerator &VE, BitstreamWriter &Stream) { - // Emit the list of dependent libraries for the Module. - for (Module::lib_iterator I = M->lib_begin(), E = M->lib_end(); I != E; ++I) - WriteStringRecord(bitc::MODULE_CODE_DEPLIB, *I, 0/*TODO*/, Stream); - // Emit various pieces of data attached to a module. if (!M->getTargetTriple().empty()) WriteStringRecord(bitc::MODULE_CODE_TRIPLE, M->getTargetTriple(), @@ -907,12 +905,12 @@ static void WriteConstants(unsigned FirstVal, unsigned LastVal, if (isCStrChar6) isCStrChar6 = BitCodeAbbrevOp::isChar6(V); } - + if (isCStrChar6) AbbrevToUse = CString6Abbrev; else if (isCStr7) AbbrevToUse = CString7Abbrev; - } else if (const ConstantDataSequential *CDS = + } else if (const ConstantDataSequential *CDS = dyn_cast<ConstantDataSequential>(C)) { // We must replace ConstantDataSequential's representation with the // legacy ConstantArray/ConstantVector/ConstantStruct version. diff --git a/BitWriter_2_9/BitcodeWriterPass.cpp b/BitWriter_2_9/BitcodeWriterPass.cpp index 1ae4556..dfacc54 100644 --- a/BitWriter_2_9/BitcodeWriterPass.cpp +++ b/BitWriter_2_9/BitcodeWriterPass.cpp @@ -12,9 +12,9 @@ //===----------------------------------------------------------------------===// #include "ReaderWriter_2_9.h" -#include "llvm/Function.h" -#include "llvm/Instructions.h" -#include "llvm/Module.h" +#include "llvm/IR/Function.h" +#include "llvm/IR/Instructions.h" +#include "llvm/IR/Module.h" #include "llvm/Pass.h" using namespace llvm; diff --git a/BitWriter_2_9/ValueEnumerator.cpp b/BitWriter_2_9/ValueEnumerator.cpp index b1cbbe9..a07c54c 100644 --- a/BitWriter_2_9/ValueEnumerator.cpp +++ b/BitWriter_2_9/ValueEnumerator.cpp @@ -12,13 +12,13 @@ //===----------------------------------------------------------------------===// #include "ValueEnumerator.h" -#include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/STLExtras.h" -#include "llvm/Constants.h" -#include "llvm/DerivedTypes.h" -#include "llvm/Module.h" -#include "llvm/ValueSymbolTable.h" -#include "llvm/Instructions.h" +#include "llvm/ADT/SmallPtrSet.h" +#include "llvm/IR/Constants.h" +#include "llvm/IR/DerivedTypes.h" +#include "llvm/IR/Instructions.h" +#include "llvm/IR/Module.h" +#include "llvm/IR/ValueSymbolTable.h" #include "llvm/Support/Debug.h" #include "llvm/Support/raw_ostream.h" #include <algorithm> @@ -97,7 +97,7 @@ ValueEnumerator::ValueEnumerator(const Module *M) { I->getAllMetadataOtherThanDebugLoc(MDs); for (unsigned i = 0, e = MDs.size(); i != e; ++i) EnumerateMetadata(MDs[i].second); - + if (!I->getDebugLoc().isUnknown()) { MDNode *Scope, *IA; I->getDebugLoc().getScopeAndInlinedAt(Scope, IA, I->getContext()); @@ -374,16 +374,16 @@ void ValueEnumerator::EnumerateType(Type *Ty) { if (StructType *STy = dyn_cast<StructType>(Ty)) if (!STy->isLiteral()) *TypeID = ~0U; - + // Enumerate all of the subtypes before we enumerate this type. This ensures // that the type will be enumerated in an order that can be directly built. for (Type::subtype_iterator I = Ty->subtype_begin(), E = Ty->subtype_end(); I != E; ++I) EnumerateType(*I); - + // Refresh the TypeID pointer in case the table rehashed. TypeID = &TypeMap[Ty]; - + // Check to see if we got the pointer another way. This can happen when // enumerating recursive types that hit the base case deeper than they start. // @@ -391,10 +391,10 @@ void ValueEnumerator::EnumerateType(Type *Ty) { // then emit the definition now that all of its contents are available. if (*TypeID && *TypeID != ~0U) return; - + // Add this type now that its contents are all happily enumerated. Types.push_back(Ty); - + *TypeID = Types.size(); } @@ -402,7 +402,7 @@ void ValueEnumerator::EnumerateType(Type *Ty) { // walk through it, enumerating the types of the constant. void ValueEnumerator::EnumerateOperandType(const Value *V) { EnumerateType(V->getType()); - + if (const Constant *C = dyn_cast<Constant>(V)) { // If this constant is already enumerated, ignore it, we know its type must // be enumerated. @@ -412,11 +412,11 @@ void ValueEnumerator::EnumerateOperandType(const Value *V) { // them. for (unsigned i = 0, e = C->getNumOperands(); i != e; ++i) { const Value *Op = C->getOperand(i); - + // Don't enumerate basic blocks here, this happens as operands to // blockaddress. if (isa<BasicBlock>(Op)) continue; - + EnumerateOperandType(Op); } @@ -429,14 +429,14 @@ void ValueEnumerator::EnumerateOperandType(const Value *V) { EnumerateMetadata(V); } -void ValueEnumerator::EnumerateAttributes(const AttrListPtr &PAL) { +void ValueEnumerator::EnumerateAttributes(const AttributeSet &PAL) { if (PAL.isEmpty()) return; // null is always 0. // Do a lookup. unsigned &Entry = AttributeMap[PAL.getRawPointer()]; if (Entry == 0) { // Never saw this before, add it. - Attributes.push_back(PAL); - Entry = Attributes.size(); + Attribute.push_back(PAL); + Entry = Attribute.size(); } } @@ -493,7 +493,7 @@ void ValueEnumerator::incorporateFunction(const Function &F) { if (N->isFunctionLocal() && N->getFunction()) FnLocalMDVector.push_back(N); } - + if (!I->getType()->isVoidTy()) EnumerateValue(I); } diff --git a/BitWriter_2_9/ValueEnumerator.h b/BitWriter_2_9/ValueEnumerator.h index 9e21775..6711e4b 100644 --- a/BitWriter_2_9/ValueEnumerator.h +++ b/BitWriter_2_9/ValueEnumerator.h @@ -16,7 +16,7 @@ #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/SmallVector.h" -#include "llvm/Attributes.h" +#include "llvm/IR/Attributes.h" #include <vector> namespace llvm { @@ -29,7 +29,7 @@ class Function; class Module; class MDNode; class NamedMDNode; -class AttrListPtr; +class AttributeSet; class ValueSymbolTable; class MDSymbolTable; class raw_ostream; @@ -55,15 +55,15 @@ private: ValueList MDValues; llvm::SmallVector<const llvm::MDNode *, 8> FunctionLocalMDs; ValueMapType MDValueMap; - + typedef llvm::DenseMap<void*, unsigned> AttributeMapType; AttributeMapType AttributeMap; - std::vector<llvm::AttrListPtr> Attributes; - + std::vector<llvm::AttributeSet> Attribute; + /// GlobalBasicBlockIDs - This map memoizes the basic block ID's referenced by /// the "getGlobalBasicBlockID" method. mutable llvm::DenseMap<const llvm::BasicBlock*, unsigned> GlobalBasicBlockIDs; - + typedef llvm::DenseMap<const llvm::Instruction*, unsigned> InstructionMapType; InstructionMapType InstructionMap; unsigned InstructionCount; @@ -71,7 +71,7 @@ private: /// BasicBlocks - This contains all the basic blocks for the currently /// incorporated function. Their reverse mapping is stored in ValueMap. std::vector<const llvm::BasicBlock*> BasicBlocks; - + /// When a function is incorporated, this is the size of the Values list /// before incorporation. unsigned NumModuleValues; @@ -82,7 +82,7 @@ private: unsigned FirstFuncConstantID; unsigned FirstInstID; - + ValueEnumerator(const ValueEnumerator &); // DO NOT IMPLEMENT void operator=(const ValueEnumerator &); // DO NOT IMPLEMENT public: @@ -102,7 +102,7 @@ public: unsigned getInstructionID(const llvm::Instruction *I) const; void setInstructionID(const llvm::Instruction *I); - unsigned getAttributeID(const llvm::AttrListPtr &PAL) const { + unsigned getAttributeID(const llvm::AttributeSet &PAL) const { if (PAL.isEmpty()) return 0; // Null maps to zero. AttributeMapType::const_iterator I = AttributeMap.find(PAL.getRawPointer()); assert(I != AttributeMap.end() && "Attribute not in ValueEnumerator!"); @@ -115,20 +115,20 @@ public: Start = FirstFuncConstantID; End = FirstInstID; } - + const ValueList &getValues() const { return Values; } const ValueList &getMDValues() const { return MDValues; } - const llvm::SmallVector<const llvm::MDNode *, 8> &getFunctionLocalMDValues() const { + const llvm::SmallVector<const llvm::MDNode *, 8> &getFunctionLocalMDValues() const { return FunctionLocalMDs; } const TypeList &getTypes() const { return Types; } const std::vector<const llvm::BasicBlock*> &getBasicBlocks() const { - return BasicBlocks; + return BasicBlocks; } - const std::vector<llvm::AttrListPtr> &getAttributes() const { - return Attributes; + const std::vector<llvm::AttributeSet> &getAttributes() const { + return Attribute; } - + /// getGlobalBasicBlockID - This returns the function-specific ID for the /// specified basic block. This is relatively expensive information, so it /// should only be used by rare constructs such as address-of-label. @@ -142,7 +142,7 @@ public: private: void OptimizeConstants(unsigned CstStart, unsigned CstEnd); - + void EnumerateMDNodeOperands(const llvm::MDNode *N); void EnumerateMetadata(const llvm::Value *MD); void EnumerateFunctionLocalMetadata(const llvm::MDNode *N); @@ -150,8 +150,8 @@ private: void EnumerateValue(const llvm::Value *V); void EnumerateType(llvm::Type *T); void EnumerateOperandType(const llvm::Value *V); - void EnumerateAttributes(const llvm::AttrListPtr &PAL); - + void EnumerateAttributes(const llvm::AttributeSet &PAL); + void EnumerateValueSymbolTable(const llvm::ValueSymbolTable &ST); void EnumerateNamedMetadata(const llvm::Module *M); }; diff --git a/BitWriter_2_9_func/BitcodeWriter.cpp b/BitWriter_2_9_func/BitcodeWriter.cpp index a8a0750..23b3883 100644 --- a/BitWriter_2_9_func/BitcodeWriter.cpp +++ b/BitWriter_2_9_func/BitcodeWriter.cpp @@ -12,21 +12,21 @@ //===----------------------------------------------------------------------===// #include "ReaderWriter_2_9_func.h" -#include "llvm/Bitcode/BitstreamWriter.h" -#include "llvm/Bitcode/LLVMBitCodes.h" #include "ValueEnumerator.h" -#include "llvm/Constants.h" -#include "llvm/DerivedTypes.h" -#include "llvm/InlineAsm.h" -#include "llvm/Instructions.h" -#include "llvm/Module.h" -#include "llvm/Operator.h" -#include "llvm/ValueSymbolTable.h" #include "llvm/ADT/Triple.h" +#include "llvm/Bitcode/BitstreamWriter.h" +#include "llvm/Bitcode/LLVMBitCodes.h" +#include "llvm/IR/Constants.h" +#include "llvm/IR/DerivedTypes.h" +#include "llvm/IR/InlineAsm.h" +#include "llvm/IR/Instructions.h" +#include "llvm/IR/Module.h" +#include "llvm/IR/Operator.h" +#include "llvm/IR/ValueSymbolTable.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/MathExtras.h" -#include "llvm/Support/raw_ostream.h" #include "llvm/Support/Program.h" +#include "llvm/Support/raw_ostream.h" #include <cctype> #include <map> using namespace llvm; @@ -58,6 +58,7 @@ enum { FUNCTION_INST_UNREACHABLE_ABBREV }; + static unsigned GetEncodedCastOpcode(unsigned Opcode) { switch (Opcode) { default: llvm_unreachable("Unknown cast instruction!"); @@ -156,18 +157,19 @@ static void WriteStringRecord(unsigned Code, StringRef Str, // Emit information about parameter attributes. static void WriteAttributeTable(const llvm_2_9_func::ValueEnumerator &VE, BitstreamWriter &Stream) { - const std::vector<AttrListPtr> &Attrs = VE.getAttributes(); + const std::vector<AttributeSet> &Attrs = VE.getAttributes(); if (Attrs.empty()) return; Stream.EnterSubblock(bitc::PARAMATTR_BLOCK_ID, 3); SmallVector<uint64_t, 64> Record; for (unsigned i = 0, e = Attrs.size(); i != e; ++i) { - const AttrListPtr &A = Attrs[i]; + const AttributeSet &A = Attrs[i]; for (unsigned i = 0, e = A.getNumSlots(); i != e; ++i) { const AttributeWithIndex &PAWI = A.getSlot(i); Record.push_back(PAWI.Index); - + Record.push_back(Attribute::encodeLLVMAttributesForBitcode(PAWI.Attrs)); +#if 0 // FIXME: remove in LLVM 3.0 // Store the alignment in the bitcode as a 16-bit raw value instead of a // 5-bit log2 encoded value. Shift the bits above the alignment up by @@ -179,6 +181,7 @@ static void WriteAttributeTable(const llvm_2_9_func::ValueEnumerator &VE, FauxAttr |= (PAWI.Attrs.Raw() & (0x3FFull << 21)) << 11; Record.push_back(FauxAttr); +#endif } Stream.EmitRecord(bitc::PARAMATTR_CODE_ENTRY, Record); @@ -238,7 +241,7 @@ static void WriteTypeTable(const llvm_2_9_func::ValueEnumerator &VE, Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, Log2_32_Ceil(VE.getTypes().size()+1))); unsigned StructNamedAbbrev = Stream.EmitAbbrev(Abbv); - + // Abbrev for TYPE_CODE_ARRAY. Abbv = new BitCodeAbbrev(); Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_ARRAY)); @@ -386,10 +389,6 @@ static unsigned getEncodedVisibility(const GlobalValue *GV) { static void WriteModuleInfo(const Module *M, const llvm_2_9_func::ValueEnumerator &VE, BitstreamWriter &Stream) { - // Emit the list of dependent libraries for the Module. - for (Module::lib_iterator I = M->lib_begin(), E = M->lib_end(); I != E; ++I) - WriteStringRecord(bitc::MODULE_CODE_DEPLIB, *I, 0/*TODO*/, Stream); - // Emit various pieces of data attached to a module. if (!M->getTargetTriple().empty()) WriteStringRecord(bitc::MODULE_CODE_TRIPLE, M->getTargetTriple(), @@ -411,15 +410,14 @@ static void WriteModuleInfo(const Module *M, GV != E; ++GV) { MaxAlignment = std::max(MaxAlignment, GV->getAlignment()); MaxGlobalType = std::max(MaxGlobalType, VE.getTypeID(GV->getType())); - if (GV->hasSection()) { - // Give section names unique ID's. - unsigned &Entry = SectionMap[GV->getSection()]; - if (!Entry) { - WriteStringRecord(bitc::MODULE_CODE_SECTIONNAME, GV->getSection(), - 0/*TODO*/, Stream); - Entry = SectionMap.size(); - } - } + + if (!GV->hasSection()) continue; + // Give section names unique ID's. + unsigned &Entry = SectionMap[GV->getSection()]; + if (Entry != 0) continue; + WriteStringRecord(bitc::MODULE_CODE_SECTIONNAME, GV->getSection(), + 0/*TODO*/, Stream); + Entry = SectionMap.size(); } for (Module::const_iterator F = M->begin(), E = M->end(); F != E; ++F) { MaxAlignment = std::max(MaxAlignment, F->getAlignment()); @@ -651,7 +649,7 @@ static void WriteFunctionLocalMetadata(const Function &F, } WriteMDNode(N, VE, Stream, Record); } - + if (StartedMetadataBlock) Stream.ExitBlock(); } @@ -666,18 +664,18 @@ static void WriteMetadataAttachment(const Function &F, // Write metadata attachments // METADATA_ATTACHMENT - [m x [value, [n x [id, mdnode]]] SmallVector<std::pair<unsigned, MDNode*>, 4> MDs; - + for (Function::const_iterator BB = F.begin(), E = F.end(); BB != E; ++BB) for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); I != E; ++I) { MDs.clear(); I->getAllMetadataOtherThanDebugLoc(MDs); - + // If no metadata, ignore instruction. if (MDs.empty()) continue; Record.push_back(VE.getInstructionID(I)); - + for (unsigned i = 0, e = MDs.size(); i != e; ++i) { Record.push_back(MDs[i].first); Record.push_back(VE.getValueID(MDs[i].second)); @@ -696,16 +694,16 @@ static void WriteModuleMetadataStore(const Module *M, BitstreamWriter &Stream) { // METADATA_KIND - [n x [id, name]] SmallVector<StringRef, 4> Names; M->getMDKindNames(Names); - + if (Names.empty()) return; Stream.EnterSubblock(bitc::METADATA_BLOCK_ID, 3); - + for (unsigned MDKindID = 0, e = Names.size(); MDKindID != e; ++MDKindID) { Record.push_back(MDKindID); StringRef KName = Names[MDKindID]; Record.append(KName.begin(), KName.end()); - + Stream.EmitRecord(bitc::METADATA_KIND, Record, 0); Record.clear(); } @@ -861,12 +859,12 @@ static void WriteConstants(unsigned FirstVal, unsigned LastVal, if (isCStrChar6) isCStrChar6 = BitCodeAbbrevOp::isChar6(V); } - + if (isCStrChar6) AbbrevToUse = CString6Abbrev; else if (isCStr7) AbbrevToUse = CString7Abbrev; - } else if (const ConstantDataSequential *CDS = + } else if (const ConstantDataSequential *CDS = dyn_cast<ConstantDataSequential>(C)) { // We must replace ConstantDataSequential's representation with the // legacy ConstantArray/ConstantVector/ConstantStruct version. @@ -1152,7 +1150,7 @@ static void WriteInstruction(const Instruction &I, unsigned InstID, for (unsigned i = 0, e = I.getNumOperands(); i != e; ++i) Vals.push_back(VE.getValueID(I.getOperand(i))); break; - + case Instruction::Invoke: { const InvokeInst *II = cast<InvokeInst>(&I); const Value *Callee(II->getCalledValue()); @@ -1399,21 +1397,21 @@ static void WriteFunction(const Function &F, llvm_2_9_func::ValueEnumerator &VE, unsigned InstID = CstEnd; bool NeedsMetadataAttachment = false; - + DebugLoc LastDL; - + // Finally, emit all the instructions, in order. for (Function::const_iterator BB = F.begin(), E = F.end(); BB != E; ++BB) for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); I != E; ++I) { WriteInstruction(*I, InstID, VE, Stream, Vals); - + if (!I->getType()->isVoidTy()) ++InstID; - + // If the instruction has metadata, write a metadata attachment later. NeedsMetadataAttachment |= I->hasMetadataOtherThanDebugLoc(); - + // If the instruction has a debug location, emit it. DebugLoc DL = I->getDebugLoc(); if (DL.isUnknown()) { @@ -1424,14 +1422,14 @@ static void WriteFunction(const Function &F, llvm_2_9_func::ValueEnumerator &VE, } else { MDNode *Scope, *IA; DL.getScopeAndInlinedAt(Scope, IA, I->getContext()); - + Vals.push_back(DL.getLine()); Vals.push_back(DL.getCol()); Vals.push_back(Scope ? VE.getValueID(Scope)+1 : 0); Vals.push_back(IA ? VE.getValueID(IA)+1 : 0); Stream.EmitRecord(bitc::FUNC_CODE_DEBUG_LOC, Vals); Vals.clear(); - + LastDL = DL; } } diff --git a/BitWriter_2_9_func/BitcodeWriterPass.cpp b/BitWriter_2_9_func/BitcodeWriterPass.cpp index 1bd6cd0..14eb2ff 100644 --- a/BitWriter_2_9_func/BitcodeWriterPass.cpp +++ b/BitWriter_2_9_func/BitcodeWriterPass.cpp @@ -12,9 +12,9 @@ //===----------------------------------------------------------------------===// #include "ReaderWriter_2_9_func.h" -#include "llvm/Function.h" -#include "llvm/Instructions.h" -#include "llvm/Module.h" +#include "llvm/IR/Function.h" +#include "llvm/IR/Instructions.h" +#include "llvm/IR/Module.h" #include "llvm/Pass.h" using namespace llvm; diff --git a/BitWriter_2_9_func/ValueEnumerator.cpp b/BitWriter_2_9_func/ValueEnumerator.cpp index 88c406f..9bdd5e9 100644 --- a/BitWriter_2_9_func/ValueEnumerator.cpp +++ b/BitWriter_2_9_func/ValueEnumerator.cpp @@ -12,13 +12,13 @@ //===----------------------------------------------------------------------===// #include "ValueEnumerator.h" -#include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/STLExtras.h" -#include "llvm/Constants.h" -#include "llvm/DerivedTypes.h" -#include "llvm/Module.h" -#include "llvm/ValueSymbolTable.h" -#include "llvm/Instructions.h" +#include "llvm/ADT/SmallPtrSet.h" +#include "llvm/IR/Constants.h" +#include "llvm/IR/DerivedTypes.h" +#include "llvm/IR/Instructions.h" +#include "llvm/IR/Module.h" +#include "llvm/IR/ValueSymbolTable.h" #include "llvm/Support/Debug.h" #include "llvm/Support/raw_ostream.h" #include <algorithm> @@ -97,7 +97,7 @@ ValueEnumerator::ValueEnumerator(const Module *M) { I->getAllMetadataOtherThanDebugLoc(MDs); for (unsigned i = 0, e = MDs.size(); i != e; ++i) EnumerateMetadata(MDs[i].second); - + if (!I->getDebugLoc().isUnknown()) { MDNode *Scope, *IA; I->getDebugLoc().getScopeAndInlinedAt(Scope, IA, I->getContext()); @@ -374,16 +374,16 @@ void ValueEnumerator::EnumerateType(Type *Ty) { if (StructType *STy = dyn_cast<StructType>(Ty)) if (!STy->isLiteral()) *TypeID = ~0U; - + // Enumerate all of the subtypes before we enumerate this type. This ensures // that the type will be enumerated in an order that can be directly built. for (Type::subtype_iterator I = Ty->subtype_begin(), E = Ty->subtype_end(); I != E; ++I) EnumerateType(*I); - + // Refresh the TypeID pointer in case the table rehashed. TypeID = &TypeMap[Ty]; - + // Check to see if we got the pointer another way. This can happen when // enumerating recursive types that hit the base case deeper than they start. // @@ -391,10 +391,10 @@ void ValueEnumerator::EnumerateType(Type *Ty) { // then emit the definition now that all of its contents are available. if (*TypeID && *TypeID != ~0U) return; - + // Add this type now that its contents are all happily enumerated. Types.push_back(Ty); - + *TypeID = Types.size(); } @@ -402,7 +402,7 @@ void ValueEnumerator::EnumerateType(Type *Ty) { // walk through it, enumerating the types of the constant. void ValueEnumerator::EnumerateOperandType(const Value *V) { EnumerateType(V->getType()); - + if (const Constant *C = dyn_cast<Constant>(V)) { // If this constant is already enumerated, ignore it, we know its type must // be enumerated. @@ -412,11 +412,11 @@ void ValueEnumerator::EnumerateOperandType(const Value *V) { // them. for (unsigned i = 0, e = C->getNumOperands(); i != e; ++i) { const Value *Op = C->getOperand(i); - + // Don't enumerate basic blocks here, this happens as operands to // blockaddress. if (isa<BasicBlock>(Op)) continue; - + EnumerateOperandType(Op); } @@ -429,14 +429,14 @@ void ValueEnumerator::EnumerateOperandType(const Value *V) { EnumerateMetadata(V); } -void ValueEnumerator::EnumerateAttributes(const AttrListPtr &PAL) { +void ValueEnumerator::EnumerateAttributes(const AttributeSet &PAL) { if (PAL.isEmpty()) return; // null is always 0. // Do a lookup. unsigned &Entry = AttributeMap[PAL.getRawPointer()]; if (Entry == 0) { // Never saw this before, add it. - Attributes.push_back(PAL); - Entry = Attributes.size(); + Attribute.push_back(PAL); + Entry = Attribute.size(); } } @@ -493,7 +493,7 @@ void ValueEnumerator::incorporateFunction(const Function &F) { if (N->isFunctionLocal() && N->getFunction()) FnLocalMDVector.push_back(N); } - + if (!I->getType()->isVoidTy()) EnumerateValue(I); } diff --git a/BitWriter_2_9_func/ValueEnumerator.h b/BitWriter_2_9_func/ValueEnumerator.h index bfcc8da..8636358 100644 --- a/BitWriter_2_9_func/ValueEnumerator.h +++ b/BitWriter_2_9_func/ValueEnumerator.h @@ -16,7 +16,7 @@ #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/SmallVector.h" -#include "llvm/Attributes.h" +#include "llvm/IR/Attributes.h" #include <vector> namespace llvm { @@ -29,7 +29,7 @@ class Function; class Module; class MDNode; class NamedMDNode; -class AttrListPtr; +class AttributeSet; class ValueSymbolTable; class MDSymbolTable; class raw_ostream; @@ -55,15 +55,15 @@ private: ValueList MDValues; llvm::SmallVector<const llvm::MDNode *, 8> FunctionLocalMDs; ValueMapType MDValueMap; - + typedef llvm::DenseMap<void*, unsigned> AttributeMapType; AttributeMapType AttributeMap; - std::vector<llvm::AttrListPtr> Attributes; - + std::vector<llvm::AttributeSet> Attribute; + /// GlobalBasicBlockIDs - This map memoizes the basic block ID's referenced by /// the "getGlobalBasicBlockID" method. mutable llvm::DenseMap<const llvm::BasicBlock*, unsigned> GlobalBasicBlockIDs; - + typedef llvm::DenseMap<const llvm::Instruction*, unsigned> InstructionMapType; InstructionMapType InstructionMap; unsigned InstructionCount; @@ -71,7 +71,7 @@ private: /// BasicBlocks - This contains all the basic blocks for the currently /// incorporated function. Their reverse mapping is stored in ValueMap. std::vector<const llvm::BasicBlock*> BasicBlocks; - + /// When a function is incorporated, this is the size of the Values list /// before incorporation. unsigned NumModuleValues; @@ -82,7 +82,7 @@ private: unsigned FirstFuncConstantID; unsigned FirstInstID; - + ValueEnumerator(const ValueEnumerator &); // DO NOT IMPLEMENT void operator=(const ValueEnumerator &); // DO NOT IMPLEMENT public: @@ -102,7 +102,7 @@ public: unsigned getInstructionID(const llvm::Instruction *I) const; void setInstructionID(const llvm::Instruction *I); - unsigned getAttributeID(const llvm::AttrListPtr &PAL) const { + unsigned getAttributeID(const llvm::AttributeSet &PAL) const { if (PAL.isEmpty()) return 0; // Null maps to zero. AttributeMapType::const_iterator I = AttributeMap.find(PAL.getRawPointer()); assert(I != AttributeMap.end() && "Attribute not in ValueEnumerator!"); @@ -115,20 +115,20 @@ public: Start = FirstFuncConstantID; End = FirstInstID; } - + const ValueList &getValues() const { return Values; } const ValueList &getMDValues() const { return MDValues; } - const llvm::SmallVector<const llvm::MDNode *, 8> &getFunctionLocalMDValues() const { + const llvm::SmallVector<const llvm::MDNode *, 8> &getFunctionLocalMDValues() const { return FunctionLocalMDs; } const TypeList &getTypes() const { return Types; } const std::vector<const llvm::BasicBlock*> &getBasicBlocks() const { - return BasicBlocks; + return BasicBlocks; } - const std::vector<llvm::AttrListPtr> &getAttributes() const { - return Attributes; + const std::vector<llvm::AttributeSet> &getAttributes() const { + return Attribute; } - + /// getGlobalBasicBlockID - This returns the function-specific ID for the /// specified basic block. This is relatively expensive information, so it /// should only be used by rare constructs such as address-of-label. @@ -142,7 +142,7 @@ public: private: void OptimizeConstants(unsigned CstStart, unsigned CstEnd); - + void EnumerateMDNodeOperands(const llvm::MDNode *N); void EnumerateMetadata(const llvm::Value *MD); void EnumerateFunctionLocalMetadata(const llvm::MDNode *N); @@ -150,8 +150,8 @@ private: void EnumerateValue(const llvm::Value *V); void EnumerateType(llvm::Type *T); void EnumerateOperandType(const llvm::Value *V); - void EnumerateAttributes(const llvm::AttrListPtr &PAL); - + void EnumerateAttributes(const llvm::AttributeSet &PAL); + void EnumerateValueSymbolTable(const llvm::ValueSymbolTable &ST); void EnumerateNamedMetadata(const llvm::Module *M); }; diff --git a/BitWriter_3_2/BitcodeWriter.cpp b/BitWriter_3_2/BitcodeWriter.cpp index dd24512..a7f7234 100644 --- a/BitWriter_3_2/BitcodeWriter.cpp +++ b/BitWriter_3_2/BitcodeWriter.cpp @@ -12,22 +12,22 @@ //===----------------------------------------------------------------------===// #include "ReaderWriter_3_2.h" -#include "llvm/Bitcode/BitstreamWriter.h" -#include "llvm/Bitcode/LLVMBitCodes.h" #include "ValueEnumerator.h" -#include "llvm/Constants.h" -#include "llvm/DerivedTypes.h" -#include "llvm/InlineAsm.h" -#include "llvm/Instructions.h" -#include "llvm/Module.h" -#include "llvm/Operator.h" -#include "llvm/ValueSymbolTable.h" #include "llvm/ADT/Triple.h" +#include "llvm/Bitcode/BitstreamWriter.h" +#include "llvm/Bitcode/LLVMBitCodes.h" +#include "llvm/IR/Constants.h" +#include "llvm/IR/DerivedTypes.h" +#include "llvm/IR/InlineAsm.h" +#include "llvm/IR/Instructions.h" +#include "llvm/IR/Module.h" +#include "llvm/IR/Operator.h" +#include "llvm/IR/ValueSymbolTable.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/MathExtras.h" -#include "llvm/Support/raw_ostream.h" #include "llvm/Support/Program.h" +#include "llvm/Support/raw_ostream.h" #include <cctype> #include <map> using namespace llvm; @@ -63,7 +63,7 @@ enum { FUNCTION_INST_RET_VOID_ABBREV, FUNCTION_INST_RET_VAL_ABBREV, FUNCTION_INST_UNREACHABLE_ABBREV, - + // SwitchInst Magic SWITCH_INST_MAGIC = 0x4B5 // May 2012 => 1205 => Hex }; @@ -166,14 +166,14 @@ static void WriteStringRecord(unsigned Code, StringRef Str, // Emit information about parameter attributes. static void WriteAttributeTable(const llvm_3_2::ValueEnumerator &VE, BitstreamWriter &Stream) { - const std::vector<AttrListPtr> &Attrs = VE.getAttributes(); + const std::vector<AttributeSet> &Attrs = VE.getAttributes(); if (Attrs.empty()) return; Stream.EnterSubblock(bitc::PARAMATTR_BLOCK_ID, 3); SmallVector<uint64_t, 64> Record; for (unsigned i = 0, e = Attrs.size(); i != e; ++i) { - const AttrListPtr &A = Attrs[i]; + const AttributeSet &A = Attrs[i]; for (unsigned i = 0, e = A.getNumSlots(); i != e; ++i) { const AttributeWithIndex &PAWI = A.getSlot(i); Record.push_back(PAWI.Index); @@ -237,7 +237,7 @@ static void WriteTypeTable(const llvm_3_2::ValueEnumerator &VE, Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits)); unsigned StructNamedAbbrev = Stream.EmitAbbrev(Abbv); - + // Abbrev for TYPE_CODE_ARRAY. Abbv = new BitCodeAbbrev(); Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_ARRAY)); @@ -303,7 +303,7 @@ static void WriteTypeTable(const llvm_3_2::ValueEnumerator &VE, for (StructType::element_iterator I = ST->element_begin(), E = ST->element_end(); I != E; ++I) TypeVals.push_back(VE.getTypeID(*I)); - + if (ST->isLiteral()) { Code = bitc::TYPE_CODE_STRUCT_ANON; AbbrevToUse = StructAnonAbbrev; @@ -396,10 +396,6 @@ static unsigned getEncodedThreadLocalMode(const GlobalVariable *GV) { static void WriteModuleInfo(const Module *M, const llvm_3_2::ValueEnumerator &VE, BitstreamWriter &Stream) { - // Emit the list of dependent libraries for the Module. - for (Module::lib_iterator I = M->lib_begin(), E = M->lib_end(); I != E; ++I) - WriteStringRecord(bitc::MODULE_CODE_DEPLIB, *I, 0/*TODO*/, Stream); - // Emit various pieces of data attached to a module. if (!M->getTargetTriple().empty()) WriteStringRecord(bitc::MODULE_CODE_TRIPLE, M->getTargetTriple(), @@ -662,7 +658,7 @@ static void WriteFunctionLocalMetadata(const Function &F, } WriteMDNode(N, VE, Stream, Record); } - + if (StartedMetadataBlock) Stream.ExitBlock(); } @@ -677,18 +673,18 @@ static void WriteMetadataAttachment(const Function &F, // Write metadata attachments // METADATA_ATTACHMENT - [m x [value, [n x [id, mdnode]]] SmallVector<std::pair<unsigned, MDNode*>, 4> MDs; - + for (Function::const_iterator BB = F.begin(), E = F.end(); BB != E; ++BB) for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); I != E; ++I) { MDs.clear(); I->getAllMetadataOtherThanDebugLoc(MDs); - + // If no metadata, ignore instruction. if (MDs.empty()) continue; Record.push_back(VE.getInstructionID(I)); - + for (unsigned i = 0, e = MDs.size(); i != e; ++i) { Record.push_back(MDs[i].first); Record.push_back(VE.getValueID(MDs[i].second)); @@ -707,16 +703,16 @@ static void WriteModuleMetadataStore(const Module *M, BitstreamWriter &Stream) { // METADATA_KIND - [n x [id, name]] SmallVector<StringRef, 4> Names; M->getMDKindNames(Names); - + if (Names.empty()) return; Stream.EnterSubblock(bitc::METADATA_BLOCK_ID, 3); - + for (unsigned MDKindID = 0, e = Names.size(); MDKindID != e; ++MDKindID) { Record.push_back(MDKindID); StringRef KName = Names[MDKindID]; Record.append(KName.begin(), KName.end()); - + Stream.EmitRecord(bitc::METADATA_KIND, Record, 0); Record.clear(); } @@ -743,10 +739,10 @@ static void EmitAPInt(SmallVectorImpl<uint64_t> &Vals, // format it is likely that the high bits are going to be zero. // So, we only write the number of active words. unsigned NWords = Val.getActiveWords(); - + if (EmitSizeForWideNumbers) Vals.push_back(NWords); - + const uint64_t *RawWords = Val.getRawData(); for (unsigned i = 0; i != NWords; ++i) { int64_t V = RawWords[i]; @@ -885,12 +881,12 @@ static void WriteConstants(unsigned FirstVal, unsigned LastVal, if (isCStrChar6) isCStrChar6 = BitCodeAbbrevOp::isChar6(V); } - + if (isCStrChar6) AbbrevToUse = CString6Abbrev; else if (isCStr7) AbbrevToUse = CString7Abbrev; - } else if (const ConstantDataSequential *CDS = + } else if (const ConstantDataSequential *CDS = dyn_cast<ConstantDataSequential>(C)) { Code = bitc::CST_CODE_DATA; Type *EltTy = CDS->getType()->getElementType(); @@ -1159,13 +1155,13 @@ static void WriteInstruction(const Instruction &I, unsigned InstID, // Redefine Vals, since here we need to use 64 bit values // explicitly to store large APInt numbers. SmallVector<uint64_t, 128> Vals64; - + Code = bitc::FUNC_CODE_INST_SWITCH; SwitchInst &SI = cast<SwitchInst>(I); - - uint32_t SwitchRecordHeader = SI.hash() | (SWITCH_INST_MAGIC << 16); - Vals64.push_back(SwitchRecordHeader); - + + uint32_t SwitchRecordHeader = SI.hash() | (SWITCH_INST_MAGIC << 16); + Vals64.push_back(SwitchRecordHeader); + Vals64.push_back(VE.getTypeID(SI.getCondition()->getType())); Vals64.push_back(VE.getValueID(SI.getCondition())); Vals64.push_back(VE.getValueID(SI.getDefaultDest())); @@ -1174,21 +1170,21 @@ static void WriteInstruction(const Instruction &I, unsigned InstID, i != e; ++i) { IntegersSubset& CaseRanges = i.getCaseValueEx(); unsigned Code, Abbrev; // will unused. - + if (CaseRanges.isSingleNumber()) { Vals64.push_back(1/*NumItems = 1*/); Vals64.push_back(true/*IsSingleNumber = true*/); EmitAPInt(Vals64, Code, Abbrev, CaseRanges.getSingleNumber(0), true); } else { - + Vals64.push_back(CaseRanges.getNumItems()); - + if (CaseRanges.isSingleNumbersOnly()) { for (unsigned ri = 0, rn = CaseRanges.getNumItems(); ri != rn; ++ri) { - + Vals64.push_back(true/*IsSingleNumber = true*/); - + EmitAPInt(Vals64, Code, Abbrev, CaseRanges.getSingleNumber(ri), true); } @@ -1197,9 +1193,9 @@ static void WriteInstruction(const Instruction &I, unsigned InstID, ri != rn; ++ri) { IntegersSubset::Range r = CaseRanges.getItem(ri); bool IsSingleNumber = CaseRanges.isSingleNumber(ri); - + Vals64.push_back(IsSingleNumber); - + EmitAPInt(Vals64, Code, Abbrev, r.getLow(), true); if (!IsSingleNumber) EmitAPInt(Vals64, Code, Abbrev, r.getHigh(), true); @@ -1207,9 +1203,9 @@ static void WriteInstruction(const Instruction &I, unsigned InstID, } Vals64.push_back(VE.getValueID(i.getCaseSuccessor())); } - + Stream.EmitRecord(Code, Vals64, AbbrevToUse); - + // Also do expected action - clear external Vals collection: Vals.clear(); return; @@ -1221,7 +1217,7 @@ static void WriteInstruction(const Instruction &I, unsigned InstID, for (unsigned i = 0, e = I.getNumOperands(); i != e; ++i) Vals.push_back(VE.getValueID(I.getOperand(i))); break; - + case Instruction::Invoke: { const InvokeInst *II = cast<InvokeInst>(&I); const Value *Callee(II->getCalledValue()); @@ -1468,21 +1464,21 @@ static void WriteFunction(const Function &F, llvm_3_2::ValueEnumerator &VE, unsigned InstID = CstEnd; bool NeedsMetadataAttachment = false; - + DebugLoc LastDL; - + // Finally, emit all the instructions, in order. for (Function::const_iterator BB = F.begin(), E = F.end(); BB != E; ++BB) for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); I != E; ++I) { WriteInstruction(*I, InstID, VE, Stream, Vals); - + if (!I->getType()->isVoidTy()) ++InstID; - + // If the instruction has metadata, write a metadata attachment later. NeedsMetadataAttachment |= I->hasMetadataOtherThanDebugLoc(); - + // If the instruction has a debug location, emit it. DebugLoc DL = I->getDebugLoc(); if (DL.isUnknown()) { @@ -1493,14 +1489,14 @@ static void WriteFunction(const Function &F, llvm_3_2::ValueEnumerator &VE, } else { MDNode *Scope, *IA; DL.getScopeAndInlinedAt(Scope, IA, I->getContext()); - + Vals.push_back(DL.getLine()); Vals.push_back(DL.getCol()); Vals.push_back(Scope ? VE.getValueID(Scope)+1 : 0); Vals.push_back(IA ? VE.getValueID(IA)+1 : 0); Stream.EmitRecord(bitc::FUNC_CODE_DEBUG_LOC, Vals); Vals.clear(); - + LastDL = DL; } } @@ -1676,7 +1672,7 @@ static void WriteBlockInfo(const llvm_3_2::ValueEnumerator &VE, Stream.ExitBlock(); } -// Sort the Users based on the order in which the reader parses the bitcode +// Sort the Users based on the order in which the reader parses the bitcode // file. static bool bitcodereader_order(const User *lhs, const User *rhs) { // TODO: Implement. @@ -1746,9 +1742,9 @@ static void WriteModuleUseLists(const Module *M, llvm_3_2::ValueEnumerator &VE, for (Module::const_global_iterator I = M->global_begin(), E = M->global_end(); I != E; ++I) I->removeDeadConstantUsers(); - + // Write the global variables. - for (Module::const_global_iterator GI = M->global_begin(), + for (Module::const_global_iterator GI = M->global_begin(), GE = M->global_end(); GI != GE; ++GI) { WriteUseList(GI, VE, Stream); diff --git a/BitWriter_3_2/ValueEnumerator.cpp b/BitWriter_3_2/ValueEnumerator.cpp index dc7f604..556f06a 100644 --- a/BitWriter_3_2/ValueEnumerator.cpp +++ b/BitWriter_3_2/ValueEnumerator.cpp @@ -12,13 +12,13 @@ //===----------------------------------------------------------------------===// #include "ValueEnumerator.h" -#include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/STLExtras.h" -#include "llvm/Constants.h" -#include "llvm/DerivedTypes.h" -#include "llvm/Module.h" -#include "llvm/ValueSymbolTable.h" -#include "llvm/Instructions.h" +#include "llvm/ADT/SmallPtrSet.h" +#include "llvm/IR/Constants.h" +#include "llvm/IR/DerivedTypes.h" +#include "llvm/IR/Instructions.h" +#include "llvm/IR/Module.h" +#include "llvm/IR/ValueSymbolTable.h" #include "llvm/Support/Debug.h" #include "llvm/Support/raw_ostream.h" #include <algorithm> @@ -97,7 +97,7 @@ ValueEnumerator::ValueEnumerator(const Module *M) { I->getAllMetadataOtherThanDebugLoc(MDs); for (unsigned i = 0, e = MDs.size(); i != e; ++i) EnumerateMetadata(MDs[i].second); - + if (!I->getDebugLoc().isUnknown()) { MDNode *Scope, *IA; I->getDebugLoc().getScopeAndInlinedAt(Scope, IA, I->getContext()); @@ -364,16 +364,16 @@ void ValueEnumerator::EnumerateType(Type *Ty) { if (StructType *STy = dyn_cast<StructType>(Ty)) if (!STy->isLiteral()) *TypeID = ~0U; - + // Enumerate all of the subtypes before we enumerate this type. This ensures // that the type will be enumerated in an order that can be directly built. for (Type::subtype_iterator I = Ty->subtype_begin(), E = Ty->subtype_end(); I != E; ++I) EnumerateType(*I); - + // Refresh the TypeID pointer in case the table rehashed. TypeID = &TypeMap[Ty]; - + // Check to see if we got the pointer another way. This can happen when // enumerating recursive types that hit the base case deeper than they start. // @@ -381,10 +381,10 @@ void ValueEnumerator::EnumerateType(Type *Ty) { // then emit the definition now that all of its contents are available. if (*TypeID && *TypeID != ~0U) return; - + // Add this type now that its contents are all happily enumerated. Types.push_back(Ty); - + *TypeID = Types.size(); } @@ -392,7 +392,7 @@ void ValueEnumerator::EnumerateType(Type *Ty) { // walk through it, enumerating the types of the constant. void ValueEnumerator::EnumerateOperandType(const Value *V) { EnumerateType(V->getType()); - + if (const Constant *C = dyn_cast<Constant>(V)) { // If this constant is already enumerated, ignore it, we know its type must // be enumerated. @@ -402,11 +402,11 @@ void ValueEnumerator::EnumerateOperandType(const Value *V) { // them. for (unsigned i = 0, e = C->getNumOperands(); i != e; ++i) { const Value *Op = C->getOperand(i); - + // Don't enumerate basic blocks here, this happens as operands to // blockaddress. if (isa<BasicBlock>(Op)) continue; - + EnumerateOperandType(Op); } @@ -419,14 +419,14 @@ void ValueEnumerator::EnumerateOperandType(const Value *V) { EnumerateMetadata(V); } -void ValueEnumerator::EnumerateAttributes(const AttrListPtr &PAL) { +void ValueEnumerator::EnumerateAttributes(const AttributeSet &PAL) { if (PAL.isEmpty()) return; // null is always 0. // Do a lookup. unsigned &Entry = AttributeMap[PAL.getRawPointer()]; if (Entry == 0) { // Never saw this before, add it. - Attributes.push_back(PAL); - Entry = Attributes.size(); + Attribute.push_back(PAL); + Entry = Attribute.size(); } } @@ -483,7 +483,7 @@ void ValueEnumerator::incorporateFunction(const Function &F) { if (N->isFunctionLocal() && N->getFunction()) FnLocalMDVector.push_back(N); } - + if (!I->getType()->isVoidTy()) EnumerateValue(I); } diff --git a/BitWriter_3_2/ValueEnumerator.h b/BitWriter_3_2/ValueEnumerator.h index ff15527..de64da4 100644 --- a/BitWriter_3_2/ValueEnumerator.h +++ b/BitWriter_3_2/ValueEnumerator.h @@ -16,7 +16,7 @@ #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/SmallVector.h" -#include "llvm/Attributes.h" +#include "llvm/IR/Attributes.h" #include <vector> namespace llvm { @@ -29,7 +29,7 @@ class Function; class Module; class MDNode; class NamedMDNode; -class AttrListPtr; +class AttributeSet; class ValueSymbolTable; class MDSymbolTable; class raw_ostream; @@ -55,15 +55,15 @@ private: ValueList MDValues; llvm::SmallVector<const llvm::MDNode *, 8> FunctionLocalMDs; ValueMapType MDValueMap; - + typedef llvm::DenseMap<void*, unsigned> AttributeMapType; AttributeMapType AttributeMap; - std::vector<llvm::AttrListPtr> Attributes; - + std::vector<llvm::AttributeSet> Attribute; + /// GlobalBasicBlockIDs - This map memoizes the basic block ID's referenced by /// the "getGlobalBasicBlockID" method. mutable llvm::DenseMap<const llvm::BasicBlock*, unsigned> GlobalBasicBlockIDs; - + typedef llvm::DenseMap<const llvm::Instruction*, unsigned> InstructionMapType; InstructionMapType InstructionMap; unsigned InstructionCount; @@ -71,7 +71,7 @@ private: /// BasicBlocks - This contains all the basic blocks for the currently /// incorporated function. Their reverse mapping is stored in ValueMap. std::vector<const llvm::BasicBlock*> BasicBlocks; - + /// When a function is incorporated, this is the size of the Values list /// before incorporation. unsigned NumModuleValues; @@ -82,7 +82,7 @@ private: unsigned FirstFuncConstantID; unsigned FirstInstID; - + ValueEnumerator(const ValueEnumerator &); // DO NOT IMPLEMENT void operator=(const ValueEnumerator &); // DO NOT IMPLEMENT public: @@ -102,7 +102,7 @@ public: unsigned getInstructionID(const llvm::Instruction *I) const; void setInstructionID(const llvm::Instruction *I); - unsigned getAttributeID(const llvm::AttrListPtr &PAL) const { + unsigned getAttributeID(const llvm::AttributeSet &PAL) const { if (PAL.isEmpty()) return 0; // Null maps to zero. AttributeMapType::const_iterator I = AttributeMap.find(PAL.getRawPointer()); assert(I != AttributeMap.end() && "Attribute not in ValueEnumerator!"); @@ -115,20 +115,20 @@ public: Start = FirstFuncConstantID; End = FirstInstID; } - + const ValueList &getValues() const { return Values; } const ValueList &getMDValues() const { return MDValues; } - const llvm::SmallVector<const llvm::MDNode *, 8> &getFunctionLocalMDValues() const { + const llvm::SmallVector<const llvm::MDNode *, 8> &getFunctionLocalMDValues() const { return FunctionLocalMDs; } const TypeList &getTypes() const { return Types; } const std::vector<const llvm::BasicBlock*> &getBasicBlocks() const { - return BasicBlocks; + return BasicBlocks; } - const std::vector<llvm::AttrListPtr> &getAttributes() const { - return Attributes; + const std::vector<llvm::AttributeSet> &getAttributes() const { + return Attribute; } - + /// getGlobalBasicBlockID - This returns the function-specific ID for the /// specified basic block. This is relatively expensive information, so it /// should only be used by rare constructs such as address-of-label. @@ -142,7 +142,7 @@ public: private: void OptimizeConstants(unsigned CstStart, unsigned CstEnd); - + void EnumerateMDNodeOperands(const llvm::MDNode *N); void EnumerateMetadata(const llvm::Value *MD); void EnumerateFunctionLocalMetadata(const llvm::MDNode *N); @@ -150,8 +150,8 @@ private: void EnumerateValue(const llvm::Value *V); void EnumerateType(llvm::Type *T); void EnumerateOperandType(const llvm::Value *V); - void EnumerateAttributes(const llvm::AttrListPtr &PAL); - + void EnumerateAttributes(const llvm::AttributeSet &PAL); + void EnumerateValueSymbolTable(const llvm::ValueSymbolTable &ST); void EnumerateNamedMetadata(const llvm::Module *M); }; diff --git a/RSCCOptions.td b/RSCCOptions.td index caeba16..76bb497 100644 --- a/RSCCOptions.td +++ b/RSCCOptions.td @@ -27,69 +27,69 @@ include "clang/Driver/OptParser.td" // Target Options //===----------------------------------------------------------------------===// -def target_api : Separate<"-target-api">, +def target_api : Separate<["-"], "target-api">, HelpText<"Specify target API level (e.g. 14)">; -def target_api_EQ : Joined<"-target-api=">, Alias<target_api>; +def target_api_EQ : Joined<["-"], "target-api=">, Alias<target_api>; //===----------------------------------------------------------------------===// // Header Search Options //===----------------------------------------------------------------------===// -def I : JoinedOrSeparate<"-I">, MetaVarName<"<directory>">, +def I : JoinedOrSeparate<["-"], "I">, MetaVarName<"<directory>">, HelpText<"Add directory to include search path">; -def _I : Separate<"include-path">, MetaVarName<"<directory>">, Alias<I>; +def _I : Separate<["-", "--"], "include-path">, MetaVarName<"<directory>">, Alias<I>; //===----------------------------------------------------------------------===// // Frontend Options //===----------------------------------------------------------------------===// -def o : Separate<"-o">, MetaVarName<"<directory>">, +def o : Separate<["-"], "o">, MetaVarName<"<directory>">, HelpText<"Specify output directory">; def Output_Type_Group : OptionGroup<"<output type group>">; let Group = Output_Type_Group in { -def emit_asm : Flag<"-emit-asm">, +def emit_asm : Flag<["-"], "emit-asm">, HelpText<"Emit target assembly files">; -def _emit_asm : Flag<"-S">, Alias<emit_asm>; -def emit_llvm : Flag<"-emit-llvm">, +def _emit_asm : Flag<["-"], "S">, Alias<emit_asm>; +def emit_llvm : Flag<["-"], "emit-llvm">, HelpText<"Build ASTs then convert to LLVM, emit .ll file">; -def emit_bc : Flag<"-emit-bc">, +def emit_bc : Flag<["-"], "emit-bc">, HelpText<"Build ASTs then convert to LLVM, emit .bc file">; -def emit_nothing : Flag<"-emit-nothing">, +def emit_nothing : Flag<["-"], "emit-nothing">, HelpText<"Build ASTs then convert to LLVM, but emit nothing">; } -def emit_g : Flag<"-g">, +def emit_g : Flag<["-"], "g">, HelpText<"Emit LLVM Debug Metadata">; -def optimization_level : Separate<"-O">, MetaVarName<"<optimization-level>">, +def optimization_level : Separate<["-"], "O">, MetaVarName<"<optimization-level>">, HelpText<"<optimization-level> can be one of '0' or '3' (default)">; -def allow_rs_prefix : Flag<"-allow-rs-prefix">, +def allow_rs_prefix : Flag<["-"], "allow-rs-prefix">, HelpText<"Allow user-defined function prefixed with 'rs'">; -def java_reflection_path_base : Separate<"-java-reflection-path-base">, +def java_reflection_path_base : Separate<["-"], "java-reflection-path-base">, MetaVarName<"<directory>">, HelpText<"Base directory for output reflected Java files">; -def _java_reflection_path_base : Separate<"-p">, +def _java_reflection_path_base : Separate<["-"], "p">, Alias<java_reflection_path_base>; -def java_reflection_package_name : Separate<"-java-reflection-package-name">, +def java_reflection_package_name : Separate<["-"], "java-reflection-package-name">, HelpText<"Specify the package name that reflected Java files belong to">; -def _java_reflection_package_name : Separate<"-j">, +def _java_reflection_package_name : Separate<["-"], "j">, Alias<java_reflection_package_name>; -def bitcode_storage : Separate<"-bitcode-storage">, +def bitcode_storage : Separate<["-"], "bitcode-storage">, MetaVarName<"<value>">, HelpText<"<value> should be 'ar' or 'jc'">; -def _bitcode_storage : Separate<"-s">, Alias<bitcode_storage>; +def _bitcode_storage : Separate<["-"], "s">, Alias<bitcode_storage>; -def rs_package_name : Separate<"-rs-package-name">, +def rs_package_name : Separate<["-"], "rs-package-name">, MetaVarName<"<package_name>">, HelpText<"package name for referencing RS classes">; -def rs_package_name_EQ : Joined<"-rs-package-name=">, Alias<rs_package_name>; +def rs_package_name_EQ : Joined<["-"], "rs-package-name=">, Alias<rs_package_name>; -def W : Joined<"-W">; -def w : Flag<"-w">, HelpText<"Suppress all warnings">; +def W : Joined<["-"], "W">; +def w : Flag<["-"], "w">, HelpText<"Suppress all warnings">; //===----------------------------------------------------------------------===// // Dependency Output Options @@ -98,39 +98,39 @@ def w : Flag<"-w">, HelpText<"Suppress all warnings">; def M_Group : OptionGroup<"M group>">; let Group = M_Group in { - def MD : Flag<"-MD">; + def MD : Flag<["-"], "MD">; - def M : Flag<"-M">; - def emit_dep : Flag<"-emit-dep">, Alias<M>; + def M : Flag<["-"], "M">; + def emit_dep : Flag<["-"], "emit-dep">, Alias<M>; } -def output_dep_dir : Separate<"-output-dep-dir">, MetaVarName<"<directory>">, +def output_dep_dir : Separate<["-"], "output-dep-dir">, MetaVarName<"<directory>">, HelpText<"Specify output directory for dependencies output">; -def _output_dep_dir : Separate<"-d">, Alias<output_dep_dir>; +def _output_dep_dir : Separate<["-"], "d">, Alias<output_dep_dir>; -def additional_dep_target: Separate<"-additional-dep-target">, +def additional_dep_target: Separate<["-"], "additional-dep-target">, HelpText<"Additional targets to show up in dependencies output">; -def _additional_dep_target : Separate<"-a">, Alias<additional_dep_target>; +def _additional_dep_target : Separate<["-"], "a">, Alias<additional_dep_target>; //===----------------------------------------------------------------------===// // Reflection Options //===----------------------------------------------------------------------===// -def reflect_cpp : Flag<"-reflect-c++">, +def reflect_cpp : Flag<["-"], "reflect-c++">, HelpText<"Reflect C++ classes">; //===----------------------------------------------------------------------===// // Misc Options //===----------------------------------------------------------------------===// -def help : Flag<"-help">, +def help : Flag<["-"], "help">, HelpText<"Print this help text">; -def _help : Flag<"--help">, Alias<help>; -def __help : Flag<"-h">, Alias<help>; +def _help : Flag<["--"], "help">, Alias<help>; +def __help : Flag<["-"], "h">, Alias<help>; -def version : Flag<"-version">, +def version : Flag<["-"], "version">, HelpText<"Print the assembler version">; -def _version : Flag<"--version">, Alias<version>; +def _version : Flag<["--"], "version">, Alias<version>; // Compatible with old slang -def no_link : Flag<"-no-link">; // currently no effect +def no_link : Flag<["-"], "no-link">; // currently no effect diff --git a/llvm-rs-cc.cpp b/llvm-rs-cc.cpp index 1e60c6e..cc77b7a 100644 --- a/llvm-rs-cc.cpp +++ b/llvm-rs-cc.cpp @@ -27,7 +27,7 @@ #include "clang/Driver/Option.h" #include "clang/Driver/OptTable.h" -#include "clang/Frontend/DiagnosticOptions.h" +#include "clang/Basic/DiagnosticOptions.h" #include "clang/Frontend/TextDiagnosticPrinter.h" #include "clang/Frontend/Utils.h" @@ -75,19 +75,31 @@ static void ExpandArgv(int argc, const char **argv, enum { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(NAME, ID, KIND, GROUP, ALIAS, FLAGS, PARAM, \ +#define PREFIX(NAME, VALUE) +#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, FLAGS, PARAM, \ HELPTEXT, METAVAR) OPT_##ID, #include "RSCCOptions.inc" LastOption #undef OPTION +#undef PREFIX }; +#define PREFIX(NAME, VALUE) const char *const NAME[] = VALUE; +#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, FLAGS, PARAM, \ + HELPTEXT, METAVAR) +#include "RSCCOptions.inc" +#undef OPTION +#undef PREFIX + static const OptTable::Info RSCCInfoTable[] = { -#define OPTION(NAME, ID, KIND, GROUP, ALIAS, FLAGS, PARAM, \ +#define PREFIX(NAME, VALUE) +#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, FLAGS, PARAM, \ HELPTEXT, METAVAR) \ - { NAME, HELPTEXT, METAVAR, Option::KIND##Class, PARAM, FLAGS, \ - OPT_##GROUP, OPT_##ALIAS }, + { PREFIX, NAME, HELPTEXT, METAVAR, OPT_##ID, Option::KIND##Class, PARAM, \ + FLAGS, OPT_##GROUP, OPT_##ALIAS }, #include "RSCCOptions.inc" +#undef OPTION +#undef PREFIX }; class RSCCOptTable : public OptTable { @@ -202,7 +214,7 @@ static void ParseArguments(llvm::SmallVectorImpl<const char*> &ArgVector, it != ie; ++it) { const Arg *A = *it; if (A->getOption().getKind() == Option::InputClass) - Inputs.push_back(A->getValue(*Args)); + Inputs.push_back(A->getValue()); } Opts.mIncludePaths = Args->getAllArgValues(OPT_I); @@ -403,7 +415,9 @@ int main(int argc, const char **argv) { llvm::IntrusiveRefCntPtr<clang::DiagnosticIDs> DiagIDs( new clang::DiagnosticIDs()); - clang::DiagnosticsEngine DiagEngine(DiagIDs, DiagClient, true); + llvm::IntrusiveRefCntPtr<clang::DiagnosticOptions> DiagOpts( + new clang::DiagnosticOptions()); + clang::DiagnosticsEngine DiagEngine(DiagIDs, &*DiagOpts, DiagClient, true); slang::Slang::GlobalInitialization(); diff --git a/llvm-rs-link.cpp b/llvm-rs-link.cpp index 8dec206..cf77481 100644 --- a/llvm-rs-link.cpp +++ b/llvm-rs-link.cpp @@ -24,9 +24,9 @@ #include "llvm/Bitcode/ReaderWriter.h" #include "llvm/Linker.h" -#include "llvm/LLVMContext.h" -#include "llvm/Metadata.h" -#include "llvm/Module.h" +#include "llvm/IR/LLVMContext.h" +#include "llvm/IR/Metadata.h" +#include "llvm/IR/Module.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/ManagedStatic.h" @@ -39,7 +39,7 @@ #include "llvm/Transforms/IPO.h" #include "llvm/Transforms/IPO/PassManagerBuilder.h" -#include "llvm/Target/TargetData.h" +#include "llvm/IR/DataLayout.h" #include "slang_rs_metadata.h" @@ -220,8 +220,8 @@ bool OptimizeModule(Module *M) { const std::string &ModuleDataLayout = M->getDataLayout(); if (!ModuleDataLayout.empty()) - if (llvm::TargetData *TD = new llvm::TargetData(ModuleDataLayout)) - Passes.add(TD); + if (llvm::DataLayout *DL = new llvm::DataLayout(ModuleDataLayout)) + Passes.add(DL); // Some symbols must not be internalized std::vector<const char *> ExportList; @@ -25,6 +25,7 @@ #include "clang/AST/ASTContext.h" #include "clang/Basic/DiagnosticIDs.h" +#include "clang/Basic/DiagnosticOptions.h" #include "clang/Basic/FileManager.h" #include "clang/Basic/FileSystemOptions.h" #include "clang/Basic/LangOptions.h" @@ -33,14 +34,15 @@ #include "clang/Basic/TargetOptions.h" #include "clang/Frontend/CodeGenOptions.h" -#include "clang/Frontend/DiagnosticOptions.h" #include "clang/Frontend/DependencyOutputOptions.h" #include "clang/Frontend/FrontendDiagnostic.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/Parse/ParseAST.h" @@ -84,7 +86,7 @@ struct ForceSlangLinking { // llvm-rs-cc need this. new clang::TextDiagnosticPrinter(llvm::errs(), - clang::DiagnosticOptions()); + new clang::DiagnosticOptions()); } } ForceSlangLinking; @@ -174,18 +176,18 @@ void Slang::LLVMErrorHandler(void *UserData, const std::string &Message) { void Slang::createTarget(const std::string &Triple, const std::string &CPU, const std::vector<std::string> &Features) { if (!Triple.empty()) - mTargetOpts.Triple = Triple; + mTargetOpts->Triple = Triple; else - mTargetOpts.Triple = DEFAULT_TARGET_TRIPLE_STRING; + mTargetOpts->Triple = DEFAULT_TARGET_TRIPLE_STRING; if (!CPU.empty()) - mTargetOpts.CPU = CPU; + mTargetOpts->CPU = CPU; if (!Features.empty()) - mTargetOpts.Features = Features; + mTargetOpts->FeaturesAsWritten = Features; mTarget.reset(clang::TargetInfo::CreateTargetInfo(*mDiagEngine, - mTargetOpts)); + mTargetOpts.getPtr())); } void Slang::createFileManager() { @@ -199,12 +201,18 @@ void Slang::createSourceManager() { void Slang::createPreprocessor() { // Default only search header file in current dir - clang::HeaderSearch *HeaderInfo = new clang::HeaderSearch(*mFileMgr, + llvm::IntrusiveRefCntPtr<clang::HeaderSearchOptions> HSOpts = + new clang::HeaderSearchOptions(); + clang::HeaderSearch *HeaderInfo = new clang::HeaderSearch(HSOpts, + *mFileMgr, *mDiagEngine, LangOpts, mTarget.get()); - mPP.reset(new clang::Preprocessor(*mDiagEngine, + llvm::IntrusiveRefCntPtr<clang::PreprocessorOptions> PPOpts = + new clang::PreprocessorOptions(); + mPP.reset(new clang::Preprocessor(PPOpts, + *mDiagEngine, LangOpts, mTarget.get(), *mSourceMgr, @@ -249,11 +257,12 @@ void Slang::createASTContext() { clang::ASTConsumer * Slang::createBackend(const clang::CodeGenOptions& CodeGenOpts, llvm::raw_ostream *OS, OutputType OT) { - return new Backend(mDiagEngine, CodeGenOpts, mTargetOpts, + return new Backend(mDiagEngine, CodeGenOpts, getTargetOptions(), &mPragmas, OS, OT); } Slang::Slang() : mInitialized(false), mDiagClient(NULL), mOT(OT_Default) { + mTargetOpts = new clang::TargetOptions(); GlobalInitialization(); } @@ -277,12 +286,13 @@ void Slang::init(const std::string &Triple, const std::string &CPU, mInitialized = true; } -clang::Module *Slang::loadModule(clang::SourceLocation ImportLoc, - clang::ModuleIdPath Path, - clang::Module::NameVisibilityKind Visibility, - bool IsInclusionDirective) { +clang::ModuleLoadResult Slang::loadModule( + clang::SourceLocation ImportLoc, + clang::ModuleIdPath Path, + clang::Module::NameVisibilityKind Visibility, + bool IsInclusionDirective) { slangAssert(0 && "Not implemented"); - return NULL; + return clang::ModuleLoadResult(); } bool Slang::setInputSource(llvm::StringRef InputFile, @@ -454,9 +464,9 @@ int Slang::compile() { void Slang::setDebugMetadataEmission(bool EmitDebug) { if (EmitDebug) - CodeGenOpts.DebugInfo = clang::CodeGenOptions::FullDebugInfo; + CodeGenOpts.setDebugInfo(clang::CodeGenOptions::FullDebugInfo); else - CodeGenOpts.DebugInfo = clang::CodeGenOptions::NoDebugInfo; + CodeGenOpts.setDebugInfo(clang::CodeGenOptions::NoDebugInfo); } void Slang::setOptimizationLevel(llvm::CodeGenOpt::Level OptimizationLevel) { @@ -21,10 +21,13 @@ #include <string> #include <vector> +// Terrible workaround for TargetOptions.h not using llvm::RefCountedBase! +#include "llvm/ADT/IntrusiveRefCntPtr.h" +using llvm::RefCountedBase; + #include "clang/Basic/TargetOptions.h" #include "clang/Lex/ModuleLoader.h" -#include "llvm/ADT/IntrusiveRefCntPtr.h" #include "llvm/ADT/OwningPtr.h" #include "llvm/ADT/StringRef.h" @@ -50,7 +53,6 @@ namespace clang { class Preprocessor; class SourceManager; class TargetInfo; - class TargetOptions; } // namespace clang namespace slang { @@ -89,7 +91,7 @@ class Slang : public clang::ModuleLoader { DiagnosticBuffer *mDiagClient; // The target being compiled for - clang::TargetOptions mTargetOpts; + llvm::IntrusiveRefCntPtr<clang::TargetOptions> mTargetOpts; llvm::OwningPtr<clang::TargetInfo> mTarget; void createTarget(std::string const &Triple, std::string const &CPU, std::vector<std::string> const &Features); @@ -150,7 +152,7 @@ class Slang : public clang::ModuleLoader { clang::ASTContext &getASTContext() { return *mASTContext; } inline clang::TargetOptions const &getTargetOptions() const - { return mTargetOpts; } + { return *mTargetOpts.getPtr(); } virtual void initDiagnostic() {} virtual void initPreprocessor() {} @@ -173,10 +175,11 @@ class Slang : public clang::ModuleLoader { clang::DiagnosticsEngine *DiagEngine, DiagnosticBuffer *DiagClient); - virtual clang::Module *loadModule(clang::SourceLocation ImportLoc, - clang::ModuleIdPath Path, - clang::Module::NameVisibilityKind VK, - bool IsInclusionDirective); + virtual clang::ModuleLoadResult loadModule( + clang::SourceLocation ImportLoc, + clang::ModuleIdPath Path, + clang::Module::NameVisibilityKind VK, + bool IsInclusionDirective); bool setInputSource(llvm::StringRef InputFile, const char *Text, size_t TextLength); diff --git a/slang_backend.cpp b/slang_backend.cpp index 58593ed..1e692ee 100644 --- a/slang_backend.cpp +++ b/slang_backend.cpp @@ -41,13 +41,13 @@ #include "llvm/CodeGen/RegAllocRegistry.h" #include "llvm/CodeGen/SchedulerRegistry.h" -#include "llvm/LLVMContext.h" -#include "llvm/Module.h" -#include "llvm/Metadata.h" +#include "llvm/IR/LLVMContext.h" +#include "llvm/IR/Module.h" +#include "llvm/IR/Metadata.h" #include "llvm/Transforms/IPO/PassManagerBuilder.h" -#include "llvm/Target/TargetData.h" +#include "llvm/IR/DataLayout.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetOptions.h" #include "llvm/Support/TargetRegistry.h" @@ -64,7 +64,7 @@ namespace slang { void Backend::CreateFunctionPasses() { if (!mPerFunctionPasses) { mPerFunctionPasses = new llvm::FunctionPassManager(mpModule); - mPerFunctionPasses->add(new llvm::TargetData(mpModule)); + mPerFunctionPasses->add(new llvm::DataLayout(mpModule)); llvm::PassManagerBuilder PMBuilder; PMBuilder.OptLevel = mCodeGenOpts.OptimizationLevel; @@ -76,7 +76,7 @@ void Backend::CreateFunctionPasses() { void Backend::CreateModulePasses() { if (!mPerModulePasses) { mPerModulePasses = new llvm::PassManager(); - mPerModulePasses->add(new llvm::TargetData(mpModule)); + mPerModulePasses->add(new llvm::DataLayout(mpModule)); llvm::PassManagerBuilder PMBuilder; PMBuilder.OptLevel = mCodeGenOpts.OptimizationLevel; @@ -109,7 +109,7 @@ bool Backend::CreateCodeGenPasses() { return true; } else { mCodeGenPasses = new llvm::FunctionPassManager(mpModule); - mCodeGenPasses->add(new llvm::TargetData(mpModule)); + mCodeGenPasses->add(new llvm::DataLayout(mpModule)); } // Create the TargetMachine for generating code. diff --git a/slang_rs_backend.cpp b/slang_rs_backend.cpp index c643908..3fb9f1a 100644 --- a/slang_rs_backend.cpp +++ b/slang_rs_backend.cpp @@ -25,13 +25,13 @@ #include "llvm/ADT/Twine.h" #include "llvm/ADT/StringExtras.h" -#include "llvm/Constant.h" -#include "llvm/Constants.h" -#include "llvm/DerivedTypes.h" -#include "llvm/Function.h" -#include "llvm/IRBuilder.h" -#include "llvm/Metadata.h" -#include "llvm/Module.h" +#include "llvm/IR/Constant.h" +#include "llvm/IR/Constants.h" +#include "llvm/IR/DerivedTypes.h" +#include "llvm/IR/Function.h" +#include "llvm/IR/IRBuilder.h" +#include "llvm/IR/Metadata.h" +#include "llvm/IR/Module.h" #include "llvm/Support/DebugLoc.h" diff --git a/slang_rs_context.cpp b/slang_rs_context.cpp index caa3955..7bf195d 100644 --- a/slang_rs_context.cpp +++ b/slang_rs_context.cpp @@ -27,8 +27,8 @@ #include "clang/Basic/Linkage.h" #include "clang/Basic/TargetInfo.h" -#include "llvm/LLVMContext.h" -#include "llvm/Target/TargetData.h" +#include "llvm/IR/LLVMContext.h" +#include "llvm/IR/DataLayout.h" #include "slang.h" #include "slang_assert.h" @@ -54,7 +54,7 @@ RSContext::RSContext(clang::Preprocessor &PP, mPragmas(Pragmas), mTargetAPI(TargetAPI), mGeneratedFileNames(GeneratedFileNames), - mTargetData(NULL), + mDataLayout(NULL), mLLVMContext(llvm::getGlobalContext()), mLicenseNote(NULL), mRSPackageName("android.renderscript"), @@ -78,7 +78,7 @@ RSContext::RSContext(clang::Preprocessor &PP, PP.AddPragmaHandler(RSPragmaHandler::CreatePragmaVersionHandler(this)); // Prepare target data - mTargetData = new llvm::TargetData(Target.getTargetDescription()); + mDataLayout = new llvm::DataLayout(Target.getTargetDescription()); return; } @@ -153,7 +153,7 @@ bool RSContext::processExportType(const llvm::StringRef &Name) { clang::DeclContext::lookup_const_result R = TUDecl->lookup(II); RSExportType *ET = NULL; - for (clang::DeclContext::lookup_const_iterator I = R.first, E = R.second; + for (clang::DeclContext::lookup_const_iterator I = R.begin(), E = R.end(); I != E; I++) { clang::NamedDecl *const ND = *I; @@ -315,7 +315,7 @@ bool RSContext::reflectToJava(const std::string &OutputPathBase, RSContext::~RSContext() { delete mLicenseNote; - delete mTargetData; + delete mDataLayout; for (ExportableList::iterator I = mExportables.begin(), E = mExportables.end(); I != E; diff --git a/slang_rs_context.h b/slang_rs_context.h index 2463ad9..0689973 100644 --- a/slang_rs_context.h +++ b/slang_rs_context.h @@ -33,7 +33,7 @@ namespace llvm { class LLVMContext; - class TargetData; + class DataLayout; } // namespace llvm namespace clang { @@ -71,7 +71,7 @@ class RSContext { unsigned int mTargetAPI; std::vector<std::string> *mGeneratedFileNames; - llvm::TargetData *mTargetData; + llvm::DataLayout *mDataLayout; llvm::LLVMContext &mLLVMContext; ExportableList mExportables; @@ -111,7 +111,7 @@ class RSContext { inline clang::MangleContext &getMangleContext() const { return *mMangleCtx; } - inline const llvm::TargetData *getTargetData() const { return mTargetData; } + inline const llvm::DataLayout *getDataLayout() const { return mDataLayout; } inline llvm::LLVMContext &getLLVMContext() const { return mLLVMContext; } inline const clang::SourceManager *getSourceManager() const { return &mPP.getSourceManager(); diff --git a/slang_rs_export_foreach.cpp b/slang_rs_export_foreach.cpp index 8462099..b2e82af 100644 --- a/slang_rs_export_foreach.cpp +++ b/slang_rs_export_foreach.cpp @@ -19,11 +19,11 @@ #include <string> #include "clang/AST/ASTContext.h" +#include "clang/AST/Attr.h" #include "clang/AST/Decl.h" #include "clang/AST/TypeLoc.h" -#include "llvm/DerivedTypes.h" -#include "llvm/Target/TargetData.h" +#include "llvm/IR/DerivedTypes.h" #include "slang_assert.h" #include "slang_rs_context.h" diff --git a/slang_rs_export_func.cpp b/slang_rs_export_func.cpp index e03ccc6..8c9cd9b 100644 --- a/slang_rs_export_func.cpp +++ b/slang_rs_export_func.cpp @@ -21,8 +21,8 @@ #include "clang/AST/ASTContext.h" #include "clang/AST/Decl.h" -#include "llvm/DerivedTypes.h" -#include "llvm/Target/TargetData.h" +#include "llvm/IR/DataLayout.h" +#include "llvm/IR/DerivedTypes.h" #include "slang_assert.h" #include "slang_rs_context.h" @@ -141,7 +141,7 @@ RSExportFunc::checkParameterPacketType(llvm::StructType *ParamTy) const { return false; const llvm::StructLayout *ParamTySL = - getRSContext()->getTargetData()->getStructLayout(ParamTy); + getRSContext()->getDataLayout()->getStructLayout(ParamTy); unsigned Index = 0; for (RSExportRecordType::const_field_iterator FI = ERT->fields_begin(), @@ -164,7 +164,7 @@ RSExportFunc::checkParameterPacketType(llvm::StructType *ParamTy) const { // Check size size_t T1Size = RSExportType::GetTypeAllocSize(F->getType()); - size_t T2Size = getRSContext()->getTargetData()->getTypeAllocSize(T2); + size_t T2Size = getRSContext()->getDataLayout()->getTypeAllocSize(T2); if (T1Size != T2Size) return false; diff --git a/slang_rs_export_type.cpp b/slang_rs_export_type.cpp index ba37860..e7e5b0d 100644 --- a/slang_rs_export_type.cpp +++ b/slang_rs_export_type.cpp @@ -20,15 +20,13 @@ #include <vector> #include "clang/AST/ASTContext.h" +#include "clang/AST/Attr.h" #include "clang/AST/RecordLayout.h" #include "llvm/ADT/StringExtras.h" - -#include "llvm/DerivedTypes.h" - -#include "llvm/Target/TargetData.h" - -#include "llvm/Type.h" +#include "llvm/IR/DataLayout.h" +#include "llvm/IR/DerivedTypes.h" +#include "llvm/IR/Type.h" #include "slang_assert.h" #include "slang_rs_context.h" @@ -798,7 +796,7 @@ RSExportType *RSExportType::CreateFromDecl(RSContext *Context, } size_t RSExportType::GetTypeStoreSize(const RSExportType *ET) { - return ET->getRSContext()->getTargetData()->getTypeStoreSize( + return ET->getRSContext()->getDataLayout()->getTypeStoreSize( ET->getLLVMType()); } @@ -806,7 +804,7 @@ size_t RSExportType::GetTypeAllocSize(const RSExportType *ET) { if (ET->getClass() == RSExportType::ExportClassRecord) return static_cast<const RSExportRecordType*>(ET)->getAllocSize(); else - return ET->getRSContext()->getTargetData()->getTypeAllocSize( + return ET->getRSContext()->getDataLayout()->getTypeAllocSize( ET->getLLVMType()); } diff --git a/slang_rs_object_ref_count.cpp b/slang_rs_object_ref_count.cpp index 246ae83..7506b53 100644 --- a/slang_rs_object_ref_count.cpp +++ b/slang_rs_object_ref_count.cpp @@ -106,11 +106,8 @@ static clang::CompoundStmt* BuildCompoundStmt(clang::ASTContext &C, } slangAssert(CompoundStmtCount == NewStmtCount); - clang::CompoundStmt *CS = new(C) clang::CompoundStmt(C, - CompoundStmtList, - CompoundStmtCount, - Loc, - Loc); + clang::CompoundStmt *CS = new(C) clang::CompoundStmt( + C, llvm::makeArrayRef(CompoundStmtList, CompoundStmtCount), Loc, Loc); delete [] CompoundStmtList; @@ -535,7 +532,8 @@ static clang::Stmt *ClearArrayRSObject( C.IntTy, clang::VK_RValue, clang::OK_Ordinary, - Loc); + Loc, + false); // Cond -> "rsIntIter < NumArrayElements" clang::Expr *NumArrayElementsExpr = clang::IntegerLiteral::Create(C, @@ -548,7 +546,8 @@ static clang::Stmt *ClearArrayRSObject( C.IntTy, clang::VK_RValue, clang::OK_Ordinary, - Loc); + Loc, + false); // Inc -> "rsIntIter++" clang::UnaryOperator *Inc = @@ -606,8 +605,8 @@ static clang::Stmt *ClearArrayRSObject( StmtArray[StmtCtr++] = DestructorLoop; slangAssert(StmtCtr == 2); - clang::CompoundStmt *CS = - new(C) clang::CompoundStmt(C, StmtArray, StmtCtr, Loc, Loc); + clang::CompoundStmt *CS = new(C) clang::CompoundStmt( + C, llvm::makeArrayRef(StmtArray, StmtCtr), Loc, Loc); return CS; } @@ -773,8 +772,8 @@ static clang::Stmt *ClearStructRSObject( } slangAssert(StmtCount > 0); - clang::CompoundStmt *CS = - new(C) clang::CompoundStmt(C, StmtArray, StmtCount, Loc, Loc); + clang::CompoundStmt *CS = new(C) clang::CompoundStmt( + C, llvm::makeArrayRef(StmtArray, StmtCount), Loc, Loc); delete [] StmtArray; @@ -1100,11 +1099,12 @@ static clang::Stmt *CreateStructRSSetObject(clang::ASTContext &C, // the proper RS object reference counts). clang::BinaryOperator *CopyStruct = new(C) clang::BinaryOperator(LHS, RHS, clang::BO_Assign, QT, - clang::VK_RValue, clang::OK_Ordinary, Loc); + clang::VK_RValue, clang::OK_Ordinary, Loc, + false); StmtArray[StmtCount++] = CopyStruct; - clang::CompoundStmt *CS = - new(C) clang::CompoundStmt(C, StmtArray, StmtCount, Loc, Loc); + clang::CompoundStmt *CS = new(C) clang::CompoundStmt( + C, llvm::makeArrayRef(StmtArray, StmtCount), Loc, Loc); delete [] StmtArray; diff --git a/slang_rs_pragma_handler.cpp b/slang_rs_pragma_handler.cpp index 597136d..7d44495 100644 --- a/slang_rs_pragma_handler.cpp +++ b/slang_rs_pragma_handler.cpp @@ -292,8 +292,10 @@ void RSPragmaHandler::handleIntegerParamPragma( PP.LexUnexpandedToken(PragmaToken); if (PragmaToken.is(clang::tok::numeric_constant)) { - clang::NumericLiteralParser NumericLiteral(PragmaToken.getLiteralData(), - PragmaToken.getLiteralData() + PragmaToken.getLength(), + llvm::SmallString<128> SpellingBuffer; + SpellingBuffer.resize(PragmaToken.getLength() + 1); + llvm::StringRef TokSpelling = PP.getSpelling(PragmaToken, SpellingBuffer); + clang::NumericLiteralParser NumericLiteral(TokSpelling, PragmaToken.getLocation(), PP); if (NumericLiteral.hadError) { // Diagnostics will be generated automatically |