1cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines//===-- llvm/IR/Comdat.h - Comdat definitions -------------------*- C++ -*-===//
2cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines//
3cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines//                     The LLVM Compiler Infrastructure
4cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines//
5cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// This file is distributed under the University of Illinois Open Source
6cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// License. See LICENSE.TXT for details.
7cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines//
8cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines//===----------------------------------------------------------------------===//
9cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines//
10cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines/// @file
11cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines/// This file contains the declaration of the Comdat class, which represents a
12cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines/// single COMDAT in LLVM.
13cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines//
14cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines//===----------------------------------------------------------------------===//
15cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
16cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#ifndef LLVM_IR_COMDAT_H
17cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#define LLVM_IR_COMDAT_H
18cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
19cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "llvm/ADT/StringRef.h"
20cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "llvm/Support/Compiler.h"
21cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
22cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesnamespace llvm {
23cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
24cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesclass raw_ostream;
25cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinestemplate <typename ValueTy> class StringMapEntry;
26cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
27cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// This is a Name X SelectionKind pair. The reason for having this be an
28cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// independent object instead of just adding the name and the SelectionKind
29cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// to a GlobalObject is that it is invalid to have two Comdats with the same
30cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// name but different SelectionKind. This structure makes that unrepresentable.
31cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesclass Comdat {
32cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinespublic:
33cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  enum SelectionKind {
34cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    Any,          ///< The linker may choose any COMDAT.
35cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    ExactMatch,   ///< The data referenced by the COMDAT must be the same.
36cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    Largest,      ///< The linker will choose the largest COMDAT.
37cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    NoDuplicates, ///< No other Module may specify this COMDAT.
38cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    SameSize,     ///< The data referenced by the COMDAT must be the same size.
39cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  };
40cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
41cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  Comdat(Comdat &&C);
42cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  SelectionKind getSelectionKind() const { return SK; }
43cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  void setSelectionKind(SelectionKind Val) { SK = Val; }
44cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  StringRef getName() const;
45cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  void print(raw_ostream &OS) const;
46cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  void dump() const;
47cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
48cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesprivate:
49cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  friend class Module;
50cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  Comdat();
51cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  Comdat(SelectionKind SK, StringMapEntry<Comdat> *Name);
52cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  Comdat(const Comdat &) LLVM_DELETED_FUNCTION;
53cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
54cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Points to the map in Module.
55cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  StringMapEntry<Comdat> *Name;
56cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  SelectionKind SK;
57cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines};
58cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
59cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesinline raw_ostream &operator<<(raw_ostream &OS, const Comdat &C) {
60cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  C.print(OS);
61cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  return OS;
62cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}
63cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
64cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} // end llvm namespace
65cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
66cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#endif
67