//===-- attributes.cpp ----------------------------------------------------===// // // LDC – the LLVM D compiler // // This file is distributed under the BSD-style LDC license. See the LICENSE // file for details. // //===----------------------------------------------------------------------===// #include "gen/attributes.h" #include "gen/irstate.h" bool AttrBuilder::hasAttributes() const { return builder.hasAttributes(); } bool AttrBuilder::contains(LLAttribute attribute) const { return builder.contains(attribute); } AttrBuilder& AttrBuilder::clear() { builder.clear(); return *this; } AttrBuilder& AttrBuilder::add(LLAttribute attribute) { // never set 'None' explicitly if (attribute) builder.addAttribute(attribute); return *this; } AttrBuilder& AttrBuilder::remove(LLAttribute attribute) { // never remove 'None' explicitly if (attribute) builder.removeAttribute(attribute); return *this; } AttrBuilder& AttrBuilder::merge(const AttrBuilder& other) { builder.merge(other.builder); return *this; } AttrSet AttrSet::extractFunctionAndReturnAttributes(const llvm::Function* function) { AttrSet r; llvm::AttributeSet old = function->getAttributes(); llvm::AttributeSet existingAttrs[] = { old.getFnAttributes(), old.getRetAttributes() }; r.set = llvm::AttributeSet::get(gIR->context(), existingAttrs); return r; } AttrSet& AttrSet::add(unsigned index, const AttrBuilder& builder) { if (builder.hasAttributes()) { llvm::AttributeSet as = llvm::AttributeSet::get( gIR->context(), index, builder); set = set.addAttributes(gIR->context(), index, as); } return *this; }