aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Object
diff options
context:
space:
mode:
authorquic-areg <aregmi@quicinc.com>2024-03-19 16:22:30 -0500
committerGitHub <noreply@github.com>2024-03-19 16:22:30 -0500
commit31f4b329c8234fab9afa59494d7f8bdaeaefeaad (patch)
treea88023fe94f6377934295fd58a6aa127473afc52 /llvm/lib/Object
parente3030f1e1958a2be51822bacce764395c16e682a (diff)
downloadllvm-31f4b329c8234fab9afa59494d7f8bdaeaefeaad.zip
llvm-31f4b329c8234fab9afa59494d7f8bdaeaefeaad.tar.gz
llvm-31f4b329c8234fab9afa59494d7f8bdaeaefeaad.tar.bz2
[Hexagon] ELF attributes for Hexagon (#85359)
Defines a subset of attributes and emits them to a section called .hexagon.attributes. The current attributes recorded are the attributes needed by llvm-objdump to automatically determine target features and eliminate the need to manually pass features.
Diffstat (limited to 'llvm/lib/Object')
-rw-r--r--llvm/lib/Object/ELF.cpp5
-rw-r--r--llvm/lib/Object/ELFObjectFile.cpp78
2 files changed, 82 insertions, 1 deletions
diff --git a/llvm/lib/Object/ELF.cpp b/llvm/lib/Object/ELF.cpp
index 137f606..55dd0c8 100644
--- a/llvm/lib/Object/ELF.cpp
+++ b/llvm/lib/Object/ELF.cpp
@@ -251,7 +251,10 @@ StringRef llvm::object::getELFSectionTypeName(uint32_t Machine, unsigned Type) {
}
break;
case ELF::EM_HEXAGON:
- switch (Type) { STRINGIFY_ENUM_CASE(ELF, SHT_HEX_ORDERED); }
+ switch (Type) {
+ STRINGIFY_ENUM_CASE(ELF, SHT_HEX_ORDERED);
+ STRINGIFY_ENUM_CASE(ELF, SHT_HEXAGON_ATTRIBUTES);
+ }
break;
case ELF::EM_X86_64:
switch (Type) { STRINGIFY_ENUM_CASE(ELF, SHT_X86_64_UNWIND); }
diff --git a/llvm/lib/Object/ELFObjectFile.cpp b/llvm/lib/Object/ELFObjectFile.cpp
index 33be481..efec612 100644
--- a/llvm/lib/Object/ELFObjectFile.cpp
+++ b/llvm/lib/Object/ELFObjectFile.cpp
@@ -20,6 +20,7 @@
#include "llvm/Support/ARMAttributeParser.h"
#include "llvm/Support/ARMBuildAttributes.h"
#include "llvm/Support/ErrorHandling.h"
+#include "llvm/Support/HexagonAttributeParser.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/RISCVAttributeParser.h"
#include "llvm/Support/RISCVAttributes.h"
@@ -287,6 +288,81 @@ SubtargetFeatures ELFObjectFileBase::getARMFeatures() const {
return Features;
}
+static std::optional<std::string> hexagonAttrToFeatureString(unsigned Attr) {
+ switch (Attr) {
+ case 5:
+ return "v5";
+ case 55:
+ return "v55";
+ case 60:
+ return "v60";
+ case 62:
+ return "v62";
+ case 65:
+ return "v65";
+ case 67:
+ return "v67";
+ case 68:
+ return "v68";
+ case 69:
+ return "v69";
+ case 71:
+ return "v71";
+ case 73:
+ return "v73";
+ default:
+ return {};
+ }
+}
+
+SubtargetFeatures ELFObjectFileBase::getHexagonFeatures() const {
+ SubtargetFeatures Features;
+ HexagonAttributeParser Parser;
+ if (Error E = getBuildAttributes(Parser)) {
+ // Return no attributes if none can be read.
+ // This behavior is important for backwards compatibility.
+ consumeError(std::move(E));
+ return Features;
+ }
+ std::optional<unsigned> Attr;
+
+ if ((Attr = Parser.getAttributeValue(HexagonAttrs::ARCH))) {
+ if (std::optional<std::string> FeatureString =
+ hexagonAttrToFeatureString(*Attr))
+ Features.AddFeature(*FeatureString);
+ }
+
+ if ((Attr = Parser.getAttributeValue(HexagonAttrs::HVXARCH))) {
+ std::optional<std::string> FeatureString =
+ hexagonAttrToFeatureString(*Attr);
+ // There is no corresponding hvx arch for v5 and v55.
+ if (FeatureString && *Attr >= 60)
+ Features.AddFeature("hvx" + *FeatureString);
+ }
+
+ if ((Attr = Parser.getAttributeValue(HexagonAttrs::HVXIEEEFP)))
+ if (*Attr)
+ Features.AddFeature("hvx-ieee-fp");
+
+ if ((Attr = Parser.getAttributeValue(HexagonAttrs::HVXQFLOAT)))
+ if (*Attr)
+ Features.AddFeature("hvx-qfloat");
+
+ if ((Attr = Parser.getAttributeValue(HexagonAttrs::ZREG)))
+ if (*Attr)
+ Features.AddFeature("zreg");
+
+ if ((Attr = Parser.getAttributeValue(HexagonAttrs::AUDIO)))
+ if (*Attr)
+ Features.AddFeature("audio");
+
+ if ((Attr = Parser.getAttributeValue(HexagonAttrs::CABAC)))
+ if (*Attr)
+ Features.AddFeature("cabac");
+
+ return Features;
+}
+
Expected<SubtargetFeatures> ELFObjectFileBase::getRISCVFeatures() const {
SubtargetFeatures Features;
unsigned PlatformFlags = getPlatformFlags();
@@ -349,6 +425,8 @@ Expected<SubtargetFeatures> ELFObjectFileBase::getFeatures() const {
return getRISCVFeatures();
case ELF::EM_LOONGARCH:
return getLoongArchFeatures();
+ case ELF::EM_HEXAGON:
+ return getHexagonFeatures();
default:
return SubtargetFeatures();
}