Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(10)

Side by Side Diff: src/hydrogen.cc

Issue 24205004: Rollback trunk to 3.21.16.2 (Closed) Base URL: https://v8.googlecode.com/svn/trunk
Patch Set: Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/hydrogen.h ('k') | src/hydrogen-alias-analysis.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 25 matching lines...) Expand all
36 #include "hydrogen-bce.h" 36 #include "hydrogen-bce.h"
37 #include "hydrogen-bch.h" 37 #include "hydrogen-bch.h"
38 #include "hydrogen-canonicalize.h" 38 #include "hydrogen-canonicalize.h"
39 #include "hydrogen-dce.h" 39 #include "hydrogen-dce.h"
40 #include "hydrogen-dehoist.h" 40 #include "hydrogen-dehoist.h"
41 #include "hydrogen-deoptimizing-mark.h" 41 #include "hydrogen-deoptimizing-mark.h"
42 #include "hydrogen-environment-liveness.h" 42 #include "hydrogen-environment-liveness.h"
43 #include "hydrogen-escape-analysis.h" 43 #include "hydrogen-escape-analysis.h"
44 #include "hydrogen-infer-representation.h" 44 #include "hydrogen-infer-representation.h"
45 #include "hydrogen-infer-types.h" 45 #include "hydrogen-infer-types.h"
46 #include "hydrogen-load-elimination.h"
47 #include "hydrogen-gvn.h" 46 #include "hydrogen-gvn.h"
48 #include "hydrogen-mark-deoptimize.h" 47 #include "hydrogen-mark-deoptimize.h"
49 #include "hydrogen-minus-zero.h" 48 #include "hydrogen-minus-zero.h"
50 #include "hydrogen-osr.h" 49 #include "hydrogen-osr.h"
51 #include "hydrogen-range-analysis.h" 50 #include "hydrogen-range-analysis.h"
52 #include "hydrogen-redundant-phi.h" 51 #include "hydrogen-redundant-phi.h"
53 #include "hydrogen-removable-simulates.h" 52 #include "hydrogen-removable-simulates.h"
54 #include "hydrogen-representation-changes.h" 53 #include "hydrogen-representation-changes.h"
55 #include "hydrogen-sce.h" 54 #include "hydrogen-sce.h"
56 #include "hydrogen-uint32-analysis.h" 55 #include "hydrogen-uint32-analysis.h"
(...skipping 969 matching lines...) Expand 10 before | Expand all | Expand 10 after
1026 HInstruction* HGraphBuilder::AddInstruction(HInstruction* instr) { 1025 HInstruction* HGraphBuilder::AddInstruction(HInstruction* instr) {
1027 ASSERT(current_block() != NULL); 1026 ASSERT(current_block() != NULL);
1028 current_block()->AddInstruction(instr); 1027 current_block()->AddInstruction(instr);
1029 if (graph()->IsInsideNoSideEffectsScope()) { 1028 if (graph()->IsInsideNoSideEffectsScope()) {
1030 instr->SetFlag(HValue::kHasNoObservableSideEffects); 1029 instr->SetFlag(HValue::kHasNoObservableSideEffects);
1031 } 1030 }
1032 return instr; 1031 return instr;
1033 } 1032 }
1034 1033
1035 1034
1036 void HGraphBuilder::AddIncrementCounter(StatsCounter* counter) { 1035 void HGraphBuilder::AddIncrementCounter(StatsCounter* counter,
1036 HValue* context) {
1037 if (FLAG_native_code_counters && counter->Enabled()) { 1037 if (FLAG_native_code_counters && counter->Enabled()) {
1038 HValue* reference = Add<HConstant>(ExternalReference(counter)); 1038 HValue* reference = Add<HConstant>(ExternalReference(counter));
1039 HValue* old_value = Add<HLoadNamedField>(reference, 1039 HValue* old_value = Add<HLoadNamedField>(reference,
1040 HObjectAccess::ForCounter()); 1040 HObjectAccess::ForCounter());
1041 HValue* new_value = Add<HAdd>(old_value, graph()->GetConstant1()); 1041 HValue* new_value = Add<HAdd>(old_value, graph()->GetConstant1());
1042 new_value->ClearFlag(HValue::kCanOverflow); // Ignore counter overflow 1042 new_value->ClearFlag(HValue::kCanOverflow); // Ignore counter overflow
1043 Add<HStoreNamedField>(reference, HObjectAccess::ForCounter(), 1043 Add<HStoreNamedField>(reference, HObjectAccess::ForCounter(),
1044 new_value); 1044 new_value);
1045 } 1045 }
1046 } 1046 }
(...skipping 770 matching lines...) Expand 10 before | Expand all | Expand 10 after
1817 } 1817 }
1818 } 1818 }
1819 1819
1820 if_nil.CaptureContinuation(continuation); 1820 if_nil.CaptureContinuation(continuation);
1821 } 1821 }
1822 1822
1823 1823
1824 HValue* HGraphBuilder::BuildCreateAllocationMemento(HValue* previous_object, 1824 HValue* HGraphBuilder::BuildCreateAllocationMemento(HValue* previous_object,
1825 int previous_object_size, 1825 int previous_object_size,
1826 HValue* alloc_site) { 1826 HValue* alloc_site) {
1827 ASSERT(alloc_site != NULL); 1827 // TODO(mvstanton): ASSERT altered to CHECK to diagnose chromium bug 284577
1828 CHECK(alloc_site != NULL);
1828 HInnerAllocatedObject* alloc_memento = Add<HInnerAllocatedObject>( 1829 HInnerAllocatedObject* alloc_memento = Add<HInnerAllocatedObject>(
1829 previous_object, previous_object_size); 1830 previous_object, previous_object_size);
1830 Handle<Map> alloc_memento_map( 1831 Handle<Map> alloc_memento_map(
1831 isolate()->heap()->allocation_memento_map()); 1832 isolate()->heap()->allocation_memento_map());
1832 AddStoreMapConstant(alloc_memento, alloc_memento_map); 1833 AddStoreMapConstant(alloc_memento, alloc_memento_map);
1833 HObjectAccess access = HObjectAccess::ForAllocationMementoSite(); 1834 HObjectAccess access = HObjectAccess::ForAllocationMementoSite();
1834 Add<HStoreNamedField>(alloc_memento, access, alloc_site); 1835 Add<HStoreNamedField>(alloc_memento, access, alloc_site);
1835 return alloc_memento; 1836 return alloc_memento;
1836 } 1837 }
1837 1838
(...skipping 1127 matching lines...) Expand 10 before | Expand all | Expand 10 after
2965 if (!CheckArgumentsPhiUses()) { 2966 if (!CheckArgumentsPhiUses()) {
2966 *bailout_reason = kUnsupportedPhiUseOfArguments; 2967 *bailout_reason = kUnsupportedPhiUseOfArguments;
2967 return false; 2968 return false;
2968 } 2969 }
2969 2970
2970 // Remove dead code and phis 2971 // Remove dead code and phis
2971 if (FLAG_dead_code_elimination) Run<HDeadCodeEliminationPhase>(); 2972 if (FLAG_dead_code_elimination) Run<HDeadCodeEliminationPhase>();
2972 2973
2973 if (FLAG_use_escape_analysis) Run<HEscapeAnalysisPhase>(); 2974 if (FLAG_use_escape_analysis) Run<HEscapeAnalysisPhase>();
2974 2975
2975 if (FLAG_load_elimination) Run<HLoadEliminationPhase>();
2976
2977 CollectPhis(); 2976 CollectPhis();
2978 2977
2979 if (has_osr()) osr()->FinishOsrValues(); 2978 if (has_osr()) osr()->FinishOsrValues();
2980 2979
2981 Run<HInferRepresentationPhase>(); 2980 Run<HInferRepresentationPhase>();
2982 2981
2983 // Remove HSimulate instructions that have turned out not to be needed 2982 // Remove HSimulate instructions that have turned out not to be needed
2984 // after all by folding them into the following HSimulate. 2983 // after all by folding them into the following HSimulate.
2985 // This must happen after inferring representations. 2984 // This must happen after inferring representations.
2986 Run<HMergeRemovableSimulatesPhase>(); 2985 Run<HMergeRemovableSimulatesPhase>();
(...skipping 1179 matching lines...) Expand 10 before | Expand all | Expand 10 after
4166 HInstruction* literal; 4165 HInstruction* literal;
4167 4166
4168 // Check whether to use fast or slow deep-copying for boilerplate. 4167 // Check whether to use fast or slow deep-copying for boilerplate.
4169 int max_properties = kMaxFastLiteralProperties; 4168 int max_properties = kMaxFastLiteralProperties;
4170 Handle<Object> boilerplate(closure->literals()->get( 4169 Handle<Object> boilerplate(closure->literals()->get(
4171 expr->literal_index()), isolate()); 4170 expr->literal_index()), isolate());
4172 if (boilerplate->IsJSObject() && 4171 if (boilerplate->IsJSObject() &&
4173 IsFastLiteral(Handle<JSObject>::cast(boilerplate), 4172 IsFastLiteral(Handle<JSObject>::cast(boilerplate),
4174 kMaxFastLiteralDepth, 4173 kMaxFastLiteralDepth,
4175 &max_properties)) { 4174 &max_properties)) {
4176 Handle<JSObject> boilerplate_object = Handle<JSObject>::cast(boilerplate); 4175 Handle<JSObject> boilerplate_object =
4176 Handle<JSObject>::cast(boilerplate);
4177 4177
4178 literal = BuildFastLiteral(boilerplate_object, 4178 literal = BuildFastLiteral(boilerplate_object,
4179 Handle<Object>::null(), 4179 Handle<Object>::null(),
4180 DONT_TRACK_ALLOCATION_SITE); 4180 DONT_TRACK_ALLOCATION_SITE);
4181 } else { 4181 } else {
4182 NoObservableSideEffectsScope no_effects(this); 4182 NoObservableSideEffectsScope no_effects(this);
4183 Handle<FixedArray> closure_literals(closure->literals(), isolate()); 4183 Handle<FixedArray> closure_literals(closure->literals(), isolate());
4184 Handle<FixedArray> constant_properties = expr->constant_properties(); 4184 Handle<FixedArray> constant_properties = expr->constant_properties();
4185 int literal_index = expr->literal_index(); 4185 int literal_index = expr->literal_index();
4186 int flags = expr->fast_elements() 4186 int flags = expr->fast_elements()
(...skipping 942 matching lines...) Expand 10 before | Expand all | Expand 10 after
5129 5129
5130 case Variable::LOOKUP: 5130 case Variable::LOOKUP:
5131 return Bailout(kCompoundAssignmentToLookupSlot); 5131 return Bailout(kCompoundAssignmentToLookupSlot);
5132 } 5132 }
5133 return ast_context()->ReturnValue(Pop()); 5133 return ast_context()->ReturnValue(Pop());
5134 5134
5135 } else if (prop != NULL) { 5135 } else if (prop != NULL) {
5136 CHECK_ALIVE(VisitForValue(prop->obj())); 5136 CHECK_ALIVE(VisitForValue(prop->obj()));
5137 HValue* object = Top(); 5137 HValue* object = Top();
5138 HValue* key = NULL; 5138 HValue* key = NULL;
5139 if ((!prop->IsFunctionPrototype() && !prop->key()->IsPropertyName()) || 5139 if ((!prop->IsStringLength() &&
5140 !prop->IsFunctionPrototype() &&
5141 !prop->key()->IsPropertyName()) ||
5140 prop->IsStringAccess()) { 5142 prop->IsStringAccess()) {
5141 CHECK_ALIVE(VisitForValue(prop->key())); 5143 CHECK_ALIVE(VisitForValue(prop->key()));
5142 key = Top(); 5144 key = Top();
5143 } 5145 }
5144 5146
5145 CHECK_ALIVE(PushLoad(prop, object, key, expr->position())); 5147 CHECK_ALIVE(PushLoad(prop, object, key, expr->position()));
5146 5148
5147 CHECK_ALIVE(VisitForValue(expr->value())); 5149 CHECK_ALIVE(VisitForValue(expr->value()));
5148 HValue* right = Pop(); 5150 HValue* right = Pop();
5149 HValue* left = Pop(); 5151 HValue* left = Pop();
(...skipping 669 matching lines...) Expand 10 before | Expand all | Expand 10 after
5819 HValue* object, 5821 HValue* object,
5820 HValue* key, 5822 HValue* key,
5821 int position) { 5823 int position) {
5822 ValueContext for_value(this, ARGUMENTS_NOT_ALLOWED); 5824 ValueContext for_value(this, ARGUMENTS_NOT_ALLOWED);
5823 Push(object); 5825 Push(object);
5824 if (key != NULL) Push(key); 5826 if (key != NULL) Push(key);
5825 BuildLoad(expr, position, expr->LoadId()); 5827 BuildLoad(expr, position, expr->LoadId());
5826 } 5828 }
5827 5829
5828 5830
5829 static bool AreStringTypes(SmallMapList* types) {
5830 if (types == NULL || types->length() == 0) return false;
5831 for (int i = 0; i < types->length(); i++) {
5832 if (types->at(i)->instance_type() >= FIRST_NONSTRING_TYPE) return false;
5833 }
5834 return true;
5835 }
5836
5837
5838 void HOptimizedGraphBuilder::BuildLoad(Property* expr, 5831 void HOptimizedGraphBuilder::BuildLoad(Property* expr,
5839 int position, 5832 int position,
5840 BailoutId ast_id) { 5833 BailoutId ast_id) {
5841 HInstruction* instr = NULL; 5834 HInstruction* instr = NULL;
5842 if (expr->IsStringAccess()) { 5835 if (expr->IsStringLength()) {
5836 HValue* string = Pop();
5837 BuildCheckHeapObject(string);
5838 HInstruction* checkstring =
5839 AddInstruction(HCheckInstanceType::NewIsString(string, zone()));
5840 instr = BuildLoadStringLength(string, checkstring);
5841 } else if (expr->IsStringAccess()) {
5843 HValue* index = Pop(); 5842 HValue* index = Pop();
5844 HValue* string = Pop(); 5843 HValue* string = Pop();
5845 HValue* context = environment()->context(); 5844 HValue* context = environment()->context();
5846 HInstruction* char_code = 5845 HInstruction* char_code =
5847 BuildStringCharCodeAt(string, index); 5846 BuildStringCharCodeAt(string, index);
5848 AddInstruction(char_code); 5847 AddInstruction(char_code);
5849 instr = HStringCharFromCode::New(zone(), context, char_code); 5848 instr = HStringCharFromCode::New(zone(), context, char_code);
5850 5849
5851 } else if (expr->IsFunctionPrototype()) { 5850 } else if (expr->IsFunctionPrototype()) {
5852 HValue* function = Pop(); 5851 HValue* function = Pop();
(...skipping 15 matching lines...) Expand all
5868 AddCheckConstantFunction(holder, Top(), map); 5867 AddCheckConstantFunction(holder, Top(), map);
5869 if (FLAG_inline_accessors && 5868 if (FLAG_inline_accessors &&
5870 TryInlineGetter(getter, ast_id, expr->LoadId())) { 5869 TryInlineGetter(getter, ast_id, expr->LoadId())) {
5871 return; 5870 return;
5872 } 5871 }
5873 Add<HPushArgument>(Pop()); 5872 Add<HPushArgument>(Pop());
5874 instr = new(zone()) HCallConstantFunction(getter, 1); 5873 instr = new(zone()) HCallConstantFunction(getter, 1);
5875 } else { 5874 } else {
5876 instr = BuildLoadNamedMonomorphic(Pop(), name, map); 5875 instr = BuildLoadNamedMonomorphic(Pop(), name, map);
5877 } 5876 }
5878 } else if (AreStringTypes(types) &&
5879 name->Equals(isolate()->heap()->length_string())) {
5880 BuildCheckHeapObject(Pop());
5881 HValue* checked_object =
5882 AddInstruction(HCheckInstanceType::NewIsString(object, zone()));
5883 instr = BuildLoadStringLength(object, checked_object);
5884 } else if (types != NULL && types->length() > 1) { 5877 } else if (types != NULL && types->length() > 1) {
5885 return HandlePolymorphicLoadNamedField( 5878 return HandlePolymorphicLoadNamedField(
5886 position, ast_id, Pop(), types, name); 5879 position, ast_id, Pop(), types, name);
5887 } else { 5880 } else {
5888 instr = BuildLoadNamedGeneric(Pop(), name, expr); 5881 instr = BuildLoadNamedGeneric(Pop(), name, expr);
5889 } 5882 }
5890 5883
5891 } else { 5884 } else {
5892 HValue* key = Pop(); 5885 HValue* key = Pop();
5893 HValue* obj = Pop(); 5886 HValue* obj = Pop();
(...skipping 20 matching lines...) Expand all
5914 5907
5915 5908
5916 void HOptimizedGraphBuilder::VisitProperty(Property* expr) { 5909 void HOptimizedGraphBuilder::VisitProperty(Property* expr) {
5917 ASSERT(!HasStackOverflow()); 5910 ASSERT(!HasStackOverflow());
5918 ASSERT(current_block() != NULL); 5911 ASSERT(current_block() != NULL);
5919 ASSERT(current_block()->HasPredecessor()); 5912 ASSERT(current_block()->HasPredecessor());
5920 5913
5921 if (TryArgumentsAccess(expr)) return; 5914 if (TryArgumentsAccess(expr)) return;
5922 5915
5923 CHECK_ALIVE(VisitForValue(expr->obj())); 5916 CHECK_ALIVE(VisitForValue(expr->obj()));
5924 if ((!expr->IsFunctionPrototype() && !expr->key()->IsPropertyName()) || 5917 if ((!expr->IsStringLength() &&
5918 !expr->IsFunctionPrototype() &&
5919 !expr->key()->IsPropertyName()) ||
5925 expr->IsStringAccess()) { 5920 expr->IsStringAccess()) {
5926 CHECK_ALIVE(VisitForValue(expr->key())); 5921 CHECK_ALIVE(VisitForValue(expr->key()));
5927 } 5922 }
5928 5923
5929 BuildLoad(expr, expr->position(), expr->id()); 5924 BuildLoad(expr, expr->position(), expr->id());
5930 } 5925 }
5931 5926
5932 5927
5933 HInstruction* HGraphBuilder::BuildConstantMapCheck(Handle<JSObject> constant, 5928 HInstruction* HGraphBuilder::BuildConstantMapCheck(Handle<JSObject> constant,
5934 CompilationInfo* info) { 5929 CompilationInfo* info) {
(...skipping 1630 matching lines...) Expand 10 before | Expand all | Expand 10 after
7565 } 7560 }
7566 7561
7567 // Argument of the count operation is a property. 7562 // Argument of the count operation is a property.
7568 ASSERT(prop != NULL); 7563 ASSERT(prop != NULL);
7569 if (returns_original_input) Push(graph()->GetConstantUndefined()); 7564 if (returns_original_input) Push(graph()->GetConstantUndefined());
7570 7565
7571 CHECK_ALIVE(VisitForValue(prop->obj())); 7566 CHECK_ALIVE(VisitForValue(prop->obj()));
7572 HValue* object = Top(); 7567 HValue* object = Top();
7573 7568
7574 HValue* key = NULL; 7569 HValue* key = NULL;
7575 if ((!prop->IsFunctionPrototype() && !prop->key()->IsPropertyName()) || 7570 if ((!prop->IsStringLength() &&
7571 !prop->IsFunctionPrototype() &&
7572 !prop->key()->IsPropertyName()) ||
7576 prop->IsStringAccess()) { 7573 prop->IsStringAccess()) {
7577 CHECK_ALIVE(VisitForValue(prop->key())); 7574 CHECK_ALIVE(VisitForValue(prop->key()));
7578 key = Top(); 7575 key = Top();
7579 } 7576 }
7580 7577
7581 CHECK_ALIVE(PushLoad(prop, object, key, expr->position())); 7578 CHECK_ALIVE(PushLoad(prop, object, key, expr->position()));
7582 7579
7583 after = BuildIncrement(returns_original_input, expr); 7580 after = BuildIncrement(returns_original_input, expr);
7584 7581
7585 if (returns_original_input) { 7582 if (returns_original_input) {
(...skipping 29 matching lines...) Expand all
7615 BuildCheckHeapObject(string); 7612 BuildCheckHeapObject(string);
7616 HValue* checkstring = 7613 HValue* checkstring =
7617 AddInstruction(HCheckInstanceType::NewIsString(string, zone())); 7614 AddInstruction(HCheckInstanceType::NewIsString(string, zone()));
7618 HInstruction* length = BuildLoadStringLength(string, checkstring); 7615 HInstruction* length = BuildLoadStringLength(string, checkstring);
7619 AddInstruction(length); 7616 AddInstruction(length);
7620 HInstruction* checked_index = Add<HBoundsCheck>(index, length); 7617 HInstruction* checked_index = Add<HBoundsCheck>(index, length);
7621 return New<HStringCharCodeAt>(string, checked_index); 7618 return New<HStringCharCodeAt>(string, checked_index);
7622 } 7619 }
7623 7620
7624 7621
7625 // Checks if the given shift amounts have following forms: 7622 // Checks if the given shift amounts have form: (sa) and (32 - sa).
7626 // (N1) and (N2) with N1 + N2 = 32; (sa) and (32 - sa).
7627 static bool ShiftAmountsAllowReplaceByRotate(HValue* sa, 7623 static bool ShiftAmountsAllowReplaceByRotate(HValue* sa,
7628 HValue* const32_minus_sa) { 7624 HValue* const32_minus_sa) {
7629 if (sa->IsConstant() && const32_minus_sa->IsConstant()) {
7630 const HConstant* c1 = HConstant::cast(sa);
7631 const HConstant* c2 = HConstant::cast(const32_minus_sa);
7632 return c1->HasInteger32Value() && c2->HasInteger32Value() &&
7633 (c1->Integer32Value() + c2->Integer32Value() == 32);
7634 }
7635 if (!const32_minus_sa->IsSub()) return false; 7625 if (!const32_minus_sa->IsSub()) return false;
7636 HSub* sub = HSub::cast(const32_minus_sa); 7626 HSub* sub = HSub::cast(const32_minus_sa);
7637 if (sa != sub->right()) return false; 7627 if (sa != sub->right()) return false;
7638 HValue* const32 = sub->left(); 7628 HValue* const32 = sub->left();
7639 if (!const32->IsConstant() || 7629 if (!const32->IsConstant() ||
7640 HConstant::cast(const32)->Integer32Value() != 32) { 7630 HConstant::cast(const32)->Integer32Value() != 32) {
7641 return false; 7631 return false;
7642 } 7632 }
7643 return (sub->right() == sa); 7633 return (sub->right() == sa);
7644 } 7634 }
(...skipping 2055 matching lines...) Expand 10 before | Expand all | Expand 10 after
9700 if (ShouldProduceTraceOutput()) { 9690 if (ShouldProduceTraceOutput()) {
9701 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); 9691 isolate()->GetHTracer()->TraceHydrogen(name(), graph_);
9702 } 9692 }
9703 9693
9704 #ifdef DEBUG 9694 #ifdef DEBUG
9705 graph_->Verify(false); // No full verify. 9695 graph_->Verify(false); // No full verify.
9706 #endif 9696 #endif
9707 } 9697 }
9708 9698
9709 } } // namespace v8::internal 9699 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/hydrogen.h ('k') | src/hydrogen-alias-analysis.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698