A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://clang.llvm.org/doxygen/CGBlocks_8cpp.html below:

clang: lib/CodeGen/CGBlocks.cpp File Reference

#include "CGBlocks.h"
#include "CGCXXABI.h"
#include "CGDebugInfo.h"
#include "CGObjCRuntime.h"
#include "CGOpenCLRuntime.h"
#include "CodeGenFunction.h"
#include "CodeGenModule.h"
#include "ConstantEmitter.h"
#include "TargetInfo.h"
#include "clang/AST/Attr.h"
#include "clang/AST/DeclObjC.h"
#include "clang/CodeGen/ConstantInitBuilder.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/Module.h"
#include "llvm/Support/ScopedPrinter.h"
#include <algorithm>
#include <cstdio>

Go to the source code of this file.

static llvm::Constant *  buildGlobalBlock (CodeGenModule &CGM, const CGBlockInfo &blockInfo, llvm::Constant *blockFn)   Build the given block as a global block.
  static llvm::Constant *  buildCopyHelper (CodeGenModule &CGM, const CGBlockInfo &blockInfo)   Build the helper function to copy a block.
  static llvm::Constant *  buildDisposeHelper (CodeGenModule &CGM, const CGBlockInfo &blockInfo)   Build the helper function to dispose of a block.
  static std::string  getBlockCaptureStr (const CGBlockInfo::Capture &Cap, CaptureStrKind StrKind, CharUnits BlockAlignment, CodeGenModule &CGM)   static std::string  getBlockDescriptorName (const CGBlockInfo &BlockInfo, CodeGenModule &CGM)   static llvm::Constant *  buildBlockDescriptor (CodeGenModule &CGM, const CGBlockInfo &blockInfo)   buildBlockDescriptor - Build the block descriptor meta-data for a block.
  static std::pair< BlockCaptureEntityKind, BlockFieldFlagscomputeCopyInfoForBlockCapture (const BlockDecl::Capture &CI, QualType T, const LangOptions &LangOpts)   static std::pair< BlockCaptureEntityKind, BlockFieldFlagscomputeDestroyInfoForBlockCapture (const BlockDecl::Capture &CI, QualType T, const LangOptions &LangOpts)   static void  addBlockLayout (CharUnits align, CharUnits size, const BlockDecl::Capture *capture, llvm::Type *type, QualType fieldType, SmallVectorImpl< BlockLayoutChunk > &Layout, CGBlockInfo &Info, CodeGenModule &CGM)   static bool  isSafeForCXXConstantCapture (QualType type)   Determines if the given type is safe for constant capture in C++.
  static llvm::Constant *  tryCaptureAsConstant (CodeGenModule &CGM, CodeGenFunction *CGF, const VarDecl *var)   It is illegal to modify a const object after initialization.
  static CharUnits  getLowBit (CharUnits v)   Get the low bit of a nonzero character count.
  static void  initializeForBlockHeader (CodeGenModule &CGM, CGBlockInfo &info, SmallVectorImpl< llvm::Type * > &elementTypes)   static QualType  getCaptureFieldType (const CodeGenFunction &CGF, const BlockDecl::Capture &CI)   static void  computeBlockInfo (CodeGenModule &CGM, CodeGenFunction *CGF, CGBlockInfo &info)   Compute the layout of the given block.
  static std::string  getCopyDestroyHelperFuncName (const SmallVectorImpl< CGBlockInfo::Capture > &Captures, CharUnits BlockAlignment, CaptureStrKind StrKind, CodeGenModule &CGM)   static void  pushCaptureCleanup (BlockCaptureEntityKind CaptureKind, Address Field, QualType CaptureType, BlockFieldFlags Flags, bool ForCopyHelper, VarDecl *Var, CodeGenFunction &CGF)   static void  setBlockHelperAttributesVisibility (bool CapturesNonExternalType, llvm::Function *Fn, const CGFunctionInfo &FI, CodeGenModule &CGM)   static BlockFieldFlags  getBlockFieldFlagsForObjCObjectPointer (const BlockDecl::Capture &CI, QualType T)   static llvm::Constant *  generateByrefCopyHelper (CodeGenFunction &CGF, const BlockByrefInfo &byrefInfo, BlockByrefHelpers &generator)   static llvm::Constant *  buildByrefCopyHelper (CodeGenModule &CGM, const BlockByrefInfo &byrefInfo, BlockByrefHelpers &generator)   Build the copy helper for a __block variable.
  static llvm::Constant *  generateByrefDisposeHelper (CodeGenFunction &CGF, const BlockByrefInfo &byrefInfo, BlockByrefHelpers &generator)   Generate code for a __block variable's dispose helper.
  static llvm::Constant *  buildByrefDisposeHelper (CodeGenModule &CGM, const BlockByrefInfo &byrefInfo, BlockByrefHelpers &generator)   Build the dispose helper for a __block variable.
  template<class T > static T *  buildByrefHelpers (CodeGenModule &CGM, const BlockByrefInfo &byrefInfo, T &&generator)   Lazily build the copy and dispose helpers for a __block variable with the given information.
  static void  configureBlocksRuntimeObject (CodeGenModule &CGM, llvm::Constant *C)   Adjust the declaration of something from the blocks API.
  ◆ addBlockLayout() ◆ buildBlockDescriptor()

buildBlockDescriptor - Build the block descriptor meta-data for a block.

buildBlockDescriptor is accessed from 5th field of the Block_literal meta-data and contains stationary information about the block literal. Its definition will have 4 (or optionally 6) words.

struct Block_descriptor {

unsigned long reserved;

unsigned long size;

void *copy_func_helper_decl;

void *destroy_func_decl;

void *block_method_encoding_address;

void *block_layout_info;

};

Definition at line 151 of file CGBlocks.cpp.

References clang::CodeGen::ConstantInitBuilderTemplateBase< Traits >::beginStruct(), clang::CodeGen::CGBlockInfo::BlockSize, buildCopyHelper(), buildDisposeHelper(), clang::CodeGen::CGObjCRuntime::BuildGCBlockLayout(), clang::CodeGen::CGObjCRuntime::BuildRCBlockLayout(), clang::C, clang::CodeGen::CodeGenTypes::ConvertType(), clang::CodeGen::CodeGenModule::GetAddrOfConstantCString(), getBlockDescriptorName(), clang::CodeGen::CGBlockInfo::getBlockExpr(), clang::CodeGen::CodeGenModule::getCodeGenOpts(), clang::CodeGen::CodeGenModule::getContext(), clang::CodeGen::CodeGenModule::getLangOpts(), clang::CodeGen::CodeGenModule::getLLVMContext(), clang::CodeGen::CodeGenModule::getModule(), clang::ASTContext::getObjCEncodingForBlock(), clang::CodeGen::CodeGenModule::getObjCRuntime(), clang::CodeGen::ConstantAddress::getPointer(), clang::CodeGen::CodeGenTypeCache::getPointerAlign(), clang::CharUnits::getQuantity(), clang::CodeGen::CodeGenModule::getTypes(), clang::CodeGen::CGBlockInfo::NeedsCopyDispose, clang::LangOptionsBase::NonGC, clang::opencl_constant, clang::CodeGen::CodeGenModule::supportsCOMDAT(), and clang::CodeGen::CodeGenTypeCache::VoidPtrTy.

Referenced by buildGlobalBlock().

◆ buildByrefCopyHelper() ◆ buildByrefDisposeHelper() ◆ buildByrefHelpers() ◆ buildCopyHelper() ◆ buildDisposeHelper() ◆ buildGlobalBlock() static llvm::Constant * buildGlobalBlock ( CodeGenModuleCGM, const CGBlockInfoblockInfo, llvm::Constant *  blockFn  ) static

Build the given block as a global block.

Definition at line 1288 of file CGBlocks.cpp.

References clang::CodeGen::CodeGenModule::addUsedGlobal(), b, clang::CodeGen::ConstantInitBuilderTemplateBase< Traits >::beginStruct(), clang::CodeGen::BLOCK_HAS_SIGNATURE, clang::CodeGen::BLOCK_IS_GLOBAL, clang::CodeGen::BLOCK_USE_STRET, clang::CodeGen::CGBlockInfo::BlockAlign, clang::CodeGen::CGBlockInfo::BlockExpression, clang::CodeGen::CGBlockInfo::BlockSize, buildBlockDescriptor(), clang::CodeGen::CGBlockInfo::CanBeGlobal, clang::CodeGen::CodeGenTypes::ConvertType(), clang::CodeGen::CodeGenModule::getAddrOfGlobalBlockIfEmitted(), clang::CharUnits::getAsAlign(), clang::CodeGen::BlockFlags::getBitMask(), clang::CodeGen::CGBlockInfo::getBlockExpr(), clang::CodeGen::CodeGenModule::getCodeGenOpts(), clang::CodeGen::CodeGenModule::getContext(), clang::ASTContext::getLangOpts(), clang::CodeGen::CodeGenModule::getLangOpts(), clang::CodeGen::CodeGenModule::getLLVMContext(), clang::CodeGen::CodeGenModule::getModule(), clang::CodeGen::CodeGenModule::getNSConcreteGlobalBlock(), clang::CodeGen::CodeGenModule::getOpenCLRuntime(), clang::CodeGen::CodeGenTypeCache::getPointerAlign(), clang::CharUnits::getQuantity(), clang::CodeGen::CodeGenModule::getTarget(), clang::ASTContext::getTargetAddressSpace(), clang::CodeGen::CodeGenModule::getTargetCodeGenInfo(), clang::CodeGen::TargetCodeGenInfo::getTargetOpenCLBlockHelper(), clang::TargetInfo::getTriple(), clang::Expr::getType(), clang::CodeGen::CodeGenModule::getTypes(), clang::Init, clang::CodeGen::CodeGenTypeCache::Int8PtrPtrTy, clang::CodeGen::CodeGenTypeCache::IntTy, clang::opencl_global, clang::CodeGen::CGOpenCLRuntime::recordBlockInfo(), clang::Result, clang::CodeGen::CodeGenModule::setAddrOfGlobalBlock(), clang::CodeGen::CGBlockInfo::UsesStret, and clang::CodeGen::CodeGenTypeCache::VoidTy.

◆ computeBlockInfo()

Compute the layout of the given block.

Attempts to lay the block out with minimal space requirements.

Definition at line 553 of file CGBlocks.cpp.

References addBlockLayout(), clang::CharUnits::alignTo(), clang::CodeGen::CGBlockInfo::BlockAlign, clang::CodeGen::CGBlockInfo::BlockHeaderForcedGapOffset, clang::CodeGen::CGBlockInfo::BlockHeaderForcedGapSize, clang::CodeGen::CGBlockInfo::BlockSize, clang::CodeGen::CGBlockInfo::buildCaptureMap(), clang::C, clang::CodeGen::CGBlockInfo::CanBeGlobal, clang::BlockDecl::capture_begin(), clang::BlockDecl::capture_end(), clang::BlockDecl::captures(), clang::BlockDecl::capturesCXXThis(), clang::CodeGen::CGBlockInfo::CapturesNonExternalType, clang::CodeGen::CodeGenTypes::ConvertType(), clang::CodeGen::CodeGenTypes::ConvertTypeForMem(), clang::CodeGen::CodeGenFunction::CurFuncDecl, clang::BlockDecl::doesNotEscape(), clang::Type::getAsCXXRecordDecl(), clang::CodeGen::CGBlockInfo::getBlockDecl(), getCaptureFieldType(), clang::CodeGen::CodeGenModule::getContext(), clang::CodeGen::CodeGenModule::getLangOpts(), clang::CodeGen::CodeGenModule::getLLVMContext(), getLowBit(), clang::CodeGen::CodeGenTypeCache::getPointerAlign(), clang::CodeGen::CodeGenTypeCache::getPointerSize(), clang::CharUnits::getQuantity(), clang::CodeGen::CodeGenModule::getTargetCodeGenInfo(), clang::CodeGen::TargetCodeGenInfo::getTargetOpenCLBlockHelper(), clang::ValueDecl::getType(), clang::ASTContext::getTypeInfoInChars(), clang::CodeGen::CodeGenModule::getTypes(), clang::CodeGen::CGBlockInfo::HasCapturedVariableLayout, clang::BlockDecl::hasCaptures(), clang::CodeGen::CGBlockInfo::HasCXXObject, initializeForBlockHeader(), clang::CodeGen::CodeGenTypeCache::Int8Ty, clang::CodeGen::CGBlockInfo::Capture::makeConstant(), clang::CodeGen::CGBlockInfo::NoEscape, clang::LangOptionsBase::NonGC, clang::CodeGen::CGBlockInfo::SortedCaptures, clang::CodeGen::CGBlockInfo::StructureType, tryCaptureAsConstant(), clang::CodeGen::CodeGenTypeCache::VoidPtrTy, and clang::CharUnits::Zero().

Referenced by clang::CodeGen::CodeGenModule::GetAddrOfGlobalBlock().

◆ computeCopyInfoForBlockCapture()

Definition at line 1600 of file CGBlocks.cpp.

References clang::CodeGen::ARCStrong, clang::CodeGen::ARCWeak, clang::CodeGen::BLOCK_FIELD_IS_BLOCK, clang::CodeGen::BLOCK_FIELD_IS_BYREF, clang::CodeGen::BLOCK_FIELD_IS_OBJECT, clang::CodeGen::BLOCK_FIELD_IS_WEAK, clang::CodeGen::BlockObject, clang::CodeGen::CXXRecord, clang::BlockDecl::Capture::getCopyExpr(), clang::Qualifiers::getObjCLifetime(), clang::isBlockPointer(), clang::Type::isBlockPointerType(), clang::BlockDecl::Capture::isByRef(), clang::BlockDecl::Capture::isEscapingByref(), clang::Type::isObjCInertUnsafeUnretainedType(), clang::Type::isObjCRetainableType(), clang::CodeGen::None, clang::CodeGen::NonTrivialCStruct, clang::QualType::PCK_ARCStrong, clang::QualType::PCK_ARCWeak, clang::QualType::PCK_Struct, clang::QualType::PCK_Trivial, clang::QualType::PCK_VolatileTrivial, and clang::T.

Referenced by addBlockLayout().

◆ computeDestroyInfoForBlockCapture()

Definition at line 2022 of file CGBlocks.cpp.

References clang::CodeGen::ARCStrong, clang::CodeGen::ARCWeak, clang::CodeGen::BLOCK_FIELD_IS_BYREF, clang::CodeGen::BLOCK_FIELD_IS_WEAK, clang::CodeGen::BlockObject, clang::CodeGen::CXXRecord, clang::QualType::DK_cxx_destructor, clang::QualType::DK_none, clang::QualType::DK_nontrivial_c_struct, clang::QualType::DK_objc_strong_lifetime, clang::QualType::DK_objc_weak_lifetime, getBlockFieldFlagsForObjCObjectPointer(), clang::BlockDecl::Capture::isEscapingByref(), clang::Type::isObjCInertUnsafeUnretainedType(), clang::Type::isObjCRetainableType(), clang::CodeGen::None, clang::CodeGen::NonTrivialCStruct, and clang::T.

Referenced by addBlockLayout().

◆ configureBlocksRuntimeObject() static void configureBlocksRuntimeObject ( CodeGenModuleCGM, llvm::Constant *  C  ) static

Adjust the declaration of something from the blocks API.

Definition at line 2799 of file CGBlocks.cpp.

References clang::C, clang::TranslationUnitDecl::castToDeclContext(), clang::IdentifierTable::get(), clang::CodeGen::CodeGenModule::getContext(), clang::CodeGen::CodeGenModule::getLangOpts(), clang::CodeGen::CodeGenModule::getTarget(), clang::ASTContext::getTranslationUnitDecl(), clang::TargetInfo::getTriple(), clang::Decl::hasAttr(), clang::ASTContext::Idents, clang::DeclContext::lookup(), clang::Result, and clang::CodeGen::CodeGenModule::setDSOLocal().

Referenced by clang::CodeGen::CodeGenModule::getBlockObjectAssign(), clang::CodeGen::CodeGenModule::getBlockObjectDispose(), clang::CodeGen::CodeGenModule::getNSConcreteGlobalBlock(), and clang::CodeGen::CodeGenModule::getNSConcreteStackBlock().

◆ generateByrefCopyHelper()

Definition at line 2317 of file CGBlocks.cpp.

References clang::CodeGen::CodeGenTypes::arrangeBuiltinFunctionDeclaration(), clang::CodeGen::CodeGenFunction::Builder, clang::CodeGen::BlockByrefInfo::ByrefAlignment, clang::CodeGen::CodeGenFunction::CGM, clang::CodeGen::ApplyDebugLocation::CreateArtificial(), clang::CodeGen::CGBuilderTy::CreateLoad(), clang::CodeGen::CodeGenFunction::emitBlockByrefAddress(), clang::CodeGen::BlockByrefHelpers::emitCopy(), clang::CodeGen::CodeGenFunction::FinishFunction(), clang::CodeGen::CodeGenFunction::GetAddrOfLocalVar(), clang::CodeGen::CodeGenFunction::getContext(), clang::CodeGen::CodeGenTypes::GetFunctionType(), clang::CodeGen::CodeGenModule::getModule(), clang::CodeGen::CodeGenModule::getTypes(), clang::CodeGen::BlockByrefHelpers::needsCopy(), clang::Other, clang::CodeGen::CodeGenModule::SetInternalFunctionAttributes(), clang::CodeGen::CodeGenFunction::StartFunction(), clang::CodeGen::BlockByrefInfo::Type, clang::ASTContext::VoidPtrTy, and clang::ASTContext::VoidTy.

Referenced by buildByrefCopyHelper().

◆ generateByrefDisposeHelper()

Generate code for a __block variable's dispose helper.

Definition at line 2384 of file CGBlocks.cpp.

References clang::CodeGen::CodeGenTypes::arrangeBuiltinFunctionDeclaration(), clang::CodeGen::CodeGenFunction::Builder, clang::CodeGen::BlockByrefInfo::ByrefAlignment, clang::CodeGen::CodeGenFunction::CGM, clang::CodeGen::ApplyDebugLocation::CreateArtificial(), clang::CodeGen::CGBuilderTy::CreateLoad(), clang::CodeGen::CodeGenFunction::emitBlockByrefAddress(), clang::CodeGen::BlockByrefHelpers::emitDispose(), clang::CodeGen::CodeGenFunction::FinishFunction(), clang::CodeGen::CodeGenFunction::GetAddrOfLocalVar(), clang::CodeGen::CodeGenFunction::getContext(), clang::CodeGen::CodeGenTypes::GetFunctionType(), clang::CodeGen::CodeGenModule::getModule(), clang::CodeGen::CodeGenModule::getTypes(), clang::CodeGen::BlockByrefHelpers::needsDispose(), clang::Other, clang::CodeGen::CodeGenModule::SetInternalFunctionAttributes(), clang::CodeGen::CodeGenFunction::StartFunction(), clang::CodeGen::BlockByrefInfo::Type, clang::ASTContext::VoidPtrTy, and clang::ASTContext::VoidTy.

Referenced by buildByrefDisposeHelper().

◆ getBlockCaptureStr()

Definition at line 1695 of file CGBlocks.cpp.

References clang::CharUnits::alignmentAtOffset(), clang::CodeGen::ARCStrong, clang::CodeGen::ARCWeak, clang::CodeGen::BLOCK_FIELD_IS_BLOCK, clang::CodeGen::BLOCK_FIELD_IS_BYREF, clang::CodeGen::BLOCK_FIELD_IS_OBJECT, clang::CodeGen::BLOCK_FIELD_IS_WEAK, clang::CodeGen::BlockObject, clang::BlockVarCopyInit::canThrow(), clang::CodeGen::CGBlockInfo::Capture::Cap, clang::CodeGen::CGBlockInfo::Capture::CopyFlags, clang::CodeGen::CGBlockInfo::Capture::CopyKind, clang::CodeGen::CodeGenFunction::cxxDestructorCanThrow(), clang::CodeGen::CXXRecord, clang::CodeGen::CGBlockInfo::Capture::DisposeFlags, clang::CodeGen::CGBlockInfo::Capture::DisposeKind, clang::CodeGen::BlockFieldFlags::getBitMask(), clang::ASTContext::getBlockVarCopyInit(), clang::CodeGen::CodeGenModule::getContext(), clang::CodeGen::CodeGenModule::getCXXABI(), clang::CodeGen::CGCXXABI::getMangleContext(), clang::CodeGen::CodeGenFunction::getNonTrivialCopyConstructorStr(), clang::CodeGen::CodeGenFunction::getNonTrivialDestructorStr(), clang::CodeGen::CGBlockInfo::Capture::getOffset(), clang::ValueDecl::getType(), clang::BlockDecl::Capture::getVariable(), clang::QualType::isVolatileQualified(), clang::MangleContext::mangleCanonicalTypeName(), clang::CodeGen::None, and clang::CodeGen::NonTrivialCStruct.

Referenced by getBlockDescriptorName(), and getCopyDestroyHelperFuncName().

◆ getBlockDescriptorName()

Replace occurrences of '@' with '\1'. '@' is reserved on ELF platforms as a separator between symbol name and symbol version.

Definition at line 85 of file CGBlocks.cpp.

References clang::CodeGen::CGBlockInfo::BlockAlign, clang::CodeGen::CGBlockInfo::BlockSize, getBlockCaptureStr(), clang::CodeGen::CGBlockInfo::getBlockExpr(), clang::CodeGen::CodeGenModule::getCodeGenOpts(), clang::CodeGen::CodeGenModule::getContext(), clang::CodeGen::CodeGenModule::getLangOpts(), clang::ASTContext::getObjCEncodingForBlock(), clang::CodeGen::CodeGenModule::getObjCRuntime(), clang::CharUnits::getQuantity(), clang::CodeGen::CGObjCRuntime::getRCBlockLayoutStr(), clang::CodeGen::CGBlockInfo::NeedsCopyDispose, clang::CodeGen::None, and clang::CodeGen::CGBlockInfo::SortedCaptures.

Referenced by buildBlockDescriptor().

◆ getBlockFieldFlagsForObjCObjectPointer() ◆ getCaptureFieldType() ◆ getCopyDestroyHelperFuncName() ◆ getLowBit() ◆ initializeForBlockHeader()

Definition at line 481 of file CGBlocks.cpp.

References clang::CodeGen::CGBlockInfo::BlockAlign, clang::CodeGen::CGBlockInfo::BlockSize, clang::CharUnits::fromQuantity(), clang::CodeGen::CodeGenModule::getBlockDescriptorType(), clang::CodeGen::CodeGenModule::getDataLayout(), clang::CodeGen::CGOpenCLRuntime::getGenericVoidPointerType(), clang::CodeGen::CodeGenTypeCache::getIntAlign(), clang::CodeGen::CodeGenTypeCache::getIntSize(), clang::CodeGen::CodeGenModule::getLangOpts(), clang::CodeGen::CodeGenModule::getOpenCLRuntime(), clang::CodeGen::CodeGenTypeCache::getPointerAlign(), clang::TargetInfo::getPointerAlign(), clang::CodeGen::CodeGenTypeCache::getPointerSize(), clang::TargetInfo::getPointerWidth(), clang::CharUnits::getQuantity(), clang::CodeGen::CodeGenModule::getTarget(), clang::CodeGen::CodeGenModule::getTargetCodeGenInfo(), clang::CodeGen::TargetCodeGenInfo::getTargetOpenCLBlockHelper(), clang::CodeGen::CodeGenTypeCache::IntTy, clang::opencl_generic, and clang::CodeGen::CodeGenTypeCache::VoidPtrTy.

Referenced by computeBlockInfo().

◆ isSafeForCXXConstantCapture() ◆ pushCaptureCleanup()

Definition at line 1816 of file CGBlocks.cpp.

References clang::CodeGen::ARCStrong, clang::CodeGen::ARCWeak, clang::CodeGen::BlockObject, CanThrow(), clang::CodeGen::CodeGenFunction::cxxDestructorCanThrow(), clang::CodeGen::CXXRecord, clang::CodeGen::CodeGenFunction::destroyARCStrongImprecise, clang::CodeGen::EHCleanup, clang::CodeGen::CodeGenFunction::enterByrefCleanup(), clang::CodeGen::CodeGenFunction::getCleanupKind(), clang::CodeGen::CodeGenFunction::getDestroyer(), clang::CodeGen::CodeGenFunction::getLangOpts(), clang::QualType::isDestructedType(), clang::CodeGen::CodeGenFunction::needsEHCleanup(), clang::CodeGen::None, clang::CodeGen::NonTrivialCStruct, clang::CodeGen::NormalAndEHCleanup, and clang::CodeGen::CodeGenFunction::pushDestroy().

◆ setBlockHelperAttributesVisibility() ◆ tryCaptureAsConstant()

RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4