Para tornar uma página suja (ativando a parte suja na entrada da tabela de páginas), toco os primeiros bytes da página assim:
pageptr[0] = pageptr[0];
Mas, na prática, o gcc ignorará a instrução eliminando o armazenamento morto. Para evitar que o gcc o otimize, reescrevo a instrução da seguinte maneira:
volatile int tmp;
tmp = pageptr[0];
pageptr[0] = tmp;
Parece que o truque funciona, mas um tanto feio. Gostaria de saber se existe alguma diretiva ou sintaxe que tenha o mesmo efeito? E não quero usar -O0
flag, pois trará grande penalidade de desempenho também.
-O0
não impedia a "otimização" de código morto, por exemplo, quando o GCC detecta que algum código não tem efeito, ele simplesmente o remove. AFAIK esta é uma fase antes-O0
... Mas essa é apenas a minha experiênciaRespostas:
Desativar a otimização corrige o problema, mas é desnecessário. Uma alternativa mais segura é tornar ilegal para o compilador otimizar o armazenamento usando o
volatile
qualificador de tipo.O
volatile
qualificador de tipo instrui o compilador a ser estrito quanto aos armazenamentos e cargas de memória. Um dos objetivos dovolatile
é permitir que o compilador saiba que o acesso à memória tem efeitos colaterais e, portanto, deve ser preservado. Nesse caso, o armazenamento tem o efeito colateral de causar uma falha de página e você deseja que o compilador preserve a falha de página.Desta forma, o código ao redor ainda pode ser otimizado, e seu código é portável para outros compiladores que não entendem GCC
#pragma
ou__attribute__
sintaxe.fonte
volatile
significa que o acesso à memória deve ocorrer conforme escrito, que é exatamente o que queremos. Em outras palavras, pensamos cuidadosamente sobre isso e significa o que pensamos que significa.Você pode usar
para desabilitar otimizações desde o GCC 4.4.
Consulte a documentação do GCC se precisar de mais detalhes.
fonte
Em vez de usar os novos pragmas, você também pode usar
__attribute__((optimize("O0")))
para suas necessidades. Isso tem a vantagem de se aplicar apenas a uma única função e não a todas as funções definidas no mesmo arquivo.Exemplo de uso:
fonte
-Olevel
opção, mas tiver usado as opções individuais que ela ativa separadamente? (No meu caso, não consigo determinar qual é a opção de otimização individual que está quebrando o código) .