Commit 4e5af6ef authored by Sterling Augustine's avatar Sterling Augustine
Browse files

Revert "[lldb] Upstream support for Foundation constant classes"

This reverts commit 34d78b6a.

This breaks build bots witha  missing file:
/home/worker/2.0.1/lldb-x86_64-debian/llvm-project/lldb/source/Plugins/Language/ObjC/Cocoa.cpp:10:10: fatal error: 'objc/runtime.h' file not found
parent bfeb281f
Loading
Loading
Loading
Loading
+0 −67
Original line number Diff line number Diff line
@@ -7,7 +7,6 @@
//===----------------------------------------------------------------------===//

#include "Cocoa.h"
#include "objc/runtime.h"

#include "Plugins/TypeSystem/Clang/TypeSystemClang.h"
#include "lldb/Core/Mangled.h"
@@ -457,72 +456,6 @@ bool lldb_private::formatters::NSNumberSummaryProvider(
  if (class_name == "NSDecimalNumber")
    return NSDecimalNumberSummaryProvider(valobj, stream, options);

  if (class_name == "NSConstantIntegerNumber") {
    Status error;
    int64_t value = process_sp->ReadSignedIntegerFromMemory(
        valobj_addr + 2 * ptr_size, 8, 0, error);
    if (error.Fail())
      return false;
    uint64_t encoding_addr = process_sp->ReadUnsignedIntegerFromMemory(
        valobj_addr + ptr_size, ptr_size, 0, error);
    if (error.Fail())
      return false;
    char encoding =
        process_sp->ReadUnsignedIntegerFromMemory(encoding_addr, 1, 0, error);
    if (error.Fail())
      return false;

    switch (encoding) {
    case _C_CHR:
      NSNumber_FormatChar(valobj, stream, (char)value, options.GetLanguage());
      return true;
    case _C_SHT:
      NSNumber_FormatShort(valobj, stream, (short)value, options.GetLanguage());
      return true;
    case _C_INT:
      NSNumber_FormatInt(valobj, stream, (int)value, options.GetLanguage());
      return true;
    case _C_LNG:
    case _C_LNG_LNG:
      NSNumber_FormatLong(valobj, stream, value, options.GetLanguage());
      return true;

    case _C_UCHR:
    case _C_USHT:
    case _C_UINT:
    case _C_ULNG:
    case _C_ULNG_LNG:
      stream.Printf("%" PRIu64, value);
      return true;
    }

    return false;
  }

  if (class_name == "NSConstantFloatNumber") {
    Status error;
    uint32_t flt_as_int = process_sp->ReadUnsignedIntegerFromMemory(
        valobj_addr + ptr_size, 4, 0, error);
    if (error.Fail())
      return false;
    float flt_value = 0.0f;
    memcpy(&flt_value, &flt_as_int, sizeof(flt_as_int));
    NSNumber_FormatFloat(valobj, stream, flt_value, options.GetLanguage());
    return true;
  }

  if (class_name == "NSConstantDoubleNumber") {
    Status error;
    uint64_t dbl_as_lng = process_sp->ReadUnsignedIntegerFromMemory(
        valobj_addr + ptr_size, 8, 0, error);
    if (error.Fail())
      return false;
    double dbl_value = 0.0;
    memcpy(&dbl_value, &dbl_as_lng, sizeof(dbl_as_lng));
    NSNumber_FormatDouble(valobj, stream, dbl_value, options.GetLanguage());
    return true;
  }

  if (class_name == "NSNumber" || class_name == "__NSCFNumber") {
    int64_t value = 0;
    uint64_t i_bits = 0;
+0 −26
Original line number Diff line number Diff line
@@ -280,22 +280,6 @@ namespace Foundation1436 {
    }
}

namespace ConstantArray {

struct ConstantArray32 {
  uint64_t used;
  uint32_t list;
};

struct ConstantArray64 {
  uint64_t used;
  uint64_t list;
};

using NSConstantArraySyntheticFrontEnd =
    GenericNSArrayISyntheticFrontEnd<ConstantArray32, ConstantArray64, false>;
} // namespace ConstantArray

class NSArray0SyntheticFrontEnd : public SyntheticChildrenFrontEnd {
public:
  NSArray0SyntheticFrontEnd(lldb::ValueObjectSP valobj_sp);
@@ -372,7 +356,6 @@ bool lldb_private::formatters::NSArraySummaryProvider(
  static const ConstString g_NSArrayMLegacy("__NSArrayM_Legacy");
  static const ConstString g_NSArrayMImmutable("__NSArrayM_Immutable");
  static const ConstString g_NSCallStackArray("_NSCallStackArray");
  static const ConstString g_NSConstantArray("NSConstantArray");

  if (class_name.IsEmpty())
    return false;
@@ -383,12 +366,6 @@ bool lldb_private::formatters::NSArraySummaryProvider(
                                                      ptr_size, 0, error);
    if (error.Fail())
      return false;
  } else if (class_name == g_NSConstantArray) {
    Status error;
    value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, 8,
                                                      0, error);
    if (error.Fail())
      return false;
  } else if (class_name == g_NSArrayM) {
    AppleObjCRuntime *apple_runtime =
    llvm::dyn_cast_or_null<AppleObjCRuntime>(runtime);
@@ -826,7 +803,6 @@ lldb_private::formatters::NSArraySyntheticFrontEndCreator(
  ConstString class_name(descriptor->GetClassName());

  static const ConstString g_NSArrayI("__NSArrayI");
  static const ConstString g_NSConstantArray("NSConstantArray");
  static const ConstString g_NSArrayI_Transfer("__NSArrayI_Transfer");
  static const ConstString g_NSFrozenArrayM("__NSFrozenArrayM");
  static const ConstString g_NSArrayM("__NSArrayM");
@@ -847,8 +823,6 @@ lldb_private::formatters::NSArraySyntheticFrontEndCreator(
    return (new Foundation1300::NSArrayISyntheticFrontEnd(valobj_sp));
  } else if (class_name == g_NSArrayI_Transfer) {
      return (new Foundation1436::NSArrayI_TransferSyntheticFrontEnd(valobj_sp));
  } else if (class_name == g_NSConstantArray) {
    return new ConstantArray::NSConstantArraySyntheticFrontEnd(valobj_sp);
  } else if (class_name == g_NSFrozenArrayM) {
    return (new Foundation1436::NSFrozenArrayMSyntheticFrontEnd(valobj_sp));
  } else if (class_name == g_NSArray0) {
+7 −161
Original line number Diff line number Diff line
@@ -142,38 +142,6 @@ private:
  std::vector<DictionaryItemDescriptor> m_children;
};

class NSConstantDictionarySyntheticFrontEnd : public SyntheticChildrenFrontEnd {
public:
  NSConstantDictionarySyntheticFrontEnd(lldb::ValueObjectSP valobj_sp);

  size_t CalculateNumChildren() override;

  lldb::ValueObjectSP GetChildAtIndex(size_t idx) override;

  bool Update() override;

  bool MightHaveChildren() override;

  size_t GetIndexOfChildWithName(ConstString name) override;

private:
  ExecutionContextRef m_exe_ctx_ref;
  CompilerType m_pair_type;
  uint8_t m_ptr_size = 8;
  lldb::ByteOrder m_order = lldb::eByteOrderInvalid;
  unsigned int m_size = 0;
  lldb::addr_t m_keys_ptr = LLDB_INVALID_ADDRESS;
  lldb::addr_t m_objects_ptr = LLDB_INVALID_ADDRESS;

  struct DictionaryItemDescriptor {
    lldb::addr_t key_ptr;
    lldb::addr_t val_ptr;
    lldb::ValueObjectSP valobj_sp;
  };

  std::vector<DictionaryItemDescriptor> m_children;
};

class NSCFDictionarySyntheticFrontEnd : public SyntheticChildrenFrontEnd {
public:
  NSCFDictionarySyntheticFrontEnd(lldb::ValueObjectSP valobj_sp);
@@ -448,7 +416,6 @@ bool lldb_private::formatters::NSDictionarySummaryProvider(
  static const ConstString g_DictionaryCF("__CFDictionary");
  static const ConstString g_DictionaryNSCF("__NSCFDictionary");
  static const ConstString g_DictionaryCFRef("CFDictionaryRef");
  static const ConstString g_ConstantDictionary("NSConstantDictionary");

  if (class_name.IsEmpty())
    return false;
@@ -461,14 +428,8 @@ bool lldb_private::formatters::NSDictionarySummaryProvider(
      return false;

    value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U);
  } else if (class_name == g_ConstantDictionary) {
    Status error;
    value = process_sp->ReadUnsignedIntegerFromMemory(
        valobj_addr + 2 * ptr_size, ptr_size, 0, error);
    if (error.Fail())
      return false;
  } else if (class_name == g_DictionaryM || class_name == g_DictionaryMLegacy ||
             class_name == g_DictionaryMFrozen) {
  } else if (class_name == g_DictionaryM || class_name == g_DictionaryMLegacy 
             || class_name == g_DictionaryMFrozen) {
    AppleObjCRuntime *apple_runtime =
    llvm::dyn_cast_or_null<AppleObjCRuntime>(runtime);
    Status error;
@@ -486,7 +447,8 @@ bool lldb_private::formatters::NSDictionarySummaryProvider(
    value = 1;
  } else if (class_name == g_Dictionary0) {
    value = 0;
  } else if (class_name == g_DictionaryCF || class_name == g_DictionaryNSCF ||
  } else if (class_name == g_DictionaryCF ||
             class_name == g_DictionaryNSCF ||
             class_name == g_DictionaryCFRef) {
    ExecutionContext exe_ctx(process_sp);
    CFBasicHash cfbh;
@@ -555,15 +517,12 @@ lldb_private::formatters::NSDictionarySyntheticFrontEndCreator(
  static const ConstString g_DictionaryCF("__CFDictionary");
  static const ConstString g_DictionaryNSCF("__NSCFDictionary");
  static const ConstString g_DictionaryCFRef("CFDictionaryRef");
  static const ConstString g_ConstantDictionary("NSConstantDictionary");

  if (class_name.IsEmpty())
    return nullptr;

  if (class_name == g_DictionaryI) {
    return (new NSDictionaryISyntheticFrontEnd(valobj_sp));
  } else if (class_name == g_ConstantDictionary) {
    return (new NSConstantDictionarySyntheticFrontEnd(valobj_sp));
  } else if (class_name == g_DictionaryM || class_name == g_DictionaryMFrozen) {
    if (runtime->GetFoundationVersion() >= 1437) {
      return (new Foundation1437::NSDictionaryMSyntheticFrontEnd(valobj_sp));
@@ -576,7 +535,8 @@ lldb_private::formatters::NSDictionarySyntheticFrontEndCreator(
      return (new Foundation1100::NSDictionaryMSyntheticFrontEnd(valobj_sp));
  } else if (class_name == g_Dictionary1) {
    return (new NSDictionary1SyntheticFrontEnd(valobj_sp));
  } else if (class_name == g_DictionaryCF || class_name == g_DictionaryNSCF ||
  } else if (class_name == g_DictionaryCF ||
             class_name == g_DictionaryNSCF ||
             class_name == g_DictionaryCFRef) {
    return (new NSCFDictionarySyntheticFrontEnd(valobj_sp));
  } else {
@@ -870,120 +830,6 @@ lldb_private::formatters::NSCFDictionarySyntheticFrontEnd::GetChildAtIndex(
  return dict_item.valobj_sp;
}

lldb_private::formatters::NSConstantDictionarySyntheticFrontEnd::
    NSConstantDictionarySyntheticFrontEnd(lldb::ValueObjectSP valobj_sp)
    : SyntheticChildrenFrontEnd(*valobj_sp) {}

size_t lldb_private::formatters::NSConstantDictionarySyntheticFrontEnd::
    GetIndexOfChildWithName(ConstString name) {
  const char *item_name = name.GetCString();
  uint32_t idx = ExtractIndexFromString(item_name);
  if (idx < UINT32_MAX && idx >= CalculateNumChildren())
    return UINT32_MAX;
  return idx;
}

size_t lldb_private::formatters::NSConstantDictionarySyntheticFrontEnd::
    CalculateNumChildren() {
  return m_size;
}

bool lldb_private::formatters::NSConstantDictionarySyntheticFrontEnd::Update() {
  ValueObjectSP valobj_sp = m_backend.GetSP();
  if (!valobj_sp)
    return false;
  m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
  Status error;
  error.Clear();
  lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
  if (!process_sp)
    return false;
  m_ptr_size = process_sp->GetAddressByteSize();
  m_order = process_sp->GetByteOrder();
  uint64_t valobj_addr = valobj_sp->GetValueAsUnsigned(0);
  m_size = process_sp->ReadUnsignedIntegerFromMemory(
      valobj_addr + 2 * m_ptr_size, m_ptr_size, 0, error);
  if (error.Fail())
    return false;
  m_keys_ptr =
      process_sp->ReadPointerFromMemory(valobj_addr + 3 * m_ptr_size, error);
  if (error.Fail())
    return false;
  m_objects_ptr =
      process_sp->ReadPointerFromMemory(valobj_addr + 4 * m_ptr_size, error);
  return !error.Fail();
}

bool lldb_private::formatters::NSConstantDictionarySyntheticFrontEnd::
    MightHaveChildren() {
  return true;
}

lldb::ValueObjectSP lldb_private::formatters::
    NSConstantDictionarySyntheticFrontEnd::GetChildAtIndex(size_t idx) {
  uint32_t num_children = CalculateNumChildren();

  if (idx >= num_children)
    return lldb::ValueObjectSP();

  if (m_children.empty()) {
    // do the scan phase
    lldb::addr_t key_at_idx = 0, val_at_idx = 0;
    ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP();
    if (!process_sp)
      return lldb::ValueObjectSP();

    for (unsigned int child = 0; child < num_children; ++child) {
      Status error;
      key_at_idx = process_sp->ReadPointerFromMemory(
          m_keys_ptr + child * m_ptr_size, error);
      if (error.Fail())
        return lldb::ValueObjectSP();
      val_at_idx = process_sp->ReadPointerFromMemory(
          m_objects_ptr + child * m_ptr_size, error);
      if (error.Fail())
        return lldb::ValueObjectSP();
      DictionaryItemDescriptor descriptor = {key_at_idx, val_at_idx,
                                             lldb::ValueObjectSP()};
      m_children.push_back(descriptor);
    }
  }

  if (idx >= m_children.size()) // should never happen
    return lldb::ValueObjectSP();

  DictionaryItemDescriptor &dict_item = m_children[idx];
  if (!dict_item.valobj_sp) {
    if (!m_pair_type.IsValid()) {
      TargetSP target_sp(m_backend.GetTargetSP());
      if (!target_sp)
        return ValueObjectSP();
      m_pair_type = GetLLDBNSPairType(target_sp);
    }
    if (!m_pair_type.IsValid())
      return ValueObjectSP();

    DataBufferSP buffer_sp(new DataBufferHeap(2 * m_ptr_size, 0));

    if (m_ptr_size == 8) {
      uint64_t *data_ptr = (uint64_t *)buffer_sp->GetBytes();
      *data_ptr = dict_item.key_ptr;
      *(data_ptr + 1) = dict_item.val_ptr;
    } else {
      uint32_t *data_ptr = (uint32_t *)buffer_sp->GetBytes();
      *data_ptr = dict_item.key_ptr;
      *(data_ptr + 1) = dict_item.val_ptr;
    }

    StreamString idx_name;
    idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx);
    DataExtractor data(buffer_sp, m_order, m_ptr_size);
    dict_item.valobj_sp = CreateValueObjectFromData(idx_name.GetString(), data,
                                                    m_exe_ctx_ref, m_pair_type);
  }
  return dict_item.valobj_sp;
}

lldb_private::formatters::NSDictionary1SyntheticFrontEnd::
    NSDictionary1SyntheticFrontEnd(lldb::ValueObjectSP valobj_sp)
    : SyntheticChildrenFrontEnd(*valobj_sp.get()), m_pair(nullptr) {}
+0 −28
Original line number Diff line number Diff line
@@ -403,9 +403,6 @@ static void LoadObjCFormatters(TypeCategoryImplSP objc_category_sp) {
  AddCXXSummary(
      objc_category_sp, lldb_private::formatters::NSArraySummaryProvider,
      "NSArray summary provider", ConstString("NSArray"), appkit_flags);
  AddCXXSummary(
      objc_category_sp, lldb_private::formatters::NSArraySummaryProvider,
      "NSArray summary provider", ConstString("NSConstantArray"), appkit_flags);
  AddCXXSummary(
      objc_category_sp, lldb_private::formatters::NSArraySummaryProvider,
      "NSArray summary provider", ConstString("NSMutableArray"), appkit_flags);
@@ -440,10 +437,6 @@ static void LoadObjCFormatters(TypeCategoryImplSP objc_category_sp) {
                lldb_private::formatters::NSDictionarySummaryProvider<false>,
                "NSDictionary summary provider", ConstString("NSDictionary"),
                appkit_flags);
  AddCXXSummary(objc_category_sp,
                lldb_private::formatters::NSDictionarySummaryProvider<false>,
                "NSDictionary summary provider",
                ConstString("NSConstantDictionary"), appkit_flags);
  AddCXXSummary(objc_category_sp,
                lldb_private::formatters::NSDictionarySummaryProvider<false>,
                "NSDictionary summary provider",
@@ -550,10 +543,6 @@ static void LoadObjCFormatters(TypeCategoryImplSP objc_category_sp) {
                  lldb_private::formatters::NSArraySyntheticFrontEndCreator,
                  "NSArray synthetic children", ConstString("NSArray"),
                  ScriptedSyntheticChildren::Flags());
  AddCXXSynthetic(objc_category_sp,
                  lldb_private::formatters::NSArraySyntheticFrontEndCreator,
                  "NSArray synthetic children", ConstString("NSConstantArray"),
                  ScriptedSyntheticChildren::Flags());
  AddCXXSynthetic(objc_category_sp,
                  lldb_private::formatters::NSArraySyntheticFrontEndCreator,
                  "NSArray synthetic children", ConstString("NSMutableArray"),
@@ -581,11 +570,6 @@ static void LoadObjCFormatters(TypeCategoryImplSP objc_category_sp) {
      lldb_private::formatters::NSDictionarySyntheticFrontEndCreator,
      "NSDictionary synthetic children", ConstString("__NSDictionaryM"),
      ScriptedSyntheticChildren::Flags());
  AddCXXSynthetic(
      objc_category_sp,
      lldb_private::formatters::NSDictionarySyntheticFrontEndCreator,
      "NSDictionary synthetic children", ConstString("NSConstantDictionary"),
      ScriptedSyntheticChildren::Flags());
  AddCXXSynthetic(
      objc_category_sp,
      lldb_private::formatters::NSDictionarySyntheticFrontEndCreator,
@@ -807,18 +791,6 @@ static void LoadObjCFormatters(TypeCategoryImplSP objc_category_sp) {
  AddCXXSummary(
      objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider,
      "NSNumber summary provider", ConstString("NSNumber"), appkit_flags);
  AddCXXSummary(objc_category_sp,
                lldb_private::formatters::NSNumberSummaryProvider,
                "NSNumber summary provider",
                ConstString("NSConstantIntegerNumber"), appkit_flags);
  AddCXXSummary(objc_category_sp,
                lldb_private::formatters::NSNumberSummaryProvider,
                "NSNumber summary provider",
                ConstString("NSConstantDoubleNumber"), appkit_flags);
  AddCXXSummary(objc_category_sp,
                lldb_private::formatters::NSNumberSummaryProvider,
                "NSNumber summary provider",
                ConstString("NSConstantFloatNumber"), appkit_flags);
  AddCXXSummary(
      objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider,
      "CFNumberRef summary provider", ConstString("CFNumberRef"), appkit_flags);
+2 −13
Original line number Diff line number Diff line
@@ -14,19 +14,8 @@ class ObjCDataFormatterTestCase(TestBase):

   mydir = TestBase.compute_mydir(__file__)

   def appkit_tester_impl(self, commands, use_constant_classes):
      if use_constant_classes:
   def appkit_tester_impl(self, commands):
      self.build()
      else:
         disable_constant_classes = {
            'CC':
            'xcrun clang', # FIXME: Remove when flags are available upstream.
            'CFLAGS_EXTRAS':
            '-fno-constant-nsnumber-literals ' +
            '-fno-constant-nsarray-literals ' +
            '-fno-constant-nsdictionary-literals'
         }
         self.build(dictionary=disable_constant_classes)
      self.appkit_common_data_formatters_command()
      commands()

Loading