ooxml_crypt 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +58 -0
- data/Rakefile +12 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/ext/ooxml_crypt/extconf.rb +18 -0
- data/ext/ooxml_crypt/ooxml_crypt.c +27 -0
- data/ext/ooxml_crypt/ooxml_crypt.h +7 -0
- data/lib/ooxml_crypt/version.rb +5 -0
- data/lib/ooxml_crypt.rb +75 -0
- data/vendor/cybozulib/.github/workflows/main.yml +12 -0
- data/vendor/cybozulib/.gitignore +5 -0
- data/vendor/cybozulib/CMakeLists.txt +6 -0
- data/vendor/cybozulib/COPYRIGHT +27 -0
- data/vendor/cybozulib/Makefile +26 -0
- data/vendor/cybozulib/bin/libeay32.dll +0 -0
- data/vendor/cybozulib/bin/libmecab.dll +0 -0
- data/vendor/cybozulib/bin/ssleay32.dll +0 -0
- data/vendor/cybozulib/common.mk +116 -0
- data/vendor/cybozulib/common.props +25 -0
- data/vendor/cybozulib/cybozulib.sln +286 -0
- data/vendor/cybozulib/debug.props +14 -0
- data/vendor/cybozulib/include/cybozu/array.hpp +197 -0
- data/vendor/cybozulib/include/cybozu/atoi.hpp +238 -0
- data/vendor/cybozulib/include/cybozu/atomic.hpp +146 -0
- data/vendor/cybozulib/include/cybozu/base64.hpp +210 -0
- data/vendor/cybozulib/include/cybozu/benchmark.hpp +212 -0
- data/vendor/cybozulib/include/cybozu/bfd.hpp +105 -0
- data/vendor/cybozulib/include/cybozu/bit_operation.hpp +139 -0
- data/vendor/cybozulib/include/cybozu/bitvector.hpp +358 -0
- data/vendor/cybozulib/include/cybozu/condition_variable.hpp +113 -0
- data/vendor/cybozulib/include/cybozu/condition_variable_cs.hpp +74 -0
- data/vendor/cybozulib/include/cybozu/config.hpp +392 -0
- data/vendor/cybozulib/include/cybozu/critical_section.hpp +60 -0
- data/vendor/cybozulib/include/cybozu/crypto.hpp +321 -0
- data/vendor/cybozulib/include/cybozu/csucvector.hpp +624 -0
- data/vendor/cybozulib/include/cybozu/csv.hpp +294 -0
- data/vendor/cybozulib/include/cybozu/data_type.hpp +27 -0
- data/vendor/cybozulib/include/cybozu/endian.hpp +224 -0
- data/vendor/cybozulib/include/cybozu/env.hpp +63 -0
- data/vendor/cybozulib/include/cybozu/event.hpp +122 -0
- data/vendor/cybozulib/include/cybozu/exception.hpp +253 -0
- data/vendor/cybozulib/include/cybozu/file.hpp +626 -0
- data/vendor/cybozulib/include/cybozu/fmindex.hpp +291 -0
- data/vendor/cybozulib/include/cybozu/format.hpp +93 -0
- data/vendor/cybozulib/include/cybozu/frequency.hpp +264 -0
- data/vendor/cybozulib/include/cybozu/hash.hpp +67 -0
- data/vendor/cybozulib/include/cybozu/inttype.hpp +174 -0
- data/vendor/cybozulib/include/cybozu/itoa.hpp +336 -0
- data/vendor/cybozulib/include/cybozu/json.hpp +120 -0
- data/vendor/cybozulib/include/cybozu/line_stream.hpp +149 -0
- data/vendor/cybozulib/include/cybozu/link_libeay32.hpp +21 -0
- data/vendor/cybozulib/include/cybozu/link_mpir.hpp +18 -0
- data/vendor/cybozulib/include/cybozu/link_ssleay32.hpp +19 -0
- data/vendor/cybozulib/include/cybozu/log.hpp +237 -0
- data/vendor/cybozulib/include/cybozu/minixml.hpp +452 -0
- data/vendor/cybozulib/include/cybozu/mmap.hpp +143 -0
- data/vendor/cybozulib/include/cybozu/mutex.hpp +144 -0
- data/vendor/cybozulib/include/cybozu/nlp/mecab.hpp +96 -0
- data/vendor/cybozulib/include/cybozu/nlp/plsi.hpp +315 -0
- data/vendor/cybozulib/include/cybozu/nlp/random.hpp +74 -0
- data/vendor/cybozulib/include/cybozu/nlp/sparse.hpp +529 -0
- data/vendor/cybozulib/include/cybozu/nlp/svd.hpp +486 -0
- data/vendor/cybozulib/include/cybozu/nlp/tfidf.hpp +226 -0
- data/vendor/cybozulib/include/cybozu/nlp/top_score.hpp +75 -0
- data/vendor/cybozulib/include/cybozu/option.hpp +743 -0
- data/vendor/cybozulib/include/cybozu/parallel.hpp +88 -0
- data/vendor/cybozulib/include/cybozu/pcg.hpp +72 -0
- data/vendor/cybozulib/include/cybozu/process.hpp +324 -0
- data/vendor/cybozulib/include/cybozu/quit_signal_handler.hpp +66 -0
- data/vendor/cybozulib/include/cybozu/random_generator.hpp +144 -0
- data/vendor/cybozulib/include/cybozu/regex.hpp +463 -0
- data/vendor/cybozulib/include/cybozu/select8.hpp +279 -0
- data/vendor/cybozulib/include/cybozu/serializer.hpp +363 -0
- data/vendor/cybozulib/include/cybozu/sha1.hpp +209 -0
- data/vendor/cybozulib/include/cybozu/sha2.hpp +506 -0
- data/vendor/cybozulib/include/cybozu/siphash.hpp +105 -0
- data/vendor/cybozulib/include/cybozu/socket.hpp +785 -0
- data/vendor/cybozulib/include/cybozu/ssl.hpp +203 -0
- data/vendor/cybozulib/include/cybozu/stacktrace.hpp +291 -0
- data/vendor/cybozulib/include/cybozu/stream.hpp +269 -0
- data/vendor/cybozulib/include/cybozu/string.hpp +1746 -0
- data/vendor/cybozulib/include/cybozu/string_operation.hpp +365 -0
- data/vendor/cybozulib/include/cybozu/sucvector.hpp +378 -0
- data/vendor/cybozulib/include/cybozu/test.hpp +373 -0
- data/vendor/cybozulib/include/cybozu/thread.hpp +229 -0
- data/vendor/cybozulib/include/cybozu/time.hpp +281 -0
- data/vendor/cybozulib/include/cybozu/tls.hpp +115 -0
- data/vendor/cybozulib/include/cybozu/unordered_map.hpp +13 -0
- data/vendor/cybozulib/include/cybozu/unordered_set.hpp +13 -0
- data/vendor/cybozulib/include/cybozu/v128.hpp +376 -0
- data/vendor/cybozulib/include/cybozu/wavelet_matrix.hpp +345 -0
- data/vendor/cybozulib/include/cybozu/xorshift.hpp +189 -0
- data/vendor/cybozulib/include/cybozu/zlib.hpp +325 -0
- data/vendor/cybozulib/include/sais.hxx +364 -0
- data/vendor/cybozulib/misc/make_select8tbl.cpp +26 -0
- data/vendor/cybozulib/mk.bat +37 -0
- data/vendor/cybozulib/readme.md +29 -0
- data/vendor/cybozulib/release.props +12 -0
- data/vendor/cybozulib/sample/Makefile +30 -0
- data/vendor/cybozulib/sample/csucvector_smpl.cpp +42 -0
- data/vendor/cybozulib/sample/data/svd/org/test1.S +4 -0
- data/vendor/cybozulib/sample/data/svd/org/test1.U +4 -0
- data/vendor/cybozulib/sample/data/svd/org/test1.V +6 -0
- data/vendor/cybozulib/sample/data/svd/test1 +4 -0
- data/vendor/cybozulib/sample/data/svd/test2 +4 -0
- data/vendor/cybozulib/sample/desymbol.cpp +127 -0
- data/vendor/cybozulib/sample/exception_smpl.cpp +46 -0
- data/vendor/cybozulib/sample/fmindex_smpl.cpp +231 -0
- data/vendor/cybozulib/sample/log_smpl.cpp +19 -0
- data/vendor/cybozulib/sample/mecab_smpl.cpp +37 -0
- data/vendor/cybozulib/sample/option2_smpl.cpp +68 -0
- data/vendor/cybozulib/sample/option_smpl.cpp +42 -0
- data/vendor/cybozulib/sample/plsi_smpl.cpp +207 -0
- data/vendor/cybozulib/sample/proj/exception_smpl.vcproj +184 -0
- data/vendor/cybozulib/sample/proj/mecab_smpl.vcproj +184 -0
- data/vendor/cybozulib/sample/proj/ssl_smpl/ssl_smpl.vcxproj +85 -0
- data/vendor/cybozulib/sample/proj/ssl_smpl.vcproj +347 -0
- data/vendor/cybozulib/sample/proj/stacktrace_smpl/stacktrace_smpl.vcxproj +85 -0
- data/vendor/cybozulib/sample/proj/svd_smpl.vcproj +184 -0
- data/vendor/cybozulib/sample/quit_signal_handler.cpp +30 -0
- data/vendor/cybozulib/sample/serializer_smpl.cpp +196 -0
- data/vendor/cybozulib/sample/socket_smpl.cpp +82 -0
- data/vendor/cybozulib/sample/ssl_smpl.cpp +39 -0
- data/vendor/cybozulib/sample/stacktrace_smpl.cpp +52 -0
- data/vendor/cybozulib/sample/svd_bench_smpl.cpp +143 -0
- data/vendor/cybozulib/sample/svd_smpl.cpp +94 -0
- data/vendor/cybozulib/sample/wm_bench_smpl.cpp +182 -0
- data/vendor/cybozulib/sample/zlib_smpl.cpp +41 -0
- data/vendor/cybozulib/src/Makefile +8 -0
- data/vendor/cybozulib/src/base/Makefile +19 -0
- data/vendor/cybozulib/test/Makefile +12 -0
- data/vendor/cybozulib/test/base/Makefile +37 -0
- data/vendor/cybozulib/test/base/array_test.cpp +173 -0
- data/vendor/cybozulib/test/base/atoi_test.cpp +774 -0
- data/vendor/cybozulib/test/base/atomic_test.cpp +49 -0
- data/vendor/cybozulib/test/base/base64_test.cpp +113 -0
- data/vendor/cybozulib/test/base/bit_operation_test.cpp +134 -0
- data/vendor/cybozulib/test/base/bitvector_test.cpp +204 -0
- data/vendor/cybozulib/test/base/condition_variable_cs_test.cpp +92 -0
- data/vendor/cybozulib/test/base/condition_variable_test.cpp +88 -0
- data/vendor/cybozulib/test/base/config_test.cpp +236 -0
- data/vendor/cybozulib/test/base/crypto_test.cpp +122 -0
- data/vendor/cybozulib/test/base/csucvector_test.cpp +63 -0
- data/vendor/cybozulib/test/base/csv_test.cpp +182 -0
- data/vendor/cybozulib/test/base/data/a.xml +26 -0
- data/vendor/cybozulib/test/base/endian_test.cpp +56 -0
- data/vendor/cybozulib/test/base/env_test.cpp +22 -0
- data/vendor/cybozulib/test/base/event_test.cpp +41 -0
- data/vendor/cybozulib/test/base/file_test.cpp +233 -0
- data/vendor/cybozulib/test/base/fmindex_test.cpp +118 -0
- data/vendor/cybozulib/test/base/format_test.cpp +12 -0
- data/vendor/cybozulib/test/base/frequency_test.cpp +104 -0
- data/vendor/cybozulib/test/base/itoa_test.cpp +522 -0
- data/vendor/cybozulib/test/base/line_stream_test.cpp +208 -0
- data/vendor/cybozulib/test/base/mecab_test.cpp +41 -0
- data/vendor/cybozulib/test/base/minixml_test.cpp +103 -0
- data/vendor/cybozulib/test/base/mmap_test.cpp +15 -0
- data/vendor/cybozulib/test/base/option_test.cpp +487 -0
- data/vendor/cybozulib/test/base/parallel_test.cpp +48 -0
- data/vendor/cybozulib/test/base/proj/array_test/array_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/atoi_test/atoi_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/atomic_test/atomic_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/base64_test/base64_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/condition_variable_cs_test/condition_variable_cs_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/condition_variable_test/condition_variable_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/config_test/config_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/csv_test/csv_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/endian_test/endian_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/env_test/env_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/event_test/event_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/file_test/file_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/itoa_test/itoa_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/mecab_test/mecab_test.vcxproj +88 -0
- data/vendor/cybozulib/test/base/proj/minixml_test/minixml_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/mmap_test/mmap_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/serializer_test/serializer_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/sha1_test/sha1_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/stream_test/stream_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/string_operation_test/string_operation_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/string_test/string_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/thread_test/thread_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/time_test/time_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/tls_test/tls_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/proj/zlib_test/zlib_test.vcxproj +86 -0
- data/vendor/cybozulib/test/base/random_generator_test.cpp +28 -0
- data/vendor/cybozulib/test/base/regex_test.cpp +74 -0
- data/vendor/cybozulib/test/base/serializer_test.cpp +483 -0
- data/vendor/cybozulib/test/base/sha1_test.cpp +61 -0
- data/vendor/cybozulib/test/base/sha2_test.cpp +191 -0
- data/vendor/cybozulib/test/base/siphash_test.cpp +33 -0
- data/vendor/cybozulib/test/base/socket_test.cpp +76 -0
- data/vendor/cybozulib/test/base/stream_test.cpp +101 -0
- data/vendor/cybozulib/test/base/string_operation_test.cpp +340 -0
- data/vendor/cybozulib/test/base/string_test.cpp +1705 -0
- data/vendor/cybozulib/test/base/sucvector_test.cpp +312 -0
- data/vendor/cybozulib/test/base/thread_test.cpp +62 -0
- data/vendor/cybozulib/test/base/time_test.cpp +164 -0
- data/vendor/cybozulib/test/base/tls_test.cpp +50 -0
- data/vendor/cybozulib/test/base/wavelet_matrix_test.cpp +145 -0
- data/vendor/cybozulib/test/base/zlib_test.cpp +371 -0
- data/vendor/cybozulib/test/nlp/Makefile +27 -0
- data/vendor/cybozulib/test/nlp/proj/random_test.vcproj +184 -0
- data/vendor/cybozulib/test/nlp/proj/sparse_test.vcproj +184 -0
- data/vendor/cybozulib/test/nlp/proj/svd_test.vcproj +184 -0
- data/vendor/cybozulib/test/nlp/random_test.cpp +62 -0
- data/vendor/cybozulib/test/nlp/sparse_test.cpp +347 -0
- data/vendor/cybozulib/test/nlp/svd_test.cpp +234 -0
- data/vendor/cybozulib/test/nlp/top_score_test.cpp +40 -0
- data/vendor/cybozulib/tool/create_vcproj.py +186 -0
- data/vendor/cybozulib/tool/vcproj_tmpl.py +185 -0
- data/vendor/msoffice/COPYRIGHT +27 -0
- data/vendor/msoffice/Makefile +29 -0
- data/vendor/msoffice/bin/64/msoc.dll +0 -0
- data/vendor/msoffice/bin/64/msocsample.exe +0 -0
- data/vendor/msoffice/bin/64/msoffice-crypt.exe +0 -0
- data/vendor/msoffice/bin/msoc.dll +0 -0
- data/vendor/msoffice/bin/msocsample.exe +0 -0
- data/vendor/msoffice/bin/msoffice-crypt.exe +0 -0
- data/vendor/msoffice/common.mk +71 -0
- data/vendor/msoffice/common.props +26 -0
- data/vendor/msoffice/debug.props +14 -0
- data/vendor/msoffice/include/attack.hpp +211 -0
- data/vendor/msoffice/include/cfb.hpp +777 -0
- data/vendor/msoffice/include/crypto_util.hpp +450 -0
- data/vendor/msoffice/include/custom_sha1.hpp +342 -0
- data/vendor/msoffice/include/decode.hpp +240 -0
- data/vendor/msoffice/include/encode.hpp +221 -0
- data/vendor/msoffice/include/make_dataspace.hpp +316 -0
- data/vendor/msoffice/include/msoc.h +129 -0
- data/vendor/msoffice/include/resource.hpp +7 -0
- data/vendor/msoffice/include/standard_encryption.hpp +145 -0
- data/vendor/msoffice/include/uint32vec.hpp +179 -0
- data/vendor/msoffice/include/util.hpp +212 -0
- data/vendor/msoffice/lib/.emptydir +0 -0
- data/vendor/msoffice/misc/decrypt-xls.vbs +46 -0
- data/vendor/msoffice/mk.bat +1 -0
- data/vendor/msoffice/mkdll.bat +3 -0
- data/vendor/msoffice/msoc.def +13 -0
- data/vendor/msoffice/msocsample.py +178 -0
- data/vendor/msoffice/msoffice12.sln +31 -0
- data/vendor/msoffice/readme.md +110 -0
- data/vendor/msoffice/release.props +28 -0
- data/vendor/msoffice/src/Makefile +19 -0
- data/vendor/msoffice/src/attack.cpp +124 -0
- data/vendor/msoffice/src/cfb_test.cpp +77 -0
- data/vendor/msoffice/src/minisample.c +54 -0
- data/vendor/msoffice/src/msocdll.cpp +276 -0
- data/vendor/msoffice/src/msocsample.c +136 -0
- data/vendor/msoffice/src/msoffice-crypt.cpp +219 -0
- data/vendor/msoffice/src/proj/attack/attack.vcxproj +88 -0
- data/vendor/msoffice/src/proj/main/msoffice-crypt.vcxproj +88 -0
- data/vendor/msoffice/src/sha1.cpp +234 -0
- data/vendor/msoffice/test/Makefile +20 -0
- data/vendor/msoffice/test/cfb_test.cpp +74 -0
- data/vendor/msoffice/test/hash_test.cpp +59 -0
- data/vendor/msoffice/test/proj/cfb/cfb_test.vcxproj +90 -0
- data/vendor/msoffice/test/proj/hash/hash_test.vcxproj +90 -0
- data/vendor/msoffice/test/sampl.bat +8 -0
- data/vendor/msoffice/test_all.py +46 -0
- data/vendor/update +4 -0
- metadata +351 -0
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
/**
|
|
3
|
+
@file
|
|
4
|
+
@brief measure exec time of function
|
|
5
|
+
@author MITSUNARI Shigeo
|
|
6
|
+
*/
|
|
7
|
+
#if defined(_MSC_VER) && (MSC_VER <= 1500)
|
|
8
|
+
#include <cybozu/inttype.hpp>
|
|
9
|
+
#else
|
|
10
|
+
#include <stdint.h>
|
|
11
|
+
#endif
|
|
12
|
+
#include <stdio.h>
|
|
13
|
+
|
|
14
|
+
#ifdef __EMSCRIPTEN__
|
|
15
|
+
#define CYBOZU_BENCH_USE_GETTIMEOFDAY
|
|
16
|
+
#endif
|
|
17
|
+
|
|
18
|
+
#ifdef CYBOZU_BENCH_USE_GETTIMEOFDAY
|
|
19
|
+
#include <sys/time.h>
|
|
20
|
+
#elif !defined(CYBOZU_BENCH_DONT_USE_RDTSC)
|
|
21
|
+
#if defined(_M_IX86) || defined(_M_X64) || defined(__i386__) || defined(__x86_64__)
|
|
22
|
+
#define CYBOZU_BENCH_USE_RDTSC
|
|
23
|
+
#define CYBOZU_BENCH_USE_CPU_TIMER
|
|
24
|
+
#endif
|
|
25
|
+
#if defined(__GNUC__) && defined(__ARM_ARCH_7A__)
|
|
26
|
+
// #define CYBOZU_BENCH_USE_MRC
|
|
27
|
+
// #define CYBOZU_BENCH_USE_CPU_TIMER
|
|
28
|
+
#endif
|
|
29
|
+
#endif
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
#include <assert.h>
|
|
33
|
+
#include <time.h>
|
|
34
|
+
#ifdef _MSC_VER
|
|
35
|
+
#include <intrin.h>
|
|
36
|
+
#include <sys/timeb.h>
|
|
37
|
+
#else
|
|
38
|
+
#endif
|
|
39
|
+
|
|
40
|
+
#ifndef CYBOZU_UNUSED
|
|
41
|
+
#ifdef __GNUC__
|
|
42
|
+
#define CYBOZU_UNUSED __attribute__((unused))
|
|
43
|
+
#else
|
|
44
|
+
#define CYBOZU_UNUSED
|
|
45
|
+
#endif
|
|
46
|
+
#endif
|
|
47
|
+
|
|
48
|
+
namespace cybozu {
|
|
49
|
+
|
|
50
|
+
namespace bench {
|
|
51
|
+
|
|
52
|
+
static void (*g_putCallback)(double);
|
|
53
|
+
|
|
54
|
+
static inline void setPutCallback(void (*f)(double))
|
|
55
|
+
{
|
|
56
|
+
g_putCallback = f;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
} // cybozu::bench
|
|
60
|
+
|
|
61
|
+
class CpuClock {
|
|
62
|
+
public:
|
|
63
|
+
static inline uint64_t getCpuClk()
|
|
64
|
+
{
|
|
65
|
+
#ifdef CYBOZU_BENCH_USE_RDTSC
|
|
66
|
+
#ifdef _MSC_VER
|
|
67
|
+
return __rdtsc();
|
|
68
|
+
#else
|
|
69
|
+
unsigned int eax, edx;
|
|
70
|
+
__asm__ volatile("rdtsc" : "=a"(eax), "=d"(edx));
|
|
71
|
+
return ((uint64_t)edx << 32) | eax;
|
|
72
|
+
#endif
|
|
73
|
+
#elif defined(CYBOZU_BENCH_USE_MRC)
|
|
74
|
+
uint32_t clk;
|
|
75
|
+
__asm__ volatile("mrc p15, 0, %0, c9, c13, 0" : "=r"(clk));
|
|
76
|
+
return clk;
|
|
77
|
+
#else
|
|
78
|
+
#ifdef _MSC_VER
|
|
79
|
+
struct _timeb timeb;
|
|
80
|
+
_ftime_s(&timeb);
|
|
81
|
+
return uint64_t(timeb.time) * 1000000000 + timeb.millitm * 1000000;
|
|
82
|
+
#elif defined(CYBOZU_BENCH_USE_GETTIMEOFDAY)
|
|
83
|
+
struct timeval tv;
|
|
84
|
+
int ret CYBOZU_UNUSED = gettimeofday(&tv, 0);
|
|
85
|
+
assert(ret == 0);
|
|
86
|
+
return uint64_t(tv.tv_sec) * 1000000000 + tv.tv_usec * 1000;
|
|
87
|
+
#else
|
|
88
|
+
struct timespec tp;
|
|
89
|
+
int ret CYBOZU_UNUSED = clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &tp);
|
|
90
|
+
assert(ret == 0);
|
|
91
|
+
return uint64_t(tp.tv_sec) * 1000000000 + tp.tv_nsec;
|
|
92
|
+
#endif
|
|
93
|
+
#endif
|
|
94
|
+
}
|
|
95
|
+
CpuClock()
|
|
96
|
+
: clock_(0)
|
|
97
|
+
, count_(0)
|
|
98
|
+
{
|
|
99
|
+
}
|
|
100
|
+
void begin()
|
|
101
|
+
{
|
|
102
|
+
clock_ -= getCpuClk();
|
|
103
|
+
}
|
|
104
|
+
void end()
|
|
105
|
+
{
|
|
106
|
+
clock_ += getCpuClk();
|
|
107
|
+
count_++;
|
|
108
|
+
}
|
|
109
|
+
int getCount() const { return count_; }
|
|
110
|
+
uint64_t getClock() const { return clock_; }
|
|
111
|
+
void clear() { count_ = 0; clock_ = 0; }
|
|
112
|
+
void put(const char *msg = 0, int N = 1) const
|
|
113
|
+
{
|
|
114
|
+
double t = getClock() / double(getCount()) / N;
|
|
115
|
+
if (msg && *msg) printf("%s ", msg);
|
|
116
|
+
if (bench::g_putCallback) {
|
|
117
|
+
bench::g_putCallback(t);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
#ifdef CYBOZU_BENCH_USE_CPU_TIMER
|
|
121
|
+
if (t > 1e6) {
|
|
122
|
+
printf("%7.3fMclk", t * 1e-6);
|
|
123
|
+
} else if (t > 1e3) {
|
|
124
|
+
printf("%7.3fKclk", t * 1e-3);
|
|
125
|
+
} else {
|
|
126
|
+
printf("%6.2f clk", t);
|
|
127
|
+
}
|
|
128
|
+
#else
|
|
129
|
+
if (t > 1e6) {
|
|
130
|
+
printf("%7.3fmsec", t * 1e-6);
|
|
131
|
+
} else if (t > 1e3) {
|
|
132
|
+
printf("%7.3fusec", t * 1e-3);
|
|
133
|
+
} else {
|
|
134
|
+
printf("%6.2fnsec", t);
|
|
135
|
+
}
|
|
136
|
+
#endif
|
|
137
|
+
if (msg && *msg) printf("\n");
|
|
138
|
+
}
|
|
139
|
+
// adhoc constatns for CYBOZU_BENCH
|
|
140
|
+
#ifdef CYBOZU_BENCH_USE_CPU_TIMER
|
|
141
|
+
static const int loopN1 = 1000;
|
|
142
|
+
static const int loopN2 = 100;
|
|
143
|
+
static const uint64_t maxClk = (uint64_t)1e8;
|
|
144
|
+
#else
|
|
145
|
+
static const int loopN1 = 100;
|
|
146
|
+
static const int loopN2 = 100;
|
|
147
|
+
static const uint64_t maxClk = (uint64_t)1e8;
|
|
148
|
+
#endif
|
|
149
|
+
private:
|
|
150
|
+
uint64_t clock_;
|
|
151
|
+
int count_;
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
namespace bench {
|
|
155
|
+
|
|
156
|
+
static CpuClock g_clk;
|
|
157
|
+
static int CYBOZU_UNUSED g_loopNum;
|
|
158
|
+
|
|
159
|
+
} // cybozu::bench
|
|
160
|
+
/*
|
|
161
|
+
loop counter is automatically determined
|
|
162
|
+
CYBOZU_BENCH(<msg>, <func>, <param1>, <param2>, ...);
|
|
163
|
+
if msg == "" then only set g_clk, g_loopNum
|
|
164
|
+
*/
|
|
165
|
+
#define CYBOZU_BENCH(msg, func, ...) \
|
|
166
|
+
{ \
|
|
167
|
+
const uint64_t _cybozu_maxClk = cybozu::CpuClock::maxClk; \
|
|
168
|
+
cybozu::CpuClock _cybozu_clk; \
|
|
169
|
+
for (int _cybozu_i = 0; _cybozu_i < cybozu::CpuClock::loopN2; _cybozu_i++) { \
|
|
170
|
+
_cybozu_clk.begin(); \
|
|
171
|
+
for (int _cybozu_j = 0; _cybozu_j < cybozu::CpuClock::loopN1; _cybozu_j++) { func(__VA_ARGS__); } \
|
|
172
|
+
_cybozu_clk.end(); \
|
|
173
|
+
if (_cybozu_clk.getClock() > _cybozu_maxClk) break; \
|
|
174
|
+
} \
|
|
175
|
+
if (msg && *msg) _cybozu_clk.put(msg, cybozu::CpuClock::loopN1); \
|
|
176
|
+
cybozu::bench::g_clk = _cybozu_clk; cybozu::bench::g_loopNum = cybozu::CpuClock::loopN1; \
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/*
|
|
180
|
+
double clk;
|
|
181
|
+
CYBOZU_BENCH_T(clk, <func>, <param1>, <param2>, ...);
|
|
182
|
+
clk is set by CYBOZU_BENCH_T
|
|
183
|
+
*/
|
|
184
|
+
#define CYBOZU_BENCH_T(clk, func, ...) \
|
|
185
|
+
{ \
|
|
186
|
+
const uint64_t _cybozu_maxClk = cybozu::CpuClock::maxClk; \
|
|
187
|
+
cybozu::CpuClock _cybozu_clk; \
|
|
188
|
+
for (int _cybozu_i = 0; _cybozu_i < cybozu::CpuClock::loopN2; _cybozu_i++) { \
|
|
189
|
+
_cybozu_clk.begin(); \
|
|
190
|
+
for (int _cybozu_j = 0; _cybozu_j < cybozu::CpuClock::loopN1; _cybozu_j++) { func(__VA_ARGS__); } \
|
|
191
|
+
_cybozu_clk.end(); \
|
|
192
|
+
if (_cybozu_clk.getClock() > _cybozu_maxClk) break; \
|
|
193
|
+
} \
|
|
194
|
+
clk = _cybozu_clk.getClock() / (double)_cybozu_clk.getCount() / cybozu::CpuClock::loopN1; \
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/*
|
|
198
|
+
loop counter N is given
|
|
199
|
+
CYBOZU_BENCH_C(<msg>, <counter>, <func>, <param1>, <param2>, ...);
|
|
200
|
+
if msg == "" then only set g_clk, g_loopNum
|
|
201
|
+
*/
|
|
202
|
+
#define CYBOZU_BENCH_C(msg, _N, func, ...) \
|
|
203
|
+
{ \
|
|
204
|
+
cybozu::CpuClock _cybozu_clk; \
|
|
205
|
+
_cybozu_clk.begin(); \
|
|
206
|
+
for (int _cybozu_j = 0; _cybozu_j < _N; _cybozu_j++) { func(__VA_ARGS__); } \
|
|
207
|
+
_cybozu_clk.end(); \
|
|
208
|
+
if (msg && *msg) _cybozu_clk.put(msg, _N); \
|
|
209
|
+
cybozu::bench::g_clk = _cybozu_clk; cybozu::bench::g_loopNum = _N; \
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
} // cybozu
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
/**
|
|
3
|
+
@file
|
|
4
|
+
@brief libbfd class
|
|
5
|
+
@note bfd is GPL
|
|
6
|
+
with -lbfd ; libbfd.a is in binutils-dev
|
|
7
|
+
*/
|
|
8
|
+
#ifdef _MSC_VER
|
|
9
|
+
#error "not supported"
|
|
10
|
+
#endif
|
|
11
|
+
#include <unistd.h>
|
|
12
|
+
#include <bfd.h>
|
|
13
|
+
#include <string>
|
|
14
|
+
|
|
15
|
+
namespace cybozu {
|
|
16
|
+
|
|
17
|
+
struct Bfd {
|
|
18
|
+
struct bfd *bfd;
|
|
19
|
+
explicit Bfd(const std::string& fileName = "")
|
|
20
|
+
: bfd(0)
|
|
21
|
+
{
|
|
22
|
+
bfd_init();
|
|
23
|
+
|
|
24
|
+
const char *file = fileName.c_str();
|
|
25
|
+
#if 0
|
|
26
|
+
if (*file == '\0') {
|
|
27
|
+
file = "/proc/self/exe";
|
|
28
|
+
}
|
|
29
|
+
#else
|
|
30
|
+
/*
|
|
31
|
+
/proc/self/exe does not point to self-binary on valgrind,
|
|
32
|
+
so use readlink to get correct self-binary
|
|
33
|
+
*/
|
|
34
|
+
std::string path;
|
|
35
|
+
if (*file == '\0') {
|
|
36
|
+
path.resize(4096);
|
|
37
|
+
int ret = readlink("/proc/self/exe", &path[0], path.size() - 2);
|
|
38
|
+
if (ret <= 0) {
|
|
39
|
+
perror("ERR:cybozu:StackTrace:Bfd:readlink");
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
path.resize(ret);
|
|
43
|
+
file = path.c_str();
|
|
44
|
+
}
|
|
45
|
+
#endif
|
|
46
|
+
bfd = bfd_openr(file, 0);
|
|
47
|
+
if (bfd == 0) {
|
|
48
|
+
perror("ERR:cybozu:StackTrace:Bfd:bfd_opener");
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (!bfd_check_format(bfd, bfd_object)) {
|
|
52
|
+
perror("ERR:cybozu:StackTrace:Bfd:bfd_check_format");
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
~Bfd()
|
|
57
|
+
{
|
|
58
|
+
if (bfd == 0) return;
|
|
59
|
+
if (!bfd_close(bfd)) {
|
|
60
|
+
fprintf(stderr, "ERR:cybozu:StackTrace:Bfd:bfd_close\n");
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
bool getInfo(std::string* pFile, std::string* pFunc, int *pLine, const void *addr)
|
|
64
|
+
{
|
|
65
|
+
if (bfd == 0) return false;
|
|
66
|
+
Data data(addr, pFile, pFunc);
|
|
67
|
+
bfd_map_over_sections(bfd, findAddress, &data);
|
|
68
|
+
*pLine = data.line;
|
|
69
|
+
return data.found;
|
|
70
|
+
}
|
|
71
|
+
private:
|
|
72
|
+
struct Data {
|
|
73
|
+
bfd_vma pc;
|
|
74
|
+
std::string *pFile;
|
|
75
|
+
std::string *pFunc;
|
|
76
|
+
unsigned int line;
|
|
77
|
+
bool found;
|
|
78
|
+
Data(const void *addr, std::string *pFile, std::string *pFunc)
|
|
79
|
+
: pc(bfd_vma(addr))
|
|
80
|
+
, pFile(pFile)
|
|
81
|
+
, pFunc(pFunc)
|
|
82
|
+
, line(0)
|
|
83
|
+
, found(false)
|
|
84
|
+
{
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
static inline void findAddress(struct bfd *bfd, asection *section, void *self)
|
|
88
|
+
{
|
|
89
|
+
Data *data = (Data*)self;
|
|
90
|
+
if (data->found) return;
|
|
91
|
+
if (section == 0) return;
|
|
92
|
+
bfd_vma vma = bfd_section_vma(bfd, section);
|
|
93
|
+
if (data->pc < vma) return;
|
|
94
|
+
bfd_size_type size = bfd_section_size(section);
|
|
95
|
+
if (data->pc >= vma + size) return;
|
|
96
|
+
const char *file;
|
|
97
|
+
const char *func;
|
|
98
|
+
data->found = bfd_find_nearest_line(bfd, section, NULL, data->pc - vma, &file, &func, &data->line);
|
|
99
|
+
if (!data->found) return;
|
|
100
|
+
if (file) *data->pFile = file;
|
|
101
|
+
if (func) *data->pFunc = func;
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
} // cybozu
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
/**
|
|
3
|
+
@file
|
|
4
|
+
@brief bit operation
|
|
5
|
+
*/
|
|
6
|
+
#include <assert.h>
|
|
7
|
+
#include <cybozu/inttype.hpp>
|
|
8
|
+
|
|
9
|
+
#if (CYBOZU_HOST == CYBOZU_HOST_INTEL)
|
|
10
|
+
#if defined(_WIN32)
|
|
11
|
+
#include <intrin.h>
|
|
12
|
+
#elif defined(__linux__) || defined(__CYGWIN__) || defined(__clang__)
|
|
13
|
+
#include <x86intrin.h>
|
|
14
|
+
#elif defined(__GNUC__)
|
|
15
|
+
#include <emmintrin.h>
|
|
16
|
+
#endif
|
|
17
|
+
#endif
|
|
18
|
+
|
|
19
|
+
namespace cybozu {
|
|
20
|
+
|
|
21
|
+
namespace bit_op_local {
|
|
22
|
+
|
|
23
|
+
template<bool equalTo8>
|
|
24
|
+
struct Tag {};
|
|
25
|
+
|
|
26
|
+
// sizeof(T) < 8
|
|
27
|
+
template<>
|
|
28
|
+
struct Tag<false> {
|
|
29
|
+
template<class T>
|
|
30
|
+
static inline int bsf(T x)
|
|
31
|
+
{
|
|
32
|
+
#if defined(_MSC_VER)
|
|
33
|
+
unsigned long out;
|
|
34
|
+
_BitScanForward(&out, x);
|
|
35
|
+
#pragma warning(suppress: 6102)
|
|
36
|
+
return out;
|
|
37
|
+
#else
|
|
38
|
+
return __builtin_ctz(x);
|
|
39
|
+
#endif
|
|
40
|
+
}
|
|
41
|
+
template<class T>
|
|
42
|
+
static inline int bsr(T x)
|
|
43
|
+
{
|
|
44
|
+
#if defined(_MSC_VER)
|
|
45
|
+
unsigned long out;
|
|
46
|
+
_BitScanReverse(&out, x);
|
|
47
|
+
#pragma warning(suppress: 6102)
|
|
48
|
+
return out;
|
|
49
|
+
#else
|
|
50
|
+
return __builtin_clz(x) ^ 0x1f;
|
|
51
|
+
#endif
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
// sizeof(T) == 8
|
|
56
|
+
template<>
|
|
57
|
+
struct Tag<true> {
|
|
58
|
+
template<class T>
|
|
59
|
+
static inline int bsf(T x)
|
|
60
|
+
{
|
|
61
|
+
#if defined(_MSC_VER) && defined(_WIN64)
|
|
62
|
+
unsigned long out;
|
|
63
|
+
_BitScanForward64(&out, x);
|
|
64
|
+
#pragma warning(suppress: 6102)
|
|
65
|
+
return out;
|
|
66
|
+
#elif defined(__x86_64__)
|
|
67
|
+
return __builtin_ctzll(x);
|
|
68
|
+
#else
|
|
69
|
+
const uint32_t L = uint32_t(x);
|
|
70
|
+
if (L) return Tag<false>::bsf(L);
|
|
71
|
+
const uint32_t H = uint32_t(x >> 32);
|
|
72
|
+
return Tag<false>::bsf(H) + 32;
|
|
73
|
+
#endif
|
|
74
|
+
}
|
|
75
|
+
template<class T>
|
|
76
|
+
static inline int bsr(T x)
|
|
77
|
+
{
|
|
78
|
+
#if defined(_MSC_VER) && defined(_WIN64)
|
|
79
|
+
unsigned long out;
|
|
80
|
+
_BitScanReverse64(&out, x);
|
|
81
|
+
#pragma warning(suppress: 6102)
|
|
82
|
+
return out;
|
|
83
|
+
#elif defined(__x86_64__)
|
|
84
|
+
return __builtin_clzll(x) ^ 0x3f;
|
|
85
|
+
#else
|
|
86
|
+
const uint32_t H = uint32_t(x >> 32);
|
|
87
|
+
if (H) return Tag<false>::bsr(H) + 32;
|
|
88
|
+
const uint32_t L = uint32_t(x);
|
|
89
|
+
return Tag<false>::bsr(L);
|
|
90
|
+
#endif
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
} // bit_op_local
|
|
95
|
+
|
|
96
|
+
template<class T>
|
|
97
|
+
int bsf(T x)
|
|
98
|
+
{
|
|
99
|
+
return bit_op_local::Tag<sizeof(T) == 8>::bsf(x);
|
|
100
|
+
}
|
|
101
|
+
template<class T>
|
|
102
|
+
int bsr(T x)
|
|
103
|
+
{
|
|
104
|
+
return bit_op_local::Tag<sizeof(T) == 8>::bsr(x);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
template<class T>
|
|
108
|
+
uint64_t makeBitMask64(T x)
|
|
109
|
+
{
|
|
110
|
+
assert(x < 64);
|
|
111
|
+
return (uint64_t(1) << x) - 1;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
template<class T>
|
|
115
|
+
uint32_t popcnt(T x);
|
|
116
|
+
|
|
117
|
+
template<>
|
|
118
|
+
inline uint32_t popcnt<uint32_t>(uint32_t x)
|
|
119
|
+
{
|
|
120
|
+
#if defined(_MSC_VER)
|
|
121
|
+
return static_cast<uint32_t>(_mm_popcnt_u32(x));
|
|
122
|
+
#else
|
|
123
|
+
return static_cast<uint32_t>(__builtin_popcount(x));
|
|
124
|
+
#endif
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
template<>
|
|
128
|
+
inline uint32_t popcnt<uint64_t>(uint64_t x)
|
|
129
|
+
{
|
|
130
|
+
#if defined(__x86_64__)
|
|
131
|
+
return static_cast<uint32_t>(__builtin_popcountll(x));
|
|
132
|
+
#elif defined(_WIN64)
|
|
133
|
+
return static_cast<uint32_t>(_mm_popcnt_u64(x));
|
|
134
|
+
#else
|
|
135
|
+
return popcnt<uint32_t>(static_cast<uint32_t>(x)) + popcnt<uint32_t>(static_cast<uint32_t>(x >> 32));
|
|
136
|
+
#endif
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
} // cybozu
|