diff options
author | rdivacky <rdivacky@FreeBSD.org> | 2010-03-10 17:45:15 +0000 |
---|---|---|
committer | rdivacky <rdivacky@FreeBSD.org> | 2010-03-10 17:45:15 +0000 |
commit | 9e2446b38c94db61b2416c28fee415c03663c11c (patch) | |
tree | 231646bba785a129b3a2d409badb74e7ccd1594c /include/llvm | |
parent | 9bef28eb9e224d641ce31a423e215ccf82bf1d43 (diff) | |
download | FreeBSD-src-9e2446b38c94db61b2416c28fee415c03663c11c.zip FreeBSD-src-9e2446b38c94db61b2416c28fee415c03663c11c.tar.gz |
Update LLVM to r98164.
Diffstat (limited to 'include/llvm')
-rw-r--r-- | include/llvm/ADT/APFloat.h | 2 | ||||
-rw-r--r-- | include/llvm/ADT/DenseMap.h | 7 | ||||
-rw-r--r-- | include/llvm/ADT/DenseSet.h | 16 | ||||
-rw-r--r-- | include/llvm/Analysis/DebugInfo.h | 190 | ||||
-rw-r--r-- | include/llvm/Analysis/InlineCost.h | 5 | ||||
-rw-r--r-- | include/llvm/Analysis/PostDominators.h | 4 | ||||
-rw-r--r-- | include/llvm/CodeGen/AsmPrinter.h | 8 | ||||
-rw-r--r-- | include/llvm/CodeGen/DwarfWriter.h | 9 | ||||
-rw-r--r-- | include/llvm/CodeGen/MachineModuleInfo.h | 25 | ||||
-rw-r--r-- | include/llvm/MC/MCAsmInfo.h | 21 | ||||
-rw-r--r-- | include/llvm/MC/MCContext.h | 13 | ||||
-rw-r--r-- | include/llvm/MC/MCExpr.h | 4 | ||||
-rw-r--r-- | include/llvm/MC/MCStreamer.h | 5 | ||||
-rw-r--r-- | include/llvm/Metadata.h | 6 | ||||
-rw-r--r-- | include/llvm/Support/Dwarf.h | 3 | ||||
-rw-r--r-- | include/llvm/Target/TargetLowering.h | 4 | ||||
-rw-r--r-- | include/llvm/Target/TargetLoweringObjectFile.h | 23 | ||||
-rw-r--r-- | include/llvm/Target/TargetRegisterInfo.h | 3 | ||||
-rw-r--r-- | include/llvm/Transforms/IPO/InlinerPass.h | 4 |
19 files changed, 210 insertions, 142 deletions
diff --git a/include/llvm/ADT/APFloat.h b/include/llvm/ADT/APFloat.h index 861b7b9..3cccc81 100644 --- a/include/llvm/ADT/APFloat.h +++ b/include/llvm/ADT/APFloat.h @@ -344,7 +344,7 @@ namespace llvm { /// 1.01E-2 4 1 1.01E-2 void toString(SmallVectorImpl<char> &Str, unsigned FormatPrecision = 0, - unsigned FormatMaxPadding = 3); + unsigned FormatMaxPadding = 3) const; private: diff --git a/include/llvm/ADT/DenseMap.h b/include/llvm/ADT/DenseMap.h index 7350906..393473bd 100644 --- a/include/llvm/ADT/DenseMap.h +++ b/include/llvm/ADT/DenseMap.h @@ -192,6 +192,13 @@ public: return true; } + void swap(DenseMap& RHS) { + std::swap(NumBuckets, RHS.NumBuckets); + std::swap(Buckets, RHS.Buckets); + std::swap(NumEntries, RHS.NumEntries); + std::swap(NumTombstones, RHS.NumTombstones); + } + value_type& FindAndConstruct(const KeyT &Key) { BucketT *TheBucket; if (LookupBucketFor(Key, TheBucket)) diff --git a/include/llvm/ADT/DenseSet.h b/include/llvm/ADT/DenseSet.h index 0898b96..9388338 100644 --- a/include/llvm/ADT/DenseSet.h +++ b/include/llvm/ADT/DenseSet.h @@ -45,6 +45,10 @@ public: return TheMap.erase(V); } + void swap(DenseSet& RHS) { + TheMap.swap(RHS.TheMap); + } + DenseSet &operator=(const DenseSet &RHS) { TheMap = RHS.TheMap; return *this; @@ -55,6 +59,12 @@ public: class Iterator { typename MapTy::iterator I; public: + typedef typename MapTy::iterator::difference_type difference_type; + typedef ValueT value_type; + typedef value_type *pointer; + typedef value_type &reference; + typedef std::forward_iterator_tag iterator_category; + Iterator(const typename MapTy::iterator &i) : I(i) {} ValueT& operator*() { return I->first; } @@ -68,6 +78,12 @@ public: class ConstIterator { typename MapTy::const_iterator I; public: + typedef typename MapTy::const_iterator::difference_type difference_type; + typedef ValueT value_type; + typedef value_type *pointer; + typedef value_type &reference; + typedef std::forward_iterator_tag iterator_category; + ConstIterator(const typename MapTy::const_iterator &i) : I(i) {} const ValueT& operator*() { return I->first; } diff --git a/include/llvm/Analysis/DebugInfo.h b/include/llvm/Analysis/DebugInfo.h index f105c20..9b1d1b30 100644 --- a/include/llvm/Analysis/DebugInfo.h +++ b/include/llvm/Analysis/DebugInfo.h @@ -44,11 +44,6 @@ namespace llvm { protected: MDNode *DbgNode; - /// DIDescriptor constructor. If the specified node is non-null, check - /// to make sure that the tag in the descriptor matches 'RequiredTag'. If - /// not, the debug info is corrupt and we ignore it. - DIDescriptor(MDNode *N, unsigned RequiredTag); - StringRef getStringField(unsigned Elt) const; unsigned getUnsignedField(unsigned Elt) const { return (unsigned)getUInt64Field(Elt); @@ -67,7 +62,7 @@ namespace llvm { explicit DIDescriptor() : DbgNode(0) {} explicit DIDescriptor(MDNode *N) : DbgNode(N) {} - bool isNull() const { return DbgNode == 0; } + bool Verify() const { return DbgNode != 0; } MDNode *getNode() const { return DbgNode; } @@ -92,6 +87,7 @@ namespace llvm { bool isSubprogram() const; bool isGlobalVariable() const; bool isScope() const; + bool isFile() const; bool isCompileUnit() const; bool isNameSpace() const; bool isLexicalBlock() const; @@ -104,8 +100,7 @@ namespace llvm { /// DISubrange - This is used to represent ranges, for array bounds. class DISubrange : public DIDescriptor { public: - explicit DISubrange(MDNode *N = 0) - : DIDescriptor(N, dwarf::DW_TAG_subrange_type) {} + explicit DISubrange(MDNode *N = 0) : DIDescriptor(N) {} int64_t getLo() const { return (int64_t)getUInt64Field(1); } int64_t getHi() const { return (int64_t)getUInt64Field(2); } @@ -126,10 +121,7 @@ namespace llvm { /// DIScope - A base class for various scopes. class DIScope : public DIDescriptor { public: - explicit DIScope(MDNode *N = 0) : DIDescriptor (N) { - if (DbgNode && !isScope()) - DbgNode = 0; - } + explicit DIScope(MDNode *N = 0) : DIDescriptor (N) {} virtual ~DIScope() {} StringRef getFilename() const; @@ -139,10 +131,7 @@ namespace llvm { /// DICompileUnit - A wrapper for a compile unit. class DICompileUnit : public DIScope { public: - explicit DICompileUnit(MDNode *N = 0) : DIScope(N) { - if (DbgNode && !isCompileUnit()) - DbgNode = 0; - } + explicit DICompileUnit(MDNode *N = 0) : DIScope(N) {} unsigned getLanguage() const { return getUnsignedField(2); } StringRef getFilename() const { return getStringField(3); } @@ -170,13 +159,24 @@ namespace llvm { void dump() const; }; + /// DIFile - This is a wrapper for a file. + class DIFile : public DIScope { + public: + explicit DIFile(MDNode *N = 0) : DIScope(N) { + if (DbgNode && !isFile()) + DbgNode = 0; + } + StringRef getFilename() const { return getStringField(1); } + StringRef getDirectory() const { return getStringField(2); } + DICompileUnit getCompileUnit() const{ return getFieldAs<DICompileUnit>(3); } + }; + /// DIEnumerator - A wrapper for an enumerator (e.g. X and Y in 'enum {X,Y}'). /// FIXME: it seems strange that this doesn't have either a reference to the /// type/precision or a file/line pair for location info. class DIEnumerator : public DIDescriptor { public: - explicit DIEnumerator(MDNode *N = 0) - : DIDescriptor(N, dwarf::DW_TAG_enumerator) {} + explicit DIEnumerator(MDNode *N = 0) : DIDescriptor(N) {} StringRef getName() const { return getStringField(1); } uint64_t getEnumValue() const { return getUInt64Field(2); } @@ -185,7 +185,7 @@ namespace llvm { /// DIType - This is a wrapper for a type. /// FIXME: Types should be factored much better so that CV qualifiers and /// others do not require a huge and empty descriptor full of zeros. - class DIType : public DIDescriptor { + class DIType : public DIScope { public: enum { FlagPrivate = 1 << 0, @@ -199,11 +199,9 @@ namespace llvm { }; protected: - DIType(MDNode *N, unsigned Tag) - : DIDescriptor(N, Tag) {} // This ctor is used when the Tag has already been validated by a derived // ctor. - DIType(MDNode *N, bool, bool) : DIDescriptor(N) {} + DIType(MDNode *N, bool, bool) : DIScope(N) {} public: @@ -214,9 +212,15 @@ namespace llvm { explicit DIType() {} virtual ~DIType() {} - DIDescriptor getContext() const { return getDescriptorField(1); } + DIScope getContext() const { return getFieldAs<DIScope>(1); } StringRef getName() const { return getStringField(2); } - DICompileUnit getCompileUnit() const{ return getFieldAs<DICompileUnit>(3); } + DICompileUnit getCompileUnit() const{ + if (getVersion() == llvm::LLVMDebugVersion7) + return getFieldAs<DICompileUnit>(3); + + DIFile F = getFieldAs<DIFile>(3); + return F.getCompileUnit(); + } unsigned getLineNumber() const { return getUnsignedField(4); } uint64_t getSizeInBits() const { return getUInt64Field(5); } uint64_t getAlignInBits() const { return getUInt64Field(6); } @@ -246,7 +250,11 @@ namespace llvm { bool isArtificial() const { return (getFlags() & FlagArtificial) != 0; } - + bool isValid() const { + return DbgNode && (isBasicType() || isDerivedType() || isCompositeType()); + } + StringRef getFilename() const { return getCompileUnit().getFilename();} + StringRef getDirectory() const { return getCompileUnit().getDirectory();} /// dump - print type. void dump() const; }; @@ -254,8 +262,7 @@ namespace llvm { /// DIBasicType - A basic type, like 'int' or 'float'. class DIBasicType : public DIType { public: - explicit DIBasicType(MDNode *N = 0) - : DIType(N, dwarf::DW_TAG_base_type) {} + explicit DIBasicType(MDNode *N = 0) : DIType(N) {} unsigned getEncoding() const { return getUnsignedField(9); } @@ -271,10 +278,7 @@ namespace llvm { : DIType(N, true, true) {} public: explicit DIDerivedType(MDNode *N = 0) - : DIType(N, true, true) { - if (DbgNode && !isDerivedType()) - DbgNode = 0; - } + : DIType(N, true, true) {} DIType getTypeDerivedFrom() const { return getFieldAs<DIType>(9); } @@ -317,17 +321,23 @@ namespace llvm { /// DIGlobal - This is a common class for global variables and subprograms. class DIGlobal : public DIDescriptor { protected: - explicit DIGlobal(MDNode *N, unsigned RequiredTag) - : DIDescriptor(N, RequiredTag) {} + explicit DIGlobal(MDNode *N) : DIDescriptor(N) {} public: virtual ~DIGlobal() {} - DIDescriptor getContext() const { return getDescriptorField(2); } + DIScope getContext() const { return getFieldAs<DIScope>(2); } StringRef getName() const { return getStringField(3); } StringRef getDisplayName() const { return getStringField(4); } StringRef getLinkageName() const { return getStringField(5); } - DICompileUnit getCompileUnit() const{ return getFieldAs<DICompileUnit>(6); } + DICompileUnit getCompileUnit() const{ + if (getVersion() == llvm::LLVMDebugVersion7) + return getFieldAs<DICompileUnit>(6); + + DIFile F = getFieldAs<DIFile>(6); + return F.getCompileUnit(); + } + unsigned getLineNumber() const { return getUnsignedField(7); } DIType getType() const { return getFieldAs<DIType>(8); } @@ -343,16 +353,19 @@ namespace llvm { /// DISubprogram - This is a wrapper for a subprogram (e.g. a function). class DISubprogram : public DIScope { public: - explicit DISubprogram(MDNode *N = 0) : DIScope(N) { - if (DbgNode && !isSubprogram()) - DbgNode = 0; - } + explicit DISubprogram(MDNode *N = 0) : DIScope(N) {} - DIDescriptor getContext() const { return getDescriptorField(2); } + DIScope getContext() const { return getFieldAs<DIScope>(2); } StringRef getName() const { return getStringField(3); } StringRef getDisplayName() const { return getStringField(4); } StringRef getLinkageName() const { return getStringField(5); } - DICompileUnit getCompileUnit() const{ return getFieldAs<DICompileUnit>(6); } + DICompileUnit getCompileUnit() const{ + if (getVersion() == llvm::LLVMDebugVersion7) + return getFieldAs<DICompileUnit>(6); + + DIFile F = getFieldAs<DIFile>(6); + return F.getCompileUnit(); + } unsigned getLineNumber() const { return getUnsignedField(7); } DICompositeType getType() const { return getFieldAs<DICompositeType>(8); } @@ -360,7 +373,7 @@ namespace llvm { /// DIType or as DICompositeType. StringRef getReturnTypeName() const { DICompositeType DCT(getFieldAs<DICompositeType>(8)); - if (!DCT.isNull()) { + if (DCT.Verify()) { DIArray A = DCT.getTypeArray(); DIType T(A.getElement(0).getNode()); return T.getName(); @@ -399,8 +412,7 @@ namespace llvm { /// DIGlobalVariable - This is a wrapper for a global variable. class DIGlobalVariable : public DIGlobal { public: - explicit DIGlobalVariable(MDNode *N = 0) - : DIGlobal(N, dwarf::DW_TAG_variable) {} + explicit DIGlobalVariable(MDNode *N = 0) : DIGlobal(N) {} GlobalVariable *getGlobal() const { return getGlobalVariableField(11); } @@ -416,14 +428,17 @@ namespace llvm { class DIVariable : public DIDescriptor { public: explicit DIVariable(MDNode *N = 0) - : DIDescriptor(N) { - if (DbgNode && !isVariable()) - DbgNode = 0; - } + : DIDescriptor(N) {} - DIDescriptor getContext() const { return getDescriptorField(1); } - StringRef getName() const { return getStringField(2); } - DICompileUnit getCompileUnit() const{ return getFieldAs<DICompileUnit>(3); } + DIScope getContext() const { return getFieldAs<DIScope>(1); } + StringRef getName() const { return getStringField(2); } + DICompileUnit getCompileUnit() const{ + if (getVersion() == llvm::LLVMDebugVersion7) + return getFieldAs<DICompileUnit>(3); + + DIFile F = getFieldAs<DIFile>(3); + return F.getCompileUnit(); + } unsigned getLineNumber() const { return getUnsignedField(4); } DIType getType() const { return getFieldAs<DIType>(5); } @@ -455,10 +470,7 @@ namespace llvm { /// DILexicalBlock - This is a wrapper for a lexical block. class DILexicalBlock : public DIScope { public: - explicit DILexicalBlock(MDNode *N = 0) : DIScope(N) { - if (DbgNode && !isLexicalBlock()) - DbgNode = 0; - } + explicit DILexicalBlock(MDNode *N = 0) : DIScope(N) {} DIScope getContext() const { return getFieldAs<DIScope>(1); } StringRef getDirectory() const { return getContext().getDirectory(); } StringRef getFilename() const { return getContext().getFilename(); } @@ -469,16 +481,18 @@ namespace llvm { /// DINameSpace - A wrapper for a C++ style name space. class DINameSpace : public DIScope { public: - explicit DINameSpace(MDNode *N = 0) : DIScope(N) { - if (DbgNode && !isNameSpace()) - DbgNode = 0; - } - + explicit DINameSpace(MDNode *N = 0) : DIScope(N) {} DIScope getContext() const { return getFieldAs<DIScope>(1); } StringRef getName() const { return getStringField(2); } StringRef getDirectory() const { return getContext().getDirectory(); } StringRef getFilename() const { return getContext().getFilename(); } - DICompileUnit getCompileUnit() const { return getFieldAs<DICompileUnit>(3);} + DICompileUnit getCompileUnit() const{ + if (getVersion() == llvm::LLVMDebugVersion7) + return getFieldAs<DICompileUnit>(3); + + DIFile F = getFieldAs<DIFile>(3); + return F.getCompileUnit(); + } unsigned getLineNumber() const { return getUnsignedField(4); } }; @@ -494,6 +508,7 @@ namespace llvm { DILocation getOrigLocation() const { return getFieldAs<DILocation>(3); } StringRef getFilename() const { return getScope().getFilename(); } StringRef getDirectory() const { return getScope().getDirectory(); } + bool Verify() const; }; /// DIFactory - This object assists with the construction of the various @@ -531,19 +546,22 @@ namespace llvm { StringRef Flags = "", unsigned RunTimeVer = 0); + /// CreateFile - Create a new descriptor for the specified file. + DIFile CreateFile(StringRef Filename, StringRef Directory, DICompileUnit CU); + /// CreateEnumerator - Create a single enumerator value. DIEnumerator CreateEnumerator(StringRef Name, uint64_t Val); /// CreateBasicType - Create a basic type like int, float, etc. DIBasicType CreateBasicType(DIDescriptor Context, StringRef Name, - DICompileUnit CompileUnit, unsigned LineNumber, + DIFile F, unsigned LineNumber, uint64_t SizeInBits, uint64_t AlignInBits, uint64_t OffsetInBits, unsigned Flags, unsigned Encoding); /// CreateBasicType - Create a basic type like int, float, etc. DIBasicType CreateBasicTypeEx(DIDescriptor Context, StringRef Name, - DICompileUnit CompileUnit, unsigned LineNumber, + DIFile F, unsigned LineNumber, Constant *SizeInBits, Constant *AlignInBits, Constant *OffsetInBits, unsigned Flags, unsigned Encoding); @@ -552,7 +570,7 @@ namespace llvm { /// pointer, typedef, etc. DIDerivedType CreateDerivedType(unsigned Tag, DIDescriptor Context, StringRef Name, - DICompileUnit CompileUnit, + DIFile F, unsigned LineNumber, uint64_t SizeInBits, uint64_t AlignInBits, uint64_t OffsetInBits, unsigned Flags, @@ -561,17 +579,18 @@ namespace llvm { /// CreateDerivedType - Create a derived type like const qualified type, /// pointer, typedef, etc. DIDerivedType CreateDerivedTypeEx(unsigned Tag, DIDescriptor Context, - StringRef Name, - DICompileUnit CompileUnit, - unsigned LineNumber, - Constant *SizeInBits, Constant *AlignInBits, - Constant *OffsetInBits, unsigned Flags, - DIType DerivedFrom); + StringRef Name, + DIFile F, + unsigned LineNumber, + Constant *SizeInBits, + Constant *AlignInBits, + Constant *OffsetInBits, unsigned Flags, + DIType DerivedFrom); /// CreateCompositeType - Create a composite type like array, struct, etc. DICompositeType CreateCompositeType(unsigned Tag, DIDescriptor Context, StringRef Name, - DICompileUnit CompileUnit, + DIFile F, unsigned LineNumber, uint64_t SizeInBits, uint64_t AlignInBits, @@ -586,22 +605,23 @@ namespace llvm { /// CreateCompositeType - Create a composite type like array, struct, etc. DICompositeType CreateCompositeTypeEx(unsigned Tag, DIDescriptor Context, - StringRef Name, - DICompileUnit CompileUnit, - unsigned LineNumber, - Constant *SizeInBits, - Constant *AlignInBits, - Constant *OffsetInBits, unsigned Flags, - DIType DerivedFrom, - DIArray Elements, - unsigned RunTimeLang = 0); + StringRef Name, + DIFile F, + unsigned LineNumber, + Constant *SizeInBits, + Constant *AlignInBits, + Constant *OffsetInBits, + unsigned Flags, + DIType DerivedFrom, + DIArray Elements, + unsigned RunTimeLang = 0); /// CreateSubprogram - Create a new descriptor for the specified subprogram. /// See comments in DISubprogram for descriptions of these fields. DISubprogram CreateSubprogram(DIDescriptor Context, StringRef Name, StringRef DisplayName, StringRef LinkageName, - DICompileUnit CompileUnit, unsigned LineNo, + DIFile F, unsigned LineNo, DIType Ty, bool isLocalToUnit, bool isDefinition, unsigned VK = 0, @@ -618,21 +638,21 @@ namespace llvm { CreateGlobalVariable(DIDescriptor Context, StringRef Name, StringRef DisplayName, StringRef LinkageName, - DICompileUnit CompileUnit, + DIFile F, unsigned LineNo, DIType Ty, bool isLocalToUnit, bool isDefinition, llvm::GlobalVariable *GV); /// CreateVariable - Create a new descriptor for the specified variable. DIVariable CreateVariable(unsigned Tag, DIDescriptor Context, StringRef Name, - DICompileUnit CompileUnit, unsigned LineNo, + DIFile F, unsigned LineNo, DIType Ty); /// CreateComplexVariable - Create a new descriptor for the specified /// variable which has a complex address expression for its address. DIVariable CreateComplexVariable(unsigned Tag, DIDescriptor Context, const std::string &Name, - DICompileUnit CompileUnit, unsigned LineNo, + DIFile F, unsigned LineNo, DIType Ty, SmallVector<Value *, 9> &addr); @@ -644,7 +664,7 @@ namespace llvm { /// CreateNameSpace - This creates new descriptor for a namespace /// with the specified parent context. DINameSpace CreateNameSpace(DIDescriptor Context, StringRef Name, - DICompileUnit CU, unsigned LineNo); + DIFile F, unsigned LineNo); /// CreateLocation - Creates a debug info location. DILocation CreateLocation(unsigned LineNo, unsigned ColumnNo, diff --git a/include/llvm/Analysis/InlineCost.h b/include/llvm/Analysis/InlineCost.h index 84acd7d..f0e97d7 100644 --- a/include/llvm/Analysis/InlineCost.h +++ b/include/llvm/Analysis/InlineCost.h @@ -179,6 +179,11 @@ namespace llvm { void resetCachedCostInfo(Function* Caller) { CachedFunctionInfo[Caller] = FunctionInfo(); } + + /// growCachedCostInfo - update the cached cost info for Caller after Callee + /// has been inlined. If Callee is NULL it means a dead call has been + /// eliminated. + void growCachedCostInfo(Function* Caller, Function* Callee); }; } diff --git a/include/llvm/Analysis/PostDominators.h b/include/llvm/Analysis/PostDominators.h index 3681cc01..5552017 100644 --- a/include/llvm/Analysis/PostDominators.h +++ b/include/llvm/Analysis/PostDominators.h @@ -69,6 +69,10 @@ struct PostDominatorTree : public FunctionPass { return DT->properlyDominates(A, B); } + inline BasicBlock *findNearestCommonDominator(BasicBlock *A, BasicBlock *B) { + return DT->findNearestCommonDominator(A, B); + } + virtual void releaseMemory() { DT->releaseMemory(); } diff --git a/include/llvm/CodeGen/AsmPrinter.h b/include/llvm/CodeGen/AsmPrinter.h index 8ade1bd..6187447 100644 --- a/include/llvm/CodeGen/AsmPrinter.h +++ b/include/llvm/CodeGen/AsmPrinter.h @@ -136,6 +136,7 @@ namespace llvm { mutable const MachineInstr *LastMI; mutable const Function *LastFn; mutable unsigned Counter; + mutable unsigned SetCounter; // Private state for processDebugLoc() mutable const MDNode *PrevDLT; @@ -275,6 +276,13 @@ namespace llvm { /// EmitInt64 - Emit a long long directive and value. /// void EmitInt64(uint64_t Value) const; + + + /// EmitLabelDifference - Emit something like ".long Hi-Lo" where the size + /// in bytes of the directive is specified by Size and Hi/Lo specify the + /// labels. This implicitly uses .set if it is available. + void EmitLabelDifference(const MCSymbol *Hi, const MCSymbol *Lo, + unsigned Size) const; //===------------------------------------------------------------------===// diff --git a/include/llvm/CodeGen/DwarfWriter.h b/include/llvm/CodeGen/DwarfWriter.h index d59e22a..3c7f802 100644 --- a/include/llvm/CodeGen/DwarfWriter.h +++ b/include/llvm/CodeGen/DwarfWriter.h @@ -35,6 +35,7 @@ class Value; class Module; class MDNode; class MCAsmInfo; +class MCSymbol; class raw_ostream; class Instruction; class DICompileUnit; @@ -82,10 +83,10 @@ public: /// void EndFunction(const MachineFunction *MF); - /// RecordSourceLine - Register a source line with debug info. Returns a - /// unique label ID used to generate a label and provide correspondence to + /// RecordSourceLine - Register a source line with debug info. Returns the + /// unique label that was emitted and which provides correspondence to /// the source line list. - unsigned RecordSourceLine(unsigned Line, unsigned Col, MDNode *Scope); + MCSymbol *RecordSourceLine(unsigned Line, unsigned Col, MDNode *Scope); /// getRecordSourceLineCount - Count source lines. unsigned getRecordSourceLineCount(); @@ -94,7 +95,7 @@ public: /// be emitted. bool ShouldEmitDwarfDebug() const; - void BeginScope(const MachineInstr *MI, unsigned Label); + void BeginScope(const MachineInstr *MI, MCSymbol *Label); void EndScope(const MachineInstr *MI); }; diff --git a/include/llvm/CodeGen/MachineModuleInfo.h b/include/llvm/CodeGen/MachineModuleInfo.h index 8eeac9f..fff8e83 100644 --- a/include/llvm/CodeGen/MachineModuleInfo.h +++ b/include/llvm/CodeGen/MachineModuleInfo.h @@ -217,26 +217,19 @@ public: /// MachineModuleInfo, for example because the code was deleted. void InvalidateLabel(unsigned LabelID) { // Remap to zero to indicate deletion. - RemapLabel(LabelID, 0); - } - - /// RemapLabel - Indicate that a label has been merged into another. - /// - void RemapLabel(unsigned OldLabelID, unsigned NewLabelID) { - assert(0 < OldLabelID && OldLabelID <= LabelIDList.size() && - "Old label ID out of range."); - assert(NewLabelID <= LabelIDList.size() && - "New label ID out of range."); - LabelIDList[OldLabelID - 1] = NewLabelID; + assert(0 < LabelID && LabelID <= LabelIDList.size() && + "Old label ID out of range."); + LabelIDList[LabelID - 1] = 0; } - /// MappedLabel - Find out the label's final ID. Zero indicates deletion. - /// ID != Mapped ID indicates that the label was folded into another label. - unsigned MappedLabel(unsigned LabelID) const { + /// isLabelDeleted - Return true if the label was deleted. + /// FIXME: This should eventually be eliminated and use the 'is emitted' bit + /// on MCSymbol. + bool isLabelDeleted(unsigned LabelID) const { assert(LabelID <= LabelIDList.size() && "Debug label ID out of range."); - return LabelID ? LabelIDList[LabelID - 1] : 0; + return LabelID == 0 || LabelIDList[LabelID - 1] == 0; } - + /// getFrameMoves - Returns a reference to a list of moves done in the current /// function's prologue. Used to construct frame maps for debug and exception /// handling comsumers. diff --git a/include/llvm/MC/MCAsmInfo.h b/include/llvm/MC/MCAsmInfo.h index 3effea4..7e0c8a5 100644 --- a/include/llvm/MC/MCAsmInfo.h +++ b/include/llvm/MC/MCAsmInfo.h @@ -247,18 +247,6 @@ namespace llvm { /// encode inline subroutine information. bool DwarfUsesInlineInfoSection; // Defaults to false. - /// Is_EHSymbolPrivate - If set, the "_foo.eh" is made private so that it - /// doesn't show up in the symbol table of the object file. - bool Is_EHSymbolPrivate; // Defaults to true. - - /// GlobalEHDirective - This is the directive used to make exception frame - /// tables globally visible. - const char *GlobalEHDirective; // Defaults to NULL. - - /// SupportsWeakEmptyEHFrame - True if target assembler and linker will - /// handle a weak_definition of constant 0 for an omitted EH frame. - bool SupportsWeakOmittedEHFrame; // Defaults to true. - /// DwarfSectionOffsetDirective - Special section offset directive. const char* DwarfSectionOffsetDirective; // Defaults to NULL @@ -419,15 +407,6 @@ namespace llvm { bool doesDwarfUsesInlineInfoSection() const { return DwarfUsesInlineInfoSection; } - bool is_EHSymbolPrivate() const { - return Is_EHSymbolPrivate; - } - const char *getGlobalEHDirective() const { - return GlobalEHDirective; - } - bool getSupportsWeakOmittedEHFrame() const { - return SupportsWeakOmittedEHFrame; - } const char *getDwarfSectionOffsetDirective() const { return DwarfSectionOffsetDirective; } diff --git a/include/llvm/MC/MCContext.h b/include/llvm/MC/MCContext.h index 74415e2..f2f1456 100644 --- a/include/llvm/MC/MCContext.h +++ b/include/llvm/MC/MCContext.h @@ -46,11 +46,6 @@ namespace llvm { /// @name Symbol Managment /// @{ - /// CreateSymbol - Create a new symbol with the specified @p Name. - /// - /// @param Name - The symbol name, which must be unique across all symbols. - MCSymbol *CreateSymbol(StringRef Name); - /// GetOrCreateSymbol - Lookup the symbol inside with the specified /// @p Name. If it exists, return it. If not, create a forward /// reference and return it. @@ -59,13 +54,15 @@ namespace llvm { MCSymbol *GetOrCreateSymbol(StringRef Name); MCSymbol *GetOrCreateSymbol(const Twine &Name); - /// CreateTemporarySymbol - Create a new temporary symbol with the specified - /// @p Name. + /// GetOrCreateTemporarySymbol - Create a new assembler temporary symbol + /// with the specified @p Name if it doesn't exist or return the existing + /// one if it does. /// /// @param Name - The symbol name, for debugging purposes only, temporary /// symbols do not surive assembly. If non-empty the name must be unique /// across all symbols. - MCSymbol *CreateTemporarySymbol(StringRef Name = ""); + MCSymbol *GetOrCreateTemporarySymbol(StringRef Name = ""); + MCSymbol *GetOrCreateTemporarySymbol(const Twine &Name); /// LookupSymbol - Get the symbol for \p Name, or null. MCSymbol *LookupSymbol(StringRef Name) const; diff --git a/include/llvm/MC/MCExpr.h b/include/llvm/MC/MCExpr.h index fce7602..3f17492 100644 --- a/include/llvm/MC/MCExpr.h +++ b/include/llvm/MC/MCExpr.h @@ -127,6 +127,10 @@ public: static const MCSymbolRefExpr *Create(const MCSymbol *Symbol, MCContext &Ctx); static const MCSymbolRefExpr *Create(StringRef Name, MCContext &Ctx); + + /// CreateTemp - Create a reference to an assembler temporary label with the + /// specified name. + static const MCSymbolRefExpr *CreateTemp(StringRef Name, MCContext &Ctx); /// @} /// @name Accessors diff --git a/include/llvm/MC/MCStreamer.h b/include/llvm/MC/MCStreamer.h index 696d024..6359cce 100644 --- a/include/llvm/MC/MCStreamer.h +++ b/include/llvm/MC/MCStreamer.h @@ -191,6 +191,11 @@ namespace llvm { /// EmitIntValue - Special case of EmitValue that avoids the client having /// to pass in a MCExpr for constant integers. virtual void EmitIntValue(uint64_t Value, unsigned Size,unsigned AddrSpace); + + /// EmitSymbolValue - Special case of EmitValue that avoids the client + /// having to pass in a MCExpr for MCSymbols. + virtual void EmitSymbolValue(const MCSymbol *Sym, unsigned Size, + unsigned AddrSpace); /// EmitGPRel32Value - Emit the expression @p Value into the output as a /// gprel32 (32-bit GP relative) value. diff --git a/include/llvm/Metadata.h b/include/llvm/Metadata.h index e536322..cf87989 100644 --- a/include/llvm/Metadata.h +++ b/include/llvm/Metadata.h @@ -43,8 +43,10 @@ protected: public: static MDString *get(LLVMContext &Context, StringRef Str); - static MDString *get(LLVMContext &Context, const char *Str); - + static MDString *get(LLVMContext &Context, const char *Str) { + return get(Context, Str ? StringRef(Str) : StringRef()); + } + StringRef getString() const { return Str; } unsigned getLength() const { return (unsigned)Str.size(); } diff --git a/include/llvm/Support/Dwarf.h b/include/llvm/Support/Dwarf.h index 5f591d4..31f4fd2 100644 --- a/include/llvm/Support/Dwarf.h +++ b/include/llvm/Support/Dwarf.h @@ -22,7 +22,8 @@ namespace llvm { // Debug info constants. enum { - LLVMDebugVersion = (7 << 16), // Current version of debug information. + LLVMDebugVersion = (8 << 16), // Current version of debug information. + LLVMDebugVersion7 = (7 << 16), // Constant for version 7. LLVMDebugVersion6 = (6 << 16), // Constant for version 6. LLVMDebugVersion5 = (5 << 16), // Constant for version 5. LLVMDebugVersion4 = (4 << 16), // Constant for version 4. diff --git a/include/llvm/Target/TargetLowering.h b/include/llvm/Target/TargetLowering.h index 60b7ebd..5bc1c0e 100644 --- a/include/llvm/Target/TargetLowering.h +++ b/include/llvm/Target/TargetLowering.h @@ -664,12 +664,12 @@ public: /// getOptimalMemOpType - Returns the target specific optimal type for load /// and store operations as a result of memset, memcpy, and memmove lowering. - /// It returns EVT::iAny if SelectionDAG should be responsible for + /// It returns EVT::Other if SelectionDAG should be responsible for /// determining it. virtual EVT getOptimalMemOpType(uint64_t Size, unsigned Align, bool isSrcConst, bool isSrcStr, SelectionDAG &DAG) const { - return MVT::iAny; + return MVT::Other; } /// usesUnderscoreSetJmp - Determine if we should use _setjmp or setjmp diff --git a/include/llvm/Target/TargetLoweringObjectFile.h b/include/llvm/Target/TargetLoweringObjectFile.h index 42d88a0..056efea 100644 --- a/include/llvm/Target/TargetLoweringObjectFile.h +++ b/include/llvm/Target/TargetLoweringObjectFile.h @@ -87,11 +87,23 @@ protected: const MCSection *DwarfRangesSection; const MCSection *DwarfMacroInfoSection; + /// SupportsWeakEmptyEHFrame - True if target object file supports a + /// weak_definition of constant 0 for an omitted EH frame. + bool SupportsWeakOmittedEHFrame; + + /// IsFunctionEHSymbolGlobal - This flag is set to true if the ".eh" symbol + /// for a function should be marked .globl. + bool IsFunctionEHSymbolGlobal; + + /// IsFunctionEHFrameSymbolPrivate - This flag is set to true if the + /// "EH_frame" symbol for EH information should be an assembler temporary (aka + /// private linkage, aka an L or .L label) or false if it should be a normal + /// non-.globl label. This defaults to true. + bool IsFunctionEHFrameSymbolPrivate; public: MCContext &getContext() const { return *Ctx; } - virtual ~TargetLoweringObjectFile(); /// Initialize - this method must be called before any actual lowering is @@ -101,6 +113,15 @@ public: Ctx = &ctx; } + bool isFunctionEHSymbolGlobal() const { + return IsFunctionEHSymbolGlobal; + } + bool isFunctionEHFrameSymbolPrivate() const { + return IsFunctionEHFrameSymbolPrivate; + } + bool getSupportsWeakOmittedEHFrame() const { + return SupportsWeakOmittedEHFrame; + } const MCSection *getTextSection() const { return TextSection; } const MCSection *getDataSection() const { return DataSection; } diff --git a/include/llvm/Target/TargetRegisterInfo.h b/include/llvm/Target/TargetRegisterInfo.h index 212cc93..c197445 100644 --- a/include/llvm/Target/TargetRegisterInfo.h +++ b/include/llvm/Target/TargetRegisterInfo.h @@ -682,8 +682,9 @@ public: /// When -enable-frame-index-scavenging is enabled, the virtual register /// allocated for this frame index is returned and its value is stored in /// *Value. + typedef std::pair<unsigned, int> FrameIndexValue; virtual unsigned eliminateFrameIndex(MachineBasicBlock::iterator MI, - int SPAdj, int *Value = NULL, + int SPAdj, FrameIndexValue *Value = NULL, RegScavenger *RS=NULL) const = 0; /// emitProlog/emitEpilog - These methods insert prolog and epilog code into diff --git a/include/llvm/Transforms/IPO/InlinerPass.h b/include/llvm/Transforms/IPO/InlinerPass.h index 30ece0e..c5be59a 100644 --- a/include/llvm/Transforms/IPO/InlinerPass.h +++ b/include/llvm/Transforms/IPO/InlinerPass.h @@ -75,6 +75,10 @@ struct Inliner : public CallGraphSCCPass { /// virtual void resetCachedCostInfo(Function* Caller) = 0; + /// growCachedCostInfo - update the cached cost info for Caller after Callee + /// has been inlined. + virtual void growCachedCostInfo(Function* Caller, Function* Callee) = 0; + /// removeDeadFunctions - Remove dead functions that are not included in /// DNR (Do Not Remove) list. bool removeDeadFunctions(CallGraph &CG, |