Skip to content

Commit ca0de6b

Browse files
committed
[RISCV-LLDB] RISCV feature attribute support and allows overriding additional(default) feature #147990
Resolved all review comments.
1 parent 533d245 commit ca0de6b

File tree

5 files changed

+40
-36
lines changed

5 files changed

+40
-36
lines changed

lldb/include/lldb/Utility/ArchSpec.h

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -537,13 +537,14 @@ class ArchSpec {
537537

538538
void SetFlags(const std::string &elf_abi);
539539

540-
// Sets the target specific disassembly feature string
541-
// for ELF disassembly.
542-
void SetAdditionalDisassemblyFeatureStr(llvm::StringRef additional_features);
543-
544-
// Get the current target disassembly feature string.
545-
llvm::StringRef GetAdditionalDisassemblyFeatureStr() const {
546-
return llvm::StringRef(m_additional_disassembly_feature_str);
540+
/// Sets the feature string that describes architecture specific capabilities
541+
/// for use during instruction decoding.
542+
void SetDisassemblyFeatures(std::string additional_features);
543+
544+
/// Returns the feature string used by the disassembler to decode instructions
545+
/// based on target specific features.
546+
llvm::StringRef GetDisassemblyFeatures() const {
547+
return m_disassembly_feature_str;
547548
}
548549

549550
protected:
@@ -557,8 +558,11 @@ class ArchSpec {
557558
// these are application specific extensions like micromips, mips16 etc.
558559
uint32_t m_flags = 0;
559560

560-
// Holds the additional disassembly feature string.
561-
std::string m_additional_disassembly_feature_str;
561+
/// Feature string containing architecture specific ISA(Instruction set
562+
/// architecture) extensions present in the binary (e.g. "xqci" in RISCV).
563+
/// This string is passed to the disassembler to enable accurate instruction
564+
/// decoding based on the binary's supported ISA features.
565+
std::string m_disassembly_feature_str;
562566

563567
// Called when m_def or m_entry are changed. Fills in all remaining members
564568
// with default values.

lldb/source/Plugins/Disassembler/LLVMC/DisassemblerLLVMC.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1451,9 +1451,8 @@ void DisassemblerLLVMC::UpdateFeatureString(llvm::StringRef additional_features,
14511451
// Allow users to override default additional features.
14521452
for (llvm::StringRef flag : llvm::split(additional_features, ",")) {
14531453
flag = flag.trim();
1454-
if (flag.empty()) {
1454+
if (flag.empty())
14551455
continue;
1456-
}
14571456
// Check if disable (-c) is already present before adding default enable
14581457
// (+c), since enable (+c) takes precedence whether disable (-c) appears
14591458
// before or after in the feature string.
@@ -1621,11 +1620,11 @@ DisassemblerLLVMC::DisassemblerLLVMC(const ArchSpec &arch,
16211620
features_str += "+a,+m,";
16221621
}
16231622

1624-
const char *additional_features =
1625-
arch.GetAdditionalDisassemblyFeatureStr().data();
1623+
llvm::StringRef additional_features =
1624+
arch.GetDisassemblyFeatures();
16261625
// Prepend the additional_features if it's not already in the features_str to
16271626
// avoid duplicates.
1628-
if (additional_features) {
1627+
if (!additional_features.empty()) {
16291628
UpdateFeatureString(additional_features, features_str);
16301629
}
16311630

lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1287,34 +1287,34 @@ ObjectFileELF::RefineModuleDetailsFromNote(lldb_private::DataExtractor &data,
12871287

12881288
void ObjectFileELF::ParseRISCVAttributes(DataExtractor &data, uint64_t length,
12891289
ArchSpec &arch_spec) {
1290-
lldb::offset_t Offset = 0;
1290+
lldb::offset_t offset = 0;
12911291

1292-
uint8_t FormatVersion = data.GetU8(&Offset);
1293-
if (FormatVersion != llvm::ELFAttrs::Format_Version)
1292+
uint8_t format_version = data.GetU8(&offset);
1293+
if (format_version != llvm::ELFAttrs::Format_Version)
12941294
return;
12951295

1296-
Offset = Offset + sizeof(uint32_t); // Section Length
1297-
llvm::StringRef VendorName = data.GetCStr(&Offset);
1296+
offset = offset + sizeof(uint32_t); // Section Length
1297+
llvm::StringRef vendor_name = data.GetCStr(&offset);
12981298

1299-
if (VendorName != "riscv")
1299+
if (vendor_name != "riscv")
13001300
return;
13011301

13021302
llvm::StringRef attr = "";
13031303

1304-
while (Offset < length) {
1305-
uint8_t Tag = data.GetU8(&Offset);
1306-
uint32_t Size = data.GetU32(&Offset);
1304+
while (offset < length) {
1305+
uint8_t Tag = data.GetU8(&offset);
1306+
uint32_t Size = data.GetU32(&offset);
13071307

13081308
if (Tag != llvm::ELFAttrs::File || Size == 0)
13091309
continue;
13101310

1311-
while (Offset < length) {
1312-
uint64_t Tag = data.GetULEB128(&Offset);
1311+
while (offset < length) {
1312+
uint64_t Tag = data.GetULEB128(&offset);
13131313
if (Tag == llvm::RISCVAttrs::ARCH) {
1314-
attr = data.GetCStr(&Offset);
1314+
attr = data.GetCStr(&offset);
13151315
break;
13161316
} else {
1317-
data.GetULEB128(&Offset);
1317+
data.GetULEB128(&offset);
13181318
}
13191319
}
13201320
}
@@ -1327,8 +1327,8 @@ void ObjectFileELF::ParseRISCVAttributes(DataExtractor &data, uint64_t length,
13271327

13281328
for (const auto &ext : riscv_extensions) {
13291329
if (!attr.empty() && attr.contains(ext) &&
1330-
!arch_spec.GetAdditionalDisassemblyFeatureStr().contains(ext)) {
1331-
arch_spec.SetAdditionalDisassemblyFeatureStr("+" + ext + ",");
1330+
!arch_spec.GetDisassemblyFeatures().contains(ext)) {
1331+
arch_spec.SetDisassemblyFeatures("+" + ext + ",");
13321332
}
13331333
}
13341334
}
@@ -1618,8 +1618,10 @@ size_t ObjectFileELF::GetSectionHeaderInfo(SectionHeaderColl &section_headers,
16181618
if (sheader.sh_type == SHT_ARM_ATTRIBUTES && section_size != 0 &&
16191619
data.SetData(object_data, sheader.sh_offset, section_size) == section_size)
16201620
ParseARMAttributes(data, section_size, arch_spec);
1621-
} else if (arch_spec.GetMachine() == llvm::Triple::riscv32 ||
1622-
arch_spec.GetMachine() == llvm::Triple::riscv64) {
1621+
}
1622+
1623+
if (arch_spec.GetMachine() == llvm::Triple::riscv32 ||
1624+
arch_spec.GetMachine() == llvm::Triple::riscv64) {
16231625
DataExtractor data;
16241626
if (sheader.sh_type == SHT_RISCV_ATTRIBUTES && section_size != 0 &&
16251627
(data.SetData(object_data, sheader.sh_offset, section_size) ==

lldb/source/Utility/ArchSpec.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -617,11 +617,11 @@ void ArchSpec::SetFlags(const std::string &elf_abi) {
617617
SetFlags(flag);
618618
}
619619

620-
void ArchSpec::SetAdditionalDisassemblyFeatureStr(
621-
llvm::StringRef additional_features) {
622-
if (m_additional_disassembly_feature_str.find(additional_features.str()) ==
620+
void ArchSpec::SetDisassemblyFeatures(
621+
std::string additional_features) {
622+
if (m_disassembly_feature_str.find(additional_features) ==
623623
std::string::npos) {
624-
m_additional_disassembly_feature_str += additional_features.str();
624+
m_disassembly_feature_str += additional_features;
625625
}
626626
}
627627

lldb/test/Shell/Disassemble/TestDisassembleRISCVXqciInstrutions.test

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,3 @@
88
# RUN: %lldb -b -o "disassemble -b -n main -Y -xqci,+c" %p/Inputs/riscv_xqci.out | FileCheck --check-prefix=CHECK-NOXQCI %s
99

1010
# CHECK-NOXQCI: <unknown>
11-

0 commit comments

Comments
 (0)