|  | //===- Comdat.cpp - Implement Metadata classes ----------------------------===// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file is distributed under the University of Illinois Open Source | 
|  | // License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | // This file implements the Comdat class (including the C bindings). | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #include "llvm-c/Comdat.h" | 
|  | #include "llvm/ADT/StringMap.h" | 
|  | #include "llvm/ADT/StringRef.h" | 
|  | #include "llvm/IR/Comdat.h" | 
|  | #include "llvm/IR/GlobalObject.h" | 
|  | #include "llvm/IR/Module.h" | 
|  |  | 
|  | using namespace llvm; | 
|  |  | 
|  | Comdat::Comdat(Comdat &&C) : Name(C.Name), SK(C.SK) {} | 
|  |  | 
|  | Comdat::Comdat() = default; | 
|  |  | 
|  | StringRef Comdat::getName() const { return Name->first(); } | 
|  |  | 
|  | LLVMComdatRef LLVMGetOrInsertComdat(LLVMModuleRef M, const char *Name) { | 
|  | return wrap(unwrap(M)->getOrInsertComdat(Name)); | 
|  | } | 
|  |  | 
|  | LLVMComdatRef LLVMGetComdat(LLVMValueRef V) { | 
|  | GlobalObject *G = unwrap<GlobalObject>(V); | 
|  | return wrap(G->getComdat()); | 
|  | } | 
|  |  | 
|  | void LLVMSetComdat(LLVMValueRef V, LLVMComdatRef C) { | 
|  | GlobalObject *G = unwrap<GlobalObject>(V); | 
|  | G->setComdat(unwrap(C)); | 
|  | } | 
|  |  | 
|  | LLVMComdatSelectionKind LLVMGetComdatSelectionKind(LLVMComdatRef C) { | 
|  | switch (unwrap(C)->getSelectionKind()) { | 
|  | case Comdat::Any: | 
|  | return LLVMAnyComdatSelectionKind; | 
|  | case Comdat::ExactMatch: | 
|  | return LLVMExactMatchComdatSelectionKind; | 
|  | case Comdat::Largest: | 
|  | return LLVMLargestComdatSelectionKind; | 
|  | case Comdat::NoDuplicates: | 
|  | return LLVMNoDuplicatesComdatSelectionKind; | 
|  | case Comdat::SameSize: | 
|  | return LLVMSameSizeComdatSelectionKind; | 
|  | } | 
|  | llvm_unreachable("Invalid Comdat SelectionKind!"); | 
|  | } | 
|  |  | 
|  | void LLVMSetComdatSelectionKind(LLVMComdatRef C, LLVMComdatSelectionKind kind) { | 
|  | Comdat *Cd = unwrap(C); | 
|  | switch (kind) { | 
|  | case LLVMAnyComdatSelectionKind: | 
|  | Cd->setSelectionKind(Comdat::Any); | 
|  | break; | 
|  | case LLVMExactMatchComdatSelectionKind: | 
|  | Cd->setSelectionKind(Comdat::ExactMatch); | 
|  | break; | 
|  | case LLVMLargestComdatSelectionKind: | 
|  | Cd->setSelectionKind(Comdat::Largest); | 
|  | break; | 
|  | case LLVMNoDuplicatesComdatSelectionKind: | 
|  | Cd->setSelectionKind(Comdat::NoDuplicates); | 
|  | break; | 
|  | case LLVMSameSizeComdatSelectionKind: | 
|  | Cd->setSelectionKind(Comdat::SameSize); | 
|  | break; | 
|  | } | 
|  | } |