annotate clang/NOTES.txt @ 150:1d019706d866

LLVM10
author anatofuz
date Thu, 13 Feb 2020 15:10:13 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===---------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
2 // Random Notes
anatofuz
parents:
diff changeset
3 //===---------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
4
anatofuz
parents:
diff changeset
5 //===---------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
6
anatofuz
parents:
diff changeset
7 To time GCC preprocessing speed without output, use:
anatofuz
parents:
diff changeset
8 "time gcc -MM file"
anatofuz
parents:
diff changeset
9 This is similar to -Eonly.
anatofuz
parents:
diff changeset
10
anatofuz
parents:
diff changeset
11 //===---------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
12
anatofuz
parents:
diff changeset
13 C++ Template Instantiation benchmark:
anatofuz
parents:
diff changeset
14 http://users.rcn.com/abrahams/instantiation_speed/index.html
anatofuz
parents:
diff changeset
15
anatofuz
parents:
diff changeset
16 //===---------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
17
anatofuz
parents:
diff changeset
18 TODO: File Manager Speedup:
anatofuz
parents:
diff changeset
19
anatofuz
parents:
diff changeset
20 We currently do a lot of stat'ing for files that don't exist, particularly
anatofuz
parents:
diff changeset
21 when lots of -I paths exist (e.g. see the <iostream> example, check for
anatofuz
parents:
diff changeset
22 failures in stat in FileManager::getFile). It would be far better to make
anatofuz
parents:
diff changeset
23 the following changes:
anatofuz
parents:
diff changeset
24 1. FileEntry contains a sys::Path instead of a std::string for Name.
anatofuz
parents:
diff changeset
25 2. sys::Path contains timestamp and size, lazily computed. Eliminate from
anatofuz
parents:
diff changeset
26 FileEntry.
anatofuz
parents:
diff changeset
27 3. File UIDs are created on request, not when files are opened.
anatofuz
parents:
diff changeset
28 These changes make it possible to efficiently have FileEntry objects for
anatofuz
parents:
diff changeset
29 files that exist on the file system, but have not been used yet.
anatofuz
parents:
diff changeset
30
anatofuz
parents:
diff changeset
31 Once this is done:
anatofuz
parents:
diff changeset
32 1. DirectoryEntry gets a boolean value "has read entries". When false, not
anatofuz
parents:
diff changeset
33 all entries in the directory are in the file mgr, when true, they are.
anatofuz
parents:
diff changeset
34 2. Instead of stat'ing the file in FileManager::getFile, check to see if
anatofuz
parents:
diff changeset
35 the dir has been read. If so, fail immediately, if not, read the dir,
anatofuz
parents:
diff changeset
36 then retry.
anatofuz
parents:
diff changeset
37 3. Reading the dir uses the getdirentries syscall, creating a FileEntry
anatofuz
parents:
diff changeset
38 for all files found.
anatofuz
parents:
diff changeset
39
anatofuz
parents:
diff changeset
40 //===---------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
41 // Specifying targets: -triple and -arch
anatofuz
parents:
diff changeset
42 //===---------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
43
anatofuz
parents:
diff changeset
44 The clang supports "-triple" and "-arch" options. At most one -triple and one
anatofuz
parents:
diff changeset
45 -arch option may be specified. Both are optional.
anatofuz
parents:
diff changeset
46
anatofuz
parents:
diff changeset
47 The "selection of target" behavior is defined as follows:
anatofuz
parents:
diff changeset
48
anatofuz
parents:
diff changeset
49 (1) If the user does not specify -triple, we default to the host triple.
anatofuz
parents:
diff changeset
50 (2) If the user specifies a -arch, that overrides the arch in the host or
anatofuz
parents:
diff changeset
51 specified triple.
anatofuz
parents:
diff changeset
52
anatofuz
parents:
diff changeset
53 //===---------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
54
anatofuz
parents:
diff changeset
55
anatofuz
parents:
diff changeset
56 verifyInputConstraint and verifyOutputConstraint should not return bool.
anatofuz
parents:
diff changeset
57
anatofuz
parents:
diff changeset
58 Instead we should return something like:
anatofuz
parents:
diff changeset
59
anatofuz
parents:
diff changeset
60 enum VerifyConstraintResult {
anatofuz
parents:
diff changeset
61 Valid,
anatofuz
parents:
diff changeset
62
anatofuz
parents:
diff changeset
63 // Output only
anatofuz
parents:
diff changeset
64 OutputOperandConstraintLacksEqualsCharacter,
anatofuz
parents:
diff changeset
65 MatchingConstraintNotValidInOutputOperand,
anatofuz
parents:
diff changeset
66
anatofuz
parents:
diff changeset
67 // Input only
anatofuz
parents:
diff changeset
68 InputOperandConstraintContainsEqualsCharacter,
anatofuz
parents:
diff changeset
69 MatchingConstraintReferencesInvalidOperandNumber,
anatofuz
parents:
diff changeset
70
anatofuz
parents:
diff changeset
71 // Both
anatofuz
parents:
diff changeset
72 PercentConstraintUsedWithLastOperand
anatofuz
parents:
diff changeset
73 };
anatofuz
parents:
diff changeset
74
anatofuz
parents:
diff changeset
75 //===---------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
76
anatofuz
parents:
diff changeset
77 Blocks should not capture variables that are only used in dead code.
anatofuz
parents:
diff changeset
78
anatofuz
parents:
diff changeset
79 The rule that we came up with is that blocks are required to capture
anatofuz
parents:
diff changeset
80 variables if they're referenced in evaluated code, even if that code
anatofuz
parents:
diff changeset
81 doesn't actually rely on the value of the captured variable.
anatofuz
parents:
diff changeset
82
anatofuz
parents:
diff changeset
83 For example, this requires a capture:
anatofuz
parents:
diff changeset
84 (void) var;
anatofuz
parents:
diff changeset
85 But this does not:
anatofuz
parents:
diff changeset
86 if (false) puts(var);
anatofuz
parents:
diff changeset
87
anatofuz
parents:
diff changeset
88 Summary of <rdar://problem/9851835>: if we implement this, we should
anatofuz
parents:
diff changeset
89 warn about non-POD variables that are referenced but not captured, but
anatofuz
parents:
diff changeset
90 only if the non-reachability is not due to macro or template
anatofuz
parents:
diff changeset
91 metaprogramming.
anatofuz
parents:
diff changeset
92
anatofuz
parents:
diff changeset
93 //===---------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
94
anatofuz
parents:
diff changeset
95 We can still apply a modified version of the constructor/destructor
anatofuz
parents:
diff changeset
96 delegation optimization in cases of virtual inheritance where:
anatofuz
parents:
diff changeset
97 - there is no function-try-block,
anatofuz
parents:
diff changeset
98 - the constructor signature is not variadic, and
anatofuz
parents:
diff changeset
99 - the parameter variables can safely be copied and repassed
anatofuz
parents:
diff changeset
100 to the base constructor because either
anatofuz
parents:
diff changeset
101 - they have not had their addresses taken by the vbase initializers or
anatofuz
parents:
diff changeset
102 - they were passed indirectly.
anatofuz
parents:
diff changeset
103
anatofuz
parents:
diff changeset
104 //===---------------------------------------------------------------------===//