[lld] r221583 - Add support library.
Michael Spencer
bigcheesegs at gmail.com
Mon Nov 10 15:09:20 PST 2014
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
More information about the llvm-commits
mailing list