blob: c9f715daf4573a738901902f7a5fce1e1b79f79a [file] [log] [blame]
Eugene Zelenkodeaf6952017-02-17 00:00:09 +00001//===- Comdat.cpp - Implement Metadata classes ----------------------------===//
David Majnemerdad0a642014-06-27 18:19:56 +00002//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
David Majnemerdad0a642014-06-27 18:19:56 +00006//
7//===----------------------------------------------------------------------===//
8//
Reid Klecknere66458a2018-03-14 18:33:53 +00009// This file implements the Comdat class (including the C bindings).
David Majnemerdad0a642014-06-27 18:19:56 +000010//
11//===----------------------------------------------------------------------===//
12
Reid Klecknere66458a2018-03-14 18:33:53 +000013#include "llvm-c/Comdat.h"
David Majnemerdad0a642014-06-27 18:19:56 +000014#include "llvm/ADT/StringMap.h"
Eugene Zelenkodeaf6952017-02-17 00:00:09 +000015#include "llvm/ADT/StringRef.h"
Reid Klecknere66458a2018-03-14 18:33:53 +000016#include "llvm/IR/Comdat.h"
17#include "llvm/IR/GlobalObject.h"
18#include "llvm/IR/Module.h"
Eugene Zelenkodeaf6952017-02-17 00:00:09 +000019
David Majnemerdad0a642014-06-27 18:19:56 +000020using namespace llvm;
21
David Majnemerdad0a642014-06-27 18:19:56 +000022Comdat::Comdat(Comdat &&C) : Name(C.Name), SK(C.SK) {}
23
Eugene Zelenkodeaf6952017-02-17 00:00:09 +000024Comdat::Comdat() = default;
David Majnemerdad0a642014-06-27 18:19:56 +000025
26StringRef Comdat::getName() const { return Name->first(); }
Reid Klecknere66458a2018-03-14 18:33:53 +000027
28LLVMComdatRef LLVMGetOrInsertComdat(LLVMModuleRef M, const char *Name) {
29 return wrap(unwrap(M)->getOrInsertComdat(Name));
30}
31
32LLVMComdatRef LLVMGetComdat(LLVMValueRef V) {
33 GlobalObject *G = unwrap<GlobalObject>(V);
34 return wrap(G->getComdat());
35}
36
37void LLVMSetComdat(LLVMValueRef V, LLVMComdatRef C) {
38 GlobalObject *G = unwrap<GlobalObject>(V);
39 G->setComdat(unwrap(C));
40}
41
42LLVMComdatSelectionKind LLVMGetComdatSelectionKind(LLVMComdatRef C) {
43 switch (unwrap(C)->getSelectionKind()) {
44 case Comdat::Any:
45 return LLVMAnyComdatSelectionKind;
46 case Comdat::ExactMatch:
47 return LLVMExactMatchComdatSelectionKind;
48 case Comdat::Largest:
49 return LLVMLargestComdatSelectionKind;
50 case Comdat::NoDuplicates:
51 return LLVMNoDuplicatesComdatSelectionKind;
52 case Comdat::SameSize:
53 return LLVMSameSizeComdatSelectionKind;
54 }
55 llvm_unreachable("Invalid Comdat SelectionKind!");
56}
57
58void LLVMSetComdatSelectionKind(LLVMComdatRef C, LLVMComdatSelectionKind kind) {
59 Comdat *Cd = unwrap(C);
60 switch (kind) {
61 case LLVMAnyComdatSelectionKind:
62 Cd->setSelectionKind(Comdat::Any);
63 break;
64 case LLVMExactMatchComdatSelectionKind:
65 Cd->setSelectionKind(Comdat::ExactMatch);
66 break;
67 case LLVMLargestComdatSelectionKind:
68 Cd->setSelectionKind(Comdat::Largest);
69 break;
70 case LLVMNoDuplicatesComdatSelectionKind:
71 Cd->setSelectionKind(Comdat::NoDuplicates);
72 break;
73 case LLVMSameSizeComdatSelectionKind:
74 Cd->setSelectionKind(Comdat::SameSize);
75 break;
76 }
77}