Commit Graph

7335 Commits

Author SHA1 Message Date
Tom Stellard eb773d9b31 Add support for pointer types in patterns
Summary:
This adds support for defining patterns for global isel using pointer
types, for example:

def : Pat<(load GPR32:$src),
          (p1 (LOAD GPR32:$src))>;

DAGISelEmitter will ignore the pointer information and treat these
types as integers with the same bit-width as the pointer type.

Reviewers: dsanders, rtereshin, arsenm

Reviewed By: arsenm

Subscribers: Petar.Avramovic, wdng, rovka, kristof.beyls, jfb, volkan, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D57065

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@354510 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-20 19:43:47 +00:00
Nico Weber 760f1dae38 gn build: Merge r354365 more
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@354413 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-20 00:34:19 +00:00
Nico Weber a2bba1eb1e gn build: Merge r354365
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@354411 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-20 00:30:08 +00:00
Craig Topper e598074374 [MC] Make SubtargetFeatureKV only store one FeatureBitset and use an 'unsigned' to hold the value.
This class is used for two difference tablegen generated tables. For one of the tables the Value FeatureBitset only has one bit set. For the other usage the Implies field was unused.

This patch changes the Value field to just be an unsigned. For the usage that put a real vector in bitset, we now use the previously unused Implies field and leave the Value field unused instead.

This is good for a 16K reduction in the size of llc on my local build with all targets enabled.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@354243 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-18 06:46:17 +00:00
Nico Weber 031c241a74 gn build: Merge r354156
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@354242 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-18 01:36:52 +00:00
Julian Lettner 2cb3057fcb [lit] Remove LitTestCase
From the docs: `class LitTestCase(unittest.TestCase)`
LitTestCase is an adaptor for providing a 'unittest' compatible
interface to 'lit' tests so that we can run lit tests with standard
python test runners.

It does not seem to be used anywhere.

Differential Revision: https://reviews.llvm.org/D58264

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@354188 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-16 00:44:00 +00:00
Julian Lettner 0631be28f6 [lit][NFC] Cleanup lit worker process handling
Move code that is executed on worker process to separate file. This
makes the use of the pickled arguments stored in global variables in the
worker a bit clearer. (Still not pretty though.)

Extract handling of parallelism groups to it's own function.

Use BoundedSemaphore instead of Semaphore. BoundedSemaphore raises for
unmatched release() calls.

Cleanup imports.

Differential Revision: https://reviews.llvm.org/D58196

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@354187 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-16 00:40:40 +00:00
Julian Lettner 747940fe8d [lit][NFC] Cleanup copy&paste naming mistake
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@354095 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-15 02:44:52 +00:00
Julian Lettner d8ffa5fe1b [lit] Remove --single-process option (use -j1 instead)
Remove `--single-process` command line option. Use `-j1` instead.

Also see commit: 96adb78b120b6aa9739eb714534dc8e819f7bc52

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@354073 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-14 22:46:56 +00:00
Julian Lettner 75b1901bac [lit] Set --single-process for single tests and --threads=1
Summary:
Automatically upgrade debugging experience (single process, no thread
pool) when:
  1) we only run a single test
  2) user specifies `-j1`

Details:
Fix `--max-failures` in single process mode. Option did not have an
effect in single process mode.

Add display feedback for single process mode. Adapted test.

Improve argument checking (require positive integers).

`--single-process` is now essentially an alias for `-j1`. Should we
remove it?

Reviewers: rnk

Differential Revision: https://reviews.llvm.org/D58249

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@354068 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-14 22:30:07 +00:00
Peter Collingbourne ff64ebce03 gn build: Merge r353957.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353980 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-13 21:03:23 +00:00
David Major e126f1baea [gn build] Separate debug and optimization settings
This patch adds an `is_optimized` variable, orthogonal to `is_debug`, to allow for a gn analogue to `RelWithDebInfo` builds.

As part of this we'll want to explicitly enable GC+ICF, for the sake of `is_debug && is_optimized` builds. The flags normally default to true except that if you pass `/DEBUG` they default to false.

Differential Revision: https://reviews.llvm.org/D58075



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353888 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-12 22:24:45 +00:00
Daniel Sanders d5af09c214 [tablegen] Add locations to many PrintFatalError() calls
Summary:
While working on the GISel Combiner, I noticed I was producing location-less
error messages fairly often and set about fixing this. In the process, I
noticed quite a few places elsewhere in TableGen that also neglected to include
a relevant location.

This patch adds locations to errors that relate to a specific record (or a
field within it) and also have easy access to the relevant location. This is
particularly useful when multiclasses are involved as many of these errors
refer to the full name of a record and it's difficult to guess which substring
is grep-able.

Unfortunately, tablegen currently only supports Record granularity so it's not
currently possible to point at a specific Init so these sometimes point at the
record that caused the error rather than the precise origin of the error.

Reviewers: bogner, aditya_nandakumar, volkan, aemerson, paquette, nhaehnle

Reviewed By: nhaehnle

Subscribers: jdoerfert, nhaehnle, asb, rbar, johnrusso, simoncook, apazos, sabuasal, niosHD, jrtc27, zzheng, edward-jones, rogfer01, MartinMosbeck, brucehoult, the_o, PkmX, jocewei, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D58077

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353862 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-12 17:36:57 +00:00
Daniel Sanders 01b9856485 [tblgen] Add a timer covering the time spent reading the Instruction defs
This patch adds a -time-regions option to tablegen that can enable timers
(currently only one) that assess the performance of tablegen itself. This
can be useful for identifying scaling problems with tablegen backends.

This particular timer has allowed me to ignore time that is not attributed
the GISel combiner pass. It's useful by itself but it is particularly
useful in combination with https://reviews.llvm.org/D52954 which causes
this period of time to be annotated within Xcode Instruments which in turn
allows profile samples and recorded allocations attributed to reading
instructions to be filtered out.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353763 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-11 23:02:02 +00:00
Diana Picus 2ff2d32b96 test-release.sh: Add option to use ninja
Allow the use of ninja instead of make. This is useful on some
platforms where we'd like to be able to limit the number of link jobs
without slowing down the other steps of the release.

This patch adds a -use-ninja command line option, which sets the
generator to Ninja both for LLVM and the test-suite. It also deals with
some differences between make and ninja:
* DESTDIR handling - ninja doesn't like this to be listed after the
  target, but both make and ninja can handle it before the command
* Verbose mode - ninja uses -v, make uses VERBOSE=1
* Keep going mode - make has a -k mode, which builds as much as possible
  even when failures are encountered; for ninja we need to set a hard
  limit (we use 100 since most people won't look at 100 failures anyway)

I haven't tested with gmake.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353685 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-11 10:30:22 +00:00
Nico Weber f513877fcb gn build: Fix clang-tidy dep on ClangSACheckers.
Patch by Mirko Bonadei <mbonadei@webrtc.org>!

Differential Revision: https://reviews.llvm.org/D57998


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353657 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-11 03:09:57 +00:00
Nico Weber 8c2a52db8a gn build: Merge r353590
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353621 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-09 17:58:16 +00:00
Jessica Paquette 46a164384e [GlobalISel] Skip patterns that define complex suboperands twice instead of dying
If we run into a pattern that looks like this:

add
  (complex $x, $y)
  (complex $x, $z)

We should skip the pattern instead of asserting/doing something unpredictable.

This makes us return an Error in that case, and adds a testcase for skipped
patterns.

Differential Revision: https://reviews.llvm.org/D57980

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353586 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-09 00:29:13 +00:00
Nico Weber f2a579a53c gn build: Merge r353566
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353585 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-09 00:21:06 +00:00
Craig Topper e3696113b6 Implementation of asm-goto support in LLVM
This patch accompanies the RFC posted here:
http://lists.llvm.org/pipermail/llvm-dev/2018-October/127239.html

This patch adds a new CallBr IR instruction to support asm-goto
inline assembly like gcc as used by the linux kernel. This
instruction is both a call instruction and a terminator
instruction with multiple successors. Only inline assembly
usage is supported today.

This also adds a new INLINEASM_BR opcode to SelectionDAG and
MachineIR to represent an INLINEASM block that is also
considered a terminator instruction.

There will likely be more bug fixes and optimizations to follow
this, but we felt it had reached a point where we would like to
switch to an incremental development model.

Patch by Craig Topper, Alexander Ivchenko, Mikhail Dvoretckii

Differential Revision: https://reviews.llvm.org/D53765

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353563 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-08 20:48:56 +00:00
Nico Weber 2fdf6f97ff gn build: Merge r353471, r353373.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353518 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-08 14:19:54 +00:00
Peter Collingbourne ea1e928e56 gn build: Make check-{clang,lld,llvm} pass on FreeBSD.
Mostly achieved by assuming that anything that isn't Win or Mac is ELF,
which seems reasonable enough for now.

Differential Revision: https://reviews.llvm.org/D57870

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353470 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-07 21:24:30 +00:00
Peter Collingbourne bae751c35d gn build: Merge the test part of r353237.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353369 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-07 02:40:49 +00:00
Peter Collingbourne 7cc46527c2 build: Remove the cmake check for malloc.h.
As far as I can tell, malloc.h is only being used here to provide
a definition of mallinfo (malloc itself is declared in stdlib.h via
cstdlib). We already have a macro for whether mallinfo is available,
so switch to using that instead.

Differential Revision: https://reviews.llvm.org/D57807

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353329 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-06 19:20:47 +00:00
Nico Weber df1d156afc gn build: Merge r353265, r353237
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353298 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-06 13:53:47 +00:00
Nico Weber b6644eccc0 gn build: Fix clang-tidy build
Not depending on //clang/lib/StaticAnalyzer/Core and
//clang/lib/StaticAnalyzer/Frontend causes a linker error even if
ClangSACheckers are not supported.

Undefined symbols for architecture x86_64:
  "clang::ento::CreateAnalysisConsumer(clang::CompilerInstance&)", referenced from:
      clang::tidy::ClangTidyASTConsumerFactory::CreateASTConsumer(
              clang::CompilerInstance&, llvm::StringRef)
          in libclangTidy.a(libclangTidy.ClangTidy.o)

Patch from Mirko Bonadei <mbonadei@webrtc.org>!

Differential Revision: https://reviews.llvm.org/D57777


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353244 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-05 23:48:13 +00:00
Nico Weber 6984e5d0f6 gn build: BUILD.gn files for clang-tidy and clang-apply-replacements
Patch from Mirko Bonadei <mbonadei@webrtc.org>!

Differential Revision: https://reviews.llvm.org/D57329


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353177 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-05 15:14:38 +00:00
Krasimir Georgiev 383143dbcc Fix typo in comment, NFCI
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353176 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-05 15:00:56 +00:00
Nico Weber b48531106d gn build: Merge r353072
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353175 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-05 14:47:36 +00:00
Thomas Preud'homme 2c6406031e Recommit: Detect incorrect FileCheck variable CLI definition
Summary:
While the backend code of FileCheck relies on definition of variable
from the command-line to have an equal sign '=' and a variable name
before that, the frontend does not actually enforce it. This leads to
FileCheck crashing when invoked with invalid syntax for the -D option.

This patch adds the missing validation in the frontend. It also makes
the -D option an AlwaysPrefix option to be able to detect -D=FOO as
being a define without variable and -D as missing its value.

Copyright:
- Linaro (changes in version 2 of revision D55940)
- GraphCore (changes in later versions)

Reviewers: jdenny

Subscribers: JonChesterfield, hiraditya, kristina, probinson,
llvm-commits

Differential Revision: https://reviews.llvm.org/D55940

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353173 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-05 14:17:28 +00:00
Serge Guelton da8c617183 gn build: Fix Python 3 write_vcsrevision script compatibility
Trivial fix: decode was not called for all subprocess.check_output calls.

Commited on behalf of Andrew Boyarshin

Differential Revision: https://reviews.llvm.org/D57505



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353168 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-05 13:01:12 +00:00
Peter Collingbourne a0df8c8223 gn build: Upgrade to NDK r19.
NDK r19 includes a sysroot that can be used directly by the compiler
without creating a standalone toolchain, so we just need a handful
of flags to point Clang there.

Differential Revision: https://reviews.llvm.org/D57733

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353139 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-05 05:10:19 +00:00
Wouter van Oortmerssen 46eec714bb [WebAssembly] Make disassembler always emit most canonical name.
Summary:
There are a few instructions that all map to the same opcode, so
when disassembling, we have to pick one. That was just the first one
before (the except_ref variant in the case of "call"), now it is the
one marked as IsCanonical in tablegen, or failing that, the shortest
name (which is typically the "canonical" one).

Also introduced a canonical "end" instruction for this purpose.

Reviewers: dschuff, tlively

Subscribers: sbc100, jgravelle-google, aheejin, llvm-commits, sunfish

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D57713

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353131 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-05 01:19:45 +00:00
David Major a43daae17e gn build: Windows: use a more standard format for PDB filenames
The current build was producing names like llvm-undname.exe.pdb, which looks unusual to me at least. This switches them to the more common llvm-undname.pdb style.

Differential Revision: https://reviews.llvm.org/D57613



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353099 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-04 21:27:38 +00:00
David Major a6f05aceef gn build: Revert r353094 (bad merge)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353098 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-04 21:25:13 +00:00
David Major 5f5a1c92ac gn build: Windows: use a more standard format for PDB filenames
The current build was producing names like llvm-undname.exe.pdb, which looks unusual to me at least. This switches them to the more common llvm-undname.pdb style.

Differential Revision: https://reviews.llvm.org/D57613



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353094 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-04 21:20:25 +00:00
David Major 3e10d473a5 gn build: Windows: write PDBs when is_debug
Without /DEBUG, the /Zi doesn't on its own create PDB files.

And since ninja runs multiple compilations in parallel, we need /FS to prevent contention on PDBs.

Differential Revision: https://reviews.llvm.org/D57612



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353093 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-04 21:13:43 +00:00
Aditya Nandakumar bbf9e4b7e7 [Tablegen][DAG]: Fix build breakage when LLVM_ENABLE_DAGISEL_COV=1
LLVM_ENABLE_DAGISEL_COV can be used to instrument DAGISel tablegen
selection code to show which patterns along with Complex patterns were
used when selecting instructions. Unfortunately this is turned off by
default and was broken but never tested.
This required a simple fix (missing new line) to get it to build again.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353091 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-04 21:06:24 +00:00
Nico Weber ff063adb86 gn build: Merge r352944
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353063 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-04 17:32:36 +00:00
Craig Topper 7425230ea1 [X86] Print %st(0) as %st when its implicit to the instruction. Continue printing it as %st(0) when its encoded in the instruction.
This is a step back from the change I made in r352985. This appears to be more consistent with gcc and objdump behavior.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353015 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-04 04:15:10 +00:00
Peter Collingbourne 57674f9288 gn build: Create regular archives for the sanitizer runtimes.
We'll need to do this eventually if we create an installable package.
For now, this lets me use the archives to build Android, whose build
system wants to copy the archives to another location.

Differential Revision: https://reviews.llvm.org/D57607

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@352907 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-01 20:34:43 +00:00
Nico Weber 96992cbce3 gn build: Add a missing dependency from llvm/test to llvm-lit
check-llvm already listed llvm-lit as script which counts as a dep, so running
check-llvm worked fine, but `ninja -C out/gn llvm/test` didn't build llvm-lit
before if it wasn't already there.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@352893 91177308-0d34-0410-b5e6-96231b3b80d8
2019-02-01 18:17:19 +00:00
Nico Weber ab97eba99a gn build: Merge r352483
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@352759 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-31 15:23:02 +00:00
Nico Weber e802900f51 gn build: Merge r352681, r352739
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@352758 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-31 14:45:40 +00:00
Peter Collingbourne 73306c2320 Reland "gn build: Add BPF target."
Differential Revision: https://reviews.llvm.org/D57436

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@352705 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-31 00:42:02 +00:00
Nico Weber a53d6c2052 lit: Let lit.util.which() return a normcase()ed path
LLVMConfig.with_environment() uses os.path.normcase(os.path.normpath(x)) to
normalize temporary env vars. LLVMConfig.use_clang() uses with_environment() to
temporarily set PATH and then look for clang there. This means that on Windows,
clang will be run with a path like c:\foo\bin\clang.EXE (with a lower-case
"C:").

lit.util.which() used to not do this, which means the executables added in
clang/test/lit.cfg.py (e.g. c-index-test) were run with a path like
C:\foo\bin\c-index-test.EXE (because both CMake and GN happen to write
clang_tools_dir with an upper-case C to lit.site.cfg.py).

clang/test/Index/pch-from-libclang.c requires that both c-index-test and clang
use _exactly_ the same resource dir path (same case and everything), because a
hash of the resource directory is used as module cache path.

This patch is necessary but not sufficient to make pch-from-libclang.c pass on
Windows.

Differential Revision: https://reviews.llvm.org/D57343


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@352704 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-31 00:40:43 +00:00
Nico Weber a7fb287a31 gn build: Set executable bit on get.py
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@352659 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-30 19:53:58 +00:00
Yonghong Song b1e647426f Revert "gn build: Add BPF target."
This reverts commit r352638.

The change in this patch is not trivial and it is merged
without component owner approval.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@352649 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-30 19:13:16 +00:00
Peter Collingbourne 2a9164966e gn build: Add BPF target.
Differential Revision: https://reviews.llvm.org/D57436

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@352638 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-30 18:04:08 +00:00
Simon Pilgrim b739c0c2b7 [utils] Fix update scripts output when run on python3.
This fixes a "bytes-like object is required, not 'str'" python3 error I hit on update_llc_test_checks.py (but present on the other scripts as well) by matching what update_mca_test_checks.py already does, plus I've added an explicit 'utf-8' encoding.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@352633 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-30 16:15:59 +00:00