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