1deaf6951SEugene Zelenko //===- Comdat.cpp - Implement Metadata classes ----------------------------===// 2dad0a645SDavid Majnemer // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6dad0a645SDavid Majnemer // 7dad0a645SDavid Majnemer //===----------------------------------------------------------------------===// 8dad0a645SDavid Majnemer // 9e66458a8SReid Kleckner // This file implements the Comdat class (including the C bindings). 10dad0a645SDavid Majnemer // 11dad0a645SDavid Majnemer //===----------------------------------------------------------------------===// 12dad0a645SDavid Majnemer 13e66458a8SReid Kleckner #include "llvm-c/Comdat.h" 14*e188aae4Sserge-sans-paille #include "llvm/ADT/SmallPtrSet.h" 15*e188aae4Sserge-sans-paille #include "llvm/ADT/StringMapEntry.h" 16deaf6951SEugene Zelenko #include "llvm/ADT/StringRef.h" 17e66458a8SReid Kleckner #include "llvm/IR/Comdat.h" 18e66458a8SReid Kleckner #include "llvm/IR/GlobalObject.h" 19e66458a8SReid Kleckner #include "llvm/IR/Module.h" 20*e188aae4Sserge-sans-paille #include "llvm/IR/Value.h" 21deaf6951SEugene Zelenko 22dad0a645SDavid Majnemer using namespace llvm; 23dad0a645SDavid Majnemer Comdat(Comdat && C)24dad0a645SDavid MajnemerComdat::Comdat(Comdat &&C) : Name(C.Name), SK(C.SK) {} 25dad0a645SDavid Majnemer 26deaf6951SEugene Zelenko Comdat::Comdat() = default; 27dad0a645SDavid Majnemer getName() const28dad0a645SDavid MajnemerStringRef Comdat::getName() const { return Name->first(); } 29e66458a8SReid Kleckner addUser(GlobalObject * GO)3032808cfbSNikita Popovvoid Comdat::addUser(GlobalObject *GO) { Users.insert(GO); } 3132808cfbSNikita Popov removeUser(GlobalObject * GO)3232808cfbSNikita Popovvoid Comdat::removeUser(GlobalObject *GO) { Users.erase(GO); } 3332808cfbSNikita Popov LLVMGetOrInsertComdat(LLVMModuleRef M,const char * Name)34e66458a8SReid KlecknerLLVMComdatRef LLVMGetOrInsertComdat(LLVMModuleRef M, const char *Name) { 35e66458a8SReid Kleckner return wrap(unwrap(M)->getOrInsertComdat(Name)); 36e66458a8SReid Kleckner } 37e66458a8SReid Kleckner LLVMGetComdat(LLVMValueRef V)38e66458a8SReid KlecknerLLVMComdatRef LLVMGetComdat(LLVMValueRef V) { 39e66458a8SReid Kleckner GlobalObject *G = unwrap<GlobalObject>(V); 40e66458a8SReid Kleckner return wrap(G->getComdat()); 41e66458a8SReid Kleckner } 42e66458a8SReid Kleckner LLVMSetComdat(LLVMValueRef V,LLVMComdatRef C)43e66458a8SReid Klecknervoid LLVMSetComdat(LLVMValueRef V, LLVMComdatRef C) { 44e66458a8SReid Kleckner GlobalObject *G = unwrap<GlobalObject>(V); 45e66458a8SReid Kleckner G->setComdat(unwrap(C)); 46e66458a8SReid Kleckner } 47e66458a8SReid Kleckner LLVMGetComdatSelectionKind(LLVMComdatRef C)48e66458a8SReid KlecknerLLVMComdatSelectionKind LLVMGetComdatSelectionKind(LLVMComdatRef C) { 49e66458a8SReid Kleckner switch (unwrap(C)->getSelectionKind()) { 50e66458a8SReid Kleckner case Comdat::Any: 51e66458a8SReid Kleckner return LLVMAnyComdatSelectionKind; 52e66458a8SReid Kleckner case Comdat::ExactMatch: 53e66458a8SReid Kleckner return LLVMExactMatchComdatSelectionKind; 54e66458a8SReid Kleckner case Comdat::Largest: 55e66458a8SReid Kleckner return LLVMLargestComdatSelectionKind; 5639248779SFangrui Song case Comdat::NoDeduplicate: 5739248779SFangrui Song return LLVMNoDeduplicateComdatSelectionKind; 58e66458a8SReid Kleckner case Comdat::SameSize: 59e66458a8SReid Kleckner return LLVMSameSizeComdatSelectionKind; 60e66458a8SReid Kleckner } 61e66458a8SReid Kleckner llvm_unreachable("Invalid Comdat SelectionKind!"); 62e66458a8SReid Kleckner } 63e66458a8SReid Kleckner LLVMSetComdatSelectionKind(LLVMComdatRef C,LLVMComdatSelectionKind kind)64e66458a8SReid Klecknervoid LLVMSetComdatSelectionKind(LLVMComdatRef C, LLVMComdatSelectionKind kind) { 65e66458a8SReid Kleckner Comdat *Cd = unwrap(C); 66e66458a8SReid Kleckner switch (kind) { 67e66458a8SReid Kleckner case LLVMAnyComdatSelectionKind: 68e66458a8SReid Kleckner Cd->setSelectionKind(Comdat::Any); 69e66458a8SReid Kleckner break; 70e66458a8SReid Kleckner case LLVMExactMatchComdatSelectionKind: 71e66458a8SReid Kleckner Cd->setSelectionKind(Comdat::ExactMatch); 72e66458a8SReid Kleckner break; 73e66458a8SReid Kleckner case LLVMLargestComdatSelectionKind: 74e66458a8SReid Kleckner Cd->setSelectionKind(Comdat::Largest); 75e66458a8SReid Kleckner break; 7639248779SFangrui Song case LLVMNoDeduplicateComdatSelectionKind: 7739248779SFangrui Song Cd->setSelectionKind(Comdat::NoDeduplicate); 78e66458a8SReid Kleckner break; 79e66458a8SReid Kleckner case LLVMSameSizeComdatSelectionKind: 80e66458a8SReid Kleckner Cd->setSelectionKind(Comdat::SameSize); 81e66458a8SReid Kleckner break; 82e66458a8SReid Kleckner } 83e66458a8SReid Kleckner } 84