[lld] r221583 - Add support library.

Shankar Easwaran shankare at codeaurora.org
Mon Nov 10 06:54:38 PST 2014


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





More information about the llvm-commits mailing list