blob: 3b1f7d62cdae628898ae4bbbfa0710731bbb9669 [file] [log] [blame]
Eugene Zelenkob1df7872017-02-17 00:00:09 +00001//===- Comdat.cpp - Implement Metadata classes ----------------------------===//
David Majnemerc8a11692014-06-27 18:19:56 +00002//
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//
Reid Kleckner862ea572018-03-14 18:33:53 +000010// This file implements the Comdat class (including the C bindings).
David Majnemerc8a11692014-06-27 18:19:56 +000011//
12//===----------------------------------------------------------------------===//
13
Reid Kleckner862ea572018-03-14 18:33:53 +000014#include "llvm-c/Comdat.h"
David Majnemerc8a11692014-06-27 18:19:56 +000015#include "llvm/ADT/StringMap.h"
Eugene Zelenkob1df7872017-02-17 00:00:09 +000016#include "llvm/ADT/StringRef.h"
Reid Kleckner862ea572018-03-14 18:33:53 +000017#include "llvm/IR/Comdat.h"
18#include "llvm/IR/GlobalObject.h"
19#include "llvm/IR/Module.h"
Eugene Zelenkob1df7872017-02-17 00:00:09 +000020
David Majnemerc8a11692014-06-27 18:19:56 +000021using namespace llvm;
22
David Majnemerc8a11692014-06-27 18:19:56 +000023Comdat::Comdat(Comdat &&C) : Name(C.Name), SK(C.SK) {}
24
Eugene Zelenkob1df7872017-02-17 00:00:09 +000025Comdat::Comdat() = default;
David Majnemerc8a11692014-06-27 18:19:56 +000026
27StringRef Comdat::getName() const { return Name->first(); }
Reid Kleckner862ea572018-03-14 18:33:53 +000028
29LLVMComdatRef LLVMGetOrInsertComdat(LLVMModuleRef M, const char *Name) {
30 return wrap(unwrap(M)->getOrInsertComdat(Name));
31}
32
33LLVMComdatRef LLVMGetComdat(LLVMValueRef V) {
34 GlobalObject *G = unwrap<GlobalObject>(V);
35 return wrap(G->getComdat());
36}
37
38void LLVMSetComdat(LLVMValueRef V, LLVMComdatRef C) {
39 GlobalObject *G = unwrap<GlobalObject>(V);
40 G->setComdat(unwrap(C));
41}
42
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
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}