[llvm] [llvm-objdump][AVR] Detect AVR architecture from ELF flags for disassembling (PR #174731)

Ruoyu Qiu via llvm-commits llvm-commits at lists.llvm.org
Sun Jan 18 03:44:58 PST 2026


https://github.com/cabbaken updated https://github.com/llvm/llvm-project/pull/174731

>From aad76db8c3278e40c82b191504430f981bb0c9ca Mon Sep 17 00:00:00 2001
From: RuoyuQiu <cabbaken at outlook.com>
Date: Wed, 7 Jan 2026 09:56:57 +0000
Subject: [PATCH 1/7] GNU objdump disassembles all unknown instructions by
 default. Match this user friendly behavior with the target feature "special"
 designed for disassemblers.

Signed-off-by: RuoyuQiu <cabbaken at outlook.com>
---
 llvm/include/llvm/TargetParser/Triple.h      |  2 ++
 llvm/test/tools/llvm-objdump/ELF/AVR/mattr.s | 22 ++++++++++++++++++++
 llvm/tools/llvm-objdump/llvm-objdump.cpp     |  2 ++
 3 files changed, 26 insertions(+)
 create mode 100644 llvm/test/tools/llvm-objdump/ELF/AVR/mattr.s

diff --git a/llvm/include/llvm/TargetParser/Triple.h b/llvm/include/llvm/TargetParser/Triple.h
index e8aa43a2337c7..8320f2d569fc5 100644
--- a/llvm/include/llvm/TargetParser/Triple.h
+++ b/llvm/include/llvm/TargetParser/Triple.h
@@ -1043,6 +1043,8 @@ class Triple {
                : PointerWidth == 64;
   }
 
+  bool isAVR() const { return getArch() == Triple::avr; }
+
   /// Tests whether the target is 32-bit LoongArch.
   bool isLoongArch32() const { return getArch() == Triple::loongarch32; }
 
diff --git a/llvm/test/tools/llvm-objdump/ELF/AVR/mattr.s b/llvm/test/tools/llvm-objdump/ELF/AVR/mattr.s
new file mode 100644
index 0000000000000..e438095bc4a77
--- /dev/null
+++ b/llvm/test/tools/llvm-objdump/ELF/AVR/mattr.s
@@ -0,0 +1,22 @@
+## When --mattr and --mcpu are both empty, disassemble all known instructions.
+# RUN: llvm-mc -filetype=obj -triple=avr -mattr=+special %s -o %t
+# RUN: llvm-objdump -d --no-show-raw-insn %t | FileCheck %s --check-prefixes=CHECK,ALL
+
+## If --mattr or --mcpu is specified, don't default to --mattr=+special.
+# RUN: llvm-objdump -d --no-show-raw-insn --mattr=+avr2 %t | FileCheck %s --check-prefixes=CHECK,UNKNOWN
+# RUN: llvm-objdump -d --no-show-raw-insn --mcpu=avr2 %t | FileCheck %s --check-prefixes=CHECK,UNKNOWN
+
+# CHECK-LABEL: <_start>:
+# ALL-NEXT:      call    0x0
+# ALL-NEXT:      jmp     0x0
+# ALL-NEXT:      rjmp    .-2
+# UNKNOWN-COUNT-2: <unknown>
+# UNKNOWN:       rjmp    .-2
+
+.globl _start
+_start:
+; Valid in avr3, Invalid in avr2
+    call  dummp_symbol
+    jmp   dummp_symbol
+; Valid in both
+    rjmp  dummp_symbol
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp
index 29173b765f386..32599c809b864 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -2689,6 +2689,8 @@ static void disassembleObject(ObjectFile *Obj, bool InlineRelocs,
       Features.AddFeature(MAttrs[I]);
   } else if (MCPU.empty() && Obj->makeTriple().isAArch64()) {
     Features.AddFeature("+all");
+  } else if (MCPU.empty() && Obj->makeTriple().isAVR()) {
+    Features.AddFeature("+special");
   }
 
   if (MCPU.empty())

>From 9602a5796c0d468239c5785d7bb6f2892c69858c Mon Sep 17 00:00:00 2001
From: Ruoyu Qiu <cabbaken at outlook.com>
Date: Wed, 7 Jan 2026 11:48:42 +0000
Subject: [PATCH 2/7] Fix misspelling

Signed-off-by: Ruoyu Qiu <cabbaken at outlook.com>
---
 llvm/test/tools/llvm-objdump/ELF/AVR/mattr.s | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/llvm/test/tools/llvm-objdump/ELF/AVR/mattr.s b/llvm/test/tools/llvm-objdump/ELF/AVR/mattr.s
index e438095bc4a77..512a899f02e16 100644
--- a/llvm/test/tools/llvm-objdump/ELF/AVR/mattr.s
+++ b/llvm/test/tools/llvm-objdump/ELF/AVR/mattr.s
@@ -16,7 +16,7 @@
 .globl _start
 _start:
 ; Valid in avr3, Invalid in avr2
-    call  dummp_symbol
-    jmp   dummp_symbol
+    call  foo
+    jmp   foo
 ; Valid in both
-    rjmp  dummp_symbol
+    rjmp  foo

>From 230351019c18a5ebebe20556dd7ec069e2629925 Mon Sep 17 00:00:00 2001
From: RuoyuQiu <cabbaken at outlook.com>
Date: Fri, 16 Jan 2026 08:33:30 +0000
Subject: [PATCH 3/7] Optimize format of test file

Signed-off-by: RuoyuQiu <cabbaken at outlook.com>
---
 llvm/test/tools/llvm-objdump/ELF/AVR/mattr.s | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/llvm/test/tools/llvm-objdump/ELF/AVR/mattr.s b/llvm/test/tools/llvm-objdump/ELF/AVR/mattr.s
index 512a899f02e16..a1d81fbcc7497 100644
--- a/llvm/test/tools/llvm-objdump/ELF/AVR/mattr.s
+++ b/llvm/test/tools/llvm-objdump/ELF/AVR/mattr.s
@@ -1,15 +1,17 @@
 ## When --mattr and --mcpu are both empty, disassemble all known instructions.
 # RUN: llvm-mc -filetype=obj -triple=avr -mattr=+special %s -o %t
-# RUN: llvm-objdump -d --no-show-raw-insn %t | FileCheck %s --check-prefixes=CHECK,ALL
+# RUN: llvm-objdump -d --no-show-raw-insn %t | FileCheck %s --check-prefixes=ALL
 
-## If --mattr or --mcpu is specified, don't default to --mattr=+special.
-# RUN: llvm-objdump -d --no-show-raw-insn --mattr=+avr2 %t | FileCheck %s --check-prefixes=CHECK,UNKNOWN
-# RUN: llvm-objdump -d --no-show-raw-insn --mcpu=avr2 %t | FileCheck %s --check-prefixes=CHECK,UNKNOWN
-
-# CHECK-LABEL: <_start>:
+# ALL: <_start>:
 # ALL-NEXT:      call    0x0
 # ALL-NEXT:      jmp     0x0
 # ALL-NEXT:      rjmp    .-2
+
+## If --mattr or --mcpu is specified, don't default to --mattr=+special.
+# RUN: llvm-objdump -d --no-show-raw-insn --mattr=+avr2 %t | FileCheck %s --check-prefixes=UNKNOWN
+# RUN: llvm-objdump -d --no-show-raw-insn --mcpu=avr2 %t | FileCheck %s --check-prefixes=UNKNOWN
+
+# UNKNOWN: <_start>:
 # UNKNOWN-COUNT-2: <unknown>
 # UNKNOWN:       rjmp    .-2
 

>From c9645f7be26e52de57dddccf1dfd8b1609a02ada Mon Sep 17 00:00:00 2001
From: RuoyuQiu <cabbaken at outlook.com>
Date: Fri, 16 Jan 2026 08:48:40 +0000
Subject: [PATCH 4/7] Fix format of test file again

Signed-off-by: RuoyuQiu <cabbaken at outlook.com>
---
 llvm/test/tools/llvm-objdump/ELF/AVR/mattr.s | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/llvm/test/tools/llvm-objdump/ELF/AVR/mattr.s b/llvm/test/tools/llvm-objdump/ELF/AVR/mattr.s
index a1d81fbcc7497..55c4dfb8309ab 100644
--- a/llvm/test/tools/llvm-objdump/ELF/AVR/mattr.s
+++ b/llvm/test/tools/llvm-objdump/ELF/AVR/mattr.s
@@ -2,18 +2,18 @@
 # RUN: llvm-mc -filetype=obj -triple=avr -mattr=+special %s -o %t
 # RUN: llvm-objdump -d --no-show-raw-insn %t | FileCheck %s --check-prefixes=ALL
 
-# ALL: <_start>:
-# ALL-NEXT:      call    0x0
-# ALL-NEXT:      jmp     0x0
-# ALL-NEXT:      rjmp    .-2
+# ALL:      <_start>:
+# ALL-NEXT:   call    0x0
+# ALL-NEXT:   jmp     0x0
+# ALL-NEXT:   rjmp    .-2
 
 ## If --mattr or --mcpu is specified, don't default to --mattr=+special.
 # RUN: llvm-objdump -d --no-show-raw-insn --mattr=+avr2 %t | FileCheck %s --check-prefixes=UNKNOWN
 # RUN: llvm-objdump -d --no-show-raw-insn --mcpu=avr2 %t | FileCheck %s --check-prefixes=UNKNOWN
 
-# UNKNOWN: <_start>:
-# UNKNOWN-COUNT-2: <unknown>
-# UNKNOWN:       rjmp    .-2
+# UNKNOWN:         <_start>:
+# UNKNOWN-COUNT-2:   <unknown>
+# UNKNOWN:           rjmp    .-2
 
 .globl _start
 _start:

>From 3403f01a2ac95370c1a07c1e28cb6d05131b4f2f Mon Sep 17 00:00:00 2001
From: Ruoyu Qiu <cabbaken at outlook.com>
Date: Sun, 18 Jan 2026 00:58:51 +0800
Subject: [PATCH 5/7] Disassemble elf with EFlag-derived feature

Signed-off-by: Ruoyu Qiu <cabbaken at outlook.com>
---
 .../llvm/TargetParser/AVRTargetParser.h       | 27 ++++++++++
 llvm/lib/TargetParser/AVRTargetParser.cpp     | 45 +++++++++++++++++
 llvm/lib/TargetParser/CMakeLists.txt          |  1 +
 llvm/test/tools/llvm-objdump/ELF/AVR/mattr.s  | 24 ---------
 .../tools/llvm-objdump/ELF/AVR/mattr.test     | 50 +++++++++++++++++++
 llvm/tools/llvm-objdump/llvm-objdump.cpp      |  7 ++-
 6 files changed, 129 insertions(+), 25 deletions(-)
 create mode 100644 llvm/include/llvm/TargetParser/AVRTargetParser.h
 create mode 100644 llvm/lib/TargetParser/AVRTargetParser.cpp
 delete mode 100644 llvm/test/tools/llvm-objdump/ELF/AVR/mattr.s
 create mode 100644 llvm/test/tools/llvm-objdump/ELF/AVR/mattr.test

diff --git a/llvm/include/llvm/TargetParser/AVRTargetParser.h b/llvm/include/llvm/TargetParser/AVRTargetParser.h
new file mode 100644
index 0000000000000..e00db9c9c0b49
--- /dev/null
+++ b/llvm/include/llvm/TargetParser/AVRTargetParser.h
@@ -0,0 +1,27 @@
+//===-- AVRTargetParser - Parser for AVR target features --------*- 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
+//
+//===----------------------------------------------------------------------===//
+//
+// This file implements a target parser to recognise AVR hardware features
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_TARGETPARSER_AVRTARGETPARSER_H
+#define LLVM_TARGETPARSER_AVRTARGETPARSER_H
+
+#include "llvm/ADT/StringRef.h"
+#include <string>
+
+namespace llvm {
+
+namespace AVR {
+
+LLVM_ABI std::string getFeatureSetForEFlag(unsigned EFlag);
+
+} // namespace AVR
+} // namespace llvm
+#endif
diff --git a/llvm/lib/TargetParser/AVRTargetParser.cpp b/llvm/lib/TargetParser/AVRTargetParser.cpp
new file mode 100644
index 0000000000000..38cb556af8442
--- /dev/null
+++ b/llvm/lib/TargetParser/AVRTargetParser.cpp
@@ -0,0 +1,45 @@
+//===-- AVRTargetParser - Parser for AVR target features --------*- 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
+//
+//===----------------------------------------------------------------------===//
+//
+// This file implements a target parser to recognise AVR hardware features
+//
+//===----------------------------------------------------------------------===//
+#include "llvm/TargetParser/AVRTargetParser.h"
+#include "llvm/BinaryFormat/ELF.h"
+#include <map>
+
+using namespace llvm;
+
+std::string AVR::getFeatureSetForEFlag(unsigned EFlag) {
+  static std::map<unsigned, StringRef> EFlagToFeatureSet = {
+      {ELF::EF_AVR_ARCH_AVR1, "avr1"},
+      {ELF::EF_AVR_ARCH_AVR2, "avr2"},
+      {ELF::EF_AVR_ARCH_AVR25, "avr25"},
+      {ELF::EF_AVR_ARCH_AVR3, "avr3"},
+      {ELF::EF_AVR_ARCH_AVR31, "avr31"},
+      {ELF::EF_AVR_ARCH_AVR35, "avr35"},
+      {ELF::EF_AVR_ARCH_AVR4, "avr4"},
+      {ELF::EF_AVR_ARCH_AVR5, "avr5"},
+      {ELF::EF_AVR_ARCH_AVR51, "avr51"},
+      {ELF::EF_AVR_ARCH_AVR6, "avr6"},
+      {ELF::EF_AVR_ARCH_AVRTINY, "avrtiny"},
+      {ELF::EF_AVR_ARCH_XMEGA1, "xmega1"},
+      {ELF::EF_AVR_ARCH_XMEGA2, "xmega2"},
+      {ELF::EF_AVR_ARCH_XMEGA3, "xmega3"},
+      {ELF::EF_AVR_ARCH_XMEGA4, "xmega4"},
+      {ELF::EF_AVR_ARCH_XMEGA5, "xmegau"},
+      {ELF::EF_AVR_ARCH_XMEGA6, "xmegau"},
+      {ELF::EF_AVR_ARCH_XMEGA7, "xmegau"},
+  };
+
+  auto It = EFlagToFeatureSet.find(EFlag);
+  if (It != EFlagToFeatureSet.end())
+    return It->second.str();
+
+  return "special";
+}
diff --git a/llvm/lib/TargetParser/CMakeLists.txt b/llvm/lib/TargetParser/CMakeLists.txt
index e1a30199e1ade..8d474497f5308 100644
--- a/llvm/lib/TargetParser/CMakeLists.txt
+++ b/llvm/lib/TargetParser/CMakeLists.txt
@@ -17,6 +17,7 @@ add_llvm_component_library(LLVMTargetParser
   AArch64TargetParser.cpp
   ARMTargetParserCommon.cpp
   ARMTargetParser.cpp
+  AVRTargetParser.cpp
   CSKYTargetParser.cpp
   Host.cpp
   LoongArchTargetParser.cpp
diff --git a/llvm/test/tools/llvm-objdump/ELF/AVR/mattr.s b/llvm/test/tools/llvm-objdump/ELF/AVR/mattr.s
deleted file mode 100644
index 55c4dfb8309ab..0000000000000
--- a/llvm/test/tools/llvm-objdump/ELF/AVR/mattr.s
+++ /dev/null
@@ -1,24 +0,0 @@
-## When --mattr and --mcpu are both empty, disassemble all known instructions.
-# RUN: llvm-mc -filetype=obj -triple=avr -mattr=+special %s -o %t
-# RUN: llvm-objdump -d --no-show-raw-insn %t | FileCheck %s --check-prefixes=ALL
-
-# ALL:      <_start>:
-# ALL-NEXT:   call    0x0
-# ALL-NEXT:   jmp     0x0
-# ALL-NEXT:   rjmp    .-2
-
-## If --mattr or --mcpu is specified, don't default to --mattr=+special.
-# RUN: llvm-objdump -d --no-show-raw-insn --mattr=+avr2 %t | FileCheck %s --check-prefixes=UNKNOWN
-# RUN: llvm-objdump -d --no-show-raw-insn --mcpu=avr2 %t | FileCheck %s --check-prefixes=UNKNOWN
-
-# UNKNOWN:         <_start>:
-# UNKNOWN-COUNT-2:   <unknown>
-# UNKNOWN:           rjmp    .-2
-
-.globl _start
-_start:
-; Valid in avr3, Invalid in avr2
-    call  foo
-    jmp   foo
-; Valid in both
-    rjmp  foo
diff --git a/llvm/test/tools/llvm-objdump/ELF/AVR/mattr.test b/llvm/test/tools/llvm-objdump/ELF/AVR/mattr.test
new file mode 100644
index 0000000000000..3a1e3644ce900
--- /dev/null
+++ b/llvm/test/tools/llvm-objdump/ELF/AVR/mattr.test
@@ -0,0 +1,50 @@
+# REQUIRES: x86-registered-target
+
+## When --mattr and --mcpu are both empty, disassemble elf with EFlag-derived feature.
+# RUN: yaml2obj -DARCHVERSION=AVR1 %s -o %t.avr1
+# RUN: llvm-objdump -d %t.avr1 | FileCheck %s --check-prefixes=UNKNOWN
+# RUN: yaml2obj -DARCHVERSION=AVR3 %s -o %t.avr3
+# RUN: llvm-objdump -d %t.avr3 | FileCheck %s --check-prefixes=ALL
+
+## If --mattr or --mcpu is specified, don't default to the file's EFlag-derived feature.
+# RUN: llvm-objdump -d --mattr=+avr3 %t.avr1 | FileCheck %s --check-prefixes=ALL
+# RUN: llvm-objdump -d --mcpu=avr3 %t.avr1 | FileCheck %s --check-prefixes=ALL
+
+# UNKNOWN:         <_start>:
+# UNKNOWN-COUNT-2:   <unknown>
+# UNKNOWN:           rjmp    .-2
+
+# ALL:      <_start>:
+# ALL-NEXT:   call    0x0
+# ALL-NEXT:   jmp     0x0
+# ALL-NEXT:   rjmp    .-2
+
+--- !ELF
+FileHeader:
+  Class:           ELFCLASS32
+  Data:            ELFDATA2LSB
+  Type:            ET_REL
+  Machine:         EM_AVR
+  Flags:           [ EF_AVR_ARCH_[[ARCHVERSION]] ]
+Sections:
+  - Name:            .text
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
+    Content:         0E9400000C940000FFCF
+  - Name:            .rela.text
+    Type:            SHT_RELA
+    Relocations:
+      - Symbol:          foo
+        Type:            0x12
+      - Offset:          0x4
+        Symbol:          foo
+        Type:            0x12
+      - Offset:          0x8
+        Symbol:          foo
+        Type:            0x3
+Symbols:
+  - Name:            _start
+    Section:         .text
+    Binding:         STB_GLOBAL
+  - Name:            foo
+    Binding:         STB_GLOBAL
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp
index 32599c809b864..f7cd2f06e48d5 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -73,6 +73,7 @@
 #include "llvm/Support/TargetSelect.h"
 #include "llvm/Support/WithColor.h"
 #include "llvm/Support/raw_ostream.h"
+#include "llvm/TargetParser/AVRTargetParser.h"
 #include "llvm/TargetParser/Host.h"
 #include "llvm/TargetParser/Triple.h"
 #include <algorithm>
@@ -2690,7 +2691,11 @@ static void disassembleObject(ObjectFile *Obj, bool InlineRelocs,
   } else if (MCPU.empty() && Obj->makeTriple().isAArch64()) {
     Features.AddFeature("+all");
   } else if (MCPU.empty() && Obj->makeTriple().isAVR()) {
-    Features.AddFeature("+special");
+    // Assign attributes based on the AVR architecture version
+    if (const auto *ELFFile = dyn_cast<ELFObjectFileBase>(Obj)) {
+      unsigned AVRVersion = ELFFile->getPlatformFlags() & ELF::EF_AVR_ARCH_MASK;
+      Features.AddFeature('+' + AVR::getFeatureSetForEFlag(AVRVersion));
+    }
   }
 
   if (MCPU.empty())

>From 2361332d4efc5c6d2aa0963652ee95e69d391e51 Mon Sep 17 00:00:00 2001
From: Ruoyu Qiu <cabbaken at outlook.com>
Date: Sun, 18 Jan 2026 01:36:08 +0800
Subject: [PATCH 6/7] Fix some copy-paste error

---
 llvm/test/tools/llvm-objdump/ELF/AVR/mattr.test | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/test/tools/llvm-objdump/ELF/AVR/mattr.test b/llvm/test/tools/llvm-objdump/ELF/AVR/mattr.test
index 3a1e3644ce900..d72a49f1ead21 100644
--- a/llvm/test/tools/llvm-objdump/ELF/AVR/mattr.test
+++ b/llvm/test/tools/llvm-objdump/ELF/AVR/mattr.test
@@ -1,4 +1,4 @@
-# REQUIRES: x86-registered-target
+# REQUIRES: avr-registered-target
 
 ## When --mattr and --mcpu are both empty, disassemble elf with EFlag-derived feature.
 # RUN: yaml2obj -DARCHVERSION=AVR1 %s -o %t.avr1

>From fbb680b4f34aef0e8aa460b29e9d4576201db63e Mon Sep 17 00:00:00 2001
From: Ruoyu Qiu <cabbaken at outlook.com>
Date: Sun, 18 Jan 2026 19:43:55 +0800
Subject: [PATCH 7/7] Do some fix

Signed-off-by: Ruoyu Qiu <cabbaken at outlook.com>
---
 llvm/include/llvm/TargetParser/AVRTargetParser.h |  2 +-
 llvm/lib/TargetParser/AVRTargetParser.cpp        | 12 ++++++------
 llvm/tools/llvm-objdump/llvm-objdump.cpp         |  8 ++++----
 3 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/llvm/include/llvm/TargetParser/AVRTargetParser.h b/llvm/include/llvm/TargetParser/AVRTargetParser.h
index e00db9c9c0b49..f4bd3273c6692 100644
--- a/llvm/include/llvm/TargetParser/AVRTargetParser.h
+++ b/llvm/include/llvm/TargetParser/AVRTargetParser.h
@@ -6,7 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 //
-// This file implements a target parser to recognise AVR hardware features
+// This file implements a target parser to recognise AVR hardware features.
 //
 //===----------------------------------------------------------------------===//
 
diff --git a/llvm/lib/TargetParser/AVRTargetParser.cpp b/llvm/lib/TargetParser/AVRTargetParser.cpp
index 38cb556af8442..a662e342b92a2 100644
--- a/llvm/lib/TargetParser/AVRTargetParser.cpp
+++ b/llvm/lib/TargetParser/AVRTargetParser.cpp
@@ -6,7 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 //
-// This file implements a target parser to recognise AVR hardware features
+// This file implements a target parser to recognise AVR hardware features.
 //
 //===----------------------------------------------------------------------===//
 #include "llvm/TargetParser/AVRTargetParser.h"
@@ -16,7 +16,7 @@
 using namespace llvm;
 
 std::string AVR::getFeatureSetForEFlag(unsigned EFlag) {
-  static std::map<unsigned, StringRef> EFlagToFeatureSet = {
+  static const std::map<unsigned, StringRef> EFlagToFeatureSet = {
       {ELF::EF_AVR_ARCH_AVR1, "avr1"},
       {ELF::EF_AVR_ARCH_AVR2, "avr2"},
       {ELF::EF_AVR_ARCH_AVR25, "avr25"},
@@ -32,14 +32,14 @@ std::string AVR::getFeatureSetForEFlag(unsigned EFlag) {
       {ELF::EF_AVR_ARCH_XMEGA2, "xmega2"},
       {ELF::EF_AVR_ARCH_XMEGA3, "xmega3"},
       {ELF::EF_AVR_ARCH_XMEGA4, "xmega4"},
-      {ELF::EF_AVR_ARCH_XMEGA5, "xmegau"},
-      {ELF::EF_AVR_ARCH_XMEGA6, "xmegau"},
-      {ELF::EF_AVR_ARCH_XMEGA7, "xmegau"},
+      {ELF::EF_AVR_ARCH_XMEGA5, "xmega"},
+      {ELF::EF_AVR_ARCH_XMEGA6, "xmega"},
+      {ELF::EF_AVR_ARCH_XMEGA7, "xmega"},
   };
 
   auto It = EFlagToFeatureSet.find(EFlag);
   if (It != EFlagToFeatureSet.end())
     return It->second.str();
 
-  return "special";
+  return "avr0";
 }
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp
index f7cd2f06e48d5..bb8fe7b118715 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -2692,10 +2692,10 @@ static void disassembleObject(ObjectFile *Obj, bool InlineRelocs,
     Features.AddFeature("+all");
   } else if (MCPU.empty() && Obj->makeTriple().isAVR()) {
     // Assign attributes based on the AVR architecture version
-    if (const auto *ELFFile = dyn_cast<ELFObjectFileBase>(Obj)) {
-      unsigned AVRVersion = ELFFile->getPlatformFlags() & ELF::EF_AVR_ARCH_MASK;
-      Features.AddFeature('+' + AVR::getFeatureSetForEFlag(AVRVersion));
-    }
+    const auto Elf = dyn_cast<ELFObjectFileBase>(Obj);
+    assert(Elf && "AVR object should be an ELF file");
+    unsigned AVRVersion = Elf->getPlatformFlags() & ELF::EF_AVR_ARCH_MASK;
+    Features.AddFeature('+' + AVR::getFeatureSetForEFlag(AVRVersion));
   }
 
   if (MCPU.empty())



More information about the llvm-commits mailing list