Skip to content

Commit

Permalink
[OptDiag, opt-viewer] Save callee's location and display as link
Browse files Browse the repository at this point in the history
With this we get a new field in the YAML record if the value being
streamed out has a debug location.  For examples, please see the changes
to the tests.

This is then used in opt-viewer to display a link for the callee
function in the inlining remarks.

Differential Revision: https://reviews.llvm.org/D26366

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@286169 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
anemet committed Nov 7, 2016
1 parent 978966f commit 330e12b
Show file tree
Hide file tree
Showing 6 changed files with 42 additions and 9 deletions.
2 changes: 2 additions & 0 deletions include/llvm/IR/DiagnosticInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -385,6 +385,8 @@ class DiagnosticInfoOptimizationBase : public DiagnosticInfoWithDebugLocBase {
struct Argument {
StringRef Key;
std::string Val;
// If set, the debug location corresponding to the value.
DebugLoc DLoc;

explicit Argument(StringRef Str = "") : Key("String"), Val(Str) {}
Argument(StringRef Key, Value *V);
Expand Down
2 changes: 2 additions & 0 deletions lib/Analysis/OptimizationDiagnosticInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,8 @@ template <> struct MappingTraits<DiagnosticInfoOptimizationBase::Argument> {
static void mapping(IO &io, DiagnosticInfoOptimizationBase::Argument &A) {
assert(io.outputting() && "input not yet implemented");
io.mapRequired(A.Key.data(), A.Val);
if (A.DLoc)
io.mapOptional("DebugLoc", A.DLoc);
}
};

Expand Down
9 changes: 8 additions & 1 deletion lib/IR/DiagnosticInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,14 @@ const std::string DiagnosticInfoWithDebugLocBase::getLocationStr() const {
return (Filename + ":" + Twine(Line) + ":" + Twine(Column)).str();
}
DiagnosticInfoOptimizationBase::Argument::Argument(StringRef Key, Value *V)
: Key(Key), Val(GlobalValue::getRealLinkageName(V->getName())) {}
: Key(Key), Val(GlobalValue::getRealLinkageName(V->getName())) {
if (auto *F = dyn_cast<Function>(V)) {
if (DISubprogram *SP = F->getSubprogram())
DLoc = DebugLoc::get(SP->getScopeLine(), 0, SP);
}
else if (auto *I = dyn_cast<Instruction>(V))
DLoc = I->getDebugLoc();
}

DiagnosticInfoOptimizationBase::Argument::Argument(StringRef Key, int N)
: Key(Key), Val(itostr(N)) {}
Expand Down
4 changes: 4 additions & 0 deletions test/Transforms/Inline/optimization-remarks-passed-yaml.ll
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,10 @@
; YAML-NEXT: Hotness: 30
; YAML-NEXT: Args:
; YAML-NEXT: - Callee: foo
; YAML-NEXT: DebugLoc: { File: /tmp/s.c, Line: 1, Column: 0 }
; YAML-NEXT: - String: ' can be inlined into '
; YAML-NEXT: - Caller: bar
; YAML-NEXT: DebugLoc: { File: /tmp/s.c, Line: 3, Column: 0 }
; YAML-NEXT: - String: ' with cost='
; YAML-NEXT: - Cost: '{{[0-9]+}}'
; YAML-NEXT: - String: ' (threshold='
Expand All @@ -39,8 +41,10 @@
; YAML-NEXT: Hotness: 30
; YAML-NEXT: Args:
; YAML-NEXT: - Callee: foo
; YAML-NEXT: DebugLoc: { File: /tmp/s.c, Line: 1, Column: 0 }
; YAML-NEXT: - String: ' inlined into '
; YAML-NEXT: - Caller: bar
; YAML-NEXT: DebugLoc: { File: /tmp/s.c, Line: 3, Column: 0 }
; YAML-NEXT: ...

; ModuleID = '/tmp/s.c'
Expand Down
2 changes: 2 additions & 0 deletions test/Transforms/Inline/optimization-remarks-yaml.ll
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
; YAML-NEXT: - Callee: foo
; YAML-NEXT: - String: ' will not be inlined into '
; YAML-NEXT: - Caller: baz
; YAML-NEXT: DebugLoc: { File: /tmp/s.c, Line: 4, Column: 0 }
; YAML-NEXT: - String: ' because its definition is unavailable'
; YAML-NEXT: ...
; YAML-NEXT: --- !Missed
Expand All @@ -38,6 +39,7 @@
; YAML-NEXT: - Callee: bar
; YAML-NEXT: - String: ' will not be inlined into '
; YAML-NEXT: - Caller: baz
; YAML-NEXT: DebugLoc: { File: /tmp/s.c, Line: 4, Column: 0 }
; YAML-NEXT: - String: ' because its definition is unavailable'
; YAML-NEXT: ...

Expand Down
32 changes: 24 additions & 8 deletions utils/opt-viewer/opt-viewer.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,20 +46,36 @@ def DebugLocString(self):
def DemangledFunctionName(self):
return demangle(self.Function)

@classmethod
def make_link(cls, File, Line):
return "{}#L{}".format(SourceFileRenderer.html_file_name(File), Line)

@property
def Link(self):
return "{}#L{}".format(SourceFileRenderer.html_file_name(self.File), self.Line)
return Remark.make_link(self.File, self.Line)

def getArgString(self, mapping):
mapping = mapping.copy()
dl = mapping.get('DebugLoc')
if dl:
del mapping['DebugLoc']

assert(len(mapping) == 1)
(key, value) = mapping.items()[0]

if key == 'Caller' or key == 'Callee':
value = demangle(value)

def getArgString(self, pair):
if pair[0] == 'Callee' or pair[0] == 'Caller':
return demangle(pair[1])
return pair[1]
if dl and key != 'Caller':
return "<a href={}>{}</a>".format(
Remark.make_link(dl['File'], dl['Line']), value)
else:
return value

@property
def message(self):
# Args is a list of mappings (dictionaries) with each dictionary with
# exactly one key-value pair.
values = [self.getArgString(mapping.items()[0]) for mapping in self.Args]
# Args is a list of mappings (dictionaries)
values = [self.getArgString(mapping) for mapping in self.Args]
return "".join(values)

@property
Expand Down

0 comments on commit 330e12b

Please sign in to comment.