mirror of
https://github.com/ldc-developers/ldc.git
synced 2025-04-29 14:40:40 +03:00

In preparation for the testing for dcompute I was building against very recent trunk and hit the following. ``` /Users/nicholaswilson/d/ldc/gen/attributes.cpp:94:31: error: no member named 'getNumSlots' in 'llvm::AttributeList' for (unsigned i = 0; i < os.getNumSlots(); ++i) { ~~ ^ /Users/nicholaswilson/d/ldc/gen/attributes.cpp:95:25: error: no member named 'getSlotIndex' in 'llvm::AttributeList' unsigned index = os.getSlotIndex(i); ~~ ^ /Users/nicholaswilson/d/ldc/gen/attributes.cpp:96:55: error: no member named 'getSlotAttributes' in 'llvm::AttributeList'; did you mean 'getAttributes'? set = set.addAttributes(gIR->context(), index, os.getSlotAttributes(i)); ^~~~~~~~~~~~~~~~~ getAttributes /Users/nicholaswilson/d/llvm/include/llvm/IR/Attributes.h:455:16: note: 'getAttributes' declared here AttributeSet getAttributes(unsigned Index) const; ``` The patch silences this error although I'm not sure that it fixes it. I feel like it should work though.
103 lines
2.8 KiB
C++
103 lines
2.8 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;
|
||
}
|
||
|
||
AttrBuilder &AttrBuilder::addAlignment(unsigned alignment) {
|
||
builder.addAlignmentAttr(alignment);
|
||
return *this;
|
||
}
|
||
|
||
AttrBuilder &AttrBuilder::addByVal(unsigned alignment) {
|
||
builder.addAttribute(LLAttribute::ByVal);
|
||
if (alignment != 0) {
|
||
builder.addAlignmentAttr(alignment);
|
||
}
|
||
return *this;
|
||
}
|
||
|
||
AttrBuilder &AttrBuilder::addDereferenceable(unsigned size) {
|
||
builder.addDereferenceableAttr(size);
|
||
return *this;
|
||
}
|
||
|
||
|
||
AttrSet::AttrSet(const AttrSet &base, unsigned index, LLAttribute attribute)
|
||
: set(base.set.addAttribute(gIR->context(), index, attribute)) {}
|
||
|
||
AttrSet
|
||
AttrSet::extractFunctionAndReturnAttributes(const llvm::Function *function) {
|
||
auto old = function->getAttributes();
|
||
#if LDC_LLVM_VER >= 500
|
||
return {LLAttributeSet::get(gIR->context(), old.getFnAttributes(),
|
||
old.getRetAttributes(), {})};
|
||
#else
|
||
llvm::AttributeSet existingAttrs[] = {old.getFnAttributes(),
|
||
old.getRetAttributes()};
|
||
return {LLAttributeSet::get(gIR->context(), existingAttrs)};
|
||
#endif
|
||
}
|
||
|
||
AttrSet &AttrSet::add(unsigned index, const AttrBuilder &builder) {
|
||
if (builder.hasAttributes()) {
|
||
#if LDC_LLVM_VER >= 500
|
||
set = set.addAttributes(gIR->context(), index, builder);
|
||
#else
|
||
auto as = LLAttributeSet::get(gIR->context(), index, builder);
|
||
set = set.addAttributes(gIR->context(), index, as);
|
||
#endif
|
||
}
|
||
return *this;
|
||
}
|
||
|
||
AttrSet &AttrSet::merge(const AttrSet &other) {
|
||
auto &os = other.set;
|
||
#if LDC_LLVM_VER >= 500
|
||
set = LLAttributeSet::get(gIR->context(), {set,os});
|
||
#else
|
||
for (unsigned i = 0; i < os.getNumSlots(); ++i) {
|
||
unsigned index = os.getSlotIndex(i);
|
||
set = set.addAttributes(gIR->context(), index, os.getSlotAttributes(i));
|
||
}
|
||
#endif
|
||
return *this;
|
||
}
|