1 //===- Comdat.cpp - Implement Metadata classes ----------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements the Comdat class (including the C bindings).
12 //===----------------------------------------------------------------------===//
14 #include "llvm-c/Comdat.h"
15 #include "llvm/ADT/StringMap.h"
16 #include "llvm/ADT/StringRef.h"
17 #include "llvm/IR/Comdat.h"
18 #include "llvm/IR/GlobalObject.h"
19 #include "llvm/IR/Module.h"
23 Comdat::Comdat(Comdat
&&C
) : Name(C
.Name
), SK(C
.SK
) {}
25 Comdat::Comdat() = default;
27 StringRef
Comdat::getName() const { return Name
->first(); }
29 LLVMComdatRef
LLVMGetOrInsertComdat(LLVMModuleRef M
, const char *Name
) {
30 return wrap(unwrap(M
)->getOrInsertComdat(Name
));
33 LLVMComdatRef
LLVMGetComdat(LLVMValueRef V
) {
34 GlobalObject
*G
= unwrap
<GlobalObject
>(V
);
35 return wrap(G
->getComdat());
38 void LLVMSetComdat(LLVMValueRef V
, LLVMComdatRef C
) {
39 GlobalObject
*G
= unwrap
<GlobalObject
>(V
);
40 G
->setComdat(unwrap(C
));
43 LLVMComdatSelectionKind
LLVMGetComdatSelectionKind(LLVMComdatRef C
) {
44 switch (unwrap(C
)->getSelectionKind()) {
46 return LLVMAnyComdatSelectionKind
;
47 case Comdat::ExactMatch
:
48 return LLVMExactMatchComdatSelectionKind
;
50 return LLVMLargestComdatSelectionKind
;
51 case Comdat::NoDuplicates
:
52 return LLVMNoDuplicatesComdatSelectionKind
;
53 case Comdat::SameSize
:
54 return LLVMSameSizeComdatSelectionKind
;
56 llvm_unreachable("Invalid Comdat SelectionKind!");
59 void LLVMSetComdatSelectionKind(LLVMComdatRef C
, LLVMComdatSelectionKind kind
) {
60 Comdat
*Cd
= unwrap(C
);
62 case LLVMAnyComdatSelectionKind
:
63 Cd
->setSelectionKind(Comdat::Any
);
65 case LLVMExactMatchComdatSelectionKind
:
66 Cd
->setSelectionKind(Comdat::ExactMatch
);
68 case LLVMLargestComdatSelectionKind
:
69 Cd
->setSelectionKind(Comdat::Largest
);
71 case LLVMNoDuplicatesComdatSelectionKind
:
72 Cd
->setSelectionKind(Comdat::NoDuplicates
);
74 case LLVMSameSizeComdatSelectionKind
:
75 Cd
->setSelectionKind(Comdat::SameSize
);