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