-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
masterThesis #1
base: master
Are you sure you want to change the base?
masterThesis #1
Commits on Apr 17, 2023
-
Configuration menu - View commit details
-
Copy full SHA for 115a75a - Browse repository at this point
Copy the full SHA 115a75aView commit details -
Configuration menu - View commit details
-
Copy full SHA for 473928e - Browse repository at this point
Copy the full SHA 473928eView commit details -
writer: don't (re)declare function arguments
void foo(int a) { int a; // remove this line }
Configuration menu - View commit details
-
Copy full SHA for 9408012 - Browse repository at this point
Copy the full SHA 9408012View commit details -
test: change the way of csmith testing
1. generate random test.c file [csmith] 2. compile test.c to binary [clang] 3. modify generated test.c file [fix-csmi.sh] - Here we replace csmith.h header with necessery stuff to avoid header expansion while compiling to llvm in next step 4. compile to LLVMIR test.ll [clang] 5. run llvm2c and generate decompiled.c [llvm2c] 6. modify decompiled.c file [decom-fix-csmi.sh] - Here we add csmith.h include and fix types for functions from csmith.h 7. compile decompiled.c to binary [clang] 8. run compiled binaries and compare their outputs If something goes wrong at any point then all generated files are copied to tmp (for debug purpose). If we caught exception after running the compiled test.c then we continue to the next step.
Configuration menu - View commit details
-
Copy full SHA for c1557e0 - Browse repository at this point
Copy the full SHA c1557e0View commit details -
parserMetadataTypes: turn on, and parse basic types
Parse basic types are: - int - char - short - long - float - double - long double and correctly recognize whether a type is signed or unsigned.
Configuration menu - View commit details
-
Copy full SHA for e415493 - Browse repository at this point
Copy the full SHA e415493View commit details -
parserMetadataTypes: enable type reconstruction for Glob Vars
from metadataTypeInfo
Configuration menu - View commit details
-
Copy full SHA for 2f894b4 - Browse repository at this point
Copy the full SHA 2f894b4View commit details -
parserMetadataTypes: implement derived (pointer) types parsing
E.g. `int *` or `unsigned int*`
Configuration menu - View commit details
-
Copy full SHA for fa3dab1 - Browse repository at this point
Copy the full SHA fa3dab1View commit details -
parserMetadataTypes: implement variadic debug printer
Which prints strings to the llvm:errs().
Configuration menu - View commit details
-
Copy full SHA for 955fd66 - Browse repository at this point
Copy the full SHA 955fd66View commit details -
Configuration menu - View commit details
-
Copy full SHA for 8329aa1 - Browse repository at this point
Copy the full SHA 8329aa1View commit details -
Configuration menu - View commit details
-
Copy full SHA for 5ceefa0 - Browse repository at this point
Copy the full SHA 5ceefa0View commit details -
Configuration menu - View commit details
-
Copy full SHA for de2ba02 - Browse repository at this point
Copy the full SHA de2ba02View commit details -
Configuration menu - View commit details
-
Copy full SHA for 4ebbe9a - Browse repository at this point
Copy the full SHA 4ebbe9aView commit details -
Configuration menu - View commit details
-
Copy full SHA for 52b16b6 - Browse repository at this point
Copy the full SHA 52b16b6View commit details -
Configuration menu - View commit details
-
Copy full SHA for 09426f5 - Browse repository at this point
Copy the full SHA 09426f5View commit details -
Configuration menu - View commit details
-
Copy full SHA for f679116 - Browse repository at this point
Copy the full SHA f679116View commit details -
parser: handle struct lowering
From https://lists.llvm.org/pipermail/cfe-dev/2013-January/027302.html: When a function has a struct parameter or return type, Clang may lower a struct parameter into... - a "byval" pointer (for a struct with several different members) - a vector (for a struct with a few float members) - two doubles (for a struct with two double members) - an i64 (for a struct with two i32 members) ... and possibly more variations. But there is no information in the metadata about types created in this way. Therefore, we detect the use of the struct type as an argument or return value of a function and do not reconstruct these types from the metadata.
Configuration menu - View commit details
-
Copy full SHA for 39833ec - Browse repository at this point
Copy the full SHA 39833ecView commit details -
Configuration menu - View commit details
-
Copy full SHA for 9446cb2 - Browse repository at this point
Copy the full SHA 9446cb2View commit details -
Configuration menu - View commit details
-
Copy full SHA for 195a87c - Browse repository at this point
Copy the full SHA 195a87cView commit details -
Configuration menu - View commit details
-
Copy full SHA for 6926075 - Browse repository at this point
Copy the full SHA 6926075View commit details -
parser: add support for legacy pass manager
Enable all (loop) passes from https://github.com/llvm-mirror/llvm/blob/master/lib/Transforms/IPO/PassManagerBuilder.cpp#L353-#L375: ```c if (EnableSimpleLoopUnswitch) { // The simple loop unswitch pass relies on separate cleanup passes. Schedule // them first so when we re-process a loop they run before other loop // passes. MPM.add(createLoopInstSimplifyPass()); MPM.add(createLoopSimplifyCFGPass()); } // Rotate Loop - disable header duplication at -Oz MPM.add(createLoopRotatePass(SizeLevel == 2 ? 0 : -1)); MPM.add(createLICMPass(LicmMssaOptCap, LicmMssaNoAccForPromotionCap)); if (EnableSimpleLoopUnswitch) MPM.add(createSimpleLoopUnswitchLegacyPass()); else MPM.add(createLoopUnswitchPass(SizeLevel || OptLevel < 3, DivergentTarget)); // FIXME: We break the loop pass pipeline here in order to do full // simplify-cfg. Eventually loop-simplifycfg should be enhanced to replace the // need for this. MPM.add(createCFGSimplificationPass()); addInstructionCombiningPass(MPM); // We resume loop passes creating a second loop pipeline here. MPM.add(createIndVarSimplifyPass()); // Canonicalize indvars MPM.add(createLoopIdiomPass()); // Recognize idioms like memset. ``` Test: ```bash clang -S -emit-llvm -Xclang -disable-O0-optnone simple-for-loop-second-latch.c -o simple-for-loop-second-latch-noopt.ll optpassPasses simple-for-loop-second-latch-noopt --loop-simplify --simplifycfg --loop-rotate --lcssa --licm --loop-unswitch --simplifycfg --instcombine --indvars old_llvm2c simple-for-loop-second-latch-noopt-opt == new_llvm2c simple-for-loop-second-latch-noopt ```
Configuration menu - View commit details
-
Copy full SHA for 03632e0 - Browse repository at this point
Copy the full SHA 03632e0View commit details -
Configuration menu - View commit details
-
Copy full SHA for 3855fd2 - Browse repository at this point
Copy the full SHA 3855fd2View commit details -
1. map LOOP with BRANCH instruction (condition) 2. transform BRANCH inst. to if's or doWhile constructs
Configuration menu - View commit details
-
Copy full SHA for af657bd - Browse repository at this point
Copy the full SHA af657bdView commit details -
parser: (head inline to latch) inline to preheader
First: ```c goto head; head: ... do goto head; while( C ); ``` transfrom into ```c do head while( C ); Second: Cache result from loopInfoAnalysis in particular function
Configuration menu - View commit details
-
Copy full SHA for 50d32f9 - Browse repository at this point
Copy the full SHA 50d32f9View commit details -
Configuration menu - View commit details
-
Copy full SHA for 38ea5f0 - Browse repository at this point
Copy the full SHA 38ea5f0View commit details -
Configuration menu - View commit details
-
Copy full SHA for bd65cff - Browse repository at this point
Copy the full SHA bd65cffView commit details -
Configuration menu - View commit details
-
Copy full SHA for f89e349 - Browse repository at this point
Copy the full SHA f89e349View commit details -
Configuration menu - View commit details
-
Copy full SHA for 72b8e04 - Browse repository at this point
Copy the full SHA 72b8e04View commit details -
Configuration menu - View commit details
-
Copy full SHA for 352183d - Browse repository at this point
Copy the full SHA 352183dView commit details -
Configuration menu - View commit details
-
Copy full SHA for 20f84d1 - Browse repository at this point
Copy the full SHA 20f84d1View commit details -
Configuration menu - View commit details
-
Copy full SHA for c57056f - Browse repository at this point
Copy the full SHA c57056fView commit details -
Configuration menu - View commit details
-
Copy full SHA for f06fc4d - Browse repository at this point
Copy the full SHA f06fc4dView commit details -
Configuration menu - View commit details
-
Copy full SHA for a2a489d - Browse repository at this point
Copy the full SHA a2a489dView commit details -
Configuration menu - View commit details
-
Copy full SHA for f57b18f - Browse repository at this point
Copy the full SHA f57b18fView commit details -
Configuration menu - View commit details
-
Copy full SHA for 23ad7e6 - Browse repository at this point
Copy the full SHA 23ad7e6View commit details -
Configuration menu - View commit details
-
Copy full SHA for bafae2d - Browse repository at this point
Copy the full SHA bafae2dView commit details -
Configuration menu - View commit details
-
Copy full SHA for 02c5a85 - Browse repository at this point
Copy the full SHA 02c5a85View commit details -
Configuration menu - View commit details
-
Copy full SHA for 85f2ba6 - Browse repository at this point
Copy the full SHA 85f2ba6View commit details -
Configuration menu - View commit details
-
Copy full SHA for 83628a1 - Browse repository at this point
Copy the full SHA 83628a1View commit details -
Configuration menu - View commit details
-
Copy full SHA for a0180d9 - Browse repository at this point
Copy the full SHA a0180d9View commit details -
Configuration menu - View commit details
-
Copy full SHA for 51de204 - Browse repository at this point
Copy the full SHA 51de204View commit details -
parser: create the LatchExpr only if the size from a header to a latc…
…h is greater than 1
Configuration menu - View commit details
-
Copy full SHA for 2747c81 - Browse repository at this point
Copy the full SHA 2747c81View commit details -
Configuration menu - View commit details
-
Copy full SHA for 4360924 - Browse repository at this point
Copy the full SHA 4360924View commit details -
parser: do not create special array allocas
This is hotfix. Following simple program cause the problem: int length = 10; int array[length]; llvm2c was unable to parse/find the length number from alloca instruction operands.
Configuration menu - View commit details
-
Copy full SHA for 074a1cb - Browse repository at this point
Copy the full SHA 074a1cbView commit details -
parser: fix segfault when analysing loops in empty function
function declaration
Configuration menu - View commit details
-
Copy full SHA for ce38fa5 - Browse repository at this point
Copy the full SHA ce38fa5View commit details -
Configuration menu - View commit details
-
Copy full SHA for f196528 - Browse repository at this point
Copy the full SHA f196528View commit details -
Configuration menu - View commit details
-
Copy full SHA for 261f100 - Browse repository at this point
Copy the full SHA 261f100View commit details -
Configuration menu - View commit details
-
Copy full SHA for 7ea8727 - Browse repository at this point
Copy the full SHA 7ea8727View commit details -
Configuration menu - View commit details
-
Copy full SHA for 3f518d7 - Browse repository at this point
Copy the full SHA 3f518d7View commit details -
Configuration menu - View commit details
-
Copy full SHA for 7fd2548 - Browse repository at this point
Copy the full SHA 7fd2548View commit details -
Configuration menu - View commit details
-
Copy full SHA for 631ea2e - Browse repository at this point
Copy the full SHA 631ea2eView commit details -
writer: print latchExpr correctly
before this change, latchExpr was able to print only single expression correctly
Configuration menu - View commit details
-
Copy full SHA for e5ead93 - Browse repository at this point
Copy the full SHA e5ead93View commit details -
parser: fix afterDoWhile destination
loopHeader is not always in the loop_latch->getTerminator()->getOperand(1)
Configuration menu - View commit details
-
Copy full SHA for b834d22 - Browse repository at this point
Copy the full SHA b834d22View commit details -
Configuration menu - View commit details
-
Copy full SHA for 4c35ae0 - Browse repository at this point
Copy the full SHA 4c35ae0View commit details -
parser: enable type reconstruction for Global Variables
from metadata
Configuration menu - View commit details
-
Copy full SHA for 51484bb - Browse repository at this point
Copy the full SHA 51484bbView commit details -
parser: comment out unused functions
This commit should be 'fixup'ed with a commit removing these functions...
Configuration menu - View commit details
-
Copy full SHA for 5ccda4c - Browse repository at this point
Copy the full SHA 5ccda4cView commit details -
writer: [sanitizer] fix potential runtime error:
/usr/include/c++/12/bits/stl_iterator.h:1139:20: runtime error: applying non-zero offset 18446744073709551608 to null pointer
Configuration menu - View commit details
-
Copy full SHA for ca434b2 - Browse repository at this point
Copy the full SHA ca434b2View commit details
Commits on Apr 24, 2023
-
Configuration menu - View commit details
-
Copy full SHA for e939847 - Browse repository at this point
Copy the full SHA e939847View commit details -
parser: disable the memcpyToAssignment pass
since llvm2c produces non-compilable code with it: input.c: ```c int main(){ int a[5] = {0,1,2,3,4}; return a[0]; } ``` output.c: ```c // function declarations int main(void); // global variable definitions unsigned int __const_main_a[5] = {0,1,2,3,4,}; int main(void){ int a[5]; block0: a = __const_main_a; return a[0]; } ``` "error: array type 'int[5]' is not assignable"
Configuration menu - View commit details
-
Copy full SHA for d0034ea - Browse repository at this point
Copy the full SHA d0034eaView commit details -
Configuration menu - View commit details
-
Copy full SHA for aef81bf - Browse repository at this point
Copy the full SHA aef81bfView commit details -
Configuration menu - View commit details
-
Copy full SHA for 0402f67 - Browse repository at this point
Copy the full SHA 0402f67View commit details
Commits on Apr 25, 2023
-
parser: do not deduce type when var doesn't exist
input.c ```c struct S3 { int arr[18]; }; struct S3 func_1() { struct S3 l_5; return l_5; } int main() { func_1(); } ``` input.ll ```llvmir ... define dso_local void @func_1(%struct.S3* noalias sret(%struct.S3) align 4 %0) #0 !dbg !8 { call void @llvm.dbg.declare(metadata %struct.S3* %0, metadata !45, metadata !DIExpression()), !dbg !46 ret void, !dbg !47 } ... ``` The problem was that the '%struct.S3*' type changed from pointer to struct type. This change happens due to misleading information from metadata which corresponds to the type from the input.c file.
Configuration menu - View commit details
-
Copy full SHA for cac933c - Browse repository at this point
Copy the full SHA cac933cView commit details -
Configuration menu - View commit details
-
Copy full SHA for caef278 - Browse repository at this point
Copy the full SHA caef278View commit details
Commits on Apr 26, 2023
-
Configuration menu - View commit details
-
Copy full SHA for 1fdb9c5 - Browse repository at this point
Copy the full SHA 1fdb9c5View commit details -
Configuration menu - View commit details
-
Copy full SHA for dae0c85 - Browse repository at this point
Copy the full SHA dae0c85View commit details
Commits on Apr 27, 2023
-
Configuration menu - View commit details
-
Copy full SHA for e3d9911 - Browse repository at this point
Copy the full SHA e3d9911View commit details
Commits on Apr 28, 2023
-
Configuration menu - View commit details
-
Copy full SHA for 50666af - Browse repository at this point
Copy the full SHA 50666afView commit details
Commits on Apr 29, 2023
-
parser: fix coredump for a void type in a function
e.g. `void foo();`
Configuration menu - View commit details
-
Copy full SHA for 5b11272 - Browse repository at this point
Copy the full SHA 5b11272View commit details -
parser: handle cycles in metadata types
e.g. struct s { struct s *ptr_to_s; }
Configuration menu - View commit details
-
Copy full SHA for b2ca928 - Browse repository at this point
Copy the full SHA b2ca928View commit details -
parser: parse the
_bool
type as unsigned intbecause in current situation there is no better way to handle this.
Configuration menu - View commit details
-
Copy full SHA for c9caeca - Browse repository at this point
Copy the full SHA c9caecaView commit details
Commits on May 1, 2023
-
parser: prevent double caching ...
when e.g. ```c typedef struct node { struct node *n } * List; List main_a; ```
Configuration menu - View commit details
-
Copy full SHA for 539acb9 - Browse repository at this point
Copy the full SHA 539acb9View commit details -
Configuration menu - View commit details
-
Copy full SHA for 6b52c53 - Browse repository at this point
Copy the full SHA 6b52c53View commit details -
parser: small support of a enum DIType
we are consistent and for now decompile a enum as a global variable
Configuration menu - View commit details
-
Copy full SHA for 9432a46 - Browse repository at this point
Copy the full SHA 9432a46View commit details
Commits on May 2, 2023
-
Configuration menu - View commit details
-
Copy full SHA for 032d7e5 - Browse repository at this point
Copy the full SHA 032d7e5View commit details -
parser: fix an array size deduction from the DI.
e.g. `int array[g_var];` generates: ```llvmir !18 = !DILocalVariable(name: "__vla_expr0", scope: !12, type: !19, flags: DIFlagArtificial) !19 = !DIBasicType(name: "unsigned long", size: 64, encoding: DW_ATE_unsigned) !20 = !DILocation(line: 0, scope: !12) !21 = !DILocalVariable(name: "array", scope: !12, file: !3, line: 2, type: !22) !22 = !DICompositeType(tag: DW_TAG_array_type, baseType: !5, elements: !23) !23 = !{!24} ``` We can savely set an array size to 0, because type_kinds will differ, and the deduced type will not be used. I hope this is a valid argument. By valid I mean safe. In llvm2c arrayType does not have a constructor for non-intergral type. So we cannot set the variable name as a size argument...
Configuration menu - View commit details
-
Copy full SHA for 8450cb0 - Browse repository at this point
Copy the full SHA 8450cb0View commit details
Commits on May 6, 2023
-
Configuration menu - View commit details
-
Copy full SHA for 4ba72d7 - Browse repository at this point
Copy the full SHA 4ba72d7View commit details
Commits on May 11, 2023
-
parses: cache the outermost array instead of innermost
So in the code: ```c int a[2][3]; int main() { int b[2][3]; } ``` The type of array b wont be created again!
Configuration menu - View commit details
-
Copy full SHA for efdebbf - Browse repository at this point
Copy the full SHA efdebbfView commit details -
Configuration menu - View commit details
-
Copy full SHA for ea74454 - Browse repository at this point
Copy the full SHA ea74454View commit details -
Configuration menu - View commit details
-
Copy full SHA for fdaf727 - Browse repository at this point
Copy the full SHA fdaf727View commit details -
Configuration menu - View commit details
-
Copy full SHA for 3b66d2b - Browse repository at this point
Copy the full SHA 3b66d2bView commit details -
parser: fix support of variadic functions
thanks @lzaoral for discussion
Configuration menu - View commit details
-
Copy full SHA for 3b6047e - Browse repository at this point
Copy the full SHA 3b6047eView commit details -
parser: __va_list_tag is struct name
in llvm2c usually all struct have name prefixed with "s_"
Configuration menu - View commit details
-
Copy full SHA for 51844cd - Browse repository at this point
Copy the full SHA 51844cdView commit details
Commits on May 12, 2023
-
Configuration menu - View commit details
-
Copy full SHA for 39ba01f - Browse repository at this point
Copy the full SHA 39ba01fView commit details -
parser: add LLVM::Type as parameter
and prepare for anonymous structs/unions Thanks @lzaoral for help!
Configuration menu - View commit details
-
Copy full SHA for 783a313 - Browse repository at this point
Copy the full SHA 783a313View commit details -
Configuration menu - View commit details
-
Copy full SHA for f74aa13 - Browse repository at this point
Copy the full SHA f74aa13View commit details -
Configuration menu - View commit details
-
Copy full SHA for 75c25ce - Browse repository at this point
Copy the full SHA 75c25ceView commit details -
Configuration menu - View commit details
-
Copy full SHA for 23e716f - Browse repository at this point
Copy the full SHA 23e716fView commit details -
Configuration menu - View commit details
-
Copy full SHA for 5110a14 - Browse repository at this point
Copy the full SHA 5110a14View commit details
Commits on Mar 14, 2024
-
Configuration menu - View commit details
-
Copy full SHA for b4ccd78 - Browse repository at this point
Copy the full SHA b4ccd78View commit details -
Configuration menu - View commit details
-
Copy full SHA for 2e31974 - Browse repository at this point
Copy the full SHA 2e31974View commit details -
Configuration menu - View commit details
-
Copy full SHA for b031869 - Browse repository at this point
Copy the full SHA b031869View commit details -
Configuration menu - View commit details
-
Copy full SHA for 464fbad - Browse repository at this point
Copy the full SHA 464fbadView commit details -
Configuration menu - View commit details
-
Copy full SHA for 95f4a99 - Browse repository at this point
Copy the full SHA 95f4a99View commit details -
Configuration menu - View commit details
-
Copy full SHA for 810f837 - Browse repository at this point
Copy the full SHA 810f837View commit details -
parser: DIfunction might parse itself during parsing
e.g., type function occurs as arg type or return type
Configuration menu - View commit details
-
Copy full SHA for 045315a - Browse repository at this point
Copy the full SHA 045315aView commit details -
Configuration menu - View commit details
-
Copy full SHA for 70842ab - Browse repository at this point
Copy the full SHA 70842abView commit details -
parser/negCmpInst: add a function to negate a CmpInst condition
I wrongly assume that llvm always generates positive loop conditions, e.g. if this is true, then iterate, but after -O3 optimisations, loop condition might be negated: if this is false, then continue to the next iteration. This new function will reverse the loop condition if the situation described above occurs! This might need a proper solution - this is hackery, because we do not replace the whole expression, just a printed character e.g. "<" -> ">=".
Configuration menu - View commit details
-
Copy full SHA for a4109fa - Browse repository at this point
Copy the full SHA a4109faView commit details -
parser: move assignments of phi variables at the end of the loop body
x = phi i32 [0, %beforeLoop] [%y, %fromLoop] ; coming from %fromLoop means we are in a next iteration before this commit: x = 0; do { x = y; loopBody(y, ...); } while ( cond ) after this commit: x = 0; do { loopBody(y, ...); x = y; } while ( cond )
Configuration menu - View commit details
-
Copy full SHA for a99637d - Browse repository at this point
Copy the full SHA a99637dView commit details -
parser: Implement the {un,}signed variants of llvm intrinsincs that r…
…eturn the m{ax,in}imum of the two operands. My idea comes from https://reviews.llvm.org/D9293?id=&download=true The expression: call i8 @llvm.umin.i8(i8 %a, i8 %b) is equivalent to %1 = icmp ult i8 %a, %b %2 = select i1 %1, i8 %a, i8 %b This is what llvm2c outputs: a < b ? a : b
Configuration menu - View commit details
-
Copy full SHA for f6388dc - Browse repository at this point
Copy the full SHA f6388dcView commit details -
parser: Create
goto afterDoWhile;
from the doWhile block and not fr……om the preheader block
Configuration menu - View commit details
-
Copy full SHA for 4182cec - Browse repository at this point
Copy the full SHA 4182cecView commit details -
parseBreaks: Fix phi assignments for in loop contianed variables
This commit is probably the correct fix for what fd4978d was trying to address.
Configuration menu - View commit details
-
Copy full SHA for 8ea37c8 - Browse repository at this point
Copy the full SHA 8ea37c8View commit details -
Configuration menu - View commit details
-
Copy full SHA for d22b14b - Browse repository at this point
Copy the full SHA d22b14bView commit details -
Configuration menu - View commit details
-
Copy full SHA for 2e60dee - Browse repository at this point
Copy the full SHA 2e60deeView commit details -
Configuration menu - View commit details
-
Copy full SHA for b703560 - Browse repository at this point
Copy the full SHA b703560View commit details -
Configuration menu - View commit details
-
Copy full SHA for ac88b7c - Browse repository at this point
Copy the full SHA ac88b7cView commit details -
Configuration menu - View commit details
-
Copy full SHA for d5c591e - Browse repository at this point
Copy the full SHA d5c591eView commit details -
parser: decompiles 'sext i1 boolVal' as 'boolVal ? -1 : 0'
https://llvm.org/docs/LangRef.html#sext-to-instruction This is based on a fact that if you sext i1 cmp_result to i32, you can get either -1 or 0.
Configuration menu - View commit details
-
Copy full SHA for b10037a - Browse repository at this point
Copy the full SHA b10037aView commit details
Commits on Mar 28, 2024
-
fix a number of "is not a member of ‘llvm::dwarf’"
Signed-off-by: Andrew V. Teylu <andrew.teylu@vector.com>
Configuration menu - View commit details
-
Copy full SHA for 8bbc212 - Browse repository at this point
Copy the full SHA 8bbc212View commit details