16bb1caddSDimitry Andric //===-- DiffLog.h - Difference Log Builder and accessories ------*- C++ -*-===//
26bb1caddSDimitry Andric //
36bb1caddSDimitry Andric //                     The LLVM Compiler Infrastructure
46bb1caddSDimitry Andric //
56bb1caddSDimitry Andric // This file is distributed under the University of Illinois Open Source
66bb1caddSDimitry Andric // License. See LICENSE.TXT for details.
76bb1caddSDimitry Andric //
86bb1caddSDimitry Andric //===----------------------------------------------------------------------===//
96bb1caddSDimitry Andric //
106bb1caddSDimitry Andric // This header defines the interface to the LLVM difference log builder.
116bb1caddSDimitry Andric //
126bb1caddSDimitry Andric //===----------------------------------------------------------------------===//
136bb1caddSDimitry Andric 
146bb1caddSDimitry Andric #include "DiffLog.h"
156bb1caddSDimitry Andric #include "DiffConsumer.h"
166bb1caddSDimitry Andric #include "llvm/ADT/StringRef.h"
176bb1caddSDimitry Andric 
186bb1caddSDimitry Andric using namespace llvm;
196bb1caddSDimitry Andric 
~LogBuilder()206bb1caddSDimitry Andric LogBuilder::~LogBuilder() {
21*7d523365SDimitry Andric   if (consumer)
22*7d523365SDimitry Andric     consumer->logf(*this);
236bb1caddSDimitry Andric }
246bb1caddSDimitry Andric 
getFormat() const256bb1caddSDimitry Andric StringRef LogBuilder::getFormat() const { return Format; }
266bb1caddSDimitry Andric 
getNumArguments() const276bb1caddSDimitry Andric unsigned LogBuilder::getNumArguments() const { return Arguments.size(); }
getArgument(unsigned I) const286bb1caddSDimitry Andric Value *LogBuilder::getArgument(unsigned I) const { return Arguments[I]; }
296bb1caddSDimitry Andric 
~DiffLogBuilder()306bb1caddSDimitry Andric DiffLogBuilder::~DiffLogBuilder() { consumer.logd(*this); }
316bb1caddSDimitry Andric 
addMatch(Instruction * L,Instruction * R)326bb1caddSDimitry Andric void DiffLogBuilder::addMatch(Instruction *L, Instruction *R) {
336bb1caddSDimitry Andric   Diff.push_back(DiffRecord(L, R));
346bb1caddSDimitry Andric }
addLeft(Instruction * L)356bb1caddSDimitry Andric void DiffLogBuilder::addLeft(Instruction *L) {
366bb1caddSDimitry Andric   // HACK: VS 2010 has a bug in the stdlib that requires this.
3791bc56edSDimitry Andric   Diff.push_back(DiffRecord(L, DiffRecord::second_type(nullptr)));
386bb1caddSDimitry Andric }
addRight(Instruction * R)396bb1caddSDimitry Andric void DiffLogBuilder::addRight(Instruction *R) {
406bb1caddSDimitry Andric   // HACK: VS 2010 has a bug in the stdlib that requires this.
4191bc56edSDimitry Andric   Diff.push_back(DiffRecord(DiffRecord::first_type(nullptr), R));
426bb1caddSDimitry Andric }
436bb1caddSDimitry Andric 
getNumLines() const446bb1caddSDimitry Andric unsigned DiffLogBuilder::getNumLines() const { return Diff.size(); }
456bb1caddSDimitry Andric 
getLineKind(unsigned I) const466bb1caddSDimitry Andric DiffChange DiffLogBuilder::getLineKind(unsigned I) const {
476bb1caddSDimitry Andric   return (Diff[I].first ? (Diff[I].second ? DC_match : DC_left)
486bb1caddSDimitry Andric                         : DC_right);
496bb1caddSDimitry Andric }
getLeft(unsigned I) const506bb1caddSDimitry Andric Instruction *DiffLogBuilder::getLeft(unsigned I) const { return Diff[I].first; }
getRight(unsigned I) const516bb1caddSDimitry Andric Instruction *DiffLogBuilder::getRight(unsigned I) const { return Diff[I].second; }
52