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