diff options
author | Reid Kleckner <rnk@google.com> | 2018-03-14 18:33:53 +0000 |
---|---|---|
committer | Reid Kleckner <rnk@google.com> | 2018-03-14 18:33:53 +0000 |
commit | e66458a841ed3e3dc5041dc3d1af909c4d41d7cb (patch) | |
tree | 469f4963dabffa6a4976c1c1e210453b9498c207 /llvm/lib | |
parent | 5a48cf86f1ee97eec6a238e36c3a2f40b5d26fea (diff) | |
download | bcm5719-llvm-e66458a841ed3e3dc5041dc3d1af909c4d41d7cb.tar.gz bcm5719-llvm-e66458a841ed3e3dc5041dc3d1af909c4d41d7cb.zip |
[LLVM-C] [bindings/go] Add C and Golang bindings for COMDAT
Patch by Ben Clayton
Differential Revision: https://reviews.llvm.org/D44086
llvm-svn: 327551
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/IR/Comdat.cpp | 58 |
1 files changed, 56 insertions, 2 deletions
diff --git a/llvm/lib/IR/Comdat.cpp b/llvm/lib/IR/Comdat.cpp index c735f9b2eb1..3b1f7d62cda 100644 --- a/llvm/lib/IR/Comdat.cpp +++ b/llvm/lib/IR/Comdat.cpp @@ -7,13 +7,16 @@ // //===----------------------------------------------------------------------===// // -// This file implements the Comdat class. +// This file implements the Comdat class (including the C bindings). // //===----------------------------------------------------------------------===// -#include "llvm/IR/Comdat.h" +#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; @@ -22,3 +25,54 @@ 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; + } +} |