[PATCH] D25929: Add llvm-echo command.

Rafael EspĂ­ndola via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 25 05:51:59 PDT 2016


testcase?

On 24 October 2016 at 20:39, Rui Ueyama via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> ruiu created this revision.
> ruiu added reviewers: rnk, inglorion.
> ruiu added a subscriber: llvm-commits.
> Herald added subscribers: modocache, mgorny, beanz.
>
> "echo" command is not very portable. Particularly on Windows, we have
> various types of echo command that interpret backslashes, double-quotes
> and single-quotes differently. On windows, shell does not tokenize
> command line arguments but each command does, so the interpretation
> varies depending on your crt.
>
> As a result, we observed hard-to-fix errors that happened only on a
> limited set of Windows buildbots.
>
> This patch adds a portable "echo" command which always interprets
> arguments in the Unix style even on Windows. llvm-echo returns the
> same string for a string no matter what platform it is running.
> This command should fix the compatibility issue.
>
>
> https://reviews.llvm.org/D25929
>
> Files:
>   CMakeLists.txt
>   utils/llvm-echo/CMakeLists.txt
>   utils/llvm-echo/llvm-echo.cpp
>
>
> Index: utils/llvm-echo/llvm-echo.cpp
> ===================================================================
> --- /dev/null
> +++ utils/llvm-echo/llvm-echo.cpp
> @@ -0,0 +1,43 @@
> +//===- llvm-echo.cpp - The 'echo' command ---------------------------------===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +//
> +// This is an implementation of a portable "echo" command.
> +// It tokenizes command line arguments in the Unix style even on Windows.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#include "llvm/ADT/SmallVector.h"
> +#include "llvm/Support/CommandLine.h"
> +#include "llvm/Support/StringSaver.h"
> +#include <iostream>
> +
> +#if LLVM_ON_WIN32
> +#include <windows.h>
> +#endif
> +
> +using namespace llvm;
> +
> +int main(int Argc, const char **Argv) {
> +  SmallVector<const char *, 4> Args;
> +
> +#if LLVM_ON_WIN32
> +  const char *Cmdline = GetCommandLineA();
> +  BumpPtrAllocator Alloc;
> +  StringSaver Saver(Alloc);
> +  llvm::cl::TokenizeGNUCommandLine(Cmdline, Saver, Args);
> +#else
> +  Args.insert(Args.begin(), Argv, Argv + Argc);
> +#endif
> +
> +  for (int I = 1, E = Args.size(); I < E; ++I) {
> +    std::cout << Args[I];
> +    std::cout << (I == E - 1 ? "\n" : " ");
> +  }
> +  return 0;
> +}
> Index: utils/llvm-echo/CMakeLists.txt
> ===================================================================
> --- /dev/null
> +++ utils/llvm-echo/CMakeLists.txt
> @@ -0,0 +1,3 @@
> +add_llvm_utility(llvm-echo llvm-echo.cpp)
> +
> +target_link_libraries(llvm-echo LLVMSupport)
> Index: CMakeLists.txt
> ===================================================================
> --- CMakeLists.txt
> +++ CMakeLists.txt
> @@ -782,6 +782,7 @@
>    add_subdirectory(utils/PerfectShuffle)
>    add_subdirectory(utils/count)
>    add_subdirectory(utils/not)
> +  add_subdirectory(utils/llvm-echo)
>    add_subdirectory(utils/llvm-lit)
>    add_subdirectory(utils/yaml-bench)
>    add_subdirectory(utils/unittest)
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>


More information about the llvm-commits mailing list