Skip to content

Commit

Permalink
DebugInfo: Gut DIVariable and DIGlobalVariable
Browse files Browse the repository at this point in the history
Gut all the non-pointer API from the variable wrappers, except an
implicit conversion from `DIGlobalVariable` to `DIDescriptor`.  Note
that if you're updating out-of-tree code, `DIVariable` wraps
`MDLocalVariable` (`MDVariable` is a common base class shared with
`MDGlobalVariable`).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@234840 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
dexonsmith committed Apr 14, 2015
1 parent 4edb309 commit 355ec00
Show file tree
Hide file tree
Showing 14 changed files with 74 additions and 111 deletions.
69 changes: 16 additions & 53 deletions include/llvm/IR/DebugInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -581,69 +581,32 @@ class DITemplateValueParameter : public DIDescriptor {
Metadata *getValue() const { return get()->getValue(); }
};

/// \brief This is a wrapper for a global variable.
class DIGlobalVariable : public DIDescriptor {
DIFile getFile() const { return DIFile(get()->getFile()); }
class DIGlobalVariable {
MDGlobalVariable *N;

public:
DIGlobalVariable() = default;
DIGlobalVariable(const MDGlobalVariable *N) : DIDescriptor(N) {}
DIGlobalVariable(const MDGlobalVariable *N = nullptr)
: N(const_cast<MDGlobalVariable *>(N)) {}

MDGlobalVariable *get() const {
return cast_or_null<MDGlobalVariable>(DIDescriptor::get());
}
operator MDGlobalVariable *() const { return get(); }
MDGlobalVariable *operator->() const { return get(); }
MDGlobalVariable &operator*() const { return *get(); }

StringRef getName() const { return get()->getName(); }
StringRef getDisplayName() const { return get()->getDisplayName(); }
StringRef getLinkageName() const { return get()->getLinkageName(); }
unsigned getLineNumber() const { return get()->getLine(); }
unsigned isLocalToUnit() const { return get()->isLocalToUnit(); }
unsigned isDefinition() const { return get()->isDefinition(); }

DIScope getContext() const { return get()->getScope(); }
StringRef getFilename() const { return get()->getFilename(); }
StringRef getDirectory() const { return get()->getDirectory(); }
DITypeRef getType() const { return get()->getType(); }

Constant *getConstant() const { return get()->getVariable(); }
DIDerivedType getStaticDataMemberDeclaration() const {
return get()->getStaticDataMemberDeclaration();
}
operator DIDescriptor() const { return N; }
operator MDGlobalVariable *() const { return N; }
MDGlobalVariable *operator->() const { return N; }
MDGlobalVariable &operator*() const { return *N; }
};

/// \brief This is a wrapper for a variable (e.g. parameter, local, global etc).
class DIVariable : public DIDescriptor {
unsigned getFlags() const { return get()->getFlags(); }
class DIVariable {
MDLocalVariable *N;

public:
DIVariable() = default;
DIVariable(const MDLocalVariable *N) : DIDescriptor(N) {}

MDLocalVariable *get() const {
return cast_or_null<MDLocalVariable>(DIDescriptor::get());
}
operator MDLocalVariable *() const { return get(); }
MDLocalVariable *operator->() const { return get(); }
MDLocalVariable &operator*() const { return *get(); }

StringRef getName() const { return get()->getName(); }
unsigned getLineNumber() const { return get()->getLine(); }
unsigned getArgNumber() const { return get()->getArg(); }
DIVariable(const MDLocalVariable *N = nullptr)
: N(const_cast<MDLocalVariable *>(N)) {}

DIScope getContext() const { return get()->getScope(); }
DIFile getFile() const { return get()->getFile(); }
DITypeRef getType() const { return get()->getType(); }

bool isArtificial() const { return get()->isArtificial(); }
bool isObjectPointer() const { return get()->isObjectPointer(); }

/// \brief If this variable is inlined then return inline location.
MDNode *getInlinedAt() const { return get()->getInlinedAt(); }
operator MDLocalVariable *() const { return N; }
MDLocalVariable *operator->() const { return N; }
MDLocalVariable &operator*() const { return *N; }
};


class DIExpression {
MDExpression *N;

Expand Down
8 changes: 4 additions & 4 deletions lib/Analysis/ModuleDebugInfoPrinter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -91,10 +91,10 @@ void ModuleDebugInfoPrinter::print(raw_ostream &O, const Module *M) const {
}

for (DIGlobalVariable GV : Finder.global_variables()) {
O << "Global variable: " << GV.getName();
printFile(O, GV.getFilename(), GV.getDirectory(), GV.getLineNumber());
if (!GV.getLinkageName().empty())
O << " ('" << GV.getLinkageName() << "')";
O << "Global variable: " << GV->getName();
printFile(O, GV->getFilename(), GV->getDirectory(), GV->getLine());
if (!GV->getLinkageName().empty())
O << " ('" << GV->getLinkageName() << "')";
O << '\n';
}

Expand Down
4 changes: 2 additions & 2 deletions lib/CodeGen/AsmPrinter/AsmPrinter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -671,12 +671,12 @@ static bool emitDebugValueComment(const MachineInstr *MI, AsmPrinter &AP) {
OS << "DEBUG_VALUE: ";

DIVariable V = MI->getDebugVariable();
if (DISubprogram SP = dyn_cast<MDSubprogram>(V.getContext())) {
if (DISubprogram SP = dyn_cast<MDSubprogram>(V->getScope())) {
StringRef Name = SP.getDisplayName();
if (!Name.empty())
OS << Name << ":";
}
OS << V.getName();
OS << V->getName();

DIExpression Expr = MI->getDebugExpression();
if (Expr->isBitPiece())
Expand Down
34 changes: 17 additions & 17 deletions lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -103,44 +103,44 @@ DIE *DwarfCompileUnit::getOrCreateGlobalVariableDIE(DIGlobalVariable GV) {

assert(GV);

DIScope GVContext = GV.getContext();
DIType GTy = DD->resolve(GV.getType());
DIScope GVContext = GV->getScope();
DIType GTy = DD->resolve(GV->getType());

// Construct the context before querying for the existence of the DIE in
// case such construction creates the DIE.
DIE *ContextDIE = getOrCreateContextDIE(GVContext);

// Add to map.
DIE *VariableDIE = &createAndAddDIE(GV.getTag(), *ContextDIE, GV);
DIE *VariableDIE = &createAndAddDIE(GV->getTag(), *ContextDIE, GV);
DIScope DeclContext;

if (DIDerivedType SDMDecl = GV.getStaticDataMemberDeclaration()) {
if (DIDerivedType SDMDecl = GV->getStaticDataMemberDeclaration()) {
DeclContext = resolve(SDMDecl.getContext());
assert(SDMDecl.isStaticMember() && "Expected static member decl");
assert(GV.isDefinition());
assert(GV->isDefinition());
// We need the declaration DIE that is in the static member's class.
DIE *VariableSpecDIE = getOrCreateStaticMemberDIE(SDMDecl);
addDIEEntry(*VariableDIE, dwarf::DW_AT_specification, *VariableSpecDIE);
} else {
DeclContext = GV.getContext();
DeclContext = GV->getScope();
// Add name and type.
addString(*VariableDIE, dwarf::DW_AT_name, GV.getDisplayName());
addString(*VariableDIE, dwarf::DW_AT_name, GV->getDisplayName());
addType(*VariableDIE, GTy);

// Add scoping info.
if (!GV.isLocalToUnit())
if (!GV->isLocalToUnit())
addFlag(*VariableDIE, dwarf::DW_AT_external);

// Add line number info.
addSourceLine(*VariableDIE, GV);
}

if (!GV.isDefinition())
if (!GV->isDefinition())
addFlag(*VariableDIE, dwarf::DW_AT_declaration);

// Add location.
bool addToAccelTable = false;
if (auto *Global = dyn_cast_or_null<GlobalVariable>(GV.getConstant())) {
if (auto *Global = dyn_cast_or_null<GlobalVariable>(GV->getVariable())) {
addToAccelTable = true;
DIELoc *Loc = new (DIEValueAllocator) DIELoc();
const MCSymbol *Sym = Asm->getSymbol(Global);
Expand Down Expand Up @@ -173,11 +173,11 @@ DIE *DwarfCompileUnit::getOrCreateGlobalVariableDIE(DIGlobalVariable GV) {
}

addBlock(*VariableDIE, dwarf::DW_AT_location, Loc);
addLinkageName(*VariableDIE, GV.getLinkageName());
addLinkageName(*VariableDIE, GV->getLinkageName());
} else if (const ConstantInt *CI =
dyn_cast_or_null<ConstantInt>(GV.getConstant())) {
dyn_cast_or_null<ConstantInt>(GV->getVariable())) {
addConstantValue(*VariableDIE, CI, GTy);
} else if (const ConstantExpr *CE = getMergedGlobalExpr(GV.getConstant())) {
} else if (const ConstantExpr *CE = getMergedGlobalExpr(GV->getVariable())) {
addToAccelTable = true;
// GV is a merged global.
DIELoc *Loc = new (DIEValueAllocator) DIELoc();
Expand All @@ -194,15 +194,15 @@ DIE *DwarfCompileUnit::getOrCreateGlobalVariableDIE(DIGlobalVariable GV) {
}

if (addToAccelTable) {
DD->addAccelName(GV.getName(), *VariableDIE);
DD->addAccelName(GV->getName(), *VariableDIE);

// If the linkage name is different than the name, go ahead and output
// that as well into the name table.
if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName())
DD->addAccelName(GV.getLinkageName(), *VariableDIE);
if (GV->getLinkageName() != "" && GV->getName() != GV->getLinkageName())
DD->addAccelName(GV->getLinkageName(), *VariableDIE);
}

addGlobalName(GV.getName(), *VariableDIE, DeclContext);
addGlobalName(GV->getName(), *VariableDIE, DeclContext);
return VariableDIE;
}

Expand Down
18 changes: 9 additions & 9 deletions lib/CodeGen/AsmPrinter/DwarfDebug.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ bool DbgVariable::isBlockByrefVariable() const {
}

DIType DbgVariable::getType() const {
DIType Ty = Var.getType().resolve(DD->getTypeIdentifierMap());
DIType Ty = Var->getType().resolve(DD->getTypeIdentifierMap());
// FIXME: isBlockByrefVariable should be reformulated in terms of complex
// addresses instead.
if (Ty->isBlockByrefStruct()) {
Expand Down Expand Up @@ -894,10 +894,10 @@ DwarfDebug::collectVariableInfo(DwarfCompileUnit &TheCU, DISubprogram SP,
continue;

LexicalScope *Scope = nullptr;
if (MDLocation *IA = DV.get()->getInlinedAt())
Scope = LScopes.findInlinedScope(DV.get()->getScope(), IA);
if (MDLocation *IA = DV->getInlinedAt())
Scope = LScopes.findInlinedScope(DV->getScope(), IA);
else
Scope = LScopes.findLexicalScope(DV.get()->getScope());
Scope = LScopes.findLexicalScope(DV->getScope());
// If variable scope is not found then skip this variable.
if (!Scope)
continue;
Expand Down Expand Up @@ -933,7 +933,7 @@ DwarfDebug::collectVariableInfo(DwarfCompileUnit &TheCU, DISubprogram SP,
for (DIVariable DV : SP->getVariables()) {
if (!Processed.insert(DV).second)
continue;
if (LexicalScope *Scope = LScopes.findLexicalScope(DV.get()->getScope())) {
if (LexicalScope *Scope = LScopes.findLexicalScope(DV->getScope())) {
ensureAbstractVariableIsCreatedIfScoped(DV, Scope->getScopeNode());
DIExpression NoExpr;
ConcreteVariables.push_back(make_unique<DbgVariable>(DV, NoExpr, this));
Expand Down Expand Up @@ -1128,8 +1128,8 @@ void DwarfDebug::beginFunction(const MachineFunction *MF) {
// The first mention of a function argument gets the CurrentFnBegin
// label, so arguments are visible when breaking at function entry.
DIVariable DIVar = Ranges.front().first->getDebugVariable();
if (DIVar.getTag() == dwarf::DW_TAG_arg_variable &&
getDISubprogram(DIVar.getContext()).describes(MF->getFunction())) {
if (DIVar->getTag() == dwarf::DW_TAG_arg_variable &&
getDISubprogram(DIVar->getScope()).describes(MF->getFunction())) {
LabelsBeforeInsn[Ranges.front().first] = Asm->getFunctionBegin();
if (Ranges.front().first->getDebugExpression()->isBitPiece()) {
// Mark all non-overlapping initial pieces.
Expand Down Expand Up @@ -1220,7 +1220,7 @@ void DwarfDebug::endFunction(const MachineFunction *MF) {
for (DIVariable DV : SP->getVariables()) {
if (!ProcessedVars.insert(DV).second)
continue;
ensureAbstractVariableIsCreated(DV, DV.getContext());
ensureAbstractVariableIsCreated(DV, DV->getScope());
assert(LScopes.getAbstractScopesList().size() == NumAbstractScopes
&& "ensureAbstractVariableIsCreated inserted abstract scopes");
}
Expand Down Expand Up @@ -1480,7 +1480,7 @@ static void emitDebugLocValue(const AsmPrinter &AP,
Streamer);
// Regular entry.
if (Value.isInt()) {
MDType *T = DV.getType().resolve(TypeIdentifierMap);
MDType *T = DV->getType().resolve(TypeIdentifierMap);
auto *B = dyn_cast<MDBasicType>(T);
if (B && (B->getEncoding() == dwarf::DW_ATE_signed ||
B->getEncoding() == dwarf::DW_ATE_signed_char))
Expand Down
8 changes: 4 additions & 4 deletions lib/CodeGen/AsmPrinter/DwarfDebug.h
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ class DbgVariable {
DIE *getDIE() const { return TheDIE; }
void setDotDebugLocOffset(unsigned O) { DotDebugLocOffset = O; }
unsigned getDotDebugLocOffset() const { return DotDebugLocOffset; }
StringRef getName() const { return Var.getName(); }
StringRef getName() const { return Var->getName(); }
const MachineInstr *getMInsn() const { return MInsn; }
const ArrayRef<int> getFrameIndex() const { return FrameIndex; }

Expand All @@ -130,22 +130,22 @@ class DbgVariable {

// Translate tag to proper Dwarf tag.
dwarf::Tag getTag() const {
if (Var.getTag() == dwarf::DW_TAG_arg_variable)
if (Var->getTag() == dwarf::DW_TAG_arg_variable)
return dwarf::DW_TAG_formal_parameter;

return dwarf::DW_TAG_variable;
}
/// \brief Return true if DbgVariable is artificial.
bool isArtificial() const {
if (Var.isArtificial())
if (Var->isArtificial())
return true;
if (getType().isArtificial())
return true;
return false;
}

bool isObjectPointer() const {
if (Var.isObjectPointer())
if (Var->isObjectPointer())
return true;
if (getType().isObjectPointer())
return true;
Expand Down
4 changes: 2 additions & 2 deletions lib/CodeGen/AsmPrinter/DwarfFile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ bool DwarfFile::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
SmallVectorImpl<DbgVariable *> &Vars = ScopeVariables[LS];
DIVariable DV = Var->getVariable();
// Variables with positive arg numbers are parameters.
if (unsigned ArgNum = DV.getArgNumber()) {
if (unsigned ArgNum = DV->getArg()) {
// Keep all parameters in order at the start of the variable list to ensure
// function types are correct (no out-of-order parameters)
//
Expand All @@ -149,7 +149,7 @@ bool DwarfFile::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
// rather than linear search.
auto I = Vars.begin();
while (I != Vars.end()) {
unsigned CurNum = (*I)->getVariable().getArgNumber();
unsigned CurNum = (*I)->getVariable()->getArg();
// A local (non-parameter) variable has been found, insert immediately
// before it.
if (CurNum == 0)
Expand Down
6 changes: 3 additions & 3 deletions lib/CodeGen/AsmPrinter/DwarfUnit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -399,16 +399,16 @@ void DwarfUnit::addSourceLine(DIE &Die, unsigned Line, StringRef File,
void DwarfUnit::addSourceLine(DIE &Die, DIVariable V) {
assert(V);

addSourceLine(Die, V.getLineNumber(), V.getContext().getFilename(),
V.getContext().getDirectory());
addSourceLine(Die, V->getLine(), V->getScope()->getFilename(),
V->getScope()->getDirectory());
}

/// addSourceLine - Add location information to specified debug information
/// entry.
void DwarfUnit::addSourceLine(DIE &Die, DIGlobalVariable G) {
assert(G);

addSourceLine(Die, G.getLineNumber(), G.getFilename(), G.getDirectory());
addSourceLine(Die, G->getLine(), G->getFilename(), G->getDirectory());
}

/// addSourceLine - Add location information to specified debug information
Expand Down
8 changes: 4 additions & 4 deletions lib/CodeGen/MachineInstr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1620,8 +1620,8 @@ void MachineInstr::print(raw_ostream &OS, bool SkipOpers) const {
if (isDebugValue() && MO.isMetadata()) {
// Pretty print DBG_VALUE instructions.
DIVariable DIV = dyn_cast<MDLocalVariable>(MO.getMetadata());
if (DIV && !DIV.getName().empty())
OS << "!\"" << DIV.getName() << '\"';
if (DIV && !DIV->getName().empty())
OS << "!\"" << DIV->getName() << '\"';
else
MO.print(OS, TRI);
} else if (TRI && (isInsertSubreg() || isRegSequence()) && MO.isImm()) {
Expand Down Expand Up @@ -1711,8 +1711,8 @@ void MachineInstr::print(raw_ostream &OS, bool SkipOpers) const {
if (isDebugValue() && getOperand(e - 2).isMetadata()) {
if (!HaveSemi) OS << ";";
DIVariable DV = cast<MDLocalVariable>(getOperand(e - 2).getMetadata());
OS << " line no:" << DV.getLineNumber();
if (auto *InlinedAt = DV.getInlinedAt()) {
OS << " line no:" << DV->getLine();
if (auto *InlinedAt = DV->getInlinedAt()) {
DebugLoc InlinedAtDL(InlinedAt);
if (InlinedAtDL && MF) {
OS << " inlined @[ ";
Expand Down
2 changes: 1 addition & 1 deletion lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4673,7 +4673,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
Address = BCI->getOperand(0);
// Parameters are handled specially.
bool isParameter =
(DIVariable(Variable).getTag() == dwarf::DW_TAG_arg_variable ||
(DIVariable(Variable)->getTag() == dwarf::DW_TAG_arg_variable ||
isa<Argument>(Address));

const AllocaInst *AI = dyn_cast<AllocaInst>(Address);
Expand Down
Loading

0 comments on commit 355ec00

Please sign in to comment.