1 //===- Comdat.cpp - Implement Metadata classes ----------------------------===// 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 // This file implements the Comdat class (including the C bindings). 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "llvm-c/Comdat.h" 15 #include "llvm/ADT/StringMap.h" 16 #include "llvm/ADT/StringRef.h" 17 #include "llvm/IR/Comdat.h" 18 #include "llvm/IR/GlobalObject.h" 19 #include "llvm/IR/Module.h" 20 21 using namespace llvm; 22 Comdat(Comdat && C)23Comdat::Comdat(Comdat &&C) : Name(C.Name), SK(C.SK) {} 24 25 Comdat::Comdat() = default; 26 getName() const27StringRef Comdat::getName() const { return Name->first(); } 28 LLVMGetOrInsertComdat(LLVMModuleRef M,const char * Name)29LLVMComdatRef LLVMGetOrInsertComdat(LLVMModuleRef M, const char *Name) { 30 return wrap(unwrap(M)->getOrInsertComdat(Name)); 31 } 32 LLVMGetComdat(LLVMValueRef V)33LLVMComdatRef LLVMGetComdat(LLVMValueRef V) { 34 GlobalObject *G = unwrap<GlobalObject>(V); 35 return wrap(G->getComdat()); 36 } 37 LLVMSetComdat(LLVMValueRef V,LLVMComdatRef C)38void LLVMSetComdat(LLVMValueRef V, LLVMComdatRef C) { 39 GlobalObject *G = unwrap<GlobalObject>(V); 40 G->setComdat(unwrap(C)); 41 } 42 LLVMGetComdatSelectionKind(LLVMComdatRef C)43LLVMComdatSelectionKind LLVMGetComdatSelectionKind(LLVMComdatRef C) { 44 switch (unwrap(C)->getSelectionKind()) { 45 case Comdat::Any: 46 return LLVMAnyComdatSelectionKind; 47 case Comdat::ExactMatch: 48 return LLVMExactMatchComdatSelectionKind; 49 case Comdat::Largest: 50 return LLVMLargestComdatSelectionKind; 51 case Comdat::NoDuplicates: 52 return LLVMNoDuplicatesComdatSelectionKind; 53 case Comdat::SameSize: 54 return LLVMSameSizeComdatSelectionKind; 55 } 56 llvm_unreachable("Invalid Comdat SelectionKind!"); 57 } 58 LLVMSetComdatSelectionKind(LLVMComdatRef C,LLVMComdatSelectionKind kind)59void LLVMSetComdatSelectionKind(LLVMComdatRef C, LLVMComdatSelectionKind kind) { 60 Comdat *Cd = unwrap(C); 61 switch (kind) { 62 case LLVMAnyComdatSelectionKind: 63 Cd->setSelectionKind(Comdat::Any); 64 break; 65 case LLVMExactMatchComdatSelectionKind: 66 Cd->setSelectionKind(Comdat::ExactMatch); 67 break; 68 case LLVMLargestComdatSelectionKind: 69 Cd->setSelectionKind(Comdat::Largest); 70 break; 71 case LLVMNoDuplicatesComdatSelectionKind: 72 Cd->setSelectionKind(Comdat::NoDuplicates); 73 break; 74 case LLVMSameSizeComdatSelectionKind: 75 Cd->setSelectionKind(Comdat::SameSize); 76 break; 77 } 78 } 79