Coverage Report

Created: 2019-07-24 05:18

/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/lib/CodeGen/SafeStackLayout.h
Line
Count
Source (jump to first uncovered line)
1
//===- SafeStackLayout.h - SafeStack frame layout --------------*- C++ -*--===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
9
#ifndef LLVM_LIB_CODEGEN_SAFESTACKLAYOUT_H
10
#define LLVM_LIB_CODEGEN_SAFESTACKLAYOUT_H
11
12
#include "SafeStackColoring.h"
13
#include "llvm/ADT/DenseMap.h"
14
#include "llvm/ADT/SmallVector.h"
15
16
namespace llvm {
17
18
class raw_ostream;
19
class Value;
20
21
namespace safestack {
22
23
/// Compute the layout of an unsafe stack frame.
24
class StackLayout {
25
  unsigned MaxAlignment;
26
27
  struct StackRegion {
28
    unsigned Start;
29
    unsigned End;
30
    StackColoring::LiveRange Range;
31
32
    StackRegion(unsigned Start, unsigned End,
33
                const StackColoring::LiveRange &Range)
34
250
        : Start(Start), End(End), Range(Range) {}
35
  };
36
37
  /// The list of current stack regions, sorted by StackRegion::Start.
38
  SmallVector<StackRegion, 16> Regions;
39
40
  struct StackObject {
41
    const Value *Handle;
42
    unsigned Size, Alignment;
43
    StackColoring::LiveRange Range;
44
  };
45
46
  SmallVector<StackObject, 8> StackObjects;
47
48
  DenseMap<const Value *, unsigned> ObjectOffsets;
49
  DenseMap<const Value *, unsigned> ObjectAlignments;
50
51
  void layoutObject(StackObject &Obj);
52
53
public:
54
152
  StackLayout(unsigned StackAlignment) : MaxAlignment(StackAlignment) {}
55
56
  /// Add an object to the stack frame. Value pointer is opaque and used as a
57
  /// handle to retrieve the object's offset in the frame later.
58
  void addObject(const Value *V, unsigned Size, unsigned Alignment,
59
                 const StackColoring::LiveRange &Range);
60
61
  /// Run the layout computation for all previously added objects.
62
  void computeLayout();
63
64
  /// Returns the offset to the object start in the stack frame.
65
252
  unsigned getObjectOffset(const Value *V) { return ObjectOffsets[V]; }
66
67
  /// Returns the alignment of the object
68
7
  unsigned getObjectAlignment(const Value *V) { return ObjectAlignments[V]; }
69
70
  /// Returns the size of the entire frame.
71
152
  unsigned getFrameSize() { return Regions.empty() ? 
00
: Regions.back().End; }
72
73
  /// Returns the alignment of the frame.
74
152
  unsigned getFrameAlignment() { return MaxAlignment; }
75
76
  void print(raw_ostream &OS);
77
};
78
79
} // end namespace safestack
80
81
} // end namespace llvm
82
83
#endif // LLVM_LIB_CODEGEN_SAFESTACKLAYOUT_H