diff --git a/lldb/source/Plugins/ObjectFile/ELF/ELFHeader.cpp b/lldb/source/Plugins/ObjectFile/ELF/ELFHeader.cpp
index 39ea492..16cbb6e 100644
--- a/lldb/source/Plugins/ObjectFile/ELF/ELFHeader.cpp
+++ b/lldb/source/Plugins/ObjectFile/ELF/ELFHeader.cpp
@@ -140,13 +140,12 @@
   if (data.GetU32(offset, &e_flags, 1) == NULL)
     return false;
 
-  // Read e_ehsize, e_phentsize, e_phnum, e_shentsize, e_shnum and
-  // e_shstrndx.
+  // Read e_ehsize, e_phentsize, e_phnum, e_shentsize, e_shnum and e_shstrndx.
   if (data.GetU16(offset, &e_ehsize, 6) == NULL)
     return false;
 
-  // Initialize e_phnum, e_shnum, and e_shstrndx with the values
-  // read from the header.
+  // Initialize e_phnum, e_shnum, and e_shstrndx with the values read from the
+  // header.
   e_phnum = e_phnum_hdr;
   e_shnum = e_shnum_hdr;
   e_shstrndx = e_shstrndx_hdr;
diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
index 61186ae..923a749 100644
--- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
+++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
@@ -240,11 +240,10 @@
   if (data.GetU32(offset, &n_namesz, 3) == NULL)
     return false;
 
-  // The name field is required to be nul-terminated, and n_namesz
-  // includes the terminating nul in observed implementations (contrary
-  // to the ELF-64 spec).  A special case is needed for cores generated
-  // by some older Linux versions, which write a note named "CORE"
-  // without a nul terminator and n_namesz = 4.
+  // The name field is required to be nul-terminated, and n_namesz includes the
+  // terminating nul in observed implementations (contrary to the ELF-64 spec).
+  // A special case is needed for cores generated by some older Linux versions,
+  // which write a note named "CORE" without a nul terminator and n_namesz = 4.
   if (n_namesz == 4) {
     char buf[4];
     if (data.ExtractBytes(*offset, 4, data.GetByteOrder(), buf) != 4)
@@ -295,7 +294,8 @@
   uint32_t arch_variant = ArchSpec::eMIPSSubType_unknown;
   uint32_t fileclass = header.e_ident[EI_CLASS];
 
-  // If there aren't any elf flags available (e.g core elf file) then return default 
+  // If there aren't any elf flags available (e.g core elf file) then return
+  // default
   // 32 or 64 bit arch (without any architecture revision) based on object file's class.
   if (header.e_type == ET_CORE) {
     switch (fileclass) {
@@ -549,8 +549,8 @@
 
       DataExtractor segment_data;
       if (segment_data.SetData(object_data, ph_offset, ph_size) != ph_size) {
-        // The ELF program header contained incorrect data,
-        // probably corefile is incomplete or corrupted.
+        // The ELF program header contained incorrect data, probably corefile
+        // is incomplete or corrupted.
         break;
       }
 
@@ -595,8 +595,8 @@
 
 //
 // WARNING : This function is being deprecated
-// It's functionality has moved to ArchSpec::SetArchitecture
-// This function is only being kept to validate the move.
+// It's functionality has moved to ArchSpec::SetArchitecture This function is
+// only being kept to validate the move.
 //
 // TODO : Remove this function
 static bool GetOsFromOSABI(unsigned char osabi_byte,
@@ -677,10 +677,10 @@
           data_sp = MapFileData(file, -1, file_offset);
           if (data_sp)
             data.SetData(data_sp);
-          // In case there is header extension in the section #0, the header
-          // we parsed above could have sentinel values for e_phnum, e_shnum,
-          // and e_shstrndx.  In this case we need to reparse the header
-          // with a bigger data source to get the actual values.
+          // In case there is header extension in the section #0, the header we
+          // parsed above could have sentinel values for e_phnum, e_shnum, and
+          // e_shstrndx.  In this case we need to reparse the header with a
+          // bigger data source to get the actual values.
           if (header.HasHeaderExtension()) {
             lldb::offset_t header_offset = data_offset;
             header.Parse(data, &header_offset);
@@ -736,8 +736,8 @@
               uuid.SetBytes(uuidt, sizeof(uuidt));
             } else if (core_notes_crc) {
               // Use 8 bytes - first 4 bytes for *magic* prefix, mainly to make
-              // it look different form
-              // .gnu_debuglink crc followed by 4 bytes of note segments crc.
+              // it look different form .gnu_debuglink crc followed by 4 bytes
+              // of note segments crc.
               uint32_t uuidt[4] = {g_core_uuid_magic, core_notes_crc, 0, 0};
               uuid.SetBytes(uuidt, sizeof(uuidt));
             }
@@ -823,21 +823,19 @@
       size_t sect_idx = 0;
 
       for (sect_idx = 0; sect_idx < num_sections; ++sect_idx) {
-        // Iterate through the object file sections to find all
-        // of the sections that have SHF_ALLOC in their flag bits.
+        // Iterate through the object file sections to find all of the sections
+        // that have SHF_ALLOC in their flag bits.
         SectionSP section_sp(section_list->GetSectionAtIndex(sect_idx));
         if (section_sp && section_sp->Test(SHF_ALLOC)) {
           lldb::addr_t load_addr = section_sp->GetFileAddress();
           // We don't want to update the load address of a section with type
           // eSectionTypeAbsoluteAddress as they already have the absolute load
-          // address
-          // already specified
+          // address already specified
           if (section_sp->GetType() != eSectionTypeAbsoluteAddress)
             load_addr += value;
 
           // On 32-bit systems the load address have to fit into 4 bytes. The
-          // rest of
-          // the bytes are the overflow from the addition.
+          // rest of the bytes are the overflow from the addition.
           if (GetAddressByteSize() == 4)
             load_addr &= 0xFFFFFFFF;
 
@@ -869,9 +867,8 @@
   if (!symtab)
     return eAddressClassUnknown;
 
-  // The address class is determined based on the symtab. Ask it from the object
-  // file what
-  // contains the symtab information.
+  // The address class is determined based on the symtab. Ask it from the
+  // object file what contains the symtab information.
   ObjectFile *symtab_objfile = symtab->GetObjectFile();
   if (symtab_objfile != nullptr && symtab_objfile != this)
     return symtab_objfile->GetAddressClass(file_addr);
@@ -882,8 +879,8 @@
 
   auto ub = m_address_class_map.upper_bound(file_addr);
   if (ub == m_address_class_map.begin()) {
-    // No entry in the address class map before the address. Return
-    // default address class for an address in a code section.
+    // No entry in the address class map before the address. Return default
+    // address class for an address in a code section.
     return eAddressClassCode;
   }
 
@@ -925,8 +922,8 @@
     core_notes_crc = CalculateELFNotesSegmentsCRC32(m_program_headers, m_data);
 
     if (core_notes_crc) {
-      // Use 8 bytes - first 4 bytes for *magic* prefix, mainly to make it
-      // look different form .gnu_debuglink crc - followed by 4 bytes of note
+      // Use 8 bytes - first 4 bytes for *magic* prefix, mainly to make it look
+      // different form .gnu_debuglink crc - followed by 4 bytes of note
       // segments crc.
       uint32_t uuidt[4] = {g_core_uuid_magic, core_notes_crc, 0, 0};
       m_uuid.SetBytes(uuidt, sizeof(uuidt));
@@ -996,8 +993,8 @@
     ELFDynamic &symbol = m_dynamic_symbols[i];
 
     if (symbol.d_tag == DT_DEBUG) {
-      // Compute the offset as the number of previous entries plus the
-      // size of d_tag.
+      // Compute the offset as the number of previous entries plus the size of
+      // d_tag.
       addr_t offset = i * dynsym_hdr->sh_entsize + GetAddressByteSize();
       return Address(dynsym_section_sp, offset);
     }
@@ -1330,8 +1327,8 @@
       arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::CSR);
 
       // TODO At some point the description string could be processed.
-      // It could provide a steer towards the kalimba variant which
-      // this ELF targets.
+      // It could provide a steer towards the kalimba variant which this ELF
+      // targets.
       if (note.n_descsz) {
         const char *cstr =
             data.GetCStr(&offset, llvm::alignTo(note.n_descsz, 4));
@@ -1346,36 +1343,28 @@
       // register info
       arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux);
     } else if (note.n_name == LLDB_NT_OWNER_CORE) {
-      // Parse the NT_FILE to look for stuff in paths to shared libraries
-      // As the contents look like this in a 64 bit ELF core file:
-      // count     = 0x000000000000000a (10)
-      // page_size = 0x0000000000001000 (4096)
-      // Index start              end                file_ofs           path
-      // ===== ------------------ ------------------ ------------------
-      // -------------------------------------
-      // [  0] 0x0000000000400000 0x0000000000401000 0x0000000000000000
-      // /tmp/a.out
-      // [  1] 0x0000000000600000 0x0000000000601000 0x0000000000000000
-      // /tmp/a.out
-      // [  2] 0x0000000000601000 0x0000000000602000 0x0000000000000001
-      // /tmp/a.out
+      // Parse the NT_FILE to look for stuff in paths to shared libraries As
+      // the contents look like this in a 64 bit ELF core file: count     =
+      // 0x000000000000000a (10) page_size = 0x0000000000001000 (4096) Index
+      // start              end                file_ofs           path =====
+      // ------------------ ------------------ ------------------
+      // ------------------------------------- [  0] 0x0000000000400000
+      // 0x0000000000401000 0x0000000000000000 /tmp/a.out [  1]
+      // 0x0000000000600000 0x0000000000601000 0x0000000000000000 /tmp/a.out [
+      // 2] 0x0000000000601000 0x0000000000602000 0x0000000000000001 /tmp/a.out
       // [  3] 0x00007fa79c9ed000 0x00007fa79cba8000 0x0000000000000000
-      // /lib/x86_64-linux-gnu/libc-2.19.so
-      // [  4] 0x00007fa79cba8000 0x00007fa79cda7000 0x00000000000001bb
-      // /lib/x86_64-linux-gnu/libc-2.19.so
-      // [  5] 0x00007fa79cda7000 0x00007fa79cdab000 0x00000000000001ba
-      // /lib/x86_64-linux-gnu/libc-2.19.so
-      // [  6] 0x00007fa79cdab000 0x00007fa79cdad000 0x00000000000001be
-      // /lib/x86_64-linux-gnu/libc-2.19.so
-      // [  7] 0x00007fa79cdb2000 0x00007fa79cdd5000 0x0000000000000000
-      // /lib/x86_64-linux-gnu/ld-2.19.so
-      // [  8] 0x00007fa79cfd4000 0x00007fa79cfd5000 0x0000000000000022
-      // /lib/x86_64-linux-gnu/ld-2.19.so
-      // [  9] 0x00007fa79cfd5000 0x00007fa79cfd6000 0x0000000000000023
-      // /lib/x86_64-linux-gnu/ld-2.19.so
-      // In the 32 bit ELFs the count, page_size, start, end, file_ofs are
-      // uint32_t
-      // For reference: see readelf source code (in binutils).
+      // /lib/x86_64-linux-gnu/libc-2.19.so [  4] 0x00007fa79cba8000
+      // 0x00007fa79cda7000 0x00000000000001bb /lib/x86_64-linux-
+      // gnu/libc-2.19.so [  5] 0x00007fa79cda7000 0x00007fa79cdab000
+      // 0x00000000000001ba /lib/x86_64-linux-gnu/libc-2.19.so [  6]
+      // 0x00007fa79cdab000 0x00007fa79cdad000 0x00000000000001be /lib/x86_64
+      // -linux-gnu/libc-2.19.so [  7] 0x00007fa79cdb2000 0x00007fa79cdd5000
+      // 0x0000000000000000 /lib/x86_64-linux-gnu/ld-2.19.so [  8]
+      // 0x00007fa79cfd4000 0x00007fa79cfd5000 0x0000000000000022 /lib/x86_64
+      // -linux-gnu/ld-2.19.so [  9] 0x00007fa79cfd5000 0x00007fa79cfd6000
+      // 0x0000000000000023 /lib/x86_64-linux-gnu/ld-2.19.so In the 32 bit ELFs
+      // the count, page_size, start, end, file_ofs are uint32_t For reference:
+      // see readelf source code (in binutils).
       if (note.n_type == NT_FILE) {
         uint64_t count = data.GetAddress(&offset);
         const char *cstr;
@@ -1399,15 +1388,14 @@
         }
         if (arch_spec.IsMIPS() &&
             arch_spec.GetTriple().getOS() == llvm::Triple::OSType::UnknownOS)
-          // In case of MIPSR6, the LLDB_NT_OWNER_GNU note is missing
-          // for some cases (e.g. compile with -nostdlib)
-          // Hence set OS to Linux
+          // In case of MIPSR6, the LLDB_NT_OWNER_GNU note is missing for some
+          // cases (e.g. compile with -nostdlib) Hence set OS to Linux
           arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux); 
       }
     }
 
-    // Calculate the offset of the next note just in case "offset" has been used
-    // to poke at the contents of the note data
+    // Calculate the offset of the next note just in case "offset" has been
+    // used to poke at the contents of the note data
     offset = note_offset + note.GetByteSize();
   }
 
@@ -1507,13 +1495,12 @@
     arch_spec.SetArchitecture(eArchTypeELF, header.e_machine, sub_type,
                               header.e_ident[EI_OSABI]);
     
-    // Validate if it is ok to remove GetOsFromOSABI.
-    // Note, that now the OS is determined based on EI_OSABI flag and
-    // the info extracted from ELF notes (see RefineModuleDetailsFromNote).
-    // However in some cases that still might be not enough: for example
-    // a shared library might not have any notes at all
-    // and have EI_OSABI flag set to System V,
-    // as result the OS will be set to UnknownOS.
+    // Validate if it is ok to remove GetOsFromOSABI. Note, that now the OS is
+    // determined based on EI_OSABI flag and the info extracted from ELF notes
+    // (see RefineModuleDetailsFromNote). However in some cases that still
+    // might be not enough: for example a shared library might not have any
+    // notes at all and have EI_OSABI flag set to System V, as result the OS
+    // will be set to UnknownOS.
     GetOsFromOSABI(header.e_ident[EI_OSABI], ostype);
     spec_ostype = arch_spec.GetTriple().getOS();
     assert(spec_ostype == ostype);
@@ -1844,23 +1831,19 @@
       }
       // .debug_abbrev – Abbreviations used in the .debug_info section
       // .debug_aranges – Lookup table for mapping addresses to compilation
-      // units
-      // .debug_frame – Call frame information
-      // .debug_info – The core DWARF information section
-      // .debug_line – Line number information
+      // units .debug_frame – Call frame information .debug_info – The core
+      // DWARF information section .debug_line – Line number information
       // .debug_loc – Location lists used in DW_AT_location attributes
-      // .debug_macinfo – Macro information
-      // .debug_pubnames – Lookup table for mapping object and function names to
-      // compilation units
+      // .debug_macinfo – Macro information .debug_pubnames – Lookup table
+      // for mapping object and function names to compilation units
       // .debug_pubtypes – Lookup table for mapping type names to compilation
-      // units
-      // .debug_ranges – Address ranges used in DW_AT_ranges attributes
-      // .debug_str – String table used in .debug_info
-      // MISSING? .gnu_debugdata - "mini debuginfo / MiniDebugInfo" section,
-      // http://sourceware.org/gdb/onlinedocs/gdb/MiniDebugInfo.html
-      // MISSING? .debug-index -
-      // http://src.chromium.org/viewvc/chrome/trunk/src/build/gdb-add-index?pathrev=144644
-      // MISSING? .debug_types - Type descriptions from DWARF 4? See
+      // units .debug_ranges – Address ranges used in DW_AT_ranges attributes
+      // .debug_str – String table used in .debug_info MISSING?
+      // .gnu_debugdata - "mini debuginfo / MiniDebugInfo" section,
+      // http://sourceware.org/gdb/onlinedocs/gdb/MiniDebugInfo.html MISSING?
+      // .debug-index - http://src.chromium.org/viewvc/chrome/trunk/src/build
+      // /gdb-add-index?pathrev=144644 MISSING? .debug_types - Type
+      // descriptions from DWARF 4? See
       // http://gcc.gnu.org/wiki/DwarfSeparateTypeInfo
       else if (name == g_sect_name_dwarf_debug_abbrev)
         sect_type = eSectionTypeDWARFDebugAbbrev;
@@ -1943,10 +1926,8 @@
 
       if (eSectionTypeOther == sect_type) {
         // the kalimba toolchain assumes that ELF section names are free-form.
-        // It does
-        // support linkscripts which (can) give rise to various arbitrarily
-        // named
-        // sections being "Code" or "Data".
+        // It does support linkscripts which (can) give rise to various
+        // arbitrarily named sections being "Code" or "Data".
         sect_type = kalimbaSectionType(m_header, header);
       }
 
@@ -2006,11 +1987,9 @@
 }
 
 // Find the arm/aarch64 mapping symbol character in the given symbol name.
-// Mapping symbols have the
-// form of "$<char>[.<any>]*". Additionally we recognize cases when the mapping
-// symbol prefixed by
-// an arbitrary string because if a symbol prefix added to each symbol in the
-// object file with
+// Mapping symbols have the form of "$<char>[.<any>]*". Additionally we
+// recognize cases when the mapping symbol prefixed by an arbitrary string
+// because if a symbol prefix added to each symbol in the object file with
 // objcopy then the mapping symbols are also prefixed.
 static char FindArmAarch64MappingSymbol(const char *symbol_name) {
   if (!symbol_name)
@@ -2052,19 +2031,15 @@
   static ConstString opd_section_name(".opd"); // For ppc64
 
   // On Android the oatdata and the oatexec symbols in the oat and odex files
-  // covers the full
-  // .text section what causes issues with displaying unusable symbol name to
-  // the user and very
-  // slow unwinding speed because the instruction emulation based unwind plans
-  // try to emulate all
-  // instructions in these symbols. Don't add these symbols to the symbol list
-  // as they have no
-  // use for the debugger and they are causing a lot of trouble.
-  // Filtering can't be restricted to Android because this special object file
-  // don't contain the
-  // note section specifying the environment to Android but the custom extension
-  // and file name
-  // makes it highly unlikely that this will collide with anything else.
+  // covers the full .text section what causes issues with displaying unusable
+  // symbol name to the user and very slow unwinding speed because the
+  // instruction emulation based unwind plans try to emulate all instructions
+  // in these symbols. Don't add these symbols to the symbol list as they have
+  // no use for the debugger and they are causing a lot of trouble. Filtering
+  // can't be restricted to Android because this special object file don't
+  // contain the note section specifying the environment to Android but the
+  // custom extension and file name makes it highly unlikely that this will
+  // collide with anything else.
   ConstString file_extension = m_file.GetFileNameExtension();
   bool skip_oatdata_oatexec = file_extension == ConstString("oat") ||
                               file_extension == ConstString("odex");
@@ -2076,8 +2051,8 @@
       module_sp ? module_sp->GetSectionList() : nullptr;
 
   // Local cache to avoid doing a FindSectionByName for each symbol. The "const
-  // char*" key must
-  // came from a ConstString object so they can be compared by pointer
+  // char*" key must came from a ConstString object so they can be compared by
+  // pointer
   std::unordered_map<const char *, lldb::SectionSP> section_name_to_section;
 
   unsigned i;
@@ -2095,8 +2070,7 @@
       continue;
 
     // Skipping oatdata and oatexec sections if it is requested. See details
-    // above the
-    // definition of skip_oatdata_oatexec for the reasons.
+    // above the definition of skip_oatdata_oatexec for the reasons.
     if (skip_oatdata_oatexec && (::strcmp(symbol_name, "oatdata") == 0 ||
                                  ::strcmp(symbol_name, "oatexec") == 0))
       continue;
@@ -2127,8 +2101,8 @@
         break;
 
       case STT_OBJECT:
-        // The symbol is associated with a data object, such as a variable,
-        // an array, etc.
+        // The symbol is associated with a data object, such as a variable, an
+        // array, etc.
         symbol_type = eSymbolTypeData;
         break;
 
@@ -2139,13 +2113,13 @@
 
       case STT_SECTION:
         // The symbol is associated with a section. Symbol table entries of
-        // this type exist primarily for relocation and normally have
-        // STB_LOCAL binding.
+        // this type exist primarily for relocation and normally have STB_LOCAL
+        // binding.
         break;
 
       case STT_FILE:
-        // Conventionally, the symbol's name gives the name of the source
-        // file associated with the object file. A file symbol has STB_LOCAL
+        // Conventionally, the symbol's name gives the name of the source file
+        // associated with the object file. A file symbol has STB_LOCAL
         // binding, its section index is SHN_ABS, and it precedes the other
         // STB_LOCAL symbols for the file, if it is present.
         symbol_type = eSymbolTypeSourceFile;
@@ -2228,12 +2202,11 @@
       if (arch.GetMachine() == llvm::Triple::arm) {
         if (symbol_type == eSymbolTypeCode) {
           if (symbol.st_value & 1) {
-            // Subtracting 1 from the address effectively unsets
-            // the low order bit, which results in the address
-            // actually pointing to the beginning of the symbol.
-            // This delta will be used below in conjunction with
-            // symbol.st_value to produce the final symbol_value
-            // that we store in the symtab.
+            // Subtracting 1 from the address effectively unsets the low order
+            // bit, which results in the address actually pointing to the
+            // beginning of the symbol. This delta will be used below in
+            // conjunction with symbol.st_value to produce the final
+            // symbol_value that we store in the symtab.
             symbol_value_offset = -1;
             m_address_class_map[symbol.st_value ^ 1] =
                 eAddressClassCodeAlternateISA;
@@ -2280,20 +2253,16 @@
     }
 
     // symbol_value_offset may contain 0 for ARM symbols or -1 for THUMB
-    // symbols. See above for
-    // more details.
+    // symbols. See above for more details.
     uint64_t symbol_value = symbol.st_value + symbol_value_offset;
 
     if (symbol_section_sp == nullptr && section_idx == SHN_ABS &&
         symbol.st_size != 0) {
       // We don't have a section for a symbol with non-zero size. Create a new
-      // section for it
-      // so the address range covered by the symbol is also covered by the
-      // module (represented
-      // through the section list). It is needed so module lookup for the
-      // addresses covered
-      // by this symbol will be successfull. This case happens for absolute
-      // symbols.
+      // section for it so the address range covered by the symbol is also
+      // covered by the module (represented through the section list). It is
+      // needed so module lookup for the addresses covered by this symbol will
+      // be successfull. This case happens for absolute symbols.
       ConstString fake_section_name(std::string(".absolute.") + symbol_name);
       symbol_section_sp =
           std::make_shared<Section>(module_sp, this, SHN_ABS, fake_section_name,
@@ -2336,8 +2305,7 @@
     Mangled mangled(ConstString(symbol_bare), is_mangled);
 
     // Now append the suffix back to mangled and unmangled names. Only do it if
-    // the
-    // demangling was successful (string is not empty).
+    // the demangling was successful (string is not empty).
     if (has_suffix) {
       llvm::StringRef suffix = symbol_ref.substr(version_pos);
 
@@ -2353,12 +2321,10 @@
     }
 
     // In ELF all symbol should have a valid size but it is not true for some
-    // function symbols
-    // coming from hand written assembly. As none of the function symbol should
-    // have 0 size we
-    // try to calculate the size for these symbols in the symtab with saying
-    // that their original
-    // size is not valid.
+    // function symbols coming from hand written assembly. As none of the
+    // function symbol should have 0 size we try to calculate the size for
+    // these symbols in the symtab with saying that their original size is not
+    // valid.
     bool symbol_size_valid =
         symbol.st_size != 0 || symbol.getType() != STT_FUNC;
 
@@ -2387,8 +2353,7 @@
                                          lldb_private::Section *symtab) {
   if (symtab->GetObjectFile() != this) {
     // If the symbol table section is owned by a different object file, have it
-    // do the
-    // parsing.
+    // do the parsing.
     ObjectFileELF *obj_file_elf =
         static_cast<ObjectFileELF *>(symtab->GetObjectFile());
     return obj_file_elf->ParseSymbolTable(symbol_table, start_id, symtab);
@@ -2404,8 +2369,8 @@
   assert(symtab_hdr->sh_type == SHT_SYMTAB ||
          symtab_hdr->sh_type == SHT_DYNSYM);
 
-  // sh_link: section header index of associated string table.
-  // Section ID's are ones based.
+  // sh_link: section header index of associated string table. Section ID's are
+  // ones based.
   user_id_t strtab_id = symtab_hdr->sh_link + 1;
   Section *strtab = section_list->FindSectionByID(strtab_id).get();
 
@@ -2490,19 +2455,17 @@
   return 0;
 }
 
-// Returns the size of the normal plt entries and the offset of the first normal
-// plt entry. The
-// 0th entry in the plt table is usually a resolution entry which have different
-// size in some
-// architectures then the rest of the plt entries.
+// Returns the size of the normal plt entries and the offset of the first
+// normal plt entry. The 0th entry in the plt table is usually a resolution
+// entry which have different size in some architectures then the rest of the
+// plt entries.
 static std::pair<uint64_t, uint64_t>
 GetPltEntrySizeAndOffset(const ELFSectionHeader *rel_hdr,
                          const ELFSectionHeader *plt_hdr) {
   const elf_xword num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize;
 
-  // Clang 3.3 sets entsize to 4 for 32-bit binaries, but the plt entries are 16
-  // bytes.
-  // So round the entsize up by the alignment if addralign is set.
+  // Clang 3.3 sets entsize to 4 for 32-bit binaries, but the plt entries are
+  // 16 bytes. So round the entsize up by the alignment if addralign is set.
   elf_xword plt_entsize =
       plt_hdr->sh_addralign
           ? llvm::alignTo(plt_hdr->sh_entsize, plt_hdr->sh_addralign)
@@ -2514,12 +2477,10 @@
   // just in case.
   if (plt_entsize <= 4) {
     // The linker haven't set the plt_hdr->sh_entsize field. Try to guess the
-    // size of the plt
-    // entries based on the number of entries and the size of the plt section
-    // with the
-    // assumption that the size of the 0th entry is at least as big as the size
-    // of the normal
-    // entries and it isn't much bigger then that.
+    // size of the plt entries based on the number of entries and the size of
+    // the plt section with the assumption that the size of the 0th entry is at
+    // least as big as the size of the normal entries and it isn't much bigger
+    // then that.
     if (plt_hdr->sh_addralign)
       plt_entsize = plt_hdr->sh_size / plt_hdr->sh_addralign /
                     (num_relocations + 1) * plt_hdr->sh_addralign;
@@ -2812,8 +2773,7 @@
     return NULL;
 
   // We always want to use the main object file so we (hopefully) only have one
-  // cached copy
-  // of our symtab, dynamic sections, etc.
+  // cached copy of our symtab, dynamic sections, etc.
   ObjectFile *module_obj_file = module_sp->GetObjectFile();
   if (module_obj_file && module_obj_file != this)
     return module_obj_file->GetSymtab();
@@ -2828,18 +2788,15 @@
 
     // Sharable objects and dynamic executables usually have 2 distinct symbol
     // tables, one named ".symtab", and the other ".dynsym". The dynsym is a
-    // smaller
-    // version of the symtab that only contains global symbols. The information
-    // found
-    // in the dynsym is therefore also found in the symtab, while the reverse is
-    // not
-    // necessarily true.
+    // smaller version of the symtab that only contains global symbols. The
+    // information found in the dynsym is therefore also found in the symtab,
+    // while the reverse is not necessarily true.
     Section *symtab =
         section_list->FindSectionByType(eSectionTypeELFSymbolTable, true).get();
     if (!symtab) {
       // The symtab section is non-allocable and can be stripped, so if it
-      // doesn't exist
-      // then use the dynsym section which should always be there.
+      // doesn't exist then use the dynsym section which should always be
+      // there.
       symtab =
           section_list->FindSectionByType(eSectionTypeELFDynamicSymbols, true)
               .get();
@@ -2886,8 +2843,7 @@
     }
 
     // If we still don't have any symtab then create an empty instance to avoid
-    // do the section
-    // lookup next time.
+    // do the section lookup next time.
     if (m_symtab_ap == nullptr)
       m_symtab_ap.reset(new Symtab(this));
 
@@ -2901,8 +2857,8 @@
 {
   static const char *debug_prefix = ".debug";
 
-  // Set relocated bit so we stop getting called, regardless of
-  // whether we actually relocate.
+  // Set relocated bit so we stop getting called, regardless of whether we
+  // actually relocate.
   section->SetIsRelocated(true);
 
   // We only relocate in ELF relocatable files
@@ -2945,12 +2901,10 @@
     return;
 
   // First we save the new symbols into a separate list and add them to the
-  // symbol table after
-  // we colleced all symbols we want to add. This is neccessary because adding a
-  // new symbol
-  // invalidates the internal index of the symtab what causing the next lookup
-  // to be slow because
-  // it have to recalculate the index first.
+  // symbol table after we colleced all symbols we want to add. This is
+  // neccessary because adding a new symbol invalidates the internal index of
+  // the symtab what causing the next lookup to be slow because it have to
+  // recalculate the index first.
   std::vector<Symbol> new_symbols;
 
   eh_frame->ForEachFDEEntries([this, symbol_table, section_list, &new_symbols](
@@ -3144,8 +3098,8 @@
 //----------------------------------------------------------------------
 // DumpELFProgramHeader_p_type
 //
-// Dump an token value for the ELF program header member p_type which
-// describes the type of the program header
+// Dump an token value for the ELF program header member p_type which describes
+// the type of the program header
 // ----------------------------------------------------------------------
 void ObjectFileELF::DumpELFProgramHeader_p_type(Stream *s, elf_word p_type) {
   const int kStrWidth = 15;
@@ -3316,8 +3270,7 @@
   if (CalculateType() == eTypeCoreFile &&
       m_arch_spec.TripleOSIsUnspecifiedUnknown()) {
     // Core files don't have section headers yet they have PT_NOTE program
-    // headers
-    // that might shed more light on the architecture
+    // headers that might shed more light on the architecture
     if (ParseProgramHeaders()) {
       for (size_t i = 1, count = GetProgramHeaderCount(); i <= count; ++i) {
         const elf::ELFProgramHeader *header = GetProgramHeaderByIndex(i);
@@ -3378,22 +3331,22 @@
   case llvm::ELF::ET_EXEC:
     // 2 - Executable file
     // TODO: is there any way to detect that an executable is a kernel
-    // related executable by inspecting the program headers, section
-    // headers, symbols, or any other flag bits???
+    // related executable by inspecting the program headers, section headers,
+    // symbols, or any other flag bits???
     return eStrataUser;
 
   case llvm::ELF::ET_DYN:
     // 3 - Shared object file
     // TODO: is there any way to detect that an shared library is a kernel
-    // related executable by inspecting the program headers, section
-    // headers, symbols, or any other flag bits???
+    // related executable by inspecting the program headers, section headers,
+    // symbols, or any other flag bits???
     return eStrataUnknown;
 
   case ET_CORE:
     // 4 - Core file
     // TODO: is there any way to detect that an core file is a kernel
-    // related executable by inspecting the program headers, section
-    // headers, symbols, or any other flag bits???
+    // related executable by inspecting the program headers, section headers,
+    // symbols, or any other flag bits???
     return eStrataUnknown;
 
   default:
@@ -3468,8 +3421,8 @@
 
 std::vector<ObjectFile::LoadableData>
 ObjectFileELF::GetLoadableData(Target &target) {
-  // Create a list of loadable data from loadable segments,
-  // using physical addresses if they aren't all null
+  // Create a list of loadable data from loadable segments, using physical
+  // addresses if they aren't all null
   std::vector<LoadableData> loadables;
   size_t header_count = ParseProgramHeaders();
   bool should_use_paddr = AnySegmentHasPhysicalAddress();
