| //===- 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; |
| } |
| } |