[llvm] 6cfb4d4 - [llvm-readobj] Support dumping of MSP430 ELF attributes

Anton Korobeynikov via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 27 14:56:34 PDT 2021


Author: Jozef Lawrynowicz
Date: 2021-09-28T00:56:11+03:00
New Revision: 6cfb4d46bae1b571a56e530f0365fb0f3e3799da

URL: https://github.com/llvm/llvm-project/commit/6cfb4d46bae1b571a56e530f0365fb0f3e3799da
DIFF: https://github.com/llvm/llvm-project/commit/6cfb4d46bae1b571a56e530f0365fb0f3e3799da.diff

LOG: [llvm-readobj] Support dumping of MSP430 ELF attributes

The MSP430 ABI supports build attributes for specifying
the ISA, code model, data model and enum size in ELF object files.

Differential Revision: https://reviews.llvm.org/D107969

Added: 
    llvm/include/llvm/Support/MSP430AttributeParser.h
    llvm/include/llvm/Support/MSP430Attributes.h
    llvm/lib/Support/MSP430AttributeParser.cpp
    llvm/lib/Support/MSP430Attributes.cpp
    llvm/test/CodeGen/MSP430/build-attrs.ll
    llvm/test/tools/llvm-readobj/ELF/MSP430/build-attributes.test
    llvm/test/tools/llvm-readobj/ELF/MSP430/lit.local.cfg

Modified: 
    llvm/lib/Object/ELF.cpp
    llvm/lib/ObjectYAML/ELFYAML.cpp
    llvm/lib/Support/CMakeLists.txt
    llvm/lib/Target/MSP430/MCTargetDesc/MSP430ELFStreamer.cpp
    llvm/tools/llvm-readobj/ELFDumper.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/Support/MSP430AttributeParser.h b/llvm/include/llvm/Support/MSP430AttributeParser.h
new file mode 100644
index 0000000000000..bc9b214944708
--- /dev/null
+++ b/llvm/include/llvm/Support/MSP430AttributeParser.h
@@ -0,0 +1,44 @@
+//===-- MSP430AttributeParser.h - MSP430 Attribute Parser -------*- C++ -*-===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// This file contains support routines for parsing MSP430 ELF build attributes.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_SUPPORT_MSP430ATTRIBUTEPARSER_H
+#define LLVM_SUPPORT_MSP430ATTRIBUTEPARSER_H
+
+#include "llvm/Support/ELFAttributeParser.h"
+#include "llvm/Support/MSP430Attributes.h"
+
+namespace llvm {
+class MSP430AttributeParser : public ELFAttributeParser {
+  struct DisplayHandler {
+    MSP430Attrs::AttrType Attribute;
+    Error (MSP430AttributeParser::*Routine)(MSP430Attrs::AttrType);
+  };
+  static const std::array<DisplayHandler, 4> DisplayRoutines;
+
+  Error parseISA(MSP430Attrs::AttrType Tag);
+  Error parseCodeModel(MSP430Attrs::AttrType Tag);
+  Error parseDataModel(MSP430Attrs::AttrType Tag);
+  Error parseEnumSize(MSP430Attrs::AttrType Tag);
+
+  Error handler(uint64_t Tag, bool &Handled) override;
+
+public:
+  MSP430AttributeParser(ScopedPrinter *SW)
+      : ELFAttributeParser(SW, MSP430Attrs::getMSP430AttributeTags(),
+                           "mspabi") {}
+  MSP430AttributeParser()
+      : ELFAttributeParser(MSP430Attrs::getMSP430AttributeTags(), "mspabi") {}
+};
+} // namespace llvm
+
+#endif

diff  --git a/llvm/include/llvm/Support/MSP430Attributes.h b/llvm/include/llvm/Support/MSP430Attributes.h
new file mode 100644
index 0000000000000..fccd65e844c35
--- /dev/null
+++ b/llvm/include/llvm/Support/MSP430Attributes.h
@@ -0,0 +1,44 @@
+//===-- MSP430Attributes.h - MSP430 Attributes ------------------*- C++ -*-===//
+//
+// 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
+//
+//===-----------------------------------------------------------------------===//
+///
+/// \file
+/// This file contains enumerations for MSP430 ELF build attributes as
+/// defined in the MSP430 ELF psABI specification.
+///
+/// MSP430 ELF psABI specification
+///
+/// https://www.ti.com/lit/pdf/slaa534
+///
+//===----------------------------------------------------------------------===//
+#ifndef LLVM_SUPPORT_MSP430ATTRIBUTES_H
+#define LLVM_SUPPORT_MSP430ATTRIBUTES_H
+
+#include "llvm/Support/ELFAttributes.h"
+
+namespace llvm {
+namespace MSP430Attrs {
+
+const TagNameMap &getMSP430AttributeTags();
+
+enum AttrType : unsigned {
+  // Attribute types in ELF/.MSP430.attributes.
+  TagISA = 4,
+  TagCodeModel = 6,
+  TagDataModel = 8,
+  TagEnumSize = 10
+};
+
+enum ISA { ISAMSP430 = 1, ISAMSP430X = 2 };
+enum CodeModel { CMSmall = 1, CMLarge = 2 };
+enum DataModel { DMSmall = 1, DMLarge = 2, DMRestricted = 3 };
+enum EnumSize { ESSmall = 1, ESInteger = 2, ESDontCare = 3 };
+
+} // namespace MSP430Attrs
+} // namespace llvm
+
+#endif

diff  --git a/llvm/lib/Object/ELF.cpp b/llvm/lib/Object/ELF.cpp
index 1352f91d3223c..e9bf482465acd 100644
--- a/llvm/lib/Object/ELF.cpp
+++ b/llvm/lib/Object/ELF.cpp
@@ -246,6 +246,9 @@ StringRef llvm::object::getELFSectionTypeName(uint32_t Machine, unsigned Type) {
       STRINGIFY_ENUM_CASE(ELF, SHT_MIPS_ABIFLAGS);
     }
     break;
+  case ELF::EM_MSP430:
+    switch (Type) { STRINGIFY_ENUM_CASE(ELF, SHT_MSP430_ATTRIBUTES); }
+    break;
   case ELF::EM_RISCV:
     switch (Type) { STRINGIFY_ENUM_CASE(ELF, SHT_RISCV_ATTRIBUTES); }
     break;

diff  --git a/llvm/lib/ObjectYAML/ELFYAML.cpp b/llvm/lib/ObjectYAML/ELFYAML.cpp
index 50821544a687f..3edf500d2cf22 100644
--- a/llvm/lib/ObjectYAML/ELFYAML.cpp
+++ b/llvm/lib/ObjectYAML/ELFYAML.cpp
@@ -655,6 +655,9 @@ void ScalarEnumerationTraits<ELFYAML::ELF_SHT>::enumeration(
   case ELF::EM_RISCV:
     ECase(SHT_RISCV_ATTRIBUTES);
     break;
+  case ELF::EM_MSP430:
+    ECase(SHT_MSP430_ATTRIBUTES);
+    break;
   default:
     // Nothing to do.
     break;

diff  --git a/llvm/lib/Support/CMakeLists.txt b/llvm/lib/Support/CMakeLists.txt
index 014b4a2caf156..e97e183ca073f 100644
--- a/llvm/lib/Support/CMakeLists.txt
+++ b/llvm/lib/Support/CMakeLists.txt
@@ -171,6 +171,8 @@ add_llvm_component_library(LLVMSupport
   MemoryBuffer.cpp
   MemoryBufferRef.cpp
   MD5.cpp
+  MSP430Attributes.cpp
+  MSP430AttributeParser.cpp
   NativeFormatting.cpp
   OptimizedStructLayout.cpp
   Optional.cpp

diff  --git a/llvm/lib/Support/MSP430AttributeParser.cpp b/llvm/lib/Support/MSP430AttributeParser.cpp
new file mode 100644
index 0000000000000..a9948a158fc01
--- /dev/null
+++ b/llvm/lib/Support/MSP430AttributeParser.cpp
@@ -0,0 +1,53 @@
+//===-- MSP430AttributeParser.cpp - MSP430 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/MSP430AttributeParser.h"
+#include "llvm/ADT/StringExtras.h"
+
+using namespace llvm;
+using namespace llvm::MSP430Attrs;
+
+constexpr std::array<MSP430AttributeParser::DisplayHandler, 4>
+    MSP430AttributeParser::DisplayRoutines{
+        {{MSP430Attrs::TagISA, &MSP430AttributeParser::parseISA},
+         {MSP430Attrs::TagCodeModel, &MSP430AttributeParser::parseCodeModel},
+         {MSP430Attrs::TagDataModel, &MSP430AttributeParser::parseDataModel},
+         {MSP430Attrs::TagEnumSize, &MSP430AttributeParser::parseEnumSize}}};
+
+Error MSP430AttributeParser::parseISA(AttrType Tag) {
+  static const char *StringVals[] = {"None", "MSP430", "MSP430X"};
+  return parseStringAttribute("ISA", Tag, makeArrayRef(StringVals));
+}
+
+Error MSP430AttributeParser::parseCodeModel(AttrType Tag) {
+  static const char *StringVals[] = {"None", "Small", "Large"};
+  return parseStringAttribute("Code Model", Tag, makeArrayRef(StringVals));
+}
+
+Error MSP430AttributeParser::parseDataModel(AttrType Tag) {
+  static const char *StringVals[] = {"None", "Small", "Large", "Restricted"};
+  return parseStringAttribute("Data Model", Tag, makeArrayRef(StringVals));
+}
+
+Error MSP430AttributeParser::parseEnumSize(AttrType Tag) {
+  static const char *StringVals[] = {"None", "Small", "Integer", "Don't Care"};
+  return parseStringAttribute("Enum Size", Tag, makeArrayRef(StringVals));
+}
+
+Error MSP430AttributeParser::handler(uint64_t Tag, bool &Handled) {
+  Handled = false;
+  for (const DisplayHandler &Disp : DisplayRoutines) {
+    if (uint64_t(Disp.Attribute) != Tag)
+      continue;
+    if (Error E = (this->*Disp.Routine)(static_cast<AttrType>(Tag)))
+      return E;
+    Handled = true;
+    break;
+  }
+  return Error::success();
+}

diff  --git a/llvm/lib/Support/MSP430Attributes.cpp b/llvm/lib/Support/MSP430Attributes.cpp
new file mode 100644
index 0000000000000..4483a68725593
--- /dev/null
+++ b/llvm/lib/Support/MSP430Attributes.cpp
@@ -0,0 +1,22 @@
+//===-- MSP430Attributes.cpp - MSP430 Attributes --------------------------===//
+//
+// 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/MSP430Attributes.h"
+
+using namespace llvm;
+using namespace llvm::MSP430Attrs;
+
+static constexpr TagNameItem TagData[] = {{TagISA, "Tag_ISA"},
+                                          {TagCodeModel, "Tag_Code_Model"},
+                                          {TagDataModel, "Tag_Data_Model"},
+                                          {TagEnumSize, "Tag_Enum_Size"}};
+
+constexpr TagNameMap MSP430AttributeTags{TagData};
+const TagNameMap &llvm::MSP430Attrs::getMSP430AttributeTags() {
+  return MSP430AttributeTags;
+}

diff  --git a/llvm/lib/Target/MSP430/MCTargetDesc/MSP430ELFStreamer.cpp b/llvm/lib/Target/MSP430/MCTargetDesc/MSP430ELFStreamer.cpp
index 87ee312424c8c..087045ccb1df1 100644
--- a/llvm/lib/Target/MSP430/MCTargetDesc/MSP430ELFStreamer.cpp
+++ b/llvm/lib/Target/MSP430/MCTargetDesc/MSP430ELFStreamer.cpp
@@ -17,8 +17,10 @@
 #include "llvm/MC/MCSectionELF.h"
 #include "llvm/MC/MCStreamer.h"
 #include "llvm/MC/MCSubtargetInfo.h"
+#include "llvm/Support/MSP430Attributes.h"
 
 using namespace llvm;
+using namespace llvm::MSP430Attrs;
 
 namespace llvm {
 
@@ -54,15 +56,14 @@ MSP430TargetELFStreamer::MSP430TargetELFStreamer(MCStreamer &S,
   Streamer.emitInt8(1);
   // Attribute vector length.
   Streamer.emitInt32(11);
-  // OFBA_MSPABI_Tag_ISA(4) = 1, MSP430
-  Streamer.emitInt8(4);
-  Streamer.emitInt8(1);
-  // OFBA_MSPABI_Tag_Code_Model(6) = 1, Small
-  Streamer.emitInt8(6);
-  Streamer.emitInt8(1);
-  // OFBA_MSPABI_Tag_Data_Model(8) = 1, Small
-  Streamer.emitInt8(8);
-  Streamer.emitInt8(1);
+
+  Streamer.emitInt8(TagISA);
+  Streamer.emitInt8(STI.hasFeature(MSP430::FeatureX) ? ISAMSP430X : ISAMSP430);
+  Streamer.emitInt8(TagCodeModel);
+  Streamer.emitInt8(CMSmall);
+  Streamer.emitInt8(TagDataModel);
+  Streamer.emitInt8(DMSmall);
+  // Don't emit TagEnumSize, for full GCC compatibility.
 }
 
 MCELFStreamer &MSP430TargetELFStreamer::getStreamer() {

diff  --git a/llvm/test/CodeGen/MSP430/build-attrs.ll b/llvm/test/CodeGen/MSP430/build-attrs.ll
new file mode 100644
index 0000000000000..48e999db8a7ea
--- /dev/null
+++ b/llvm/test/CodeGen/MSP430/build-attrs.ll
@@ -0,0 +1,41 @@
+; Test that the -mcpu= option sets the correct ELF build attributes.
+
+; RUN: llc -mtriple=msp430 -filetype=obj < %s \
+; RUN:   | llvm-readelf -A - | FileCheck %s --check-prefixes COMMON,MSP430,SMALL
+; RUN: llc -mtriple=msp430 -mcpu=generic -filetype=obj < %s \
+; RUN:   | llvm-readelf -A - | FileCheck %s --check-prefixes COMMON,MSP430,SMALL
+; RUN: llc -mtriple=msp430 -mcpu=msp430 -filetype=obj < %s \
+; RUN:   | llvm-readelf -A - | FileCheck %s --check-prefixes COMMON,MSP430,SMALL
+; RUN: llc -mtriple=msp430 -mcpu=msp430x -filetype=obj < %s \
+; RUN:   | llvm-readelf -A - | FileCheck %s --check-prefixes COMMON,MSP430X,SMALL
+
+; COMMON: BuildAttributes {
+; COMMON: FormatVersion: 0x41
+; COMMON:   SectionLength: 22
+; COMMON:   Vendor: mspabi
+; COMMON:   Tag: Tag_File (0x1)
+; COMMON:   Size: 11
+
+; MSP430:      Tag: 4
+; MSP430-NEXT: Value: 1
+; MSP430-NEXT: TagName: ISA
+; MSP430-NEXT: Description: MSP430
+
+; MSP430X:      Tag: 4
+; MSP430X-NEXT: Value: 2
+; MSP430X-NEXT: TagName: ISA
+; MSP430X-NEXT: Description: MSP430X
+
+; SMALL:      Tag: 6
+; SMALL-NEXT: Value: 1
+; SMALL-NEXT: TagName: Code_Model
+; SMALL-NEXT: Description: Small
+
+; SMALL:      Tag: 8
+; SMALL-NEXT: Value: 1
+; SMALL-NEXT: TagName: Data_Model
+; SMALL-NEXT: Description: Small
+
+define void @foo() {
+  ret void
+}

diff  --git a/llvm/test/tools/llvm-readobj/ELF/MSP430/build-attributes.test b/llvm/test/tools/llvm-readobj/ELF/MSP430/build-attributes.test
new file mode 100644
index 0000000000000..ba2779446e527
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/MSP430/build-attributes.test
@@ -0,0 +1,217 @@
+## Validate MSPABI ELF Build Attributes
+
+## The header of .MSP430.attributes can be specified with.
+##  ContentArray: [ 0x41, 0x16, 0x00, 0x00, 0x00, 0x6D, 0x73, 0x70, 0x61, 0x62,
+##  0x69, 0x00, 0x01, 0x0b, 0x00, 0x00, 0x00,
+##
+## Following that are individual bytes describing the ISA, code model, data
+## model and optionally enum size.
+##
+## If enum size is being tested, then the second byte (indicating the length of
+## the section), and last 32-bit int (indicating the length of the
+## subsection) of the header should be incremented by 2. This is to account for
+## the additional bytes for the enum size tag and value.
+
+# HEADER:        BuildAttributes {
+# HEADER-NEXT:   FormatVersion: 0x41
+# HEADER-NEXT:   Section 1 {
+# HEADER-NEXT:   SectionLength: 22
+# HEADER-NEXT:   Vendor: mspabi
+# HEADER-NEXT:   Tag: Tag_File (0x1)
+# HEADER-NEXT:   Size: 11
+
+# ENUM-HEADER:        BuildAttributes {
+# ENUM-HEADER-NEXT:   FormatVersion: 0x41
+# ENUM-HEADER-NEXT:   Section 1 {
+# ENUM-HEADER-NEXT:   SectionLength: 24
+# ENUM-HEADER-NEXT:   Vendor: mspabi
+# ENUM-HEADER-NEXT:   Tag: Tag_File (0x1)
+# ENUM-HEADER-NEXT:   Size: 13
+
+# MSP430:      Tag: 4
+# MSP430-NEXT: Value: 1
+# MSP430-NEXT: TagName: ISA
+# MSP430-NEXT: Description: MSP430
+
+# MSP430X:      Tag: 4
+# MSP430X-NEXT: Value: 2
+# MSP430X-NEXT: TagName: ISA
+# MSP430X-NEXT: Description: MSP430X
+
+# SMALL-CODE:      Tag: 6
+# SMALL-CODE-NEXT: Value: 1
+# SMALL-CODE-NEXT: TagName: Code_Model
+# SMALL-CODE-NEXT: Description: Small
+
+# LARGE-CODE:      Tag: 6
+# LARGE-CODE-NEXT: Value: 2
+# LARGE-CODE-NEXT: TagName: Code_Model
+# LARGE-CODE-NEXT: Description: Large
+
+# SMALL-DATA:      Tag: 8
+# SMALL-DATA-NEXT: Value: 1
+# SMALL-DATA-NEXT: TagName: Data_Model
+# SMALL-DATA-NEXT: Description: Small
+
+# LARGE-DATA:      Tag: 8
+# LARGE-DATA-NEXT: Value: 2
+# LARGE-DATA-NEXT: TagName: Data_Model
+# LARGE-DATA-NEXT: Description: Large
+
+# RESTRICTED-DATA:      Tag: 8
+# RESTRICTED-DATA-NEXT: Value: 3
+# RESTRICTED-DATA-NEXT: TagName: Data_Model
+# RESTRICTED-DATA-NEXT: Description: Restricted
+
+# SMALL-ENUM:      Tag: 10
+# SMALL-ENUM-NEXT: Value: 1
+# SMALL-ENUM-NEXT: TagName: Enum_Size
+# SMALL-ENUM-NEXT: Description: Small
+
+# INTEGER-ENUM:      Tag: 10
+# INTEGER-ENUM-NEXT: Value: 2
+# INTEGER-ENUM-NEXT: TagName: Enum_Size
+# INTEGER-ENUM-NEXT: Description: Integer
+
+# DONT-CARE-ENUM:      Tag: 10
+# DONT-CARE-ENUM-NEXT: Value: 3
+# DONT-CARE-ENUM-NEXT: TagName: Enum_Size
+# DONT-CARE-ENUM-NEXT: Description: Don't Care
+
+## MSP430 ISA
+# RUN: yaml2obj --docnum=1 %s -o %t.o
+# RUN: llvm-readobj -A %t.o | FileCheck %s --check-prefixes HEADER,MSP430,SMALL-CODE,SMALL-DATA
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS32
+  Data:    ELFDATA2LSB
+  Type:    ET_REL
+  Machine: EM_MSP430
+Sections:
+  - Name: .MSP430.attributes
+    Type: SHT_MSP430_ATTRIBUTES
+    ContentArray: [ 0x41, 0x16, 0x00, 0x00, 0x00, 0x6D, 0x73, 0x70, 0x61, 0x62,
+    0x69, 0x00, 0x01, 0x0b, 0x00, 0x00, 0x00,
+    0x04, 0x01, 0x06, 0x01, 0x08, 0x01 ]
+
+
+## MSP430X ISA, Small Code Model, Small Data Model
+# RUN: yaml2obj --docnum=2 %s -o %t.o
+# RUN: llvm-readobj -A %t.o | FileCheck %s --check-prefixes HEADER,MSP430X,SMALL-CODE,SMALL-DATA
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS32
+  Data:    ELFDATA2LSB
+  Type:    ET_REL
+  Machine: EM_MSP430
+Sections:
+  - Name: .MSP430.attributes
+    Type: SHT_MSP430_ATTRIBUTES
+    ContentArray: [ 0x41, 0x16, 0x00, 0x00, 0x00, 0x6D, 0x73, 0x70, 0x61, 0x62,
+    0x69, 0x00, 0x01, 0x0b, 0x00, 0x00, 0x00,
+    0x04, 0x02, 0x06, 0x01, 0x08, 0x01 ]
+
+## MSP430X Large Code Model, Small Data Model
+# RUN: yaml2obj --docnum=3 %s -o %t.o
+# RUN: llvm-readobj -A %t.o | FileCheck %s --check-prefixes HEADER,MSP430X,LARGE-CODE,SMALL-DATA
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS32
+  Data:    ELFDATA2LSB
+  Type:    ET_REL
+  Machine: EM_MSP430
+Sections:
+  - Name: .MSP430.attributes
+    Type: SHT_MSP430_ATTRIBUTES
+    ContentArray: [ 0x41, 0x16, 0x00, 0x00, 0x00, 0x6D, 0x73, 0x70, 0x61, 0x62,
+    0x69, 0x00, 0x01, 0x0b, 0x00, 0x00, 0x00,
+    0x04, 0x02, 0x06, 0x02, 0x08, 0x01 ]
+
+## MSP430X Small Code Model, Large Data Model
+# RUN: yaml2obj --docnum=4 %s -o %t.o
+# RUN: llvm-readobj -A %t.o | FileCheck %s --check-prefixes HEADER,MSP430X,SMALL-CODE,LARGE-DATA
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS32
+  Data:    ELFDATA2LSB
+  Type:    ET_REL
+  Machine: EM_MSP430
+Sections:
+  - Name: .MSP430.attributes
+    Type: SHT_MSP430_ATTRIBUTES
+    ContentArray: [ 0x41, 0x16, 0x00, 0x00, 0x00, 0x6D, 0x73, 0x70, 0x61, 0x62,
+    0x69, 0x00, 0x01, 0x0b, 0x00, 0x00, 0x00,
+    0x04, 0x02, 0x06, 0x01, 0x08, 0x02 ]
+
+## MSP430X Small Code Model, Restricted Data Model
+# RUN: yaml2obj --docnum=5 %s -o %t.o
+# RUN: llvm-readobj -A %t.o | FileCheck %s --check-prefixes HEADER,MSP430X,SMALL-CODE,RESTRICTED-DATA
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS32
+  Data:    ELFDATA2LSB
+  Type:    ET_REL
+  Machine: EM_MSP430
+Sections:
+  - Name: .MSP430.attributes
+    Type: SHT_MSP430_ATTRIBUTES
+    ContentArray: [ 0x41, 0x16, 0x00, 0x00, 0x00, 0x6D, 0x73, 0x70, 0x61, 0x62,
+    0x69, 0x00, 0x01, 0x0b, 0x00, 0x00, 0x00,
+    0x04, 0x02, 0x06, 0x01, 0x08, 0x03 ]
+
+## MSP430X Small Code Model, Small Data Model, Small Enums
+# RUN: yaml2obj --docnum=6 %s -o %t.o
+# RUN: llvm-readobj -A %t.o | FileCheck %s --check-prefixes ENUM-HEADER,MSP430X,SMALL-CODE,SMALL-DATA,SMALL-ENUM
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS32
+  Data:    ELFDATA2LSB
+  Type:    ET_REL
+  Machine: EM_MSP430
+Sections:
+  - Name: .MSP430.attributes
+    Type: SHT_MSP430_ATTRIBUTES
+    ContentArray: [ 0x41, 0x18, 0x00, 0x00, 0x00, 0x6D, 0x73, 0x70, 0x61, 0x62,
+    0x69, 0x00, 0x01, 0x0d, 0x00, 0x00, 0x00,
+    0x04, 0x02, 0x06, 0x01, 0x08, 0x01, 0x0a, 0x01 ]
+
+## MSP430X Small Code Model, Small Data Model, Integer Enums
+# RUN: yaml2obj --docnum=7 %s -o %t.o
+# RUN: llvm-readobj -A %t.o | FileCheck %s --check-prefixes ENUM-HEADER,MSP430X,SMALL-CODE,SMALL-DATA,INTEGER-ENUM
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS32
+  Data:    ELFDATA2LSB
+  Type:    ET_REL
+  Machine: EM_MSP430
+Sections:
+  - Name: .MSP430.attributes
+    Type: SHT_MSP430_ATTRIBUTES
+    ContentArray: [ 0x41, 0x18, 0x00, 0x00, 0x00, 0x6D, 0x73, 0x70, 0x61, 0x62,
+    0x69, 0x00, 0x01, 0x0d, 0x00, 0x00, 0x00,
+    0x04, 0x02, 0x06, 0x01, 0x08, 0x01, 0x0a, 0x02 ]
+
+
+## MSP430X Small Code Model, Small Data Model, "Don't Care" Enums
+# RUN: yaml2obj --docnum=8 %s -o %t.o
+# RUN: llvm-readobj -A %t.o | FileCheck %s --check-prefixes ENUM-HEADER,MSP430X,SMALL-CODE,SMALL-DATA,DONT-CARE-ENUM
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS32
+  Data:    ELFDATA2LSB
+  Type:    ET_REL
+  Machine: EM_MSP430
+Sections:
+  - Name: .MSP430.attributes
+    Type: SHT_MSP430_ATTRIBUTES
+    ContentArray: [ 0x41, 0x18, 0x00, 0x00, 0x00, 0x6D, 0x73, 0x70, 0x61, 0x62,
+    0x69, 0x00, 0x01, 0x0d, 0x00, 0x00, 0x00,
+    0x04, 0x02, 0x06, 0x01, 0x08, 0x01, 0x0a, 0x03 ]

diff  --git a/llvm/test/tools/llvm-readobj/ELF/MSP430/lit.local.cfg b/llvm/test/tools/llvm-readobj/ELF/MSP430/lit.local.cfg
new file mode 100644
index 0000000000000..4ad9495c56fce
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/MSP430/lit.local.cfg
@@ -0,0 +1,2 @@
+if not 'MSP430' in config.root.targets:
+    config.unsupported = True

diff  --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp
index 273fa8ae9b439..56fd7c74d5072 100644
--- a/llvm/tools/llvm-readobj/ELFDumper.cpp
+++ b/llvm/tools/llvm-readobj/ELFDumper.cpp
@@ -49,6 +49,8 @@
 #include "llvm/Support/FormatVariadic.h"
 #include "llvm/Support/FormattedStream.h"
 #include "llvm/Support/LEB128.h"
+#include "llvm/Support/MSP430AttributeParser.h"
+#include "llvm/Support/MSP430Attributes.h"
 #include "llvm/Support/MathExtras.h"
 #include "llvm/Support/MipsABIFlags.h"
 #include "llvm/Support/RISCVAttributeParser.h"
@@ -2575,6 +2577,11 @@ template <class ELFT> void ELFDumper<ELFT>::printArchSpecificInfo() {
       reportUniqueWarning("attribute printing not implemented for big-endian "
                           "RISC-V objects");
     break;
+  case EM_MSP430:
+    printAttributes(ELF::SHT_MSP430_ATTRIBUTES,
+                    std::make_unique<MSP430AttributeParser>(&W),
+                    support::little);
+    break;
   case EM_MIPS: {
     printMipsABIFlags();
     printMipsOptions();


        


More information about the llvm-commits mailing list