This reverts commit 9221f3af8f.
As reported
<https://github.com/llvm/llvm-project/pull/84597#issuecomment-2079128332>
and confirmed by me locally, adding these attributes causes current GNU
ld to segfault when processing the input. Reverted so we can discuss
the best next step.
67 lines
2.0 KiB
C++
67 lines
2.0 KiB
C++
//===-- RISCVAttributeParser.cpp - RISCV Attribute Parser -----------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/Support/RISCVAttributeParser.h"
|
|
#include "llvm/ADT/StringExtras.h"
|
|
|
|
using namespace llvm;
|
|
|
|
const RISCVAttributeParser::DisplayHandler
|
|
RISCVAttributeParser::displayRoutines[] = {
|
|
{
|
|
RISCVAttrs::ARCH,
|
|
&ELFAttributeParser::stringAttribute,
|
|
},
|
|
{
|
|
RISCVAttrs::PRIV_SPEC,
|
|
&ELFAttributeParser::integerAttribute,
|
|
},
|
|
{
|
|
RISCVAttrs::PRIV_SPEC_MINOR,
|
|
&ELFAttributeParser::integerAttribute,
|
|
},
|
|
{
|
|
RISCVAttrs::PRIV_SPEC_REVISION,
|
|
&ELFAttributeParser::integerAttribute,
|
|
},
|
|
{
|
|
RISCVAttrs::STACK_ALIGN,
|
|
&RISCVAttributeParser::stackAlign,
|
|
},
|
|
{
|
|
RISCVAttrs::UNALIGNED_ACCESS,
|
|
&RISCVAttributeParser::unalignedAccess,
|
|
}};
|
|
|
|
Error RISCVAttributeParser::unalignedAccess(unsigned tag) {
|
|
static const char *strings[] = {"No unaligned access", "Unaligned access"};
|
|
return parseStringAttribute("Unaligned_access", tag, ArrayRef(strings));
|
|
}
|
|
|
|
Error RISCVAttributeParser::stackAlign(unsigned tag) {
|
|
uint64_t value = de.getULEB128(cursor);
|
|
std::string description =
|
|
"Stack alignment is " + utostr(value) + std::string("-bytes");
|
|
printAttribute(tag, value, description);
|
|
return Error::success();
|
|
}
|
|
|
|
Error RISCVAttributeParser::handler(uint64_t tag, bool &handled) {
|
|
handled = false;
|
|
for (const auto &AH : displayRoutines) {
|
|
if (uint64_t(AH.attribute) == tag) {
|
|
if (Error e = (this->*AH.routine)(tag))
|
|
return e;
|
|
handled = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return Error::success();
|
|
}
|