mirror of
https://github.com/ldc-developers/ldc.git
synced 2025-04-30 07:00:46 +03:00

This uses the LLVM style, which makes sense for sharing code with other LLVM projects. The DMD code we use will soon all be in D anyway.
62 lines
1.7 KiB
C++
62 lines
1.7 KiB
C++
//===-- 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;
|
||
}
|