[lld] r221583 - Add support library.

Shankar Easwaran shankare at codeaurora.org
Mon Nov 10 16:01:58 PST 2014


I will change the code to use StringRef directly.

Thanks for the pointer!

Shankar Easwaran

On 11/10/2014 5:09 PM, Michael Spencer wrote:
> We already have this functionality in the llvm support library.
> StringRef::getAs{Uns,S}ignedInteger().
>
> - Michael Spencer
>
>
> On Mon, Nov 10, 2014 at 6:54 AM, Shankar Easwaran
> <shankare at codeaurora.org> wrote:
>> Author: shankare
>> Date: Mon Nov 10 08:54:34 2014
>> New Revision: 221583
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=221583&view=rev
>> Log:
>> Add support library.
>>
>> The parsing routines in the linker script to parse strings encoded in various
>> formats(hexadecimal, octal, decimal, etc), is needed by the GNU driver too. This
>> library provides helper functions for all flavors and flavors to add helper
>> functions which other flavors may make use of.
>>
>> Added:
>>      lld/trunk/include/lld/Support/
>>      lld/trunk/include/lld/Support/NumParse.h
>>      lld/trunk/lib/Support/
>>      lld/trunk/lib/Support/CMakeLists.txt
>>      lld/trunk/lib/Support/NumParse.cpp
>> Modified:
>>      lld/trunk/lib/CMakeLists.txt
>>      lld/trunk/lib/Makefile
>>      lld/trunk/lib/ReaderWriter/CMakeLists.txt
>>      lld/trunk/lib/ReaderWriter/LinkerScript.cpp
>>      lld/trunk/tools/lld/Makefile
>>      lld/trunk/unittests/DriverTests/Makefile
>>      lld/trunk/utils/linker-script-test/Makefile
>>
>> Added: lld/trunk/include/lld/Support/NumParse.h
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Support/NumParse.h?rev=221583&view=auto
>> ==============================================================================
>> --- lld/trunk/include/lld/Support/NumParse.h (added)
>> +++ lld/trunk/include/lld/Support/NumParse.h Mon Nov 10 08:54:34 2014
>> @@ -0,0 +1,45 @@
>> +//===-- lld/Support/NumParse.h - Number parsing -----------------*- C++ -*-===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +///
>> +/// \file
>> +/// \brief Parses string in various formats to decimal.
>> +///
>> +//===----------------------------------------------------------------------===//
>> +
>> +#ifndef LLD_SUPPORT_NUM_PARSE_H
>> +#define LLD_SUPPORT_NUM_PARSE_H
>> +
>> +#include "lld/Core/LLVM.h"
>> +#include "llvm/ADT/StringSwitch.h"
>> +#include "llvm/Support/ErrorOr.h"
>> +#include "llvm/Support/raw_ostream.h"
>> +#include <memory>
>> +#include <system_error>
>> +#include <vector>
>> +
>> +namespace lld {
>> +
>> +/// \brief Convert a string in decimal to decimal.
>> +llvm::ErrorOr<uint64_t> parseDecimal(StringRef str);
>> +
>> +/// \brief Convert a string in octal to decimal.
>> +llvm::ErrorOr<uint64_t> parseOctal(StringRef str);
>> +
>> +/// \brief Convert a string in Binary to decimal.
>> +llvm::ErrorOr<uint64_t> parseBinary(StringRef str);
>> +
>> +/// \brief Convert a string in Hexadecimal to decimal.
>> +llvm::ErrorOr<uint64_t> parseHex(StringRef str);
>> +
>> +/// \brief Parse a number represested in a string as
>> +//  Hexadecimal, Octal, Binary or Decimal to decimal
>> +llvm::ErrorOr<uint64_t> parseNum(StringRef str, bool parseExtensions = true);
>> +}
>> +
>> +#endif // LLD_SUPPORT_NUM_PARSE_H
>>
>> Modified: lld/trunk/lib/CMakeLists.txt
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/CMakeLists.txt?rev=221583&r1=221582&r2=221583&view=diff
>> ==============================================================================
>> --- lld/trunk/lib/CMakeLists.txt (original)
>> +++ lld/trunk/lib/CMakeLists.txt Mon Nov 10 08:54:34 2014
>> @@ -3,3 +3,4 @@ add_subdirectory(Core)
>>   add_subdirectory(Driver)
>>   add_subdirectory(Passes)
>>   add_subdirectory(ReaderWriter)
>> +add_subdirectory(Support)
>>
>> Modified: lld/trunk/lib/Makefile
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Makefile?rev=221583&r1=221582&r2=221583&view=diff
>> ==============================================================================
>> --- lld/trunk/lib/Makefile (original)
>> +++ lld/trunk/lib/Makefile Mon Nov 10 08:54:34 2014
>> @@ -9,7 +9,7 @@
>>   LLD_LEVEL := ..
>>
>>   # ARCMigrate and Rewrite are always needed because of libclang.
>> -PARALLEL_DIRS = Config Core Driver Passes ReaderWriter
>> +PARALLEL_DIRS = Config Core Driver Passes ReaderWriter Support
>>
>>   include $(LLD_LEVEL)/../../Makefile.config
>>
>>
>> Modified: lld/trunk/lib/ReaderWriter/CMakeLists.txt
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/CMakeLists.txt?rev=221583&r1=221582&r2=221583&view=diff
>> ==============================================================================
>> --- lld/trunk/lib/ReaderWriter/CMakeLists.txt (original)
>> +++ lld/trunk/lib/ReaderWriter/CMakeLists.txt Mon Nov 10 08:54:34 2014
>> @@ -18,4 +18,5 @@ add_lld_library(lldReaderWriter
>>   target_link_libraries(lldReaderWriter ${cmake_2_8_12_INTERFACE}
>>     lldCore
>>     lldPasses
>> +  lldSupport
>>     )
>>
>> Modified: lld/trunk/lib/ReaderWriter/LinkerScript.cpp
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/LinkerScript.cpp?rev=221583&r1=221582&r2=221583&view=diff
>> ==============================================================================
>> --- lld/trunk/lib/ReaderWriter/LinkerScript.cpp (original)
>> +++ lld/trunk/lib/ReaderWriter/LinkerScript.cpp Mon Nov 10 08:54:34 2014
>> @@ -13,6 +13,7 @@
>>   //===----------------------------------------------------------------------===//
>>
>>   #include "lld/ReaderWriter/LinkerScript.h"
>> +#include "lld/Support/NumParse.h"
>>
>>   namespace lld {
>>   namespace script {
>> @@ -89,56 +90,7 @@ void Token::dump(raw_ostream &os) const
>>     os << _range << "\n";
>>   }
>>
>> -static llvm::ErrorOr<uint64_t> parseDecimal(StringRef str) {
>> -  uint64_t res = 0;
>> -  for (auto &c : str) {
>> -    res *= 10;
>> -    if (c < '0' || c > '9')
>> -      return llvm::ErrorOr<uint64_t>(std::make_error_code(std::errc::io_error));
>> -    res += c - '0';
>> -  }
>> -  return res;
>> -}
>> -
>> -static llvm::ErrorOr<uint64_t> parseOctal(StringRef str) {
>> -  uint64_t res = 0;
>> -  for (auto &c : str) {
>> -    res <<= 3;
>> -    if (c < '0' || c > '7')
>> -      return llvm::ErrorOr<uint64_t>(std::make_error_code(std::errc::io_error));
>> -    res += c - '0';
>> -  }
>> -  return res;
>> -}
>> -
>> -static llvm::ErrorOr<uint64_t> parseBinary(StringRef str) {
>> -  uint64_t res = 0;
>> -  for (auto &c : str) {
>> -    res <<= 1;
>> -    if (c != '0' && c != '1')
>> -      return llvm::ErrorOr<uint64_t>(std::make_error_code(std::errc::io_error));
>> -    res += c - '0';
>> -  }
>> -  return res;
>> -}
>> -
>> -static llvm::ErrorOr<uint64_t> parseHex(StringRef str) {
>> -  uint64_t res = 0;
>> -  for (auto &c : str) {
>> -    res <<= 4;
>> -    if (c >= '0' && c <= '9')
>> -      res += c - '0';
>> -    else if (c >= 'a' && c <= 'f')
>> -      res += c - 'a' + 10;
>> -    else if (c >= 'A' && c <= 'F')
>> -      res += c - 'A' + 10;
>> -    else
>> -      return llvm::ErrorOr<uint64_t>(std::make_error_code(std::errc::io_error));
>> -  }
>> -  return res;
>> -}
>> -
>> -static bool parseHexToByteStream(StringRef str, std::string &buf) {
>> +bool parseHexToByteStream(StringRef str, std::string &buf) {
>>     unsigned char byte = 0;
>>     bool dumpByte = str.size() % 2;
>>     for (auto &c : str) {
>> @@ -178,63 +130,6 @@ static void dumpByteStream(raw_ostream &
>>     }
>>   }
>>
>> -static llvm::ErrorOr<uint64_t> parseNum(StringRef str) {
>> -  unsigned multiplier = 1;
>> -  enum NumKind { decimal, hex, octal, binary };
>> -  NumKind kind = llvm::StringSwitch<NumKind>(str)
>> -                     .StartsWith("0x", hex)
>> -                     .StartsWith("0X", hex)
>> -                     .StartsWith("0", octal)
>> -                     .Default(decimal);
>> -
>> -  // Parse scale
>> -  if (str.endswith("K")) {
>> -    multiplier = 1 << 10;
>> -    str = str.drop_back();
>> -  } else if (str.endswith("M")) {
>> -    multiplier = 1 << 20;
>> -    str = str.drop_back();
>> -  }
>> -
>> -  // Parse type
>> -  if (str.endswith_lower("o")) {
>> -    kind = octal;
>> -    str = str.drop_back();
>> -  } else if (str.endswith_lower("h")) {
>> -    kind = hex;
>> -    str = str.drop_back();
>> -  } else if (str.endswith_lower("d")) {
>> -    kind = decimal;
>> -    str = str.drop_back();
>> -  } else if (str.endswith_lower("b")) {
>> -    kind = binary;
>> -    str = str.drop_back();
>> -  }
>> -
>> -  llvm::ErrorOr<uint64_t> res(0);
>> -  switch (kind) {
>> -  case hex:
>> -    if (str.startswith_lower("0x"))
>> -      str = str.drop_front(2);
>> -    res = parseHex(str);
>> -    break;
>> -  case octal:
>> -    res = parseOctal(str);
>> -    break;
>> -  case decimal:
>> -    res = parseDecimal(str);
>> -    break;
>> -  case binary:
>> -    res = parseBinary(str);
>> -    break;
>> -  }
>> -  if (res.getError())
>> -    return res;
>> -
>> -  *res = *res * multiplier;
>> -  return res;
>> -}
>> -
>>   bool Lexer::canStartNumber(char c) const {
>>     return '0' <= c && c <= '9';
>>   }
>>
>> Added: lld/trunk/lib/Support/CMakeLists.txt
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Support/CMakeLists.txt?rev=221583&view=auto
>> ==============================================================================
>> --- lld/trunk/lib/Support/CMakeLists.txt (added)
>> +++ lld/trunk/lib/Support/CMakeLists.txt Mon Nov 10 08:54:34 2014
>> @@ -0,0 +1,3 @@
>> +add_lld_library(lldSupport
>> +  NumParse.cpp
>> +  )
>>
>> Added: lld/trunk/lib/Support/NumParse.cpp
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Support/NumParse.cpp?rev=221583&view=auto
>> ==============================================================================
>> --- lld/trunk/lib/Support/NumParse.cpp (added)
>> +++ lld/trunk/lib/Support/NumParse.cpp Mon Nov 10 08:54:34 2014
>> @@ -0,0 +1,133 @@
>> +//===-- lld/Support/NumParse.cpp - Number parsing ---------------*- C++ -*-===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +///
>> +/// \file
>> +/// \brief Parses string in various formats to decimal.
>> +///
>> +//===----------------------------------------------------------------------===//
>> +
>> +#include "lld/Support/NumParse.h"
>> +
>> +using namespace llvm;
>> +
>> +namespace lld {
>> +/// \brief Convert a string in decimal to decimal.
>> +llvm::ErrorOr<uint64_t> parseDecimal(StringRef str) {
>> +  uint64_t res = 0;
>> +  for (auto &c : str) {
>> +    res *= 10;
>> +    if (c < '0' || c > '9')
>> +      return llvm::ErrorOr<uint64_t>(std::make_error_code(std::errc::io_error));
>> +    res += c - '0';
>> +  }
>> +  return res;
>> +}
>> +
>> +/// \brief Convert a string in octal to decimal.
>> +llvm::ErrorOr<uint64_t> parseOctal(StringRef str) {
>> +  uint64_t res = 0;
>> +  for (auto &c : str) {
>> +    res <<= 3;
>> +    if (c < '0' || c > '7')
>> +      return llvm::ErrorOr<uint64_t>(std::make_error_code(std::errc::io_error));
>> +    res += c - '0';
>> +  }
>> +  return res;
>> +}
>> +
>> +/// \brief Convert a string in Binary to decimal.
>> +llvm::ErrorOr<uint64_t> parseBinary(StringRef str) {
>> +  uint64_t res = 0;
>> +  for (auto &c : str) {
>> +    res <<= 1;
>> +    if (c != '0' && c != '1')
>> +      return llvm::ErrorOr<uint64_t>(std::make_error_code(std::errc::io_error));
>> +    res += c - '0';
>> +  }
>> +  return res;
>> +}
>> +
>> +/// \brief Convert a string in Hexadecimal to decimal.
>> +llvm::ErrorOr<uint64_t> parseHex(StringRef str) {
>> +  uint64_t res = 0;
>> +  for (auto &c : str) {
>> +    res <<= 4;
>> +    if (c >= '0' && c <= '9')
>> +      res += c - '0';
>> +    else if (c >= 'a' && c <= 'f')
>> +      res += c - 'a' + 10;
>> +    else if (c >= 'A' && c <= 'F')
>> +      res += c - 'A' + 10;
>> +    else
>> +      return llvm::ErrorOr<uint64_t>(std::make_error_code(std::errc::io_error));
>> +  }
>> +  return res;
>> +}
>> +
>> +/// \brief Parse a number represested in a string as
>> +//  Hexadecimal, Octal, Binary or Decimal to decimal
>> +llvm::ErrorOr<uint64_t> parseNum(StringRef str, bool parseExtensions) {
>> +  unsigned multiplier = 1;
>> +  enum NumKind { decimal, hex, octal, binary };
>> +  NumKind kind = llvm::StringSwitch<NumKind>(str)
>> +                     .StartsWith("0x", hex)
>> +                     .StartsWith("0X", hex)
>> +                     .StartsWith("0", octal)
>> +                     .Default(decimal);
>> +
>> +  if (parseExtensions) {
>> +    // Parse scale
>> +    if (str.endswith("K")) {
>> +      multiplier = 1 << 10;
>> +      str = str.drop_back();
>> +    } else if (str.endswith("M")) {
>> +      multiplier = 1 << 20;
>> +      str = str.drop_back();
>> +    }
>> +
>> +    // Parse type
>> +    if (str.endswith_lower("o")) {
>> +      kind = octal;
>> +      str = str.drop_back();
>> +    } else if (str.endswith_lower("h")) {
>> +      kind = hex;
>> +      str = str.drop_back();
>> +    } else if (str.endswith_lower("d")) {
>> +      kind = decimal;
>> +      str = str.drop_back();
>> +    } else if (str.endswith_lower("b")) {
>> +      kind = binary;
>> +      str = str.drop_back();
>> +    }
>> +  }
>> +
>> +  llvm::ErrorOr<uint64_t> res(0);
>> +  switch (kind) {
>> +  case hex:
>> +    if (str.startswith_lower("0x"))
>> +      str = str.drop_front(2);
>> +    res = parseHex(str);
>> +    break;
>> +  case octal:
>> +    res = parseOctal(str);
>> +    break;
>> +  case decimal:
>> +    res = parseDecimal(str);
>> +    break;
>> +  case binary:
>> +    res = parseBinary(str);
>> +    break;
>> +  }
>> +  if (res.getError())
>> +    return res;
>> +
>> +  *res = *res * multiplier;
>> +  return res;
>> +}
>> +}
>>
>> Modified: lld/trunk/tools/lld/Makefile
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/tools/lld/Makefile?rev=221583&r1=221582&r2=221583&view=diff
>> ==============================================================================
>> --- lld/trunk/tools/lld/Makefile (original)
>> +++ lld/trunk/tools/lld/Makefile Mon Nov 10 08:54:34 2014
>> @@ -19,9 +19,9 @@ LEVEL := $(LLD_LEVEL)/../..
>>   include $(LEVEL)/Makefile.config
>>
>>   LINK_COMPONENTS := $(TARGETS_TO_BUILD)
>> -USEDLIBS = lldDriver.a lldConfig.a \
>> +USEDLIBS = lldDriver.a lldConfig.a lldSupport.a \
>>              lldELF.a lldMachO.a lldPasses.a lldPECOFF.a lldYAML.a \
>> -           lldReaderWriter.a lldCore.a lldNative.a \
>> +           lldReaderWriter.a lldCore.a lldSupport.a lldNative.a \
>>              lldHexagonELFTarget.a lldPPCELFTarget.a lldMipsELFTarget.a \
>>              lldX86ELFTarget.a lldX86_64ELFTarget.a lldAArch64ELFTarget.a \
>>              LLVMOption.a
>>
>> Modified: lld/trunk/unittests/DriverTests/Makefile
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/unittests/DriverTests/Makefile?rev=221583&r1=221582&r2=221583&view=diff
>> ==============================================================================
>> --- lld/trunk/unittests/DriverTests/Makefile (original)
>> +++ lld/trunk/unittests/DriverTests/Makefile Mon Nov 10 08:54:34 2014
>> @@ -15,5 +15,7 @@ USEDLIBS = lldDriver.a lldConfig.a \
>>              lldHexagonELFTarget.a lldPPCELFTarget.a lldMipsELFTarget.a \
>>              lldX86ELFTarget.a lldX86_64ELFTarget.a lldYAML.a \
>>              LLVMObject.a LLVMMCParser.a LLVMMC.a LLVMBitReader.a \
>> -           LLVMCore.a LLVMOption.a LLVMSupport.a lldAArch64ELFTarget.a
>> +           LLVMCore.a LLVMOption.a LLVMSupport.a lldAArch64ELFTarget.a \
>> +          lldSupport.a
>> +
>>   include $(LLD_LEVEL)/unittests/Makefile
>>
>> Modified: lld/trunk/utils/linker-script-test/Makefile
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/utils/linker-script-test/Makefile?rev=221583&r1=221582&r2=221583&view=diff
>> ==============================================================================
>> --- lld/trunk/utils/linker-script-test/Makefile (original)
>> +++ lld/trunk/utils/linker-script-test/Makefile Mon Nov 10 08:54:34 2014
>> @@ -19,6 +19,6 @@ LEVEL := $(LLD_LEVEL)/../..
>>   include $(LEVEL)/Makefile.config
>>
>>   LINK_COMPONENTS := $(TARGETS_TO_BUILD)
>> -USEDLIBS = lldReaderWriter.a LLVMSupport.a
>> +USEDLIBS = lldReaderWriter.a lldSupport.a LLVMSupport.a
>>
>>   include $(LLD_LEVEL)/Makefile
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>


-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by the Linux Foundation




More information about the llvm-commits mailing list