Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/netbsd-7]: src/external/bsd/llvm/dist/llvm/lib/CodeGen/AsmPrinter Pull u...
details: https://anonhg.NetBSD.org/src/rev/1bd014c7cae7
branches: netbsd-7
changeset: 799415:1bd014c7cae7
user: snj <snj%NetBSD.org@localhost>
date: Fri Jun 05 16:45:19 2015 +0000
description:
Pull up following revision(s) (requested by joerg in ticket #824):
external/bsd/llvm/dist/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp: revision 1.1.1.3
external/bsd/llvm/dist/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h: revision 1.1.1.3
Update LLVM to 3.6.1.
diffstat:
external/bsd/llvm/dist/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp | 2652 ++-------
external/bsd/llvm/dist/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h | 527 +-
2 files changed, 950 insertions(+), 2229 deletions(-)
diffs (truncated from 3311 to 300 lines):
diff -r 95edea14cc8a -r 1bd014c7cae7 external/bsd/llvm/dist/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
--- a/external/bsd/llvm/dist/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp Thu Jun 04 20:41:19 2015 +0000
+++ b/external/bsd/llvm/dist/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp Fri Jun 05 16:45:19 2015 +0000
@@ -1,430 +1,737 @@
-//===-- llvm/CodeGen/DwarfCompileUnit.cpp - Dwarf Compile Unit ------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file contains support for constructing a dwarf compile unit.
-//
-//===----------------------------------------------------------------------===//
-
-#define DEBUG_TYPE "dwarfdebug"
-
#include "DwarfCompileUnit.h"
-#include "DwarfAccelTable.h"
-#include "DwarfDebug.h"
-#include "llvm/ADT/APFloat.h"
-#include "llvm/DIBuilder.h"
-#include "llvm/IR/Constants.h"
+#include "DwarfExpression.h"
+#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/IR/DataLayout.h"
+#include "llvm/IR/GlobalValue.h"
#include "llvm/IR/GlobalVariable.h"
-#include "llvm/IR/Instructions.h"
-#include "llvm/MC/MCSection.h"
+#include "llvm/IR/Instruction.h"
+#include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCStreamer.h"
-#include "llvm/Target/Mangler.h"
#include "llvm/Target/TargetFrameLowering.h"
+#include "llvm/Target/TargetLoweringObjectFile.h"
#include "llvm/Target/TargetMachine.h"
-#include "llvm/Target/TargetLoweringObjectFile.h"
#include "llvm/Target/TargetRegisterInfo.h"
-
-using namespace llvm;
-
-/// CompileUnit - Compile unit constructor.
-CompileUnit::CompileUnit(unsigned UID, DIE *D, DICompileUnit Node,
- AsmPrinter *A, DwarfDebug *DW, DwarfUnits *DWU)
- : UniqueID(UID), Node(Node), CUDie(D), Asm(A), DD(DW), DU(DWU),
- IndexTyDie(0), DebugInfoOffset(0) {
- DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1);
- insertDIE(Node, D);
-}
-
-/// ~CompileUnit - Destructor for compile unit.
-CompileUnit::~CompileUnit() {
- for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j)
- DIEBlocks[j]->~DIEBlock();
-}
-
-/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug
-/// information entry.
-DIEEntry *CompileUnit::createDIEEntry(DIE *Entry) {
- DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry);
- return Value;
-}
-
-/// getDefaultLowerBound - Return the default lower bound for an array. If the
-/// DWARF version doesn't handle the language, return -1.
-int64_t CompileUnit::getDefaultLowerBound() const {
- switch (getLanguage()) {
- default:
- break;
-
- case dwarf::DW_LANG_C89:
- case dwarf::DW_LANG_C99:
- case dwarf::DW_LANG_C:
- case dwarf::DW_LANG_C_plus_plus:
- case dwarf::DW_LANG_ObjC:
- case dwarf::DW_LANG_ObjC_plus_plus:
- return 0;
-
- case dwarf::DW_LANG_Fortran77:
- case dwarf::DW_LANG_Fortran90:
- case dwarf::DW_LANG_Fortran95:
- return 1;
-
- // The languages below have valid values only if the DWARF version >= 4.
- case dwarf::DW_LANG_Java:
- case dwarf::DW_LANG_Python:
- case dwarf::DW_LANG_UPC:
- case dwarf::DW_LANG_D:
- if (dwarf::DWARF_VERSION >= 4)
- return 0;
- break;
-
- case dwarf::DW_LANG_Ada83:
- case dwarf::DW_LANG_Ada95:
- case dwarf::DW_LANG_Cobol74:
- case dwarf::DW_LANG_Cobol85:
- case dwarf::DW_LANG_Modula2:
- case dwarf::DW_LANG_Pascal83:
- case dwarf::DW_LANG_PLI:
- if (dwarf::DWARF_VERSION >= 4)
- return 1;
- break;
- }
-
- return -1;
-}
-
-/// Check whether the DIE for this MDNode can be shared across CUs.
-static bool isShareableAcrossCUs(DIDescriptor D) {
- // When the MDNode can be part of the type system, the DIE can be
- // shared across CUs.
- return D.isType() ||
- (D.isSubprogram() && !DISubprogram(D).isDefinition());
-}
+#include "llvm/Target/TargetSubtargetInfo.h"
-/// getDIE - Returns the debug information entry map slot for the
-/// specified debug variable. We delegate the request to DwarfDebug
-/// when the DIE for this MDNode can be shared across CUs. The mappings
-/// will be kept in DwarfDebug for shareable DIEs.
-DIE *CompileUnit::getDIE(DIDescriptor D) const {
- if (isShareableAcrossCUs(D))
- return DD->getDIE(D);
- return MDNodeToDieMap.lookup(D);
-}
-
-/// insertDIE - Insert DIE into the map. We delegate the request to DwarfDebug
-/// when the DIE for this MDNode can be shared across CUs. The mappings
-/// will be kept in DwarfDebug for shareable DIEs.
-void CompileUnit::insertDIE(DIDescriptor Desc, DIE *D) {
- if (isShareableAcrossCUs(Desc)) {
- DD->insertDIE(Desc, D);
- return;
- }
- MDNodeToDieMap.insert(std::make_pair(Desc, D));
-}
-
-/// addFlag - Add a flag that is true.
-void CompileUnit::addFlag(DIE *Die, dwarf::Attribute Attribute) {
- if (DD->getDwarfVersion() >= 4)
- Die->addValue(Attribute, dwarf::DW_FORM_flag_present, DIEIntegerOne);
- else
- Die->addValue(Attribute, dwarf::DW_FORM_flag, DIEIntegerOne);
-}
-
-/// addUInt - Add an unsigned integer attribute data and value.
-///
-void CompileUnit::addUInt(DIE *Die, dwarf::Attribute Attribute,
- Optional<dwarf::Form> Form, uint64_t Integer) {
- if (!Form)
- Form = DIEInteger::BestForm(false, Integer);
- DIEValue *Value = Integer == 1 ? DIEIntegerOne : new (DIEValueAllocator)
- DIEInteger(Integer);
- Die->addValue(Attribute, *Form, Value);
-}
-
-void CompileUnit::addUInt(DIEBlock *Block, dwarf::Form Form, uint64_t Integer) {
- addUInt(Block, (dwarf::Attribute)0, Form, Integer);
-}
-
-/// addSInt - Add an signed integer attribute data and value.
-///
-void CompileUnit::addSInt(DIE *Die, dwarf::Attribute Attribute,
- Optional<dwarf::Form> Form, int64_t Integer) {
- if (!Form)
- Form = DIEInteger::BestForm(true, Integer);
- DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer);
- Die->addValue(Attribute, *Form, Value);
-}
-
-void CompileUnit::addSInt(DIEBlock *Die, Optional<dwarf::Form> Form,
- int64_t Integer) {
- addSInt(Die, (dwarf::Attribute)0, Form, Integer);
-}
+namespace llvm {
-/// addString - Add a string attribute data and value. We always emit a
-/// reference to the string pool instead of immediate strings so that DIEs have
-/// more predictable sizes. In the case of split dwarf we emit an index
-/// into another table which gets us the static offset into the string
-/// table.
-void CompileUnit::addString(DIE *Die, dwarf::Attribute Attribute,
- StringRef String) {
- DIEValue *Value;
- dwarf::Form Form;
- if (!DD->useSplitDwarf()) {
- MCSymbol *Symb = DU->getStringPoolEntry(String);
- if (Asm->needsRelocationsForDwarfStringPool())
- Value = new (DIEValueAllocator) DIELabel(Symb);
- else {
- MCSymbol *StringPool = DU->getStringPoolSym();
- Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
- }
- Form = dwarf::DW_FORM_strp;
- } else {
- unsigned idx = DU->getStringPoolIndex(String);
- Value = new (DIEValueAllocator) DIEInteger(idx);
- Form = dwarf::DW_FORM_GNU_str_index;
- }
- DIEValue *Str = new (DIEValueAllocator) DIEString(Value, String);
- Die->addValue(Attribute, Form, Str);
-}
-
-/// addLocalString - Add a string attribute data and value. This is guaranteed
-/// to be in the local string pool instead of indirected.
-void CompileUnit::addLocalString(DIE *Die, dwarf::Attribute Attribute,
- StringRef String) {
- MCSymbol *Symb = DU->getStringPoolEntry(String);
- DIEValue *Value;
- if (Asm->needsRelocationsForDwarfStringPool())
- Value = new (DIEValueAllocator) DIELabel(Symb);
- else {
- MCSymbol *StringPool = DU->getStringPoolSym();
- Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool);
- }
- Die->addValue(Attribute, dwarf::DW_FORM_strp, Value);
-}
-
-/// addExpr - Add a Dwarf expression attribute data and value.
-///
-void CompileUnit::addExpr(DIEBlock *Die, dwarf::Form Form, const MCExpr *Expr) {
- DIEValue *Value = new (DIEValueAllocator) DIEExpr(Expr);
- Die->addValue((dwarf::Attribute)0, Form, Value);
-}
-
-/// addLabel - Add a Dwarf label attribute data and value.
-///
-void CompileUnit::addLabel(DIE *Die, dwarf::Attribute Attribute,
- dwarf::Form Form, const MCSymbol *Label) {
- DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
- Die->addValue(Attribute, Form, Value);
-}
-
-void CompileUnit::addLabel(DIEBlock *Die, dwarf::Form Form,
- const MCSymbol *Label) {
- addLabel(Die, (dwarf::Attribute)0, Form, Label);
+DwarfCompileUnit::DwarfCompileUnit(unsigned UID, DICompileUnit Node,
+ AsmPrinter *A, DwarfDebug *DW,
+ DwarfFile *DWU)
+ : DwarfUnit(UID, dwarf::DW_TAG_compile_unit, Node, A, DW, DWU),
+ Skeleton(nullptr), LabelBegin(nullptr), BaseAddress(nullptr) {
+ insertDIE(Node, &getUnitDie());
}
/// addLabelAddress - Add a dwarf label attribute data and value using
/// DW_FORM_addr or DW_FORM_GNU_addr_index.
///
-void CompileUnit::addLabelAddress(DIE *Die, dwarf::Attribute Attribute,
- MCSymbol *Label) {
+void DwarfCompileUnit::addLabelAddress(DIE &Die, dwarf::Attribute Attribute,
+ const MCSymbol *Label) {
+
+ // Don't use the address pool in non-fission or in the skeleton unit itself.
+ // FIXME: Once GDB supports this, it's probably worthwhile using the address
+ // pool from the skeleton - maybe even in non-fission (possibly fewer
+ // relocations by sharing them in the pool, but we have other ideas about how
+ // to reduce the number of relocations as well/instead).
+ if (!DD->useSplitDwarf() || !Skeleton)
+ return addLocalLabelAddress(Die, Attribute, Label);
+
+ if (Label)
+ DD->addArangeLabel(SymbolCU(this, Label));
+
+ unsigned idx = DD->getAddressPool().getIndex(Label);
+ DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
+ Die.addValue(Attribute, dwarf::DW_FORM_GNU_addr_index, Value);
+}
+
+void DwarfCompileUnit::addLocalLabelAddress(DIE &Die,
+ dwarf::Attribute Attribute,
+ const MCSymbol *Label) {
if (Label)
DD->addArangeLabel(SymbolCU(this, Label));
- if (!DD->useSplitDwarf()) {
- if (Label != NULL) {
- DIEValue *Value = new (DIEValueAllocator) DIELabel(Label);
- Die->addValue(Attribute, dwarf::DW_FORM_addr, Value);
+ Die.addValue(Attribute, dwarf::DW_FORM_addr,
+ Label ? (DIEValue *)new (DIEValueAllocator) DIELabel(Label)
+ : new (DIEValueAllocator) DIEInteger(0));
+}
+
+unsigned DwarfCompileUnit::getOrCreateSourceID(StringRef FileName,
+ StringRef DirName) {
+ // If we print assembly, we can't separate .file entries according to
+ // compile units. Thus all files will belong to the default compile unit.
+
+ // FIXME: add a better feature test than hasRawTextSupport. Even better,
+ // extend .file to support this.
+ return Asm->OutStreamer.EmitDwarfFileDirective(
+ 0, DirName, FileName,
+ Asm->OutStreamer.hasRawTextSupport() ? 0 : getUniqueID());
+}
+
+// Return const expression if value is a GEP to access merged global
+// constant. e.g.
Home |
Main Index |
Thread Index |
Old Index