summaryrefslogtreecommitdiffstats
path: root/lib/IR/Attributes.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/IR/Attributes.cpp')
-rw-r--r--lib/IR/Attributes.cpp115
1 files changed, 73 insertions, 42 deletions
diff --git a/lib/IR/Attributes.cpp b/lib/IR/Attributes.cpp
index 3a8cfe5..5608cbd 100644
--- a/lib/IR/Attributes.cpp
+++ b/lib/IR/Attributes.cpp
@@ -106,60 +106,70 @@ unsigned Attribute::getStackAlignment() const {
}
std::string Attribute::getAsString() const {
- if (hasAttribute(Attribute::ZExt))
- return "zeroext";
- if (hasAttribute(Attribute::SExt))
- return "signext";
- if (hasAttribute(Attribute::NoReturn))
- return "noreturn";
- if (hasAttribute(Attribute::NoUnwind))
- return "nounwind";
- if (hasAttribute(Attribute::UWTable))
- return "uwtable";
- if (hasAttribute(Attribute::ReturnsTwice))
- return "returns_twice";
+ if (!pImpl) return "";
+
+ if (hasAttribute(Attribute::AddressSafety))
+ return "address_safety";
+ if (hasAttribute(Attribute::AlwaysInline))
+ return "alwaysinline";
+ if (hasAttribute(Attribute::ByVal))
+ return "byval";
+ if (hasAttribute(Attribute::InlineHint))
+ return "inlinehint";
if (hasAttribute(Attribute::InReg))
return "inreg";
+ if (hasAttribute(Attribute::MinSize))
+ return "minsize";
+ if (hasAttribute(Attribute::Naked))
+ return "naked";
+ if (hasAttribute(Attribute::Nest))
+ return "nest";
if (hasAttribute(Attribute::NoAlias))
return "noalias";
if (hasAttribute(Attribute::NoCapture))
return "nocapture";
- if (hasAttribute(Attribute::StructRet))
- return "sret";
- if (hasAttribute(Attribute::ByVal))
- return "byval";
- if (hasAttribute(Attribute::Nest))
- return "nest";
+ if (hasAttribute(Attribute::NoDuplicate))
+ return "noduplicate";
+ if (hasAttribute(Attribute::NoImplicitFloat))
+ return "noimplicitfloat";
+ if (hasAttribute(Attribute::NoInline))
+ return "noinline";
+ if (hasAttribute(Attribute::NonLazyBind))
+ return "nonlazybind";
+ if (hasAttribute(Attribute::NoRedZone))
+ return "noredzone";
+ if (hasAttribute(Attribute::NoReturn))
+ return "noreturn";
+ if (hasAttribute(Attribute::NoUnwind))
+ return "nounwind";
+ if (hasAttribute(Attribute::OptimizeForSize))
+ return "optsize";
if (hasAttribute(Attribute::ReadNone))
return "readnone";
if (hasAttribute(Attribute::ReadOnly))
return "readonly";
- if (hasAttribute(Attribute::OptimizeForSize))
- return "optsize";
- if (hasAttribute(Attribute::NoInline))
- return "noinline";
- if (hasAttribute(Attribute::InlineHint))
- return "inlinehint";
- if (hasAttribute(Attribute::AlwaysInline))
- return "alwaysinline";
+ if (hasAttribute(Attribute::ReturnsTwice))
+ return "returns_twice";
+ if (hasAttribute(Attribute::SExt))
+ return "signext";
if (hasAttribute(Attribute::StackProtect))
return "ssp";
if (hasAttribute(Attribute::StackProtectReq))
return "sspreq";
if (hasAttribute(Attribute::StackProtectStrong))
return "sspstrong";
- if (hasAttribute(Attribute::NoRedZone))
- return "noredzone";
- if (hasAttribute(Attribute::NoImplicitFloat))
- return "noimplicitfloat";
- if (hasAttribute(Attribute::Naked))
- return "naked";
- if (hasAttribute(Attribute::NonLazyBind))
- return "nonlazybind";
- if (hasAttribute(Attribute::AddressSafety))
- return "address_safety";
- if (hasAttribute(Attribute::MinSize))
- return "minsize";
+ if (hasAttribute(Attribute::StructRet))
+ return "sret";
+ if (hasAttribute(Attribute::UWTable))
+ return "uwtable";
+ if (hasAttribute(Attribute::ZExt))
+ return "zeroext";
+
+ // FIXME: These should be output like this:
+ //
+ // align=4
+ // alignstack=8
+ //
if (hasAttribute(Attribute::StackAlignment)) {
std::string Result;
Result += "alignstack(";
@@ -171,17 +181,38 @@ std::string Attribute::getAsString() const {
std::string Result;
Result += "align ";
Result += utostr(getAlignment());
- Result += "";
return Result;
}
- if (hasAttribute(Attribute::NoDuplicate))
- return "noduplicate";
+
+ // Convert target-dependent attributes to strings of the form:
+ //
+ // "kind"
+ // "kind" = "value"
+ // "kind" = ("value1" "value2" "value3" )
+ //
+ if (ConstantDataArray *CDA =
+ dyn_cast<ConstantDataArray>(pImpl->getAttributeKind())) {
+ std::string Result;
+ Result += '\"' + CDA->getAsString().str() + '"';
+
+ ArrayRef<Constant*> Vals = pImpl->getAttributeValues();
+ if (Vals.empty()) return Result;
+ Result += " = ";
+ if (Vals.size() > 1) Result += '(';
+ for (ArrayRef<Constant*>::iterator I = Vals.begin(), E = Vals.end();
+ I != E; ) {
+ ConstantDataArray *CDA = cast<ConstantDataArray>(*I++);
+ Result += '\"' + CDA->getAsString().str() + '"';
+ if (I != E) Result += ' ';
+ }
+ if (Vals.size() > 1) Result += ')';
+ }
llvm_unreachable("Unknown attribute");
}
bool Attribute::operator==(AttrKind K) const {
- return pImpl && *pImpl == K;
+ return (pImpl && *pImpl == K) || (!pImpl && K == None);
}
bool Attribute::operator!=(AttrKind K) const {
return !(*this == K);